Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/formation/src/orxonox/controllers/NewHumanController.cc @ 9215

Last change on this file since 9215 was 8990, checked in by jo, 13 years ago

Rough adding of both concepts. Further work on the states is needed. (single player bots are inactive at the moment)

  • 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{
[7284]53    SetConsoleCommand("NewHumanController", "changeMode", &NewHumanController::changeMode).keybindMode(KeybindMode::OnPress);
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
[8990]279    void NewHumanController::doFire(unsigned int firemode)//TODO??
[6033]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
[6143]293            HumanController::localController_s->getControllableEntity()->fire(firemode);
294
[6045]295    }
296
[6377]297    void NewHumanController::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage)
298    {
[8965]299        //Used in HumanController for formationFlight
300        HumanController::hit(originator,contactpoint,damage);
301       
[6377]302        if (this->showDamageOverlay_ && !this->controlPaused_ && this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
303        {
[6310]304            Vector3 posA;
[6377]305            if (originator)
[6310]306                posA = originator->getWorldPosition();
307            else
308                posA = multi_cast<Vector3>(contactpoint.getPositionWorldOnA());
309            //Vector3 posB = multi_cast<Vector3>(contactpoint.getPositionWorldOnB());
310            //posA and posB are almost identical
[6295]311
[6310]312            Vector3 relativeHit = this->getControllableEntity()->getWorldOrientation().UnitInverse() * (this->getControllableEntity()->getWorldPosition() - posA);
[6295]313
[6310]314            //back is z positive
315            //x is left positive
316            //y is down positive
317            relativeHit.normalise();
318
[6502]319            float threshold = 0.3f;
[6377]320            if (relativeHit.x > threshold) // Left
[6310]321            {
322                this->damageOverlayLeft_->show();
323                this->damageOverlayTL_ = this->damageOverlayTime_;
324                //this->damageOverlayLeft_->setBackgroundAlpha(0.3);
325            }
[6377]326            if (relativeHit.x < -threshold) //Right
[6310]327            {
328                this->damageOverlayRight_->show();
329                this->damageOverlayTR_ = this->damageOverlayTime_;
330                //this->damageOverlayRight_->setBackgroundAlpha(0.3);
331            }
[6377]332            if (relativeHit.y > threshold) //Top
[6310]333            {
[6312]334                this->damageOverlayBottom_->show();
335                this->damageOverlayTB_ = this->damageOverlayTime_;
[6310]336                //this->damageOverlayTop_->setBackgroundAlpha(0.3);
337            }
[6377]338            if (relativeHit.y < -threshold) //Bottom
[6310]339            {
[6312]340                this->damageOverlayTop_->show();
341                this->damageOverlayTT_ = this->damageOverlayTime_;
[6310]342                //this->damageOverlayBottom_->setBackgroundAlpha(0.3);
343            }
344        }
[6295]345    }
346
[6210]347    void NewHumanController::unfire()
348    {
349        if (NewHumanController::localController_s)
350            NewHumanController::localController_s->doUnfire();
351    }
352
353    void NewHumanController::doUnfire()
354    {
355        this->firemode_ = -1;
356        hideArrows();
357    }
358
[7859]359    void NewHumanController::centerCursor()
360    {
361        this->currentYaw_ = 0;
362        this->currentPitch_ = 0;
363
[8316]364        if( KeyBinderManager::exists() )
365            KeyBinderManager::getInstance().getCurrent()->resetMouseAxes();
[7859]366    }
367
[6111]368    void NewHumanController::updateTarget()
[6055]369    {
370        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
[6033]371
[6502]372        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]373
[6055]374        rsq->setRay(mouseRay);
375        rsq->setSortByDistance(true);
[6033]376
[6055]377        /*
378        Distance of objects:
379        ignore everything under 200 maybe even take 1000 as min distance to shoot at
[6033]380
[6055]381        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
382        they vanish only after a distance of 10'000
383        */
[6045]384
385
[6055]386        Ogre::RaySceneQueryResult& result = rsq->execute();
[6111]387        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
[7163]388        WorldEntity* myWe = static_cast<WorldEntity*>(this->getControllableEntity());
[6033]389
[6055]390        Ogre::RaySceneQueryResult::iterator itr;
391        for (itr = result.begin(); itr != result.end(); ++itr)
392        {
[8858]393//             orxout() << "testing object as target" << endl;
[7801]394            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" && itr->distance > 200)
[6045]395            {
[6055]396                // Try to cast the user pointer
[7163]397                WorldEntity* wePtr;
398                try
399                {
400                    wePtr = dynamic_cast<WorldEntity*>(Ogre::any_cast<OrxonoxClass*>(itr->movable->getUserAny()));
401                }
402                catch (...)
403                {
404                    continue;
405                }
406
407                // make sure we don't shoot ourselves
408                if( wePtr==myWe )
409                    continue;
410
[6055]411                if (wePtr)
412                {
[6377]413                    // go through all parents of object and look whether they are sightable or not
[6114]414                    bool isSightable = false;
415                    WorldEntity* parent = wePtr->getParent();
[6377]416                    while (parent)
[6114]417                    {
[7163]418                        if (this->targetMask_.isExcluded(parent->getIdentifier()) || parent==myWe)
[6114]419                        {
420                            parent = parent->getParent();
421                            continue;
422                        }
423                        else
424                        {
425                            isSightable = true;
426                            break;
427                        }
428                    }
[6377]429                    if (!isSightable)
[6055]430                        continue;
[6045]431                }
[6143]432
[6377]433                if (this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr)
[6116]434                    this->getControllableEntity()->setTarget(wePtr);
[6091]435
[6377]436                if (pawn)
[6143]437                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
438
[6195]439                //itr->movable->getParentSceneNode()->showBoundingBox(true);
[6111]440                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
441                return;
[6045]442            }
[6377]443        }
[6091]444
[6377]445        if (pawn)
[6111]446            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
[6143]447
448        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
449            this->getControllableEntity()->setTarget( 0 );
[6033]450
[6091]451        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
[6058]452        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
[6033]453    }
454
[6149]455    void NewHumanController::frontback(const Vector2& value)
456    {
[6173]457        this->accelerating_ = true;
[6149]458
[6173]459        //if (this->acceleration_ == 0)
[6377]460        HumanController::frontback(value);
[6149]461    }
462
[5993]463    void NewHumanController::yaw(const Vector2& value)
464    {
[6377]465        //SUPER(NewHumanController, yaw, value);
466        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
[6091]467            HumanController::yaw(value);
[6143]468
[7163]469        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
470            this->currentYaw_ = value.x;
[5979]471    }
[6055]472
[5993]473    void NewHumanController::pitch(const Vector2& value)
[5981]474    {
[6377]475        //SUPER(NewHumanController, pitch, value);
476        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
[6091]477            HumanController::pitch(value);
478
[7163]479        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
480            this->currentPitch_ = value.x;
[5981]481    }
[6091]482
[6149]483    void NewHumanController::changeMode()
484    {
[6365]485        if (NewHumanController::localController_s)
[6111]486        {
[6365]487            if (NewHumanController::localController_s->controlMode_ == 0)
488            {
[6111]489                NewHumanController::localController_s->controlMode_ = 1;
[6210]490                NewHumanController::localController_s->hideArrows();
[6365]491            }
492            else
493                NewHumanController::localController_s->controlMode_ = 0;
[6111]494        }
[6091]495    }
[6143]496
[6115]497    void NewHumanController::changedControllableEntity()
498    {
499        this->controlMode_ = 0;
[7859]500        this->centerCursor();
[6377]501        if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
[6236]502        {
503            this->showOverlays_ = true;
[6377]504            if (!this->controlPaused_)
[6236]505            {
506                this->showOverlays();
507                this->alignArrows();
508            }
509        }
510        else
511        {
512            this->showOverlays_ = false;
513            this->hideOverlays();
514        }
[6115]515    }
[6149]516
517    void NewHumanController::accelerate()
518    {
[6377]519        if (NewHumanController::localController_s)
[6173]520            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
[6149]521    }
522
523    void NewHumanController::decelerate()
524    {
[6377]525        if (NewHumanController::localController_s)
[6173]526            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
[6149]527    }
[6195]528
[6377]529    void NewHumanController::doResumeControl()
530    {
[6195]531        this->controlPaused_ = false;
[6377]532        if (this->showOverlays_)
[6236]533            this->showOverlays();
[6195]534    }
535
[6377]536    void NewHumanController::doPauseControl()
537    {
[6195]538        this->controlPaused_ = true;
[6236]539        this->hideOverlays();
[6195]540    }
[6210]541
[6377]542    void NewHumanController::alignArrows()
543    {
544        if (showArrows_)
545        {
[6210]546            hideArrows();
[6387]547
[6210]548            float distance = sqrt(pow(static_cast<float>(this->currentYaw_)/2*-1,2) + pow(static_cast<float>(this->currentPitch_)/2*-1,2));
[6387]549
[6502]550            if (distance > 0.04f && distance <= 0.59f * arrowsSize_ / 2.0f )
[6377]551            {
[8351]552                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]553                this->arrowsOverlay1_->show();
554            }
[6502]555            else if (distance > 0.59f * arrowsSize_ / 2.0f && distance <= 0.77f * arrowsSize_ / 2.0f )
[6377]556            {
[8351]557                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]558                this->arrowsOverlay2_->show();
559            }
[6502]560            else if (distance > 0.77f * arrowsSize_ / 2.0f && distance <= arrowsSize_ / 2.0f)
[6377]561            {
[8351]562                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]563                this->arrowsOverlay3_->show();
564            }
[6502]565            else if (distance > arrowsSize_ / 2.0f)
[6377]566            {
[8351]567                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]568                this->arrowsOverlay4_->show();
569            }
570        }
571    }
572
[6377]573    void NewHumanController::showOverlays()
574    {
575        if (!GameMode::showsGraphics())
[6320]576            return;
[6236]577        this->crossHairOverlay_->show();
578        this->centerOverlay_->show();
[6289]579
[6377]580        if (showArrows_)
581        {
[6236]582            this->arrowsOverlay1_->show();
583            this->arrowsOverlay2_->show();
584            this->arrowsOverlay3_->show();
585            this->arrowsOverlay4_->show();
586        }
587    }
588
[6377]589    void NewHumanController::hideOverlays()
590    {
591        if (!GameMode::showsGraphics())
[6320]592            return;
[6236]593        this->crossHairOverlay_->hide();
594        this->centerOverlay_->hide();
[6289]595
[6377]596        if (showDamageOverlay_)
597        {
[6310]598            this->damageOverlayTop_->hide();
599            this->damageOverlayRight_->hide();
600            this->damageOverlayBottom_->hide();
601            this->damageOverlayLeft_->hide();
602        }
603
[6236]604        this->hideArrows();
605    }
606
[6377]607    void NewHumanController::hideArrows()
608    {
609        if(!GameMode::showsGraphics())
[6320]610            return;
[6377]611        if (showArrows_)
612        {
[6210]613            this->arrowsOverlay1_->hide();
614            this->arrowsOverlay2_->hide();
615            this->arrowsOverlay3_->hide();
616            this->arrowsOverlay4_->hide();
617        }
618    }
[7163]619
620
621
622
623
[5979]624}
Note: See TracBrowser for help on using the repository browser.