Ignore:
Timestamp:
07/08/05 17:34:05 (19 years ago)
Author:
mattausch
Message:

added moving robots

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp

    r160 r161  
    77 
    88#include <Ogre.h> 
     9 
    910//#include "OgreReferenceAppLayer.h" 
    1011//#include "OgreRefAppWorld.h" 
     
    2324}; 
    2425 
     26/***************************************/ 
     27/*      EntityState implementation     */ 
     28/***************************************/ 
     29EntityState::EntityState(Entity *ent, State entityState, Real speed): 
     30mEntity(ent), mState(entityState), mAnimationSpeed(speed) 
     31{ 
     32        switch(entityState) 
     33        { 
     34        case MOVING: 
     35                mAnimationState = mEntity->getAnimationState("Walk"); 
     36                break; 
     37        case WAITING: 
     38                mAnimationState = mEntity->getAnimationState("Idle"); 
     39                break; 
     40        case STOP: 
     41                mAnimationState = NULL; 
     42                break; 
     43        default: 
     44                break; 
     45        } 
     46        // enable animation state 
     47        if (mAnimationState) 
     48        { 
     49                mAnimationState->setLoop(true); 
     50                mAnimationState->setEnabled(true); 
     51        } 
     52        mTimeElapsed = Math::RangeRandom(1, 5); 
     53} 
     54//----------------------------------------------------------------------- 
     55Entity *EntityState::GetEntity() 
     56{ 
     57        return mEntity; 
     58} 
     59//----------------------------------------------------------------------- 
     60EntityState::State EntityState::GetState() 
     61{ 
     62        return mState; 
     63} 
     64//----------------------------------------------------------------------- 
     65void EntityState::update(Real timeSinceLastFrame) 
     66{ 
     67        mTimeElapsed -= timeSinceLastFrame * mAnimationSpeed; 
     68         
     69        if (mState == MOVING) // toggle between moving (longer) and waiting (short) 
     70        { 
     71                SceneNode *parent = mEntity->getParentSceneNode(); 
     72 
     73                if (mTimeElapsed <= 0) // toggle animation state 
     74                { 
     75                        if (mAnimationState->getAnimationName() == "Idle") 
     76                        { 
     77                                SetAnimationState("Walk", true); 
     78                                mTimeElapsed = 10; // walk for mTimeElapsed units 
     79 
     80                                // choose random direction between zero and two pi 
     81                                Radian rnd = Radian(Math::UnitRandom() * Math::HALF_PI); 
     82 
     83                                //mEntity->getParentSceneNode()->rotate(); 
     84                                parent->yaw(rnd);                                                
     85                        } 
     86                        else  
     87                        { 
     88                                SetAnimationState("Idle", true); 
     89                                mTimeElapsed = 2; // wait for mTimeElapsed seconds 
     90                        } 
     91                } 
     92 
     93                if (mAnimationState->getAnimationName() == "Walk") 
     94                { 
     95                        Vector3 oldPos = parent->getPosition(); 
     96 
     97                        parent->translate(parent->getLocalAxes(), Vector3(0.03 * mAnimationSpeed, 0, 0)); 
     98 
     99                        // HACK: if out of bounds => go back to idle 
     100                        if (OutOfBounds(parent))  
     101                        { 
     102                                parent->setPosition(oldPos); 
     103                                SetAnimationState("Idle); 
     104                                 
     105                                mTimeElapsed = 2; 
     106                        } 
     107                } 
     108        } 
     109                 
     110        if (mAnimationState) // add time to drive animation 
     111        { 
     112                mAnimationState->addTime(timeSinceLastFrame * mAnimationSpeed); 
     113        } 
     114} 
     115//----------------------------------------------------------------------- 
     116void EntityState::SetAnimationState(String stateStr, bool loop) 
     117{ 
     118        mAnimationState = mEntity->getAnimationState(stateStr); 
     119        mAnimationState->setLoop(loop); 
     120        mAnimationState->setEnabled(true); 
     121} 
     122//----------------------------------------------------------------------- 
     123bool EntityState::OutOfBounds(SceneNode *node) 
     124{ 
     125        Vector3 pos = node->getPosition(); 
     126 
     127        if ((pos > msMinPos) && (pos < msMaxPos)) 
     128                return true; 
     129 
     130        return false; 
     131} 
    25132/*********************************************************/ 
    26133/*      TestCullingTerrainApplication implementation     */ 
     
    35142TestCullingTerrainApplication::~TestCullingTerrainApplication() 
    36143{ 
    37         if (mTerrainContentGenerator) 
    38         { 
    39                 delete mTerrainContentGenerator; 
    40                 mTerrainContentGenerator = NULL; 
    41         } 
     144        OGRE_DELETE(mTerrainContentGenerator); 
     145        OGRE_DELETE(mRayQueryExecutor); 
     146        deleteEntityStates(); 
     147} 
     148//----------------------------------------------------------------------- 
     149void TestCullingTerrainApplication::deleteEntityStates() 
     150{ 
     151        for (int i = 0; i < (int)mEntityStates.size(); ++i) 
     152        { 
     153                delete mEntityStates[i]; 
     154                mEntityStates[i] = NULL; 
     155        } 
     156        mEntityStates.clear(); 
    42157} 
    43158//----------------------------------------------------------------------- 
     
    133248        mSceneMgr->setWorldGeometry(terrain_cfg); 
    134249         
     250        // ray query executor 
     251        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr); 
     252 
    135253        //-- CEGUI setup 
    136254        setupGui(); 
     
    185303 
    186304        //-- add animation state for new robots (located at the end of the list) 
    187         for (int i = entList->size() - num; i < entList->size(); ++i) 
    188         { 
    189                 Entity *ent = (*entList)[i]; 
    190                 AnimationState *st = ent->getAnimationState("Idle"); 
    191                 st->setEnabled(true); 
    192                 st->setLoop(true); 
    193  
    194                 mAnimationStates.push_back(st); 
    195                 mAnimationSpeed.push_back(Math::RangeRandom(0.5, 1.5)); 
    196         } 
    197 } 
    198 //----------------------------------------------------------------------- 
    199 std::vector<AnimationState *> &TestCullingTerrainApplication::getAnimationStates() 
    200 { 
    201         return mAnimationStates; 
    202 } 
    203 //----------------------------------------------------------------------- 
    204 std::vector<Real> &TestCullingTerrainApplication::getAnimationSpeed() 
    205 { 
    206         return mAnimationSpeed; 
     305        for (int i = entList->size() - num; i < (int)entList->size(); ++i) 
     306        { 
     307                mEntityStates.push_back(new EntityState((*entList)[i],  
     308                        EntityState::WAITING, Math::RangeRandom(0.5, 1.5))); 
     309        } 
     310} 
     311//----------------------------------------------------------------------- 
     312void TestCullingTerrainApplication::updateAnimations(Real timeSinceLastFrame) 
     313{ 
     314        for (int i = 0; i < (int)mEntityStates.size(); ++i) 
     315        { 
     316                SceneNode *sm = mEntityStates[i]->GetEntity()->getParentSceneNode(); 
     317 
     318                mEntityStates[i]->update(timeSinceLastFrame); 
     319 
     320                if (mEntityStates[i]->GetState() == EntityState::MOVING) 
     321                { 
     322                        Clamp2Terrain(sn, 0); 
     323                        //sm->setNodeVisible(false); 
     324                } 
     325        } 
     326} 
     327//----------------------------------------------------------------------- 
     328EntityStates  &TestCullingTerrainApplication::getEntityStates() 
     329{ 
     330        return mEntityStates; 
    207331} 
    208332//----------------------------------------------------------------------- 
     
    239363        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE); 
    240364} 
     365//----------------------------------------------------------------------- 
     366bool TestCullingTerrainApplication::Clamp2Terrain(SceneNode *node, int terrainOffs) 
     367{ 
     368        // clamp scene node to terrain 
     369        Vector3 pos = node->getPosition(); 
     370        Vector3 queryResult; 
     371 
     372        if (mRayQueryExecutor->executeRayQuery(&queryResult,  
     373                        Vector3(pos.x, MAX_HEIGHT, pos.z), Vector3::NEGATIVE_UNIT_Y)) 
     374        { 
     375        node->setPosition(pos.x, queryResult.y + terrainOffs, pos.z); 
     376                return true; 
     377        } 
     378 
     379        return false; 
     380} 
     381 
     382 
    241383/**************************************************************/ 
    242384/*      VisualizationRenderTargetListener implementation      */ 
Note: See TracChangeset for help on using the changeset viewer.