From 0d36233dd81c92d98b2e665d04a8034e7b27aba0 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Tue, 6 Oct 2015 22:16:22 -0700 Subject: Fix for T41536: 2.71 getActionFrame no longer returns frames accurately We now keep actions around when they are finished playing so scripts can still get access to information such as the current frame. Playing a new action in the same layer still overwrites the previous action as before this commit. Using an explicit KX_GameObject.stopAction() will free the memory. The action is also freed when the KX_GameObject is freed as before. --- source/gameengine/Ketsji/BL_Action.cpp | 5 ----- source/gameengine/Ketsji/BL_Action.h | 4 ---- source/gameengine/Ketsji/BL_ActionManager.cpp | 28 ++++++++++----------------- source/gameengine/Ketsji/BL_ActionManager.h | 5 ----- 4 files changed, 10 insertions(+), 32 deletions(-) (limited to 'source/gameengine/Ketsji') diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp index 12a1caee221..507476dbd0e 100644 --- a/source/gameengine/Ketsji/BL_Action.cpp +++ b/source/gameengine/Ketsji/BL_Action.cpp @@ -268,11 +268,6 @@ bool BL_Action::Play(const char* name, return true; } -void BL_Action::Stop() -{ - m_done = true; -} - bool BL_Action::IsDone() { return m_done; diff --git a/source/gameengine/Ketsji/BL_Action.h b/source/gameengine/Ketsji/BL_Action.h index 379dd52df5b..7a404416758 100644 --- a/source/gameengine/Ketsji/BL_Action.h +++ b/source/gameengine/Ketsji/BL_Action.h @@ -93,10 +93,6 @@ public: short ipo_flags, float playback_speed, short blend_mode); - /** - * Stop playing the action - */ - void Stop(); /** * Whether or not the action is still playing */ diff --git a/source/gameengine/Ketsji/BL_ActionManager.cpp b/source/gameengine/Ketsji/BL_ActionManager.cpp index 9e4690548d3..4249db55b45 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.cpp +++ b/source/gameengine/Ketsji/BL_ActionManager.cpp @@ -53,14 +53,6 @@ BL_Action *BL_ActionManager::GetAction(short layer) return (it != m_layers.end()) ? it->second : 0; } -BL_Action* BL_ActionManager::AddAction(short layer) -{ - BL_Action *action = new BL_Action(m_obj); - m_layers[layer] = action; - - return action; -} - float BL_ActionManager::GetActionFrame(short layer) { BL_Action *action = GetAction(layer); @@ -116,8 +108,10 @@ bool BL_ActionManager::PlayAction(const char* name, { // Only this method will create layer if non-existent BL_Action *action = GetAction(layer); - if (!action) - action = AddAction(layer); + if (!action) { + action = new BL_Action(m_obj); + m_layers[layer] = action; + } // Disable layer blending on the first layer if (layer == 0) layer_weight = -1.f; @@ -129,7 +123,10 @@ void BL_ActionManager::StopAction(short layer) { BL_Action *action = GetAction(layer); - if (action) action->Stop(); + if (action) { + m_layers.erase(layer); + delete action; + } } void BL_ActionManager::RemoveTaggedActions() @@ -158,15 +155,10 @@ void BL_ActionManager::Update(float curtime) m_prevUpdate = curtime; BL_ActionMap::iterator it; - for (it = m_layers.begin(); it != m_layers.end(); ) + for (it = m_layers.begin(); it != m_layers.end(); ++it) { - if (it->second->IsDone()) { - delete it->second; - m_layers.erase(it++); - } - else { + if (!it->second->IsDone()) { it->second->Update(curtime); - ++it; } } } diff --git a/source/gameengine/Ketsji/BL_ActionManager.h b/source/gameengine/Ketsji/BL_ActionManager.h index 97d6d88cf22..1292938d8f4 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.h +++ b/source/gameengine/Ketsji/BL_ActionManager.h @@ -59,11 +59,6 @@ private: */ BL_Action* GetAction(short layer); - /** - * Add new action with given layer - */ - BL_Action* AddAction(short layer); - public: BL_ActionManager(class KX_GameObject* obj); ~BL_ActionManager(); -- cgit v1.2.3