Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy/src/orxonox/overlays/hud/HUDNavigation.cc @ 2046

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

Changed initialisation of overlay classes to the new convention.
The default values of the XML parameters are set in the constructor with the setter functions!

  • Property svn:eol-style set to native
File size: 9.7 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 *      Felix Schulthess
24 *   Co-authors:
25 *      Reto Grieder
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "HUDNavigation.h"
31
32#include <OgreOverlayManager.h>
33#include <OgreTextAreaOverlayElement.h>
34#include <OgrePanelOverlayElement.h>
35
36#include "util/Math.h"
37#include "util/String.h"
38#include "util/Convert.h"
39#include "core/ConsoleCommand.h"
40#include "core/CoreIncludes.h"
41#include "core/XMLPort.h"
42#include "objects/Radar.h"
43
44namespace orxonox
45{
46    CreateFactory(HUDNavigation);
47
48    HUDNavigation::HUDNavigation(BaseObject* creator)
49        : OrxonoxOverlay(creator)
50    {
51        RegisterObject(HUDNavigation);
52
53        // create nav text
54        navText_ = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
55            .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
56
57        // create nav marker
58        navMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
59            .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
60        navMarker_->setMaterialName("Orxonox/NavArrows");
61
62        // create aim marker
63        aimMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
64            .createOverlayElement("Panel", "HUDNavigation_aimMarker_" + getUniqueNumberString()));
65        aimMarker_->setMaterialName("Orxonox/NavCrosshair");
66        this->wasOutOfView_ = true; // Ensure the material is changed right the first time..
67
68        setFont("Monofur");
69        setTextSize(0.05f);
70        setNavMarkerSize(0.05f);
71        setAimMarkerSize(0.04f);
72
73        background_->addChild(navMarker_);
74        background_->addChild(aimMarker_);
75        background_->addChild(navText_);
76
77        // hide at first
78        this->setVisible(false);
79    }
80
81    HUDNavigation::~HUDNavigation()
82    {
83        if (this->isInitialized())
84        {
85            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_);
86            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->navText_);
87            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_);
88        }
89    }
90
91    void HUDNavigation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
92    {
93        SUPER(HUDNavigation, XMLPort, xmlElement, mode);
94
95        XMLPortParam(HUDNavigation, "font",     setFont,     getFont,     xmlElement, mode);
96        XMLPortParam(HUDNavigation, "textSize", setTextSize, getTextSize, xmlElement, mode);
97        XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
98        XMLPortParam(HUDNavigation, "aimMarkerSize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode);
99    }
100
101    void HUDNavigation::setFont(const std::string& font)
102    {
103        if (this->navText_ && font != "")
104            this->navText_->setFontName(font);
105    }
106
107    const std::string& HUDNavigation::getFont() const
108    {
109        if (this->navText_)
110            return this->navText_->getFontName();
111        else
112            return BLANKSTRING;
113    }
114
115    void HUDNavigation::setTextSize(float size)
116    {
117        if (this->navText_ && size >= 0.0f)
118            this->navText_->setCharHeight(size);
119    }
120
121    float HUDNavigation::getTextSize() const
122    {
123        if (this->navText_)
124            return this->navText_->getCharHeight();
125        else
126            return 0.0f;
127    }
128
129    void HUDNavigation::tick(float dt)
130    {
131        if (!Radar::getInstance().getFocus())
132        {
133            this->overlay_->hide();
134            return;
135        }
136        else
137        {
138            this->overlay_->show();
139        }
140
141        // set text
142        int dist = (int) getDist2Focus();
143        navText_->setCaption(convertToString(dist));
144        float textLength = convertToString(dist).size() * navText_->getCharHeight() * 0.3;
145
146/*
147        Ogre::Camera* navCam = SpaceShip::getLocalShip()->getCamera()->cam_;
148        Matrix4 transformationMatrix = navCam->getProjectionMatrix() * navCam->getViewMatrix();
149*/
150        // transform to screen coordinates
151        Vector3 pos = /*transformationMatrix * */Radar::getInstance().getFocus()->getWorldPosition();
152
153        bool outOfView;
154        if (pos.z > 1.0)
155        {
156            // z > 1.0 means that the object is behind the camera
157            outOfView = true;
158            // we have to switch all coordinates (if you don't know why,
159            // try linear algebra lectures, because I can't explain..)
160            pos.x = -pos.x;
161            pos.y = -pos.y;
162        }
163        else
164            outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
165
166        if (outOfView)
167        {
168            // object is not in view
169            aimMarker_->hide();
170
171            if (!wasOutOfView_)
172            {
173                navMarker_->setMaterialName("Orxonox/NavArrows");
174                wasOutOfView_ = true;
175            }
176
177            if (pos.x < pos.y)
178            {
179                if (pos.y > -pos.x)
180                {
181                    // up
182                    float position = pos.x / pos.y + 1.0;
183                    navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 0.0);
184                    navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
185                    navText_->setLeft((position - textLength) * 0.5);
186                    navText_->setTop(navMarker_->getHeight());
187                }
188                else
189                {
190                    // left
191                    float position = pos.y / pos.x + 1.0;
192                    navMarker_->setPosition(0.0, (position - navMarker_->getWidth()) * 0.5);
193                    navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
194                    navText_->setLeft(navMarker_->getWidth() + 0.01);
195                    navText_->setTop((position - navText_->getCharHeight()) * 0.5);
196                }
197            }
198            else
199            {
200                if (pos.y < -pos.x)
201                {
202                    // down
203                    float position = -pos.x / pos.y + 1.0;
204                    navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 1.0 - navMarker_->getHeight());
205                    navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
206                    navText_->setLeft((position - textLength) * 0.5);
207                    navText_->setTop(1.0 - navMarker_->getHeight() - navText_->getCharHeight());
208                }
209                else
210                {
211                    // right
212                    float position = -pos.y / pos.x + 1.0;
213                    navMarker_->setPosition(1.0 - navMarker_->getWidth(), (position - navMarker_->getHeight()) * 0.5);
214                    navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
215                    navText_->setLeft(1.0 - navMarker_->getWidth() - textLength - 0.01);
216                    navText_->setTop((position - navText_->getCharHeight()) * 0.5);
217                }
218            }
219        }
220        else
221        {
222            // object is in view
223/*
224            Vector3 aimpos = transformationMatrix * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(),
225                    Projectile::getSpeed(), Radar::getInstance().getFocus()->getWorldPosition(), Radar::getInstance().getFocus()->getOrientedVelocity());
226*/
227            if (wasOutOfView_)
228            {
229                navMarker_->setMaterialName("Orxonox/NavTDC");
230                wasOutOfView_ = false;
231            }
232
233            // object is in view
234            navMarker_->setUV(0.0, 0.0, 1.0, 1.0);
235            navMarker_->setLeft((pos.x + 1.0 - navMarker_->getWidth()) * 0.5);
236            navMarker_->setTop((-pos.y + 1.0 - navMarker_->getHeight()) * 0.5);
237
238            aimMarker_->show();
239/*
240            aimMarker_->setLeft((aimpos.x + 1.0 - aimMarker_->getWidth()) * 0.5);
241            aimMarker_->setTop((-aimpos.y + 1.0 - aimMarker_->getHeight()) * 0.5);
242*/
243            navText_->setLeft((pos.x + 1.0 + navMarker_->getWidth()) * 0.5);
244            navText_->setTop((-pos.y + 1.0 + navMarker_->getHeight()) * 0.5);
245        }
246    }
247
248    float HUDNavigation::getDist2Focus() const
249    {
250/*
251        if (Radar::getInstance().getFocus())
252            return (Radar::getInstance().getFocus()->getWorldPosition() - SpaceShip::getLocalShip()->getPosition()).length();
253        else
254*/
255            return 0;
256    }
257
258    /**
259    @brief Overridden method of OrxonoxOverlay. Usually the entire overlay
260           scales with scale(). Here we obviously have to adjust this.
261    */
262    void HUDNavigation::sizeChanged()
263    {
264        // use size to compensate for apspect ratio if enabled.
265        float xScale = this->getActualSize().x;
266        float yScale = this->getActualSize().y;
267        if (this->navMarker_)
268            navMarker_->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
269        if (this->aimMarker_)
270            aimMarker_->setDimensions(aimMarkerSize_ * xScale, aimMarkerSize_ * yScale);
271        if (this->navText_)
272            navText_->setCharHeight(navText_->getCharHeight() * yScale);
273    }
274}
Note: See TracBrowser for help on using the repository browser.