]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_cmds.c
show more detail in "has no triangles" and "has no vertexes" warning
[xonotic/darkplaces.git] / prvm_cmds.c
index 9713b10e44f06d0cbfe9f27c655e8420e440f139..13672c5d8a815667ef6fb079224785bf64755d84 100644 (file)
@@ -187,9 +187,14 @@ void VM_UpdateEdictSkeleton(prvm_edict_t *ed, const dp_model_t *edmodel, const f
                VM_RemoveEdictSkeleton(ed);
                ed->priv.server->skeleton.model = edmodel;
        }
-       if (!ed->priv.server->skeleton.relativetransforms && ed->priv.server->skeleton.model && ed->priv.server->skeleton.model->num_bones)
-               ed->priv.server->skeleton.relativetransforms = (matrix4x4_t *)Mem_Alloc(prog->progs_mempool, ed->priv.server->skeleton.model->num_bones * sizeof(matrix4x4_t));
-       if (ed->priv.server->skeleton.relativetransforms)
+       if (!ed->priv.server->skeleton.model || !ed->priv.server->skeleton.model->num_bones)
+       {
+               if(ed->priv.server->skeleton.relativetransforms)
+                       Mem_Free(ed->priv.server->skeleton.relativetransforms);
+               ed->priv.server->skeleton.relativetransforms = NULL;
+               return;
+       }
+
        {
                int skeletonindex = -1;
                skeleton_t *skeleton;
@@ -198,30 +203,15 @@ void VM_UpdateEdictSkeleton(prvm_edict_t *ed, const dp_model_t *edmodel, const f
                if (skeletonindex >= 0 && skeletonindex < MAX_EDICTS && (skeleton = prog->skeletons[skeletonindex]) && skeleton->model->num_bones == ed->priv.server->skeleton.model->num_bones)
                {
                        // custom skeleton controlled by the game (FTE_CSQC_SKELETONOBJECTS)
+                       if (!ed->priv.server->skeleton.relativetransforms)
+                               ed->priv.server->skeleton.relativetransforms = (matrix4x4_t *)Mem_Alloc(prog->progs_mempool, ed->priv.server->skeleton.model->num_bones * sizeof(matrix4x4_t));
                        memcpy(ed->priv.server->skeleton.relativetransforms, skeleton->relativetransforms, ed->priv.server->skeleton.model->num_bones * sizeof(matrix4x4_t));
                }
                else
                {
-                       // generated skeleton from frame animation
-                       int blendindex;
-                       int bonenum;
-                       int numbones = ed->priv.server->skeleton.model->num_bones;
-                       const short *framebones6s;
-                       float lerp;
-                       float scale = ed->priv.server->skeleton.model->num_posescale;
-                       matrix4x4_t *relativetransforms = ed->priv.server->skeleton.relativetransforms;
-                       matrix4x4_t matrix;
-                       memset(relativetransforms, 0, numbones * sizeof(matrix4x4_t));
-                       for (blendindex = 0;blendindex < MAX_FRAMEBLENDS && frameblend[blendindex].lerp > 0;blendindex++)
-                       {
-                               lerp = frameblend[blendindex].lerp;
-                               framebones6s = ed->priv.server->skeleton.model->data_poses6s + 6 * frameblend[blendindex].subframe * numbones;
-                               for (bonenum = 0;bonenum < numbones;bonenum++)
-                               {
-                                       Matrix4x4_FromBonePose6s(&matrix, scale, framebones6s + 6 * bonenum);
-                                       Matrix4x4_Accumulate(&ed->priv.server->skeleton.relativetransforms[bonenum], &matrix, lerp);
-                               }
-                       }
+                       if(ed->priv.server->skeleton.relativetransforms)
+                               Mem_Free(ed->priv.server->skeleton.relativetransforms);
+                       ed->priv.server->skeleton.relativetransforms = NULL;
                }
        }
 }
@@ -269,7 +259,7 @@ checkextension(extensionname)
 static qboolean checkextension(const char *name)
 {
        int len;
-       char *e, *start;
+       const char *e, *start;
        len = (int)strlen(name);
 
        for (e = prog->extensionstring;*e;e++)
@@ -3234,7 +3224,7 @@ void VM_precache_pic(void)
        VM_CheckEmptyString (s);
 
        // AK Draw_CachePic is supposed to always return a valid pointer
-       if( Draw_CachePic_Flags(s, CACHEPICFLAG_NOTPERSISTENT)->tex == r_texture_notexture )
+       if( Draw_CachePic_Flags(s, 0)->tex == r_texture_notexture )
                PRVM_G_INT(OFS_RETURN) = OFS_NULL;
 }
 
@@ -3689,7 +3679,7 @@ void VM_drawpic(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawpic: z value%s from %s discarded\n",(pos[2] && size[2]) ? "s" : " ",((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_Pic(pos[0], pos[1], Draw_CachePic (picname), size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
+       DrawQ_Pic(pos[0], pos[1], Draw_CachePic_Flags (picname, CACHEPICFLAG_NOTPERSISTENT), size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 /*
@@ -3734,7 +3724,7 @@ void VM_drawrotpic(void)
        if(pos[2] || size[2] || org[2])
                Con_Printf("VM_drawrotpic: z value from pos/size/org discarded\n");
 
-       DrawQ_RotPic(pos[0], pos[1], Draw_CachePic(picname), size[0], size[1], org[0], org[1], PRVM_G_FLOAT(OFS_PARM4), rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM6), flag);
+       DrawQ_RotPic(pos[0], pos[1], Draw_CachePic_Flags(picname, CACHEPICFLAG_NOTPERSISTENT), size[0], size[1], org[0], org[1], PRVM_G_FLOAT(OFS_PARM4), rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM6), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 /*
@@ -3782,7 +3772,7 @@ void VM_drawsubpic(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawsubpic: z value%s from %s discarded\n",(pos[2] && size[2]) ? "s" : " ",((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_SuperPic(pos[0], pos[1], Draw_CachePic (picname),
+       DrawQ_SuperPic(pos[0], pos[1], Draw_CachePic_Flags (picname, CACHEPICFLAG_NOTPERSISTENT),
                size[0], size[1],
                srcPos[0],              srcPos[1],              rgb[0], rgb[1], rgb[2], alpha,
                srcPos[0] + srcSize[0], srcPos[1],              rgb[0], rgb[1], rgb[2], alpha,
@@ -3947,7 +3937,7 @@ void VM_stringtokeynum (void)
 {
        VM_SAFEPARMCOUNT( 1, VM_keynumtostring );
 
-       PRVM_G_INT(OFS_RETURN) = Key_StringToKeynum(PRVM_G_STRING(OFS_PARM0));
+       PRVM_G_FLOAT(OFS_RETURN) = Key_StringToKeynum(PRVM_G_STRING(OFS_PARM0));
 }
 
 /*
@@ -6353,7 +6343,7 @@ void animatemodel(dp_model_t *model, prvm_edict_t *ed)
        skeleton_t *skeleton;
        int skeletonindex = -1;
        qboolean need = false;
-       if(!model->AnimateVertices)
+       if(!(model->surfmesh.isanimated && model->AnimateVertices))
        {
                animatemodel_cache.data_vertex3f = model->surfmesh.data_vertex3f;
                animatemodel_cache.data_svector3f = model->surfmesh.data_svector3f;