]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
removed support for TEXTYPE_RGB
[xonotic/darkplaces.git] / model_shared.c
index 4bed5301494c9343e5bf1d0f6e6baf3c97e97cd6..4db8ee98c2cfd50af685233e501e5c1082e77355 100644 (file)
@@ -1135,11 +1135,12 @@ void Mod_LoadQ3Shaders(void)
                        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->reflectmin = 0;
+                       shader->reflectmax = 1;
                        shader->refractfactor = 1;
+                       Vector4Set(shader->refractcolor4f, 1, 1, 1, 1);
+                       shader->reflectfactor = 1;
+                       Vector4Set(shader->reflectcolor4f, 1, 1, 1, 1);
 
                        strlcpy(shader->name, com_token, sizeof(shader->name));
                        if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{"))
@@ -1153,25 +1154,28 @@ void Mod_LoadQ3Shaders(void)
                                        break;
                                if (!strcasecmp(com_token, "{"))
                                {
+                                       static q3shaderinfo_layer_t dummy;
                                        if (shader->numlayers < Q3SHADER_MAXLAYERS)
                                        {
                                                layer = shader->layers + shader->numlayers++;
-                                               layer->rgbgen.rgbgen = Q3RGBGEN_IDENTITY;
-                                               layer->alphagen.alphagen = Q3ALPHAGEN_IDENTITY;
-                                               layer->tcgen.tcgen = Q3TCGEN_TEXTURE;
-                                               layer->blendfunc[0] = GL_ONE;
-                                               layer->blendfunc[1] = GL_ZERO;
                                        }
                                        else
-                                               layer = NULL;
+                                       {
+                                               // parse and process it anyway, just don't store it (so a map $lightmap or such stuff still is found)
+                                               memset(&dummy, 0, sizeof(dummy));
+                                               layer = &dummy;
+                                       }
+                                       layer->rgbgen.rgbgen = Q3RGBGEN_IDENTITY;
+                                       layer->alphagen.alphagen = Q3ALPHAGEN_IDENTITY;
+                                       layer->tcgen.tcgen = Q3TCGEN_TEXTURE;
+                                       layer->blendfunc[0] = GL_ONE;
+                                       layer->blendfunc[1] = GL_ZERO;
                                        while (COM_ParseToken_QuakeC(&text, false))
                                        {
                                                if (!strcasecmp(com_token, "}"))
                                                        break;
                                                if (!strcasecmp(com_token, "\n"))
                                                        continue;
-                                               if (layer == NULL)
-                                                       continue;
                                                numparameters = 0;
                                                for (j = 0;strcasecmp(com_token, "\n") && strcasecmp(com_token, "}");j++)
                                                {
@@ -1359,7 +1363,7 @@ void Mod_LoadQ3Shaders(void)
                                                        else
                                                                Con_DPrintf("%s parsing warning: too many tcmods on one layer\n", search->filenames[fileindex]);
                                                }
-                                               // break out a level if it was }
+                                               // break out a level if it was a closing brace (not using the character here to not confuse vim)
                                                if (!strcasecmp(com_token, "}"))
                                                        break;
                                        }
@@ -1497,27 +1501,27 @@ void Mod_LoadQ3Shaders(void)
                                        shader->textureflags |= Q3TEXTUREFLAG_NOPICMIP;
                                else if (!strcasecmp(parameter[0], "polygonoffset"))
                                        shader->textureflags |= Q3TEXTUREFLAG_POLYGONOFFSET;
-                               else if (!strcasecmp(parameter[0], "dp_reflect"))
+                               else if (!strcasecmp(parameter[0], "dp_refract") && numparameters >= 5)
+                               {
+                                       shader->textureflags |= Q3TEXTUREFLAG_REFRACTION;
+                                       shader->refractfactor = atof(parameter[1]);
+                                       Vector4Set(shader->refractcolor4f, atof(parameter[2]), atof(parameter[3]), atof(parameter[4]), 1);
+                               }
+                               else if (!strcasecmp(parameter[0], "dp_reflect") && numparameters >= 6)
                                {
                                        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]));
