Commit: 087bbe624f6e0de50c409866faa8fce4585808c0
Author: Mitchell Stokes
Date:   Fri May 9 16:03:54 2014 -0700
https://developer.blender.org/rB087bbe624f6e0de50c409866faa8fce4585808c0

BGE: Fixing shape key animations on meshes with no armature.

Their transverts were not being updated after code changes for
multi-threaded skinning.

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

M       source/gameengine/Converter/BL_ShapeDeformer.cpp
M       source/gameengine/Converter/BL_SkinDeformer.cpp
M       source/gameengine/Converter/BL_SkinDeformer.h
M       source/gameengine/Ketsji/KX_Scene.cpp

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

diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp 
b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index 8bb9f85..b9b2732 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -222,6 +222,9 @@ bool BL_ShapeDeformer::Update(void)
                if (m_recalcNormal)
                        RecalcNormals();
 #endif
+
+               // We also need to handle transverts now (used to be in 
BL_SkinDeformer::Apply())
+               UpdateTransverts();
                bSkinUpdate = true;
        }
 
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp 
b/source/gameengine/Converter/BL_SkinDeformer.cpp
index 8e1f512..e7137a5 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -287,6 +287,43 @@ void BL_SkinDeformer::BGEDeformVerts()
        m_copyNormals = true;
 }
 
+void BL_SkinDeformer::UpdateTransverts()
+{
+       RAS_MeshSlot::iterator it;
+       RAS_MeshMaterial *mmat;
+       RAS_MeshSlot *slot;
+       size_t i, nmat, imat;
+
+       if (m_transverts) {
+               // the vertex cache is unique to this deformer, no need to 
update it
+               // if it wasn't updated! We must update all the materials at 
once
+               // because we will not get here again for the other material
+               nmat = m_pMeshObject->NumMaterials();
+               for (imat=0; imat<nmat; imat++) {
+                       mmat = m_pMeshObject->GetMeshMaterial(imat);
+                       if (!mmat->m_slots[(void*)m_gameobj])
+                               continue;
+
+                       slot = *mmat->m_slots[(void*)m_gameobj];
+
+                       // for each array
+                       for (slot->begin(it); !slot->end(it); slot->next(it)) {
+                               // for each vertex
+                               // copy the untransformed data from the 
original mvert
+                               for (i=it.startvertex; i<it.endvertex; i++) {
+                                       RAS_TexVert& v = it.vertex[i];
+                                       
v.SetXYZ(m_transverts[v.getOrigIndex()]);
+                                       if (m_copyNormals)
+                                               
v.SetNormal(m_transnors[v.getOrigIndex()]);
+                               }
+                       }
+               }
+
+               if (m_copyNormals)
+                       m_copyNormals = false;
+       }
+}
+
 bool BL_SkinDeformer::UpdateInternal(bool shape_applied)
 {
        /* See if the armature has been updated for this frame */
@@ -317,40 +354,10 @@ bool BL_SkinDeformer::UpdateInternal(bool shape_applied)
                m_armobj->RestorePose();
                /* dynamic vertex, cannot use display list */
                m_bDynamic = true;
-               /* indicate that the m_transverts and normals are up to date */
-               RAS_MeshSlot::iterator it;
-               RAS_MeshMaterial *mmat;
-               RAS_MeshSlot *slot;
-               size_t i, nmat, imat;
-
-               if (m_transverts) {
-                       // the vertex cache is unique to this deformer, no need 
to update it
-                       // if it wasn't updated! We must update all the 
materials at once
-                       // because we will not get here again for the other 
material
-                       nmat = m_pMeshObject->NumMaterials();
-                       for (imat=0; imat<nmat; imat++) {
-                               mmat = m_pMeshObject->GetMeshMaterial(imat);
-                               if (!mmat->m_slots[(void*)m_gameobj])
-                                       continue;
-
-                               slot = *mmat->m_slots[(void*)m_gameobj];
-
-                               // for each array
-                               for (slot->begin(it); !slot->end(it); 
slot->next(it)) {
-                                       // for each vertex
-                                       // copy the untransformed data from the 
original mvert
-                                       for (i=it.startvertex; i<it.endvertex; 
i++) {
-                                               RAS_TexVert& v = it.vertex[i];
-                                               
v.SetXYZ(m_transverts[v.getOrigIndex()]);
-                                               if (m_copyNormals)
-                                                       
v.SetNormal(m_transnors[v.getOrigIndex()]);
-                                       }
-                               }
-                       }
 
-                       if (m_copyNormals)
-                               m_copyNormals = false;
-               }
+               UpdateTransverts();
+
+               /* indicate that the m_transverts and normals are up to date */
                return true;
        }
 
diff --git a/source/gameengine/Converter/BL_SkinDeformer.h 
b/source/gameengine/Converter/BL_SkinDeformer.h
index 7495deb..79043f6 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.h
+++ b/source/gameengine/Converter/BL_SkinDeformer.h
@@ -114,6 +114,8 @@ protected:
        void BlenderDeformVerts();
        void BGEDeformVerts();
 
+       void UpdateTransverts();
+
 
 #ifdef WITH_CXX_GUARDEDALLOC
        MEM_CXX_CLASS_ALLOC_FUNCS("GE:BL_SkinDeformer")
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp 
b/source/gameengine/Ketsji/KX_Scene.cpp
index 4c9fba8..c826f39 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -1636,6 +1636,9 @@ static void update_anim_thread_func(TaskPool *pool, void 
*taskdata, int UNUSED(t
                gameobj->UpdateActionManager(curtime);
                children = gameobj->GetChildren();
 
+               if (gameobj->GetDeformer())
+                       gameobj->GetDeformer()->Update();
+
                for (int j=0; j<children->GetCount(); ++j) {
                        child = (KX_GameObject*)children->GetValue(j);

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

Reply via email to