Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

NHC creator hack is now not so hacky anymore ;)

File size: 8.5 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                    BaseObject* parent = wePtr->getParent();
164                    if (this->targetMask_.isExcluded(parent->getIdentifier()))
165                        continue;
166                }
167               
168                this->getControllableEntity()->setTarget(wePtr);
169
170                itr->movable->getParentSceneNode()->showBoundingBox(true);
171                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
172                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
173                if ( pawn )
174                {
175                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance ); // or itr->movable->getParentSceneNode()->_getDerivedPosition()
176                    pawn->setTarget( wePtr );
177                }
178                return;
179            }
180
181        }
182        if ( pawn )
183        {
184            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
185            pawn->setTarget( 0 );
186        }
187   
188
189        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
190        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
191    }
192
193    void NewHumanController::yaw(const Vector2& value)
194    {
195//         SUPER(NewHumanController, yaw, value);
196        if (this->controlMode_ == 0)
197            HumanController::yaw(value);
198       
199        this->currentYaw_ = value.x;
200        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
201    }
202
203    void NewHumanController::pitch(const Vector2& value)
204    {
205//         SUPER(NewHumanController, pitch, value);
206        if (this->controlMode_ == 0)
207            HumanController::pitch(value);
208
209        this->currentPitch_ = value.x;
210        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
211    }
212
213    void NewHumanController::changeMode() {
214        if (NewHumanController::localController_s && NewHumanController::localController_s->controlMode_ == 0)
215        {
216            if (NewHumanController::localController_s->controllableEntity_ && !NewHumanController::localController_s->controllableEntity_->isInMouseLook() )
217                NewHumanController::localController_s->controlMode_ = 1;
218        }
219        else
220            NewHumanController::localController_s->controlMode_ = 0;
221    }
222}
Note: See TracBrowser for help on using the repository browser.