Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 1580


Ignore:
Timestamp:
Jun 9, 2008, 11:05:18 PM (16 years ago)
Author:
landauf
Message:

started another attempt to fix the occasionally focus-cycling crash

Location:
code/trunk/src/orxonox/hud
Files:
3 edited

Legend:

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

    r1575 r1580  
    247247            if ((*it)->getObject() == object)
    248248            {
    249                 if (this->nav_)
    250                   if (this->nav_->getFocus() == (*it))
    251                     this->nav_->releaseFocus();
     249                if (this->nav_ && this->nav_->getFocus() == (*it))
     250                    this->nav_->releaseFocus();
    252251
    253252                delete (*it);
  • code/trunk/src/orxonox/hud/Navigation.cc

    r1568 r1580  
    4848    using namespace Ogre;
    4949
    50     Navigation::Navigation(OverlayContainer* container){
     50    Navigation::Navigation(OverlayContainer* container)
     51    {
    5152        container_ = container;
    5253        focus_ = NULL;
     
    5455    }
    5556
    56     Navigation::Navigation(OverlayContainer* container, RadarObject* focus){
    57         container_ = container;
    58         focus_ = focus;
    59         init();
    60     }
    61 
    6257    Navigation::~Navigation()
    6358    {
     
    6762    }
    6863
    69     void Navigation::init(){
     64    void Navigation::init()
     65    {
    7066        // create nav text
    7167        navText_ = static_cast<TextAreaOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("TextArea", "navText"));
     
    9591    }
    9692
    97     void Navigation::update(){
     93    void Navigation::update()
     94    {
    9895        if (!focus_)
    9996            return;
     
    10299    }
    103100
    104     void Navigation::updateMarker(){
     101    void Navigation::updateMarker()
     102    {
    105103        int windowW = GraphicsEngine::getSingleton().getWindowWidth();
    106104        int windowH = GraphicsEngine::getSingleton().getWindowHeight();
     
    134132        bool isAbove = currentOrth.dotProduct(focus_->getPosition() - navCamPos)>0;
    135133        bool outOfView = (xPosRel<0 || xPosRel>1 || yPosRel<0 || yPosRel>1);
     134
    136135        // if object is behind us, it is out of view anyway:
    137         if(!outOfView && radius > Ogre::Math::PI / 2) outOfView = true;
    138 
    139         if(outOfView){
     136        if (!outOfView && radius > Ogre::Math::PI / 2)
     137            outOfView = true;
     138
     139        if (outOfView)
     140        {
    140141            // object is not in view
    141142            navMarker_->setMaterialName("Orxonox/NavArrows");
     
    147148            float phiNav = atan((float) xFromCenter / (float) yFromCenter);
    148149
    149             if(isAbove && isRight){
     150            if (isAbove && isRight)
     151            {
    150152                // top right quadrant
    151                 if(-phiNav<phiUpperCorner){
     153                if (-phiNav < phiUpperCorner)
     154                {
    152155                    //COUT(3) << "arrow up\n";
    153156                    navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
     
    156159                    navText_->setTop(navMarker_->getHeight());
    157160                }
    158                 else {
     161                else
     162                {
    159163                    //COUT(3) << "arrow right\n";
    160164                    navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
     
    164168                }
    165169            }
    166             if(!isAbove && isRight){
     170            if (!isAbove && isRight)
     171            {
    167172                // bottom right quadrant
    168                 if(phiNav<phiUpperCorner) {
     173                if (phiNav < phiUpperCorner)
     174                {
    169175                    //COUT(3) << "arrow down\n";
    170176                    navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
     
    173179                    navText_->setTop(navMarker_->getTop()-navMarker_->getHeight());
    174180                }
    175                 else {
     181                else
     182                {
    176183                    //COUT(3) << "arrow right\n";
    177184                    navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
     
    181188                }
    182189            }
    183             if(isAbove && !isRight){
     190            if (isAbove && !isRight)
     191            {
    184192                // top left quadrant
    185                 if(phiNav<phiUpperCorner){
     193                if (phiNav<phiUpperCorner)
     194                {
    186195                    //COUT(3) << "arrow up\n";
    187196                    navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
     
    190199                    navText_->setTop(navMarker_->getHeight());
    191200                }
    192                 else {
     201                else
     202                {
    193203                    //COUT(3) << "arrow left\n";
    194204                    navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
     
    198208                }
    199209            }
    200             if(!isAbove && !isRight){
     210            if (!isAbove && !isRight)
     211            {
    201212                // bottom left quadrant
    202                 if(phiNav>-phiUpperCorner) {
     213                if (phiNav>-phiUpperCorner)
     214                {
    203215                    //COUT(3) << "arrow down\n";
    204216                    navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
     
    207219                    navText_->setTop(navMarker_->getTop()-navMarker_->getHeight());
    208220                }
    209                 else {
     221                else
     222                {
    210223                    //COUT(3) << "arrow left\n";
    211224                    navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
     
    216229            }
    217230        }
    218         else{
     231        else
     232        {
    219233            // object is in view
    220234            navMarker_->setMaterialName("Orxonox/NavTDC");
     
    230244    }
    231245
    232     void Navigation::cycleFocus(){
    233         if(focus_ == NULL){
     246    void Navigation::cycleFocus()
     247    {
     248        if (!focus_)
     249        {
    234250            // Get closest object
    235251            float distance = (unsigned int) -1;
     
    255271                HUD::getSingleton().getRadarObjects().insert(HUD::getSingleton().getRadarObjects().begin(), focus_);
    256272                it_ = HUD::getSingleton().getRadarObjects().begin();
    257                 ++it_;
    258             }
    259         }
    260         else{
     273            }
     274        }
     275        else if (it_ != HUD::getSingleton().getRadarObjects().end())
     276        {
    261277            focus_->resetMaterial();
    262             if(it_ != HUD::getSingleton().getRadarObjects().end()){
     278            ++it_;
     279            if (it_ != HUD::getSingleton().getRadarObjects().end())
    263280                focus_ = *it_;
    264                 ++it_;
    265             }
    266             else focus_ = NULL;
     281            else
     282                focus_ = 0;
     283        }
     284        else
     285        {
     286            focus_ = 0;
    267287        }
    268288        updateFocus();
    269289    }
    270290
    271     void Navigation::updateFocus(){
    272         if(focus_ == NULL){
     291    void Navigation::updateFocus()
     292    {
     293        if (focus_)
     294        {
     295            navMarker_->show();
     296            navText_->show();
     297            focus_->setColour(ColourValue::White);
     298        }
     299        else
     300        {
    273301            navMarker_->hide();
    274302            aimMarker_->hide();
    275303            navText_->hide();
    276304        }
    277         else{
    278             navMarker_->show();
    279             navText_->show();
    280             focus_->setColour(ColourValue::White);
    281         }
    282305    }
    283306
     
    285308    {
    286309        this->focus_ = 0;
    287         this->it_ = HUD::getSingleton().getRadarObjects().end();
    288310        this->updateFocus();
    289311    }
    290312
    291     float Navigation::getDist2Focus() const {
    292         if(focus_ == NULL) return(0.0);
    293         return((focus_->getPosition()-SpaceShip::getLocalShip()->getPosition()).length());
     313    float Navigation::getDist2Focus() const
     314    {
     315        if (focus_)
     316            return (focus_->getPosition() - SpaceShip::getLocalShip()->getPosition()).length();
     317        else
     318            return 0;
    294319    }
    295320}
  • code/trunk/src/orxonox/hud/Navigation.h

    r1568 r1580  
    4242      public:
    4343        Navigation(Ogre::OverlayContainer* container);
    44         Navigation(Ogre::OverlayContainer* container, RadarObject* focus);
    4544        ~Navigation();
    4645
Note: See TracChangeset for help on using the changeset viewer.