Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/overlays/hud/HUDWeaponMode.cc @ 11796

Last change on this file since 11796 was 11071, checked in by landauf, 9 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 10.0 KB
RevLine 
[10688]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:
[10724]23 *      Fabien Vultier
[10688]24 *   Co-authors:
[10724]25 *      ...
[10688]26 *
27 */
28
29#include "HUDWeaponMode.h"
30
[11071]31#include "util/Convert.h"
32#include "util/StringUtils.h"
[10688]33#include "core/CoreIncludes.h"
[10724]34#include "core/class/Super.h"
[10688]35
36namespace orxonox
37{
38    RegisterClass(HUDWeaponMode);
39
40    HUDWeaponMode::HUDWeaponMode(Context* context) : OrxonoxOverlay(context)
41    {
42        RegisterObject(HUDWeaponMode);
43
[10721]44        weaponIndex_ = 0;
45        weaponModeIndex_ = 0;
46
[10688]47        overlayElementIcon_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
48        overlayElementIcon_->setPosition(0.0f,0.0f);
49        overlayElementIcon_->setDimensions(1.0f,1.0f);
50        this->background_->addChild(overlayElementIcon_);
51
52        overlayElementReplenish_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
53        overlayElementReplenish_->setPosition(0.0f,0.0f);
54        overlayElementReplenish_->setDimensions(1.0f,1.0f);
55        this->background_->addChild(overlayElementReplenish_);
56
57        overlayElementMunition_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
58        overlayElementMunition_->setPosition(0.0f,0.0f);
59        overlayElementMunition_->setDimensions(1.0f,1.0f);
60        this->background_->addChild(overlayElementMunition_);
61
62        overlayElementState_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
63        overlayElementState_->setPosition(0.0f,0.0f);
64        overlayElementState_->setDimensions(1.0f,1.0f);
65        this->background_->addChild(overlayElementState_);
66
67        overlayElementIcon_->show();
68        overlayElementReplenish_->show();
69        overlayElementMunition_->show();
70        overlayElementState_->show();
71
72        // Create two text overlays
73        this->textOverlayLeft_ = new OverlayText(this->getContext());
74        assert(this->textOverlayLeft_.get());
[10791]75        this->textOverlayLeft_->setCaption("?");
[10688]76        textOverlayLeft_->setPickPoint(Vector2(0.0f,0.0f));
77        textOverlayLeft_->setVisible(true);
[11071]78        textOverlayLeft_->setAlignment(OverlayText::Alignment::Center);
[10688]79        textOverlayLeft_->setTextSize(0.02f);
80        textOverlayLeft_->setColour(ColourValue(0.21,0.70,0.21,1.0));
[10721]81        textOverlayLeft_->setAspectCorrection(false);
[10724]82        textOverlayLeft_->setZOrder(600);
[10688]83       
84        this->textOverlayRight_ = new OverlayText(this->getContext());
[10791]85        assert(this->textOverlayRight_.get());
86        this->textOverlayRight_->setCaption("?");
[10688]87        textOverlayRight_->setPickPoint(Vector2(0.0f,0.0f));
88        textOverlayRight_->setVisible(true);
[11071]89        textOverlayRight_->setAlignment(OverlayText::Alignment::Center);
[10688]90        textOverlayRight_->setTextSize(0.02f);
91        textOverlayRight_->setColour(ColourValue(0.21,0.70,0.21,1.0));
[10721]92        textOverlayRight_->setAspectCorrection(false);
[10724]93        textOverlayRight_->setZOrder(600);
[10688]94
[10794]95        materialNameState_ = "";
[10688]96
97        overlayElementReplenish_->setMaterialName("Orxonox/WSHUD_Replenish");
98    }
99
100    HUDWeaponMode::~HUDWeaponMode()
101    {
102        if (this->isInitialized())
103        {
[10739]104            this->textOverlayLeft_->destroy();
105            this->textOverlayRight_->destroy();
[10688]106        }
107    }
108
109    void HUDWeaponMode::tick(float dt)
110    {
111        SUPER(HUDWeaponMode, tick, dt);
112
113        if (this->owner_ && this->weaponMode_)
114        {
115            std::string lastMaterialNameState = materialNameState_;
116
117            if (weaponMode_->getReloading())
118            {
119                materialNameState_ = "Orxonox/WSHUD_Reloading";
120            }
121            else
122            {
123                materialNameState_ = "Orxonox/WSHUD_Ready";
124            }           
125
126            Munition* munition = this->weaponMode_->getMunition();
127
[11071]128            if (munition != nullptr)
[10688]129            {
[11071]130                MunitionDeployment deployment = munition->getMunitionDeployment();
[10688]131
[10724]132                if (deployment == MunitionDeployment::Share)
[10688]133                {
134                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunitionInCurrentMagazine(weaponMode_)));
135                    this->textOverlayRight_->setCaption(multi_cast<std::string>(munition->getNumMagazines()));
136                }
[10724]137                else if (deployment == MunitionDeployment::Stack)
[10688]138                {
139                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunition(weaponMode_)));
140                    this->textOverlayRight_->setCaption("");
141                }
[10724]142                else if (deployment == MunitionDeployment::Separate)
[10688]143                {
144                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunitionInCurrentMagazine(weaponMode_)));
145                    this->textOverlayRight_->setCaption(multi_cast<std::string>(munition->getNumMagazines()));
146                }
147
148                if (munition->getNumMunition(weaponMode_) == 0)
149                {
150                    materialNameState_ = "Orxonox/WSHUD_Empty";
151                }
152
[10791]153                if (munition->isA(Class(ReplenishingMunition)))
154                {
155                    ReplenishingMunition* replenishingMunition = dynamic_cast<ReplenishingMunition*>(munition);
[10688]156
[10878]157                    if (replenishingMunition->canAddMagazines(1))
[10791]158                    {
159                        float progress = 1.0f - replenishingMunition->getProgress();
160                        overlayElementReplenish_->setDimensions(1.0f,progress);                   
161                    }
162                    else
163                    {
164                        overlayElementReplenish_->setDimensions(1.0f,1.0f);
165                    }
[10688]166                }
167            }
168
169            if (materialNameState_ != lastMaterialNameState)
170            {
171                overlayElementState_->setMaterialName(materialNameState_);
172            }
173        }
174    }   
175
176    void HUDWeaponMode::positionChanged()
177    {
178        OrxonoxOverlay::positionChanged();
179
180        positionHUDChilds();
[10721]181    }
[10688]182
[10721]183    void HUDWeaponMode::sizeChanged()
184    {
185        OrxonoxOverlay::sizeChanged();
186
187        positionHUDChilds();
188    }
189
[10688]190    void HUDWeaponMode::changedOwner()
191    {
192        SUPER(HUDWeaponMode, changedOwner);
193
194        this->owner_ = orxonox_cast<Pawn*>(this->getOwner());
[10794]195
[10795]196        materialNameState_ = ""; // Needed to set the material in the tick after a change of the owner.
[10688]197    }
198
199    void HUDWeaponMode::changedOverlayGroup()
200    {
201        SUPER(HUDWeaponMode, changedOverlayGroup);
202
203        this->getOverlayGroup()->addElement(this->textOverlayLeft_.get());
204        this->getOverlayGroup()->addElement(this->textOverlayRight_.get());
205    }   
206
207    void HUDWeaponMode::changedVisibility()
208    {
209        SUPER(HUDWeaponMode, changedVisibility);
210
[10794]211        bool visible = this->isVisible();
212
213        this->textOverlayLeft_->setVisible(visible);
214        this->textOverlayRight_->setVisible(visible);
[10688]215    }
216
217    void HUDWeaponMode::changedName()
218    {
219        SUPER(HUDWeaponMode, changedName);
220
221        //this->textOverlay_->setName(this->getName() + "text");
222    } 
223
224    void HUDWeaponMode::setWeaponMode(WeaponMode* weaponMode)
225    {
226        weaponMode_ = weaponMode;
227
228        if (!weaponMode_)
229        {
230            return;
231        }
232
233        std::string materialName = weaponMode_->getHUDImageString();
234
235        overlayElementIcon_->setMaterialName(materialName);
236
237        Munition* munition = this->weaponMode_->getMunition();
238
[11071]239        if (munition != nullptr)
[10688]240        {
[11071]241            MunitionDeployment deployment = munition->getMunitionDeployment();
[10688]242
[10724]243            if (deployment == MunitionDeployment::Share)
[10688]244            {
245                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionShare");
246            }
[10724]247            else if (deployment == MunitionDeployment::Stack)
[10688]248            {
249                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionStack");
250            }
[10724]251            else if (deployment == MunitionDeployment::Separate)
[10688]252            {
253                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionSeparate");
254            }
[10721]255        }
[10688]256    }
257
258    void HUDWeaponMode::positionHUDChilds()
259    {
[10721]260        Vector2 size = Vector2(getSize().x*45.0f/150.0f, getSize().y);
261        Vector2 offset1 = Vector2(getSize().x*82.5f/150.0f, 0.0f);
262        Vector2 offset2 = Vector2(getSize().x*127.5f/150.0f, 0.0f);
263
264        textOverlayLeft_->setPosition(getPosition() + offset1);
265        textOverlayRight_->setPosition(getPosition() + offset2);
266
267        textOverlayLeft_->setSize(size);
268        textOverlayRight_->setSize(size);
269
270        textOverlayLeft_->setTextSize(getSize().y);
271        textOverlayRight_->setTextSize(getSize().y);
272    }
273
274    void HUDWeaponMode::updateSize()
275    {
276        this->setSize(weaponModeHUDActualSize_);
277        updatePosition();
278    }
279
280    void HUDWeaponMode::updatePosition()
281    {
[10739]282        this->setPosition(Vector2(weaponModeHUDActualSize_.x*weaponIndex_,weaponModeHUDActualSize_.y*weaponModeIndex_) + this->positionOffset_);
[10721]283    }     
[11044]284}
Note: See TracBrowser for help on using the repository browser.