Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/hudelements/src/modules/overlays/hud/HUDNavigation.cc @ 6897

Last change on this file since 6897 was 6897, checked in by sfluecki, 14 years ago

Updates in der reinitialisierung von HUDNavigation → changes in constructor & destructor of HUDNavigation.cc / apparently there is still a segfault when starting the game.

  • Property svn:eol-style set to native
File size: 15.6 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 "HUDNavigation.h"
30#include <utility>
31
32#include <string>
33#include <OgreCamera.h>
34#include <OgreOverlayManager.h>
35#include <OgreTextAreaOverlayElement.h>
36#include <OgrePanelOverlayElement.h>
37#include "util/Math.h"
38#include "util/Convert.h"
39#include "core/CoreIncludes.h"
40#include "core/XMLPort.h"
41#include "CameraManager.h"
42#include "Scene.h"
43#include "Radar.h"
44#include "graphics/Camera.h"
45#include "controllers/HumanController.h"
46#include "worldentities/pawns/Pawn.h"
47#include "worldentities/WorldEntity.h"
48#include "interfaces/RadarViewable.h"
49
50namespace orxonox
51{
52CreateFactory(HUDNavigation);
53
54HUDNavigation::HUDNavigation(BaseObject* creator)
55        : OrxonoxOverlay(creator)
56{
57    RegisterObject(HUDNavigation);
58
59    setFont("Monofur");
60    setTextSize(0.05f);
61    setNavMarkerSize(0.05f);
62
63    respawnObjectSet_ = this->getOwner()->getScene()->getRadar()->getRadarObjects(); 
64
65    for (respawnObjectSetIt_ = respawnObjectSet_.begin(); respawnObjectSetIt_ != respawnObjectSet_.end();
66            ++respawnObjectSetIt_)
67    {
68        if (!(*respawnObjectSetIt_)->isHumanShip_)  addObject(*respawnObjectSetIt_);
69    }
70   
71//         // create nav text
72//         navText_ = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
73//             .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
74//
75//         // create nav marker
76//         navMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
77//             .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
78//         navMarker_->setMaterialName("Orxonox/NavArrows");
79
80        /*
81                // create aim marker
82                aimMarker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
83                    .createOverlayElement("Panel", "HUDNavigation_aimMarker_" + getUniqueNumberString()));
84                aimMarker_->setMaterialName("Orxonox/NavCrosshair");
85                this->wasOutOfView_ = true; // Ensure the material is changed right the first time..
86
87
88        */
89        /*
90                background_->addChild(navMarker_);*/
91//        background_->addChild(aimMarker_);
92//         background_->addChild(navText_);
93
94        // hide at first
95//         this->setVisible(false);
96
97
98
99//         setAimMarkerSize(0.04f);
100   
101}
102
103HUDNavigation::~HUDNavigation() {
104
105    if (this->isInitialized())
106    {
107        activeObjectList_.clear();
108        respawnObjectSet_.clear();
109    }
110}
111
112void HUDNavigation::XMLPort(Element& xmlElement, XMLPort::Mode mode) {
113    SUPER(HUDNavigation, XMLPort, xmlElement, mode);
114
115    XMLPortParam(HUDNavigation, "font",     setFont,     getFont,     xmlElement, mode);
116    XMLPortParam(HUDNavigation, "textSize", setTextSize, getTextSize, xmlElement, mode);
117    XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
118//        XMLPortParam(HUDNavigation, "aimMarkerSize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode);
119}
120
121void HUDNavigation::setFont(const std::string& font)
122{
123    fontName_ = font;
124    if (!activeObjectList_.empty())
125    {
126        for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
127        {
128            if (tempRadarViewable->second.second && !fontName_.empty())
129                tempRadarViewable->second.second->setFontName(fontName_);
130        }
131    }
132}
133
134const std::string& HUDNavigation::getFont() const
135{
136    return fontName_;
137}
138
139void HUDNavigation::setTextSize(float size)
140{
141    textSize_ = size;
142    if (!activeObjectList_.empty())
143    {
144        for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
145        {
146            if (tempRadarViewable->second.second && size >= 0.0f)
147                tempRadarViewable->second.second->setCharHeight(size);
148        }
149    }
150}
151
152float HUDNavigation::getTextSize() const
153{
154    return textSize_;
155}
156
157void HUDNavigation::tick(float dt)
158{
159    SUPER(HUDNavigation, tick, dt);
160
161//      updateActiveObjectList(activeObjectList_);
162
163    // Get radar
164//         Radar* radar = this->getOwner()->getScene()->getRadar();
165//
166//         if (!radar->getFocus())
167//         {
168//             this->overlay_->hide();
169//             return;
170//         }
171//         else
172//         {
173//             this->overlay_->show();
174//         }
175
176    // set text
177//         int dist = static_cast<int>(getDist2Focus());
178//         navText_->setCaption(multi_cast<std::string>(dist));
179//         float textLength = multi_cast<std::string>(dist).size() * navText_->getCharHeight() * 0.3f;
180
181    if (!activeObjectList_.empty()) {
182        for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
183        {
184            COUT(0) << "check 174" << std::endl;
185
186            //get Distance to HumanController and save it in the TextAreaOverlayElement.
187            int dist = (int)(tempRadarViewable->first->getRVWorldPosition() - HumanController::getLocalControllerEntityAsPawn()->getWorldPosition()).length();
188            tempRadarViewable->second.second->setCaption(multi_cast<std::string>(dist));
189            float textLength = multi_cast<std::string>(dist).size() * tempRadarViewable->second.second->getCharHeight() * 0.3f;
190
191            COUT(0) << "check 181" << std::endl;
192
193            orxonox::Camera* cam = CameraManager::getInstance().getActiveCamera();
194            if (!cam)
195                return;
196            const Matrix4& transform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
197            // transform to screen coordinates
198            Vector3 pos = transform * tempRadarViewable->first->getRVWorldPosition();
199
200            COUT(0) << "check 190" << std::endl;
201
202            bool outOfView;
203            if (pos.z > 1.0)
204            {
205                // z > 1.0 means that the object is behind the camera
206                outOfView = true;
207                // we have to switch all coordinates (if you don't know why,
208                // try linear algebra lectures, because I can't explain..)
209                pos.x = -pos.x;
210                pos.y = -pos.y;
211            }
212            else
213                outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
214
215            if (outOfView)
216            {
217                // object is not in view
218//            aimMarker_->hide();
219
220                if (!wasOutOfView_)
221                {
222                    tempRadarViewable->second.first->setMaterialName("Orxonox/NavArrows");
223                    wasOutOfView_ = true;
224                }
225
226                COUT(0) << "check 174" << std::endl;
227
228                if (pos.x < pos.y)
229                {
230                    if (pos.y > -pos.x)
231                    {
232                        // up
233                        float position = pos.x / pos.y + 1.0f;
234                        tempRadarViewable->second.first->setPosition((position - tempRadarViewable->second.first->getWidth()) * 0.5f, 0.0f);
235                        tempRadarViewable->second.first->setUV(0.5f, 0.0f, 1.0f, 0.5f);
236                        tempRadarViewable->second.second->setLeft((position - textLength) * 0.5f);
237                        tempRadarViewable->second.second->setTop(tempRadarViewable->second.first->getHeight());
238                    }
239                    else
240                    {
241                        // left
242                        float position = pos.y / pos.x + 1.0f;
243                        tempRadarViewable->second.first->setPosition(0.0f, (position - tempRadarViewable->second.first->getWidth()) * 0.5f);
244                        tempRadarViewable->second.first->setUV(0.0f, 0.0f, 0.5f, 0.5f);
245                        tempRadarViewable->second.second->setLeft(tempRadarViewable->second.first->getWidth() + 0.01f);
246                        tempRadarViewable->second.second->setTop((position - tempRadarViewable->second.second->getCharHeight()) * 0.5f);
247                    }
248                }
249                else
250                {
251
252                    if (pos.y < -pos.x)
253                    {
254                        // down
255                        float position = -pos.x / pos.y + 1.0f;
256                        tempRadarViewable->second.first->setPosition((position - tempRadarViewable->second.first->getWidth()) * 0.5f, 1.0f - tempRadarViewable->second.first->getHeight());
257                        tempRadarViewable->second.first->setUV(0.0f, 0.5f, 0.5f, 1.0f);
258                        tempRadarViewable->second.second->setLeft((position - textLength) * 0.5f);
259                        tempRadarViewable->second.second->setTop(1.0f - tempRadarViewable->second.first->getHeight() - tempRadarViewable->second.second->getCharHeight());
260                    }
261                    else
262                    {
263                        // right
264                        float position = -pos.y / pos.x + 1.0f;
265                        tempRadarViewable->second.first->setPosition(1.0f - tempRadarViewable->second.first->getWidth(), (position - tempRadarViewable->second.first->getHeight()) * 0.5f);
266                        tempRadarViewable->second.first->setUV(0.5f, 0.5f, 1.0f, 1.0f);
267                        tempRadarViewable->second.second->setLeft(1.0f - tempRadarViewable->second.first->getWidth() - textLength - 0.01f);
268                        tempRadarViewable->second.second->setTop((position - tempRadarViewable->second.second->getCharHeight()) * 0.5f);
269                    }
270                }
271            }
272            else
273            {
274                COUT(0) << "check 264" << std::endl;
275
276                // object is in view
277                /*
278                            Vector3 aimpos = transform * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(),
279                                    Projectile::getSpeed(), Radar::getInstance().getFocus()->getRVWorldPosition(), Radar::getInstance().getFocus()->getRVOrientedVelocity());
280                */
281                if (wasOutOfView_)
282                {
283                    tempRadarViewable->second.first->setMaterialName("Orxonox/NavTDC");
284                    wasOutOfView_ = false;
285                }
286
287                // object is in view
288                tempRadarViewable->second.first->setUV(0.0f, 0.0f, 1.0f, 1.0f);
289                tempRadarViewable->second.first->setLeft((pos.x + 1.0f - tempRadarViewable->second.first->getWidth()) * 0.5f);
290                tempRadarViewable->second.first->setTop((-pos.y + 1.0f - tempRadarViewable->second.first->getHeight()) * 0.5f);
291
292
293//                 aimMarker_->show();
294//                 aimMarker_->setLeft((aimpos.x + 1.0f - aimMarker_->getWidth()) * 0.5f);
295//                 aimMarker_->setTop((-aimpos.y + 1.0f - aimMarker_->getHeight()) * 0.5f);
296//
297                tempRadarViewable->second.second->setLeft((pos.x + 1.0f + tempRadarViewable->second.first->getWidth()) * 0.5f);
298                tempRadarViewable->second.second->setTop((-pos.y + 1.0f + tempRadarViewable->second.first->getHeight()) * 0.5f);
299            }
300
301            tempRadarViewable->second.first->show();
302            tempRadarViewable->second.second->show();
303        }
304
305    }
306
307}
308
309
310float HUDNavigation::getDist2Focus() const {
311
312    Radar* radar = this->getOwner()->getScene()->getRadar();
313    if (radar->getFocus() && HumanController::getLocalControllerEntityAsPawn())
314        return (radar->getFocus()->getRVWorldPosition() - HumanController::getLocalControllerEntityAsPawn()->getWorldPosition()).length();
315    else
316        return 0;
317}
318
319/**
320@brief Overridden method of OrxonoxOverlay. Usually the entire overlay
321       scales with scale(). Here we obviously have to adjust this.
322*/
323void HUDNavigation::sizeChanged() {
324    // use size to compensate for aspect ratio if enabled.
325    float xScale = this->getActualSize().x;
326    float yScale = this->getActualSize().y;
327
328    if (!activeObjectList_.empty())
329    {
330        for (tempRadarViewable = activeObjectList_.begin(); tempRadarViewable!=activeObjectList_.end(); ++tempRadarViewable)
331        {
332
333            if (tempRadarViewable->second.first)
334                tempRadarViewable->second.first->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
335//            if (this->aimMarker_)
336//            aimMarker_->setDimensions(aimMarkerSize_ * xScale, aimMarkerSize_ * yScale);
337            if (tempRadarViewable->second.second)
338                tempRadarViewable->second.second->setCharHeight(tempRadarViewable->second.second->getCharHeight() * yScale);
339        }
340    }
341}
342
343
344void HUDNavigation::addObject(RadarViewable* object) {
345    if (object == dynamic_cast<RadarViewable*>(this->getOwner()))
346        return;
347
348    assert(object);
349
350    // Make sure the object hasn't been added yet
351    assert( this->activeObjectList_.find(object) == this->activeObjectList_.end() );
352
353    // Create everything needed to display the object on the radar and add it to the map
354
355    // create nav marker
356    Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
357                                       .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
358
359    panel->setMaterialName("Orxonox/NavArrows");
360
361    Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton()
362                                         .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
363
364    float xScale = this->getActualSize().x;
365    float yScale = this->getActualSize().y;
366
367    panel->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
368    text->setCharHeight(text->getCharHeight() * yScale);
369
370    activeObjectList_[object] = std::make_pair (panel, text) ;
371
372    this->background_->addChild(panel);
373    this->background_->addChild(text);
374
375//      background_->addChild(activeObjectList_[object].first);
376//      background_->addChild(activeObjectList_[object].second);
377    COUT(0) << "check 357" << std::endl;
378}
379
380void HUDNavigation::removeObject(RadarViewable* viewable)
381{
382    activeObjectListType::iterator it = activeObjectList_.find(viewable);
383
384    if (activeObjectList_.find(viewable) != activeObjectList_.end())
385    {
386        // Remove overlays from Ogre
387        this->background_->removeChild(it->second.first->getName());
388        this->background_->removeChild(it->second.second->getName());
389
390        activeObjectList_.erase(viewable);
391    }
392}
393
394// void HUDRadar::changedOwner() {
395//     SUPER(HUDRadar, changedOwner);
396//
397//     this->owner_ = orxonox_cast<Pawn*>(this->getOwner());
398//     assert(this->radarObjects_.size()==0);
399//     this->gatherObjects();
400// }
401
402//      void updateActiveObjectList(map activeObjectList_){}
403//
404//      void HUDNavigation::objectChanged(RadarViewable* viewable){}
405//
406//
407//         float HUDNavigation::getRadarSensitivity(){}
408//         void HUDNavigation::radarTick(float dt){}
409
410
411}
412
413
Note: See TracBrowser for help on using the repository browser.