bool ETHActiveEntityHandler::AddEntityWhenEligible(ETHRenderEntity* entity) { if (ShouldEntityBeAlwaysActive(entity)) { entity->AddRef(); m_dynamicOrTempEntities.push_back(entity); #if defined(_DEBUG) || defined(DEBUG) TestEntityLists(); #endif return true; } else { return false; } }
bool ETHActiveEntityHandler::AddStaticCallbackWhenEligible(ETHRenderEntity* entity) { if (IsStaticCallbackEligible(entity)) { m_lastFrameCallbacks.push_back(entity); entity->AddRef(); #if defined(_DEBUG) || defined(DEBUG) TestEntityLists(); #endif return true; } else { return false; } }
void ETHTempEntityHandler::CheckTemporaryEntities(const Vector2& zAxisDir, ETHBucketManager& buckets, const unsigned long lastFrameElapsedTime) { #ifdef _DEBUG TestEntityLists(); #endif for (std::list<ETHRenderEntity*>::iterator iter = m_dynamicOrTempEntities.begin(); iter != m_dynamicOrTempEntities.end();) { ETHRenderEntity* pRenderEntity = *iter; pRenderEntity->Update(lastFrameElapsedTime, zAxisDir, buckets); // if the particle system is finished, erase it if ((pRenderEntity->IsTemporary() && pRenderEntity->AreParticlesOver())) { const Vector2 v2Bucket = ETHGlobal::GetBucket(pRenderEntity->GetPositionXY(), buckets.GetBucketSize()); ETHBucketMap::iterator bucketIter = buckets.Find(v2Bucket); if (bucketIter == buckets.GetLastBucket()) { iter++; continue; } // Remove from main bucket map buckets.DeleteEntity(pRenderEntity->GetID(), v2Bucket, false); #ifdef _DEBUG ETH_STREAM_DECL(ss) << GS_L("Entity ") << (*iter)->GetEntityName() << GS_L(" (ID#") << pRenderEntity->GetID() << GS_L(") removed from dynamic entity list (particle effects over)"); m_provider->Log(ss.str(), Platform::Logger::INFO); #endif (*iter)->Release(); iter = m_dynamicOrTempEntities.erase(iter); continue; } iter++; } }
void ETHActiveEntityHandler::UpdateActiveEntities(const Vector2& zAxisDir, ETHBucketManager& buckets, const unsigned long lastFrameElapsedTime) { #if defined(_DEBUG) || defined(DEBUG) TestEntityLists(); #endif for (std::list<ETHRenderEntity*>::iterator iter = m_dynamicOrTempEntities.begin(); iter != m_dynamicOrTempEntities.end();) { ETHRenderEntity* entity = (*iter); if (!(entity->IsAlive()) || RemoveFinishedTemporaryEntity(entity, buckets)) { #if defined(_DEBUG) || defined(DEBUG) ETH_STREAM_DECL(ss) << GS_L("Entity removed from dynamic entity list: ") << entity->GetEntityName(); m_provider->Log(ss.str(), Platform::Logger::INFO); #endif entity->Release(); iter = m_dynamicOrTempEntities.erase(iter); continue; } entity->Update(lastFrameElapsedTime, zAxisDir, buckets); if (entity->HasAnyCallbackFunction()) { entity->RunCallbackScript(); } ++iter; } // todo/to-do remove duplicate code for (std::list<ETHRenderEntity*>::iterator iter = m_lastFrameCallbacks.begin(); iter != m_lastFrameCallbacks.end();) { ETHRenderEntity* entity = (*iter); if (!(entity->IsAlive())) { #if defined(_DEBUG) || defined(DEBUG) ETH_STREAM_DECL(ss) << GS_L("Entity callback removed: ") << entity->GetEntityName(); m_provider->Log(ss.str(), Platform::Logger::INFO); #endif entity->Release(); iter = m_lastFrameCallbacks.erase(iter); continue; } else { entity->Update(lastFrameElapsedTime, zAxisDir, buckets); if (entity->HasAnyCallbackFunction()) { entity->RunCallbackScript(); } entity->Release(); ++iter; } } m_lastFrameCallbacks.clear(); }