[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49371] trunk/blender/source/gameengine/ Converter/BL_SkinDeformer.cpp: BGE: Fix for [#31993] " BGE Vertex deformer optimized method does not work properly" reported by Mario Mey plus some other cleanup.

Mitchell Stokes mogurijin at gmail.com
Mon Jul 30 01:49:18 CEST 2012


Revision: 49371
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49371
Author:   moguri
Date:     2012-07-29 23:49:17 +0000 (Sun, 29 Jul 2012)
Log Message:
-----------
BGE: Fix for [#31993] "BGE Vertex deformer optimized method does not work properly" reported by Mario Mey plus some other cleanup. The bug was caused by not taking the object matrix into account when doing the transforms (when I developed the deformer, my test file had the object at the origin...).

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp

Modified: trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp	2012-07-29 20:00:16 UTC (rev 49370)
+++ trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp	2012-07-29 23:49:17 UTC (rev 49371)
@@ -238,6 +238,7 @@
 	MDeformVert *dverts = m_bmesh->dvert;
 	bDeformGroup *dg;
 	int defbase_tot = BLI_countlist(&m_objMesh->defbase);
+	Eigen::Matrix4f pre_mat, post_mat, chan_mat, norm_chan_mat;
 
 	if (!dverts)
 		return;
@@ -257,15 +258,18 @@
 		}
 	}
 
+	post_mat = Eigen::Matrix4f::Map((float*)m_obmat).inverse() * Eigen::Matrix4f::Map((float*)m_armobj->GetArmatureObject()->obmat);
+	pre_mat = post_mat.inverse();
+
 	MDeformVert *dv= dverts;
+	MDeformWeight *dw;
 
 	for (int i=0; i<m_bmesh->totvert; ++i, dv++)
 	{
-		float contrib = 0.f, weight, max_weight=0.f;
+		float contrib = 0.f, weight, max_weight=-1.f;
 		bPoseChannel *pchan=NULL;
-		Eigen::Map<Eigen::Vector3f> norm(m_transnors[i]);
+		Eigen::Map<Eigen::Vector3f> norm = Eigen::Vector3f::Map(m_transnors[i]);
 		Eigen::Vector4f vec(0, 0, 0, 1);
-		Eigen::Matrix4f norm_chan_mat;
 		Eigen::Vector4f co(m_transverts[i][0],
 							m_transverts[i][1],
 							m_transverts[i][2],
@@ -274,8 +278,10 @@
 		if (!dv->totweight)
 			continue;
 
-		MDeformWeight *dw= dv->dw;
+		co = pre_mat * co;
 
+		dw= dv->dw;
+
 		for (unsigned int j= dv->totweight; j != 0; j--, dw++)
 		{
 			const int index = dw->def_nr;
@@ -286,12 +292,10 @@
 
 				if (weight)
 				{
-					Eigen::Vector4f cop(co);
-					Eigen::Matrix4f chan_mat = Eigen::Matrix4f::Map((float*)pchan->chan_mat);
+					chan_mat = Eigen::Matrix4f::Map((float*)pchan->chan_mat);
 
 					// Update Vertex Position
-					cop = chan_mat*cop;
-					vec += (cop - co)*weight;
+					vec.noalias() += (chan_mat*co - co)*weight;
 
 					// Save the most influential channel so we can use it to update the vertex normal
 					if (weight > max_weight)
@@ -304,17 +308,15 @@
 				}
 			}
 		}
-
 		
 		// Update Vertex Normal
 		norm = norm_chan_mat.topLeftCorner<3, 3>()*norm;
-				
-		if (contrib > 0.0001f)
-		{
-			vec *= 1.f/contrib;
-			co += vec;
-		}
 
+		co.noalias() += vec/contrib;
+		co[3] = 1.f; // Make sure we have a 1 for the w component!
+
+		co = post_mat * co;
+
 		m_transverts[i][0] = co[0];
 		m_transverts[i][1] = co[1];
 		m_transverts[i][2] = co[2];




More information about the Bf-blender-cvs mailing list