int hashindex, vnum;
shadowmeshvertexhash_t *hash;
// this uses prime numbers intentionally
- hashindex = (unsigned int) (vertex14f[0] * 29 + vertex14f[1] * 71 + vertex14f[2] * 113) % 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);
break;
}
shader = q3shaders_shaders + q3shaders_numshaders++;
+
memset(shader, 0, sizeof(*shader));
+ VectorSet(shader->reflectcolor, 1, 1, 1);
+ VectorSet(shader->refractcolor, 1, 1, 1);
+ shader->reflectfactor = 1;
+ shader->refractfactor = 1;
+
strlcpy(shader->name, com_token, sizeof(shader->name));
if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{"))
{
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)
+ shader->reflectfactor = atof(parameter[1]);
+ if(numparameters >= 5)
+ VectorSet(shader->reflectcolor, atof(parameter[2]), atof(parameter[3]), atof(parameter[4]));
+ }
+ else if (!strcasecmp(parameter[0], "dp_refract"))
+ {
+ shader->textureflags |= Q3TEXTUREFLAG_WATERSHADER;
+ if(numparameters >= 2)
+ shader->refractfactor = atof(parameter[1]);
+ if(numparameters >= 5)
+ VectorSet(shader->refractcolor, atof(parameter[2]), atof(parameter[3]), atof(parameter[4]));
+ }
else if (!strcasecmp(parameter[0], "deformvertexes") && numparameters >= 2)
{
int i, deformindex;
shader->primarylayer = shader->layers + 1;
}
}
+ // fix up multiple reflection types
+ if(shader->textureflags & Q3TEXTUREFLAG_WATERSHADER)
+ shader->textureflags &= ~Q3TEXTUREFLAG_REFLECTION;
}
Mem_Free(f);
}
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)
}
}
memcpy(texture->deforms, shader->deforms, sizeof(texture->deforms));
+ texture->reflectfactor = shader->reflectfactor;
+ texture->refractfactor = shader->refractfactor;
+ VectorCopy(shader->reflectcolor, texture->reflectcolor);
+ VectorCopy(shader->refractcolor, texture->refractcolor);
}
else if (!strcmp(texture->name, "noshader"))
{