Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 1568 for code/trunk


Ignore:
Timestamp:
Jun 8, 2008, 11:34:55 PM (17 years ago)
Author:
landauf
Message:
  • BarOverlayElement interpolates between given colours
  • Tried to fix a bug when releasing navigation focus
Location:
code/trunk/src/orxonox/hud
Files:
5 edited

Legend:

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

    r1564 r1568  
    2424 *   Co-authors:
    2525 *      Felix Schulthess
     26 *      Fabian 'x3n' Landau
    2627 *
    2728 */
     
    2930#include "OrxonoxStableHeaders.h"
    3031#include "BarOverlayElement.h"
     32
    3133#include <OgreOverlayManager.h>
     34#include <OgreMaterialManager.h>
     35#include <OgreTechnique.h>
     36
    3237#include "GraphicsEngine.h"
    33 #include "util/Math.h"
     38#include "util/Convert.h"
    3439
    3540namespace orxonox
     
    3742    using namespace Ogre;
    3843
     44    unsigned int BarOverlayElement::materialcount_s = 0;
     45
    3946    BarOverlayElement::BarOverlayElement(const String& name) : PanelOverlayElement(name)
    4047    {
    41         name_ = name;
    42         widthratio_ = 100.0f / 800.0f; // calculates the ratio (backgroundwidth - barwidth) / backgroundwidth
     48        this->textureUnitState_ = 0;
     49        this->name_ = name;
     50        this->widthratio_ = 100.0f / 800.0f; // calculates the ratio (backgroundwidth - barwidth) / backgroundwidth
    4351    }
    4452
     
    4856    }
    4957
    50     void BarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, OverlayContainer* container){
     58    void BarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, OverlayContainer* container)
     59    {
    5160        // init some values...
    52         value_ = 0;
    53         colour_ = 2;
    54         autoColour_ = true;
    55         right2Left_ = false; // default is left to right progress
    56         leftRel_ = leftRel;
    57         topRel_ = topRel;
    58         dimRel_ = dimRel;
     61        this->value_ = -1;
     62        this->autoColour_ = true;
     63        this->right2Left_ = false; // default is left to right progress
     64        this->leftRel_ = leftRel;
     65        this->topRel_ = topRel;
     66        this->dimRel_ = dimRel;
    5967
    6068        // create background...
    61         background_ = static_cast<OverlayContainer*>(OverlayManager::getSingleton().createOverlayElement("Panel", name_+"container"));
    62         background_->show();
     69        this->background_ = static_cast<OverlayContainer*>(OverlayManager::getSingleton().createOverlayElement("Panel", name_+"container"));
     70        this->background_->show();
    6371        container->addChild(background_);
    64         background_->setMetricsMode(GMM_PIXELS);
    65         background_->setMaterialName("Orxonox/BarBackground");
     72        this->background_->setMetricsMode(GMM_PIXELS);
     73        this->background_->setMaterialName("Orxonox/BarBackground");
    6674
    6775        // calculate absolute coordinates...
    68         resize();
     76        this->resize();
     77        this->show();
    6978
    70         show();
    71         setMetricsMode(GMM_PIXELS);
    72         setMaterialName("Orxonox/Green");
    73         background_->addChild(this);
     79        // create new material
     80        std::string materialname = "barmaterial" + getConvertedValue<unsigned int, std::string>(BarOverlayElement::materialcount_s++);
     81        Ogre::MaterialPtr material = (Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton().create(materialname, "General");
     82        material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
     83        this->textureUnitState_ = material->getTechnique(0)->getPass(0)->createTextureUnitState();
     84        this->textureUnitState_->setTextureName("bar2.tga");
     85        // use the default colour
     86        this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, ColourValue(0.2, 0.7, 0.2));
     87        this->setMaterialName(materialname);
     88        this->setMetricsMode(GMM_PIXELS);
     89
     90        this->background_->addChild(this);
    7491    }
    7592
    76     void BarOverlayElement::resize(){
     93    void BarOverlayElement::resize()
     94    {
    7795        // calculate new absolute coordinates...
    78         left_ = (int) (leftRel_ * GraphicsEngine::getSingleton().getWindowWidth());
    79         top_ = (int) (topRel_ * GraphicsEngine::getSingleton().getWindowHeight());
    80         width_ = (int) (dimRel_ * GraphicsEngine::getSingleton().getWindowWidth());
    81         height_ = (int) (0.1 * width_); // the texture has dimensions height:length = 1:10
    82         offset_ = (int) (width_ * widthratio_ * 0.5);
    83         barwidth_ = (int) (width_ * (1.0f - widthratio_));
     96        this->left_ = (int) (this->leftRel_ * GraphicsEngine::getSingleton().getWindowWidth());
     97        this->top_ = (int) (this->topRel_ * GraphicsEngine::getSingleton().getWindowHeight());
     98        this->width_ = (int) (this->dimRel_ * GraphicsEngine::getSingleton().getWindowWidth());
     99        this->height_ = (int) (0.1 * this->width_);     // the texture has dimensions height:length = 1:10
     100        this->offset_ = (int) (this->width_ * this->widthratio_ * 0.5);
     101        this->barwidth_ = (int) (this->width_ * (1.0f - this->widthratio_));
    84102
    85103        // adapt background
    86         background_->setPosition(left_, top_);
    87         background_->setDimensions(width_, height_);
     104        this->background_->setPosition(this->left_, this->top_);
     105        this->background_->setDimensions(this->width_,this-> height_);
    88106        // adapt bar
    89         setValue(value_);
     107        this->setValue(this->value_);
    90108    }
    91109
    92     void BarOverlayElement::setValue(float value){
    93         value_ = clamp<float>(value, 0, 1);
    94         // set colour, if nescessary
    95         if(autoColour_){
    96             if (value_>0.5) {setColour(BarOverlayElement::GREEN);}
    97             else if (value_>0.25) {setColour(BarOverlayElement::YELLOW);}
    98             else setColour(BarOverlayElement::RED);
     110    void BarOverlayElement::setValue(float value)
     111    {
     112        if (value == this->value_)
     113            return;
     114
     115        this->value_ = clamp<float>(value, 0, 1);
     116        if (this->autoColour_ && this->textureUnitState_)
     117        {
     118            // set colour
     119            if (this->colours_.size() > 0)
     120            {
     121                ColourValue colour1, colour2 = (*this->colours_.rbegin()).second;
     122                float value1, value2 = (*this->colours_.rbegin()).first;
     123                for (std::map<float, ColourValue>::reverse_iterator it = this->colours_.rbegin(); it != this->colours_.rend(); ++it)
     124                {
     125                    colour1 = colour2;
     126                    value1 = value2;
     127                    colour2 = (*it).second;
     128                    value2 = (*it).first;
     129
     130                    if (value2 < this->value_)
     131                        break;
     132                }
     133
     134                if (value2 > this->value_)
     135                {
     136                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour2);
     137                }
     138                else if (value1 < this->value_)
     139                {
     140                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour1);
     141                }
     142                else
     143                {
     144                    //float interpolationfactor = (this->value_ - value2) / (value1 - value2);
     145                    float interpolationfactor = interpolateSmooth((this->value_ - value2) / (value1 - value2), 0.0f, 1.0f);
     146                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour1 * interpolationfactor + colour2 * (1 - interpolationfactor));
     147                }
     148            }
    99149        }
    100150
    101151        // set value
    102         if(right2Left_){ // backward case
    103             setPosition(offset_ + barwidth_ * (1 - value_), 0);
    104             setDimensions(barwidth_ * value_, height_);
    105         }else{          // default case
    106             setPosition(offset_, 0);
    107             setDimensions(barwidth_ * value_, height_);
     152        if (this->right2Left_)
     153        {
     154            // backward case
     155            this->setPosition(this->offset_ + this->barwidth_ * (1 - this->value_), 0);
     156            this->setDimensions(this->barwidth_ * this->value_, this->height_);
    108157        }
    109         if(value_ != 0) setTiling(value_, 1.0);
     158        else
     159        {
     160            // default case
     161            this->setPosition(this->offset_, 0);
     162            this->setDimensions(this->barwidth_ * this->value_, this->height_);
     163        }
     164        if (this->value_ != 0)
     165            this->setTiling(this->value_, 1.0);
    110166    }
    111167
    112     void BarOverlayElement::setColour(int colour){
    113         colour_ = colour;
    114         switch(colour){
    115         case 0:
    116             setMaterialName("Orxonox/Red");
    117             break;
    118         case 1:
    119             setMaterialName("Orxonox/Yellow");
    120             break;
    121         case 2:
    122             setMaterialName("Orxonox/Green");
    123         }
     168    void BarOverlayElement::addColour(float value, const ColourValue& colour)
     169    {
     170        value = clamp<float>(value, 0, 1);
     171        this->colours_[value] = colour;
     172    }
     173
     174    void BarOverlayElement::clearColours()
     175    {
     176        this->colours_.clear();
    124177    }
    125178}
  • code/trunk/src/orxonox/hud/BarOverlayElement.h

    r1564 r1568  
    2424 *   Co-authors:
    2525 *      Felix Schulthess
     26 *      Fabian 'x3n' Landau
    2627 *
    2728 */
     
    3233#include "OrxonoxPrereqs.h"
    3334
     35#include <map>
     36
    3437#include <OgrePrerequisites.h>
    3538#include <OgrePanelOverlayElement.h>
     39
     40#include "util/Math.h"
    3641
    3742namespace orxonox
     
    4651      void resize();
    4752      void setValue(float value);
    48       void setColour(int colour);
     53      void addColour(float value, const ColourValue& colour);
     54      void clearColours();
    4955
    5056      inline void setRightToLeft(bool r2l)
     
    5460      inline float getValue() const
    5561        { return this->value_; }
    56       inline int getBarColour() const
    57         { return this->colour_; }
    5862
    5963    private:
    60       static const int RED = 0;           // predefined colours
    61       static const int YELLOW = 1;
    62       static const int GREEN = 2;
    63 
     64      static unsigned int materialcount_s;
    6465      bool right2Left_;
    6566      bool autoColour_;                   // whether bar changes colour automatically
    6667      float value_;                       // progress of bar
    67       int colour_;
    6868      int left_;
    6969      int top_;
     
    7878      Ogre::OverlayContainer* background_;
    7979      Ogre::String name_;
     80      Ogre::TextureUnitState* textureUnitState_;
     81      std::map<float, ColourValue> colours_;
    8082    };
    8183}
  • code/trunk/src/orxonox/hud/HUD.cc

    r1567 r1568  
    6666        radar_ = 0;
    6767        nav_ = 0;
    68         bool showFPS_ = true;
    69         bool showRenderTime_ = true;
     68        showFPS_ = true;
     69        showRenderTime_ = true;
    7070    }
    7171
     
    8484        Ogre::OverlayManager::getSingleton().addOverlayElementFactory(&radarOverlayElementFactory_);
    8585
    86         orxonoxHUD_ = Ogre::OverlayManager::getSingleton().create("Orxonox/HUD");
    87         container_ = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "Orxonox/HUD/container"));
    88 
    8986        // creating text to display fps
    9087        fpsText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "fpsText"));
    91         fpsText_->show();
    9288        fpsText_->setMetricsMode(Ogre::GMM_PIXELS);
    9389        fpsText_->setDimensions(0.001, 0.001);
     
    9692        fpsText_->setCharHeight(20);
    9793        fpsText_->setCaption("init");
     94        fpsText_->show();
    9895
    9996        // creating text to display render time ratio
    10097        rTRText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "rTRText"));
    101         rTRText_->show();
    10298        rTRText_->setMetricsMode(Ogre::GMM_PIXELS);
    10399        rTRText_->setDimensions(0.001, 0.001);
     
    106102        rTRText_->setCharHeight(20);
    107103        rTRText_->setCaption("init");
    108 
    109         // create energy bar
    110         energyBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "energyBar"));
    111         energyBar_->show();
    112         // create speedo bar
    113         speedoBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "speedoBar"));
    114         speedoBar_->show();
    115         // create radar
    116         radar_ = static_cast<RadarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Radar", "radar"));
    117         radar_->show();
    118 
    119         // create Navigation
    120         nav_ = new Navigation(container_);
     104        rTRText_->show();
    121105
    122106        // set up screen-wide container
    123         container_->show();
    124 
    125         orxonoxHUD_->add2D(container_);
    126         orxonoxHUD_->show();
     107        container_ = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "Orxonox/HUD/container"));
    127108        container_->setLeft(0.0);
    128109        container_->setTop(0.0);
     
    132113        container_->addChild(fpsText_);
    133114        container_->addChild(rTRText_);
    134 
     115        container_->show();
     116
     117        orxonoxHUD_ = Ogre::OverlayManager::getSingleton().create("Orxonox/HUD");
     118        orxonoxHUD_->add2D(container_);
     119        orxonoxHUD_->show();
     120
     121        // create energy bar
     122        energyBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "energyBar"));
    135123        energyBar_->init(0.01, 0.94, 0.4, container_);
    136124        energyBar_->setValue(1);
    137 
     125        energyBar_->show();
     126
     127        // create speedo bar
     128        speedoBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "speedoBar"));
    138129        speedoBar_->init(0.01, 0.90, 0.4, container_);
    139 
     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();
     134
     135        // create radar
     136        radar_ = static_cast<RadarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Radar", "radar"));
    140137        radar_->init(0.5, 0.9, 0.2, container_);
     138        radar_->show();
     139
     140        // create Navigation
     141        nav_ = new Navigation(container_);
    141142
    142143        WorldEntity* object;
     
    247248            {
    248249                if (this->nav_->getFocus() == (*it))
    249                     this->nav_->setFocus(0);
     250                    this->nav_->releaseFocus();
    250251
    251252                delete (*it);
     
    270271
    271272    /*static*/ void HUD::releaseNavigationFocus(){
    272         HUD::getSingleton().nav_->setFocus(0);
     273        HUD::getSingleton().nav_->releaseFocus();
    273274    }
    274275
  • code/trunk/src/orxonox/hud/Navigation.cc

    r1566 r1568  
    282282    }
    283283
     284    void Navigation::releaseFocus()
     285    {
     286        this->focus_ = 0;
     287        this->it_ = HUD::getSingleton().getRadarObjects().end();
     288        this->updateFocus();
     289    }
     290
    284291    float Navigation::getDist2Focus() const {
    285292        if(focus_ == NULL) return(0.0);
  • code/trunk/src/orxonox/hud/Navigation.h

    r1564 r1568  
    5151        inline RadarObject* getFocus() const
    5252            { return this->focus_; }
    53         inline void setFocus(RadarObject* object)
    54             { this->focus_ = object; this->updateFocus(); }
     53        void releaseFocus();
    5554
    5655      private:
Note: See TracChangeset for help on using the changeset viewer.