]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_alias.c
don't use dummy entries for single-bone blend palette entries
[xonotic/darkplaces.git] / model_alias.c
index 73136366306f157e813b32e37bbd100dbbe3ca58..2b1dd3a646fc38cc08020fe4e68e228c5bb2fdc1 100644 (file)
@@ -48,21 +48,7 @@ void Mod_AliasInit (void)
 
 void Mod_Skeletal_InitBlends(dp_model_t *model)
 {
-       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;
-       }
+       model->surfmesh.num_blends = 0;
 }
 
 int Mod_Skeletal_AddBlend(dp_model_t *model, const int *newindex, const float *newinfluence)
@@ -70,16 +56,18 @@ int Mod_Skeletal_AddBlend(dp_model_t *model, const int *newindex, const float *n
        int i;
        int *weightindex = model->surfmesh.data_vertexweightindex4i;
        float *weightinfluence = model->surfmesh.data_vertexweightinfluence4f;
+       if(newinfluence[0] == 1)
+               return newindex[0];
        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;
+                       return model->num_bones + i;
        }
        model->surfmesh.num_blends++;
        memcpy(weightindex, newindex, 4*sizeof(int));
        memcpy(weightinfluence, newinfluence, 4*sizeof(float));
-       return i;
+       return model->num_bones + i;
 } 
                 
 static int maxbonepose = 0;
@@ -109,11 +97,11 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t * RESTRICT model, const frame
        const int * RESTRICT weightindex;
        const float * RESTRICT weightinfluence;
 
-       if (maxbonepose < model->num_bones + model->surfmesh.num_blends)
+       if (maxbonepose < model->num_bones*2 + model->surfmesh.num_blends)
        {
                if (bonepose)
                        Mem_Free(bonepose);
-               maxbonepose = model->num_bones + model->surfmesh.num_blends;
+               maxbonepose = model->num_bones*2 + model->surfmesh.num_blends;
                bonepose = (float (*)[12])Mem_Alloc(r_main_mempool, maxbonepose * sizeof(float[12]));
        }
 
@@ -189,9 +177,9 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t * RESTRICT model, const frame
        // generate matrices for all blend combinations
        weightindex = model->surfmesh.data_vertexweightindex4i + model->num_bones*4;
        weightinfluence = model->surfmesh.data_vertexweightinfluence4f + model->num_bones*4;
-       for (i = model->num_bones;i < model->surfmesh.num_blends;i++, weightindex += 4, weightinfluence += 4)
+       for (i = 0;i < model->surfmesh.num_blends;i++, weightindex += 4, weightinfluence += 4)
        {
-               float * RESTRICT b = boneposerelative[i];
+               float * RESTRICT b = boneposerelative[model->num_bones + i];
                const float * RESTRICT m = boneposerelative[weightindex[0]];
                float f = weightinfluence[0];
                b[ 0] = f*m[ 0]; b[ 1] = f*m[ 1]; b[ 2] = f*m[ 2]; b[ 3] = f*m[ 3];
@@ -279,7 +267,7 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t * RESTRICT model, const frame
                const unsigned short * RESTRICT b = model->surfmesh.blends;
                for (i = 0;i < model->surfmesh.num_vertices;i++, sv += 3, b++, svector3f += 3)
                {
-                       const float *m = boneposerelative[*b];
+                       const float * RESTRICT m = boneposerelative[*b];
                        svector3f[0] = (sv[0] * m[0] + sv[1] * m[1] + sv[2] * m[ 2]);
                        svector3f[1] = (sv[0] * m[4] + sv[1] * m[5] + sv[2] * m[ 6]);
                        svector3f[2] = (sv[0] * m[8] + sv[1] * m[9] + sv[2] * m[10]);
@@ -1913,8 +1901,8 @@ void Mod_ZYMOTICMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend)
        loadmodel->surfmesh.data_vertexweightindex4i = (int *)data;data += meshvertices * sizeof(int[4]);
        loadmodel->surfmesh.data_vertexweightinfluence4f = (float *)data;data += meshvertices * sizeof(float[4]);
        loadmodel->surfmesh.num_blends = 0;
-       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        loadmodel->data_baseboneposeinverse = (float *)data;data += loadmodel->num_bones * sizeof(float[12]);
+       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        if (loadmodel->surfmesh.num_vertices <= 65536)
                loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += loadmodel->surfmesh.num_triangles * sizeof(unsigned short[3]);
        loadmodel->data_poses6s = (short *)data;data += loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]);
@@ -2210,11 +2198,11 @@ void Mod_DARKPLACESMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend)
        loadmodel->surfmesh.data_vertexweightindex4i = (int *)data;data += meshvertices * sizeof(int[4]);
        loadmodel->surfmesh.data_vertexweightinfluence4f = (float *)data;data += meshvertices * sizeof(float[4]);
        loadmodel->surfmesh.num_blends = 0;
-       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        loadmodel->data_baseboneposeinverse = (float *)data;data += loadmodel->num_bones * sizeof(float[12]);
        loadmodel->skinscenes = (animscene_t *)data;data += loadmodel->numskins * sizeof(animscene_t);
        loadmodel->data_bones = (aliasbone_t *)data;data += loadmodel->num_bones * sizeof(aliasbone_t);
        loadmodel->animscenes = (animscene_t *)data;data += loadmodel->numframes * sizeof(animscene_t);
+       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        if (meshvertices <= 65536)
                loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += meshtriangles * sizeof(unsigned short[3]);
        loadmodel->data_poses6s = (short *)data;data += loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]);
@@ -2846,11 +2834,11 @@ void Mod_PSKMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend)
        loadmodel->surfmesh.data_vertexweightindex4i = (int *)data;data += loadmodel->surfmesh.num_vertices * sizeof(int[4]);
        loadmodel->surfmesh.data_vertexweightinfluence4f = (float *)data;data += loadmodel->surfmesh.num_vertices * sizeof(float[4]);
        loadmodel->surfmesh.num_blends = 0;
-       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        loadmodel->data_baseboneposeinverse = (float *)data;data += loadmodel->num_bones * sizeof(float[12]);
        loadmodel->skinscenes = (animscene_t *)data;data += loadmodel->numskins * sizeof(animscene_t);
        loadmodel->data_bones = (aliasbone_t *)data;data += loadmodel->num_bones * sizeof(aliasbone_t);
        loadmodel->animscenes = (animscene_t *)data;data += loadmodel->numframes * sizeof(animscene_t);
+       loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short);
        if (loadmodel->surfmesh.num_vertices <= 65536)
                loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += loadmodel->surfmesh.num_triangles * sizeof(unsigned short[3]);
        loadmodel->data_poses6s = (short *)data;data += loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]);