]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_alias.c
Experimental new patch welding code by "someone", fixing the problem with seams when...
[xonotic/darkplaces.git] / model_alias.c
index 23c22e2cdc06f8e71aa7b6cf37c754ffeb805f3d..0ae37d5642aa390ef7f541473fa6d1687e400e90 100644 (file)
@@ -52,6 +52,7 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t *model, const frameblend_t *f
        // vertex weighted skeletal
        int i, k;
        int blends;
+       float desiredscale[3];
        float boneposerelative[MAX_BONES][12];
        float *matrix, m[12], bonepose[MAX_BONES][12];
 
@@ -60,12 +61,22 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t *model, const frameblend_t *f
        {
                for (k = 0;k < 12;k++)
                        m[k] = 0;
+               VectorClear(desiredscale);
                for (blends = 0;blends < 4 && frameblend[blends].lerp > 0;blends++)
                {
                        matrix = model->data_poses + (frameblend[blends].frame * model->num_bones + i) * 12;
                        for (k = 0;k < 12;k++)
                                m[k] += matrix[k] * frameblend[blends].lerp;
+                       desiredscale[0] += frameblend[blends].lerp * VectorLength(matrix    );
+                       desiredscale[1] += frameblend[blends].lerp * VectorLength(matrix + 4);
+                       desiredscale[2] += frameblend[blends].lerp * VectorLength(matrix + 8);
                }
+               VectorNormalize(m    );
+               VectorNormalize(m + 4);
+               VectorNormalize(m + 8);
+               VectorScale(m    , desiredscale[0], m    );
+               VectorScale(m + 4, desiredscale[1], m + 4);
+               VectorScale(m + 8, desiredscale[2], m + 8);
                if (i == r_skeletal_debugbone.integer)
                        m[r_skeletal_debugbonecomponent.integer % 12] += r_skeletal_debugbonevalue.value;
                m[3] *= r_skeletal_debugtranslatex.value;
@@ -432,6 +443,41 @@ int Mod_Alias_GetTagMatrix(const dp_model_t *model, int poseframe, int tagindex,
        return 0;
 }
 
+int Mod_Alias_GetExtendedTagInfoForIndex(const dp_model_t *model, unsigned int skin, int poseframe, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix)
+{
+       const float *boneframe;
+
+       if(skin >= (unsigned int)model->numskins)
+               skin = 0;
+
+       if (model->num_bones)
+       {
+               if(tagindex >= model->num_bones || tagindex < 0)
+                       return 1;
+               if (poseframe >= model->num_poses)
+                       return 2;
+
+               boneframe = model->data_poses + poseframe * model->num_bones * 12;
+               *parentindex = model->data_bones[tagindex].parent;
+               *tagname = model->data_bones[tagindex].name;
+               Matrix4x4_FromArray12FloatD3D(tag_localmatrix, boneframe + tagindex * 12);
+               return 0;
+       }
+
+       if (model->num_tags)
+       {
+               if(tagindex >= model->num_tags || tagindex < 0)
+                       return 1;
+               if (poseframe >= model->num_tagframes)
+                       return 2;
+               *tagname = model->data_tags[tagindex].name;
+               Matrix4x4_FromArray12FloatGL(tag_localmatrix, model->data_tags[poseframe * model->num_tags + tagindex].matrixgl);
+               return 0;
+       }
+
+       return 2;
+}
+
 int Mod_Alias_GetTagIndexForName(const dp_model_t *model, unsigned int skin, const char *tagname)
 {
        int i;
@@ -452,7 +498,7 @@ static void Mod_BuildBaseBonePoses(void)
 {
        int i, k;
        double scale;
-       float *basebonepose = Mem_Alloc(tempmempool, loadmodel->num_bones * sizeof(float[12]));
+       float *basebonepose = (float *) Mem_Alloc(tempmempool, loadmodel->num_bones * sizeof(float[12]));
        float *in12f = loadmodel->data_poses;
        float *out12f = basebonepose;
        float *outinv12f = loadmodel->data_baseboneposeinverse;
@@ -502,7 +548,7 @@ static void Mod_Alias_CalculateBoundingBox(void)
        frameblend_t frameblend[4];
        memset(frameblend, 0, sizeof(frameblend));
        frameblend[0].lerp = 1;
-       vertex3f = Mem_Alloc(loadmodel->mempool, loadmodel->surfmesh.num_vertices * sizeof(float[3]));
+       vertex3f = (float *) Mem_Alloc(loadmodel->mempool, loadmodel->surfmesh.num_vertices * sizeof(float[3]));
        VectorClear(loadmodel->normalmins);
        VectorClear(loadmodel->normalmaxs);
        yawradius = 0;
@@ -568,8 +614,8 @@ static void Mod_Alias_MorphMesh_CompileFrames(void)
                // encode the svector and tvector in 3 byte format for permanent storage
                for (j = 0;j < loadmodel->surfmesh.num_vertices;j++)
                {
-                       VectorScale(loadmodel->surfmesh.data_svector3f + j * 3, 127.0f, loadmodel->surfmesh.data_morphtexvecvertex[i*loadmodel->surfmesh.num_vertices+j].svec);
-                       VectorScale(loadmodel->surfmesh.data_tvector3f + j * 3, 127.0f, loadmodel->surfmesh.data_morphtexvecvertex[i*loadmodel->surfmesh.num_vertices+j].tvec);
+                       VectorScaleCast(loadmodel->surfmesh.data_svector3f + j * 3, 127.0f, signed char, loadmodel->surfmesh.data_morphtexvecvertex[i*loadmodel->surfmesh.num_vertices+j].svec);
+                       VectorScaleCast(loadmodel->surfmesh.data_tvector3f + j * 3, 127.0f, signed char, loadmodel->surfmesh.data_morphtexvecvertex[i*loadmodel->surfmesh.num_vertices+j].tvec);
                }
        }
 }
@@ -749,7 +795,7 @@ static void Mod_BuildAliasSkinFromSkinFrame(texture_t *texture, skinframe_t *ski
        texture->currentmaterialflags = texture->basematerialflags;
 }
 
-static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfile, char *meshname, char *shadername)
+static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfile, const char *meshname, const char *shadername)
 {
        int i;
        skinfileitem_t *skinfileitem;
@@ -773,7 +819,7 @@ static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfi
                        {
                                // don't render unmentioned meshes
                                Mod_BuildAliasSkinFromSkinFrame(skin, NULL);
-                               skin->basematerialflags = skin->currentmaterialflags = 0;
+                               skin->basematerialflags = skin->currentmaterialflags = MATERIALFLAG_NOSHADOW | MATERIALFLAG_NODRAW;
                        }
                }
        }
@@ -2565,7 +2611,7 @@ void Mod_PSKMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend)
                for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
                        loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
        }
-       loadmodel->data_poses = Mem_Alloc(loadmodel->mempool, loadmodel->num_poses * sizeof(float[12]));
+       loadmodel->data_poses = (float *) Mem_Alloc(loadmodel->mempool, loadmodel->num_poses * sizeof(float[12]));
 
        for (i = 0;i < loadmodel->numskins;i++)
        {