Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/release2012/src/orxonox/controllers/NewHumanController.cc @ 10241

Last change on this file since 10241 was 9368, checked in by jo, 12 years ago

Trying to change the mouselook keybinding according to the suggestion in the forum. BUT the outcome stays the same.

  • Property svn:eol-style set to native
File size: 24.2 KB
RevLine 
[5979]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:
[5981]23 *      Michael Wirth
[5979]24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "NewHumanController.h"
30
[6256]31#include <cmath>
[6033]32#include <OgreRay.h>
33#include <OgreSceneQuery.h>
34#include <OgreCamera.h>
35#include <OgreSceneManager.h>
[6377]36#include <bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h>
[5981]37
[5979]38#include "core/CoreIncludes.h"
[7284]39#include "core/command/ConsoleCommand.h"
[7859]40#include "core/input/KeyBinder.h"
41#include "core/input/KeyBinderManager.h"
[5979]42#include "worldentities/ControllableEntity.h"
[6111]43#include "worldentities/pawns/Pawn.h"
[5979]44#include "infos/PlayerInfo.h"
[6055]45#include "overlays/OrxonoxOverlay.h"
[5979]46#include "graphics/Camera.h"
47#include "sound/SoundManager.h"
[6377]48#include "tools/BulletConversions.h"
[5979]49#include "Scene.h"
50
51namespace orxonox
52{
[9368]53    SetConsoleCommand("NewHumanController", "changeMode", &NewHumanController::changeMode).keybindMode(KeybindMode::OnPress); //disabled
[7284]54    SetConsoleCommand("NewHumanController", "accelerate", &NewHumanController::accelerate).keybindMode(KeybindMode::OnPress);
55    SetConsoleCommand("NewHumanController", "decelerate", &NewHumanController::decelerate).keybindMode(KeybindMode::OnPress);
56    SetConsoleCommand("NewHumanController", "unfire",     &NewHumanController::unfire    ).keybindMode(KeybindMode::OnRelease).addShortcut();
[6091]57
[5979]58    CreateUnloadableFactory(NewHumanController);
59
[6091]60    NewHumanController* NewHumanController::localController_s = 0;
61
[6122]62    NewHumanController::NewHumanController(BaseObject* creator)
63        : HumanController(creator)
64        , crossHairOverlay_(NULL)
[6195]65        , centerOverlay_(NULL)
[6320]66        , damageOverlayTop_(NULL)
67        , damageOverlayRight_(NULL)
68        , damageOverlayBottom_(NULL)
69        , damageOverlayLeft_(NULL)
70        , damageOverlayTT_(0)
[8436]71        , damageOverlayTR_(0)
72        , damageOverlayTB_(0)
73        , damageOverlayTL_(0)
[6328]74        , arrowsOverlay1_(NULL)
75        , arrowsOverlay2_(NULL)
76        , arrowsOverlay3_(NULL)
77        , arrowsOverlay4_(NULL)
[5979]78    {
79        RegisterObject(NewHumanController);
[6001]80
[6502]81        overlaySize_ = 0.08f;
82        arrowsSize_ = 0.4f;
[6310]83
[6502]84        damageOverlayTime_ = 0.6f;
[6310]85
[6055]86        controlMode_ = 0;
[6149]87        acceleration_ = 0;
[6236]88        accelerating_ = false;
[6210]89        firemode_ = -1;
[6310]90
[6210]91        showArrows_ = true;
[6236]92        showOverlays_ = false;
[6310]93        showDamageOverlay_ = true;
[6033]94
[6149]95        //currentPitch_ = 1;
96        //currentYaw_ = 1;
97
[6122]98        if (GameMode::showsGraphics())
99        {
100            crossHairOverlay_ = new OrxonoxOverlay(this);
101            crossHairOverlay_->setBackgroundMaterial("Orxonox/Crosshair3");
102            crossHairOverlay_->setSize(Vector2(overlaySize_, overlaySize_));
[6195]103            crossHairOverlay_->hide();
[6210]104            //crossHairOverlay_->setAspectCorrection(true); not working
[6195]105
106            centerOverlay_ = new OrxonoxOverlay(this);
107            centerOverlay_->setBackgroundMaterial("Orxonox/CenterOverlay");
[6502]108            centerOverlay_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
109            centerOverlay_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
[6195]110            centerOverlay_->hide();
[6210]111
[6377]112            if (showDamageOverlay_)
[6210]113            {
[6310]114                damageOverlayTop_ = new OrxonoxOverlay(this);
115                damageOverlayTop_->setBackgroundMaterial("Orxonox/DamageOverlayTop");
[6502]116                damageOverlayTop_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
117                damageOverlayTop_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
[6310]118                damageOverlayTop_->hide();
119
120                damageOverlayRight_ = new OrxonoxOverlay(this);
121                damageOverlayRight_->setBackgroundMaterial("Orxonox/DamageOverlayRight");
[6502]122                damageOverlayRight_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
123                damageOverlayRight_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
[6310]124                damageOverlayRight_->hide();
125
126                damageOverlayBottom_ = new OrxonoxOverlay(this);
127                damageOverlayBottom_->setBackgroundMaterial("Orxonox/DamageOverlayBottom");
[6502]128                damageOverlayBottom_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
129                damageOverlayBottom_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
[6310]130                damageOverlayBottom_->hide();
131
132                damageOverlayLeft_ = new OrxonoxOverlay(this);
133                damageOverlayLeft_->setBackgroundMaterial("Orxonox/DamageOverlayLeft");
[6502]134                damageOverlayLeft_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
135                damageOverlayLeft_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
[6310]136                damageOverlayLeft_->hide();
137            }
138
[6377]139            if (showArrows_)
[6310]140            {
[6210]141                arrowsOverlay1_ = new OrxonoxOverlay(this);
[6289]142                arrowsOverlay1_->setBackgroundMaterial("Orxonox/DirectionArrows1");
[6502]143                arrowsOverlay1_->setSize(Vector2(0.02727f, 0.36f * arrowsSize_));
144                arrowsOverlay1_->setPickPoint(Vector2(0.5f, 0.5f));
145                arrowsOverlay1_->setPosition(Vector2(0.5f, 0.5f));
[6210]146                arrowsOverlay1_->hide();
[6387]147
[6210]148                arrowsOverlay2_ = new OrxonoxOverlay(this);
[6289]149                arrowsOverlay2_->setBackgroundMaterial("Orxonox/DirectionArrows2");
[6502]150                arrowsOverlay2_->setSize(Vector2(0.02727f, 0.59f * arrowsSize_));
151                arrowsOverlay2_->setPickPoint(Vector2(0.5f, 0.5f));
152                arrowsOverlay2_->setPosition(Vector2(0.5f, 0.5f));
[6210]153                arrowsOverlay2_->hide();
[6387]154
[6210]155                arrowsOverlay3_ = new OrxonoxOverlay(this);
[6289]156                arrowsOverlay3_->setBackgroundMaterial("Orxonox/DirectionArrows3");
[6502]157                arrowsOverlay3_->setSize(Vector2(0.02727f, 0.77f * arrowsSize_));
158                arrowsOverlay3_->setPickPoint(Vector2(0.5f, 0.5f));
159                arrowsOverlay3_->setPosition(Vector2(0.5f, 0.5f));
[6210]160                arrowsOverlay3_->hide();
[6387]161
[6210]162                arrowsOverlay4_ = new OrxonoxOverlay(this);
[6289]163                arrowsOverlay4_->setBackgroundMaterial("Orxonox/DirectionArrows4");
[6502]164                arrowsOverlay4_->setSize(Vector2(0.02727f, arrowsSize_));
165                arrowsOverlay4_->setPickPoint(Vector2(0.5f, 0.5f));
166                arrowsOverlay4_->setPosition(Vector2(0.5f, 0.5f));
[6210]167                arrowsOverlay4_->hide();
168            }
[6122]169        }
[6045]170
[6058]171        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
[6055]172        this->targetMask_.exclude(ClassByString("BaseObject"));
173        this->targetMask_.include(ClassByString("WorldEntity"));
174        this->targetMask_.exclude(ClassByString("Projectile"));
[6091]175
176        NewHumanController::localController_s = this;
[6195]177
[6236]178        controlPaused_ = false;
[6210]179
[6377]180        //HumanController::localController_s->getControllableEntity()->getCamera()->setDrag(true);
[5979]181    }
182
183    NewHumanController::~NewHumanController()
184    {
[6055]185        if (this->isInitialized())
[5981]186        {
[6122]187            if (this->crossHairOverlay_)
188                this->crossHairOverlay_->destroy();
[6210]189            if (this->centerOverlay_)
190                this->centerOverlay_->destroy();
191
[6598]192            if (this->arrowsOverlay1_)
193                this->arrowsOverlay1_->destroy();
194            if (this->arrowsOverlay2_)
195                this->arrowsOverlay2_->destroy();
196            if (this->arrowsOverlay3_)
197                this->arrowsOverlay3_->destroy();
198            if (this->arrowsOverlay4_)
199                this->arrowsOverlay4_->destroy();
200            if (this->damageOverlayTop_)
201                this->damageOverlayTop_->destroy();
202            if (this->damageOverlayLeft_)
203                this->damageOverlayLeft_->destroy();
204            if (this->damageOverlayRight_)
205                this->damageOverlayRight_->destroy();
206            if (this->damageOverlayBottom_)
207                this->damageOverlayBottom_->destroy();
[5981]208        }
[5979]209    }
210
[6055]211    void NewHumanController::tick(float dt)
212    {
[6122]213        if (GameMode::showsGraphics())
[6111]214        {
[6210]215
[6377]216            if (this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
[6122]217            {
[6157]218                this->updateTarget();
[6289]219
[6377]220                if (!controlPaused_ )
221                {
222                    if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
[6289]223                        this->showOverlays();
[7163]224                    else if (this->getControllableEntity() &&  this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
225                    {
226                        this->showOverlays();
227                        this->hideArrows();
228                    }
[6289]229
[6502]230                    this->crossHairOverlay_->setPosition(Vector2(static_cast<float>(this->currentYaw_)/2*-1+.5f-overlaySize_/2, static_cast<float>(this->currentPitch_)/2*-1+.5f-overlaySize_/2));
[6210]231
[6377]232                    if (this->controlMode_ == 0 || (this->controlMode_ == 1 && this->firemode_ == 1))
[6236]233                    {
[6377]234                        if (this->showOverlays_ && this->showArrows_)
[6236]235                            alignArrows();
236                    }
[6210]237                    else
238                        hideArrows();
[6310]239
[6377]240                    if (this->showDamageOverlay_ && (this->damageOverlayTT_ > 0 || this->damageOverlayTR_ > 0 || this->damageOverlayTB_ > 0 || this->damageOverlayTL_ > 0))
241                    {
[6310]242                        this->damageOverlayTT_ -= dt;
243                        this->damageOverlayTR_ -= dt;
244                        this->damageOverlayTB_ -= dt;
245                        this->damageOverlayTL_ -= dt;
[6377]246                        if (this->damageOverlayTT_ <= 0)
[6310]247                            this->damageOverlayTop_->hide();
[6377]248                        if (this->damageOverlayTR_ <= 0)
[6310]249                            this->damageOverlayRight_->hide();
[6377]250                        if (this->damageOverlayTB_ <= 0)
[6310]251                            this->damageOverlayBottom_->hide();
[6377]252                        if (this->damageOverlayTL_ <= 0)
[6310]253                            this->damageOverlayLeft_->hide();
254                    }
[6195]255                }
[6122]256            }
[6279]257            else
258                this->hideOverlays();
[6210]259
[6377]260            if (this->acceleration_ > 0)
[6173]261            {
[6377]262                if (this->accelerating_)
[6173]263                    HumanController::moveFrontBack(Vector2(1, 0));
264                else
[6388]265                    HumanController::moveFrontBack(Vector2(this->acceleration_, 0));
[6173]266                this->accelerating_ = false;
267                //HumanController::moveFrontBack(Vector2(clamp(this->acceleration_ + this->currentAcceleration_, 0.0f, 1.0f), 0));
268            }
[6111]269        }
[6001]270
[6360]271        // Reset pitch and yaw rates
[6365]272        // TODO: Reactivate this to fix the game pad problem with 0 input
273        //this->currentPitch_ = 0;
274        //this->currentYaw_ = 0;
[6360]275
[6001]276        HumanController::tick(dt);
277    }
278
[6033]279    void NewHumanController::doFire(unsigned int firemode)
280    {
[6377]281        if (!this->controllableEntity_)
[6316]282            return;
[6033]283
[6210]284        this->firemode_ = firemode;
285
[6157]286        if (firemode == 1 && this->controlMode_ == 1)
287        {
[6143]288            //unlocked steering, steer on right mouse click
[6144]289            HumanController::yaw(Vector2(this->currentYaw_, 0));
290            HumanController::pitch(Vector2(this->currentPitch_, 0));
[6143]291        }
[6157]292        else
[9016]293            HumanController::doFire(firemode); //call for formationflight
[6045]294    }
295
[6377]296    void NewHumanController::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage)
297    {
[9016]298        //Used in HumanController for formationFlight
299        HumanController::hit(originator,contactpoint,damage);
[9348]300
[6377]301        if (this->showDamageOverlay_ && !this->controlPaused_ && this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
302        {
[6310]303            Vector3 posA;
[6377]304            if (originator)
[6310]305                posA = originator->getWorldPosition();
306            else
307                posA = multi_cast<Vector3>(contactpoint.getPositionWorldOnA());
308            //Vector3 posB = multi_cast<Vector3>(contactpoint.getPositionWorldOnB());
309            //posA and posB are almost identical
[6295]310
[6310]311            Vector3 relativeHit = this->getControllableEntity()->getWorldOrientation().UnitInverse() * (this->getControllableEntity()->getWorldPosition() - posA);
[6295]312
[6310]313            //back is z positive
314            //x is left positive
315            //y is down positive
316            relativeHit.normalise();
317
[6502]318            float threshold = 0.3f;
[6377]319            if (relativeHit.x > threshold) // Left
[6310]320            {
321                this->damageOverlayLeft_->show();
322                this->damageOverlayTL_ = this->damageOverlayTime_;
323                //this->damageOverlayLeft_->setBackgroundAlpha(0.3);
324            }
[6377]325            if (relativeHit.x < -threshold) //Right
[6310]326            {
327                this->damageOverlayRight_->show();
328                this->damageOverlayTR_ = this->damageOverlayTime_;
329                //this->damageOverlayRight_->setBackgroundAlpha(0.3);
330            }
[6377]331            if (relativeHit.y > threshold) //Top
[6310]332            {
[6312]333                this->damageOverlayBottom_->show();
334                this->damageOverlayTB_ = this->damageOverlayTime_;
[6310]335                //this->damageOverlayTop_->setBackgroundAlpha(0.3);
336            }
[6377]337            if (relativeHit.y < -threshold) //Bottom
[6310]338            {
[6312]339                this->damageOverlayTop_->show();
340                this->damageOverlayTT_ = this->damageOverlayTime_;
[6310]341                //this->damageOverlayBottom_->setBackgroundAlpha(0.3);
342            }
343        }
[6295]344    }
345
[6210]346    void NewHumanController::unfire()
347    {
348        if (NewHumanController::localController_s)
349            NewHumanController::localController_s->doUnfire();
350    }
351
352    void NewHumanController::doUnfire()
353    {
354        this->firemode_ = -1;
355        hideArrows();
356    }
357
[7859]358    void NewHumanController::centerCursor()
359    {
360        this->currentYaw_ = 0;
361        this->currentPitch_ = 0;
362
[8316]363        if( KeyBinderManager::exists() )
364            KeyBinderManager::getInstance().getCurrent()->resetMouseAxes();
[7859]365    }
366
[6111]367    void NewHumanController::updateTarget()
[6055]368    {
369        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
[6033]370
[6502]371        Ogre::Ray mouseRay = HumanController::localController_s->getControllableEntity()->getCamera()->getOgreCamera()->getCameraToViewportRay(static_cast<float>(this->currentYaw_)/2*-1+.5f, static_cast<float>(this->currentPitch_)/2*-1+.5f);
[6033]372
[6055]373        rsq->setRay(mouseRay);
374        rsq->setSortByDistance(true);
[6033]375
[6055]376        /*
377        Distance of objects:
378        ignore everything under 200 maybe even take 1000 as min distance to shoot at
[6033]379
[6055]380        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
381        they vanish only after a distance of 10'000
382        */
[6045]383
384
[6055]385        Ogre::RaySceneQueryResult& result = rsq->execute();
[6111]386        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
[7163]387        WorldEntity* myWe = static_cast<WorldEntity*>(this->getControllableEntity());
[6033]388
[6055]389        Ogre::RaySceneQueryResult::iterator itr;
390        for (itr = result.begin(); itr != result.end(); ++itr)
391        {
[8858]392//             orxout() << "testing object as target" << endl;
[7801]393            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" && itr->distance > 200)
[6045]394            {
[6055]395                // Try to cast the user pointer
[7163]396                WorldEntity* wePtr;
397                try
398                {
[9348]399                    wePtr = orxonox_cast<WorldEntity*>(Ogre::any_cast<OrxonoxClass*>(itr->movable->getUserAny()));
[7163]400                }
401                catch (...)
402                {
403                    continue;
404                }
405
406                // make sure we don't shoot ourselves
407                if( wePtr==myWe )
408                    continue;
409
[6055]410                if (wePtr)
411                {
[6377]412                    // go through all parents of object and look whether they are sightable or not
[6114]413                    bool isSightable = false;
414                    WorldEntity* parent = wePtr->getParent();
[6377]415                    while (parent)
[6114]416                    {
[7163]417                        if (this->targetMask_.isExcluded(parent->getIdentifier()) || parent==myWe)
[6114]418                        {
419                            parent = parent->getParent();
420                            continue;
421                        }
422                        else
423                        {
424                            isSightable = true;
425                            break;
426                        }
427                    }
[6377]428                    if (!isSightable)
[6055]429                        continue;
[6045]430                }
[6143]431
[6377]432                if (this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr)
[6116]433                    this->getControllableEntity()->setTarget(wePtr);
[6091]434
[6377]435                if (pawn)
[6143]436                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
437
[6195]438                //itr->movable->getParentSceneNode()->showBoundingBox(true);
[6111]439                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
440                return;
[6045]441            }
[6377]442        }
[6091]443
[6377]444        if (pawn)
[6111]445            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
[6143]446
447        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
448            this->getControllableEntity()->setTarget( 0 );
[6033]449
[6091]450        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
[6058]451        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
[6033]452    }
453
[6149]454    void NewHumanController::frontback(const Vector2& value)
455    {
[6173]456        this->accelerating_ = true;
[6149]457
[6173]458        //if (this->acceleration_ == 0)
[6377]459        HumanController::frontback(value);
[6149]460    }
461
[5993]462    void NewHumanController::yaw(const Vector2& value)
463    {
[6377]464        //SUPER(NewHumanController, yaw, value);
465        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
[6091]466            HumanController::yaw(value);
[6143]467
[7163]468        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
469            this->currentYaw_ = value.x;
[5979]470    }
[6055]471
[5993]472    void NewHumanController::pitch(const Vector2& value)
[5981]473    {
[6377]474        //SUPER(NewHumanController, pitch, value);
475        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
[6091]476            HumanController::pitch(value);
477
[7163]478        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
479            this->currentPitch_ = value.x;
[5981]480    }
[6091]481
[6149]482    void NewHumanController::changeMode()
483    {
[9367]484        /*if (NewHumanController::localController_s)
[6111]485        {
[6365]486            if (NewHumanController::localController_s->controlMode_ == 0)
487            {
[6111]488                NewHumanController::localController_s->controlMode_ = 1;
[6210]489                NewHumanController::localController_s->hideArrows();
[6365]490            }
491            else
492                NewHumanController::localController_s->controlMode_ = 0;
[9367]493        }*/ //BRUTE FORCE: Turn off free aiming
[6091]494    }
[6143]495
[6115]496    void NewHumanController::changedControllableEntity()
497    {
498        this->controlMode_ = 0;
[7859]499        this->centerCursor();
[6377]500        if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
[6236]501        {
502            this->showOverlays_ = true;
[6377]503            if (!this->controlPaused_)
[6236]504            {
505                this->showOverlays();
506                this->alignArrows();
507            }
508        }
509        else
510        {
511            this->showOverlays_ = false;
512            this->hideOverlays();
513        }
[6115]514    }
[6149]515
516    void NewHumanController::accelerate()
517    {
[6377]518        if (NewHumanController::localController_s)
[6173]519            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
[6149]520    }
521
522    void NewHumanController::decelerate()
523    {
[6377]524        if (NewHumanController::localController_s)
[6173]525            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
[6149]526    }
[6195]527
[6377]528    void NewHumanController::doResumeControl()
529    {
[6195]530        this->controlPaused_ = false;
[6377]531        if (this->showOverlays_)
[6236]532            this->showOverlays();
[6195]533    }
534
[6377]535    void NewHumanController::doPauseControl()
536    {
[6195]537        this->controlPaused_ = true;
[6236]538        this->hideOverlays();
[6195]539    }
[6210]540
[6377]541    void NewHumanController::alignArrows()
542    {
543        if (showArrows_)
544        {
[6210]545            hideArrows();
[6387]546
[6210]547            float distance = sqrt(pow(static_cast<float>(this->currentYaw_)/2*-1,2) + pow(static_cast<float>(this->currentPitch_)/2*-1,2));
[6387]548
[6502]549            if (distance > 0.04f && distance <= 0.59f * arrowsSize_ / 2.0f )
[6377]550            {
[8351]551                this->arrowsOverlay1_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / math::twoPi * 360.0f));
[6210]552                this->arrowsOverlay1_->show();
553            }
[6502]554            else if (distance > 0.59f * arrowsSize_ / 2.0f && distance <= 0.77f * arrowsSize_ / 2.0f )
[6377]555            {
[8351]556                this->arrowsOverlay2_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / math::twoPi * 360.0f));
[6210]557                this->arrowsOverlay2_->show();
558            }
[6502]559            else if (distance > 0.77f * arrowsSize_ / 2.0f && distance <= arrowsSize_ / 2.0f)
[6377]560            {
[8351]561                this->arrowsOverlay3_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / math::twoPi * 360.0f));
[6210]562                this->arrowsOverlay3_->show();
563            }
[6502]564            else if (distance > arrowsSize_ / 2.0f)
[6377]565            {
[8351]566                this->arrowsOverlay4_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / math::twoPi * 360.0f));
[6210]567                this->arrowsOverlay4_->show();
568            }
569        }
570    }
571
[6377]572    void NewHumanController::showOverlays()
573    {
574        if (!GameMode::showsGraphics())
[6320]575            return;
[6236]576        this->crossHairOverlay_->show();
577        this->centerOverlay_->show();
[6289]578
[6377]579        if (showArrows_)
580        {
[6236]581            this->arrowsOverlay1_->show();
582            this->arrowsOverlay2_->show();
583            this->arrowsOverlay3_->show();
584            this->arrowsOverlay4_->show();
585        }
586    }
587
[6377]588    void NewHumanController::hideOverlays()
589    {
590        if (!GameMode::showsGraphics())
[6320]591            return;
[6236]592        this->crossHairOverlay_->hide();
593        this->centerOverlay_->hide();
[6289]594
[6377]595        if (showDamageOverlay_)
596        {
[6310]597            this->damageOverlayTop_->hide();
598            this->damageOverlayRight_->hide();
599            this->damageOverlayBottom_->hide();
600            this->damageOverlayLeft_->hide();
601        }
602
[6236]603        this->hideArrows();
604    }
605
[6377]606    void NewHumanController::hideArrows()
607    {
608        if(!GameMode::showsGraphics())
[6320]609            return;
[6377]610        if (showArrows_)
611        {
[6210]612            this->arrowsOverlay1_->hide();
613            this->arrowsOverlay2_->hide();
614            this->arrowsOverlay3_->hide();
615            this->arrowsOverlay4_->hide();
616        }
617    }
[7163]618
619
620
621
622
[5979]623}
Note: See TracBrowser for help on using the repository browser.