]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
final speedhack fixes
[xonotic/darkplaces.git] / model_shared.c
index 158a6accc2237234c9cff97767e88364c3e8966a..5c097458d842d7875c5b613ac58b112ecc52c641 100644 (file)
@@ -818,7 +818,7 @@ int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, float *vertex14f)
        int hashindex, vnum;
        shadowmeshvertexhash_t *hash;
        // this uses prime numbers intentionally
-       hashindex = (unsigned int) (vertex14f[0] * 3 + vertex14f[1] * 5 + vertex14f[2] * 7) % SHADOWMESHVERTEXHASH;
+       hashindex = (unsigned int) (vertex14f[0] * 2003 + vertex14f[1] * 4001 + vertex14f[2] * 7919) % SHADOWMESHVERTEXHASH;
        for (hash = mesh->vertexhashtable[hashindex];hash;hash = hash->next)
        {
                vnum = (hash - mesh->vertexhashentries);
@@ -1133,7 +1133,14 @@ void Mod_LoadQ3Shaders(void)
                                break;
                        }
                        shader = q3shaders_shaders + q3shaders_numshaders++;
+
                        memset(shader, 0, sizeof(*shader));
+                       VectorSet(shader->reflectcolor, 1, 1, 1);
+                       VectorSet(shader->refractcolor, 1, 1, 1);
+                       shader->refractmin = 0;
+                       shader->refractmax = 1;
+                       shader->refractfactor = 1;
+
                        strlcpy(shader->name, com_token, sizeof(shader->name));
                        if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{"))
                        {
@@ -1488,6 +1495,30 @@ void Mod_LoadQ3Shaders(void)
                                        shader->surfaceparms |= Q3SURFACEPARM_NOMIPMAPS;
                                else if (!strcasecmp(parameter[0], "nopicmip"))
                                        shader->textureflags |= Q3TEXTUREFLAG_NOPICMIP;
+                               else if (!strcasecmp(parameter[0], "polygonoffset"))
+                                       shader->textureflags |= Q3TEXTUREFLAG_POLYGONOFFSET;
+                               else if (!strcasecmp(parameter[0], "dp_reflect"))
+                               {
+                                       shader->textureflags |= Q3TEXTUREFLAG_REFLECTION;
+                                       if(numparameters >= 2)
+                                               VectorSet(shader->reflectcolor, atof(parameter[1]), atof(parameter[1]), atof(parameter[1])); // grey
+                                       if(numparameters >= 4)
+                                               VectorSet(shader->reflectcolor, atof(parameter[1]), atof(parameter[2]), atof(parameter[3]));
+                               }
+                               else if (!strcasecmp(parameter[0], "dp_refract"))
+                               {
+                                       shader->textureflags |= Q3TEXTUREFLAG_WATERSHADER;
+                                       if(numparameters >= 2)
+                                               shader->refractmin = atof(parameter[1]);
+                                       if(numparameters >= 3)
+                                               shader->refractmax = atof(parameter[2]);
+                                       if(numparameters >= 4)
+                                               shader->refractfactor = atof(parameter[3]);
+                                       if(numparameters >= 5)
+                                               VectorSet(shader->refractcolor, atof(parameter[4]), atof(parameter[4]), atof(parameter[4])); // grey
+                                       if(numparameters >= 7)
+                                               VectorSet(shader->refractcolor, atof(parameter[4]), atof(parameter[5]), atof(parameter[6]));
+                               }
                                else if (!strcasecmp(parameter[0], "deformvertexes") && numparameters >= 2)
                                {
                                        int i, deformindex;
@@ -1548,6 +1579,9 @@ void Mod_LoadQ3Shaders(void)
                                        shader->primarylayer = shader->layers + 1;
                                }
                        }
+                       // fix up multiple reflection types
+                       if(shader->textureflags & Q3TEXTUREFLAG_WATERSHADER)
+                               shader->textureflags &= ~Q3TEXTUREFLAG_REFLECTION;
                }
                Mem_Free(f);
        }
@@ -1570,9 +1604,11 @@ qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qbool
        qboolean success = true;
        q3shaderinfo_t *shader;
        strlcpy(texture->name, name, sizeof(texture->name));
