Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/overlays/hud/HUDRadar.cc @ 8738

Last change on this file since 8738 was 8738, checked in by landauf, 13 years ago

added "scale" for radar viewables. scale is relative, 1.0 means "normal".
rocket and simple rocket are now visible on the radar as small triangles.
greatly reduced lifetime of simple rocket.
fixed another possible cause for flashing hud radar.

  • Property svn:eol-style set to native
File size: 7.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 *      Yuning Chai
24 *      Felix Schulthess
25 *   Co-authors:
26 *      Reto Grieder
27 *
28 */
29
30#include "HUDRadar.h"
31
32#include <OgreOverlayManager.h>
33#include <OgrePanelOverlayElement.h>
34
35#include "util/Math.h"
36#include "util/StringUtils.h"
37#include "core/CoreIncludes.h"
38#include "core/XMLPort.h"
39#include "tools/TextureGenerator.h"
40#include "worldentities/ControllableEntity.h"
41#include "Scene.h"
42#include "Radar.h"
43
44namespace orxonox
45{
46    CreateFactory(HUDRadar);
47
48    HUDRadar::HUDRadar(BaseObject* creator)
49        : OrxonoxOverlay(creator)
50    {
51        RegisterObject(HUDRadar);
52
53        this->marker_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
54            .createOverlayElement("Panel", "HUDRadar_marker_" + getUniqueNumberString()));
55        this->marker_->setMaterialName("Orxonox/RadarMarker");
56        this->overlay_->add2D(this->marker_);
57        this->marker_->hide();
58
59        this->setRadarSensitivity(1.0f);
60        this->setHalfDotSizeDistance(3000.0f);
61        this->setMaximumDotSize(0.1f);
62
63        this->shapeMaterials_[RadarViewable::Dot]      = "RadarDot.png";
64        this->shapeMaterials_[RadarViewable::Triangle] = "RadarTriangle.png";
65        this->shapeMaterials_[RadarViewable::Square]   = "RadarSquare.png";
66
67        this->owner_ = 0;
68    }
69
70    HUDRadar::~HUDRadar()
71    {
72        if (this->isInitialized())
73        {
74            Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->marker_);
75            for (std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it = this->radarObjects_.begin();
76                it != this->radarObjects_.end(); ++it)
77            {
78                Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second);
79            }
80        }
81    }
82
83    void HUDRadar::XMLPort(Element& xmlelement, XMLPort::Mode mode)
84    {
85        SUPER(HUDRadar, XMLPort, xmlelement, mode);
86
87        XMLPortParam(HUDRadar, "sensitivity", setRadarSensitivity, getRadarSensitivity, xmlelement, mode);
88        XMLPortParam(HUDRadar, "halfDotSizeDistance", setHalfDotSizeDistance, getHalfDotSizeDistance, xmlelement, mode);
89        XMLPortParam(HUDRadar, "maximumDotSize", setMaximumDotSize, getMaximumDotSize, xmlelement, mode);
90    }
91
92    void HUDRadar::addObject(RadarViewable* object)
93    {
94        if (object == dynamic_cast<RadarViewable*>(this->owner_))
95            return;
96
97        // Make sure the object hasn't been added yet
98        assert( this->radarObjects_.find(object) == this->radarObjects_.end() );
99
100        // Create everything needed to display the object on the radar and add it to the map
101        Ogre::PanelOverlayElement* panel;
102        panel = static_cast<Ogre::PanelOverlayElement*>(
103            Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberString()));
104        this->overlay_->add2D(panel);
105        // get right material
106        panel->setMaterialName(TextureGenerator::getMaterialName(
107            shapeMaterials_[object->getRadarObjectShape()], object->getRadarObjectColour()));
108        panel->hide();
109        this->radarObjects_[object] = panel;
110    }
111
112    void HUDRadar::removeObject(RadarViewable* object)
113    {
114        // If object was added at all then remove it
115        std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it;
116        it = this->radarObjects_.find( object );
117        if( it != this->radarObjects_.end() )
118        {
119            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second);
120            this->radarObjects_.erase(it);
121        }
122    }
123
124    void HUDRadar::objectChanged( RadarViewable* rv )
125    {
126        if (rv == dynamic_cast<RadarViewable*>(this->owner_))
127            return;
128        assert( this->radarObjects_.find(rv) != this->radarObjects_.end() );
129        Ogre::PanelOverlayElement* panel = this->radarObjects_[rv];
130        panel->setMaterialName(TextureGenerator::getMaterialName(
131            shapeMaterials_[rv->getRadarObjectShape()], rv->getRadarObjectColour()));
132    }
133
134    void HUDRadar::gatherObjects()
135    {
136        const std::set<RadarViewable*>& objectSet = this->getCreator()->getScene()->getRadar()->getRadarObjects();
137        std::set<RadarViewable*>::const_iterator it;
138        for( it=objectSet.begin(); it!=objectSet.end(); ++it )
139            this->addObject(*it);
140        this->radarTick(0);
141    }
142
143    void HUDRadar::radarTick(float dt)
144    {
145        // Make sure the owner of the radar was defined
146        if( !this->owner_ )
147            return;
148
149        this->marker_->hide();      // in case that no object is in focus
150        // get the focus object
151        Radar* radar = this->getOwner()->getScene()->getRadar();
152        const RadarViewable* focusObject = radar->getFocus();
153
154        // update the distances for all objects
155        std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it;
156        for( it = this->radarObjects_.begin(); it != this->radarObjects_.end(); ++it )
157        {
158            // Make sure the object really is a WorldEntity
159            const WorldEntity* wePointer = it->first->getWorldEntity();
160            if( !wePointer )
161            {
162                CCOUT(0) << "Cannot display a non-WorldEntitiy on the radar" << std::endl;
163                assert(0);
164            }
165            bool isFocus = (it->first == focusObject);
166            // set size to fit distance...
167            float distance = (wePointer->getWorldPosition() - this->owner_->getPosition()).length();
168            // calculate the size with 1/distance dependency for simplicity (instead of exp(-distance * lambda)
169            float size = maximumDotSize_ * halfDotSizeDistance_ / (halfDotSizeDistance_ + distance) * it->first->getRadarObjectScale();
170            it->second->setDimensions(size, size);
171
172            // calc position on radar...
173            Vector2 coord = get2DViewcoordinates(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, this->owner_->getOrientation() * WorldEntity::UP, wePointer->getWorldPosition());
174            coord *= math::pi / 3.5f; // small adjustment to make it fit the texture
175            it->second->setPosition((1.0f + coord.x - size) * 0.5f, (1.0f - coord.y - size) * 0.5f);
176            it->second->show();
177
178            // if this object is in focus, then set the focus marker
179            if (isFocus)
180            {
181                this->marker_->setDimensions(size * 1.5f, size * 1.5f);
182                this->marker_->setPosition((1.0f + coord.x - size * 1.5f) * 0.5f, (1.0f - coord.y - size * 1.5f) * 0.5f);
183                this->marker_->show();
184            }
185        }
186    }
187
188    void HUDRadar::changedOwner()
189    {
190        SUPER(HUDRadar, changedOwner);
191
192        this->owner_ = orxonox_cast<ControllableEntity*>(this->getOwner());
193        assert(this->radarObjects_.size() == 0);
194        this->gatherObjects();
195    }
196}
Note: See TracBrowser for help on using the repository browser.