Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/orxonox/controllers/NewHumanController.cc @ 6372

Last change on this file since 6372 was 6365, checked in by rgrieder, 15 years ago

Fixed segfault (when hitting tab in main menu) and second mode problem in NewHumanController.
The mode fix is temporary because it triggers another minor bug with the game pad.

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