Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6223 was 6223, checked in by scheusso, 14 years ago

fixed some uninitialised variables

  • Property svn:eol-style set to native
File size: 17.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 <OgreRay.h>
32#include <OgreSceneQuery.h>
33#include <OgreCamera.h>
34#include <OgreSceneManager.h>
35
36#include "core/CoreIncludes.h"
37#include "core/ConsoleCommand.h"
38#include "worldentities/ControllableEntity.h"
39#include "worldentities/pawns/Pawn.h"
40#include "infos/PlayerInfo.h"
41#include "overlays/OrxonoxOverlay.h"
42#include "graphics/Camera.h"
43#include "sound/SoundManager.h"
44#include "Scene.h"
45
46#include <cmath>
47
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    {
65        RegisterObject(NewHumanController);
66
67        overlaySize_ = 0.08;
68        arrowsSize_ = 0.4;
69        controlMode_ = 0;
70        acceleration_ = 0;
71        acceleration_ = false;
72        firemode_ = -1;
73        showArrows_ = true;
74
75        //currentPitch_ = 1;
76        //currentYaw_ = 1;
77
78        if (GameMode::showsGraphics())
79        {
80            crossHairOverlay_ = new OrxonoxOverlay(this);
81            crossHairOverlay_->setBackgroundMaterial("Orxonox/Crosshair3");
82            crossHairOverlay_->setSize(Vector2(overlaySize_, overlaySize_));
83            crossHairOverlay_->hide();
84            //crossHairOverlay_->setAspectCorrection(true); not working
85
86            centerOverlay_ = new OrxonoxOverlay(this);
87            centerOverlay_->setBackgroundMaterial("Orxonox/CenterOverlay");
88            centerOverlay_->setSize(Vector2(overlaySize_ * 2.5, overlaySize_ * 2.5));
89            centerOverlay_->setPosition(Vector2(0.5 - overlaySize_*2.5/2.0, 0.5 - overlaySize_*2.5/2.0));\
90            centerOverlay_->hide();
91
92            if (showArrows_)
93            {
94                arrowsOverlay1_ = new OrxonoxOverlay(this);
95                arrowsOverlay1_->setBackgroundMaterial("Orxonox/CenterOverlay");
96                arrowsOverlay1_->setSize(Vector2(0.02727, 0.36 * arrowsSize_));
97                arrowsOverlay1_->setPickPoint(Vector2(0.5, 0.5));
98                arrowsOverlay1_->setPosition(Vector2(0.5, 0.5));
99                arrowsOverlay1_->hide();
100   
101                arrowsOverlay2_ = new OrxonoxOverlay(this);
102                arrowsOverlay2_->setBackgroundMaterial("Orxonox/CenterOverlay");
103                arrowsOverlay2_->setSize(Vector2(0.02727, 0.59 * arrowsSize_));
104                arrowsOverlay2_->setPickPoint(Vector2(0.5, 0.5));
105                arrowsOverlay2_->setPosition(Vector2(0.5, 0.5));
106                arrowsOverlay2_->hide();
107   
108                arrowsOverlay3_ = new OrxonoxOverlay(this);
109                arrowsOverlay3_->setBackgroundMaterial("Orxonox/CenterOverlay");
110                arrowsOverlay3_->setSize(Vector2(0.02727, 0.77 * arrowsSize_));
111                arrowsOverlay3_->setPickPoint(Vector2(0.5, 0.5));
112                arrowsOverlay3_->setPosition(Vector2(0.5, 0.5));
113                arrowsOverlay3_->hide();
114   
115                arrowsOverlay4_ = new OrxonoxOverlay(this);
116                arrowsOverlay4_->setBackgroundMaterial("Orxonox/CenterOverlay");
117                arrowsOverlay4_->setSize(Vector2(0.02727, arrowsSize_));
118                arrowsOverlay4_->setPickPoint(Vector2(0.5, 0.5));
119                arrowsOverlay4_->setPosition(Vector2(0.5, 0.5));
120                arrowsOverlay4_->hide();
121            }
122        }
123
124        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
125        this->targetMask_.exclude(ClassByString("BaseObject"));
126        this->targetMask_.include(ClassByString("WorldEntity"));
127        this->targetMask_.exclude(ClassByString("Projectile"));
128
129        NewHumanController::localController_s = this;
130
131        controlPaused_ = true;
132
133//HumanController::localController_s->getControllableEntity()->getCamera()->setDrag(true);
134    }
135
136    NewHumanController::~NewHumanController()
137    {
138        if (this->isInitialized())
139        {
140            if (this->crossHairOverlay_)
141                this->crossHairOverlay_->destroy();
142            if (this->centerOverlay_)
143                this->centerOverlay_->destroy();
144
145            if (showArrows_)
146            {
147                if (this->arrowsOverlay1_)
148                    this->arrowsOverlay1_->destroy();
149                if (this->arrowsOverlay2_)
150                    this->arrowsOverlay2_->destroy();
151                if (this->arrowsOverlay3_)
152                    this->arrowsOverlay3_->destroy();
153                if (this->arrowsOverlay4_)
154                    this->arrowsOverlay4_->destroy();
155            }
156        }
157    }
158
159    void NewHumanController::tick(float dt)
160    {
161        if (GameMode::showsGraphics())
162        {
163
164            if( this->controllableEntity_ && !this->controllableEntity_->isInMouseLook() )
165            {
166                this->updateTarget();
167                if ( !controlPaused_ ) {
168                    this->crossHairOverlay_->setPosition(Vector2(static_cast<float>(this->currentYaw_)/2*-1+.5-overlaySize_/2, static_cast<float>(this->currentPitch_)/2*-1+.5-overlaySize_/2));
169
170                    if ( this->controlMode_ == 0 || ( this->controlMode_ == 1 && this->firemode_ == 1 ) )
171                        alignArrows();
172                    else
173                        hideArrows();
174
175                    this->crossHairOverlay_->show();
176                    this->centerOverlay_->show();
177                }
178            }
179            else {
180                this->crossHairOverlay_->hide();
181                this->centerOverlay_->hide();
182
183                hideArrows();
184            }
185
186            if ( this->acceleration_ > 0 )
187            {
188/*
189if (this->controllableEntity_ && this->controllableEntity_->getEngine()) {
190    std::cout << this->controllableEntity_->getEngine()->getAccelerationFront() << endl;
191}
192*/
193                if ( this->accelerating_ )
194                    HumanController::moveFrontBack(Vector2(1, 0));
195                else
196                    HumanController::moveFrontBack(Vector2(this->acceleration_, 0)); 
197                this->accelerating_ = false;
198                //HumanController::moveFrontBack(Vector2(clamp(this->acceleration_ + this->currentAcceleration_, 0.0f, 1.0f), 0));
199            }
200        }
201
202        HumanController::tick(dt);
203    }
204
205    /*void NewHumanController::tick(float dt)
206    {
207        if (GameMode::playsSound() && NewHumanController::localController_s && NewHumanController::localController_s->controllableEntity_)
208        {
209            // Update sound listener
210            Camera* camera = NewHumanController::localController_s->controllableEntity_->getCamera();
211            if (camera)
212            {
213                SoundManager::getInstance().setListenerPosition(camera->getWorldPosition());
214                SoundManager::getInstance().setListenerOrientation(camera->getWorldOrientation());
215            }
216            else
217                COUT(3) << "NewHumanController, Warning: Using a ControllableEntity without Camera" << std::endl;
218        }
219    }*/
220   
221    void NewHumanController::doFire(unsigned int firemode)
222    {
223        //if (HumanController::localController_s && HumanController::localController_s->controllableEntity_) {
224
225/*
226        // Get results, create a node/entity on the position
227        for ( itr = result.begin(); itr != result.end(); itr++ )
228        {
229            if (itr->movable && itr->movable->getName() == "Head")
230            {
231                soundMgr->StopSound( &jaguarSoundChannel );
232                soundMgr->PlaySound( jaguarSound, headNode, &jaguarSoundChannel );
233                break;
234            } // if
235        }
236*/
237
238        this->firemode_ = firemode;
239
240        if (firemode == 1 && this->controlMode_ == 1)
241        {
242            //unlocked steering, steer on right mouse click
243            HumanController::yaw(Vector2(this->currentYaw_, 0));
244            HumanController::pitch(Vector2(this->currentPitch_, 0));
245        }
246        else
247            HumanController::localController_s->getControllableEntity()->fire(firemode);
248
249    }
250
251    void NewHumanController::unfire()
252    {
253        if (NewHumanController::localController_s)
254            NewHumanController::localController_s->doUnfire();
255    }
256
257    void NewHumanController::doUnfire()
258    {
259        COUT(0) << "dounfire" << endl;
260        this->firemode_ = -1;
261        hideArrows();
262    }
263
264    void NewHumanController::updateTarget()
265    {
266        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
267
268        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);
269
270        rsq->setRay(mouseRay);
271        rsq->setSortByDistance(true);
272
273        /*
274        Distance of objects:
275        ignore everything under 200 maybe even take 1000 as min distance to shoot at
276
277        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
278        they vanish only after a distance of 10'000
279        */
280
281
282        Ogre::RaySceneQueryResult& result = rsq->execute();
283        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
284
285        Ogre::RaySceneQueryResult::iterator itr;
286        for (itr = result.begin(); itr != result.end(); ++itr)
287        {
288            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" && itr->distance > 500)
289            {
290                // Try to cast the user pointer
291                WorldEntity* wePtr = dynamic_cast<WorldEntity*>(itr->movable->getUserObject());
292                if (wePtr)
293                {
294                    // go through all parents of object and look wheter they are Sightable or not
295                    bool isSightable = false;
296                    WorldEntity* parent = wePtr->getParent();
297                    while( parent )
298                    {
299                        if (this->targetMask_.isExcluded(parent->getIdentifier()))
300                        {
301                            parent = parent->getParent();
302                            continue;
303                        }
304                        else
305                        {
306                            isSightable = true;
307                            break;
308                        }
309                    }
310                    if ( !isSightable )
311                        continue;
312                }
313
314                if ( this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr )
315                {
316                    this->getControllableEntity()->setTarget(wePtr);
317                }
318
319                if( pawn )
320                {
321                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
322                }
323
324                //itr->movable->getParentSceneNode()->showBoundingBox(true);
325                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
326                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
327                return;
328            }
329
330        }
331        if ( pawn )
332        {
333            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
334        }
335
336        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
337            this->getControllableEntity()->setTarget( 0 );
338   
339
340        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
341        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
342    }
343
344    void NewHumanController::frontback(const Vector2& value)
345    {
346        this->accelerating_ = true;
347
348        //if (this->acceleration_ == 0)
349            HumanController::frontback(value);
350    }
351
352    void NewHumanController::yaw(const Vector2& value)
353    {
354//         SUPER(NewHumanController, yaw, value);
355        if (this->controlMode_ == 0 || ( this->controllableEntity_ && this->controllableEntity_->isInMouseLook() ) )
356            HumanController::yaw(value);
357
358        this->currentYaw_ = value.x;
359    }
360
361    void NewHumanController::pitch(const Vector2& value)
362    {
363//         SUPER(NewHumanController, pitch, value);
364        if (this->controlMode_ == 0 || ( this->controllableEntity_ && this->controllableEntity_->isInMouseLook() ) )
365            HumanController::pitch(value);
366
367        this->currentPitch_ = value.x;
368    }
369
370    void NewHumanController::changeMode()
371    {
372        if (NewHumanController::localController_s && NewHumanController::localController_s->controlMode_ == 0)
373        {
374                NewHumanController::localController_s->controlMode_ = 1;
375                NewHumanController::localController_s->hideArrows();
376        }
377        else
378            NewHumanController::localController_s->controlMode_ = 0;
379    }
380
381    void NewHumanController::changedControllableEntity()
382    {
383        this->controlMode_ = 0;
384        this->currentYaw_ = 0;
385        this->currentPitch_ = 0;
386//         if (this->getControllableEntity() && this->getControllableEntity()->getIdentifier()->getName() == "SpaceShip") {
387//             this->doResumeControl();
388//         }
389    }
390
391    void NewHumanController::accelerate()
392    {
393        if ( NewHumanController::localController_s )
394        {
395            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
396        }
397    }
398
399    void NewHumanController::decelerate()
400    {
401        if ( NewHumanController::localController_s )
402        {
403            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
404        }
405    }
406
407    void NewHumanController::doResumeControl() {
408        this->controlPaused_ = false;
409        this->crossHairOverlay_->show();
410        this->centerOverlay_->show();
411    }
412
413    void NewHumanController::doPauseControl() {
414        this->controlPaused_ = true;
415
416        this->crossHairOverlay_->hide();
417        this->centerOverlay_->hide();
418
419        hideArrows();
420    }
421
422    void NewHumanController::alignArrows() {
423        if (showArrows_) {
424            hideArrows();
425   
426            float distance = sqrt(pow(static_cast<float>(this->currentYaw_)/2*-1,2) + pow(static_cast<float>(this->currentPitch_)/2*-1,2));
427   
428            if ( distance > 0.04 && distance <= 0.59 * arrowsSize_ / 2.0 ) {
429                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));
430   
431                this->arrowsOverlay1_->show();
432            }
433            else if ( distance > 0.59 * arrowsSize_ / 2.0 && distance <= 0.77 * arrowsSize_ / 2.0 ) {
434                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));
435   
436                this->arrowsOverlay2_->show();
437            }
438            else if ( distance > 0.77 * arrowsSize_ / 2.0 && distance <= arrowsSize_ / 2.0 ) {
439                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));
440   
441                this->arrowsOverlay3_->show();
442            }
443            else if ( distance > arrowsSize_ / 2.0 ) {
444                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));
445   
446                this->arrowsOverlay4_->show();
447            }
448        }
449    }
450
451    void NewHumanController::hideArrows() {
452        if (showArrows_) {
453            this->arrowsOverlay1_->hide();
454            this->arrowsOverlay2_->hide();
455            this->arrowsOverlay3_->hide();
456            this->arrowsOverlay4_->hide();
457        }
458    }
459}
Note: See TracBrowser for help on using the repository browser.