- Timestamp:
- 07/08/05 17:34:05 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp
r160 r161 7 7 8 8 #include <Ogre.h> 9 9 10 //#include "OgreReferenceAppLayer.h" 10 11 //#include "OgreRefAppWorld.h" … … 23 24 }; 24 25 26 /***************************************/ 27 /* EntityState implementation */ 28 /***************************************/ 29 EntityState::EntityState(Entity *ent, State entityState, Real speed): 30 mEntity(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 //----------------------------------------------------------------------- 55 Entity *EntityState::GetEntity() 56 { 57 return mEntity; 58 } 59 //----------------------------------------------------------------------- 60 EntityState::State EntityState::GetState() 61 { 62 return mState; 63 } 64 //----------------------------------------------------------------------- 65 void 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 //----------------------------------------------------------------------- 116 void EntityState::SetAnimationState(String stateStr, bool loop) 117 { 118 mAnimationState = mEntity->getAnimationState(stateStr); 119 mAnimationState->setLoop(loop); 120 mAnimationState->setEnabled(true); 121 } 122 //----------------------------------------------------------------------- 123 bool 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 } 25 132 /*********************************************************/ 26 133 /* TestCullingTerrainApplication implementation */ … … 35 142 TestCullingTerrainApplication::~TestCullingTerrainApplication() 36 143 { 37 if (mTerrainContentGenerator) 38 { 39 delete mTerrainContentGenerator; 40 mTerrainContentGenerator = NULL; 41 } 144 OGRE_DELETE(mTerrainContentGenerator); 145 OGRE_DELETE(mRayQueryExecutor); 146 deleteEntityStates(); 147 } 148 //----------------------------------------------------------------------- 149 void 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(); 42 157 } 43 158 //----------------------------------------------------------------------- … … 133 248 mSceneMgr->setWorldGeometry(terrain_cfg); 134 249 250 // ray query executor 251 mRayQueryExecutor = new RayQueryExecutor(mSceneMgr); 252 135 253 //-- CEGUI setup 136 254 setupGui(); … … 185 303 186 304 //-- 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 //----------------------------------------------------------------------- 312 void 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 //----------------------------------------------------------------------- 328 EntityStates &TestCullingTerrainApplication::getEntityStates() 329 { 330 return mEntityStates; 207 331 } 208 332 //----------------------------------------------------------------------- … … 239 363 mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE); 240 364 } 365 //----------------------------------------------------------------------- 366 bool 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 241 383 /**************************************************************/ 242 384 /* VisualizationRenderTargetListener implementation */
Note: See TracChangeset
for help on using the changeset viewer.