Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 27, 2010, 3:58:24 PM (14 years ago)
Author:
sfluecki
Message:

Final changes in HUDNavigation. marker are now working and are limitable by setting markerLimit in HUDNavigation.h -mission accomplished-

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

Legend:

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

    r6947 r6971  
    4747#include "worldentities/WorldEntity.h"
    4848#include "interfaces/RadarViewable.h"
     49// #include <boost/bind/bind_template.hpp>
     50
    4951
    5052namespace orxonox
    5153{
    52     CreateFactory(HUDNavigation);
    53 
    54     HUDNavigation::HUDNavigation(BaseObject* creator)
    55         : OrxonoxOverlay(creator)
    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())
     54bool compareDistance ( std::pair<RadarViewable*, unsigned int > a, std::pair<RadarViewable*, unsigned int > b )
     55{
     56    return a.second<b.second;
     57
     58}
     59CreateFactory ( HUDNavigation );
     60
     61HUDNavigation::HUDNavigation ( BaseObject* creator )
     62        : OrxonoxOverlay ( creator )
     63{
     64    RegisterObject ( HUDNavigation );
     65
     66    // Set default values
     67    setFont ( "Monofur" );
     68    setTextSize ( 0.05f );
     69    setNavMarkerSize ( 0.05f );
     70}
     71
     72HUDNavigation::~HUDNavigation()
     73{
     74    if ( this->isInitialized() )
     75    {
     76        for ( ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); )
     77            removeObject ( ( it++ )->first );
     78
     79    }
     80
     81    sortedObjectList_.clear();
     82}
     83
     84void HUDNavigation::XMLPort ( Element& xmlElement, XMLPort::Mode mode )
     85{
     86    SUPER ( HUDNavigation, XMLPort, xmlElement, mode );
     87
     88    XMLPortParam ( HUDNavigation, "font",          setFont,          getFont,          xmlElement, mode );
     89    XMLPortParam ( HUDNavigation, "textSize",      setTextSize,      getTextSize,      xmlElement, mode );
     90    XMLPortParam ( HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode );
     91}
     92
     93void HUDNavigation::setFont ( const std::string& font )
     94{
     95    const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName ( font );
     96    if ( fontPtr.isNull() )
     97    {
     98        COUT ( 2 ) << "Warning: HUDNavigation: Font '" << font << "' not found" << std::endl;
     99        return;
     100    }
     101    fontName_ = font;
     102    for ( ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it )
     103    {
     104        if ( it->second.text_ != NULL )
     105            it->second.text_->setFontName ( fontName_ );
     106    }
     107}
     108
     109const std::string& HUDNavigation::getFont() const
     110{
     111    return fontName_;
     112}
     113
     114void HUDNavigation::setTextSize ( float size )
     115{
     116    if ( size <= 0.0f )
     117    {
     118        COUT ( 2 ) << "Warning: HUDNavigation: Negative font size not allowed" << std::endl;
     119        return;
     120    }
     121    textSize_ = size;
     122    for ( ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it )
     123    {
     124        if ( it->second.text_ )
     125            it->second.text_->setCharHeight ( size );
     126    }
     127}
     128
     129float HUDNavigation::getTextSize() const
     130{
     131    return textSize_;
     132}
     133
     134void HUDNavigation::tick ( float dt )
     135{
     136    SUPER ( HUDNavigation, tick, dt );
     137
     138    Camera* cam = CameraManager::getInstance().getActiveCamera();
     139    if ( cam == NULL )
     140        return;
     141    const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
     142
     143
     144    //TODO: sort list 'sortedObjectList_' according to distance.$
     145    for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++listIt )
     146    {
     147        listIt->second = ( int ) ( ( listIt->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition() ).length() + 0.5f );
     148    }
     149
     150    sortedObjectList_.sort ( compareDistance );
     151
     152    unsigned int markerCount_ = 0;
     153
     154//         for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it)
     155    for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++markerCount_, ++listIt )
     156    {
     157        ObjectMap::iterator it = activeObjectList_.find ( listIt->first );
     158
     159        if ( markerCount_ < markerLimit_ )
    68160        {
    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         {
     161
     162
    135163            // Get Distance to HumanController and save it in the TextAreaOverlayElement.
    136             int dist = (int)((it->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->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;
     164            int dist = listIt->second;
     165            it->second.text_->setCaption ( multi_cast<std::string> ( dist ) );
     166            float textLength = multi_cast<std::string> ( dist ).size() * it->second.text_->getCharHeight() * 0.3f;
    139167
    140168            // Transform to screen coordinates
     
    142170
    143171            bool outOfView = true;
    144             if (pos.z > 1.0)
     172            if ( pos.z > 1.0 )
    145173            {
    146174                // z > 1.0 means that the object is behind the camera
     
    153181            else
    154182                outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
    155 
    156             if (outOfView)
     183            // Get Distance to HumanController and save it in the TextAreaOverlayElement.
     184            it->second.text_->setCaption ( multi_cast<std::string> ( dist ) );
     185
     186            if ( outOfView )
    157187            {
    158188                // Object is not in view
    159189
    160190                // Change material only if outOfView changed
    161                 if (!it->second.wasOutOfView_)
     191                if ( !it->second.wasOutOfView_ )
    162192                {
    163                     it->second.panel_->setMaterialName("Orxonox/NavArrows");
     193                    it->second.panel_->setMaterialName ( "Orxonox/NavArrows" );
    164194                    it->second.wasOutOfView_ = true;
    165195                }
    166196
    167197                // Switch between top, bottom, left and right position of the arrow at the screen border
    168                 if (pos.x < pos.y)
     198                if ( pos.x < pos.y )
    169199                {
    170                     if (pos.y > -pos.x)
     200                    if ( pos.y > -pos.x )
    171201                    {
    172202                        // Top
    173203                        float position = pos.x / pos.y + 1.0f;
    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());
     204                        it->second.panel_->setPosition ( ( position - it->second.panel_->getWidth() ) * 0.5f, 0.0f );
     205                        it->second.panel_->setUV ( 0.5f, 0.0f, 1.0f, 0.5f );
     206                        it->second.text_->setLeft ( ( position - textLength ) * 0.5f );
     207                        it->second.text_->setTop ( it->second.panel_->getHeight() );
    178208                    }
    179209                    else
     
    181211                        // Left
    182212                        float position = pos.y / pos.x + 1.0f;
    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);
     213                        it->second.panel_->setPosition ( 0.0f, ( position - it->second.panel_->getWidth() ) * 0.5f );
     214                        it->second.panel_->setUV ( 0.0f, 0.0f, 0.5f, 0.5f );
     215                        it->second.text_->setLeft ( it->second.panel_->getWidth() + 0.01f );
     216                        it->second.text_->setTop ( ( position - it->second.text_->getCharHeight() ) * 0.5f );
    187217                    }
    188218                }
     219
    189220                else
    190221                {
    191222
    192                     if (pos.y < -pos.x)
     223                    if ( pos.y < -pos.x )
    193224                    {
    194225                        // Bottom
    195226                        float position = -pos.x / pos.y + 1.0f;
    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());
     227                        it->second.panel_->setPosition ( ( position - it->second.panel_->getWidth() ) * 0.5f, 1.0f - it->second.panel_->getHeight() );
     228                        it->second.panel_->setUV ( 0.0f, 0.5f, 0.5f, 1.0f );
     229                        it->second.text_->setLeft ( ( position - textLength ) * 0.5f );
     230                        it->second.text_->setTop ( 1.0f - it->second.panel_->getHeight() - it->second.text_->getCharHeight() );
    200231                    }
    201232                    else
     
    203234                        // Right
    204235                        float position = -pos.y / pos.x + 1.0f;
    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);
     236                        it->second.panel_->setPosition ( 1.0f - it->second.panel_->getWidth(), ( position - it->second.panel_->getHeight() ) * 0.5f );
     237                        it->second.panel_->setUV ( 0.5f, 0.5f, 1.0f, 1.0f );
     238                        it->second.text_->setLeft ( 1.0f - it->second.panel_->getWidth() - textLength - 0.01f );
     239                        it->second.text_->setTop ( ( position - it->second.text_->getCharHeight() ) * 0.5f );
    209240                    }
    210241                }
     
    215246
    216247                // Change material only if outOfView changed
    217                 if (it->second.wasOutOfView_)
     248                if ( it->second.wasOutOfView_ )
    218249                {
    219                     it->second.panel_->setMaterialName("Orxonox/NavTDC");
     250                    it->second.panel_->setMaterialName ( "Orxonox/NavTDC" );
    220251                    it->second.wasOutOfView_ = false;
    221252                }
    222253
    223254                // 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);
     255                it->second.panel_->setUV ( 0.0f, 0.0f, 1.0f, 1.0f );
     256                it->second.panel_->setLeft ( ( pos.x + 1.0f - it->second.panel_->getWidth() ) * 0.5f );
     257                it->second.panel_->setTop ( ( -pos.y + 1.0f - it->second.panel_->getHeight() ) * 0.5f );
    227258
    228259                // 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);
     260                it->second.text_->setLeft ( ( pos.x + 1.0f + it->second.panel_->getWidth() ) * 0.5f );
     261                it->second.text_->setTop ( ( -pos.y + 1.0f + it->second.panel_->getHeight() ) * 0.5f );
    231262            }
    232263
     
    235266            it->second.text_->show();
    236267        }
    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)
     268        else
    252269        {
    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);
     270            it->second.panel_->hide();
     271            it->second.text_->hide();
    257272        }
    258     }
    259 
    260     void HUDNavigation::addObject(RadarViewable* object)
    261     {
    262         if (object == NULL)
     273
     274    }
     275}
     276
     277
     278/** Overridden method of OrxonoxOverlay.
     279@details
     280    Usually the entire overlay scales with scale().
     281    Here we obviously have to adjust this.
     282*/
     283void HUDNavigation::sizeChanged()
     284{
     285    // Use size to compensate for aspect ratio if enabled.
     286    float xScale = this->getActualSize().x;
     287    float yScale = this->getActualSize().y;
     288
     289    for ( ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it )
     290    {
     291        if ( it->second.panel_ != NULL )
     292            it->second.panel_->setDimensions ( navMarkerSize_ * xScale, navMarkerSize_ * yScale );
     293        if ( it->second.text_ != NULL )
     294            it->second.text_->setCharHeight ( it->second.text_->getCharHeight() * yScale );
     295    }
     296}
     297
     298void HUDNavigation::addObject ( RadarViewable* object )
     299{
     300
     301    if ( activeObjectList_.size() >= markerLimit_ )
     302        if ( object == NULL )
    263303            return;
    264304
    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/NavTDC");
    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, false};
    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())
     305    // Don't display our own ship
     306    if ( object == dynamic_cast<RadarViewable*> ( this->getOwner() ) )
     307        return;
     308
     309    // Object hasn't been added yet (we know that)
     310    assert ( this->activeObjectList_.find ( object ) == this->activeObjectList_.end() );
     311
     312    // Scales used for dimensions and text size
     313    float xScale = this->getActualSize().x;
     314    float yScale = this->getActualSize().y;
     315
     316    // Create everything needed to display the object on the radar and add it to the map
     317
     318    // Create arrow/marker
     319    Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*> ( Ogre::OverlayManager::getSingleton()
     320                                       .createOverlayElement ( "Panel", "HUDNavigation_navMarker_" + getUniqueNumberString() ) );
     321    panel->setMaterialName ( "Orxonox/NavTDC" );
     322    panel->setDimensions ( navMarkerSize_ * xScale, navMarkerSize_ * yScale );
     323
     324    Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*> ( Ogre::OverlayManager::getSingleton()
     325                                         .createOverlayElement ( "TextArea", "HUDNavigation_navText_" + getUniqueNumberString() ) );
     326    text->setFontName ( this->fontName_ );
     327    text->setCharHeight ( text->getCharHeight() * yScale );
     328
     329    panel->hide();
     330    text->hide();
     331
     332    ObjectInfo tempStruct = {panel, text, false};
     333    activeObjectList_[object] = tempStruct;
     334
     335    this->background_->addChild ( panel );
     336    this->background_->addChild ( text );
     337
     338    sortedObjectList_.push_front ( std::make_pair ( object, ( unsigned int ) 0 ) );
     339
     340    //TODO: hide elements
     341}
     342
     343void HUDNavigation::removeObject ( RadarViewable* viewable )
     344{
     345
     346    ObjectMap::iterator it = activeObjectList_.find ( viewable );
     347
     348    if ( activeObjectList_.find ( viewable ) != activeObjectList_.end() )
     349    {
     350        // Detach overlays
     351        this->background_->removeChild ( it->second.panel_->getName() );
     352        this->background_->removeChild ( it->second.text_->getName() );
     353        // Properly destroy the overlay elements (do not use delete!)
     354        Ogre::OverlayManager::getSingleton().destroyOverlayElement ( it->second.panel_ );
     355        Ogre::OverlayManager::getSingleton().destroyOverlayElement ( it->second.text_ );
     356        // Remove from the list
     357        activeObjectList_.erase ( viewable );
     358
     359
     360    }
     361
     362
     363    else
     364        COUT ( 2 ) << "Warning, HUDNavigation: Attempting to remove non-existent object" << std::endl;
     365
     366    for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++listIt )
     367    {
     368        if ( (listIt->first) == viewable )
    301369        {
    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);
     370            sortedObjectList_.erase ( listIt );
     371            break;
    310372        }
    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     }
    325 }
     373
     374    }
     375
     376}
     377
     378void HUDNavigation::changedOwner()
     379{
     380    // TODO: Delete old objects?
     381    const std::set<RadarViewable*>& respawnObjects = this->getOwner()->getScene()->getRadar()->getRadarObjects();
     382    for ( std::set<RadarViewable*>::const_iterator it = respawnObjects.begin(); it != respawnObjects.end(); ++it )
     383    {
     384        if ( ! ( *it )->isHumanShip_ )
     385            this->addObject ( *it );
     386    }
     387}
     388}
  • code/branches/presentation3/src/modules/overlays/hud/HUDNavigation.h

    r6942 r6971  
    3535#include <string>
    3636
     37
    3738#include "util/OgreForwardRefs.h"
    3839#include "tools/interfaces/Tickable.h"
     
    4243namespace orxonox
    4344{
    44     class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener
     45class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener
     46{
     47public:
     48    HUDNavigation ( BaseObject* creator );
     49    virtual ~HUDNavigation();
     50
     51    virtual void XMLPort ( Element& xmlElement, XMLPort::Mode mode );
     52    virtual void tick ( float dt );
     53
     54    virtual void addObject ( RadarViewable* object );
     55    virtual void removeObject ( RadarViewable* viewable );
     56    virtual void objectChanged ( RadarViewable* viewable ) {}
     57
     58    virtual void changedOwner();
     59    virtual void sizeChanged();
     60    virtual void angleChanged() { }
     61    virtual void positionChanged() { }
     62    virtual void radarTick ( float dt ) {}
     63
     64    inline float getRadarSensitivity() const
     65    { return 1.0f; }
     66
     67private:
     68    struct ObjectInfo
    4569    {
    46     public:
    47         HUDNavigation(BaseObject* creator);
    48         virtual ~HUDNavigation();
     70        Ogre::PanelOverlayElement* panel_;
     71        Ogre::TextAreaOverlayElement* text_;
     72        bool outOfView_;
     73        bool wasOutOfView_;
    4974
    50         virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
    51         virtual void tick(float dt);
     75    };
    5276
    53         virtual void addObject(RadarViewable* object);
    54         virtual void removeObject(RadarViewable* viewable);
    55         virtual void objectChanged(RadarViewable* viewable) {}
     77    // XMLPort accessors
     78    void setNavMarkerSize ( float size )
     79    { navMarkerSize_ = size; this->sizeChanged(); }
     80    float getNavMarkerSize() const
     81    { return navMarkerSize_; }
    5682
    57         virtual void changedOwner();
    58         virtual void sizeChanged();
    59         virtual void angleChanged() { }
    60         virtual void positionChanged() { }
    61         virtual void radarTick(float dt) {}
     83    void setTextSize ( float size );
     84    float getTextSize() const;
    6285
    63         inline float getRadarSensitivity() const
    64             { return 1.0f; }
     86    void setFont ( const std::string& font );
     87    const std::string& getFont() const;
    6588
    66     private:
    67         struct ObjectInfo
    68         {
    69             Ogre::PanelOverlayElement* panel_;
    70             Ogre::TextAreaOverlayElement* text_;
    71             bool outOfView_;
    72             bool wasOutOfView_;
    73         };
     89    typedef std::map<RadarViewable*, ObjectInfo > ObjectMap;
     90    ObjectMap activeObjectList_;
    7491
    75         // XMLPort accessors
    76         void setNavMarkerSize(float size)
    77             { navMarkerSize_ = size; this->sizeChanged(); }
    78         float getNavMarkerSize() const
    79             { return navMarkerSize_; }
     92    typedef std::list < std::pair<RadarViewable*, unsigned int > > sortedList;
     93    sortedList sortedObjectList_;
    8094
    81         void setTextSize(float size);
    82         float getTextSize() const;
    8395
    84         void setFont(const std::string& font);
    85         const std::string& getFont() const;
     96    float navMarkerSize_;
     97    std::string fontName_;
     98    float textSize_;
    8699
    87         typedef std::map<RadarViewable*, ObjectInfo > ObjectMap;
    88         ObjectMap activeObjectList_;
     100    static const unsigned int markerLimit_ = 5; //TODO: is it possible to set this over the console and/or the IG-Setting
    89101
    90         float navMarkerSize_;
    91         std::string fontName_;
    92         float textSize_;
    93     };
     102
     103};
    94104}
    95105
Note: See TracChangeset for help on using the changeset viewer.