Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 11, 2008, 12:21:42 AM (16 years ago)
Author:
rgrieder
Message:
  • added XML loadable HUD
  • Radar and navi are not yet done
  • explanations follow with when things are finished
File:
1 edited

Legend:

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

    r1580 r1588  
    3232#include <string>
    3333#include <set>
     34#include <assert.h>
    3435#include <OgreOverlay.h>
    3536#include <OgreOverlayContainer.h>
     
    3940#include "core/Debug.h"
    4041#include "core/ConsoleCommand.h"
     42#include "core/CoreIncludes.h"
    4143#include "objects/SpaceShip.h"
    4244#include "objects/WorldEntity.h"
    4345#include "GraphicsEngine.h"
    44 #include "BarOverlayElement.h"
     46#include "HUDBar.h"
    4547#include "RadarObject.h"
    4648#include "RadarOverlayElement.h"
     
    4951namespace orxonox
    5052{
     53    CreateFactory(HUD);
     54
    5155    SetConsoleCommandShortcut(HUD, cycleNavigationFocus).setAccessLevel(AccessLevel::User);
    5256    SetConsoleCommandShortcut(HUD, releaseNavigationFocus).setAccessLevel(AccessLevel::User);
    53     SetConsoleCommandShortcut(HUD, toggleFPS).setAccessLevel(AccessLevel::User);
    54     SetConsoleCommandShortcut(HUD, toggleRenderTime).setAccessLevel(AccessLevel::User);
     57    SetConsoleCommand(HUD, toggleVisibility, false).setAccessLevel(AccessLevel::User);
     58
     59    HUD* HUD::instance_s = 0;
    5560
    5661    using namespace Ogre;
     
    5863    HUD::HUD()
    5964    {
     65        assert(instance_s == 0);
     66        instance_s = this;
     67        RegisterObject(HUD);
     68
     69        // Singleton like in Ogre. Constructor and destructor are public,
     70        // but the assert prevents from having multiple instances.
     71
    6072        orxonoxHUD_ = 0;
    6173        container_ = 0;
     
    7284    HUD::~HUD()
    7385    {
    74         this->destroy();
    75     }
    76 
    77     void HUD::initialise()
    78     {
     86        if (this->isInitialized())
     87        {
     88            if (this->container_)
     89                Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->container_);
     90            this->container_ = 0;
     91            if (this->fpsText_)
     92                Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->fpsText_);
     93            this->fpsText_ = 0;
     94            if (this->rTRText_)
     95                Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->rTRText_);
     96            this->rTRText_ = 0;
     97            if (this->energyBar_)
     98                delete this->energyBar_;
     99            this->energyBar_ = 0;
     100            /*if (this->speedoBar_)
     101                Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->speedoBar_);*/
     102            this->speedoBar_ = 0;
     103            if (this->radar_)
     104                Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->radar_);
     105            this->radar_ = 0;
     106            if (this->orxonoxHUD_)
     107                Ogre::OverlayManager::getSingleton().destroy(this->orxonoxHUD_);
     108            this->orxonoxHUD_ = 0;
     109
     110            if (this->nav_)
     111                delete this->nav_;
     112            this->nav_ = 0;
     113        }
     114
     115        instance_s = 0;
     116    }
     117
     118    void HUD::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     119    {
     120        BaseObject::XMLPort(xmlElement, mode);
     121
    79122        showFPS_ = true;
    80123        showRenderTime_ = true;
    81124
     125        XMLPortObject(HUD, HUDOverlay, "", addHUDElement, getHUDElement, xmlElement, mode, false, true);
     126
    82127        // create Factories
    83         Ogre::OverlayManager::getSingleton().addOverlayElementFactory(&barOverlayElementFactory_);
    84128        Ogre::OverlayManager::getSingleton().addOverlayElementFactory(&radarOverlayElementFactory_);
    85 
    86         // creating text to display fps
    87         fpsText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "fpsText"));
    88         fpsText_->setMetricsMode(Ogre::GMM_PIXELS);
    89         fpsText_->setDimensions(0.001, 0.001);
    90         fpsText_->setPosition(10, 10);
    91         fpsText_->setFontName("Console");
    92         fpsText_->setCharHeight(20);
    93         fpsText_->setCaption("init");
    94         fpsText_->show();
    95 
    96         // creating text to display render time ratio
    97         rTRText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "rTRText"));
    98         rTRText_->setMetricsMode(Ogre::GMM_PIXELS);
    99         rTRText_->setDimensions(0.001, 0.001);
    100         rTRText_->setPosition(10, 30);
    101         rTRText_->setFontName("Console");
    102         rTRText_->setCharHeight(20);
    103         rTRText_->setCaption("init");
    104         rTRText_->show();
    105129
    106130        // set up screen-wide container
     
    111135        container_->setHeight(1.0);
    112136        container_->setMetricsMode(Ogre::GMM_RELATIVE);
    113         container_->addChild(fpsText_);
    114         container_->addChild(rTRText_);
    115         container_->show();
    116137
    117138        orxonoxHUD_ = Ogre::OverlayManager::getSingleton().create("Orxonox/HUD");
    118139        orxonoxHUD_->add2D(container_);
    119         orxonoxHUD_->show();
    120 
    121         // create energy bar
    122         energyBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "energyBar"));
    123         energyBar_->init(0.01, 0.94, 0.4, container_);
    124         energyBar_->setValue(1);
    125         energyBar_->show();
    126 
    127         // create speedo bar
    128         speedoBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "speedoBar"));
    129         speedoBar_->init(0.01, 0.90, 0.4, container_);
    130         speedoBar_->addColour(0.7, ColourValue(0.2, 0.7, 0.2));
    131         speedoBar_->addColour(0.4, ColourValue(0.7, 0.5, 0.2));
    132         speedoBar_->addColour(0.1, ColourValue(0.7, 0.2, 0.2));
    133         speedoBar_->show();
    134140
    135141        // create radar
    136142        radar_ = static_cast<RadarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Radar", "radar"));
    137143        radar_->init(0.5, 0.9, 0.2, container_);
    138         radar_->show();
    139144
    140145        // create Navigation
     
    154159        object->setPosition(10000.0,16000.0,0.0);
    155160        addRadarObject(object);
    156     }
    157 
    158     void HUD::destroy()
    159     {
    160         if (this->container_)
    161           Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->container_);
    162         this->container_ = 0;
    163         if (this->fpsText_)
    164             Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->fpsText_);
    165         this->fpsText_ = 0;
    166         if (this->rTRText_)
    167             Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->rTRText_);
    168         this->rTRText_ = 0;
    169         if (this->energyBar_)
    170             Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->energyBar_);
    171         this->energyBar_ = 0;
    172         if (this->speedoBar_)
    173             Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->speedoBar_);
    174         this->speedoBar_ = 0;
    175         if (this->radar_)
    176             Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->radar_);
    177         this->radar_ = 0;
    178         if (this->orxonoxHUD_)
    179             Ogre::OverlayManager::getSingleton().destroy(this->orxonoxHUD_);
    180         this->orxonoxHUD_ = 0;
    181 
    182         if (this->nav_)
    183             delete this->nav_;
    184         this->nav_ = 0;
     161
     162        orxonoxHUD_->show();
     163    }
     164
     165    void HUD::addHUDElement(HUDOverlay* element)
     166    {
     167        if (hudElements_.find(element->getName()) != hudElements_.end())
     168        {
     169          COUT(1) << "Ambiguous names encountered while load the HUD overlays" << std::endl;
     170        }
     171        else
     172          hudElements_[element->getName()] = element;
     173    }
     174
     175    HUDOverlay* HUD::getHUDElement(unsigned int index)
     176    {
     177        if (index < this->hudElements_.size())
     178        {
     179          std::map<std::string, HUDOverlay*>::const_iterator it = hudElements_.begin();
     180          for (unsigned int i = 0; i != index; ++it, ++i)
     181            ;
     182          return (*it).second;
     183        }
     184        else
     185            return 0;
    185186    }
    186187
    187188    void HUD::tick(float dt)
    188189    {
    189         if(!SpaceShip::getLocalShip())
    190           return;
    191 
    192         float v = SpaceShip::getLocalShip()->getVelocity().length();
    193         float vmax = SpaceShip::getLocalShip()->getMaxSpeed();
    194         speedoBar_->setValue(v/vmax);
    195 
    196190        radar_->update();
    197191        nav_->update();
    198 
    199         setFPS();
    200192    }
    201193
    202194    void HUD::resize()
    203195    {
    204         this->speedoBar_->resize();
    205         this->energyBar_->resize();
    206196        this->radar_->resize();
    207     }
    208 
    209     void HUD::setRenderTimeRatio(float ratio)
    210     {
    211         if(showRenderTime_){
    212             rTRText_->setCaption("Render time ratio: " + Ogre::StringConverter::toString(ratio));
    213         }
    214         else{
    215             rTRText_->setCaption("");
    216             return;
    217         }
    218     }
    219 
    220     void HUD::setFPS(){
    221         if(showFPS_){
    222             float fps = GraphicsEngine::getSingleton().getAverageFPS();
    223             fpsText_->setCaption("FPS: " + Ogre::StringConverter::toString(fps));
    224         }
    225         else{
    226             fpsText_->setCaption("");
    227             return;
    228         }
    229197    }
    230198
     
    257225    }
    258226
    259     /*static*/ HUD& HUD::getSingleton(){
    260         static HUD theInstance;
    261         return theInstance;
     227    /*static*/ HUD& HUD::getSingleton()
     228    {
     229        assert(instance_s);
     230        return *instance_s;
     231    }
     232
     233    /*static*/ void HUD::toggleVisibility(const std::string& name)
     234    {
     235        if (HUD::getSingleton().hudElements_.find(name) != HUD::getSingleton().hudElements_.end())
     236        {
     237            HUD::getSingleton().hudElements_[name]->setVisibility(!HUD::getSingleton().hudElements_[name]->isVisible());
     238        }
    262239    }
    263240
     
    273250        HUD::getSingleton().nav_->releaseFocus();
    274251    }
    275 
    276     /*static*/ void HUD::toggleFPS(){
    277         HUD::getSingleton().showFPS_ = !HUD::getSingleton().showFPS_;
    278     }
    279 
    280     /*static*/ void HUD::toggleRenderTime(){
    281         HUD::getSingleton().showRenderTime_ = !HUD::getSingleton().showRenderTime_;
    282     }
    283252}
Note: See TracChangeset for help on using the changeset viewer.