Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6144 was 6144, checked in by wirthmi, 14 years ago

New input mode

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