Changeset 1613 for code/branches/hud/src/orxonox/overlays/hud/HUDRadar.cc
- Timestamp:
- Jun 20, 2008, 12:05:12 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/hud/src/orxonox/overlays/hud/HUDRadar.cc
r1609 r1613 37 37 #include "objects/SpaceShip.h" 38 38 #include "objects/WorldEntity.h" 39 #include "tools/TextureGenerator.h" 39 40 #include "RadarViewable.h" 40 41 … … 42 43 { 43 44 CreateFactory(HUDRadar); 44 CreateFactory(RadarColour);45 45 CreateFactory(RadarShape); 46 47 HUDRadar* HUDRadar::instance_s = 0;48 46 49 47 using namespace Ogre; … … 51 49 HUDRadar::HUDRadar() 52 50 : background_(0) 51 , marker_(0) 52 , sensitivity_(1.0f) 53 53 { 54 54 RegisterObject(HUDRadar); 55 56 assert(instance_s == 0);57 instance_s = this;58 55 } 59 56 … … 62 59 if (this->isInitialized()) 63 60 { 64 if (this->background_)61 /*if (this->background_) 65 62 OverlayManager::getSingleton().destroyOverlayElement(this->background_); 66 63 while (this->radarDots_.size() > 0) … … 68 65 OverlayManager::getSingleton().destroyOverlayElement(this->radarDots_[this->radarDots_.size() - 1]); 69 66 this->radarDots_.pop_back(); 70 } 71 } 72 73 instance_s = 0; 67 }*/ 68 } 74 69 } 75 70 … … 78 73 OrxonoxOverlay::XMLPort(xmlElement, mode); 79 74 80 XMLPortObject(HUDRadar, RadarColour, "shapes", addShape, getShape, xmlElement, mode, false, true); 75 if (mode == XMLPort::LoadObject) 76 { 77 this->sensitivity_ = 1.0f; 78 this->halfDotSizeDistance_ = 3000.0f; 79 this->maximumDotSize_ = 0.1; 80 } 81 82 XMLPortParam(HUDRadar, "sensitivity", setRadarSensitivity, getRadarSensitivity, xmlElement, mode); 83 XMLPortParam(HUDRadar, "halfDotSizeDistance", setHalfDotSizeDistance, getHalfDotSizeDistance, xmlElement, mode); 84 XMLPortParam(HUDRadar, "maximumDotSize", setMaximumDotSize, getMaximumDotSize, xmlElement, mode); 85 86 shapeMaterials_[RadarViewable::Dot] = "RadarSquare.tga"; 87 shapeMaterials_[RadarViewable::Triangle] = "RadarSquare.tga"; 88 shapeMaterials_[RadarViewable::Square] = "RadarSquare.tga"; 81 89 82 90 if (mode == XMLPort::LoadObject) … … 86 94 overlay_->add2D(background_); 87 95 88 // create an array of all possible materials 89 unsigned int iMaterial = 0; 90 for (std::map<unsigned int, RadarShape*>::const_iterator itShape = shapes_.begin(); itShape != shapes_.end(); ++itShape) 91 { 92 Ogre::MaterialPtr originalMaterial = (Ogre::MaterialPtr)(Ogre::MaterialManager::getSingleton().getByName((*itShape).second->getAttribute())); 93 for (std::map<unsigned int, RadarColour*>::const_iterator itColour = colours_.begin(); itColour != colours_.end(); ++itColour) 94 { 95 Ogre::MaterialPtr newMaterial = originalMaterial->clone((*itShape).second->getAttribute() + convertToString(iMaterial++)); 96 newMaterial->getTechnique(0)->getPass(0)->setAmbient((*itColour).second->getAttribute()); 97 materialNames_[(*itShape).first + ((*itColour).first << 8)] = newMaterial->getName(); 98 } 99 } 100 101 /*WorldEntity* object; 102 object = new WorldEntity(); 103 object->setPosition(2000.0, 0.0, 0.0); 104 addRadarObject(object, ColourValue(0.5, 0, 0, 1)); 105 object = new WorldEntity(); 106 object->setPosition(0.0, 2000.0, 0.0); 107 addRadarObject(object, ColourValue(0.5, 0, 0, 1)); 108 object = new WorldEntity(); 109 object->setPosition(0.0, 0.0, 2000.0); 110 addRadarObject(object, ColourValue(0.5, 0, 0, 1)); 111 object = new WorldEntity(); 112 object->setPosition(10000.0,16000.0,0.0); 113 addRadarObject(object);*/ 114 } 115 } 116 117 void HUDRadar::addColour(RadarColour* colour) 118 { 119 this->colours_[colour->getIndex()] = colour; 120 } 121 122 RadarColour* HUDRadar::getColour(unsigned int index) const 123 { 124 if (index < this->colours_.size()) 125 { 126 std::map<unsigned int, RadarColour*>::const_iterator it = colours_.begin(); 127 for (unsigned int i = 0; i != index; ++it, ++i) 128 ; 129 return (*it).second; 130 } 131 else 132 return 0; 133 } 134 135 void HUDRadar::addShape(RadarShape* shape) 96 marker_ = (Ogre::PanelOverlayElement*)Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_Marker"); 97 marker_->setMaterialName("Orxonox/RadarMarker"); 98 overlay_->add2D(marker_); 99 marker_->hide(); 100 } 101 } 102 103 /*void HUDRadar::addShape(RadarShape* shape) 136 104 { 137 105 this->shapes_[shape->getIndex()] = shape; … … 149 117 else 150 118 return 0; 151 } 152 153 void HUDRadar::tick(float dt) 119 }*/ 120 121 void HUDRadar::displayObject(RadarViewable* object, bool bIsMarked) 122 { 123 const WorldEntity* wePointer = object->getWorldEntity(); 124 125 // Just to be sure that we actually have a WorldEntity 126 // We could do a dynamic_cast, but that's a lot slower 127 if (!wePointer) 128 { 129 CCOUT(4) << "Cannot display a non-WorldEntitiy on the radar" << std::endl; 130 return; 131 } 132 133 /*static int counter = 0; 134 if (++counter < 1120 && counter > 120) 135 { 136 // we have to create a new entry 137 Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>( 138 Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberStr())); 139 // get right material 140 panel->setMaterialName("Orxonox/RadarSquare"); 141 panel->setDimensions(0.03, 0.03); 142 panel->setPosition((1.0 + (rand() & 0xFF) / 256.0 - 0.001) * 0.5, (1.0 - (rand() & 0xFF) / 256.0 - 0.001) * 0.5); 143 panel->show(); 144 this->overlay_->add2D(panel); 145 this->overlay_->show(); 146 }*/ 147 148 // try to find a panel already created 149 Ogre::PanelOverlayElement* panel; 150 std::map<RadarViewable*, Ogre::PanelOverlayElement*>::iterator it = this->radarDots_.find(object); 151 if (it == this->radarDots_.end()) 152 { 153 // we have to create a new entry 154 panel = static_cast<Ogre::PanelOverlayElement*>( 155 Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberStr())); 156 radarDots_[object] = panel; 157 // get right material 158 panel->setMaterialName(TextureGenerator::getMaterialName( 159 shapeMaterials_[object->getRadarObjectType()], object->getRadarObjectColour())); 160 this->overlay_->add2D(panel); 161 } 162 else 163 panel = (*it).second; 164 165 // set size to fit distance... 166 float distance = (wePointer->getWorldPosition() - SpaceShip::getLocalShip()->getPosition()).length(); 167 // calculate the size with 1/distance dependency for simplicity (instead of exp(-distance * lambda) 168 float size = maximumDotSize_ * halfDotSizeDistance_ / (halfDotSizeDistance_ + distance); 169 panel->setDimensions(size, size); 170 171 // calc position on radar... 172 Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), wePointer->getWorldPosition()); 173 coord *= Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture 174 panel->setPosition((1.0 + coord.x - size) * 0.5, (1.0 - coord.y - size) * 0.5); 175 176 if (bIsMarked) 177 { 178 this->marker_->show(); 179 this->marker_->setDimensions(size * 1.2, size * 1.2); 180 this->marker_->setPosition((1.0 + coord.x - size * 1.2) * 0.5, (1.0 - coord.y - size * 1.2) * 0.5); 181 } 182 } 183 184 void HUDRadar::radarTick(float dt) 185 { 186 } 187 188 /*void HUDRadar::tick(float dt) 154 189 { 155 190 // iterate through all RadarObjects … … 159 194 if ((*it)->isVisibleOnRadar()) 160 195 { 161 WorldEntity* object = (*it)->getWorldEntity();162 // Just to be sure that we actually have a WorldEntity163 // We could do a dynamic_cast, but that's a lot slower164 assert(object);165 166 // set size to fit distance...167 float size = 1.0/((object->getWorldPosition() - SpaceShip::getLocalShip()->getPosition()).length());168 size = clamp(size * 100.0f, 0.02f, 0.12f);169 if (i == radarDots_.size())170 {171 // we have to create a new panel172 radarDots_.push_back(static_cast<Ogre::PanelOverlayElement*>(173 Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + convertToString(i))));174 }175 radarDots_[i]->setDimensions(size, size);176 177 // calc position on radar...178 Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), object->getWorldPosition());179 coord *= Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture180 radarDots_[i]->setPosition((1.0 + coord.x) * 0.5, (1.0 - coord.y) * 0.5);181 182 // apply the right material183 RadarPoint description = (*it)->getDescription();184 radarDots_[i]->setMaterialName(materialNames_[description.shape_ + (description.colour_ << 8)]);185 196 } 186 197 } 187 } 188 189 void HUDRadar::listObjects()198 }*/ 199 200 /*void HUDRadar::listObjects() 190 201 { 191 202 COUT(3) << "List of RadarObjects:\n"; … … 196 207 COUT(3) << i++ << ": " << (*it)->getWorldEntity()->getWorldPosition() << std::endl; 197 208 } 198 } 199 200 /*static*/ HUDRadar& HUDRadar::getInstance() 201 { 202 assert(instance_s); 203 return *instance_s; 204 } 209 }*/ 205 210 }
Note: See TracChangeset
for help on using the changeset viewer.