r695 - trunk

lordhavoc at icculus.org lordhavoc at icculus.org
Sat Apr 8 17:50:07 EDT 2006


Author: lordhavoc
Date: 2006-04-08 17:50:07 -0400 (Sat, 08 Apr 2006)
New Revision: 695

Modified:
   trunk/model.c
Log:
calculate strongest 4 vertex weights on each vertex, this is in
preparation for matrix-palette skeletal animation code


Modified: trunk/model.c
===================================================================
--- trunk/model.c	2006-04-08 21:49:27 UTC (rev 694)
+++ trunk/model.c	2006-04-08 21:50:07 UTC (rev 695)
@@ -502,17 +502,44 @@
 			for (i = 0;i < mesh->num_vertices;i++)
 			{
 				Ndouble sum = 0;
+				NUint32 k;
 				for (j = 0, md5weight = md5weights + md5weightrange[i*2+0];j < md5weightrange[i*2+1];j++, md5weight++)
 				{
 					matrix = &model->data_transforminfo[md5weight->jointnum].basematrix;
 					mesh->data_vertex3f[i*3+0] += DotProduct4(md5weight->vertex, matrix->m[0]);
 					mesh->data_vertex3f[i*3+1] += DotProduct4(md5weight->vertex, matrix->m[1]);
 					mesh->data_vertex3f[i*3+2] += DotProduct4(md5weight->vertex, matrix->m[2]);
+					// store the best weights in the vertex's limited number of blend weights
+					for (k = 4;k >= 1 && mesh->data_weightvalue4f[i*4+k-1] < md5weight->vertex[3];k--)
+					{
+						if (k < 4)
+						{
+							mesh->data_weightindex4i[i*4+k] = mesh->data_weightindex4i[i*4+k-1];
+							mesh->data_weightvalue4f[i*4+k] = mesh->data_weightvalue4f[i*4+k-1];
+						}
+					}
+					if (k < 4)
+					{
+						mesh->data_weightindex4i[i*4+k] = md5weight->jointnum;
+						mesh->data_weightvalue4f[i*4+k] = md5weight->vertex[3];
+					}
 					sum += md5weight->vertex[3];
 					mesh->num_weights++;
 				}
 				if (fabs(sum - 1) > 0.001)
 					Console_Printf("vertex #%i (weights %i-%i) does not sum to 1! (sum = %f)\n", i, md5weightrange[i*2+0], md5weightrange[i*2+0]+md5weightrange[i*2+1], sum);
+				if (mesh->data_weightvalue4f[i*4+3] > mesh->data_weightvalue4f[i*4+2] || mesh->data_weightvalue4f[i*4+2] > mesh->data_weightvalue4f[i*4+1] || mesh->data_weightvalue4f[i*4+1] > mesh->data_weightvalue4f[i*4+0])
+					Console_Printf("vertex sorting error!  vertex #%i has weights %i:%f %i:%f %i:%f %i:%f\n", i, mesh->data_weightindex4i[i*4+0], mesh->data_weightvalue4f[i*4+0], mesh->data_weightindex4i[i*4+1], mesh->data_weightvalue4f[i*4+1], mesh->data_weightindex4i[i*4+2], mesh->data_weightvalue4f[i*4+2], mesh->data_weightindex4i[i*4+3], mesh->data_weightvalue4f[i*4+3]);
+				// renormalize the array of strongest weights on this vertex
+				sum = 0;
+				for (k = 0;k < 4;k++)
+					sum += mesh->data_weightvalue4f[i*4+k];
+				if (sum)
+				{
+					sum = 1.0f / sum;
+					for (k = 0;k < 4;k++)
+						mesh->data_weightvalue4f[i*4+k] *= sum;
+				}
 			}
 			// compile the base frame of the mesh for static uses
 			Model_MeshVectors(mesh->num_triangles, mesh->data_element3i, mesh->num_vertices, mesh->data_vertex3f, mesh->data_texcoord2f, mesh->data_svector3f, mesh->data_tvector3f, mesh->data_normal3f);




More information about the neither-commits mailing list