Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/mergeFS18/src/orxonox/controllers/NewHumanController.cc @ 12211

Last change on this file since 12211 was 11795, checked in by landauf, 7 years ago

merged ogre1.9 (including cegui0.8) into new branch

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