Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

mouselook now also working when steering a rocket

File size: 9.2 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
46namespace orxonox
47{
48    SetConsoleCommand(NewHumanController, changeMode,          false).keybindMode(KeybindMode::OnPress);
49
50    CreateUnloadableFactory(NewHumanController);
51
52    NewHumanController* NewHumanController::localController_s = 0;
53
54    NewHumanController::NewHumanController(BaseObject* creator) : HumanController(creator)
55    {
56        RegisterObject(NewHumanController);
57
58        overlaySize_ = 0.08;
59        controlMode_ = 0;
60
61        crossHairOverlay_ = new OrxonoxOverlay(this);
62        crossHairOverlay_->setBackgroundMaterial("Orxonox/Crosshair3");
63        crossHairOverlay_->setSize(Vector2(overlaySize_, overlaySize_));
64        crossHairOverlay_->show();
65
66        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
67        this->targetMask_.exclude(ClassByString("BaseObject"));
68        this->targetMask_.include(ClassByString("WorldEntity"));
69        this->targetMask_.exclude(ClassByString("Projectile"));
70
71        NewHumanController::localController_s = this;
72    }
73
74    NewHumanController::~NewHumanController()
75    {
76        if (this->isInitialized())
77        {
78        }
79    }
80
81    void NewHumanController::tick(float dt)
82    {
83        if( this->controllableEntity_ && !this->controllableEntity_->isInMouseLook() )
84        {
85            this->crossHairOverlay_->setPosition(Vector2(static_cast<float>(this->currentYaw_)/2*-1+.5-overlaySize_/2, static_cast<float>(this->currentPitch_)/2*-1+.5-overlaySize_/2));
86            this->crossHairOverlay_->show();
87        }
88        else
89            this->crossHairOverlay_->hide();
90        // TODO: update aimPosition of Pawn
91
92        HumanController::tick(dt);
93    }
94
95    /*void NewHumanController::tick(float dt)
96    {
97        if (GameMode::playsSound() && NewHumanController::localController_s && NewHumanController::localController_s->controllableEntity_)
98        {
99            // Update sound listener
100            Camera* camera = NewHumanController::localController_s->controllableEntity_->getCamera();
101            if (camera)
102            {
103                SoundManager::getInstance().setListenerPosition(camera->getWorldPosition());
104                SoundManager::getInstance().setListenerOrientation(camera->getWorldOrientation());
105            }
106            else
107                COUT(3) << "NewHumanController, Warning: Using a ControllableEntity without Camera" << std::endl;
108        }
109    }*/
110   
111    void NewHumanController::doFire(unsigned int firemode)
112    {
113        //if (HumanController::localController_s && HumanController::localController_s->controllableEntity_) {
114
115/*
116        // Get results, create a node/entity on the position
117        for ( itr = result.begin(); itr != result.end(); itr++ )
118        {
119            if (itr->movable && itr->movable->getName() == "Head")
120            {
121                soundMgr->StopSound( &jaguarSoundChannel );
122                soundMgr->PlaySound( jaguarSound, headNode, &jaguarSoundChannel );
123                break;
124            } // if
125        }
126*/
127        if( !NewHumanController::localController_s->getControllableEntity()->isInMouseLook() )
128            this->updateTarget();
129
130        HumanController::localController_s->getControllableEntity()->fire(firemode);
131    }
132
133    void NewHumanController::updateTarget()
134    {
135        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
136
137        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);
138
139        rsq->setRay(mouseRay);
140        rsq->setSortByDistance(true);
141
142        /*
143        Distance of objects:
144        ignore everything under 200 maybe even take 1000 as min distance to shoot at
145
146        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
147        they vanish only after a distance of 10'000
148        */
149
150
151        Ogre::RaySceneQueryResult& result = rsq->execute();
152        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
153
154        Ogre::RaySceneQueryResult::iterator itr;
155        for (itr = result.begin(); itr != result.end(); ++itr)
156        {
157            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" && itr->distance > 500)
158            {
159                // Try to cast the user pointer
160                WorldEntity* wePtr = dynamic_cast<WorldEntity*>(itr->movable->getUserObject());
161                if (wePtr)
162                {
163                    // go through all parents of object and look wheter they are Sightable or not
164                    bool isSightable = false;
165                    WorldEntity* parent = wePtr->getParent();
166                    while( parent )
167                    {
168                        if (this->targetMask_.isExcluded(parent->getIdentifier()))
169                        {
170                            parent = parent->getParent();
171                            continue;
172                        }
173                        else
174                        {
175                            isSightable = true;
176                            break;
177                        }
178                    }
179                    if ( !isSightable )
180                        continue;
181                }
182               
183                this->getControllableEntity()->setTarget(wePtr);
184
185                itr->movable->getParentSceneNode()->showBoundingBox(true);
186                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
187                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
188                if ( pawn )
189                {
190                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance ); // or itr->movable->getParentSceneNode()->_getDerivedPosition()
191                    pawn->setTarget( wePtr );
192                }
193                return;
194            }
195
196        }
197        if ( pawn )
198        {
199            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
200            pawn->setTarget( 0 );
201        }
202   
203
204        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
205        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
206    }
207
208    void NewHumanController::yaw(const Vector2& value)
209    {
210//         SUPER(NewHumanController, yaw, value);
211        if (this->controlMode_ == 0)
212            HumanController::yaw(value);
213       
214        this->currentYaw_ = value.x;
215        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
216    }
217
218    void NewHumanController::pitch(const Vector2& value)
219    {
220//         SUPER(NewHumanController, pitch, value);
221        if (this->controlMode_ == 0)
222            HumanController::pitch(value);
223
224        this->currentPitch_ = value.x;
225        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
226    }
227
228    void NewHumanController::changeMode() {
229        if (NewHumanController::localController_s && NewHumanController::localController_s->controlMode_ == 0)
230        {
231            if (NewHumanController::localController_s->controllableEntity_ && !NewHumanController::localController_s->controllableEntity_->isInMouseLook() )
232                NewHumanController::localController_s->controlMode_ = 1;
233        }
234        else
235            NewHumanController::localController_s->controlMode_ = 0;
236    }
237   
238    void NewHumanController::changedControllableEntity()
239    {
240        this->controlMode_ = 0;
241        this->currentYaw_ = 0;
242        this->currentPitch_ = 0;
243    }
244}
Note: See TracBrowser for help on using the repository browser.