+                                       shader->reflectfactor = atof(parameter[1]);
+                                       Vector4Set(shader->reflectcolor4f, atof(parameter[2]), atof(parameter[3]), atof(parameter[4]), atof(parameter[5]));
                                }
-                               else if (!strcasecmp(parameter[0], "dp_refract"))
+                               else if (!strcasecmp(parameter[0], "dp_water") && numparameters >= 11)
                                {
                                        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]));
+                                       shader->reflectmin = atof(parameter[1]);
+                                       shader->reflectmax = atof(parameter[2]);
+                                       shader->refractfactor = atof(parameter[3]);
+                                       shader->reflectfactor = atof(parameter[4]);
+                                       Vector4Set(shader->refractcolor4f, atof(parameter[5]), atof(parameter[6]), atof(parameter[7]), 1);
+                                       Vector4Set(shader->reflectcolor4f, atof(parameter[8]), atof(parameter[9]), atof(parameter[10]), 1);
                                }
                                else if (!strcasecmp(parameter[0], "deformvertexes") && numparameters >= 2)
                                {
@@ -1581,7 +1585,7 @@ void Mod_LoadQ3Shaders(void)
                        }
                        // fix up multiple reflection types
                        if(shader->textureflags & Q3TEXTUREFLAG_WATERSHADER)
-                               shader->textureflags &= ~Q3TEXTUREFLAG_REFLECTION;
+                               shader->textureflags &= ~(Q3TEXTUREFLAG_REFRACTION | Q3TEXTUREFLAG_REFLECTION);
                }
                Mem_Free(f);
        }
@@ -1590,7 +1594,7 @@ void Mod_LoadQ3Shaders(void)
 q3shaderinfo_t *Mod_LookupQ3Shader(const char *name)
 {
        int i;
-       for (i = 0;i < Q3SHADER_MAXSHADERS;i++)
+       for (i = 0;i < q3shaders_numshaders;i++)
                if (!strcasecmp(q3shaders_shaders[i].name, name))
                        return q3shaders_shaders + i;
        return NULL;
@@ -1637,6 +1641,8 @@ qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qbool
                        texture->basematerialflags |= MATERIALFLAG_NOSHADOW | MATERIALFLAG_NOCULLFACE;
                if (shader->textureflags & Q3TEXTUREFLAG_POLYGONOFFSET)
                        texture->basepolygonoffset -= 2;
+               if (shader->textureflags & Q3TEXTUREFLAG_REFRACTION)
+                       texture->basematerialflags |= MATERIALFLAG_REFRACTION;
                if (shader->textureflags & Q3TEXTUREFLAG_REFLECTION)
                        texture->basematerialflags |= MATERIALFLAG_REFLECTION;
                if (shader->textureflags & Q3TEXTUREFLAG_WATERSHADER)
@@ -1722,11 +1728,12 @@ nothing                GL_ZERO GL_ONE
                        }
                }
                memcpy(texture->deforms, shader->deforms, sizeof(texture->deforms));
-               texture->refractmin = shader->refractmin;
-               texture->refractmax = shader->refractmax;
+               texture->reflectmin = shader->reflectmin;
+               texture->reflectmax = shader->reflectmax;
                texture->refractfactor = shader->refractfactor;
-               VectorCopy(shader->reflectcolor, texture->reflectcolor);
-               VectorCopy(shader->refractcolor, texture->refractcolor);
+               Vector4Copy(shader->refractcolor4f, texture->refractcolor4f);
+               texture->reflectfactor = shader->reflectfactor;
+               Vector4Copy(shader->reflectcolor4f, texture->reflectcolor4f);
        }
        else if (!strcmp(texture->name, "noshader"))
        {
@@ -1748,7 +1755,7 @@ nothing                GL_ZERO GL_ONE
                        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) | TEXF_COMPRESS, false)))
-                       if(developer.integer || loadmodel->type == mod_brushq3)
+                       if(developer.integer || q3bsp) // only the Q3BSP path provides no alternative (like loading image directly, or internal texture)
                                Con_Printf("^1%s:^7 could not load texture for missing shader ^3\"%s\"\n", loadmodel->name, texture->name);
        }
        // init the animation variables