Commit: 362b25b38287cb75e4d22b30bdbc7f47e8eb3fdf Author: Mitchell Stokes Date: Sun May 4 15:37:18 2014 -0700 https://developer.blender.org/rB362b25b38287cb75e4d22b30bdbc7f47e8eb3fdf
Fix T39928: Blender crash/freeze when game engine is started with animation played directly on camera object with parents. Updating object IPOs is not currently thread-safe since it also updates children. This leads to problems when parents and children are both animated. For now, updating object IPOs is done in its own loop to avoid threading issues. =================================================================== M source/gameengine/Ketsji/BL_Action.cpp M source/gameengine/Ketsji/BL_Action.h M source/gameengine/Ketsji/BL_ActionManager.cpp M source/gameengine/Ketsji/BL_ActionManager.h M source/gameengine/Ketsji/KX_GameObject.cpp M source/gameengine/Ketsji/KX_GameObject.h M source/gameengine/Ketsji/KX_Scene.cpp =================================================================== diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp index e4ab2d5..a50c07a 100644 --- a/source/gameengine/Ketsji/BL_Action.cpp +++ b/source/gameengine/Ketsji/BL_Action.cpp @@ -485,8 +485,15 @@ void BL_Action::Update(float curtime) } } - m_obj->UpdateIPO(m_localtime, m_ipo_flags & ACT_IPOFLAG_CHILD); + // This isn't thread-safe, so we move it into it's own function for now + //m_obj->UpdateIPO(m_localtime, m_ipo_flags & ACT_IPOFLAG_CHILD); if (m_done) ClearControllerList(); } + +void BL_Action::UpdateIPOs() +{ + if (!m_done) + m_obj->UpdateIPO(m_localtime, m_ipo_flags & ACT_IPOFLAG_CHILD); +} diff --git a/source/gameengine/Ketsji/BL_Action.h b/source/gameengine/Ketsji/BL_Action.h index 463d177..dd1cd1f 100644 --- a/source/gameengine/Ketsji/BL_Action.h +++ b/source/gameengine/Ketsji/BL_Action.h @@ -105,6 +105,10 @@ public: * Update the action's frame, etc. */ void Update(float curtime); + /** + * Update object IPOs (note: not thread-safe!) + */ + void UpdateIPOs(); // Accessors float GetFrame(); diff --git a/source/gameengine/Ketsji/BL_ActionManager.cpp b/source/gameengine/Ketsji/BL_ActionManager.cpp index 2e882ce..404f276 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.cpp +++ b/source/gameengine/Ketsji/BL_ActionManager.cpp @@ -102,3 +102,14 @@ void BL_ActionManager::Update(float curtime) } } } + +void BL_ActionManager::UpdateIPOs() +{ + for (int i=0; i<MAX_ACTION_LAYERS; ++i) + { + if (!m_layers[i]->IsDone()) + { + m_layers[i]->UpdateIPOs(); + } + } +} diff --git a/source/gameengine/Ketsji/BL_ActionManager.h b/source/gameengine/Ketsji/BL_ActionManager.h index 8c5b8e9..be9097c 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.h +++ b/source/gameengine/Ketsji/BL_ActionManager.h @@ -98,6 +98,11 @@ public: */ void Update(float); + /** + * Update object IPOs (note: not thread-safe!) + */ + void UpdateIPOs(); + #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("GE:BL_ActionManager") #endif diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 7042e6e..9ea7698 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -462,6 +462,11 @@ void KX_GameObject::UpdateActionManager(float curtime) GetActionManager()->Update(curtime); } +void KX_GameObject::UpdateActionIPOs() +{ + GetActionManager()->UpdateIPOs(); +} + float KX_GameObject::GetActionFrame(short layer) { return GetActionManager()->GetActionFrame(layer); diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index ac0afca..7450be4 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -300,6 +300,12 @@ public: */ void UpdateActionManager(float curtime); + /** + * Have the action manager update IPOs + * note: not thread-safe! + */ + void UpdateActionIPOs(); + /********************************* * End Animation API *********************************/ diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 5a33a61..4c9fba8 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1658,6 +1658,10 @@ void KX_Scene::UpdateAnimations(double curtime) BLI_task_pool_work_and_wait(pool); BLI_task_pool_free(pool); + + for (int i=0; i<m_animatedlist->GetCount(); ++i) { + ((KX_GameObject*)m_animatedlist->GetValue(i))->UpdateActionIPOs(); + } } void KX_Scene::LogicUpdateFrame(double curtime, bool frame) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs