Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/consolecommands/src/orxonox/controllers/NewHumanController.cc @ 6126

Last change on this file since 6126 was 6122, checked in by rgrieder, 15 years ago

Fixed dedicated problem in NHC and a memory leak on windows in the IOConsole.

  • 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        if( !NewHumanController::localController_s->getControllableEntity()->isInMouseLook() )
138            this->updateTarget();
139
140        HumanController::localController_s->getControllableEntity()->fire(firemode);
141    }
142
143    void NewHumanController::updateTarget()
144    {
145        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
146
147        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);
148
149        rsq->setRay(mouseRay);
150        rsq->setSortByDistance(true);
151
152        /*
153        Distance of objects:
154        ignore everything under 200 maybe even take 1000 as min distance to shoot at
155
156        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
157        they vanish only after a distance of 10'000
158        */
159
160
161        Ogre::RaySceneQueryResult& result = rsq->execute();
162        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
163
164        Ogre::RaySceneQueryResult::iterator itr;
165        for (itr = result.begin(); itr != result.end(); ++itr)
166        {
167            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" && itr->distance > 500)
168            {
169                // Try to cast the user pointer
170                WorldEntity* wePtr = dynamic_cast<WorldEntity*>(itr->movable->getUserObject());
171                if (wePtr)
172                {
173                    // go through all parents of object and look wheter they are Sightable or not
174                    bool isSightable = false;
175                    WorldEntity* parent = wePtr->getParent();
176                    while( parent )
177                    {
178                        if (this->targetMask_.isExcluded(parent->getIdentifier()))
179                        {
180                            parent = parent->getParent();
181                            continue;
182                        }
183                        else
184                        {
185                            isSightable = true;
186                            break;
187                        }
188                    }
189                    if ( !isSightable )
190                        continue;
191                }
192               
193                if( this->getControllableEntity()->getTarget() != wePtr )
194                    this->getControllableEntity()->setTarget(wePtr);
195
196                itr->movable->getParentSceneNode()->showBoundingBox(true);
197                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
198                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
199                if ( pawn )
200                {
201                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance ); // or itr->movable->getParentSceneNode()->_getDerivedPosition()
202                    pawn->setTarget( wePtr );
203                }
204                return;
205            }
206
207        }
208        if ( pawn )
209        {
210            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
211            if( this->getControllableEntity()->getTarget() != 0 )
212                pawn->setTarget( 0 );
213        }
214   
215
216        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
217        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
218    }
219
220    void NewHumanController::yaw(const Vector2& value)
221    {
222//         SUPER(NewHumanController, yaw, value);
223        if (this->controlMode_ == 0)
224            HumanController::yaw(value);
225       
226        this->currentYaw_ = value.x;
227        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
228    }
229
230    void NewHumanController::pitch(const Vector2& value)
231    {
232//         SUPER(NewHumanController, pitch, value);
233        if (this->controlMode_ == 0)
234            HumanController::pitch(value);
235
236        this->currentPitch_ = value.x;
237        //std::cout << "Y: " << static_cast<float>(this->currentPitch_) << " X: " << static_cast<float>(this->currentYaw_) << endl;
238    }
239
240    void NewHumanController::changeMode() {
241        if (NewHumanController::localController_s && NewHumanController::localController_s->controlMode_ == 0)
242        {
243            if (NewHumanController::localController_s->controllableEntity_ && !NewHumanController::localController_s->controllableEntity_->isInMouseLook() )
244                NewHumanController::localController_s->controlMode_ = 1;
245        }
246        else
247            NewHumanController::localController_s->controlMode_ = 0;
248    }
249   
250    void NewHumanController::changedControllableEntity()
251    {
252        this->controlMode_ = 0;
253        this->currentYaw_ = 0;
254        this->currentPitch_ = 0;
255    }
256}
Note: See TracBrowser for help on using the repository browser.