Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6365 was 6365, checked in by rgrieder, 14 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
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 *      Michael Wirth
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "NewHumanController.h"
30
31#include <cmath>
32#include <OgreRay.h>
33#include <OgreSceneQuery.h>
34#include <OgreCamera.h>
35#include <OgreSceneManager.h>
36
37#include "core/CoreIncludes.h"
38#include "core/ConsoleCommand.h"
39#include "worldentities/ControllableEntity.h"
40#include "worldentities/pawns/Pawn.h"
41#include "infos/PlayerInfo.h"
42#include "overlays/OrxonoxOverlay.h"
43#include "graphics/Camera.h"
44#include "sound/SoundManager.h"
45#include "Scene.h"
46#include "tools/BulletConversions.h"
47#include "bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
48
49namespace orxonox
50{
51    SetConsoleCommand(NewHumanController, changeMode,          false).keybindMode(KeybindMode::OnPress);
52    SetConsoleCommand(NewHumanController, accelerate,          false).keybindMode(KeybindMode::OnPress);
53    SetConsoleCommand(NewHumanController, decelerate,          false).keybindMode(KeybindMode::OnPress);
54    SetConsoleCommand(NewHumanController, unfire,              true).keybindMode(KeybindMode::OnRelease);
55
56    CreateUnloadableFactory(NewHumanController);
57
58    NewHumanController* NewHumanController::localController_s = 0;
59
60    NewHumanController::NewHumanController(BaseObject* creator)
61        : HumanController(creator)
62        , crossHairOverlay_(NULL)
63        , centerOverlay_(NULL)
64        , damageOverlayTop_(NULL)
65        , damageOverlayRight_(NULL)
66        , damageOverlayBottom_(NULL)
67        , damageOverlayLeft_(NULL)
68        , damageOverlayTT_(0)
69        , arrowsOverlay1_(NULL)
70        , arrowsOverlay2_(NULL)
71        , arrowsOverlay3_(NULL)
72        , arrowsOverlay4_(NULL)
73    {
74        RegisterObject(NewHumanController);
75
76        overlaySize_ = 0.08;
77        arrowsSize_ = 0.4;
78
79        damageOverlayTime_ = 0.6;
80
81        controlMode_ = 0;
82        acceleration_ = 0;
83        accelerating_ = false;
84        firemode_ = -1;
85
86        showArrows_ = true;
87        showOverlays_ = false;
88        showDamageOverlay_ = true;
89
90        //currentPitch_ = 1;
91        //currentYaw_ = 1;
92
93        if (GameMode::showsGraphics())
94        {
95            crossHairOverlay_ = new OrxonoxOverlay(this);
96            crossHairOverlay_->setBackgroundMaterial("Orxonox/Crosshair3");
97            crossHairOverlay_->setSize(Vector2(overlaySize_, overlaySize_));
98            crossHairOverlay_->hide();
99            //crossHairOverlay_->setAspectCorrection(true); not working
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();
106
107            if ( showDamageOverlay_ )
108            {
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            {
136                arrowsOverlay1_ = new OrxonoxOverlay(this);
137                arrowsOverlay1_->setBackgroundMaterial("Orxonox/DirectionArrows1");
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);
144                arrowsOverlay2_->setBackgroundMaterial("Orxonox/DirectionArrows2");
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);
151                arrowsOverlay3_->setBackgroundMaterial("Orxonox/DirectionArrows3");
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);
158                arrowsOverlay4_->setBackgroundMaterial("Orxonox/DirectionArrows4");
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            }
164        }
165
166        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
167        this->targetMask_.exclude(ClassByString("BaseObject"));
168        this->targetMask_.include(ClassByString("WorldEntity"));
169        this->targetMask_.exclude(ClassByString("Projectile"));
170
171        NewHumanController::localController_s = this;
172
173        controlPaused_ = false;
174
175//HumanController::localController_s->getControllableEntity()->getCamera()->setDrag(true);
176    }
177
178    NewHumanController::~NewHumanController()
179    {
180        if (this->isInitialized())
181        {
182            if (this->crossHairOverlay_)
183                this->crossHairOverlay_->destroy();
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            }
198        }
199    }
200
201    void NewHumanController::tick(float dt)
202    {
203        if (GameMode::showsGraphics())
204        {
205
206            if( this->controllableEntity_ && !this->controllableEntity_->isInMouseLook() )
207            {
208                this->updateTarget();
209
210                if ( !controlPaused_ ) {
211                    if (this->getControllableEntity() && (this->getControllableEntity()->getIdentifier()->getName() == "SpaceShip" || this->getControllableEntity()->getIdentifier()->getName() == "Rocket"))
212                        this->showOverlays();
213
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));
215
216                    if ( this->controlMode_ == 0 || ( this->controlMode_ == 1 && this->firemode_ == 1 ) )
217                    {
218                        if ( this->showOverlays_ && this->showArrows_)
219                            alignArrows();
220                    }
221                    else
222                        hideArrows();
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                    }
238                }
239            }
240            else
241                this->hideOverlays();
242
243            if ( this->acceleration_ > 0 )
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            }
257        }
258
259        // Reset pitch and yaw rates
260        // TODO: Reactivate this to fix the game pad problem with 0 input
261        //this->currentPitch_ = 0;
262        //this->currentYaw_ = 0;
263
264        HumanController::tick(dt);
265    }
266
267    /*void NewHumanController::tick(float dt)
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        }
281    }*/
282   
283    void NewHumanController::doFire(unsigned int firemode)
284    {
285        if ( !this->controllableEntity_ )
286            return;
287        //if (HumanController::localController_s && HumanController::localController_s->controllableEntity_) {
288
289/*
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        }
300*/
301
302        this->firemode_ = firemode;
303
304        if (firemode == 1 && this->controlMode_ == 1)
305        {
306            //unlocked steering, steer on right mouse click
307            HumanController::yaw(Vector2(this->currentYaw_, 0));
308            HumanController::pitch(Vector2(this->currentPitch_, 0));
309        }
310        else
311            HumanController::localController_s->getControllableEntity()->fire(firemode);
312
313    }
314
315    void NewHumanController::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage) {
316        if ( this->showDamageOverlay_ && !this->controlPaused_ && this->controllableEntity_ && !this->controllableEntity_->isInMouseLook() ) {
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
324
325            Vector3 relativeHit = this->getControllableEntity()->getWorldOrientation().UnitInverse() * (this->getControllableEntity()->getWorldPosition() - posA);
326
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            {
349                this->damageOverlayBottom_->show();
350                this->damageOverlayTB_ = this->damageOverlayTime_;
351                //this->damageOverlayTop_->setBackgroundAlpha(0.3);
352            }
353            if ( relativeHit.y < -threshold) //Bottom
354            {
355                this->damageOverlayTop_->show();
356                this->damageOverlayTT_ = this->damageOverlayTime_;
357                //this->damageOverlayBottom_->setBackgroundAlpha(0.3);
358            }
359
360        }
361    }
362
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
375    void NewHumanController::updateTarget()
376    {
377        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
378
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);
380
381        rsq->setRay(mouseRay);
382        rsq->setSortByDistance(true);
383
384        /*
385        Distance of objects:
386        ignore everything under 200 maybe even take 1000 as min distance to shoot at
387
388        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
389        they vanish only after a distance of 10'000
390        */
391
392
393        Ogre::RaySceneQueryResult& result = rsq->execute();
394        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
395
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)
400            {
401                // Try to cast the user pointer
402                WorldEntity* wePtr = dynamic_cast<WorldEntity*>(itr->movable->getUserObject());
403                if (wePtr)
404                {
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 )
422                        continue;
423                }
424
425                if ( this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr )
426                {
427                    this->getControllableEntity()->setTarget(wePtr);
428                }
429
430                if( pawn )
431                {
432                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
433                }
434
435                //itr->movable->getParentSceneNode()->showBoundingBox(true);
436                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
437                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
438                return;
439            }
440
441        }
442        if ( pawn )
443        {
444            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
445        }
446
447        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
448            this->getControllableEntity()->setTarget( 0 );
449   
450
451        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
452        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
453    }
454
455    void NewHumanController::frontback(const Vector2& value)
456    {
457        this->accelerating_ = true;
458
459        //if (this->acceleration_ == 0)
460            HumanController::frontback(value);
461    }
462
463    void NewHumanController::yaw(const Vector2& value)
464    {
465//         SUPER(NewHumanController, yaw, value);
466        if (this->controlMode_ == 0 || ( this->controllableEntity_ && this->controllableEntity_->isInMouseLook() ) )
467            HumanController::yaw(value);
468
469        this->currentYaw_ = value.x;
470    }
471
472    void NewHumanController::pitch(const Vector2& value)
473    {
474//         SUPER(NewHumanController, pitch, value);
475        if (this->controlMode_ == 0 || ( this->controllableEntity_ && this->controllableEntity_->isInMouseLook() ) )
476            HumanController::pitch(value);
477
478        this->currentPitch_ = value.x;
479    }
480
481    void NewHumanController::changeMode()
482    {
483        if (NewHumanController::localController_s)
484        {
485            if (NewHumanController::localController_s->controlMode_ == 0)
486            {
487                NewHumanController::localController_s->controlMode_ = 1;
488                NewHumanController::localController_s->hideArrows();
489            }
490            else
491                NewHumanController::localController_s->controlMode_ = 0;
492        }
493    }
494
495    void NewHumanController::changedControllableEntity()
496    {
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;
501        this->controlMode_ = 0;
502        this->currentYaw_ = 0;
503        this->currentPitch_ = 0;
504        if (this->getControllableEntity() && ( this->getControllableEntity()->getIdentifier()->getName() == "SpaceShip" || this->getControllableEntity()->getIdentifier()->getName() == "Rocket" ))
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        }
518    }
519
520    void NewHumanController::accelerate()
521    {
522        if ( NewHumanController::localController_s )
523        {
524            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
525        }
526    }
527
528    void NewHumanController::decelerate()
529    {
530        if ( NewHumanController::localController_s )
531        {
532            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
533        }
534    }
535
536    void NewHumanController::doResumeControl() {
537        this->controlPaused_ = false;
538        if( this->showOverlays_ ) {
539            this->showOverlays();
540        }
541    }
542
543    void NewHumanController::doPauseControl() {
544        this->controlPaused_ = true;
545        COUT(0) << "pause control" << endl;
546        this->hideOverlays();
547    }
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
578    void NewHumanController::showOverlays() {
579        if( !GameMode::showsGraphics() )
580            return;
581        this->crossHairOverlay_->show();
582        this->centerOverlay_->show();
583
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() {
593        if( !GameMode::showsGraphics() )
594            return;
595        this->crossHairOverlay_->hide();
596        this->centerOverlay_->hide();
597
598        if ( showDamageOverlay_ ) {
599            this->damageOverlayTop_->hide();
600            this->damageOverlayRight_->hide();
601            this->damageOverlayBottom_->hide();
602            this->damageOverlayLeft_->hide();
603        }
604
605        this->hideArrows();
606    }
607
608    void NewHumanController::hideArrows() {
609        if( !GameMode::showsGraphics() )
610            return;
611        if (showArrows_) {
612            this->arrowsOverlay1_->hide();
613            this->arrowsOverlay2_->hide();
614            this->arrowsOverlay3_->hide();
615            this->arrowsOverlay4_->hide();
616        }
617    }
618}
Note: See TracBrowser for help on using the repository browser.