- if (model->surfmesh.data_vertexweightindex4i)
- {
- int i, k, blends;
- const float *v = model->surfmesh.data_vertex3f;
- const float *n = model->surfmesh.data_normal3f;
- const float *sv = model->surfmesh.data_svector3f;
- const float *tv = model->surfmesh.data_tvector3f;
- const int *wi = model->surfmesh.data_vertexweightindex4i;
- const float *wf = model->surfmesh.data_vertexweightinfluence4f;
- float *matrix, m[12], bonepose[256][12], boneposerelative[256][12];
- // vertex weighted skeletal
- memset(vertex3f, 0, model->surfmesh.num_vertices * sizeof(float[3]));
- if (normal3f)
- memset(normal3f, 0, model->surfmesh.num_vertices * sizeof(float[3]));
- if (svector3f)
+ int i;
+ int *weightindex = model->surfmesh.data_vertexweightindex4i;
+ float *weightinfluence = model->surfmesh.data_vertexweightinfluence4f;
+ model->surfmesh.num_blends = model->num_bones;
+ for (i = 0;i < model->surfmesh.num_blends;i++, weightindex += 4, weightinfluence += 4)
+ {
+ weightindex[0] = i;
+ weightindex[1] = 0;
+ weightindex[2] = 0;
+ weightindex[3] = 0;
+ weightinfluence[0] = 1;
+ weightinfluence[1] = 0;
+ weightinfluence[2] = 0;
+ weightinfluence[3] = 0;
+ }
+}
+
+int Mod_Skeletal_AddBlend(dp_model_t *model, const int *newindex, const float *newinfluence)
+{
+ int i;
+ int *weightindex = model->surfmesh.data_vertexweightindex4i;
+ float *weightinfluence = model->surfmesh.data_vertexweightinfluence4f;
+ for (i = 0;i < model->surfmesh.num_blends;i++, weightindex += 4, weightinfluence += 4)
+ {
+ if (weightindex[0] == newindex[0] && weightindex[1] == newindex[1] && weightindex[2] == newindex[2] && weightindex[3] == newindex[3] &&
+ weightinfluence[0] == newinfluence[0] && weightinfluence[1] == newinfluence[1] && weightinfluence[2] == newinfluence[2] && weightinfluence[3] == newinfluence[3])
+ return i;
+ }
+ model->surfmesh.num_blends++;
+ memcpy(weightindex, newindex, 4*sizeof(int));
+ memcpy(weightinfluence, newinfluence, 4*sizeof(float));
+ return i;
+}
+
+static int maxbonepose = 0;
+static float (*bonepose)[12] = NULL;
+
+void Mod_Skeletal_FreeBuffers(void)
+{
+ if(bonepose)
+ Mem_Free(bonepose);
+ maxbonepose = 0;
+ bonepose = NULL;
+}
+
+#if defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1400)
+#define RESTRICT __restrict
+#else
+#define RESTRICT
+#endif
+
+void Mod_Skeletal_AnimateVertices(const dp_model_t * RESTRICT model, const frameblend_t * RESTRICT frameblend, const skeleton_t *skeleton, float * RESTRICT vertex3f, float * RESTRICT normal3f, float * RESTRICT svector3f, float * RESTRICT tvector3f)
+{
+ // vertex weighted skeletal
+ int i, k;
+ int blends;
+ float m[12];
+ float (*boneposerelative)[12];
+ const int * RESTRICT weightindex;
+ const float * RESTRICT weightinfluence;
+
+ if (maxbonepose < model->num_bones + model->surfmesh.num_blends)
+ {
+ if (bonepose)
+ Mem_Free(bonepose);
+ maxbonepose = model->num_bones + model->surfmesh.num_blends;
+ bonepose = (float (*)[12])Mem_Alloc(r_main_mempool, maxbonepose * sizeof(float[12]));
+ }
+
+ boneposerelative = bonepose + model->num_bones;
+
+ if (skeleton && !skeleton->relativetransforms)
+ skeleton = NULL;
+
+ // interpolate matrices
+ if (skeleton)
+ {
+ for (i = 0;i < model->num_bones;i++)