Changeset 1502 for code/trunk/src/orxonox/hud/RadarOverlayElement.cc
- Timestamp:
- Jun 1, 2008, 3:54:20 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/orxonox/hud/RadarOverlayElement.cc
r1407 r1502 1 1 /* 2 * ORXONOX - the hottest 3D action shooter ever to exist 3 * 4 * 5 * License notice: 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 * Author: 22 * Yuning Chai 23 * Co-authors: 24 * ... 25 * 26 */ 2 * ORXONOX - the hottest 3D action shooter ever to exist 3 * > www.orxonox.net < 4 * 5 * 6 * License notice: 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 2 11 * of the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 21 * 22 * Author: 23 * Yuning Chai 24 * Co-authors: 25 * Felix Schulthess 26 * 27 */ 27 28 29 #include "OrxonoxStableHeaders.h" 28 30 #include "RadarOverlayElement.h" 31 32 #include <string> 33 #include <OgreOverlayManager.h> 34 #include <OgreStringConverter.h> 35 36 #include "GraphicsEngine.h" 37 #include "core/Tickable.h" 38 #include "core/ConsoleCommand.h" 39 #include "objects/SpaceShip.h" 40 #include "RadarObject.h" 41 #include "HUD.h" 29 42 30 43 namespace orxonox 31 44 { 32 ConsoleCommandShortcut(RadarOverlayElement, cycleFocus, AccessLevel::User);33 34 45 using namespace Ogre; 35 46 36 RadarOverlayElement* RadarOverlayElement::instance_s = NULL; 37 38 RadarOverlayElement::RadarOverlayElement(const String& name):Ogre::PanelOverlayElement(name){ 39 RadarOverlayElement::instance_s = this; 47 RadarOverlayElement::RadarOverlayElement(const String& name):PanelOverlayElement(name){ 40 48 } 41 49 … … 43 51 } 44 52 45 void RadarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, O gre::OverlayContainer* container){53 void RadarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, OverlayContainer* container){ 46 54 // some initial data 47 om = &Ogre::OverlayManager::getSingleton();55 om = &OverlayManager::getSingleton(); 48 56 dimRel_ = dimRel; 49 57 leftRel_ = leftRel; 50 58 topRel_ = topRel; 51 59 container_ = container; 52 firstRadarObject_ = NULL;53 lastRadarObject_ = NULL;54 focus_ = NULL;55 60 56 // create nav marker ... 57 navMarker_ = static_cast<PanelOverlayElement*>(om->createOverlayElement("Panel", "NavMarker")); 58 navMarker_->setMetricsMode(Ogre::GMM_PIXELS); 59 navMarker_->setMaterialName("Orxonox/NavMarker"); 60 navMarker_->setDimensions(16,16); 61 navMarker_->setPosition(0,386); 62 navMarker_->hide(); 63 container_->addChild(navMarker_); 64 65 // these have to fit the data in the level 66 shipPos_ = Vector3(0.0, 0.0, 0.0); 67 initialDir_ = Vector3(1.0, 0.0, 0.0); 68 currentDir_ = initialDir_; 69 initialOrth_ = Vector3(0.0, 0.0, 1.0); 70 currentOrth_ = initialOrth_; 71 plane = Plane(currentDir_, shipPos_); 72 73 setMetricsMode(Ogre::GMM_PIXELS); 61 setMetricsMode(GMM_PIXELS); 74 62 setMaterialName("Orxonox/Radar"); 75 63 resize(); … … 90 78 91 79 void RadarOverlayElement::update() { 92 shipPos_ = SpaceShip::instance_s->getPosition(); 93 currentDir_ = SpaceShip::instance_s->getOrientation()*initialDir_; // according to beni.... 94 currentOrth_ = SpaceShip::instance_s->getOrientation()*initialOrth_; 95 plane = Plane(currentDir_, shipPos_); 96 97 RadarObject* ro = firstRadarObject_; 80 shipPos_ = SpaceShip::getLocalShip()->getPosition(); 81 currentDir_ = SpaceShip::getLocalShip()->getDir(); 82 currentOrth_ = SpaceShip::getLocalShip()->getOrth(); 98 83 // iterate through all RadarObjects 99 while(ro != NULL){100 101 ro->radius_ = calcRadius(ro);102 ro->phi_ = calcPhi(ro);103 ro->right_ = calcRight(ro);84 for(std::set<RadarObject*>::iterator it=HUD::getSingleton().roSet.begin(); it!=HUD::getSingleton().roSet.end(); it++){ 85 // calc position on radar... 86 float radius = calcRadius(shipPos_, currentDir_, currentOrth_, (*it)); 87 float phi = calcPhi(shipPos_, currentDir_, currentOrth_, (*it)); 88 bool right = calcRight(shipPos_, currentDir_, currentOrth_, (*it)); 104 89 105 90 // set size to fit distance... 106 float d = (ro->pos_-shipPos_).length(); 107 if(d<4000) ro->panel_->setDimensions(4,4); 108 else if(d<8000) ro->panel_->setDimensions(3,3); 109 else if(d<16000) ro->panel_->setDimensions(2,2); 110 else ro->panel_->setDimensions(1,1); 91 float d = ((*it)->getPosition()-shipPos_).length(); 92 if(d<10000) (*it)->panel_->setDimensions(4,4); 93 else if(d<20000) (*it)->panel_->setDimensions(3,3); 94 else (*it)->panel_->setDimensions(2,2); 111 95 112 if (r o->right_){113 ro->panel_->setPosition(sin(ro->phi_)*ro->radius_/114 3.5*dim_/2+dim_/2+left_-2,-cos( ro->phi_)*ro->radius_/3.5*dim_/2+dim_/2+top_-2);96 if (right){ 97 (*it)->panel_->setPosition(sin(phi)*radius/ 98 3.5*dim_/2+dim_/2+left_-2,-cos(phi)*radius/3.5*dim_/2+dim_/2+top_-2); 115 99 } 116 100 else { 117 ro->panel_->setPosition(-sin(ro->phi_)*ro->radius_/ 118 3.5*dim_/2+dim_/2+left_-2,-cos(ro->phi_)*ro->radius_/3.5*dim_/2+dim_/2+top_-2); 119 } 120 ro = ro->next; 121 } 122 updateNavMarker(); 123 } 124 125 void RadarOverlayElement::updateNavMarker(){ 126 if(focus_ == NULL) return; 127 // from the angle we find out where to draw the marker 128 // and which of the four arrows to take 129 float r1 = atan((float)(windowW_)/(float)(windowH_)); 130 float phi = focus_->phi_; 131 if(focus_->right_){ 132 if(phi<r1){ 133 navMarker_->setPosition(tan(phi)*windowH_/2+windowW_/2, 0); 134 navMarker_->setUV(0.5, 0.0, 1.0, 0.5); 135 } 136 else if(phi>3.14-r1){ 137 navMarker_->setPosition(-tan(phi)*windowH_/2+windowW_/2, windowH_-16); 138 navMarker_->setUV(0.0, 0.5, 0.5, 1.0); 139 } 140 else { 141 navMarker_->setPosition(windowW_-16, -tan((3.14-2*phi)/2)*windowW_/2+windowH_/2); 142 navMarker_->setUV(0.5, 0.5, 1.0, 1.0); 143 } 144 } 145 else{ 146 if(phi<r1) { 147 navMarker_->setPosition(-tan(phi)*windowH_/2+windowW_/2, 0); 148 navMarker_->setUV(0.5, 0.0, 1.0, 0.5); 149 } 150 else if(phi>3.14-r1) { 151 navMarker_->setPosition(tan(phi)*windowH_/2+windowW_/2, windowH_-16); 152 navMarker_->setUV(0.0, 0.5, 0.5, 1.0); 153 } 154 else { 155 navMarker_->setPosition(0, -tan((3.14-2*phi)/2)*windowW_/2+windowH_/2); 156 navMarker_->setUV(0.0, 0.0, 0.5, 0.5); 101 (*it)->panel_->setPosition(-sin(phi)*radius/ 102 3.5*dim_/2+dim_/2+left_-2,-cos(phi)*radius/3.5*dim_/2+dim_/2+top_-2); 157 103 } 158 104 } 159 105 } 160 106 161 void RadarOverlayElement::addObject(Vector3 pos){ 162 if(firstRadarObject_ == NULL){ 163 firstRadarObject_ = new RadarObject(container_, pos); 164 lastRadarObject_ = firstRadarObject_; 107 void RadarOverlayElement::listObjects(){ 108 int i = 0; 109 COUT(3) << "List of RadarObjects:\n"; 110 // iterate through all Radar Objects 111 for(std::set<RadarObject*>::iterator it=HUD::getSingleton().roSet.begin(); it!=HUD::getSingleton().roSet.end(); it++){ 112 COUT(3) << i++ << ": " << (*it)->getPosition() << std::endl; 165 113 } 166 else{ 167 lastRadarObject_->next = new RadarObject(container_, pos); 168 lastRadarObject_ = lastRadarObject_->next; 169 } 170 } 114 } 171 115 172 void RadarOverlayElement::listObjects(){ 173 int i = 0; 174 RadarObject* ro = firstRadarObject_; 175 COUT(3) << "List of RadarObjects:\n"; 176 // iterate through all Radar Objects 177 while(ro != NULL) { 178 COUT(3) << i++ << ": " << ro->pos_ << std::endl; 179 ro = ro->next; 180 } 181 } 116 float RadarOverlayElement::calcRadius(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){ 117 return(acos((dir.dotProduct(obj->getPosition() - pos))/ 118 ((obj->getPosition() - pos).length()*dir.length()))); 119 } 182 120 183 float RadarOverlayElement::getDist2Focus(){ 184 if(focus_ == NULL) return(0.0); 185 return((focus_->pos_-shipPos_).length()); 186 } 121 float RadarOverlayElement::calcPhi(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){ 122 // project difference vector on our plane... 123 Vector3 proj = Plane(dir, pos).projectVector(obj->getPosition() - pos); 124 // ...and find out the angle 125 return(acos((orth.dotProduct(proj))/ 126 (orth.length()*proj.length()))); 127 } 187 128 188 float RadarOverlayElement::calcRadius(RadarObject* obj){ 189 return(acos((currentDir_.dotProduct(obj->pos_ - shipPos_))/ 190 ((obj->pos_ - shipPos_).length()*currentDir_.length()))); 191 } 192 193 float RadarOverlayElement::calcPhi(RadarObject* obj){ 194 // project difference vector on our plane... 195 Ogre::Vector3 proj = plane.projectVector(obj->pos_ - shipPos_); 196 // ...and find out the angle 197 return(acos((currentOrth_.dotProduct(proj))/ 198 (currentOrth_.length()*proj.length()))); 199 } 200 201 bool RadarOverlayElement::calcRight(RadarObject* obj){ 202 if((currentDir_.crossProduct(currentOrth_)).dotProduct(obj->pos_ - shipPos_) > 0) 203 return true; 129 bool RadarOverlayElement::calcRight(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){ 130 if((dir.crossProduct(orth)).dotProduct(obj->getPosition() - pos) > 0) 131 return true; 204 132 else return false; 205 } 206 207 /*static*/void RadarOverlayElement::cycleFocus(){ 208 if(RadarOverlayElement::instance_s == NULL) return; 209 210 if(RadarOverlayElement::instance_s->focus_ == NULL){ 211 RadarOverlayElement::instance_s->focus_ = RadarOverlayElement::instance_s->firstRadarObject_; 212 } 213 else{ 214 RadarOverlayElement::instance_s->focus_->panel_->setMaterialName("Orxonox/RedDot"); 215 RadarOverlayElement::instance_s->focus_ = RadarOverlayElement::instance_s->focus_->next; 216 } 217 218 if(RadarOverlayElement::instance_s->focus_ == NULL){ 219 RadarOverlayElement::instance_s->navMarker_->hide(); 220 } 221 else{ 222 RadarOverlayElement::instance_s->navMarker_->show(); 223 RadarOverlayElement::instance_s->focus_->panel_->setMaterialName("Orxonox/WhiteDot"); 224 } 225 } 133 } 226 134 } 227 228 /* my local clipboard...229 COUT(3) << "WWWWWWWWWWWWWWWWWWWWWWWWWWWW\n";230 COUT(3) << firstRadarObject_->radius_ << " " << firstRadarObject_->phi_ << std::endl;231 COUT(3) << "WWWWWWWWWWWWWWWWWWWWWWWWWWWW\n";232 */
Note: See TracChangeset
for help on using the changeset viewer.