X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=f11963bd0ee269a232e8ed028fe771c9cd28c23f;hb=2f311cc6db562c4a78e216f914fdbeab4227aa69;hp=83d0faaa62d94b06c13df57d6ce0560607201f06;hpb=8840a67719fed133a86d8a3da6bc96b850ec9d43;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index 83d0faaa..f11963bd 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -447,21 +447,32 @@ static void R_BuildFogTexture(void) static const char *builtinshaderstring = "// ambient+diffuse+specular+normalmap+attenuation+cubemap+fog shader\n" "// written by Forest 'LordHavoc' Hale\n" +"\n" +"// enable various extensions depending on permutation:\n" +"\n" "#ifdef USESHADOWMAPRECT\n" -"#extension GL_ARB_texture_rectangle : enable\n" +"# extension GL_ARB_texture_rectangle : enable\n" "#endif\n" +"\n" "#ifdef USESHADOWMAP2D\n" -"# ifdef HASTEXTUREGATHER\n" +"# ifdef GL_EXT_gpu_shader4\n" +"# extension GL_EXT_gpu_shader4 : enable\n" +"# endif\n" +"# ifdef GL_ARB_texture_gather\n" "# extension GL_ARB_texture_gather : enable\n" "# else\n" -"# ifdef HASTEXTURE4\n" +"# ifdef GL_AMD_texture_texture4\n" "# extension GL_AMD_texture_texture4 : enable\n" -"# define textureGather texture4\n" "# endif\n" "# endif\n" "#endif\n" +"\n" "#ifdef USESHADOWMAPCUBE\n" -"#extension GL_EXT_gpu_shader4 : enable\n" +"# extension GL_EXT_gpu_shader4 : enable\n" +"#endif\n" +"\n" +"#ifdef USESHADOWSAMPLER\n" +"# extension GL_ARB_shadow : enable\n" "#endif\n" "\n" "// common definitions between vertex shader and fragment shader:\n" @@ -788,7 +799,7 @@ static const char *builtinshaderstring = "# endif\n" "#endif\n" "\n" -"#if defined(USESHADOWMAPRECT) || defined(USESHADOWMAP2D)\n" +"#ifdef USESHADOWMAPVSDCT\n" "uniform samplerCube Texture_CubeProjection;\n" "#endif\n" "\n" @@ -896,7 +907,7 @@ static const char *builtinshaderstring = "#endif // USEOFFSETMAPPING\n" "\n" "#if defined(USESHADOWMAPRECT) || defined(USESHADOWMAP2D) || defined(USESHADOWMAPCUBE)\n" -"uniform vec4 ShadowMap_TextureScale;\n" +"uniform vec2 ShadowMap_TextureScale;\n" "uniform vec4 ShadowMap_Parameters;\n" "#endif\n" "\n" @@ -904,88 +915,58 @@ static const char *builtinshaderstring = "vec3 GetShadowMapTC2D(vec3 dir)\n" "{\n" " vec3 adir = abs(dir);\n" -"# if 0\n" +"# ifndef USESHADOWMAPVSDCT\n" " vec2 tc;\n" " vec2 offset;\n" " float ma;\n" " if (adir.x > adir.y)\n" " {\n" -" if (adir.x > adir.z)\n" +" if (adir.x > adir.z) // X\n" " {\n" " ma = adir.x;\n" -" if (dir.x >= 0.0)\n" -" {\n" -" // +X\n" -" tc = vec2(-dir.z, -dir.y);\n" -" offset = vec2(0.5, 0.5);\n" -" }\n" -" else\n" -" {\n" -" // -X\n" -" tc = vec2( dir.z, -dir.y);\n" -" offset = vec2(1.5, 0.5);\n" -" }\n" +" tc = dir.zy;\n" +" offset = vec2(mix(0.5, 1.5, dir.x < 0.0), 0.5);\n" " }\n" -" else\n" +" else // Z\n" " {\n" -" ma = adir.z;\n" -" if (dir.z >= 0.0)\n" -" {\n" -" // +Z\n" -" tc = vec2( dir.x, -dir.y);\n" -" offset = vec2(0.5, 2.5);\n" -" }\n" -" else\n" -" {\n" -" // -Z\n" -" tc = vec2(-dir.x, -dir.y);\n" -" offset = vec2(1.5, 2.5);\n" -" }\n" +" ma = adir.z;\n" +" tc = dir.xy;\n" +" offset = vec2(mix(0.5, 1.5, dir.z < 0.0), 2.5);\n" " }\n" " }\n" " else\n" " {\n" -" if (adir.y > adir.z)\n" +" if (adir.y > adir.z) // Y\n" " {\n" -" ma = adir.y;\n" -" if (dir.y >= 0.0)\n" -" {\n" -" // +Y\n" -" tc = vec2( dir.x, dir.z);\n" -" offset = vec2(0.5, 1.5);\n" -" }\n" -" else\n" -" {\n" -" // -Y\n" -" tc = vec2( dir.x, -dir.z);\n" -" offset = vec2(1.5, 1.5);\n" -" }\n" +" ma = adir.y;\n" +" tc = dir.xz;\n" +" offset = vec2(mix(0.5, 1.5, dir.y < 0.0), 1.5);\n" " }\n" -" else\n" +" else // Z\n" " {\n" -" ma = adir.z;\n" -" if (dir.z >= 0.0)\n" -" {\n" -" // +Z\n" -" tc = vec2(dir.x, -dir.y);\n" -" offset = vec2(0.5, 2.5);\n" -" }\n" -" else\n" -" {\n" -" // -Z\n" -" tc = vec2(-dir.x, -dir.y);\n" -" offset = vec2(1.5, 2.5);\n" -" }\n" +" ma = adir.z;\n" +" tc = dir.xy;\n" +" offset = vec2(mix(0.5, 1.5, dir.z < 0.0), 2.5);\n" " }\n" " }\n" "\n" -" return vec3(tc * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma + vec3(offset * ShadowMap_Parameters.y, ShadowMap_Parameters.z);\n" +" vec3 stc = vec3(tc * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc.xy += offset * ShadowMap_Parameters.y;\n" +" stc.z += ShadowMap_Parameters.z;\n" +"# if showshadowmap\n" +" stc.xy *= ShadowMap_TextureScale;\n" +"# endif\n" +" return stc;\n" "# else\n" -"# ifdef USESHADOWMAPRECT \n" -" return vec3(textureCube(Texture_CubeProjection, dir.xyz).ra * ShadowMap_TextureScale.xy, ShadowMap_TextureScale.z + ShadowMap_TextureScale.w / max(max(adir.x, adir.y), adir.z));\n" -"# else\n" -" return vec3(textureCube(Texture_CubeProjection, dir.xyz).ra, ShadowMap_Parameters.z + ShadowMap_Parameters.w / max(max(adir.x, adir.y), adir.z));\n" +" vec4 proj = textureCube(Texture_CubeProjection, dir);\n" +" float ma = max(max(adir.x, adir.y), adir.z);\n" +" vec3 stc = vec3(mix(dir.xy, dir.zz, proj.xy) * ShadowMap_Parameters.x, ShadowMap_Parameters.w) / ma;\n" +" stc.xy += proj.zw * ShadowMap_Parameters.y;\n" +" stc.z += ShadowMap_Parameters.z;\n" +"# if showshadowmap\n" +" stc.xy *= ShadowMap_TextureScale;\n" "# endif\n" +" return stc;\n" "# endif\n" "}\n" "#endif // defined(USESHADOWMAPRECT) || defined(USESHADOWMAP2D)\n" @@ -1007,11 +988,8 @@ static const char *builtinshaderstring = "# ifdef USESHADOWSAMPLER\n" "\n" "# ifdef USESHADOWMAPPCF\n" -" f = dot(vec4(0.25),\n" -" vec4(shadow2DRect(Texture_ShadowMapRect, shadowmaptc.xyz + vec3(-0.4, 1.0, 0.0)).r,\n" -" shadow2DRect(Texture_ShadowMapRect, shadowmaptc.xyz + vec3(-1.0, -0.4, 0.0)).r,\n" -" shadow2DRect(Texture_ShadowMapRect, shadowmaptc.xyz + vec3( 0.4, -1.0, 0.0)).r,\n" -" shadow2DRect(Texture_ShadowMapRect, shadowmaptc.xyz + vec3( 1.0, 0.4, 0.0)).r));\n" +"# define texval(x, y) shadow2DRect(Texture_ShadowMapRect, shadowmaptc + vec3(x, y, 0.0)).r\n" +" f = dot(vec4(0.25), vec4(texval(-0.4, 1.0), texval(-1.0, -0.4), texval(0.4, -1.0), texval(1.0, 0.4)));\n" "# else\n" " f = shadow2DRect(Texture_ShadowMapRect, shadowmaptc).r;\n" "# endif\n" @@ -1019,54 +997,22 @@ static const char *builtinshaderstring = "# else\n" "\n" "# ifdef USESHADOWMAPPCF\n" -"# if defined(HASTEXTUREGATHER) || defined(HASTEXTURE4)\n" -" vec2 offset = fract(shadowmaptc.xy - 0.5);\n" -" vec4 group1 = step(shadowmaptc.z, textureGather(Texture_ShadowMapRect, shadowmaptc.xy + vec2(-1.0, -1.0))),\n" -" group2 = step(shadowmaptc.z, textureGather(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 1.0, -1.0))),\n" -" group3 = step(shadowmaptc.z, textureGather(Texture_ShadowMapRect, shadowmaptc.xy + vec2(-1.0, 1.0))),\n" -" group4 = step(shadowmaptc.z, textureGather(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 1.0, 1.0))),\n" -" cols = vec4(group1.ab, group2.ab) + vec4(group3.rg, group4.rg) +\n" -" mix(vec4(group1.rg, group2.rg), vec4(group3.ab, group4.ab), offset.y);\n" -" f = dot(mix(cols.xyz, cols.yzw, offset.x), vec3(1.0/9.0));\n" -"# elif 1\n" +"# if USESHADOWMAPPCF > 1\n" +"# define texval(x, y) texture2DRect(Texture_ShadowMapRect, center + vec2(x, y)).r\n" " vec2 center = shadowmaptc.xy - 0.5, offset = fract(center);\n" -" vec4 row1 = step(shadowmaptc.z,\n" -" vec4(texture2DRect(Texture_ShadowMapRect, center + vec2(-1.0, -1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 0.0, -1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 1.0, -1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 2.0, -1.0)).r)),\n" -" row2 = step(shadowmaptc.z,\n" -" vec4(texture2DRect(Texture_ShadowMapRect, center + vec2(-1.0, 0.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 1.0, 0.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 2.0, 0.0)).r)),\n" -" row3 = step(shadowmaptc.z,\n" -" vec4(texture2DRect(Texture_ShadowMapRect, center + vec2(-1.0, 1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 0.0, 1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 1.0, 1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 2.0, 1.0)).r)),\n" -" row4 = step(shadowmaptc.z,\n" -" vec4(texture2DRect(Texture_ShadowMapRect, center + vec2(-1.0, 2.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 0.0, 2.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 1.0, 2.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, center + vec2( 2.0, 2.0)).r)),\n" -" cols = row2 + row3 + mix(row1, row4, offset.y);\n" +" vec4 row1 = step(shadowmaptc.z, vec4(texval(-1.0, -1.0), texval( 0.0, -1.0), texval( 1.0, -1.0), texval( 2.0, -1.0)));\n" +" vec4 row2 = step(shadowmaptc.z, vec4(texval(-1.0, 0.0), texval( 0.0, 0.0), texval( 1.0, 0.0), texval( 2.0, 0.0)));\n" +" vec4 row3 = step(shadowmaptc.z, vec4(texval(-1.0, 1.0), texval( 0.0, 1.0), texval( 1.0, 1.0), texval( 2.0, 1.0)));\n" +" vec4 row4 = step(shadowmaptc.z, vec4(texval(-1.0, 2.0), texval( 0.0, 2.0), texval( 1.0, 2.0), texval( 2.0, 2.0)));\n" +" vec4 cols = row2 + row3 + mix(row1, row4, offset.y);\n" " f = dot(mix(cols.xyz, cols.yzw, offset.x), vec3(1.0/9.0));\n" "# else\n" +"# define texval(x, y) texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2(x, y)).r\n" " vec2 offset = fract(shadowmaptc.xy);\n" -" vec3 row1 = step(shadowmaptc.z,\n" -" vec3(texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2(-1.0, -1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 0.0, -1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 1.0, -1.0)).r)),\n" -" row2 = step(shadowmaptc.z,\n" -" vec3(texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2(-1.0, 0.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 1.0, 0.0)).r)),\n" -" row3 = step(shadowmaptc.z,\n" -" vec3(texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2(-1.0, 1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 0.0, 1.0)).r,\n" -" texture2DRect(Texture_ShadowMapRect, shadowmaptc.xy + vec2( 1.0, 1.0)).r)),\n" -" cols = row2 + mix(row1, row3, offset.y);\n" +" vec3 row1 = step(shadowmaptc.z, vec3(texval(-1.0, -1.0), texval( 0.0, -1.0), texval( 1.0, -1.0)));\n" +" vec3 row2 = step(shadowmaptc.z, vec3(texval(-1.0, 0.0), texval( 0.0, 0.0), texval( 1.0, 0.0)));\n" +" vec3 row3 = step(shadowmaptc.z, vec3(texval(-1.0, 1.0), texval( 0.0, 1.0), texval( 1.0, 1.0)));\n" +" vec3 cols = row2 + mix(row1, row3, offset.y);\n" " f = dot(mix(cols.xy, cols.yz, offset.x), vec2(0.25));\n" "# endif\n" "# else\n" @@ -1083,10 +1029,59 @@ static const char *builtinshaderstring = "{\n" " vec3 shadowmaptc = GetShadowMapTC2D(dir);\n" " float f;\n" +"\n" "# ifdef USESHADOWSAMPLER\n" -" f = shadow2D(Texture_ShadowMap2D, shadowmaptc).r;\n" +"# ifdef USESHADOWMAPPCF\n" +"# define texval(x, y) shadow2D(Texture_ShadowMap2D, vec3(center + vec2(x, y)*ShadowMap_TextureScale, shadowmaptc.z)).r \n" +" vec2 center = shadowmaptc.xy*ShadowMap_TextureScale;\n" +" f = dot(vec4(0.25), vec4(texval(-0.4, 1.0), texval(-1.0, -0.4), texval(0.4, -1.0), texval(1.0, 0.4)));\n" +"# else\n" +" f = shadow2D(Texture_ShadowMap2D, vec3(shadowmaptc.xy*ShadowMap_TextureScale, shadowmaptc.z)).r;\n" +"# endif\n" "# else\n" -" f = step(shadowmaptc.z, texture2D(Texture_ShadowMap2D, shadowmaptc.xy).r);\n" +"# ifdef USESHADOWMAPPCF\n" +"# if defined(GL_ARB_texture_gather) || defined(GL_AMD_texture_texture4)\n" +"# ifdef GL_ARB_texture_gather\n" +"# define texval(x, y) textureGatherOffset(Texture_ShadowMap2D, center, ivec(x, y))\n" +"# else\n" +"# define texval(x, y) texture4(Texture_ShadowMap2D, center + vec2(x,y)*ShadowMap_TextureScale)\n" +"# endif\n" +" vec2 center = shadowmaptc.xy - 0.5, offset = fract(center);\n" +" center *= ShadowMap_TextureScale;\n" +" vec4 group1 = step(shadowmaptc.z, texval(-1.0, -1.0));\n" +" vec4 group2 = step(shadowmaptc.z, texval( 1.0, -1.0));\n" +" vec4 group3 = step(shadowmaptc.z, texval(-1.0, 1.0));\n" +" vec4 group4 = step(shadowmaptc.z, texval( 1.0, 1.0));\n" +" vec4 cols = vec4(group1.rg, group2.rg) + vec4(group3.ab, group4.ab) +\n" +" mix(vec4(group1.ab, group2.ab), vec4(group3.rg, group4.rg), offset.y);\n" +" f = dot(mix(cols.xyz, cols.yzw, offset.x), vec3(1.0/9.0));\n" +"# else\n" +"# ifdef GL_EXT_gpu_shader4\n" +"# define texval(x, y) texture2DOffset(Texture_ShadowMap2D, center, ivec2(x, y)).r\n" +"# else\n" +"# define texval(x, y) texture2D(Texture_ShadowMap2D, center + vec2(x, y)*ShadowMap_TextureScale).r \n" +"# endif\n" +"# if USESHADOWMAPPCF > 1\n" +" vec2 center = shadowmaptc.xy - 0.5, offset = fract(center);\n" +" center *= ShadowMap_TextureScale;\n" +" vec4 row1 = step(shadowmaptc.z, vec4(texval(-1.0, -1.0), texval( 0.0, -1.0), texval( 1.0, -1.0), texval( 2.0, -1.0)));\n" +" vec4 row2 = step(shadowmaptc.z, vec4(texval(-1.0, 0.0), texval( 0.0, 0.0), texval( 1.0, 0.0), texval( 2.0, 0.0)));\n" +" vec4 row3 = step(shadowmaptc.z, vec4(texval(-1.0, 1.0), texval( 0.0, 1.0), texval( 1.0, 1.0), texval( 2.0, 1.0)));\n" +" vec4 row4 = step(shadowmaptc.z, vec4(texval(-1.0, 2.0), texval( 0.0, 2.0), texval( 1.0, 2.0), texval( 2.0, 2.0)));\n" +" vec4 cols = row2 + row3 + mix(row1, row4, offset.y);\n" +" f = dot(mix(cols.xyz, cols.yzw, offset.x), vec3(1.0/9.0));\n" +"# else\n" +" vec2 center = shadowmaptc.xy*ShadowMap_TextureScale, offset = fract(shadowmaptc.xy);\n" +" vec3 row1 = step(shadowmaptc.z, vec3(texval(-1.0, -1.0), texval( 0.0, -1.0), texval( 1.0, -1.0)));\n" +" vec3 row2 = step(shadowmaptc.z, vec3(texval(-1.0, 0.0), texval( 0.0, 0.0), texval( 1.0, 0.0)));\n" +" vec3 row3 = step(shadowmaptc.z, vec3(texval(-1.0, 1.0), texval( 0.0, 1.0), texval( 1.0, 1.0)));\n" +" vec3 cols = row2 + mix(row1, row3, offset.y);\n" +" f = dot(mix(cols.xy, cols.yz, offset.x), vec2(0.25));\n" +"# endif\n" +"# endif\n" +"# else\n" +" f = step(shadowmaptc.z, texture2D(Texture_ShadowMap2D, shadowmaptc.xy*ShadowMap_TextureScale).r);\n" +"# endif\n" "# endif\n" " return f;\n" "}\n" @@ -1485,9 +1480,11 @@ typedef enum shaderpermutation_e SHADERPERMUTATION_SHADOWMAPCUBE = 1<<12, ///< (lightsource) use shadowmap cubemap texture as light filter SHADERPERMUTATION_SHADOWMAP2D = 1<<13, ///< (lightsource) use shadowmap rectangle texture as light filter SHADERPERMUTATION_SHADOWMAPPCF = 1<<14, //< (lightsource) use percentage closer filtering on shadowmap test results - SHADERPERMUTATION_SHADOWSAMPLER = 1<<15, //< (lightsource) use hardware shadowmap test - SHADERPERMUTATION_LIMIT = 1<<16, ///< size of permutations array - SHADERPERMUTATION_COUNT = 16 ///< size of shaderpermutationinfo array + SHADERPERMUTATION_SHADOWMAPPCF2 = 1<<15, //< (lightsource) use higher quality percentage closer filtering on shadowmap test results + SHADERPERMUTATION_SHADOWSAMPLER = 1<<16, //< (lightsource) use hardware shadowmap test + SHADERPERMUTATION_SHADOWMAPVSDCT = 1<<17, //< (lightsource) use virtual shadow depth cube texture for shadowmap indexing + SHADERPERMUTATION_LIMIT = 1<<18, ///< size of permutations array + SHADERPERMUTATION_COUNT = 18 ///< size of shaderpermutationinfo array } shaderpermutation_t; @@ -1508,8 +1505,10 @@ shaderpermutationinfo_t shaderpermutationinfo[SHADERPERMUTATION_COUNT] = {"#define USESHADOWMAPRECT\n", " shadowmaprect"}, {"#define USESHADOWMAPCUBE\n", " shadowmapcube"}, {"#define USESHADOWMAP2D\n", " shadowmap2d"}, - {"#define USESHADOWMAPPCF\n", " shadowmappcf"}, + {"#define USESHADOWMAPPCF 1\n", " shadowmappcf"}, + {"#define USESHADOWMAPPCF 2\n", " shadowmappcf2"}, {"#define USESHADOWSAMPLER\n", " shadowsampler"}, + {"#define USESHADOWMAPVSDCT\n", " shadowmapvsdct"}, }; /// this enum is multiplied by SHADERPERMUTATION_MODEBASE @@ -2008,10 +2007,11 @@ extern rtexture_t *r_shadow_attenuation3dtexture; extern qboolean r_shadow_usingshadowmaprect; extern qboolean r_shadow_usingshadowmapcube; extern qboolean r_shadow_usingshadowmap2d; -extern float r_shadow_shadowmap_texturescale[4]; +extern float r_shadow_shadowmap_texturescale[2]; extern float r_shadow_shadowmap_parameters[4]; -extern int r_shadow_shadowmode; -extern int r_shadow_shadowmapfilter; +extern qboolean r_shadow_shadowmapvsdct; +extern qboolean r_shadow_shadowmapsampler; +extern int r_shadow_shadowmappcf; void R_SetupSurfaceShader(const vec3_t lightcolorbase, qboolean modellighting, float ambientscale, float diffusescale, float specularscale, rsurfacepass_t rsurfacepass) { // select a permutation of the lighting shader appropriate to this @@ -2051,18 +2051,24 @@ void R_SetupSurfaceShader(const vec3_t lightcolorbase, qboolean modellighting, f permutation |= SHADERPERMUTATION_FOG; if (rsurface.texture->colormapping) permutation |= SHADERPERMUTATION_COLORMAPPING; - if (r_shadow_usingshadowmaprect) - permutation |= SHADERPERMUTATION_SHADOWMAPRECT; - if (r_shadow_usingshadowmapcube) - permutation |= SHADERPERMUTATION_SHADOWMAPCUBE; - if (r_shadow_usingshadowmap2d) - permutation |= SHADERPERMUTATION_SHADOWMAP2D; - if (r_shadow_shadowmapfilter == 3) - permutation |= SHADERPERMUTATION_SHADOWMAPPCF; - else if (r_shadow_shadowmapfilter == 2) - permutation |= SHADERPERMUTATION_SHADOWMAPPCF | SHADERPERMUTATION_SHADOWSAMPLER; - else if (r_shadow_shadowmapfilter == 1) - permutation |= SHADERPERMUTATION_SHADOWSAMPLER; + if (r_shadow_usingshadowmaprect || r_shadow_usingshadowmap2d || r_shadow_usingshadowmapcube) + { + if (r_shadow_usingshadowmaprect) + permutation |= SHADERPERMUTATION_SHADOWMAPRECT; + if (r_shadow_usingshadowmap2d) + permutation |= SHADERPERMUTATION_SHADOWMAP2D; + if (r_shadow_usingshadowmapcube) + permutation |= SHADERPERMUTATION_SHADOWMAPCUBE; + else if(r_shadow_shadowmapvsdct) + permutation |= SHADERPERMUTATION_SHADOWMAPVSDCT; + + if (r_shadow_shadowmapsampler) + permutation |= SHADERPERMUTATION_SHADOWSAMPLER; + if (r_shadow_shadowmappcf > 1) + permutation |= SHADERPERMUTATION_SHADOWMAPPCF2; + else if (r_shadow_shadowmappcf) + permutation |= SHADERPERMUTATION_SHADOWMAPPCF; + } } else if (rsurface.texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT) { @@ -2186,7 +2192,7 @@ void R_SetupSurfaceShader(const vec3_t lightcolorbase, qboolean modellighting, f // additive passes are only darkened by fog, not tinted if (r_glsl_permutation->loc_FogColor >= 0) qglUniform3fARB(r_glsl_permutation->loc_FogColor, 0, 0, 0); - if (r_glsl_permutation->loc_ShadowMap_TextureScale >= 0) qglUniform4fARB(r_glsl_permutation->loc_ShadowMap_TextureScale, r_shadow_shadowmap_texturescale[0], r_shadow_shadowmap_texturescale[1], r_shadow_shadowmap_texturescale[2], r_shadow_shadowmap_texturescale[3]); + if (r_glsl_permutation->loc_ShadowMap_TextureScale >= 0) qglUniform2fARB(r_glsl_permutation->loc_ShadowMap_TextureScale, r_shadow_shadowmap_texturescale[0], r_shadow_shadowmap_texturescale[1]); if (r_glsl_permutation->loc_ShadowMap_Parameters >= 0) qglUniform4fARB(r_glsl_permutation->loc_ShadowMap_Parameters, r_shadow_shadowmap_parameters[0], r_shadow_shadowmap_parameters[1], r_shadow_shadowmap_parameters[2], r_shadow_shadowmap_parameters[3]); } else @@ -3686,7 +3692,7 @@ static void R_Water_StartFrame(void) } // allocate textures as needed - if (r_waterstate.waterwidth != waterwidth || r_waterstate.waterheight != waterheight || r_waterstate.texturewidth != texturewidth || r_waterstate.textureheight != textureheight) + if (r_waterstate.texturewidth != texturewidth || r_waterstate.textureheight != textureheight) { r_waterstate.maxwaterplanes = MAX_WATERPLANES; for (i = 0, p = r_waterstate.waterplanes;i < r_waterstate.maxwaterplanes;i++, p++) @@ -3699,25 +3705,23 @@ static void R_Water_StartFrame(void) p->texture_reflection = NULL; } memset(&r_waterstate, 0, sizeof(r_waterstate)); - r_waterstate.waterwidth = waterwidth; - r_waterstate.waterheight = waterheight; r_waterstate.texturewidth = texturewidth; r_waterstate.textureheight = textureheight; } - // when doing a reduced render (HDR) we want to use a smaller area - waterwidth = (int)bound(1, r_refdef.view.width * r_water_resolutionmultiplier.value, r_refdef.view.width); - waterheight = (int)bound(1, r_refdef.view.height * r_water_resolutionmultiplier.value, r_refdef.view.height); - - if (r_waterstate.waterwidth) + if (r_waterstate.texturewidth) { r_waterstate.enabled = true; + // when doing a reduced render (HDR) we want to use a smaller area + r_waterstate.waterwidth = (int)bound(1, r_refdef.view.width * r_water_resolutionmultiplier.value, r_refdef.view.width); + r_waterstate.waterheight = (int)bound(1, r_refdef.view.height * r_water_resolutionmultiplier.value, r_refdef.view.height); + // set up variables that will be used in shader setup - r_waterstate.screenscale[0] = 0.5f * (float)waterwidth / (float)texturewidth; - r_waterstate.screenscale[1] = 0.5f * (float)waterheight / (float)textureheight; - r_waterstate.screencenter[0] = 0.5f * (float)waterwidth / (float)texturewidth; - r_waterstate.screencenter[1] = 0.5f * (float)waterheight / (float)textureheight; + r_waterstate.screenscale[0] = 0.5f * (float)r_waterstate.waterwidth / (float)r_waterstate.texturewidth; + r_waterstate.screenscale[1] = 0.5f * (float)r_waterstate.waterheight / (float)r_waterstate.textureheight; + r_waterstate.screencenter[0] = 0.5f * (float)r_waterstate.waterwidth / (float)r_waterstate.texturewidth; + r_waterstate.screencenter[1] = 0.5f * (float)r_waterstate.waterheight / (float)r_waterstate.textureheight; } r_waterstate.maxwaterplanes = MAX_WATERPLANES; @@ -4596,7 +4600,7 @@ void R_RenderView(void) return; } - if (!r_refdef.scene.entities || r_refdef.view.width * r_refdef.view.height == 0/* || !r_refdef.scene.worldmodel*/) + if (!r_refdef.scene.entities || r_refdef.view.width * r_refdef.view.height == 0 || !r_renderview.integer/* || !r_refdef.scene.worldmodel*/) return; //Host_Error ("R_RenderView: NULL worldmodel"); r_refdef.view.colorscale = r_hdr_scenebrightness.value;