[Bf-blender-cvs] [087bbe6] master: BGE: Fixing shape key animations on meshes with no armature.

Mitchell Stokes noreply at git.blender.org
Sat May 10 01:07:28 CEST 2014


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);




More information about the Bf-blender-cvs mailing list