]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
fixed compile errors and warnings using Dev-C++ in "Compile as C++" mode
[xonotic/darkplaces.git] / model_shared.c
index c0dea226005fc56654c7bb602b4d0ecd11d3e8b0..3705359b2bbf34ece305aebd3cc6ff41a2f000f0 100644 (file)
@@ -256,12 +256,13 @@ void Mod_FrameGroupify_ParseGroups_Count (unsigned int i, int start, int len, fl
 
 void Mod_FrameGroupify_ParseGroups_Store (unsigned int i, int start, int len, float fps, qboolean loop, void *pass)
 {
-       animscene_t *anim = (animscene_t *) pass;
-       dpsnprintf(anim[i].name, sizeof(anim[i].name), "groupified_%d", i);
-       anim[i].firstframe = start;
-       anim[i].framecount = len;
-       anim[i].framerate = fps;
-       anim[i].loop = loop;
+       dp_model_t *mod = (dp_model_t *) pass;
+       animscene_t *anim = &mod->animscenes[i];
+       dpsnprintf(anim->name, sizeof(anim[i].name), "groupified_%d", i);
+       anim->firstframe = bound(0, start, mod->num_poses - 1);
+       anim->framecount = bound(1, len, mod->num_poses - anim->firstframe);
+       anim->framerate = max(1, fps);
+       anim->loop = !!loop;
        //Con_Printf("frame group %d is %d %d %f %d\n", i, start, len, fps, loop);
 }
 
@@ -271,14 +272,19 @@ void Mod_FrameGroupify(dp_model_t *mod, const char *buf)
 
        // 0. count
        cnt = Mod_FrameGroupify_ParseGroups(buf, NULL, NULL);
+       if(!cnt)
+       {
+               Con_Printf("no scene found in framegroups file, aborting\n");
+               return;
+       }
+       mod->numframes = cnt;
 
        // 1. reallocate
-       if(mod->animscenes)
-               Mem_Free(mod->animscenes);
-       mod->animscenes = (animscene_t *) Mem_Alloc(tempmempool, sizeof(animscene_t) * cnt);
+       // (we do not free the previous animscenes, but model unloading will free the pool owning them, so it's okay)
+       mod->animscenes = (animscene_t *) Mem_Alloc(mod->mempool, sizeof(animscene_t) * mod->numframes);
 
        // 2. parse
-       Mod_FrameGroupify_ParseGroups(buf, Mod_FrameGroupify_ParseGroups_Store, mod->animscenes);
+       Mod_FrameGroupify_ParseGroups(buf, Mod_FrameGroupify_ParseGroups_Store, mod);
 }
 
 /*
@@ -312,7 +318,7 @@ dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk)
                        Con_Printf("loading model %s\n", mod->name);
 
                mod->used = true;
-               mod->crc = -1;
+               mod->crc = (unsigned int)-1;
                mod->loaded = false;
 
                VectorClear(mod->normalmins);
@@ -419,8 +425,10 @@ dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk)
 
                buf = FS_LoadFile (va("%s.framegroups", mod->name), tempmempool, false, &filesize);
                if(buf)
-                       Mod_FrameGroupify(mod, buf);
-               Mem_Free(buf);
+               {
+                       Mod_FrameGroupify(mod, (const char *)buf);
+                       Mem_Free(buf);
+               }
 
                Mod_BuildVBOs();
        }
@@ -1331,7 +1339,14 @@ static void Q3Shader_AddToHash (q3shaderinfo_t* shader)
        {
                if (strcasecmp (entry->shader.name, shader->name) == 0)
                {
-                       Con_Printf("Shader '%s' already defined\n", shader->name);
+                       unsigned char *start, *end, *start2;
+                       start = (unsigned char *) (&shader->Q3SHADERINFO_COMPARE_START);
+                       end = ((unsigned char *) (&shader->Q3SHADERINFO_COMPARE_END)) + sizeof(shader->Q3SHADERINFO_COMPARE_END);
+                       start2 = (unsigned char *) (&entry->shader.Q3SHADERINFO_COMPARE_START);
+                       if(memcmp(start, start2, end - start))
+                               Con_Printf("Shader '%s' already defined, ignoring mismatching redeclaration\n", shader->name);
+                       else
+                               Con_DPrintf("Shader '%s' already defined\n", shader->name);
                        return;
                }
                lastEntry = entry;
@@ -2006,6 +2021,9 @@ nothing                GL_ZERO GL_ONE
                if (shader->backgroundlayer >= 0)
                {
                        q3shaderinfo_layer_t* backgroundlayer = shader->layers + shader->backgroundlayer;
+                       // copy over one secondarylayer parameter
+                       memcpy(texture->backgroundtcmods, backgroundlayer->tcmods, sizeof(texture->backgroundtcmods));
+                       // load the textures
                        texture->backgroundnumskinframes = backgroundlayer->numframes;
                        texture->backgroundskinframerate = backgroundlayer->framerate;
                        for (j = 0;j < backgroundlayer->numframes;j++)
@@ -2717,7 +2735,7 @@ static void Mod_Decompile_f(void)
                                        if ((animname[l] < '0' || animname[l] > '9') && animname[l] != '_')
                                                k = l + 1;
                                animname[k] = 0;
-                               count = (mod->num_poses / mod->num_bones) - first;
+                               count = mod->num_poses - first;
                                for (j = i + 1;j < mod->numframes;j++)
                                {
                                        strlcpy(animname2, mod->animscenes[j].name, sizeof(animname2));