Changeset 1590 for code/branches/hud/src/orxonox/hud/Navigation.cc
- Timestamp:
- Jun 12, 2008, 12:57:45 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/hud/src/orxonox/hud/Navigation.cc
r1580 r1590 23 23 * Felix Schulthess 24 24 * Co-authors: 25 * ...25 * Reto Grieder 26 26 * 27 27 */ … … 33 33 #include <OgreStringConverter.h> 34 34 35 #include "GraphicsEngine.h"35 //#include "GraphicsEngine.h" 36 36 // TODO: remove the SpaceShip and CameraHandler dependencies 37 37 #include "objects/SpaceShip.h" 38 38 #include "objects/Projectile.h" 39 39 #include "objects/CameraHandler.h" 40 #include "HUD.h" 40 41 #include "RadarObject.h" 41 42 #include "RadarOverlayElement.h" 42 #include "HUD.h"43 43 #include "core/Debug.h" 44 #include " util/Math.h"44 #include "core/CoreIncludes.h" 45 45 46 46 namespace orxonox 47 47 { 48 CreateFactory(Navigation); 49 48 50 using namespace Ogre; 49 51 50 Navigation::Navigation(OverlayContainer* container) 51 { 52 container_ = container; 53 focus_ = NULL; 54 init(); 52 Navigation::Navigation() 53 : container_(0) 54 , navMarker_(0) 55 , aimMarker_(0) 56 , focus_(0) 57 { 58 RegisterObject(Navigation); 55 59 } 56 60 57 61 Navigation::~Navigation() 58 62 { 59 OverlayManager::getSingleton().destroyOverlayElement(this->navText_); 60 OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_); 61 OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_); 62 } 63 64 void Navigation::init() 65 { 66 // create nav text 67 navText_ = static_cast<TextAreaOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("TextArea", "navText")); 68 navText_->show(); 69 navText_->setMetricsMode(Ogre::GMM_PIXELS); 70 navText_->setDimensions(0.001, 0.001); 71 navText_->setPosition(0.02, 0.02); 72 navText_->setFontName("Console"); 73 navText_->setCharHeight(20); 74 navText_->setCaption(""); 75 navText_->hide(); 76 container_->addChild(navText_); 77 78 79 // create nav marker ... 80 navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "NavMarker")); 81 aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "aimMarker")); 82 navMarker_->setMetricsMode(GMM_PIXELS); 83 aimMarker_->setMetricsMode(GMM_PIXELS); 84 navMarker_->hide(); 85 aimMarker_->hide(); 86 aimMarker_->setMaterialName("Orxonox/NavCrosshair"); 87 aimMarker_->setDimensions(20, 20); 88 aimMarker_->setUV(0.0, 0.0, 1.0, 1.0); 89 container_->addChild(navMarker_); 90 container_->addChild(aimMarker_); 91 } 92 93 void Navigation::update() 63 if (this->isInitialized()) 64 { 65 if (this->container_) 66 OverlayManager::getSingleton().destroyOverlayElement(this->container_); 67 if (this->navMarker_) 68 OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_); 69 if (this->navText_) 70 OverlayManager::getSingleton().destroyOverlayElement(this->navText_); 71 if (this->aimMarker_) 72 OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_); 73 } 74 } 75 76 void Navigation::XMLPort(Element& xmlElement, XMLPort::Mode mode) 77 { 78 HUDOverlay::XMLPort(xmlElement, mode); 79 80 if (mode == XMLPort::LoadObject) 81 { 82 // create container 83 this->container_ = static_cast<OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navContainer")); 84 this->container_->setMetricsMode(Ogre::GMM_RELATIVE); 85 this->container_->setLeft(0.0); 86 this->container_->setTop(0.0); 87 this->container_->setWidth(1.0); 88 this->container_->setHeight(1.0); 89 90 // create nav text 91 this->navText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", getName() + "_navText")); 92 this->navText_->setMetricsMode(Ogre::GMM_RELATIVE); 93 this->navText_->setPosition(0.0f, 0.0f); 94 this->navText_->setCharHeight(0.05f); 95 this->navText_->setFontName("Monofur"); 96 97 // create nav marker 98 navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navMarker")); 99 navMarker_->setMetricsMode(GMM_RELATIVE); 100 navMarker_->setDimensions(0.05f, 0.05f); 101 navMarker_->setMaterialName("Orxonox/NavArrows"); 102 this->wasOutOfView_ = true; // just a to ensure the material is changed right the first time.. 103 104 // create aim marker 105 aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_aimMarker")); 106 aimMarker_->setMetricsMode(GMM_RELATIVE); 107 aimMarker_->setDimensions(0.05f, 0.05f); 108 aimMarker_->setMaterialName("Orxonox/NavCrosshair"); 109 110 container_->addChild(navMarker_); 111 container_->addChild(aimMarker_); 112 container_->addChild(navText_); 113 container_->show(); 114 115 this->overlay_->add2D(container_); 116 this->overlay_->hide(); 117 } 118 119 XMLPortParam(Navigation, "font", setFont, getFont, xmlElement, mode); 120 XMLPortParam(Navigation, "textsize", setTextSize, getTextSize, xmlElement, mode); 121 XMLPortParam(Navigation, "navmarkersize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode); 122 XMLPortParam(Navigation, "aimmarkersize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode); 123 } 124 125 void Navigation::setNavMarkerSize(Vector2 size) 126 { 127 if (this->navMarker_ && size.squaredLength() >= 0.0f) 128 this->navMarker_->setDimensions(size.x, size.y); 129 } 130 131 Vector2 Navigation::getNavMarkerSize() const 132 { 133 if (this->navMarker_) 134 return Vector2(navMarker_->getWidth(), navMarker_->getHeight()); 135 else 136 return Vector2::ZERO; 137 } 138 139 void Navigation::setAimMarkerSize(Vector2 size) 140 { 141 if (this->aimMarker_ && size.squaredLength() >= 0.0f) 142 this->aimMarker_->setDimensions(size.x, size.y); 143 } 144 145 Vector2 Navigation::getAimMarkerSize() const 146 { 147 if (this->aimMarker_) 148 return Vector2(aimMarker_->getWidth(), aimMarker_->getHeight()); 149 else 150 return Vector2::ZERO; 151 } 152 153 void Navigation::setFont(const std::string& font) 154 { 155 if (this->navText_ && font != "") 156 this->navText_->setFontName(font); 157 } 158 159 std::string Navigation::getFont() const 160 { 161 if (this->navText_) 162 return this->navText_->getFontName(); 163 else 164 return ""; 165 } 166 167 void Navigation::setTextSize(float size) 168 { 169 if (this->navText_ && size >= 0.0f) 170 this->navText_->setCharHeight(size); 171 } 172 173 float Navigation::getTextSize() const 174 { 175 if (this->navText_) 176 return this->navText_->getCharHeight(); 177 else 178 return 0.0f; 179 } 180 181 void Navigation::tick(float dt) 94 182 { 95 183 if (!focus_) … … 101 189 void Navigation::updateMarker() 102 190 { 103 int windowW = GraphicsEngine::getSingleton().getWindowWidth();104 int windowH = GraphicsEngine::getSingleton().getWindowHeight();105 106 191 // set text 107 int dist = (int) getDist2Focus()/100; 108 navText_->setCaption(Ogre::StringConverter::toString(dist)); 192 int dist = (int) getDist2Focus()/100.0f; 193 navText_->setCaption(convertToString(dist)); 194 float textLength = convertToString(dist).size() * navText_->getCharHeight() * 0.3; 109 195 110 196 Ogre::Camera* navCam = SpaceShip::getLocalShip()->getCamera()->cam_; 197 Matrix4 transformationMatrix = navCam->getProjectionMatrix() * navCam->getViewMatrix(); 111 198 // transform to screen coordinates 112 Vector3 pos = navCam->getProjectionMatrix() * navCam->getViewMatrix() * focus_->getPosition(); 113 Vector3 aimpos = navCam->getProjectionMatrix() * navCam->getViewMatrix() * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(), Projectile::getSpeed(), focus_->getPosition(), focus_->getOrientedVelocity()); 114 115 float xPosRel = 0.5*pos.x+0.5; 116 float yPosRel = 1-(0.5*pos.y+0.5); 117 float xAimPosRel = 0.5*aimpos.x+0.5; 118 float yAimPosRel = 1-(0.5*aimpos.y+0.5); 119 int xPos = (int) (xPosRel*windowW); 120 int yPos = (int) (yPosRel*windowH); 121 int xAimPos = (int) (xAimPosRel*windowW); 122 int yAimPos = (int) (yAimPosRel*windowH); 123 int xFromCenter = xPos-windowW/2; 124 int yFromCenter = yPos-windowH/2; 125 126 // is object in view? 127 Vector3 navCamPos = SpaceShip::getLocalShip()->getPosition(); 128 Vector3 currentDir = SpaceShip::getLocalShip()->getDir(); 129 Vector3 currentOrth = SpaceShip::getLocalShip()->getOrth(); 130 float radius = getAngle(navCamPos, currentDir, focus_->getPosition()); 131 bool isRight = (currentDir.crossProduct(currentOrth)).dotProduct(focus_->getPosition() - navCamPos)>0; 132 bool isAbove = currentOrth.dotProduct(focus_->getPosition() - navCamPos)>0; 133 bool outOfView = (xPosRel<0 || xPosRel>1 || yPosRel<0 || yPosRel>1); 134 135 // if object is behind us, it is out of view anyway: 136 if (!outOfView && radius > Ogre::Math::PI / 2) 199 Vector3 pos = transformationMatrix * focus_->getPosition(); 200 201 bool outOfView; 202 if (pos.z > 1.0) 203 { 204 // z > 1.0 means that the object is behind the camera 137 205 outOfView = true; 206 // we have to switch all coordinates (if you don't know why, 207 // try linear algebra lectures, because I can't explain..) 208 pos.x = -pos.x; 209 pos.y = -pos.y; 210 pos.z = -pos.z; 211 } 212 else 213 outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0; 138 214 139 215 if (outOfView) 140 216 { 141 217 // object is not in view 142 navMarker_->setMaterialName("Orxonox/NavArrows");143 navMarker_->setDimensions(16,16);144 218 aimMarker_->hide(); 145 float phiUpperCorner = atan((float)(windowW)/(float)(windowH)); 146 // from the angle we find out on which edge to draw the marker 147 // and which of the four arrows to take 148 float phiNav = atan((float) xFromCenter / (float) yFromCenter); 149 150 if (isAbove && isRight) 151 { 152 // top right quadrant 153 if (-phiNav < phiUpperCorner) 154 { 155 //COUT(3) << "arrow up\n"; 156 navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0); 219 220 if (!wasOutOfView_) 221 { 222 navMarker_->setMaterialName("Orxonox/NavArrows"); 223 wasOutOfView_ = true; 224 } 225 226 if (pos.x < pos.y) 227 { 228 if (pos.y > -pos.x) 229 { 230 // up 231 float position = pos.x / pos.y + 1.0; 232 navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 0.0); 157 233 navMarker_->setUV(0.5, 0.0, 1.0, 0.5); 158 navText_->setLeft( navMarker_->getLeft()+navMarker_->getWidth());234 navText_->setLeft((position - textLength) * 0.5); 159 235 navText_->setTop(navMarker_->getHeight()); 160 236 } 161 237 else 162 238 { 163 //COUT(3) << "arrow right\n"; 164 navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2); 239 // left 240 float position = pos.y / pos.x + 1.0; 241 navMarker_->setPosition(0.0, (position - navMarker_->getWidth()) * 0.5); 242 navMarker_->setUV(0.0, 0.0, 0.5, 0.5); 243 navText_->setLeft(navMarker_->getWidth() + 0.01); 244 navText_->setTop((position - navText_->getCharHeight()) * 0.5); 245 } 246 } 247 else 248 { 249 if (pos.y < -pos.x) 250 { 251 // down 252 float position = -pos.x / pos.y + 1.0; 253 navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 1.0 - navMarker_->getHeight()); 254 navMarker_->setUV(0.0, 0.5, 0.5, 1.0); 255 navText_->setLeft((position - textLength) * 0.5); 256 navText_->setTop(1.0 - navMarker_->getHeight() - navText_->getCharHeight()); 257 } 258 else 259 { 260 // right 261 float position = -pos.y / pos.x + 1.0; 262 navMarker_->setPosition(1.0 - navMarker_->getWidth(), (position - navMarker_->getHeight()) * 0.5); 165 263 navMarker_->setUV(0.5, 0.5, 1.0, 1.0); 166 navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth()); 167 navText_->setTop(navMarker_->getTop()+navMarker_->getHeight()); 168 } 169 } 170 if (!isAbove && isRight) 171 { 172 // bottom right quadrant 173 if (phiNav < phiUpperCorner) 174 { 175 //COUT(3) << "arrow down\n"; 176 navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16); 177 navMarker_->setUV(0.0, 0.5, 0.5, 1.0); 178 navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth()); 179 navText_->setTop(navMarker_->getTop()-navMarker_->getHeight()); 180 } 181 else 182 { 183 //COUT(3) << "arrow right\n"; 184 navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2); 185 navMarker_->setUV(0.5, 0.5, 1.0, 1.0); 186 navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth()); 187 navText_->setTop(navMarker_->getTop()+navMarker_->getHeight()); 188 } 189 } 190 if (isAbove && !isRight) 191 { 192 // top left quadrant 193 if (phiNav<phiUpperCorner) 194 { 195 //COUT(3) << "arrow up\n"; 196 navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0); 197 navMarker_->setUV(0.5, 0.0, 1.0, 0.5); 198 navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth()); 199 navText_->setTop(navMarker_->getHeight()); 200 } 201 else 202 { 203 //COUT(3) << "arrow left\n"; 204 navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2); 205 navMarker_->setUV(0.0, 0.0, 0.5, 0.5); 206 navText_->setLeft(navMarker_->getWidth()); 207 navText_->setTop(navMarker_->getTop()+navMarker_->getHeight()); 208 } 209 } 210 if (!isAbove && !isRight) 211 { 212 // bottom left quadrant 213 if (phiNav>-phiUpperCorner) 214 { 215 //COUT(3) << "arrow down\n"; 216 navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16); 217 navMarker_->setUV(0.0, 0.5, 0.5, 1.0); 218 navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth()); 219 navText_->setTop(navMarker_->getTop()-navMarker_->getHeight()); 220 } 221 else 222 { 223 //COUT(3) << "arrow left\n"; 224 navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2); 225 navMarker_->setUV(0.0, 0.0, 0.5, 0.5); 226 navText_->setLeft(navMarker_->getWidth()); 227 navText_->setTop(navMarker_->getTop()+navMarker_->getHeight()); 264 navText_->setLeft(1.0 - navMarker_->getWidth() - textLength - 0.01); 265 navText_->setTop((position - navText_->getCharHeight()) * 0.5); 228 266 } 229 267 } … … 232 270 { 233 271 // object is in view 234 navMarker_->setMaterialName("Orxonox/NavTDC"); 235 navMarker_->setDimensions(35, 35); 272 273 Vector3 aimpos = transformationMatrix * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(), 274 Projectile::getSpeed(), focus_->getPosition(), focus_->getOrientedVelocity()); 275 276 if (wasOutOfView_) 277 { 278 navMarker_->setMaterialName("Orxonox/NavTDC"); 279 wasOutOfView_ = false; 280 } 281 282 // object is in view 236 283 navMarker_->setUV(0.0, 0.0, 1.0, 1.0); 237 navMarker_->setPosition(xPos-navMarker_->getWidth()/2, yPos-navMarker_->getHeight()/2); 284 navMarker_->setLeft((pos.x + 1.0 - navMarker_->getWidth()) * 0.5); 285 navMarker_->setTop((-pos.y + 1.0 - navMarker_->getHeight()) * 0.5); 238 286 239 287 aimMarker_->show(); 240 aimMarker_->setPosition(xAimPos-aimMarker_->getWidth()/2, yAimPos-aimMarker_->getHeight()/2); 241 242 navText_->setPosition(xPos+navMarker_->getWidth()/2, yPos+navMarker_->getHeight()/2); 288 aimMarker_->setLeft((aimpos.x + 1.0 - aimMarker_->getWidth()) * 0.5); 289 aimMarker_->setTop((-aimpos.y + 1.0 - aimMarker_->getHeight()) * 0.5); 290 291 navText_->setLeft((pos.x + 1.0 + navMarker_->getWidth()) * 0.5); 292 navText_->setTop((-pos.y + 1.0 + navMarker_->getHeight()) * 0.5); 243 293 } 244 294 } … … 293 343 if (focus_) 294 344 { 295 navMarker_->show(); 296 navText_->show(); 345 overlay_->show(); 297 346 focus_->setColour(ColourValue::White); 298 347 } 299 348 else 300 349 { 301 navMarker_->hide(); 302 aimMarker_->hide(); 303 navText_->hide(); 350 overlay_->hide(); 304 351 } 305 352 } … … 318 365 return 0; 319 366 } 367 368 void Navigation::windowResized(int newWidth, int newHeight) 369 { 370 HUDOverlay::windowResized(newWidth, newHeight); 371 372 //if (this->navMarker_) 373 // navMarker_->setDimensions(0.05, 0.05); 374 375 } 320 376 }
Note: See TracChangeset
for help on using the changeset viewer.