Changeset 164 for trunk/VUT/work


Ignore:
Timestamp:
07/11/05 03:25:50 (19 years ago)
Author:
mattausch
Message:

bug fix (deleting while animation)

Location:
trunk/VUT/work/TestCullingTerrain
Files:
4 edited

Legend:

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

    r161 r164  
    120120mCurrentObjectType(0), 
    121121mApplication(app), 
    122 mUseAnimation(false) 
     122mUseAnimation(false), 
     123mDeleteObjects(false) 
    123124{ 
    124125        //mInputDevice = PlatformManager::getSingleton().createInputReader(); 
     
    206207                  
    207208                 Real val = Math::RangeRandom(0, 360); // random rotation 
     209 
    208210                 // get results, create a node/entity on the position 
    209211                 mCurrentObject = mTerrainContentGenerator->GenerateSceneObject( 
     
    301303        } 
    302304         
     305        if (mDeleteObjects) 
     306        { 
     307                mApplication->deleteEntityStates(); 
     308                mTerrainContentGenerator->RemoveGeneratedObjects(); 
     309                mDeleteObjects = false; 
     310        } 
     311 
    303312        if (mUseAnimation) // update animations 
    304313        { 
     
    10341043                break; 
    10351044        case KC_F9: 
    1036                 toggleUseAnimation(); 
     1045                mUseAnimation = !mUseAnimation; 
    10371046                break; 
    10381047        case KC_F11: 
    1039                 takeScreenShot(); 
     1048                takeScreenshot(); 
    10401049                break; 
    10411050        case KC_F12: 
     
    10531062                break; 
    10541063        case KC_DELETE: 
    1055                 mApplication->deleteEntityStates(); 
    1056                 mTerrainContentGenerator->RemoveGeneratedObjects(); 
     1064                mDeleteObjects = true; 
    10571065                break; 
    10581066        //KEY_PRESSED(KC_F3, 0.3, writeFrames()); 
     
    12231231} 
    12241232//----------------------------------------------------------------------- 
    1225 void TerrainFrameListener::takeScreenShot() 
     1233void TerrainFrameListener::takeScreenshot() 
    12261234{ 
    12271235        char tmp[20]; 
     
    14151423        queryPanel->setHeight(top + border_height); 
    14161424} 
    1417 //----------------------------------------------------------------------- 
    1418 void TerrainFrameListener::toggleUseAnimation() 
    1419 { 
    1420         mUseAnimation = !mUseAnimation; 
    1421 } 
  • trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h

    r161 r164  
    112112        void toggleShowShadows(); 
    113113        void toggleDisplayCameraDetails(); 
    114         void takeScreenShot(); 
     114        void takeScreenshot(); 
    115115        void nextSceneDetailLevel(); 
    116116        void nextFilter(); 
     
    125125        void toggleShowViz(); 
    126126        void toggleRecord(); 
    127         void toggleUseAnimation(); 
    128127 
    129128        /** Applies visibility query. Collects the visible objects  
     
    241240        float mMoveScale; 
    242241    Degree mRotScale; 
     242 
    243243    // just to stop toggles flipping too fast 
    244244    Real mTimeDelay; 
     
    272272        int mCurrentObjectType; 
    273273 
     274        bool mDeleteObjects; 
     275 
    274276        TestCullingTerrainApplication *mApplication; 
    275277}; 
  • trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp

    r161 r164  
    2424}; 
    2525 
     26const float walk_duration = 10.0f; 
     27const float wait_duration = 2.0f; 
     28const float rotate_factor = 0.7f; 
     29const float move_factor = 0.03; 
     30 
    2631/***************************************/ 
    2732/*      EntityState implementation     */ 
    2833/***************************************/ 
     34Vector3 EntityState::msMinPos = Vector3::ZERO; 
     35Vector3 EntityState::msMaxPos = Vector3::ZERO; 
     36 
    2937EntityState::EntityState(Entity *ent, State entityState, Real speed): 
    3038mEntity(ent), mState(entityState), mAnimationSpeed(speed) 
     
    5361} 
    5462//----------------------------------------------------------------------- 
     63EntityState::~EntityState() 
     64{ 
     65        mAnimationState = NULL; 
     66        mEntity = NULL; 
     67} 
     68//----------------------------------------------------------------------- 
    5569Entity *EntityState::GetEntity() 
    5670{ 
     
    6680{ 
    6781        mTimeElapsed -= timeSinceLastFrame * mAnimationSpeed; 
     82 
     83        if (!mEntity || !mAnimationState) 
     84                return; 
    6885         
    6986        if (mState == MOVING) // toggle between moving (longer) and waiting (short) 
    7087        { 
    7188                SceneNode *parent = mEntity->getParentSceneNode(); 
     89                 
     90                if (!parent) 
     91                        return; 
    7292 
    7393                if (mTimeElapsed <= 0) // toggle animation state 
     
    7696                        { 
    7797                                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); 
     98                                 
     99                                mTimeElapsed = walk_duration; // walk for mTimeElapsed units 
     100 
     101                                // choose random rotation 
     102                                Radian rnd = Radian(Math::UnitRandom() * Math::PI * rotate_factor); 
    82103 
    83104                                //mEntity->getParentSceneNode()->rotate(); 
     
    87108                        { 
    88109                                SetAnimationState("Idle", true); 
    89                                 mTimeElapsed = 2; // wait for mTimeElapsed seconds 
     110                                mTimeElapsed = wait_duration; // wait for mTimeElapsed seconds 
    90111                        } 
    91112                } 
    92113 
    93                 if (mAnimationState->getAnimationName() == "Walk") 
     114                if (mAnimationState->getAnimationName() == "Walk") // move forward 
    94115                { 
     116                        // store old position, just in case we get out of bounds 
    95117                        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 
     118                        parent->translate(parent->getLocalAxes(), Vector3(move_factor * mAnimationSpeed, 0, 0)); 
     119 
     120                        // HACK: if out of bounds => reset to old position and set animationstate to idle 
    100121                        if (OutOfBounds(parent))  
    101122                        { 
    102123                                parent->setPosition(oldPos); 
    103                                 SetAnimationState("Idle); 
     124                                SetAnimationState("Idle", true); 
    104125                                 
    105                                 mTimeElapsed = 2; 
     126                                mTimeElapsed = wait_duration; 
    106127                        } 
    107128                } 
    108129        } 
    109130                 
    110         if (mAnimationState) // add time to drive animation 
    111         { 
    112                 mAnimationState->addTime(timeSinceLastFrame * mAnimationSpeed); 
    113         } 
     131        // add time to drive animation 
     132        mAnimationState->addTime(timeSinceLastFrame * mAnimationSpeed); 
    114133} 
    115134//----------------------------------------------------------------------- 
    116135void EntityState::SetAnimationState(String stateStr, bool loop) 
    117136{ 
     137        if (!mEntity) 
     138                return; 
     139 
    118140        mAnimationState = mEntity->getAnimationState(stateStr); 
    119141        mAnimationState->setLoop(loop); 
     
    126148 
    127149        if ((pos > msMinPos) && (pos < msMaxPos)) 
    128                 return true; 
    129  
    130         return false; 
    131 } 
     150                return false; 
     151 
     152        return true; 
     153} 
     154 
     155 
     156 
    132157/*********************************************************/ 
    133158/*      TestCullingTerrainApplication implementation     */ 
     
    136161 
    137162TestCullingTerrainApplication::TestCullingTerrainApplication(): 
    138 mTerrainContentGenerator(NULL) 
     163mTerrainContentGenerator(NULL), mRayQueryExecutor(NULL) 
    139164{ 
    140165} 
     
    144169        OGRE_DELETE(mTerrainContentGenerator); 
    145170        OGRE_DELETE(mRayQueryExecutor); 
     171 
    146172        deleteEntityStates(); 
    147173} 
     
    151177        for (int i = 0; i < (int)mEntityStates.size(); ++i) 
    152178        { 
    153                 delete mEntityStates[i]; 
    154                 mEntityStates[i] = NULL; 
    155         } 
     179                OGRE_DELETE(mEntityStates[i]); 
     180        } 
     181 
    156182        mEntityStates.clear(); 
    157183} 
     
    248274        mSceneMgr->setWorldGeometry(terrain_cfg); 
    249275         
    250         // ray query executor 
    251         mRayQueryExecutor = new RayQueryExecutor(mSceneMgr); 
    252276 
    253277        //-- CEGUI setup 
     
    274298        mSceneMgr->_renderScene(mCamera, mWindow->getViewport(0), true); 
    275299 
     300        // ray query executor: needed to clamp to terrain 
     301        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr); 
     302 
     303        mTerrainMinPos = EntityState::msMinPos = Vector3(0, 0, 0); 
     304        mTerrainMaxPos = EntityState::msMaxPos = Vector3(3000, 5000, 3000); 
     305 
    276306        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr); 
    277307         
     
    280310        { 
    281311                // to provide much occlusion, 
    282                 // height is restricted to 50 => no objects appear on peaks 
    283                 mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 50.0f, 3000.0f)); 
     312                // height is restricted to 50 => no objects are created on peaks 
     313                mTerrainContentGenerator->SetMinPos(Vector3(mTerrainMinPos)); 
     314                mTerrainContentGenerator->SetMaxPos(Vector3(mTerrainMaxPos.x, 50.0f, mTerrainMaxPos.z)); 
    284315                mTerrainContentGenerator->SetOffset(0); 
    285316 
     
    288319        } 
    289320 
    290         // no limitations needed anymore: the user can set  
    291         // objects also on peaks of terrain 
    292         mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 5000.0f, 3000.0f)); 
     321        // no limitations anymore => it is possible for the user to put single  
     322        // objects on peaks of the terrain (only few, not relevant for occlusion) 
     323        mTerrainContentGenerator->SetMaxPos(mTerrainMaxPos); 
    293324} 
    294325//----------------------------------------------------------------------- 
     
    314345        for (int i = 0; i < (int)mEntityStates.size(); ++i) 
    315346        { 
    316                 SceneNode *sm = mEntityStates[i]->GetEntity()->getParentSceneNode(); 
     347                SceneNode *sn = mEntityStates[i]->GetEntity()->getParentSceneNode(); 
    317348 
    318349                mEntityStates[i]->update(timeSinceLastFrame); 
     
    320351                if (mEntityStates[i]->GetState() == EntityState::MOVING) 
    321352                { 
    322                         Clamp2Terrain(sn, 0); 
    323                         //sm->setNodeVisible(false); 
     353                        Clamp2Terrain(sn, 0); //sn->setNodeVisible(false); 
    324354                } 
    325355        } 
  • trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.h

    r161 r164  
    3434 
    3535        EntityState(Entity *ent, State entityState, Real speed); 
    36  
     36        ~EntityState(); 
    3737        /** Update the entity state. 
    3838        */ 
     
    4646        */ 
    4747        EntityState::State GetState(); 
     48 
     49        static bool OutOfBounds(SceneNode *node); 
     50 
     51        static Vector3 msMinPos; 
     52        static Vector3 msMaxPos; 
    4853 
    4954protected: 
     
    136141        RayQueryExecutor *mRayQueryExecutor; 
    137142 
     143        Vector3 mTerrainMinPos; 
     144        Vector3 mTerrainMaxPos; 
    138145private: 
    139146        void chooseSceneManager(void); 
Note: See TracChangeset for help on using the changeset viewer.