Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 21, 2008, 11:00:40 PM (17 years ago)
Author:
FelixSchulthess
Message:

added a navigation marker

Location:
code/branches/hud3/src/orxonox/hud
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • code/branches/hud3/src/orxonox/hud/HUD.cc

    r1342 r1350  
    8181        radar->addObject(Vector3(1500.0, 0.0, 0.0));
    8282        radar->addObject(Vector3(0.0, 4000.0, 0.0));
     83        RadarOverlayElement::cycleFocus();
    8384    }
    8485
  • code/branches/hud3/src/orxonox/hud/RadarOverlayElement.cc

    r1346 r1350  
    3232    using namespace Ogre;
    3333
     34    RadarOverlayElement* RadarOverlayElement::instance_s = NULL;
     35
    3436    RadarOverlayElement::RadarOverlayElement(const String& name):Ogre::PanelOverlayElement(name){
     37        RadarOverlayElement::instance_s = this;
    3538    }
    3639
     
    4750        firstRadarObject_ = NULL;
    4851        lastRadarObject_ = NULL;
     52        focus_ = NULL;
     53
     54        // create nav marker ...
     55        navMarker_ = static_cast<PanelOverlayElement*>(om->createOverlayElement("Panel", "NavMarker"));
     56        navMarker_->setMetricsMode(Ogre::GMM_PIXELS);
     57        navMarker_->setMaterialName("Orxonox/NavMarker");
     58        navMarker_->setDimensions(16,16);
     59        navMarker_->setPosition(0,386);
     60        navMarker_->hide();
     61        container_->addChild(navMarker_);
    4962
    5063        // these have to fit the data in the level
     
    105118            ro = ro->next;
    106119                }
     120                updateNavMarker();
     121    }
     122
     123    void RadarOverlayElement::updateNavMarker(){
     124        if(focus_ == NULL) return;
     125        // from the angle we find out where to draw the marker
     126        // and which of the four arrows to take
     127        float r1 = 0.97;//atan(windowW_/windowH_); // doesn't work correctly yet
     128        float phi = focus_->phi_;
     129        if(focus_->right_){
     130            if(phi<r1){
     131                navMarker_->setPosition(tan(phi)*windowH_/2+windowW_/2, 0);
     132                navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
     133            }
     134            else if(phi>3.14-r1){
     135                navMarker_->setPosition(-tan(phi)*windowH_/2+windowW_/2, windowH_-16);
     136                navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
     137            }
     138            else {
     139                navMarker_->setPosition(windowW_-16, -tan((3.14-2*phi)/2)*windowW_/2+windowH_/2);
     140                navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
     141            }
     142        }
     143        else{
     144            if(phi<r1) {
     145                navMarker_->setPosition(-tan(phi)*windowH_/2+windowW_/2, 0);
     146                navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
     147            }
     148            else if(phi>3.14-r1) {
     149                navMarker_->setPosition(tan(phi)*windowH_/2+windowW_/2, windowH_-16);
     150                navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
     151            }
     152            else {
     153                navMarker_->setPosition(0, -tan((3.14-2*phi)/2)*windowW_/2+windowH_/2);
     154                navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
     155            }
     156        }
    107157    }
    108158
     
    147197        else return false;
    148198        }
     199
     200        /*static*/void RadarOverlayElement::cycleFocus(){
     201            if(RadarOverlayElement::instance_s == NULL) return;
     202            if(RadarOverlayElement::instance_s->focus_ == NULL)
     203            RadarOverlayElement::instance_s->focus_ = RadarOverlayElement::instance_s->firstRadarObject_;
     204        else
     205            RadarOverlayElement::instance_s->focus_ = RadarOverlayElement::instance_s->focus_->next;
     206        if(RadarOverlayElement::instance_s->focus_ == NULL)
     207            RadarOverlayElement::instance_s->navMarker_->hide();
     208        else
     209            RadarOverlayElement::instance_s->navMarker_->show();
     210        }
    149211}
    150212
  • code/branches/hud3/src/orxonox/hud/RadarOverlayElement.h

    r1346 r1350  
    5050        private:
    5151            Ogre::OverlayManager* om;               // our one and only overlay manager
    52             Ogre::OverlayContainer* container_;
     52            Ogre::OverlayContainer* container_;     // pointer to the container we're in
    5353            Vector3 initialDir_;                        // direction of nose
    5454            Vector3 currentDir_;
     
    5757            Vector3 shipPos_;                       // position of ship
    5858            Ogre::Plane plane;                      // plane perpendicular to dir
    59 
    60                         RadarObject* firstRadarObject_;         // start of linked list
    61                         RadarObject* lastRadarObject_;          // end of linked list
    6259
    6360            Ogre::Real leftRel_, topRel_, dimRel_;  // relative position/dimension
     
    7168                        void resize();
    7269            void update();
     70            void updateNavMarker();
    7371            void addObject(Vector3 pos);
    7472            void listObjects();
     
    7674            float calcPhi(RadarObject* obj);
    7775            bool calcRight(RadarObject* obj);
     76
     77            Ogre::PanelOverlayElement* navMarker_;  // marker to help navigating
     78                        RadarObject* firstRadarObject_;         // start of linked list
     79                        RadarObject* lastRadarObject_;          // end of linked list
     80                        RadarObject* focus_;                    // object that is focussed
     81
     82            static RadarOverlayElement* instance_s;
     83            static void cycleFocus();
    7884        };
    7985}
Note: See TracChangeset for help on using the changeset viewer.