- // do a quick parse of shader files to get surfaceparms
- if ((search = FS_Search("scripts/*.shader", true, false)))
- {
- for (i = 0;i < search->numfilenames;i++)
- {
- if ((f = (char *)FS_LoadFile(search->filenames[i], tempmempool, false, NULL)))
- {
- text = f;
- while (COM_ParseToken(&text, false))
- {
- strlcpy (shadername, com_token, sizeof (shadername));
- flags = 0;
- flags2 = 0;
- sky[0] = 0;
- passnumber = 0;
- firstpasstexturename[0] = 0;
- if (COM_ParseToken(&text, false) && !strcasecmp(com_token, "{"))
- {
- while (COM_ParseToken(&text, false))
- {
- if (!strcasecmp(com_token, "}"))
- break;
- else if (!strcasecmp(com_token, "{"))
- {
- while (COM_ParseToken(&text, false))
- {
- if (!strcasecmp(com_token, "}"))
- break;
- if (!strcasecmp(com_token, "\n"))
- continue;
- numparameters = 0;
- for (j = 0;strcasecmp(com_token, "\n") && strcasecmp(com_token, "}");j++)
- {
- if (j < 4)
- {
- strlcpy(parameter[j], com_token, sizeof(parameter[j]));
- numparameters = j + 1;
- }
- if (!COM_ParseToken(&text, true))
- break;
- }
- if (developer.integer >= 100)
- {
- Con_Printf("%s %i: ", shadername, passnumber);
- for (j = 0;j < numparameters;j++)
- Con_Printf(" %s", parameter[j]);
- Con_Print("\n");
- }
- if (passnumber == 0 && numparameters >= 1)
- {
- if (!strcasecmp(parameter[0], "blendfunc") && (flags & Q3SURFACEPARM_TRANS))
- {
- if (numparameters == 2 && !strcasecmp(parameter[1], "add"))
- flags2 |= Q3TEXTUREFLAG_ADDITIVE;
- else if (numparameters == 3 && !strcasecmp(parameter[1], "gl_one") && !strcasecmp(parameter[2], "gl_one"))
- flags2 |= Q3TEXTUREFLAG_ADDITIVE;
- else if (numparameters == 3 && !strcasecmp(parameter[1], "gl_src_alpha") && !strcasecmp(parameter[2], "gl_one"))
- flags2 |= Q3TEXTUREFLAG_ADDITIVE;
- }
- else if (numparameters >= 2 && (!strcasecmp(parameter[0], "map") || !strcasecmp(parameter[0], "clampmap")))
- strlcpy(firstpasstexturename, parameter[1], sizeof(firstpasstexturename));
- else if (numparameters >= 3 && !strcasecmp(parameter[0], "animmap"))
- strlcpy(firstpasstexturename, parameter[2], sizeof(firstpasstexturename));
- else if (numparameters >= 2 && !strcasecmp(parameter[0], "alphafunc"))
- flags2 |= Q3TEXTUREFLAG_ALPHATEST;
- }
- // break out a level if it was }
- if (!strcasecmp(com_token, "}"))
- break;
- }
- passnumber++;
- continue;
- }
- numparameters = 0;
- for (j = 0;strcasecmp(com_token, "\n") && strcasecmp(com_token, "}");j++)
- {
- if (j < 4)
- {
- strlcpy(parameter[j], com_token, sizeof(parameter[j]));
- numparameters = j + 1;
- }
- if (!COM_ParseToken(&text, true))
- break;
- }
- if (i == 0 && !strcasecmp(com_token, "}"))
- break;
- if (developer.integer >= 100)
- {
- Con_Printf("%s: ", shadername);
- for (j = 0;j < numparameters;j++)
- Con_Printf(" %s", parameter[j]);
- Con_Print("\n");
- }
- if (numparameters < 1)
- continue;
- if (!strcasecmp(parameter[0], "surfaceparm") && numparameters >= 2)
- {
- if (!strcasecmp(parameter[1], "alphashadow"))
- flags |= Q3SURFACEPARM_ALPHASHADOW;
- else if (!strcasecmp(parameter[1], "areaportal"))
- flags |= Q3SURFACEPARM_AREAPORTAL;
- else if (!strcasecmp(parameter[1], "clusterportal"))
- flags |= Q3SURFACEPARM_CLUSTERPORTAL;
- else if (!strcasecmp(parameter[1], "detail"))
- flags |= Q3SURFACEPARM_DETAIL;
- else if (!strcasecmp(parameter[1], "donotenter"))
- flags |= Q3SURFACEPARM_DONOTENTER;
- else if (!strcasecmp(parameter[1], "fog"))
- flags |= Q3SURFACEPARM_FOG;
- else if (!strcasecmp(parameter[1], "lava"))
- flags |= Q3SURFACEPARM_LAVA;
- else if (!strcasecmp(parameter[1], "lightfilter"))
- flags |= Q3SURFACEPARM_LIGHTFILTER;
- else if (!strcasecmp(parameter[1], "metalsteps"))
- flags |= Q3SURFACEPARM_METALSTEPS;
- else if (!strcasecmp(parameter[1], "nodamage"))
- flags |= Q3SURFACEPARM_NODAMAGE;
- else if (!strcasecmp(parameter[1], "nodlight"))
- flags |= Q3SURFACEPARM_NODLIGHT;
- else if (!strcasecmp(parameter[1], "nodraw"))
- flags |= Q3SURFACEPARM_NODRAW;
- else if (!strcasecmp(parameter[1], "nodrop"))
- flags |= Q3SURFACEPARM_NODROP;
- else if (!strcasecmp(parameter[1], "noimpact"))
- flags |= Q3SURFACEPARM_NOIMPACT;
- else if (!strcasecmp(parameter[1], "nolightmap"))
- flags |= Q3SURFACEPARM_NOLIGHTMAP;
- else if (!strcasecmp(parameter[1], "nomarks"))
- flags |= Q3SURFACEPARM_NOMARKS;
- else if (!strcasecmp(parameter[1], "nomipmaps"))
- flags |= Q3SURFACEPARM_NOMIPMAPS;
- else if (!strcasecmp(parameter[1], "nonsolid"))
- flags |= Q3SURFACEPARM_NONSOLID;
- else if (!strcasecmp(parameter[1], "origin"))
- flags |= Q3SURFACEPARM_ORIGIN;
- else if (!strcasecmp(parameter[1], "playerclip"))
- flags |= Q3SURFACEPARM_PLAYERCLIP;
- else if (!strcasecmp(parameter[1], "sky"))
- flags |= Q3SURFACEPARM_SKY;
- else if (!strcasecmp(parameter[1], "slick"))
- flags |= Q3SURFACEPARM_SLICK;
- else if (!strcasecmp(parameter[1], "slime"))
- flags |= Q3SURFACEPARM_SLIME;
- else if (!strcasecmp(parameter[1], "structural"))
- flags |= Q3SURFACEPARM_STRUCTURAL;
- else if (!strcasecmp(parameter[1], "trans"))
- flags |= Q3SURFACEPARM_TRANS;
- else if (!strcasecmp(parameter[1], "water"))
- flags |= Q3SURFACEPARM_WATER;
- else if (!strcasecmp(parameter[1], "pointlight"))
- flags |= Q3SURFACEPARM_POINTLIGHT;
- else
- Con_Printf("%s parsing warning: unknown surfaceparm \"%s\"\n", search->filenames[i], parameter[1]);
- }
- else if (!strcasecmp(parameter[0], "sky") && numparameters >= 2)
- strlcpy(sky, parameter[1], sizeof(sky));
- else if (!strcasecmp(parameter[0], "skyparms") && numparameters >= 2)
- {
- if (!atoi(parameter[1]) && strcasecmp(parameter[1], "-"))
- strlcpy(sky, parameter[1], sizeof(sky));
- }
- else if (!strcasecmp(parameter[0], "cull") && numparameters >= 2)
- {
- if (!strcasecmp(parameter[1], "disable") || !strcasecmp(parameter[1], "none") || !strcasecmp(parameter[1], "twosided"))
- flags2 |= Q3TEXTUREFLAG_TWOSIDED;
- }
- else if (!strcasecmp(parameter[0], "nomipmaps"))
- flags2 |= Q3TEXTUREFLAG_NOMIPMAPS;
- else if (!strcasecmp(parameter[0], "nopicmip"))
- flags2 |= Q3TEXTUREFLAG_NOPICMIP;
- else if (!strcasecmp(parameter[0], "deformvertexes") && numparameters >= 2)
- {
- if (!strcasecmp(parameter[1], "autosprite") && numparameters == 2)
- flags2 |= Q3TEXTUREFLAG_AUTOSPRITE;
- if (!strcasecmp(parameter[1], "autosprite2") && numparameters == 2)
- flags2 |= Q3TEXTUREFLAG_AUTOSPRITE2;
- }
- }
- // add shader to list (shadername and flags)
- // actually here we just poke into the texture settings
- for (j = 0, out = loadmodel->data_textures;j < loadmodel->num_textures;j++, out++)
- {
- if (!strcasecmp(out->name, shadername))
- {
- out->surfaceparms = flags;
- out->textureflags = flags2;
- out->basematerialflags = 0;
- if (out->surfaceparms & Q3SURFACEPARM_NODRAW)
- out->basematerialflags |= MATERIALFLAG_NODRAW;
- else if (out->surfaceparms & Q3SURFACEPARM_SKY)
- out->basematerialflags |= MATERIALFLAG_SKY;
- else if (out->surfaceparms & Q3SURFACEPARM_LAVA)
- out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_FULLBRIGHT;
- else if (out->surfaceparms & Q3SURFACEPARM_SLIME)
- out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_WATERALPHA;
- else if (out->surfaceparms & Q3SURFACEPARM_WATER)
- out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_WATERALPHA;
- else
- out->basematerialflags |= MATERIALFLAG_WALL;
- if (out->textureflags & Q3TEXTUREFLAG_ALPHATEST)
- {
- // FIXME: support alpha test?
- out->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT;
- }
- else if (out->surfaceparms & Q3SURFACEPARM_TRANS)
- {
- if (out->textureflags & Q3TEXTUREFLAG_ADDITIVE)
- out->basematerialflags |= MATERIALFLAG_ADD | MATERIALFLAG_TRANSPARENT;
- else
- out->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT;
- }
- strlcpy(out->firstpasstexturename, firstpasstexturename, sizeof(out->firstpasstexturename));
- if ((flags & Q3SURFACEPARM_SKY) && sky[0])
- {
- // quake3 seems to append a _ to the skybox name, so this must do so as well
- dpsnprintf(loadmodel->brush.skybox, sizeof(loadmodel->brush.skybox), "%s_", sky);
- }
- }
- }
- }
- else
- {
- Con_Printf("%s parsing error - expected \"{\", found \"%s\"\n", search->filenames[i], com_token);
- goto parseerror;
- }
- }
-parseerror:
- Mem_Free(f);
- }
- }
- }