Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 6924 for code/branches


Ignore:
Timestamp:
May 18, 2010, 5:34:48 PM (15 years ago)
Author:
rgrieder
Message:

Clean up in HUDNavigation, no actual code changes.

Location:
code/branches/hudelements/src/modules/overlays/hud
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/hudelements/src/modules/overlays/hud/HUDNavigation.cc

    r6923 r6924  
    2828
    2929#include "HUDNavigation.h"
    30 #include <utility>
    31 
    32 #include <string>
     30
    3331#include <OgreCamera.h>
     32#include <OgreFontManager.h>
    3433#include <OgreOverlayManager.h>
    3534#include <OgreTextAreaOverlayElement.h>
    3635#include <OgrePanelOverlayElement.h>
     36
    3737#include "util/Math.h"
    3838#include "util/Convert.h"
     
    5050namespace orxonox
    5151{
    52 CreateFactory(HUDNavigation);
    53 
    54 HUDNavigation::HUDNavigation(BaseObject* creator)
     52    CreateFactory(HUDNavigation);
     53
     54    HUDNavigation::HUDNavigation(BaseObject* creator)
    5555        : OrxonoxOverlay(creator)
    56 {
    57     RegisterObject(HUDNavigation);
    58 
    59     setFont("Monofur");
    60     setTextSize(0.05f);
    61     setNavMarkerSize(0.05f);
    62 
    63 
    64    
    65 //         // create nav text
    66 //         navText_ = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
    67 //             .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
    68 //
    69 //         // create nav marker
    70 //         navMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
    71 //             .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
    72 //         navMarker_->setMaterialName("Orxonox/NavArrows");
    73 
    74         /*
    75                 // create aim marker
    76                 aimMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
    77                     .createOverlayElement("Panel", "HUDNavigation_aimMarker_" + getUniqueNumberString()));
    78                 aimMarker_->setMaterialName("Orxonox/NavCrosshair");
    79                 this->wasOutOfView_ = true; // Ensure the material is changed right the first time..
    80 
    81 
    82         */
    83         /*
    84                 background_->addChild(navMarker_);*/
    85 //        background_->addChild(aimMarker_);
    86 //         background_->addChild(navText_);
    87 
    88         // hide at first
    89 //         this->setVisible(false);
    90 
    91 
    92 
    93 //         setAimMarkerSize(0.04f);
    94    
    95 }
    96 
    97 HUDNavigation::~HUDNavigation()
    98 {
    99     if (this->isInitialized())
    100     {
    101         for (activeObjectListType::iterator it = activeObjectList_.begin(); it != activeObjectList_.end();)
    102             removeObject((it++)->first);
    103     }
    104 }
    105 
    106 void HUDNavigation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
    107 {
    108     SUPER(HUDNavigation, XMLPort, xmlElement, mode);
    109 
    110     XMLPortParam(HUDNavigation, "font",     setFont,     getFont,     xmlElement, mode);
    111     XMLPortParam(HUDNavigation, "textSize", setTextSize, getTextSize, xmlElement, mode);
    112     XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
    113 //        XMLPortParam(HUDNavigation, "aimMarkerSize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode);
    114 }
    115 
    116 void HUDNavigation::setFont(const std::string& font)
    117 {
    118     fontName_ = font;
    119     if (!activeObjectList_.empty())
    120     {
    121         for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
    122         {
    123             if (tempRadarViewable->second.text_ && !fontName_.empty())
    124                 tempRadarViewable->second.text_->setFontName(fontName_);
    125         }
    126     }
    127 }
    128 
    129 const std::string& HUDNavigation::getFont() const
    130 {
    131     return fontName_;
    132 }
    133 
    134 void HUDNavigation::setTextSize(float size)
    135 {
    136     textSize_ = size;
    137     if (!activeObjectList_.empty())
    138     {
    139         for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
    140         {
    141             if (tempRadarViewable->second.text_ && size >= 0.0f)
    142                 tempRadarViewable->second.text_->setCharHeight(size);
    143         }
    144     }
    145 }
    146 
    147 float HUDNavigation::getTextSize() const
    148 {
    149     return textSize_;
    150 }
    151 
    152 void HUDNavigation::tick(float dt)
    153 {
    154     SUPER(HUDNavigation, tick, dt);
    155 
    156 //      updateActiveObjectList(activeObjectList_);
    157 
    158     // Get radar
    159 //         Radar* radar = this->getOwner()->getScene()->getRadar();
    160 //
    161 //         if (!radar->getFocus())
    162 //         {
    163 //             this->overlay_->hide();
    164 //             return;
    165 //         }
    166 //         else
    167 //         {
    168 //             this->overlay_->show();
    169 //         }
    170 
    171     // set text
    172 //         int dist = static_cast<int>(getDist2Focus());
    173 //         navText_->setCaption(multi_cast<std::string>(dist));
    174 //         float textLength = multi_cast<std::string>(dist).size() * navText_->getCharHeight() * 0.3f;
    175 
    176     if (!activeObjectList_.empty())
    177     {
    178         for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
    179         {
    180 
    181 
    182             //get Distance to HumanController and save it in the TextAreaOverlayElement.
    183             int dist = (int)(tempRadarViewable->first->getRVWorldPosition() - HumanController::getLocalControllerEntityAsPawn()->getWorldPosition()).length();
    184             tempRadarViewable->second.text_->setCaption(multi_cast<std::string>(dist));
    185             float textLength = multi_cast<std::string>(dist).size() * tempRadarViewable->second.text_->getCharHeight() * 0.3f;
    186 
    187 
    188 
    189             orxonox::Camera* cam = CameraManager::getInstance().getActiveCamera();
    190             if (!cam)
    191                 return;
    192             const Matrix4& transform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
    193             // transform to screen coordinates
    194             Vector3 pos = transform * tempRadarViewable->first->getRVWorldPosition();
    195 
    196 
    197 
    198 
     56    {
     57        RegisterObject(HUDNavigation);
     58
     59        // Set default values
     60        setFont("Monofur");
     61        setTextSize(0.05f);
     62        setNavMarkerSize(0.05f);
     63    }
     64
     65    HUDNavigation::~HUDNavigation()
     66    {
     67        if (this->isInitialized())
     68        {
     69            for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end();)
     70                removeObject((it++)->first);
     71        }
     72    }
     73
     74    void HUDNavigation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     75    {
     76        SUPER(HUDNavigation, XMLPort, xmlElement, mode);
     77
     78        XMLPortParam(HUDNavigation, "font",          setFont,          getFont,          xmlElement, mode);
     79        XMLPortParam(HUDNavigation, "textSize",      setTextSize,      getTextSize,      xmlElement, mode);
     80        XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
     81    }
     82
     83    void HUDNavigation::setFont(const std::string& font)
     84    {
     85        const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName(font);
     86        if (fontPtr.isNull())
     87        {
     88            COUT(2) << "Warning: HUDNavigation: Font '" << font << "' not found" << std::endl;
     89            return;
     90        }
     91        fontName_ = font;
     92        for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it)
     93        {
     94            if (it->second.text_ != NULL)
     95                it->second.text_->setFontName(fontName_);
     96        }
     97    }
     98
     99    const std::string& HUDNavigation::getFont() const
     100    {
     101        return fontName_;
     102    }
     103
     104    void HUDNavigation::setTextSize(float size)
     105    {
     106        if (size <= 0.0f)
     107        {
     108            COUT(2) << "Warning: HUDNavigation: Negative font size not allowed" << std::endl;
     109            return;
     110        }
     111        textSize_ = size;
     112        for (ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it)
     113        {
     114            if (it->second.text_)
     115                it->second.text_->setCharHeight(size);
     116        }
     117    }
     118
     119    float HUDNavigation::getTextSize() const
     120    {
     121        return textSize_;
     122    }
     123
     124    void HUDNavigation::tick(float dt)
     125    {
     126        SUPER(HUDNavigation, tick, dt);
     127
     128        Camera* cam = CameraManager::getInstance().getActiveCamera();
     129        if (cam == NULL)
     130            return;
     131        const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
     132
     133        for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it)
     134        {
     135            // Get Distance to HumanController and save it in the TextAreaOverlayElement.
     136            int dist = (int)((it->first->getRVWorldPosition() - HumanController::getLocalControllerEntityAsPawn()->getWorldPosition()).length() + 0.5f);
     137            it->second.text_->setCaption(multi_cast<std::string>(dist));
     138            float textLength = multi_cast<std::string>(dist).size() * it->second.text_->getCharHeight() * 0.3f;
     139
     140            // Transform to screen coordinates
     141            Vector3 pos = camTransform * it->first->getRVWorldPosition();
     142
     143            bool outOfView = true;
    199144            if (pos.z > 1.0)
    200145            {
    201146                // z > 1.0 means that the object is behind the camera
    202                 tempRadarViewable->second.outOfView_ = true;
     147                outOfView = true;
    203148                // we have to switch all coordinates (if you don't know why,
    204149                // try linear algebra lectures, because I can't explain..)
     
    207152            }
    208153            else
    209                 tempRadarViewable->second.outOfView_ = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
    210 
    211             if (tempRadarViewable->second.outOfView_)
     154                outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
     155
     156            if (outOfView)
    212157            {
    213                 // object is not in view
    214 //            aimMarker_->hide();
    215 
    216                 if (!tempRadarViewable->second.wasOutOfView_)
     158                // Object is not in view
     159
     160                // Change material only if outOfView changed
     161                if (!it->second.wasOutOfView_)
    217162                {
    218                     tempRadarViewable->second.panel_->setMaterialName("Orxonox/NavArrows");
    219                     tempRadarViewable->second.wasOutOfView_ = true;
     163                    it->second.panel_->setMaterialName("Orxonox/NavArrows");
     164                    it->second.wasOutOfView_ = true;
    220165                }
    221166
    222 
    223 
     167                // Switch between top, bottom, left and right position of the arrow at the screen border
    224168                if (pos.x < pos.y)
    225169                {
    226170                    if (pos.y > -pos.x)
    227171                    {
    228                         // up
     172                        // Top
    229173                        float position = pos.x / pos.y + 1.0f;
    230                         tempRadarViewable->second.panel_->setPosition((position - tempRadarViewable->second.panel_->getWidth()) * 0.5f, 0.0f);
    231                         tempRadarViewable->second.panel_->setUV(0.5f, 0.0f, 1.0f, 0.5f);
    232                         tempRadarViewable->second.text_->setLeft((position - textLength) * 0.5f);
    233                         tempRadarViewable->second.text_->setTop(tempRadarViewable->second.panel_->getHeight());
     174                        it->second.panel_->setPosition((position - it->second.panel_->getWidth()) * 0.5f, 0.0f);
     175                        it->second.panel_->setUV(0.5f, 0.0f, 1.0f, 0.5f);
     176                        it->second.text_->setLeft((position - textLength) * 0.5f);
     177                        it->second.text_->setTop(it->second.panel_->getHeight());
    234178                    }
    235179                    else
    236180                    {
    237                         // left
     181                        // Left
    238182                        float position = pos.y / pos.x + 1.0f;
    239                         tempRadarViewable->second.panel_->setPosition(0.0f, (position - tempRadarViewable->second.panel_->getWidth()) * 0.5f);
    240                         tempRadarViewable->second.panel_->setUV(0.0f, 0.0f, 0.5f, 0.5f);
    241                         tempRadarViewable->second.text_->setLeft(tempRadarViewable->second.panel_->getWidth() + 0.01f);
    242                         tempRadarViewable->second.text_->setTop((position - tempRadarViewable->second.text_->getCharHeight()) * 0.5f);
     183                        it->second.panel_->setPosition(0.0f, (position - it->second.panel_->getWidth()) * 0.5f);
     184                        it->second.panel_->setUV(0.0f, 0.0f, 0.5f, 0.5f);
     185                        it->second.text_->setLeft(it->second.panel_->getWidth() + 0.01f);
     186                        it->second.text_->setTop((position - it->second.text_->getCharHeight()) * 0.5f);
    243187                    }
    244188                }
     
    248192                    if (pos.y < -pos.x)
    249193                    {
    250                         // down
     194                        // Bottom
    251195                        float position = -pos.x / pos.y + 1.0f;
    252                         tempRadarViewable->second.panel_->setPosition((position - tempRadarViewable->second.panel_->getWidth()) * 0.5f, 1.0f - tempRadarViewable->second.panel_->getHeight());
    253                         tempRadarViewable->second.panel_->setUV(0.0f, 0.5f, 0.5f, 1.0f);
    254                         tempRadarViewable->second.text_->setLeft((position - textLength) * 0.5f);
    255                         tempRadarViewable->second.text_->setTop(1.0f - tempRadarViewable->second.panel_->getHeight() - tempRadarViewable->second.text_->getCharHeight());
     196                        it->second.panel_->setPosition((position - it->second.panel_->getWidth()) * 0.5f, 1.0f - it->second.panel_->getHeight());
     197                        it->second.panel_->setUV(0.0f, 0.5f, 0.5f, 1.0f);
     198                        it->second.text_->setLeft((position - textLength) * 0.5f);
     199                        it->second.text_->setTop(1.0f - it->second.panel_->getHeight() - it->second.text_->getCharHeight());
    256200                    }
    257201                    else
    258202                    {
    259                         // right
     203                        // Right
    260204                        float position = -pos.y / pos.x + 1.0f;
    261                         tempRadarViewable->second.panel_->setPosition(1.0f - tempRadarViewable->second.panel_->getWidth(), (position - tempRadarViewable->second.panel_->getHeight()) * 0.5f);
    262                         tempRadarViewable->second.panel_->setUV(0.5f, 0.5f, 1.0f, 1.0f);
    263                         tempRadarViewable->second.text_->setLeft(1.0f - tempRadarViewable->second.panel_->getWidth() - textLength - 0.01f);
    264                         tempRadarViewable->second.text_->setTop((position - tempRadarViewable->second.text_->getCharHeight()) * 0.5f);
     205                        it->second.panel_->setPosition(1.0f - it->second.panel_->getWidth(), (position - it->second.panel_->getHeight()) * 0.5f);
     206                        it->second.panel_->setUV(0.5f, 0.5f, 1.0f, 1.0f);
     207                        it->second.text_->setLeft(1.0f - it->second.panel_->getWidth() - textLength - 0.01f);
     208                        it->second.text_->setTop((position - it->second.text_->getCharHeight()) * 0.5f);
    265209                    }
    266210                }
     
    268212            else
    269213            {
    270 
    271 
    272                 // object is in view
    273                 /*
    274                             Vector3 aimpos = transform * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(),
    275                                     Projectile::getSpeed(), Radar::getInstance().getFocus()->getRVWorldPosition(), Radar::getInstance().getFocus()->getRVOrientedVelocity());
    276                 */
    277                 if (tempRadarViewable->second.wasOutOfView_)
     214                // Object is in view
     215
     216                // Change material only if outOfView changed
     217                if (it->second.wasOutOfView_)
    278218                {
    279                     tempRadarViewable->second.panel_->setMaterialName("Orxonox/NavTDC");
    280                     tempRadarViewable->second.wasOutOfView_ = false;
     219                    it->second.panel_->setMaterialName("Orxonox/NavTDC");
     220                    it->second.wasOutOfView_ = false;
    281221                }
    282222
    283                 // object is in view
    284                 tempRadarViewable->second.panel_->setUV(0.0f, 0.0f, 1.0f, 1.0f);
    285                 tempRadarViewable->second.panel_->setLeft((pos.x + 1.0f - tempRadarViewable->second.panel_->getWidth()) * 0.5f);
    286                 tempRadarViewable->second.panel_->setTop((-pos.y + 1.0f - tempRadarViewable->second.panel_->getHeight()) * 0.5f);
    287 
    288 
    289 //                 aimMarker_->show();
    290 //                 aimMarker_->setLeft((aimpos.x + 1.0f - aimMarker_->getWidth()) * 0.5f);
    291 //                 aimMarker_->setTop((-aimpos.y + 1.0f - aimMarker_->getHeight()) * 0.5f);
    292 //
    293                 tempRadarViewable->second.text_->setLeft((pos.x + 1.0f + tempRadarViewable->second.panel_->getWidth()) * 0.5f);
    294                 tempRadarViewable->second.text_->setTop((-pos.y + 1.0f + tempRadarViewable->second.panel_->getHeight()) * 0.5f);
     223                // Position marker
     224                it->second.panel_->setUV(0.0f, 0.0f, 1.0f, 1.0f);
     225                it->second.panel_->setLeft((pos.x + 1.0f - it->second.panel_->getWidth()) * 0.5f);
     226                it->second.panel_->setTop((-pos.y + 1.0f - it->second.panel_->getHeight()) * 0.5f);
     227
     228                // Position text
     229                it->second.text_->setLeft((pos.x + 1.0f + it->second.panel_->getWidth()) * 0.5f);
     230                it->second.text_->setTop((-pos.y + 1.0f + it->second.panel_->getHeight()) * 0.5f);
    295231            }
    296232
    297             tempRadarViewable->second.panel_->show();
    298             tempRadarViewable->second.text_->show();
    299 //             tempRadarViewable->second.text_->hide();
    300         }
    301 
    302     }
    303 
     233            // Make sure the overlays are shown
     234            it->second.panel_->show();
     235            it->second.text_->show();
     236        }
     237    }
     238
     239
     240    /** Overridden method of OrxonoxOverlay.
     241    @details
     242        Usually the entire overlay scales with scale().
     243        Here we obviously have to adjust this.
     244    */
     245    void HUDNavigation::sizeChanged()
     246    {
     247        // Use size to compensate for aspect ratio if enabled.
     248        float xScale = this->getActualSize().x;
     249        float yScale = this->getActualSize().y;
     250
     251        for (ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it)
     252        {
     253            if (it->second.panel_ != NULL)
     254                it->second.panel_->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
     255            if (it->second.text_ != NULL)
     256                it->second.text_->setCharHeight(it->second.text_->getCharHeight() * yScale);
     257        }
     258    }
     259
     260    void HUDNavigation::addObject(RadarViewable* object)
     261    {
     262        if (object == NULL)
     263            return;
     264
     265        // Don't display our own ship
     266        if (object == dynamic_cast<RadarViewable*>(this->getOwner()))
     267            return;
     268
     269        // Object hasn't been added yet (we know that)
     270        assert(this->activeObjectList_.find(object) == this->activeObjectList_.end());
     271
     272        // Scales used for dimensions and text size
     273        float xScale = this->getActualSize().x;
     274        float yScale = this->getActualSize().y;
     275
     276        // Create everything needed to display the object on the radar and add it to the map
     277
     278        // Create arrow/marker
     279        Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
     280            .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
     281        panel->setMaterialName("Orxonox/NavArrows");
     282        panel->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
     283
     284        Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
     285            .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
     286        text->setFontName(this->fontName_);
     287        text->setCharHeight(text->getCharHeight() * yScale);
     288
     289        ObjectInfo tempStruct = {panel, text, true};
     290        activeObjectList_[object] = tempStruct;
     291
     292        this->background_->addChild(panel);
     293        this->background_->addChild(text);
     294    }
     295
     296    void HUDNavigation::removeObject(RadarViewable* viewable)
     297    {
     298        ObjectMap::iterator it = activeObjectList_.find(viewable);
     299
     300        if (activeObjectList_.find(viewable) != activeObjectList_.end())
     301        {
     302            // Detach overlays
     303            this->background_->removeChild(it->second.panel_->getName());
     304            this->background_->removeChild(it->second.text_->getName());
     305            // Properly destroy the overlay elements (do not use delete!)
     306            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.panel_);
     307            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.text_);
     308            // Remove from the list
     309            activeObjectList_.erase(viewable);
     310        }
     311        else
     312            COUT(2) << "Warning, HUDNavigation: Attempting to remove non-existent object" << std::endl;
     313    }
     314
     315    void HUDNavigation::changedOwner()
     316    {
     317        // TODO: Delete old objects?
     318        const std::set<RadarViewable*>& respawnObjects = this->getOwner()->getScene()->getRadar()->getRadarObjects();
     319        for (std::set<RadarViewable*>::const_iterator it = respawnObjects.begin(); it != respawnObjects.end(); ++it)
     320        {
     321            if (!(*it)->isHumanShip_)
     322                this->addObject(*it);
     323        }
     324    }
    304325}
    305 
    306 
    307 // float HUDNavigation::getDist2Focus() const {
    308 //
    309 //     Radar* radar = this->getOwner()->getScene()->getRadar();
    310 //     if (radar->getFocus() && HumanController::getLocalControllerEntityAsPawn())
    311 //         return (radar->getFocus()->getRVWorldPosition() - HumanController::getLocalControllerEntityAsPawn()->getWorldPosition()).length();
    312 //     else
    313 //         return 0;
    314 // }
    315 
    316 /**
    317 @brief Overridden method of OrxonoxOverlay. Usually the entire overlay
    318        scales with scale(). Here we obviously have to adjust this.
    319 */
    320 void HUDNavigation::sizeChanged()
    321 {
    322     // use size to compensate for aspect ratio if enabled.
    323     float xScale = this->getActualSize().x;
    324     float yScale = this->getActualSize().y;
    325 
    326     if (!activeObjectList_.empty())
    327     {
    328         for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
    329         {
    330 
    331             if (tempRadarViewable->second.panel_)
    332                 tempRadarViewable->second.panel_->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
    333 //            if (this->aimMarker_)
    334 //            aimMarker_->setDimensions(aimMarkerSize_ * xScale, aimMarkerSize_ * yScale);
    335             if (tempRadarViewable->second.text_)
    336                 tempRadarViewable->second.text_->setCharHeight(tempRadarViewable->second.text_->getCharHeight() * yScale);
    337         }
    338     }
    339 }
    340 
    341 
    342 void HUDNavigation::addObject(RadarViewable* object)
    343 {
    344     if (object == dynamic_cast<RadarViewable*>(this->getOwner()))
    345         return;
    346 
    347     assert(object);
    348 
    349     // Make sure the object hasn't been added yet
    350     assert( this->activeObjectList_.find(object) == this->activeObjectList_.end() );
    351 
    352     // Create everything needed to display the object on the radar and add it to the map
    353 
    354     // create nav marker
    355     Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
    356                                        .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
    357 
    358     panel->setMaterialName("Orxonox/NavArrows");
    359 
    360     Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
    361                                          .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
    362                
    363    
    364     float xScale = this->getActualSize().x;
    365     float yScale = this->getActualSize().y;
    366 
    367     panel->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
    368     text->setFontName(this->fontName_);
    369     text->setCharHeight(text->getCharHeight() * yScale);
    370 
    371     objectStruct tempStruct = {panel, text, true};
    372     activeObjectList_[object] = tempStruct;
    373 
    374     this->background_->addChild(panel);
    375     this->background_->addChild(text);
    376 
    377 //      background_->addChild(activeObjectList_[object].first);
    378 //      background_->addChild(activeObjectList_[object].second);
    379 
    380 }
    381 
    382 void HUDNavigation::removeObject(RadarViewable* viewable)
    383 {
    384     activeObjectListType::iterator it = activeObjectList_.find(viewable);
    385 
    386     if (activeObjectList_.find(viewable) != activeObjectList_.end())
    387     {
    388         // Remove overlays from Ogre
    389         this->background_->removeChild(it->second.panel_->getName());
    390         this->background_->removeChild(it->second.text_->getName());
    391         // correctly destroy the overlay elements
    392         Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.panel_);
    393         Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.text_);
    394 
    395         activeObjectList_.erase(viewable);
    396     }
    397    
    398 }
    399 
    400 void HUDNavigation::changedOwner()
    401 {
    402     respawnObjectSetType respawnObjectSet = this->getOwner()->getScene()->getRadar()->getRadarObjects();
    403     respawnObjectSetType::iterator respawnObjectSetIt_;
    404     for (respawnObjectSetIt_ = respawnObjectSet.begin(); respawnObjectSetIt_ != respawnObjectSet.end(); ++respawnObjectSetIt_)
    405     {
    406         if (!(*respawnObjectSetIt_)->isHumanShip_)
    407             this->addObject(*respawnObjectSetIt_);
    408     }
    409 
    410 }
    411 
    412 
    413 
    414 //      void updateActiveObjectList(map activeObjectList_){}
    415 //
    416 //      void HUDNavigation::objectChanged(RadarViewable* viewable){}
    417 //
    418 //
    419 //         float HUDNavigation::getRadarSensitivity(){}
    420 //         void HUDNavigation::radarTick(float dt){}
    421 
    422 
    423 }
    424 
    425 
  • code/branches/hudelements/src/modules/overlays/hud/HUDNavigation.h

    r6917 r6924  
    3030#define _HUDNavigation_H__
    3131
    32 #include <utility>
     32#include "overlays/OverlaysPrereqs.h"
     33
    3334#include <map>
    34 #include "overlays/OverlaysPrereqs.h"
    35 #include "interfaces/RadarViewable.h"
     35#include <string>
    3636
    37 #include "interfaces/RadarListener.h"
    3837#include "util/OgreForwardRefs.h"
    3938#include "tools/interfaces/Tickable.h"
     39#include "interfaces/RadarListener.h"
    4040#include "overlays/OrxonoxOverlay.h"
    41 
    42 #include <vector>
    4341
    4442namespace orxonox
    4543{
    46 class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener
    47 {
    48 public:
    49     HUDNavigation(BaseObject* creator);
    50     virtual ~HUDNavigation();
     44    class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener
     45    {
     46    public:
     47        HUDNavigation(BaseObject* creator);
     48        virtual ~HUDNavigation();
    5149
    52     virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
    53     virtual void tick(float dt);
    54     virtual void addObject(RadarViewable* object);
     50        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
     51        virtual void tick(float dt);
    5552
    56     virtual void removeObject(RadarViewable* viewable);
    57     virtual void objectChanged(RadarViewable* viewable) {}
    58     inline float getRadarSensitivity() const {return 1.0f;}
    59     inline void radarTick(float dt) {}
    60     virtual void changedOwner();
     53        virtual void addObject(RadarViewable* object);
     54        virtual void removeObject(RadarViewable* viewable);
     55        virtual void objectChanged(RadarViewable* viewable) {}
    6156
     57        virtual void changedOwner();
     58        virtual void sizeChanged();
     59        virtual void angleChanged() { }
     60        virtual void positionChanged() { }
     61        virtual void radarTick(float dt) {}
    6262
    63 private:
     63        inline float getRadarSensitivity() const
     64            { return 1.0f; }
    6465
     66    private:
     67        struct ObjectInfo
     68        {
     69            Ogre::PanelOverlayElement* panel_;
     70            Ogre::TextAreaOverlayElement* text_;
     71            bool outOfView_;
     72            bool wasOutOfView_;
     73        };
    6574
     75        // XMLPort accessors
     76        void setNavMarkerSize(float size)
     77            { navMarkerSize_ = size; this->sizeChanged(); }
     78        float getNavMarkerSize() const
     79            { return navMarkerSize_; }
    6680
    67     void sizeChanged();
    68     void angleChanged() { }
    69     void positionChanged() { }
     81        void setTextSize(float size);
     82        float getTextSize() const;
    7083
    71 //      void updateActiveObjectList(map activeObjectList_);
     84        void setFont(const std::string& font);
     85        const std::string& getFont() const;
    7286
     87        typedef std::map<RadarViewable*, ObjectInfo > ObjectMap;
     88        ObjectMap activeObjectList_;
    7389
    74 
    75     // XMLPort accessors
    76     void setNavMarkerSize(float size) {
    77         navMarkerSize_ = size;
    78         this->sizeChanged();
    79     }
    80     float getNavMarkerSize() const    {
    81         return navMarkerSize_;
    82     }
    83 
    84     /*
    85             void setAimMarkerSize(float size) { this->aimMarkerSize_ = size; this->sizeChanged(); }
    86             float getAimMarkerSize() const    { return this->aimMarkerSize_; }
    87     */
    88 
    89     void setTextSize(float size);
    90     float getTextSize() const;
    91 
    92     void setFont(const std::string& font);
    93     const std::string& getFont() const;
    94 
    95     void updateMarker();
    96     void updateFocus();
    97 //     float getDist2Focus() const;
    98     void getSingleton();
    99 
    100 
    101     void updateActiveObjectMap();
    102 
    103     Ogre::PanelOverlayElement* navMarker_;      //!< the panel used to show the arrow and the target marker
    104     float navMarkerSize_;                       //!< One paramter size of the navigation marker
    105     /*
    106             Ogre::PanelOverlayElement* aimMarker_;      //!< Panel used to show the aim Marker
    107             float aimMarkerSize_;                       //!< One paramter size of the aim marker
    108     */
    109     Ogre::TextAreaOverlayElement* navText_;     //!< Text overlay to display the target distance
    110    
    111 
    112     struct objectStruct{
    113      
    114       Ogre::PanelOverlayElement* panel_;
    115       Ogre::TextAreaOverlayElement* text_;
    116       bool outOfView_;
    117       bool wasOutOfView_;
    118    
     90        float navMarkerSize_;
     91        std::string fontName_;
     92        float textSize_;
    11993    };
    120    
    121     typedef std::map<RadarViewable*, objectStruct > activeObjectListType;
    122     activeObjectListType activeObjectList_;
    123     activeObjectListType::iterator tempRadarViewable;
    124        
    125     typedef std::set<RadarViewable*> respawnObjectSetType;
    126    
    127 
    128 
    129     std::string fontName_;
    130     float textSize_;
    131 
    132 };
    133 
    13494}
    13595
Note: See TracChangeset for help on using the changeset viewer.