Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ppspickups1/src/orxonox/items/Engine.cc @ 6675

Last change on this file since 6675 was 6607, checked in by ebeier, 15 years ago

first working version of the SpeedPickup, needs some more work for "onUse" type. Spaceship trails need to be looked at, because they don't show when a SpeedPickup with SpeedAdd is used.

  • Property svn:eol-style set to native
File size: 9.1 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 "Engine.h"
30
31#include "util/Math.h"
32#include "core/CoreIncludes.h"
33#include "core/ConfigValueIncludes.h"
34#include "core/XMLPort.h"
35#include "Scene.h"
36#include "worldentities/pawns/SpaceShip.h"
37#include "tools/Shader.h"
38
39namespace orxonox
40{
41    CreateFactory(Engine);
42
43    Engine::Engine(BaseObject* creator) : Item(creator)
44    {
45        RegisterObject(Engine);
46
47        this->ship_ = 0;
48        this->shipID_ = OBJECTID_UNKNOWN;
49
50        this->boostFactor_ = 1.5;
51        this->speedFactor_ = 1.0;
52
53        this->maxSpeedFront_ = 0.0;
54        this->maxSpeedBack_ = 0.0;
55        this->maxSpeedLeftRight_ = 0.0;
56        this->maxSpeedUpDown_ = 0.0;
57
58        this->accelerationFront_ = 0.0;
59        this->accelerationBrake_ = 0.0;
60        this->accelerationBack_ = 0.0;
61        this->accelerationLeftRight_ = 0.0;
62        this->accelerationUpDown_ = 0.0;
63
64        this->boostBlur_ = 0;
65
66        this->speedAdd_ = 0.0;
67        this->speedMultiply_ = 1.0;
68
69        this->setConfigValues();
70        this->registerVariables();
71    }
72
73    Engine::~Engine()
74    {
75        if (this->isInitialized() && this->ship_)
76        {
77            this->ship_->setEngine(0);
78
79            if (this->boostBlur_)
80                this->boostBlur_->destroy();
81        }
82    }
83
84    void Engine::XMLPort(Element& xmlelement, XMLPort::Mode mode)
85    {
86        SUPER(Engine, XMLPort, xmlelement, mode);
87
88        XMLPortParam(Engine, "boostfactor", setBoostFactor, getBoostFactor, xmlelement, mode);
89
90        XMLPortParam(Engine, "speedfront",     setMaxSpeedFront,     setMaxSpeedFront,     xmlelement, mode);
91        XMLPortParam(Engine, "speedback",      setMaxSpeedBack,      setMaxSpeedBack,      xmlelement, mode);
92        XMLPortParam(Engine, "speedleftright", setMaxSpeedLeftRight, setMaxSpeedLeftRight, xmlelement, mode);
93        XMLPortParam(Engine, "speedupdown",    setMaxSpeedUpDown,    setMaxSpeedUpDown,    xmlelement, mode);
94
95        XMLPortParam(Engine, "accelerationfront",     setAccelerationFront,     setAccelerationFront,     xmlelement, mode);
96        XMLPortParam(Engine, "accelerationbrake",     setAccelerationBrake,     setAccelerationBrake,     xmlelement, mode);
97        XMLPortParam(Engine, "accelerationback",      setAccelerationBack,      setAccelerationBack,      xmlelement, mode);
98        XMLPortParam(Engine, "accelerationleftright", setAccelerationLeftRight, setAccelerationLeftRight, xmlelement, mode);
99        XMLPortParam(Engine, "accelerationupdown",    setAccelerationUpDown,    setAccelerationUpDown,    xmlelement, mode);
100    }
101
102    void Engine::setConfigValues()
103    {
104        SetConfigValue(blurStrength_, 3.0f);
105    }
106
107    void Engine::registerVariables()
108    {
109        registerVariable(this->shipID_, VariableDirection::ToClient, new NetworkCallback<Engine>(this, &Engine::networkcallback_shipID));
110
111        registerVariable(this->speedFactor_, VariableDirection::ToClient);
112        registerVariable(this->boostFactor_, VariableDirection::ToClient);
113
114        registerVariable(this->maxSpeedFront_,     VariableDirection::ToClient);
115        registerVariable(this->maxSpeedBack_,      VariableDirection::ToClient);
116        registerVariable(this->maxSpeedLeftRight_, VariableDirection::ToClient);
117        registerVariable(this->maxSpeedUpDown_,    VariableDirection::ToClient);
118
119        registerVariable(this->accelerationFront_,     VariableDirection::ToClient);
120        registerVariable(this->accelerationBrake_,     VariableDirection::ToClient);
121        registerVariable(this->accelerationBack_,      VariableDirection::ToClient);
122        registerVariable(this->accelerationLeftRight_, VariableDirection::ToClient);
123        registerVariable(this->accelerationUpDown_,    VariableDirection::ToClient);
124
125        registerVariable(this->speedAdd_, VariableDirection::ToClient);
126        registerVariable(this->speedMultiply_, VariableDirection::ToClient);
127    }
128
129    void Engine::networkcallback_shipID()
130    {
131        this->ship_ = 0;
132
133        if (this->shipID_ != OBJECTID_UNKNOWN)
134        {
135            Synchronisable* object = Synchronisable::getSynchronisable(this->shipID_);
136            if (object)
137                this->addToSpaceShip(orxonox_cast<SpaceShip*>(object));
138        }
139    }
140
141    void Engine::tick(float dt)
142    {
143        if (!this->ship_)
144        {
145            if (this->shipID_)
146            {
147                this->networkcallback_shipID();
148
149                if (!this->ship_)
150                    return;
151            }
152            else
153                return;
154        }
155
156        if (!this->isActive())
157            return;
158
159        SUPER(Engine, tick, dt);
160
161        const Vector3& direction = this->getDirection();
162        Vector3 velocity = this->ship_->getLocalVelocity();
163        Vector3 acceleration = Vector3::ZERO;
164
165        float factor = 1.0f / this->speedFactor_;
166        velocity *= factor;
167
168        if (direction.z < 0)
169        {
170            if (this->maxSpeedFront_ != 0)
171            {
172                float boostfactor = (this->ship_->getBoost() ? this->boostFactor_ : 1.0f);
173                acceleration.z = direction.z * this->accelerationFront_ * boostfactor * clamp((this->maxSpeedFront_ - -velocity.z/boostfactor) / this->maxSpeedFront_, 0.0f, 1.0f);
174            }
175        }
176        else if (direction.z > 0)
177        {
178            if (velocity.z < 0)
179                acceleration.z = direction.z * this->accelerationBrake_;
180            else if (this->maxSpeedBack_ != 0)
181                acceleration.z = direction.z * this->accelerationBack_ * clamp((this->maxSpeedBack_ - velocity.z) / this->maxSpeedBack_, 0.0f, 1.0f);
182        }
183
184        if (this->maxSpeedLeftRight_ != 0)
185        {
186            if (direction.x < 0)
187                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - -velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
188            else if (direction.x > 0)
189                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
190        }
191
192        if (this->maxSpeedUpDown_ != 0)
193        {
194            if (direction.y < 0)
195                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - -velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
196            else if (direction.y > 0)
197                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
198        }
199
200        this->ship_->setAcceleration(this->ship_->getOrientation() * (acceleration*this->getSpeedMultiply()+Vector3(0,0,-this->getSpeedAdd())));
201
202        if (!this->ship_->getPermanentBoost())
203            this->ship_->setBoost(false);
204        this->ship_->setSteeringDirection(Vector3::ZERO);
205
206        if (!this->boostBlur_ && this->ship_->hasLocalController() && this->ship_->hasHumanController())
207        {
208            this->boostBlur_ = new Shader(this->ship_->getScene()->getSceneManager());
209            this->boostBlur_->setCompositor("Radial Blur");
210        }
211
212        if (this->boostBlur_ && this->maxSpeedFront_ != 0 && this->boostFactor_ != 1)
213            this->boostBlur_->setParameter("Ogre/Compositor/Radial_Blur", 0, 0, "sampleStrength", this->blurStrength_ * clamp((-velocity.z - this->maxSpeedFront_) / ((this->boostFactor_ - 1) * this->maxSpeedFront_), 0.0f, 1.0f));
214    }
215
216    void Engine::changedActivity()
217    {
218        SUPER(Engine, changedActivity);
219
220        if (this->boostBlur_)
221            this->boostBlur_->setVisible(this->isVisible());
222    }
223
224    void Engine::addToSpaceShip(SpaceShip* ship)
225    {
226        this->ship_ = ship;
227
228        if (ship)
229        {
230            this->shipID_ = ship->getObjectID();
231            if (ship->getEngine() != this)
232                ship->setEngine(this);
233
234            if (this->boostBlur_)
235            {
236                this->boostBlur_->destroy();
237                this->boostBlur_ = 0;
238            }
239        }
240    }
241
242    const Vector3& Engine::getDirection() const
243    {
244        if (this->ship_)
245            return this->ship_->getSteeringDirection();
246        else
247            return Vector3::ZERO;
248    }
249
250    PickupCarrier* Engine::getCarrierParent(void)
251    {
252        return this->ship_;
253    }
254
255    const Vector3& Engine::getCarrierPosition(void)
256    {
257        return this->ship_->getWorldPosition();
258    }
259}
Note: See TracBrowser for help on using the repository browser.