Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutoriallevel3/src/orxonox/items/Engine.cc @ 8637

Last change on this file since 8637 was 8079, checked in by landauf, 14 years ago

merged usability branch back to trunk

incomplete summary of the changes in this branch:

  • enhanced keyboard navigation in GUIs
  • implemented new graphics menu and changeable window size at runtime
  • added developer mode
  • HUD shows if game is paused, game pauses if ingame menu is opened
  • removed a few obsolete commands and hid some that are more for internal use
  • numpad works in console and gui
  • faster loading of level info
  • enhanced usage of compositors (Shader class)
  • improved camera handling, configurable FOV and aspect ratio
  • Property svn:eol-style set to native
File size: 9.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 *      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        SetConfigValueExternal(bEnableMotionBlur_, "GraphicsSettings", "enableMotionBlur", true)
105            .description("Enable or disable the motion blur effect when moving very fast")
106            .callback(this, &Engine::changedEnableMotionBlur);
107        SetConfigValueExternal(blurStrength_, "GraphicsSettings", "blurStrength", 3.0f)
108            .description("Defines the strength of the motion blur effect");
109    }
110
111    void Engine::registerVariables()
112    {
113        registerVariable(this->shipID_, VariableDirection::ToClient, new NetworkCallback<Engine>(this, &Engine::networkcallback_shipID));
114
115        registerVariable(this->speedFactor_, VariableDirection::ToClient);
116        registerVariable(this->boostFactor_, VariableDirection::ToClient);
117
118        registerVariable(this->maxSpeedFront_,     VariableDirection::ToClient);
119        registerVariable(this->maxSpeedBack_,      VariableDirection::ToClient);
120        registerVariable(this->maxSpeedLeftRight_, VariableDirection::ToClient);
121        registerVariable(this->maxSpeedUpDown_,    VariableDirection::ToClient);
122
123        registerVariable(this->accelerationFront_,     VariableDirection::ToClient);
124        registerVariable(this->accelerationBrake_,     VariableDirection::ToClient);
125        registerVariable(this->accelerationBack_,      VariableDirection::ToClient);
126        registerVariable(this->accelerationLeftRight_, VariableDirection::ToClient);
127        registerVariable(this->accelerationUpDown_,    VariableDirection::ToClient);
128
129        registerVariable(this->speedAdd_, VariableDirection::ToClient);
130        registerVariable(this->speedMultiply_, VariableDirection::ToClient);
131    }
132
133    void Engine::networkcallback_shipID()
134    {
135        this->ship_ = 0;
136
137        if (this->shipID_ != OBJECTID_UNKNOWN)
138        {
139            Synchronisable* object = Synchronisable::getSynchronisable(this->shipID_);
140            if (object)
141                this->addToSpaceShip(orxonox_cast<SpaceShip*>(object));
142        }
143    }
144
145    void Engine::tick(float dt)
146    {
147        if (!this->ship_)
148        {
149            if (this->shipID_)
150            {
151                this->networkcallback_shipID();
152
153                if (!this->ship_)
154                    return;
155            }
156            else
157                return;
158        }
159
160        if (!this->isActive())
161            return;
162
163        SUPER(Engine, tick, dt);
164
165        const Vector3& direction = this->getDirection();
166        Vector3 velocity = this->ship_->getLocalVelocity();
167        Vector3 acceleration = Vector3::ZERO;
168
169        float factor = 1.0f / this->speedFactor_;
170        velocity *= factor;
171
172        if (direction.z < 0)
173        {
174            if (this->maxSpeedFront_ != 0)
175            {
176                float boostfactor = (this->ship_->getBoost() ? this->boostFactor_ : 1.0f);
177                acceleration.z = direction.z * this->accelerationFront_ * boostfactor * clamp((this->maxSpeedFront_ - -velocity.z/boostfactor) / this->maxSpeedFront_, 0.0f, 1.0f);
178            }
179        }
180        else if (direction.z > 0)
181        {
182            if (velocity.z < 0)
183                acceleration.z = direction.z * this->accelerationBrake_;
184            else if (this->maxSpeedBack_ != 0)
185                acceleration.z = direction.z * this->accelerationBack_ * clamp((this->maxSpeedBack_ - velocity.z) / this->maxSpeedBack_, 0.0f, 1.0f);
186        }
187
188        if (this->maxSpeedLeftRight_ != 0)
189        {
190            if (direction.x < 0)
191                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - -velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
192            else if (direction.x > 0)
193                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
194        }
195
196        if (this->maxSpeedUpDown_ != 0)
197        {
198            if (direction.y < 0)
199                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - -velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
200            else if (direction.y > 0)
201                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
202        }
203
204        this->ship_->setAcceleration(this->ship_->getOrientation() * (acceleration*this->getSpeedMultiply()+Vector3(0,0,-this->getSpeedAdd())));
205
206        if (!this->ship_->getPermanentBoost())
207            this->ship_->setBoost(false);
208        this->ship_->setSteeringDirection(Vector3::ZERO);
209
210        if (this->bEnableMotionBlur_ && !this->boostBlur_ && this->ship_->hasLocalController() && this->ship_->hasHumanController())
211        {
212            this->boostBlur_ = new Shader(this->ship_->getScene()->getSceneManager());
213            this->boostBlur_->setCompositorName("Radial Blur");
214        }
215
216        if (this->boostBlur_ && this->maxSpeedFront_ != 0 && this->boostFactor_ != 1)
217        {
218            float blur = this->blurStrength_ * clamp((-velocity.z - this->maxSpeedFront_) / ((this->boostFactor_ - 1) * this->maxSpeedFront_), 0.0f, 1.0f);
219
220            this->boostBlur_->setVisible(blur > 0);
221            this->boostBlur_->setParameter(0, 0, "sampleStrength", blur);
222        }
223    }
224
225    void Engine::changedActivity()
226    {
227        SUPER(Engine, changedActivity);
228
229        if (this->boostBlur_)
230            this->boostBlur_->setVisible(this->isVisible());
231    }
232
233    void Engine::addToSpaceShip(SpaceShip* ship)
234    {
235        this->ship_ = ship;
236
237        if (ship)
238        {
239            this->shipID_ = ship->getObjectID();
240            if (ship->getEngine() != this)
241                ship->setEngine(this);
242
243            if (this->boostBlur_)
244            {
245                this->boostBlur_->destroy();
246                this->boostBlur_ = 0;
247            }
248        }
249    }
250
251    const Vector3& Engine::getDirection() const
252    {
253        if (this->ship_)
254            return this->ship_->getSteeringDirection();
255        else
256            return Vector3::ZERO;
257    }
258
259    PickupCarrier* Engine::getCarrierParent(void) const
260    {
261        return this->ship_;
262    }
263
264    const Vector3& Engine::getCarrierPosition(void) const
265    {
266        return this->ship_->getWorldPosition();
267    }
268
269    void Engine::changedEnableMotionBlur()
270    {
271        if (!this->bEnableMotionBlur_)
272        {
273            this->boostBlur_->destroy();
274            this->boostBlur_ = 0;
275        }
276    }
277}
Note: See TracBrowser for help on using the repository browser.