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
RevLine 
[5979]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:
[5981]23 *      Michael Wirth
[5979]24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "NewHumanController.h"
30
[6033]31#include <OgreRay.h>
32#include <OgreSceneQuery.h>
33#include <OgreCamera.h>
34#include <OgreSceneManager.h>
[5981]35
[5979]36#include "core/CoreIncludes.h"
37#include "core/ConsoleCommand.h"
38#include "worldentities/ControllableEntity.h"
[6111]39#include "worldentities/pawns/Pawn.h"
[5979]40#include "infos/PlayerInfo.h"
[6055]41#include "overlays/OrxonoxOverlay.h"
[5979]42#include "graphics/Camera.h"
43#include "sound/SoundManager.h"
44#include "Scene.h"
45
46namespace orxonox
47{
[6091]48    SetConsoleCommand(NewHumanController, changeMode,          false).keybindMode(KeybindMode::OnPress);
[6149]49    SetConsoleCommand(NewHumanController, accelerate,          false).keybindMode(KeybindMode::OnPress);
50    SetConsoleCommand(NewHumanController, decelerate,          false).keybindMode(KeybindMode::OnPress);
[6091]51
[5979]52    CreateUnloadableFactory(NewHumanController);
53
[6091]54    NewHumanController* NewHumanController::localController_s = 0;
55
[6122]56    NewHumanController::NewHumanController(BaseObject* creator)
57        : HumanController(creator)
58        , crossHairOverlay_(NULL)
[5979]59    {
60        RegisterObject(NewHumanController);
[6001]61
[6055]62        overlaySize_ = 0.08;
63        controlMode_ = 0;
[6149]64        acceleration_ = 0;
[6033]65
[6149]66        //currentPitch_ = 1;
67        //currentYaw_ = 1;
68
[6122]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        }
[6045]76
[6058]77        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
[6055]78        this->targetMask_.exclude(ClassByString("BaseObject"));
79        this->targetMask_.include(ClassByString("WorldEntity"));
80        this->targetMask_.exclude(ClassByString("Projectile"));
[6091]81
82        NewHumanController::localController_s = this;
[5979]83    }
84
85    NewHumanController::~NewHumanController()
86    {
[6055]87        if (this->isInitialized())
[5981]88        {
[6122]89            if (this->crossHairOverlay_)
90                this->crossHairOverlay_->destroy();
[5981]91        }
[5979]92    }
93
[6055]94    void NewHumanController::tick(float dt)
95    {
[6122]96        if (GameMode::showsGraphics())
[6111]97        {
[6122]98            if( this->controllableEntity_ && !this->controllableEntity_->isInMouseLook() )
99            {
[6157]100                this->updateTarget();
[6122]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
[6149]107
108            if ( this->acceleration_ > 0 )
[6173]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            }
[6111]122        }
[6001]123
124        HumanController::tick(dt);
125    }
126
[5993]127    /*void NewHumanController::tick(float dt)
[5979]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        }
[5993]141    }*/
142   
[6033]143    void NewHumanController::doFire(unsigned int firemode)
144    {
145        //if (HumanController::localController_s && HumanController::localController_s->controllableEntity_) {
146
147/*
[6055]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        }
[6033]158*/
159
[6157]160        if (firemode == 1 && this->controlMode_ == 1)
161        {
[6143]162            //unlocked steering, steer on right mouse click
[6144]163            HumanController::yaw(Vector2(this->currentYaw_, 0));
164            HumanController::pitch(Vector2(this->currentPitch_, 0));
[6143]165        }
[6157]166        else
[6143]167            HumanController::localController_s->getControllableEntity()->fire(firemode);
168
[6045]169    }
170
[6111]171    void NewHumanController::updateTarget()
[6055]172    {
173        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
[6033]174
[6058]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);
[6033]176
[6055]177        rsq->setRay(mouseRay);
178        rsq->setSortByDistance(true);
[6033]179
[6055]180        /*
181        Distance of objects:
182        ignore everything under 200 maybe even take 1000 as min distance to shoot at
[6033]183
[6055]184        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
185        they vanish only after a distance of 10'000
186        */
[6045]187
188
[6055]189        Ogre::RaySceneQueryResult& result = rsq->execute();
[6111]190        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
[6033]191
[6055]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)
[6045]196            {
[6055]197                // Try to cast the user pointer
198                WorldEntity* wePtr = dynamic_cast<WorldEntity*>(itr->movable->getUserObject());
199                if (wePtr)
200                {
[6114]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 )
[6055]218                        continue;
[6045]219                }
[6143]220
221                if ( this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr )
222                {
[6116]223                    this->getControllableEntity()->setTarget(wePtr);
[6143]224                }
[6091]225
[6143]226                if( pawn )
227                {
228                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
229                }
230
[6055]231                itr->movable->getParentSceneNode()->showBoundingBox(true);
[6091]232                //std::cout << itr->movable->getParentSceneNode()->_getDerivedPosition() << endl;
[6111]233                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
234                return;
[6045]235            }
[6091]236
[6055]237        }
[6111]238        if ( pawn )
239        {
240            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
241        }
[6143]242
243        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
244            this->getControllableEntity()->setTarget( 0 );
[6111]245   
[6033]246
[6091]247        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
[6058]248        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
[6033]249    }
250
[6149]251    void NewHumanController::frontback(const Vector2& value)
252    {
[6173]253        this->accelerating_ = true;
[6149]254
[6173]255        //if (this->acceleration_ == 0)
[6149]256            HumanController::frontback(value);
257    }
258
[5993]259    void NewHumanController::yaw(const Vector2& value)
260    {
261//         SUPER(NewHumanController, yaw, value);
[6091]262        if (this->controlMode_ == 0)
263            HumanController::yaw(value);
[6143]264
[5993]265        this->currentYaw_ = value.x;
[5979]266    }
[6055]267
[5993]268    void NewHumanController::pitch(const Vector2& value)
[5981]269    {
[5993]270//         SUPER(NewHumanController, pitch, value);
[6091]271        if (this->controlMode_ == 0)
272            HumanController::pitch(value);
273
[5993]274        this->currentPitch_ = value.x;
[5981]275    }
[6091]276
[6149]277    void NewHumanController::changeMode()
278    {
[6111]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        }
[6091]284        else
285            NewHumanController::localController_s->controlMode_ = 0;
286    }
[6143]287
[6115]288    void NewHumanController::changedControllableEntity()
289    {
290        this->controlMode_ = 0;
291        this->currentYaw_ = 0;
292        this->currentPitch_ = 0;
293    }
[6149]294
295    void NewHumanController::accelerate()
296    {
[6157]297        if ( NewHumanController::localController_s )
298        {
[6173]299            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
[6149]300        }
301    }
302
303    void NewHumanController::decelerate()
304    {
[6157]305        if ( NewHumanController::localController_s )
306        {
[6173]307            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
[6149]308        }
309    }
[5979]310}
Note: See TracBrowser for help on using the repository browser.