Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Working permanent acceleration.

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