-       shader = Mod_LookupQ3Shader(name);
+       shader = name[0] ? Mod_LookupQ3Shader(name) : NULL;
        if (shader)
        {
+               if (developer.integer >= 100)
+                       Con_DPrintf("%s: loaded shader for %s\n", loadmodel->name, name);
                texture->surfaceparms = shader->surfaceparms;
                texture->textureflags = shader->textureflags;
                texture->basematerialflags = 0;
@@ -1599,6 +1635,12 @@ qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qbool
                        texture->basematerialflags |= MATERIALFLAG_ALPHATEST | MATERIALFLAG_NOSHADOW;
                if (shader->textureflags & Q3TEXTUREFLAG_TWOSIDED)
                        texture->basematerialflags |= MATERIALFLAG_NOSHADOW | MATERIALFLAG_NOCULLFACE;
+               if (shader->textureflags & Q3TEXTUREFLAG_POLYGONOFFSET)
+                       texture->basepolygonoffset -= 2;
+               if (shader->textureflags & Q3TEXTUREFLAG_REFLECTION)
+                       texture->basematerialflags |= MATERIALFLAG_REFLECTION;
+               if (shader->textureflags & Q3TEXTUREFLAG_WATERSHADER)
+                       texture->basematerialflags |= MATERIALFLAG_WATERSHADER;
                texture->customblendfunc[0] = GL_ONE;
                texture->customblendfunc[1] = GL_ZERO;
                if (shader->numlayers > 0)
@@ -1656,7 +1698,7 @@ nothing                GL_ZERO GL_ONE
                                if (!(shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS))
                                        texflags |= TEXF_MIPMAP;
                                if (!(shader->textureflags & Q3TEXTUREFLAG_NOPICMIP) && ((!q1bsp && !q3bsp) || r_picmipworld.integer))
-                                       texflags |= TEXF_PICMIP;
+                                       texflags |= TEXF_PICMIP | TEXF_COMPRESS;
                                if (shader->primarylayer->clampmap)
                                        texflags |= TEXF_CLAMP;
                                if (!(texture->skinframes[j] = R_SkinFrame_LoadExternal(shader->primarylayer->texturename[j], texflags, false)))
@@ -1672,7 +1714,7 @@ nothing                GL_ZERO GL_ONE
                        texture->backgroundskinframerate = shader->backgroundlayer->framerate;
                        for (j = 0;j < shader->backgroundlayer->numframes;j++)
                        {
-                               if (!(texture->backgroundskinframes[j] = R_SkinFrame_LoadExternal(shader->backgroundlayer->texturename[j], ((shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | ((!r_picmipworld.integer || (shader->textureflags & Q3TEXTUREFLAG_NOPICMIP)) ? 0 : TEXF_PICMIP) | (shader->backgroundlayer->clampmap ? TEXF_CLAMP : 0), false)))
+                               if (!(texture->backgroundskinframes[j] = R_SkinFrame_LoadExternal(shader->backgroundlayer->texturename[j], ((shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | ((!r_picmipworld.integer || (shader->textureflags & Q3TEXTUREFLAG_NOPICMIP)) ? 0 : (TEXF_PICMIP | TEXF_COMPRESS)) | (shader->backgroundlayer->clampmap ? TEXF_CLAMP : 0), false)))
                                {
                                        Con_DPrintf("%s: could not load texture \"%s\" (frame %i) for shader \"%s\"\n", loadmodel->name, shader->backgroundlayer->texturename[j], j, texture->name);
                                        texture->backgroundskinframes[j] = R_SkinFrame_LoadMissing();
@@ -1680,13 +1722,23 @@ nothing                GL_ZERO GL_ONE
                        }
                }
                memcpy(texture->deforms, shader->deforms, sizeof(texture->deforms));
+               texture->refractmin = shader->refractmin;
+               texture->refractmax = shader->refractmax;
+               texture->refractfactor = shader->refractfactor;
+               VectorCopy(shader->reflectcolor, texture->reflectcolor);
+               VectorCopy(shader->refractcolor, texture->refractcolor);
        }
        else if (!strcmp(texture->name, "noshader"))
+       {
+               if (developer.integer >= 100)
+                       Con_DPrintf("%s: using default handler for %s\n", loadmodel->name, name);
                texture->surfaceparms = 0;
+       }
        else
        {
                success = false;
-               Con_DPrintf("%s: No shader found for texture \"%s\"\n", loadmodel->name, texture->name);
+               if (developer.integer >= 100 || loadmodel->type == mod_brushq3)
+                       Con_DPrintf("%s: No shader found for texture \"%s\"\n", loadmodel->name, texture->name);
                texture->surfaceparms = 0;
                if (texture->surfaceflags & Q3SURFACEFLAG_NODRAW)
                        texture->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW;
@@ -1695,7 +1747,7 @@ nothing                GL_ZERO GL_ONE
                else
                        texture->basematerialflags |= MATERIALFLAG_WALL;
                texture->numskinframes = 1;
-               if (!(texture->skinframes[0] = R_SkinFrame_LoadExternal(texture->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | (r_picmipworld.integer ? TEXF_PICMIP : 0), false)))
+               if (!(texture->skinframes[0] = R_SkinFrame_LoadExternal(texture->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | (r_picmipworld.integer ? TEXF_PICMIP : 0) | TEXF_COMPRESS, false)))
                        Con_DPrintf("%s: could not load texture for missing shader \"%s\"\n", loadmodel->name, texture->name);
        }
        // init the animation variables