]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
fix issues with V_CalcRefdef in CSQC and stereo view
[xonotic/darkplaces.git] / model_shared.c
index 05cb342750acd47a69e3d9c51cf353a4e7c30d47..096634d2b3858184a0de8bd74cc3dcd1e5ba6a20 100644 (file)
@@ -247,21 +247,21 @@ static int Mod_FrameGroupify_ParseGroups(const char *buf, mod_framegroupify_pars
 
        bufptr = buf;
        i = 0;
-       for(;;)
+       while(bufptr)
        {
                // an anim scene!
 
                // REQUIRED: fetch start
-               if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                       break;
+               COM_ParseToken_Simple(&bufptr, true, false, true);
+               if (!bufptr)
+                       break; // end of file
                if (!strcmp(com_token, "\n"))
                        continue; // empty line
                start = atoi(com_token);
 
                // REQUIRED: fetch length
-               if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                       break;
-               if (!strcmp(com_token, "\n"))
+               COM_ParseToken_Simple(&bufptr, true, false, true);
+               if (!bufptr || !strcmp(com_token, "\n"))
                {
                        Con_Printf("framegroups file: missing number of frames\n");
                        continue;
@@ -269,36 +269,36 @@ static int Mod_FrameGroupify_ParseGroups(const char *buf, mod_framegroupify_pars
                len = atoi(com_token);
 
                // OPTIONAL args start
-               if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                       break;
+               COM_ParseToken_Simple(&bufptr, true, false, true);
 
                // OPTIONAL: fetch fps
                fps = 20;
-               if (strcmp(com_token, "\n"))
+               if (bufptr && strcmp(com_token, "\n"))
                {
                        fps = atof(com_token);
-                       if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                               break;
+                       COM_ParseToken_Simple(&bufptr, true, false, true);
                }
 
                // OPTIONAL: fetch loopflag
                loop = true;
-               if (strcmp(com_token, "\n"))
+               if (bufptr && strcmp(com_token, "\n"))
                {
                        loop = (atoi(com_token) != 0);
-                       if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                               break;
+                       COM_ParseToken_Simple(&bufptr, true, false, true);
                }
 
                // OPTIONAL: fetch name
                name[0] = 0;
-               if (strcmp(com_token, "\n"))
+               if (bufptr && strcmp(com_token, "\n"))
                {
                        strlcpy(name, com_token, sizeof(name));
-                       if (!COM_ParseToken_Simple(&bufptr, true, false, true))
-                               break;
+                       COM_ParseToken_Simple(&bufptr, true, false, true);
                }
 
+               // OPTIONAL: remaining unsupported tokens (eat them)
+               while (bufptr && strcmp(com_token, "\n"))
+                       COM_ParseToken_Simple(&bufptr, true, false, true);
+
                //Con_Printf("data: %d %d %d %f %d (%s)\n", i, start, len, fps, loop, name);
 
                if(cb)
@@ -467,6 +467,9 @@ dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk)
        // errors can prevent the corresponding mod->loaded = true;
        mod->loaded = false;
 
+       // default lightmap scale
+       mod->lightmapscale = 1;
+
        // default model radius and bounding box (mainly for missing models)
        mod->radius = 16;
        VectorSet(mod->normalmins, -mod->radius, -mod->radius, -mod->radius);
@@ -1662,8 +1665,8 @@ void Mod_LoadQ3Shaders(void)
        int numparameters;
        char parameter[TEXTURE_MAXFRAMES + 4][Q3PATHLENGTH];
        char *custsurfaceparmnames[256]; // VorteX: q3map2 has 64 but well, someone will need more
-       unsigned long custsurfaceparms[256]; 
-       int numcustsurfaceparms;
+       unsigned long custsurfaceflags[256]; 
+       int numcustsurfaceflags;
        qboolean dpshaderkill;
 
        Mod_FreeQ3Shaders();
@@ -1677,7 +1680,7 @@ void Mod_LoadQ3Shaders(void)
                q3shaders_mem, sizeof (char**), 256);
 
        // parse custinfoparms.txt
-       numcustsurfaceparms = 0;
+       numcustsurfaceflags = 0;
        if ((text = f = (char *)FS_LoadFile("scripts/custinfoparms.txt", tempmempool, false, NULL)) != NULL)
        {
                if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{"))
@@ -1697,21 +1700,21 @@ void Mod_LoadQ3Shaders(void)
                                        if (!strcasecmp(com_token, "}"))
                                                break;  
                                        // register surfaceflag
-                                       if (numcustsurfaceparms >= 256)
+                                       if (numcustsurfaceflags >= 256)
                                        {
                                                Con_Printf("scripts/custinfoparms.txt: surfaceflags section parsing error - max 256 surfaceflags exceeded\n");
                                                break;
                                        }
                                        // name
                                        j = strlen(com_token)+1;
-                                       custsurfaceparmnames[numcustsurfaceparms] = (char *)Mem_Alloc(tempmempool, j);
-                                       strlcpy(custsurfaceparmnames[numcustsurfaceparms], com_token, j+1);
+                                       custsurfaceparmnames[numcustsurfaceflags] = (char *)Mem_Alloc(tempmempool, j);
+                                       strlcpy(custsurfaceparmnames[numcustsurfaceflags], com_token, j+1);
                                        // value
                                        if (COM_ParseToken_QuakeC(&text, false))
-                                               custsurfaceparms[numcustsurfaceparms] = strtol(com_token, NULL, 0);
+                                               custsurfaceflags[numcustsurfaceflags] = strtol(com_token, NULL, 0);
                                        else
-                                               custsurfaceparms[numcustsurfaceparms] = 0;
-                                       numcustsurfaceparms++;
+                                               custsurfaceflags[numcustsurfaceflags] = 0;
+                                       numcustsurfaceflags++;
                                }
                        }
                }
@@ -2126,19 +2129,21 @@ void Mod_LoadQ3Shaders(void)
                                                shader.surfaceparms |= Q3SURFACEPARM_POINTLIGHT;
                                        else if (!strcasecmp(parameter[1], "antiportal"))
                                                shader.surfaceparms |= Q3SURFACEPARM_ANTIPORTAL;
+                                       else if (!strcasecmp(parameter[1], "skip"))
+                                               ; // shader.surfaceparms |= Q3SURFACEPARM_SKIP; FIXME we don't have enough #defines for this any more, and the engine doesn't need this one anyway
                                        else
                                        {
                                                // try custom surfaceparms
-                                               for (j = 0; j < numcustsurfaceparms; j++)
+                                               for (j = 0; j < numcustsurfaceflags; j++)
                                                {
                                                        if (!strcasecmp(custsurfaceparmnames[j], parameter[1]))
                                                        {
-                                                               shader.surfaceparms |= custsurfaceparms[j];
+                                                               shader.surfaceflags |= custsurfaceflags[j];
                                                                break;
                                                        }
                                                }
                                                // failed all
-                                               if (j == numcustsurfaceparms)
+                                               if (j == numcustsurfaceflags)
                                                        Con_DPrintf("%s parsing warning: unknown surfaceparm \"%s\"\n", search->filenames[fileindex], parameter[1]);
                                        }
                                }
