diff --git a/source/graphics/UnitAnimation.cpp b/source/graphics/UnitAnimation.cpp index b20e6ba2f4..ee8dac54cd 100644 --- a/source/graphics/UnitAnimation.cpp +++ b/source/graphics/UnitAnimation.cpp @@ -73,6 +73,11 @@ void CUnitAnimation::AddModel(CModel* model, const CObjectEntry* object) model->SetAnimation(state.anims[state.animIdx], !m_Looping); + // Detect if this unit has any non-static animations + for (size_t i = 0; i < state.anims.size(); i++) + if (state.anims[i]->m_AnimDef != NULL) + m_AnimStatesAreStatic = false; + // Recursively add all props const std::vector& props = model->GetProps(); for (std::vector::const_iterator it = props.begin(); it != props.end(); ++it) @@ -89,6 +94,7 @@ void CUnitAnimation::ReloadUnit(CModel* model, const CObjectEntry* object) m_Object = object; m_AnimStates.clear(); + m_AnimStatesAreStatic = true; AddModel(m_Model, m_Object); } @@ -117,6 +123,9 @@ void CUnitAnimation::SetAnimationSyncRepeat(float repeatTime) void CUnitAnimation::SetAnimationSyncOffset(float actionTime) { + if (m_AnimStatesAreStatic) + return; + // Update all the synced prop models to each coincide with actionTime for (std::vector::iterator it = m_AnimStates.begin(); it != m_AnimStates.end(); ++it) { @@ -147,6 +156,9 @@ void CUnitAnimation::SetAnimationSyncOffset(float actionTime) void CUnitAnimation::Update(float time) { + if (m_AnimStatesAreStatic) + return; + // Advance all of the prop models independently for (std::vector::iterator it = m_AnimStates.begin(); it != m_AnimStates.end(); ++it) { diff --git a/source/graphics/UnitAnimation.h b/source/graphics/UnitAnimation.h index eb831f4691..dea9373d1b 100644 --- a/source/graphics/UnitAnimation.h +++ b/source/graphics/UnitAnimation.h @@ -105,6 +105,12 @@ private: std::vector m_AnimStates; + /** + * True if all the current AnimStates are static, so Update() doesn't need + * to do any work at all + */ + bool m_AnimStatesAreStatic; + void AddModel(CModel* model, const CObjectEntry* object); entity_id_t m_Entity;