Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core5/src/modules/overlays/hud/HUDBar.cc @ 5920

Last change on this file since 5920 was 5856, checked in by rgrieder, 15 years ago

Convinced HUDBar to destroy its BarColours (as they grow with each player death otherwise).

  • Property svn:eol-style set to native
File size: 7.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Yuning Chai
24 *   Co-authors:
25 *      Felix Schulthess
26 *      Fabian 'x3n' Landau
27 *      Reto Grieder
28 *
29 */
30
31#include "HUDBar.h"
32
33#include <OgreOverlayManager.h>
34#include <OgreMaterialManager.h>
35#include <OgreTechnique.h>
36#include <OgrePass.h>
37#include <OgrePanelOverlayElement.h>
38
39#include "util/Convert.h"
40#include "util/StringUtils.h"
41#include "core/CoreIncludes.h"
42#include "core/XMLPort.h"
43
44namespace orxonox
45{
46    CreateFactory(BarColour);
47
48    BarColour::BarColour(BaseObject* creator)
49        : BaseObject(creator)
50    {
51        RegisterObject(BarColour);
52
53        this->setColour(ColourValue(1.0, 1.0, 1.0, 1.0));
54        this->setPosition(0.0);
55    }
56
57    void BarColour::XMLPort(Element& xmlElement, XMLPort::Mode mode)
58    {
59        SUPER(BarColour, XMLPort, xmlElement, mode);
60
61        XMLPortParam(BarColour, "colour", setColour, getColour, xmlElement, mode);
62        XMLPortParam(BarColour, "position", setPosition, getPosition, xmlElement, mode);
63    }
64
65
66    unsigned int HUDBar::materialcount_s = 0;
67
68    HUDBar::HUDBar(BaseObject* creator)
69        : OrxonoxOverlay(creator)
70    {
71        RegisterObject(HUDBar);
72
73        // create new material
74        std::string materialname = "barmaterial" + multi_cast<std::string>(materialcount_s++);
75        Ogre::MaterialPtr material = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton().create(materialname, "General"));
76        material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
77        this->textureUnitState_ = material->getTechnique(0)->getPass(0)->createTextureUnitState();
78        this->textureUnitState_->setTextureName("bar2.tga");
79        // use the default colour
80        this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, ColourValue(0.2f, 0.7f, 0.2f));
81
82        this->bar_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
83            .createOverlayElement("Panel", "HUDBar_bar_" + getUniqueNumberString()));
84        this->bar_->setMaterialName(materialname);
85
86        this->value_ = 1.0f;  // initielize with 1.0f to trigger a change when calling setValue(0.0f) on the line below
87        this->setValue(0.0f); // <--
88        this->setRightToLeft(false);
89        this->setAutoColour(true);
90        this->currentColour_ = ColourValue::White;
91
92        this->background_->addChild(bar_);
93    }
94
95    HUDBar::~HUDBar()
96    {
97        if (this->isInitialized())
98        {
99            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->bar_);
100            for (std::vector<BarColour*>::const_iterator it = this->barColours_.begin(); it != this->barColours_.end(); )
101                (*it++)->destroy();
102        }
103    }
104
105    void HUDBar::XMLPort(Element& xmlElement, XMLPort::Mode mode)
106    {
107        SUPER(HUDBar, XMLPort, xmlElement, mode);
108
109        XMLPortParam(HUDBar, "initialvalue", setValue,       getValue,       xmlElement, mode);
110        XMLPortParam(HUDBar, "righttoleft",  setRightToLeft, getRightToLeft, xmlElement, mode);
111        XMLPortParam(HUDBar, "autocolour",   setAutoColour,  getAutoColour,  xmlElement, mode);
112        XMLPortParam(HUDBar, "bartexture",   setBarTexture,  getBarTexture, xmlElement, mode);
113        XMLPortObject(HUDBar, BarColour, "", addColour, getColour, xmlElement, mode);
114    }
115
116    void HUDBar::valueChanged()
117    {
118        if (this->autoColour_ && this->textureUnitState_)
119        {
120            // set colour
121            if (this->colours_.size() > 0)
122            {
123                ColourValue colour1(0, 0, 0, 1);
124                ColourValue colour2 = (*this->colours_.rbegin()).second;
125                float value1(0);
126                float value2 = (*this->colours_.rbegin()).first;
127                for (std::map<float, ColourValue>::reverse_iterator it = this->colours_.rbegin(); it != this->colours_.rend(); ++it)
128                {
129                    colour1 = colour2;
130                    value1 = value2;
131                    colour2 = (*it).second;
132                    value2 = (*it).first;
133
134                    if (value2 < this->value_)
135                        break;
136                }
137
138                if (value2 > this->value_)
139                {
140                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour2);
141                    this->currentColour_ = colour2;
142                }
143                else if (value1 < this->value_)
144                {
145                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour1);
146                    this->currentColour_ = colour1;
147                }
148                else
149                {
150                    //float interpolationfactor = (this->value_ - value2) / (value1 - value2);
151                    float interpolationfactor = interpolateSmooth((this->value_ - value2) / (value1 - value2), 0.0f, 1.0f);
152                    this->currentColour_ = colour1 * interpolationfactor + colour2 * (1 - interpolationfactor);
153                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, this->currentColour_);
154
155                }
156            }
157        }
158
159        // set value
160        if (this->right2Left_)
161        {
162            // backward casew
163            this->bar_->setPosition(0.06f + 0.88f * (1 - this->value_), 0.0f);
164            this->bar_->setDimensions(0.88f * this->value_, 1.0f);
165        }
166        else
167        {
168            // default case
169            this->bar_->setPosition(0.06f, 0.0f);
170            this->bar_->setDimensions(0.88f * this->value_, 1.0f);
171        }
172        if (this->value_ != 0)
173            this->bar_->setTiling(this->value_, 1.0);
174    }
175
176    void HUDBar::addColour(BarColour* colour)
177    {
178        float value = clamp<float>(colour->getPosition(), 0.0, 1.0);
179        this->colours_[value] = colour->getColour();
180
181        this->barColours_.push_back(colour);
182    }
183
184    BarColour* HUDBar::getColour(unsigned int index)
185    {
186        if (index < this->barColours_.size())
187            return barColours_[index];
188        else
189            return 0;
190    }
191
192    void HUDBar::clearColours()
193    {
194        this->colours_.clear();
195    }
196
197    void HUDBar::setBarTexture(const std::string& texture)
198    {
199        this->textureUnitState_->setTextureName(texture);
200    }
201
202    const std::string& HUDBar::getBarTexture() const
203    {
204        return this->textureUnitState_->getTextureName();
205    }
206}
Note: See TracBrowser for help on using the repository browser.