Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ggz/src/orxonox/objects/items/MultiStateEngine.cc @ 3530

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

Another 15% performance boost in dedicated mode, 30 bots, no clients.
I hope this is not such a big problem if the 5 most important ticks don't use SUPER.

  • Property svn:eol-style set to native
File size: 8.3 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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "MultiStateEngine.h"
31
32#include "core/Core.h"
33#include "core/CoreIncludes.h"
34#include "core/XMLPort.h"
35#include "objects/worldentities/pawns/SpaceShip.h"
36
37namespace orxonox
38{
39    static const float FORWARD_EFFECT_VELOCITY_THRESHOLD = 20;
40
41    static const unsigned char STATE_ACTIVE  = 1;
42    static const unsigned char STATE_FORWARD = 2;
43    static const unsigned char STATE_BOOST   = 4;
44    static const unsigned char STATE_BRAKE   = 8;
45
46    CreateFactory(MultiStateEngine);
47
48    MultiStateEngine::MultiStateEngine(BaseObject* creator) : Engine(creator)
49    {
50        RegisterObject(MultiStateEngine);
51
52        this->state_ = 0;
53
54        this->registerVariables();
55    }
56
57    MultiStateEngine::~MultiStateEngine()
58    {
59        if (this->isInitialized() && !this->getShip())
60        {
61            // We have no ship, so the effects are not attached and won't be destroyed automatically
62            for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
63                delete (*it);
64            for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
65                delete (*it);
66            for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
67                delete (*it);
68            for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
69                delete (*it);
70        }
71    }
72
73    void MultiStateEngine::XMLPort(Element& xmlelement, XMLPort::Mode mode)
74    {
75        SUPER(MultiStateEngine, XMLPort, xmlelement, mode);
76
77        XMLPortObject(MultiStateEngine, WorldEntity, "active",  addActiveEffect,  getActiveEffect,  xmlelement, mode);
78        XMLPortObject(MultiStateEngine, WorldEntity, "forward", addForwardEffect, getForwardEffect, xmlelement, mode);
79        XMLPortObject(MultiStateEngine, WorldEntity, "boost",   addBoostEffect,   getBoostEffect,   xmlelement, mode);
80        XMLPortObject(MultiStateEngine, WorldEntity, "brake",   addBrakeEffect,   getBrakeEffect,   xmlelement, mode);
81    }
82
83    void MultiStateEngine::registerVariables()
84    {
85        registerVariable(this->state_, variableDirection::toserver);
86    }
87
88    void MultiStateEngine::tick(float dt)
89    {
90        if (this->getShip())
91        {
92            if (this->getShip()->hasLocalController())
93            {
94                this->setObjectMode(objectDirection::bidirectional);
95
96                const Vector3& direction = this->getDirection();
97                const Vector3& velocity = this->getShip()->getLocalVelocity();
98
99                bool forward = (direction.z < 0 && velocity.z < -FORWARD_EFFECT_VELOCITY_THRESHOLD);
100                bool boost = (this->getShip()->getBoost() && forward);
101                bool brake = (direction.z > 0 && velocity.z < 0);
102                bool active = (direction != Vector3::ZERO && !brake);
103
104                if (active)
105                    this->state_ |= STATE_ACTIVE;
106                else
107                    this->state_ &= ~STATE_ACTIVE;
108
109                if (forward)
110                    this->state_ |= STATE_FORWARD;
111                else
112                    this->state_ &= ~STATE_FORWARD;
113
114                if (boost)
115                    this->state_ |= STATE_BOOST;
116                else
117                    this->state_ &= ~STATE_BOOST;
118
119                if (brake)
120                    this->state_ |= STATE_BRAKE;
121                else
122                    this->state_ &= ~STATE_BRAKE;
123            }
124
125            if (Core::isMaster())
126            {
127                for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
128                    (*it)->setMainState(this->state_ & STATE_ACTIVE);
129                for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
130                    (*it)->setMainState(this->state_ & STATE_FORWARD);
131                for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
132                    (*it)->setMainState(this->state_ & STATE_BOOST);
133                for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
134                    (*it)->setMainState(this->state_ & STATE_BRAKE);
135            }
136        }
137
138        Engine::tick(dt);
139    }
140
141    void MultiStateEngine::addToSpaceShip(SpaceShip* ship)
142    {
143        Engine::addToSpaceShip(ship);
144
145        if (!ship)
146            return;
147
148        for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
149            ship->attach(*it);
150        for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
151            ship->attach(*it);
152        for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
153            ship->attach(*it);
154        for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
155            ship->attach(*it);
156    }
157
158    void MultiStateEngine::addActiveEffect(WorldEntity* effect)
159    {
160        this->activeEffects_.push_back(effect);
161        if (this->getShip())
162            this->getShip()->attach(effect);
163    }
164
165    void MultiStateEngine::addForwardEffect(WorldEntity* effect)
166    {
167        this->forwardEffects_.push_back(effect);
168        if (this->getShip())
169            this->getShip()->attach(effect);
170    }
171
172    void MultiStateEngine::addBoostEffect(WorldEntity* effect)
173    {
174        this->boostEffects_.push_back(effect);
175        if (this->getShip())
176            this->getShip()->attach(effect);
177    }
178
179    void MultiStateEngine::addBrakeEffect(WorldEntity* effect)
180    {
181        this->brakeEffects_.push_back(effect);
182        if (this->getShip())
183            this->getShip()->attach(effect);
184    }
185
186    WorldEntity* MultiStateEngine::getActiveEffect(unsigned int index) const
187    {
188        unsigned int i = 0;
189        for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
190        {
191            if (i == index)
192                return (*it);
193            ++i;
194        }
195        return 0;
196    }
197
198    WorldEntity* MultiStateEngine::getForwardEffect(unsigned int index) const
199    {
200        unsigned int i = 0;
201        for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
202        {
203            if (i == index)
204                return (*it);
205            ++i;
206        }
207        return 0;
208    }
209
210    WorldEntity* MultiStateEngine::getBoostEffect(unsigned int index) const
211    {
212        unsigned int i = 0;
213        for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
214        {
215            if (i == index)
216                return (*it);
217            ++i;
218        }
219        return 0;
220    }
221
222    WorldEntity* MultiStateEngine::getBrakeEffect(unsigned int index) const
223    {
224        unsigned int i = 0;
225        for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
226        {
227            if (i == index)
228                return (*it);
229            ++i;
230        }
231        return 0;
232    }
233}
Note: See TracBrowser for help on using the repository browser.