Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/Radar.cc @ 10856

Last change on this file since 10856 was 10624, checked in by landauf, 9 years ago

merged branch core7 back to trunk

  • Property svn:eol-style set to native
File size: 6.8 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 *      Reto Grieder
24 *   Co-authors:
25 *      Felix Schulthess
26 *
27 */
28
29/**
30@file
31@brief
32*/
33
34#include "Radar.h"
35
36#include <cassert>
37
38//#include "util/Math.h"
39#include "core/CoreIncludes.h"
40#include "core/object/ObjectList.h"
41#include "core/command/ConsoleCommand.h"
42#include "interfaces/RadarListener.h"
43#include "controllers/HumanController.h"
44#include "worldentities/pawns/Pawn.h"
45
46namespace orxonox
47{
48    RegisterAbstractClass(Radar).inheritsFrom<Tickable>();
49
50    Radar::Radar()
51        : itFocus_(0)
52        , focus_(0)
53        , objectTypeCounter_(0)
54    {
55        // TODO: make this mapping configurable. Maybe there's a possibility with self configured
56        //       configValues..
57        this->objectTypes_["Asteroid"] = RadarViewable::Dot;
58        this->objectTypes_["SpaceShip"] = RadarViewable::Square;
59        this->objectTypes_["AsdfQwerty"] = RadarViewable::Triangle;
60
61        /*WorldEntity* object;
62        object = new WorldEntity();
63        object->setPosition(2000.0, 0.0, 0.0);
64        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
65        object = new WorldEntity();
66        object->setPosition(0.0, 2000.0, 0.0);
67        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
68        object = new WorldEntity();
69        object->setPosition(0.0, 0.0, 2000.0);
70        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
71        object = new WorldEntity();
72        object->setPosition(10000.0,16000.0,0.0);
73        addRadarObject(object);*/
74
75    }
76
77    Radar::~Radar()
78    {
79    }
80
81    void Radar::addRadarObject(RadarViewable* rv)
82    {
83        assert( this->radarObjects_.find(rv) == this->radarObjects_.end() );
84        this->radarObjects_.insert(rv);
85        // iterate through all radarlisteners and notify them
86        for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
87        {
88            (*itListener)->addObject(rv);
89        }
90    }
91
92    void Radar::removeRadarObject(RadarViewable* rv)
93    {
94        assert( this->radarObjects_.find(rv) != this->radarObjects_.end() );
95        this->radarObjects_.erase(rv);
96        // iterate through all radarlisteners and notify them
97        for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
98        {
99            (*itListener)->removeObject(rv);
100        }
101    }
102
103    const RadarViewable* Radar::getFocus()
104    {
105        if (this->itFocus_)
106            return *(this->itFocus_);
107        else
108            return 0;
109    }
110
111    RadarViewable::Shape Radar::addObjectDescription(const std::string& name)
112    {
113        std::map<std::string, RadarViewable::Shape>::iterator it = this->objectTypes_.find(name);
114        if (it == this->objectTypes_.end())
115            return this->objectTypes_[name] = RadarViewable::Square; // default, configure!!
116        else
117            return this->objectTypes_[name];
118    }
119
120
121    void Radar::tick(float dt)
122    {
123        SUPER(Radar, tick, dt);
124
125        if (this->itFocus_ && (this->focus_ != *(this->itFocus_)))
126        {
127            // focus object was deleted, release focus
128            this->focus_ = 0;
129            this->itFocus_ = 0;
130        }
131
132        for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
133        {
134            (*itListener)->radarTick(dt);
135        }
136    }
137
138    void Radar::cycleFocus()
139    {
140        if (ObjectList<RadarViewable>::begin() == ObjectList<RadarViewable>::end())
141        {
142            // list is empty
143            this->itFocus_ = 0;
144            this->focus_ = 0;
145        }
146
147        else if (HumanController::getLocalControllerEntityAsPawn())
148        {
149            Vector3 localPosition = HumanController::getLocalControllerEntityAsPawn()->getWorldPosition();
150            Vector3 targetPosition = localPosition;
151            if (this->itFocus_ && *(this->itFocus_))
152                targetPosition = this->itFocus_->getRVWorldPosition();
153
154            // find the closest object further away than targetPosition
155            float currentDistance = localPosition.squaredDistance(targetPosition);
156            float nextDistance = FLT_MAX;
157            float minimumDistance = FLT_MAX;
158            ObjectList<RadarViewable>::iterator itFallback = 0;
159
160            for (ObjectList<RadarViewable>::iterator it = ObjectList<RadarViewable>::begin(); it; ++it)
161            {
162                if (*it == static_cast<RadarViewable*>(HumanController::getLocalControllerEntityAsPawn()))
163                    continue;
164
165                float targetDistance = localPosition.squaredDistance((*it)->getRVWorldPosition());
166                if (targetDistance > currentDistance && targetDistance < nextDistance)
167                {
168                    this->itFocus_ = it;
169                    nextDistance = targetDistance;
170                }
171                if (targetDistance < minimumDistance)
172                {
173                    itFallback = it;
174                    minimumDistance = targetDistance;
175                }
176            }
177
178            if (nextDistance == FLT_MAX)
179            {
180                // we already had the furthest object
181                this->itFocus_ = itFallback;
182                this->focus_ = *itFallback;
183            }
184            else
185            {
186                this->focus_ = *(this->itFocus_);
187            }
188        }
189    }
190
191    void Radar::releaseFocus()
192    {
193        this->itFocus_ = 0;
194        this->focus_ = 0;
195    }
196
197    void Radar::listObjects() const
198    {
199        orxout(debug_output) << "List of RadarObjects:" << endl;
200        // iterate through all Radar Objects
201        unsigned int i = 0;
202        for (ObjectList<RadarViewable>::iterator it = ObjectList<RadarViewable>::begin(); it; ++it, ++i)
203        {
204            orxout(debug_output) << i++ << ": " << (*it)->getRVWorldPosition() << endl;
205        }
206    }
207
208    void Radar::radarObjectChanged(RadarViewable* rv)
209    {
210        for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
211        {
212          (*itListener)->objectChanged(rv);
213        }
214    }
215}
Note: See TracBrowser for help on using the repository browser.