@@ -2385,7 +2390,7 @@ void Mod_LoadQ3Shaders(void)
        }
        FS_FreeSearch(search);
        // free custinfoparm values
-       for (j = 0; j < numcustsurfaceparms; j++)
+       for (j = 0; j < numcustsurfaceflags; j++)
                Mem_Free(custsurfaceparmnames[j]);
 }
 
@@ -2442,7 +2447,6 @@ qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qbool
        {
                if (developer_loading.integer)
                        Con_Printf("%s: loaded shader for %s\n", loadmodel->name, name);
-               texture->surfaceparms = shader->surfaceparms;
 
                // allow disabling of picmip or compression by defaulttexflags
                texture->textureflags = (shader->textureflags & texflagsmask) | texflagsor;
@@ -2570,6 +2574,8 @@ nothing                GL_ZERO GL_ONE
                        texture->basematerialflags |= MATERIALFLAG_NOSHADOW;
                if (shader->dpnortlight)
                        texture->basematerialflags |= MATERIALFLAG_NORTLIGHT;
+               if (shader->vertexalpha)
+                       texture->basematerialflags |= MATERIALFLAG_ALPHAGEN_VERTEX;
                memcpy(texture->deforms, shader->deforms, sizeof(texture->deforms));
                texture->reflectmin = shader->reflectmin;
                texture->reflectmax = shader->reflectmax;
@@ -2631,6 +2637,40 @@ nothing                GL_ZERO GL_ONE
        //      if (shader->surfaceparms & Q3SURFACEPARM_LIGHTGRID    ) texture->supercontents |= SUPERCONTENTS_LIGHTGRID    ;
        //      if (shader->surfaceparms & Q3SURFACEPARM_ANTIPORTAL   ) texture->supercontents |= SUPERCONTENTS_ANTIPORTAL   ;
 
+               texture->surfaceflags = shader->surfaceflags;
+               if (shader->surfaceparms & Q3SURFACEPARM_ALPHASHADOW  ) texture->surfaceflags |= Q3SURFACEFLAG_ALPHASHADOW  ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_AREAPORTAL   ) texture->surfaceflags |= Q3SURFACEFLAG_AREAPORTAL   ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_CLUSTERPORTAL) texture->surfaceflags |= Q3SURFACEFLAG_CLUSTERPORTAL;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_DETAIL       ) texture->surfaceflags |= Q3SURFACEFLAG_DETAIL       ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_DONOTENTER   ) texture->surfaceflags |= Q3SURFACEFLAG_DONOTENTER   ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_FOG          ) texture->surfaceflags |= Q3SURFACEFLAG_FOG          ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_LAVA         ) texture->surfaceflags |= Q3SURFACEFLAG_LAVA         ;
+               if (shader->surfaceparms & Q3SURFACEPARM_LIGHTFILTER  ) texture->surfaceflags |= Q3SURFACEFLAG_LIGHTFILTER  ;
+               if (shader->surfaceparms & Q3SURFACEPARM_METALSTEPS   ) texture->surfaceflags |= Q3SURFACEFLAG_METALSTEPS   ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NODAMAGE     ) texture->surfaceflags |= Q3SURFACEFLAG_NODAMAGE     ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NODLIGHT     ) texture->surfaceflags |= Q3SURFACEFLAG_NODLIGHT     ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NODRAW       ) texture->surfaceflags |= Q3SURFACEFLAG_NODRAW       ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_NODROP       ) texture->surfaceflags |= Q3SURFACEFLAG_NODROP       ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NOIMPACT     ) texture->surfaceflags |= Q3SURFACEFLAG_NOIMPACT     ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NOLIGHTMAP   ) texture->surfaceflags |= Q3SURFACEFLAG_NOLIGHTMAP   ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NOMARKS      ) texture->surfaceflags |= Q3SURFACEFLAG_NOMARKS      ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS    ) texture->surfaceflags |= Q3SURFACEFLAG_NOMIPMAPS    ;
+               if (shader->surfaceparms & Q3SURFACEPARM_NONSOLID     ) texture->surfaceflags |= Q3SURFACEFLAG_NONSOLID     ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_ORIGIN       ) texture->surfaceflags |= Q3SURFACEFLAG_ORIGIN       ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_PLAYERCLIP   ) texture->surfaceflags |= Q3SURFACEFLAG_PLAYERCLIP   ;
+               if (shader->surfaceparms & Q3SURFACEPARM_SKY          ) texture->surfaceflags |= Q3SURFACEFLAG_SKY          ;
+               if (shader->surfaceparms & Q3SURFACEPARM_SLICK        ) texture->surfaceflags |= Q3SURFACEFLAG_SLICK        ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_SLIME        ) texture->surfaceflags |= Q3SURFACEFLAG_SLIME        ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_STRUCTURAL   ) texture->surfaceflags |= Q3SURFACEFLAG_STRUCTURAL   ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_TRANS        ) texture->surfaceflags |= Q3SURFACEFLAG_TRANS        ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_WATER        ) texture->surfaceflags |= Q3SURFACEFLAG_WATER        ;
+               if (shader->surfaceparms & Q3SURFACEPARM_POINTLIGHT   ) texture->surfaceflags |= Q3SURFACEFLAG_POINTLIGHT   ;
+               if (shader->surfaceparms & Q3SURFACEPARM_HINT         ) texture->surfaceflags |= Q3SURFACEFLAG_HINT         ;
+               if (shader->surfaceparms & Q3SURFACEPARM_DUST         ) texture->surfaceflags |= Q3SURFACEFLAG_DUST         ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_BOTCLIP      ) texture->surfaceflags |= Q3SURFACEFLAG_BOTCLIP      ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_LIGHTGRID    ) texture->surfaceflags |= Q3SURFACEFLAG_LIGHTGRID    ;
+       //      if (shader->surfaceparms & Q3SURFACEPARM_ANTIPORTAL   ) texture->surfaceflags |= Q3SURFACEFLAG_ANTIPORTAL   ;
+
                if (shader->dpmeshcollisions)
                        texture->basematerialflags |= MATERIALFLAG_MESHCOLLISIONS;
                if (shader->dpshaderkill && developer_extra.integer)
@@ -2640,14 +2680,12 @@ nothing                GL_ZERO GL_ONE
        {
                if (developer_extra.integer)
                        Con_DPrintf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", loadmodel->name, name);
-               texture->surfaceparms = 0;
                texture->supercontents = SUPERCONTENTS_SOLID | SUPERCONTENTS_OPAQUE;
        }
        else if (!strcmp(texture->name, "common/nodraw") || !strcmp(texture->name, "textures/common/nodraw"))
        {
                if (developer_extra.integer)
                        Con_DPrintf("^1%s:^7 using fallback nodraw material for ^3\"%s\"\n", loadmodel->name, name);
-               texture->surfaceparms = 0;
                texture->basematerialflags = MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW;
                texture->supercontents = SUPERCONTENTS_SOLID;
        }
@@ -2655,7 +2693,6 @@ nothing                GL_ZERO GL_ONE
        {
                if (developer_extra.integer)
                        Con_DPrintf("^1%s:^7 No shader found for texture ^3\"%s\"\n", loadmodel->name, texture->name);
-               texture->surfaceparms = 0;
                if (texture->surfaceflags & Q3SURFACEFLAG_NODRAW)
                {
                        texture->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW;