Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pickups/src/orxonox/objects/items/MultiStateEngine.cc @ 2900

Last change on this file since 2900 was 2809, checked in by landauf, 16 years ago

reverted commit 2782 which was:

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.

There are two reasons for the reverting:
1) We can't just remove SUPER in the currently most important classes, this will change over time and we need a general solution for the (indeed noticeable) performance problem. Until then we keep is as consistent as possible.

2) SpaceShip inherits from Pawn and not from ControllableEntity… that's why shooting didn't worked after r2782. In fact that's exactly why we use SUPER.

  • Property svn:eol-style set to native
File size: 8.4 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        SUPER(MultiStateEngine, 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.