forked from bartvdbraak/blender
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.
This commit is contained in:
parent
e4e8e359a1
commit
0d36233dd8
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user