Commit: 607dca070587f4d8bc4afa3c4a49e0f9a74873cd
Author: Porteries Tristan
Date:   Wed Jul 1 16:38:31 2015 +0200
Branches: master
https://developer.blender.org/rB607dca070587f4d8bc4afa3c4a49e0f9a74873cd

BGE: Fix T44069 playing action during libfree.

===================================================================

M       source/gameengine/Converter/KX_BlenderSceneConverter.cpp
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

===================================================================

diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp 
b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 9e53d9e..28de61f 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -1082,6 +1082,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie)
                                        if (IS_TAGGED(action)) {
                                                STR_HashedString an = 
action->name + 2;
                                                mapStringToActions.remove(an);
+                                               
m_map_blender_to_gameAdtList.remove(CHashedPtr(action));
                                                i--;
                                        }
                                }
@@ -1110,6 +1111,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie)
                                                }
                                        }
                                        else {
+                                               gameobj->RemoveTaggedActions();
                                                /* free the mesh, we could be 
referecing a linked one! */
                                                int mesh_index = 
gameobj->GetMeshCount();
                                                while (mesh_index--) {
diff --git a/source/gameengine/Ketsji/BL_ActionManager.cpp 
b/source/gameengine/Ketsji/BL_ActionManager.cpp
index c3d0f9e..975f9ea 100644
--- a/source/gameengine/Ketsji/BL_ActionManager.cpp
+++ b/source/gameengine/Ketsji/BL_ActionManager.cpp
@@ -26,6 +26,9 @@
 
 #include "BL_Action.h"
 #include "BL_ActionManager.h"
+#include "DNA_ID.h"
+
+#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT))
 
 BL_ActionManager::BL_ActionManager(class KX_GameObject *obj):
        m_obj(obj),
@@ -123,6 +126,18 @@ void BL_ActionManager::StopAction(short layer)
        if (action) action->Stop();
 }
 
+void BL_ActionManager::RemoveTaggedActions()
+{
+       for (BL_ActionMap::iterator it = m_layers.begin(); it != 
m_layers.end();) {
+               if (IS_TAGGED(it->second->GetAction())) {
+                       delete it->second;
+                       m_layers.erase(it++);
+               }
+               else
+                       ++it;
+       }
+}
+
 bool BL_ActionManager::IsActionDone(short layer)
 {
        BL_Action *action = GetAction(layer);
diff --git a/source/gameengine/Ketsji/BL_ActionManager.h 
b/source/gameengine/Ketsji/BL_ActionManager.h
index 45bcd10..00e5366 100644
--- a/source/gameengine/Ketsji/BL_ActionManager.h
+++ b/source/gameengine/Ketsji/BL_ActionManager.h
@@ -110,6 +110,11 @@ public:
        void StopAction(short layer);
 
        /**
+        * Remove playing tagged actions.
+        */
+       void RemoveTaggedActions();
+
+       /**
         * Check if an action has finished playing
         */
        bool IsActionDone(short layer);
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp 
b/source/gameengine/Ketsji/KX_GameObject.cpp
index 5701d0e..d98669c 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -469,6 +469,11 @@ void KX_GameObject::StopAction(short layer)
        GetActionManager()->StopAction(layer);
 }
 
+void KX_GameObject::RemoveTaggedActions()
+{
+       GetActionManager()->RemoveTaggedActions();
+}
+
 bool KX_GameObject::IsActionDone(short layer)
 {
        return GetActionManager()->IsActionDone(layer);
diff --git a/source/gameengine/Ketsji/KX_GameObject.h 
b/source/gameengine/Ketsji/KX_GameObject.h
index 670fcd6..3639d73 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -302,6 +302,11 @@ public:
        void StopAction(short layer);
 
        /**
+        * Remove playing tagged actions.
+        */
+       void RemoveTaggedActions();
+
+       /**
         * Check if an action has finished playing
         */
        bool IsActionDone(short layer);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to