Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ggz/src/orxonox/overlays/hud/HUDBar.cc @ 4032

Last change on this file since 4032 was 2710, checked in by rgrieder, 16 years ago

Merged buildsystem3 containing buildsystem2 containing Adi's buildsystem branch back to the trunk.
Please update the media directory if you were not using buildsystem3 before.

  • Property svn:eol-style set to native
File size: 7.1 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 "OrxonoxStableHeaders.h"
32#include "HUDBar.h"
33
34#include <OgreOverlayManager.h>
35#include <OgreMaterialManager.h>
36#include <OgreTechnique.h>
37#include <OgrePanelOverlayElement.h>
38
39#include "util/Convert.h"
40#include "util/String.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" + getConvertedValue<unsigned int, std::string>(materialcount_s++);
75        Ogre::MaterialPtr material = (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.2, 0.7, 0.2));
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            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->bar_);
99    }
100
101    void HUDBar::XMLPort(Element& xmlElement, XMLPort::Mode mode)
102    {
103        SUPER(HUDBar, XMLPort, xmlElement, mode);
104
105        XMLPortParam(HUDBar, "initialvalue", setValue,       getValue,       xmlElement, mode);
106        XMLPortParam(HUDBar, "righttoleft",  setRightToLeft, getRightToLeft, xmlElement, mode);
107        XMLPortParam(HUDBar, "autocolour",   setAutoColour,  getAutoColour,  xmlElement, mode);
108        XMLPortParam(HUDBar, "bartexture",   setBarTexture,  getBarTexture, xmlElement, mode);
109        XMLPortObject(HUDBar, BarColour, "", addColour, getColour, xmlElement, mode);
110    }
111
112    void HUDBar::valueChanged()
113    {
114        if (this->autoColour_ && this->textureUnitState_)
115        {
116            // set colour
117            if (this->colours_.size() > 0)
118            {
119                ColourValue colour1(0, 0, 0, 1);
120                ColourValue colour2 = (*this->colours_.rbegin()).second;
121                float value1(0);
122                float 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                    this->currentColour_ = colour2;
138                }
139                else if (value1 < this->value_)
140                {
141                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour1);
142                    this->currentColour_ = colour1;
143                }
144                else
145                {
146                    //float interpolationfactor = (this->value_ - value2) / (value1 - value2);
147                    float interpolationfactor = interpolateSmooth((this->value_ - value2) / (value1 - value2), 0.0f, 1.0f);
148                    this->currentColour_ = colour1 * interpolationfactor + colour2 * (1 - interpolationfactor);
149                    this->textureUnitState_->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, this->currentColour_);
150
151                }
152            }
153        }
154
155        // set value
156        if (this->right2Left_)
157        {
158            // backward casew
159            this->bar_->setPosition(0.06f + 0.88f * (1 - this->value_), 0.0f);
160            this->bar_->setDimensions(0.88f * this->value_, 1.0f);
161        }
162        else
163        {
164            // default case
165            this->bar_->setPosition(0.06f, 0.0f);
166            this->bar_->setDimensions(0.88f * this->value_, 1.0f);
167        }
168        if (this->value_ != 0)
169            this->bar_->setTiling(this->value_, 1.0);
170    }
171
172    void HUDBar::addColour(BarColour* colour)
173    {
174        float value = clamp<float>(colour->getPosition(), 0.0, 1.0);
175        this->colours_[value] = colour->getColour();
176
177        this->barColours_.push_back(colour);
178    }
179
180    BarColour* HUDBar::getColour(unsigned int index)
181    {
182        if (index < this->barColours_.size())
183            return barColours_[index];
184        else
185            return 0;
186    }
187
188    void HUDBar::clearColours()
189    {
190        this->colours_.clear();
191    }
192
193    void HUDBar::setBarTexture(const std::string& texture)
194    {
195        this->textureUnitState_->setTextureName(texture);
196    }
197
198    const std::string& HUDBar::getBarTexture() const
199    {
200        return this->textureUnitState_->getTextureName();
201    }
202}
Note: See TracBrowser for help on using the repository browser.