\r
\r
Shader parameters for DP's own features:\r
-- dp_reflect <factor> <r> <g> <b>\r
- Makes surfaces of this shader reflective with r_glsl_water. Factor is a\r
- reflectiveness factor from 0 to 1, the rest is the color of the reflection.\r
- Unspecified values get set to 1 (that is, standard water parameters).\r
-- dp_refract <factor> <r> <g> <b>\r
+- dp_reflect <r> <g> <b>\r
+ Makes surfaces of this shader reflective with r_glsl_water. The reflection is\r
+ additive. When the color isn't specified, it defaults to white (full\r
+ reflection). If only one color component is specified, it counts as a grey\r
+ value.\r
+- dp_refract <reflectmin> <reflectmax> <distort> <r> <g> <b>\r
Marks a surface as "water" for r_glsl_water, that is, add a refraction\r
- component too. The factor defines how strong the distorts by the refraction\r
- are (default: 1.0). Unspecified values get set to 1 (that is, standard water\r
- parameters).\r
+ component too. The reflection amount (see dp_reflect) is at least reflectmin\r
+ (when looking straight into it) and at most reflectmax (when looking parallel\r
+ to thhe surface). The default distort is multiplied by distort. The color\r
+ modulates the refraction component. reflectmin defaults to 0 when unspecified,\r
+ all others default to 1. If only one color component is specified, it counts\r
+ as a grey value.\r
"uniform myhvec3 RefractColor;\n"
"uniform myhvec3 ReflectColor;\n"
"uniform myhalf ReflectFactor;\n"
+"uniform myhalf ReflectOffset;\n"
"//#else\n"
"//# ifdef USEREFLECTION\n"
"//uniform vec4 DistortScaleRefractReflect;\n"
" vec4 ScreenScaleRefractReflectIW = ScreenScaleRefractReflect * (1.0 / ModelViewProjectionPosition.w);\n"
" //vec4 ScreenTexCoord = (ModelViewProjectionPosition.xyxy + normalize(myhvec3(texture2D(Texture_Normal, TexCoord)) - myhvec3(0.5)).xyxy * DistortScaleRefractReflect * 100) * ScreenScaleRefractReflectIW + ScreenCenterRefractReflect;\n"
" vec4 ScreenTexCoord = ModelViewProjectionPosition.xyxy * ScreenScaleRefractReflectIW + ScreenCenterRefractReflect + vec3(normalize(myhvec3(texture2D(Texture_Normal, TexCoord)) - myhvec3(0.5))).xyxy * DistortScaleRefractReflect;\n"
-" myhalf Fresnel = myhalf(pow(min(1.0, 1.0 - float(normalize(EyeVector).z)), 2.0)) * ReflectFactor;\n"
+" myhalf Fresnel = myhalf(pow(min(1.0, 1.0 - float(normalize(EyeVector).z)), 2.0)) * ReflectFactor + ReflectOffset;\n"
" color.rgb = mix(mix(myhvec3(texture2D(Texture_Refraction, ScreenTexCoord.xy)) * RefractColor, myhvec3(texture2D(Texture_Reflection, ScreenTexCoord.zw)) * ReflectColor, Fresnel), color.rgb, color.a);\n"
"# else\n"
"# ifdef USEREFLECTION\n"
" vec4 ScreenScaleRefractReflectIW = ScreenScaleRefractReflect * (1.0 / ModelViewProjectionPosition.w);\n"
" //vec4 ScreenTexCoord = (ModelViewProjectionPosition.xyxy + normalize(myhvec3(texture2D(Texture_Normal, TexCoord)) - myhvec3(0.5)).xyxy * DistortScaleRefractReflect * 100) * ScreenScaleRefractReflectIW + ScreenCenterRefractReflect;\n"
" vec4 ScreenTexCoord = ModelViewProjectionPosition.xyxy * ScreenScaleRefractReflectIW + ScreenCenterRefractReflect + vec3(normalize(myhvec3(texture2D(Texture_Normal, TexCoord)) - myhvec3(0.5))).xyxy * DistortScaleRefractReflect;\n"
-" color.rgb = mix(color.rgb, myhvec3(texture2D(Texture_Reflection, ScreenTexCoord.zw)), ReflectFactor);\n"
+" color.rgb += myhvec3(texture2D(Texture_Reflection, ScreenTexCoord.zw)) * ReflectColor;\n"
"# endif\n"
"# endif\n"
"#endif\n"
p->loc_RefractColor = qglGetUniformLocationARB(p->program, "RefractColor");
p->loc_ReflectColor = qglGetUniformLocationARB(p->program, "ReflectColor");
p->loc_ReflectFactor = qglGetUniformLocationARB(p->program, "ReflectFactor");
+ p->loc_ReflectOffset = qglGetUniformLocationARB(p->program, "ReflectOffset");
// initialize the samplers to refer to the texture units we use
if (p->loc_Texture_Normal >= 0) qglUniform1iARB(p->loc_Texture_Normal, 0);
if (p->loc_Texture_Color >= 0) qglUniform1iARB(p->loc_Texture_Color, 1);
if (r_glsl_permutation->loc_ScreenCenterRefractReflect >= 0) qglUniform4fARB(r_glsl_permutation->loc_ScreenCenterRefractReflect, r_waterstate.screencenter[0], r_waterstate.screencenter[1], r_waterstate.screencenter[0], r_waterstate.screencenter[1]);
if (r_glsl_permutation->loc_RefractColor >= 0) qglUniform3fvARB(r_glsl_permutation->loc_RefractColor, 1, rsurface.texture->refractcolor);
if (r_glsl_permutation->loc_ReflectColor >= 0) qglUniform3fvARB(r_glsl_permutation->loc_ReflectColor, 1, rsurface.texture->reflectcolor);
- if (r_glsl_permutation->loc_ReflectFactor >= 0) qglUniform1fARB(r_glsl_permutation->loc_ReflectFactor, rsurface.texture->reflectfactor);
+ if (r_glsl_permutation->loc_ReflectFactor >= 0) qglUniform1fARB(r_glsl_permutation->loc_ReflectFactor, rsurface.texture->reflectmax - rsurface.texture->reflectmin);
+ if (r_glsl_permutation->loc_ReflectOffset >= 0) qglUniform1fARB(r_glsl_permutation->loc_ReflectOffset, rsurface.texture->reflectmin);
CHECKGLERROR
return permutation;
}
tx->basematerialflags |= MATERIALFLAG_WATERALPHA | MATERIALFLAG_NOSHADOW | MATERIALFLAG_WATERSHADER;
VectorSet(tx->reflectcolor, 1, 1, 1);
VectorSet(tx->refractcolor, 1, 1, 1);
- tx->reflectfactor = 1;
+ tx->reflectmin = 0;
+ tx->reflectmax = 1;
tx->refractfactor = 1;
}
tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_NOSHADOW;
memset(shader, 0, sizeof(*shader));
VectorSet(shader->reflectcolor, 1, 1, 1);
VectorSet(shader->refractcolor, 1, 1, 1);
- shader->reflectfactor = 1;
+ shader->reflectmin = 0;
+ shader->reflectmax = 1;
shader->refractfactor = 1;
strlcpy(shader->name, com_token, sizeof(shader->name));
{
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]));
+ 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->refractfactor = atof(parameter[1]);
+ shader->reflectmin = atof(parameter[1]);
+ if(numparameters >= 3)
+ shader->reflectmax = atof(parameter[2]);
+ if(numparameters >= 4)
+ shader->refractfactor = atof(parameter[3]);
if(numparameters >= 5)
- VectorSet(shader->refractcolor, atof(parameter[2]), atof(parameter[3]), atof(parameter[4]));
+ 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)
{
}
}
memcpy(texture->deforms, shader->deforms, sizeof(texture->deforms));
- texture->reflectfactor = shader->reflectfactor;
+ texture->reflectmin = shader->reflectmin;
+ texture->reflectmax = shader->reflectmax;
texture->refractfactor = shader->refractfactor;
VectorCopy(shader->reflectcolor, texture->reflectcolor);
VectorCopy(shader->refractcolor, texture->refractcolor);
q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
vec3_t reflectcolor, refractcolor;
- float reflectfactor; // amount of reflection (1.0 = full, can't be larger)
+ float reflectmin; // when refraction is used, minimum amount of reflection (when looking straight down)
+ float reflectmax; // when refraction is used, maximum amount of reflection (when looking parallel to water)
float refractfactor; // amount of refraction distort (1.0 = like the cvar specifies; note that reflection distort is not configurable because that's what the bumpmap should do)
}
q3shaderinfo_t;
// reflection
vec3_t reflectcolor, refractcolor;
- float reflectfactor; // amount of reflection (1.0 = full, can't be larger)
+ float reflectmin; // when refraction is used, minimum amount of reflection (when looking straight down)
+ float reflectmax; // when refraction is used, maximum amount of reflection (when looking parallel to water)
float refractfactor; // amount of refraction distort (1.0 = like the cvar specifies; note that reflection distort is not configurable because that's what the bumpmap should do)
}
texture_t;
int loc_RefractColor;
int loc_ReflectColor;
int loc_ReflectFactor;
+ int loc_ReflectOffset;
}
r_glsl_permutation_t;