- // stuff not processed here: normal
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].vertexindex = j;
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].boneindex = BigLong(vert->bonenum);
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].origin[0] = BigFloat(vert->origin[0]);
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].origin[1] = BigFloat(vert->origin[1]);
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].origin[2] = BigFloat(vert->origin[2]);
- loadmodel->surfmesh.data_vertexboneweights[numvertexboneweights].origin[3] = BigFloat(vert->influence);
- numvertexboneweights++;
+ int boneindex = BigLong(vert->bonenum);
+ const float *m = bonepose + 12 * boneindex;
+ float influence = BigFloat(vert->influence);
+ float relativeorigin[3], relativenormal[3];
+ relativeorigin[0] = BigFloat(vert->origin[0]);
+ relativeorigin[1] = BigFloat(vert->origin[1]);
+ relativeorigin[2] = BigFloat(vert->origin[2]);
+ relativenormal[0] = BigFloat(vert->normal[0]);
+ relativenormal[1] = BigFloat(vert->normal[1]);
+ relativenormal[2] = BigFloat(vert->normal[2]);
+ // blend the vertex bone weights into the base mesh
+ loadmodel->surfmesh.data_vertex3f[j*3+0] += relativeorigin[0] * m[0] + relativeorigin[1] * m[1] + relativeorigin[2] * m[ 2] + influence * m[ 3];
+ loadmodel->surfmesh.data_vertex3f[j*3+1] += relativeorigin[0] * m[4] + relativeorigin[1] * m[5] + relativeorigin[2] * m[ 6] + influence * m[ 7];
+ loadmodel->surfmesh.data_vertex3f[j*3+2] += relativeorigin[0] * m[8] + relativeorigin[1] * m[9] + relativeorigin[2] * m[10] + influence * m[11];
+ loadmodel->surfmesh.data_normal3f[j*3+0] += relativenormal[0] * m[0] + relativenormal[1] * m[1] + relativenormal[2] * m[ 2];
+ loadmodel->surfmesh.data_normal3f[j*3+1] += relativenormal[0] * m[4] + relativenormal[1] * m[5] + relativenormal[2] * m[ 6];
+ loadmodel->surfmesh.data_normal3f[j*3+2] += relativenormal[0] * m[8] + relativenormal[1] * m[9] + relativenormal[2] * m[10];
+ if (!k)
+ {
+ // store the first (and often only) weight
+ loadmodel->surfmesh.data_vertexweightinfluence4f[j*4+0] = influence;
+ loadmodel->surfmesh.data_vertexweightindex4i[j*4+0] = boneindex;
+ }
+ else
+ {
+ // sort the new weight into this vertex's weight table
+ // (which only accepts up to 4 bones per vertex)
+ for (l = 0;l < 4;l++)
+ {
+ if (loadmodel->surfmesh.data_vertexweightinfluence4f[j*4+l] < influence)
+ {
+ // move weaker influence weights out of the way first
+ int l2;
+ for (l2 = 3;l2 > l;l2--)
+ {
+ loadmodel->surfmesh.data_vertexweightinfluence4f[j*4+l2] = loadmodel->surfmesh.data_vertexweightinfluence4f[j*4+l2-1];
+ loadmodel->surfmesh.data_vertexweightindex4i[j*4+l2] = loadmodel->surfmesh.data_vertexweightindex4i[j*4+l2-1];
+ }
+ // store the new weight
+ loadmodel->surfmesh.data_vertexweightinfluence4f[j*4+l] = influence;
+ loadmodel->surfmesh.data_vertexweightindex4i[j*4+l] = boneindex;
+ break;
+ }
+ }
+ }