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