From a687d7b330f9b476b77520590a525e49cf44667f Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Wed, 23 Feb 2022 01:17:05 -0800 Subject: [PATCH] Various tweaks to documentation inside the codebase, more verbose general information prints to console to aid non-devs in sending bug reports and finding other issues. Updates to some of the GLSL. Minor material fixes. --- platform/base_glsl.pk3dir/glsl/caustics.glsl | 5 +- .../base_glsl.pk3dir/glsl/caustics_a.glsl | 4 +- ...apped_specularcube_alt.glsl => decal.glsl} | 348 +++++++++--------- .../base_glsl.pk3dir/glsl/defaultwall.glsl | 23 +- .../base_glsl.pk3dir/glsl/lightmapped.glsl | 144 ++++++-- .../glsl/lightmapped_reflect.glsl | 23 +- .../glsl/lightmapped_reflectcube.glsl | 175 --------- .../glsl/lightmapped_speclazy.glsl | 167 --------- platform/base_glsl.pk3dir/glsl/rtlight.glsl | 64 +--- ...apped_alphatest.glsl => terrain_mask.glsl} | 63 ++-- platform/base_glsl.pk3dir/glsl/vertexlit.glsl | 112 ++++-- .../glsl/vertexlit_reflectcube.glsl | 116 ------ .../glsl/vertexlit_specular.glsl | 20 +- .../glsl/vertexlit_specularcube.glsl | 115 ------ .../glsl/vertexlit_specularcube_alt.glsl | 109 ------ .../textures/sfx/mirror.mat | 12 +- .../textures/sfx/mirror_n.tga | Bin 0 -> 364 bytes .../textures/sfx/reflection.mat | 9 +- .../textures/decals/puddle01.mat | 2 + .../textures/measure/ladder.mat | 12 +- .../textures/measure/rail.mat | 2 +- src/client/efx.qc | 4 +- src/client/entry.qc | 70 +++- src/client/sentences.qc | 7 +- src/client/titles.qc | 6 +- src/gs-entbase/shared/light_dynamic.qc | 2 + src/server/entry.qc | 15 +- src/server/hlmaterials.qc | 12 +- src/server/mapcycle.qc | 7 +- src/server/nodes.qc | 47 ++- src/server/plugins.qc | 6 +- src/server/sentences.qc | 7 +- src/shared/defs.h | 7 - src/shared/propdata.qc | 13 +- src/shared/sound.qc | 16 +- 35 files changed, 643 insertions(+), 1101 deletions(-) rename platform/base_glsl.pk3dir/glsl/{lightmapped_specularcube_alt.glsl => decal.glsl} (56%) delete mode 100644 platform/base_glsl.pk3dir/glsl/lightmapped_reflectcube.glsl delete mode 100644 platform/base_glsl.pk3dir/glsl/lightmapped_speclazy.glsl rename platform/base_glsl.pk3dir/glsl/{lightmapped_alphatest.glsl => terrain_mask.glsl} (71%) delete mode 100644 platform/base_glsl.pk3dir/glsl/vertexlit_reflectcube.glsl delete mode 100644 platform/base_glsl.pk3dir/glsl/vertexlit_specularcube.glsl delete mode 100644 platform/base_glsl.pk3dir/glsl/vertexlit_specularcube_alt.glsl create mode 100644 platform/base_textures.pk3dir/textures/sfx/mirror_n.tga diff --git a/platform/base_glsl.pk3dir/glsl/caustics.glsl b/platform/base_glsl.pk3dir/glsl/caustics.glsl index 06147832..d35cf49b 100644 --- a/platform/base_glsl.pk3dir/glsl/caustics.glsl +++ b/platform/base_glsl.pk3dir/glsl/caustics.glsl @@ -1,8 +1,9 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= +//======= Copyright (c) 2015-2022 Vera Visions LLC. All rights reserved. ======= // // Purpose: // -// Blending terrain and masking its edges for a smooth transition into alpha. +// Scrolling shader for patches that get blended on top of existing geometry +// with vertex colors defining fading out //============================================================================== !!ver 110 diff --git a/platform/base_glsl.pk3dir/glsl/caustics_a.glsl b/platform/base_glsl.pk3dir/glsl/caustics_a.glsl index 2086e4a6..b599ee48 100644 --- a/platform/base_glsl.pk3dir/glsl/caustics_a.glsl +++ b/platform/base_glsl.pk3dir/glsl/caustics_a.glsl @@ -1,8 +1,8 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= +//======= Copyright (c) 2015-2022 Vera Visions LLC. All rights reserved. ======= // // Purpose: // -// Blending terrain and masking its edges for a smooth transition into alpha. +// Alternate version of caustics that's practically inverted for subtract blends //============================================================================== !!ver 110 diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped_specularcube_alt.glsl b/platform/base_glsl.pk3dir/glsl/decal.glsl similarity index 56% rename from platform/base_glsl.pk3dir/glsl/lightmapped_specularcube_alt.glsl rename to platform/base_glsl.pk3dir/glsl/decal.glsl index 58c2ee94..5ef8a04e 100644 --- a/platform/base_glsl.pk3dir/glsl/lightmapped_specularcube_alt.glsl +++ b/platform/base_glsl.pk3dir/glsl/decal.glsl @@ -1,176 +1,172 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightmapped surface that will use its normalmap alpha for both specularity -// as well as environment cube reflectivity. -//============================================================================== - -!!ver 110 -!!permu FOG -!!permu BUMP -!!permu DELUXE -!!samps diffuse normalmap lightmap deluxemap reflectcube - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipNormal -!!cvardf r_skipSpecular -!!cvardf r_skipLightmap - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; -varying mat3 invsurface; - -varying vec2 lm0; -#ifdef LIGHTSTYLED -varying vec2 lm1, lm2, lm3; -#endif - -#ifdef FAKESHADOWS -varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - void lightmapped_init(void) - { - lm0 = v_lmcoord; - #ifdef LIGHTSTYLED - lm1 = v_lmcoord2; - lm2 = v_lmcoord3; - lm3 = v_lmcoord4; - #endif - } - - void main (void) - { - lightmapped_init(); - invsurface[0] = v_svector; - invsurface[1] = v_tvector; - invsurface[2] = v_normal; - - vec3 eyeminusvertex = e_eyepos - v_position.xyz; - eyevector.x = dot(eyeminusvertex, v_svector.xyz); - eyevector.y = dot(eyeminusvertex, v_tvector.xyz); - eyevector.z = dot(eyeminusvertex, v_normal.xyz); - - tex_c = v_texcoord; - gl_Position = ftetransform(); - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - -#if r_skipLightmap==0 - #ifdef LIGHTSTYLED - #define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb - #define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb - #define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb - #define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb - #else - #define LIGHTMAP texture2D(s_lightmap, lm0).rgb - #endif -#else - #ifdef LIGHTSTYLED - #define LIGHTMAP0 vec3(0.5,0.5,0.5) - #define LIGHTMAP1 vec3(0.5,0.5,0.5) - #define LIGHTMAP2 vec3(0.5,0.5,0.5) - #define LIGHTMAP3 vec3(0.5,0.5,0.5) - #else - #define LIGHTMAP vec3(0.5,0.5,0.5) - #endif -#endif - - vec3 lightmap_fragment() - { - vec3 lightmaps; - -#ifdef LIGHTSTYLED - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb; - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb; - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb; - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb; -#else - lightmaps = LIGHTMAP * e_lmscale.rgb; -#endif - return lightmaps; - } - -#if r_skipNormal==0 - vec3 lightmap_fragment(vec3 normal_f) - { -#ifndef DELUXE - return lightmap_fragment(); -#else - vec3 lightmaps; - - #if defined(LIGHTSTYLED) - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); - #else - lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); - #endif - - return lightmaps; -#endif - } -#endif - - void main (void) - { - vec3 cube_c; - vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0); - - #if r_skipDiffuse==0 - vec4 diffuse_f = texture2D(s_diffuse, tex_c); - #else - #define diffuse_f vec4(1.0, 1.0, 1.0, 1.0) - #endif - - #if r_skipNormal==1 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - #else - #define normal_f vec3(0.0,0.0,0.5) - #endif - - float gloss = texture2D(s_normalmap, tex_c).a; - float spec; - - vec3 halfdir = normalize(normalize(eyevector) - e_light_dir); - spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT); - spec *= (gloss * 0.1); - - #if r_skipNormal==1 - diffuse_f.rgb *= lightmap_fragment(); - #else - diffuse_f.rgb *= lightmap_fragment(normal_f); - #endif - - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - #if r_skipSpecular==0 - cube_c = reflect(normalize(-eyevector), normal_f.rgb); - cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; - cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; - out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss); - #endif - - out_f.rgb += spec; - - gl_FragColor = fog4(out_f); - } -#endif +//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= +// +// Purpose: +// +// Lightmapped surface that sticks to walls. +// +// diffusemap = albedo (rgba) +// normalmap = normal (rgb), reflectmask (a) +//============================================================================== + +!!ver 110 +!!permu FOG +!!permu BUMP +!!permu DELUXE +!!permu LIGHTSTYLED +!!samps diffuse + +!!samps lightmap +!!samps =BUMP normalmap reflectcube +!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3 +!!samps =DELUXE deluxemap +!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3 + +!!permu FAKESHADOWS +!!cvardf r_glsl_pcf +!!cvardf r_fullbright +!!samps =FAKESHADOWS shadowmap + +#include "sys/defs.h" + +// basics +varying vec2 tex_c; +varying vec2 lm0; + +// unfortunately we do support lightstyles +#if defined(LIGHTSTYLED) +varying vec2 lm1, lm2, lm3; +#endif + +// useful for terrain blending +varying vec4 vex_color; + +// dynamic shadows +#ifdef FAKESHADOWS +varying vec4 vtexprojcoord; +#endif + +#ifdef BUMP +varying vec3 eyevector; +varying mat3 invsurface; +#endif + +#ifdef VERTEX_SHADER + void lightmapped_init(void) + { + lm0 = v_lmcoord; + #if defined(LIGHTSTYLED) + lm1 = v_lmcoord2; + lm2 = v_lmcoord3; + lm3 = v_lmcoord4; + #endif + } + + void main () + { + lightmapped_init(); + tex_c = v_texcoord; + vex_color = v_colour; + gl_Position = ftetransform(); + + #ifdef FAKESHADOWS + vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); + #endif + + #ifdef BUMP + vec3 eyeminusvertex = e_eyepos - v_position.xyz; + eyevector.x = dot(eyeminusvertex, v_svector.xyz); + eyevector.y = dot(eyeminusvertex, v_tvector.xyz); + eyevector.z = dot(eyeminusvertex, v_normal.xyz); + invsurface[0] = v_svector; + invsurface[1] = v_tvector; + invsurface[2] = v_normal; + #endif + } +#endif + +#ifdef FRAGMENT_SHADER + #include "sys/fog.h" + #include "sys/pcf.h" + + #if defined(LIGHTSTYLED) + #define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb + #define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb + #define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb + #define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb + #else + #define LIGHTMAP texture2D(s_lightmap, lm0).rgb + #endif + + vec3 lightmap_fragment() + { + vec3 lightmaps; + +#if defined(LIGHTSTYLED) + lightmaps = LIGHTMAP0 * e_lmscale[0].rgb; + lightmaps += LIGHTMAP1 * e_lmscale[1].rgb; + lightmaps += LIGHTMAP2 * e_lmscale[2].rgb; + lightmaps += LIGHTMAP3 * e_lmscale[3].rgb; +#else + lightmaps = LIGHTMAP * e_lmscale.rgb; +#endif + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; + } + + vec3 lightmap_fragment(vec3 normal_f) + { +#ifndef DELUXE + return lightmap_fragment(); +#else + vec3 lightmaps; + + #if defined(LIGHTSTYLED) + lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); + lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); + lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); + lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); + #else + lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); + #endif + + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; +#endif + } + + void main (void) + { + vec4 diffuse_f; + float alpha; + + diffuse_f = texture2D(s_diffuse, tex_c); + diffuse_f.rgb *= diffuse_f.a; + + #ifdef FAKESHADOWS + diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); + #endif + + // the lighting stage for the world + #if defined(BUMP) + vec3 cube_c; + vec3 env_f; + vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); + float refl = texture2D(s_normalmap, tex_c).a; + diffuse_f.rgb *= lightmap_fragment(normal_f); + + cube_c = reflect(normalize(-eyevector), normal_f.rgb); + cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; + cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; + env_f = textureCube(s_reflectcube, cube_c).rgb * (e_lmscale.rgb * 0.25); + diffuse_f.rgb = mix(env_f, diffuse_f.rgb, refl); + #else + diffuse_f.rgb *= lightmap_fragment(); + #endif + + // start blend at half-way point + alpha = diffuse_f.a; + + if (alpha > 1.0) + alpha = 1.0; + + gl_FragColor = vec4(fog3(diffuse_f.rgb), alpha); + } +#endif diff --git a/platform/base_glsl.pk3dir/glsl/defaultwall.glsl b/platform/base_glsl.pk3dir/glsl/defaultwall.glsl index 7c594a97..2691bd3e 100644 --- a/platform/base_glsl.pk3dir/glsl/defaultwall.glsl +++ b/platform/base_glsl.pk3dir/glsl/defaultwall.glsl @@ -87,18 +87,19 @@ varying mat3 invsurface; #else lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb; #endif - #if gl_ldr==1 - if (lightmaps.r > 1.5) - lightmaps.r = 1.5f; - if (lightmaps.g > 1.5) - lightmaps.g = 1.5f; - if (lightmaps.b > 1.5) - lightmaps.b = 1.5f; + if (gl_ldr == 1.0) { - lightmaps.rgb * 0.5f; - lightmaps.rgb = floor(lightmaps.rgb * vec3(32,64,32))/vec3(32,64,32); - lightmaps.rgb * 2.0f; - #endif + if (lightmaps.r > 1.5) + lightmaps.r = 1.5f; + if (lightmaps.g > 1.5) + lightmaps.g = 1.5f; + if (lightmaps.b > 1.5) + lightmaps.b = 1.5f; + + lightmaps.rgb * 0.5f; + lightmaps.rgb = floor(lightmaps.rgb * vec3(32,64,32))/vec3(32,64,32); + lightmaps.rgb * 2.0f; + } return lightmaps; } diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped.glsl b/platform/base_glsl.pk3dir/glsl/lightmapped.glsl index af6e4da9..4fc04a54 100644 --- a/platform/base_glsl.pk3dir/glsl/lightmapped.glsl +++ b/platform/base_glsl.pk3dir/glsl/lightmapped.glsl @@ -3,46 +3,67 @@ // Purpose: // // Lightmapped surface. +// +// diffusemap = albedo (rgba) +// normalmap = normal (rgb), reflectmask (a) //============================================================================== !!ver 110 !!permu FOG + !!permu BUMP !!permu DELUXE !!permu LIGHTSTYLED -!!samps diffuse normalmap +!!permu FULLBRIGHT +!!samps diffuse !!samps lightmap +!!samps =BUMP normalmap reflectcube !!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3 !!samps =DELUXE deluxemap !!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3 +!!samps =FULLBRIGHT fullbright !!permu FAKESHADOWS !!cvardf r_glsl_pcf +!!cvardf r_fullbright !!samps =FAKESHADOWS shadowmap !!cvardf r_skipDiffuse -!!cvardf r_skipLightmap +!!cvardf r_skipFullbright !!cvardf r_skipNormal +!!cvardf r_skipEnvmap +!!cvardf r_skipLightmap #include "sys/defs.h" +// basics varying vec2 tex_c; - varying vec2 lm0; -#ifdef LIGHTSTYLED + +// unfortunately we do support lightstyles +#if defined(LIGHTSTYLED) varying vec2 lm1, lm2, lm3; #endif +// useful for terrain blending +varying vec4 vex_color; + +// dynamic shadows #ifdef FAKESHADOWS - varying vec4 vtexprojcoord; +varying vec4 vtexprojcoord; +#endif + +#ifdef BUMP +varying vec3 eyevector; +varying mat3 invsurface; #endif #ifdef VERTEX_SHADER void lightmapped_init(void) { lm0 = v_lmcoord; - #ifdef LIGHTSTYLED + #if defined(LIGHTSTYLED) lm1 = v_lmcoord2; lm2 = v_lmcoord3; lm3 = v_lmcoord4; @@ -53,11 +74,22 @@ varying vec2 lm1, lm2, lm3; { lightmapped_init(); tex_c = v_texcoord; + vex_color = v_colour; gl_Position = ftetransform(); #ifdef FAKESHADOWS vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); #endif + + #ifdef BUMP + vec3 eyeminusvertex = e_eyepos - v_position.xyz; + eyevector.x = dot(eyeminusvertex, v_svector.xyz); + eyevector.y = dot(eyeminusvertex, v_tvector.xyz); + eyevector.z = dot(eyeminusvertex, v_normal.xyz); + invsurface[0] = v_svector; + invsurface[1] = v_tvector; + invsurface[2] = v_normal; + #endif } #endif @@ -65,8 +97,7 @@ varying vec2 lm1, lm2, lm3; #include "sys/fog.h" #include "sys/pcf.h" -#if r_skipLightmap==0 - #ifdef LIGHTSTYLED + #if defined(LIGHTSTYLED) #define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb #define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb #define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb @@ -74,22 +105,13 @@ varying vec2 lm1, lm2, lm3; #else #define LIGHTMAP texture2D(s_lightmap, lm0).rgb #endif -#else - #ifdef LIGHTSTYLED - #define LIGHTMAP0 vec3(0.5,0.5,0.5) - #define LIGHTMAP1 vec3(0.5,0.5,0.5) - #define LIGHTMAP2 vec3(0.5,0.5,0.5) - #define LIGHTMAP3 vec3(0.5,0.5,0.5) - #else - #define LIGHTMAP vec3(0.5,0.5,0.5) - #endif -#endif +#if r_skipLightmap == 0 vec3 lightmap_fragment() { vec3 lightmaps; -#ifdef LIGHTSTYLED +#if defined(LIGHTSTYLED) lightmaps = LIGHTMAP0 * e_lmscale[0].rgb; lightmaps += LIGHTMAP1 * e_lmscale[1].rgb; lightmaps += LIGHTMAP2 * e_lmscale[2].rgb; @@ -97,10 +119,9 @@ varying vec2 lm1, lm2, lm3; #else lightmaps = LIGHTMAP * e_lmscale.rgb; #endif - return lightmaps; + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; } -#if r_skipNormal==0 vec3 lightmap_fragment(vec3 normal_f) { #ifndef DELUXE @@ -117,32 +138,81 @@ varying vec2 lm1, lm2, lm3; lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); #endif - return lightmaps; + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; #endif } +#else + vec3 lightmap_fragment() + { + return vec3(1.0,1.0,1.0); + } + vec3 lightmap_fragment(vec3 normal_f) + { + return vec3(1.0,1.0,1.0); + } #endif void main (void) { vec4 diffuse_f; + float alpha; - #if r_skipDiffuse==0 - diffuse_f = texture2D(s_diffuse, tex_c); - #else - diffuse_f = vec4(1.0,1.0,1.0,1.0); - #endif + #if r_skipDiffuse == 0 + diffuse_f = texture2D(s_diffuse, tex_c); + #else + diffuse_f = vec4(1.0, 1.0, 1.0, 1.0); + #endif - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif +#ifdef MASK + // alpha-testing happens here + if (vex_color.a >= 0.99) + if (diffuse_f.a < MASK) + discard; +#endif - #if r_skipNormal==0 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - diffuse_f.rgb *= lightmap_fragment(normal_f); - #else - diffuse_f.rgb *= lightmap_fragment(); - #endif + #ifdef FAKESHADOWS + diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); + #endif - gl_FragColor = fog4(diffuse_f); + // the lighting stage for the world + #if defined(BUMP) + + // whether to respect our bump, or to act flat + #if r_skipNormal == 0 + vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); + diffuse_f.rgb *= lightmap_fragment(normal_f); + #else + vec3 normal_f = vec3(0.0, 0.0, 1.0); + diffuse_f.rgb *= lightmap_fragment(); + #endif + + // environment mapping happens here + #if r_skipEnvmap == 0 + vec3 cube_c; + vec3 env_f; + float refl = texture2D(s_normalmap, tex_c).a; + cube_c = reflect(normalize(-eyevector), normal_f.rgb); + cube_c = cube_c.x * invsurface[0] + + cube_c.y * invsurface[1] + + cube_c.z * invsurface[2]; + cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; + env_f = textureCube(s_reflectcube, cube_c).rgb * (e_lmscale.rgb * 0.25); + diffuse_f.rgb = mix(env_f, diffuse_f.rgb, refl); + #endif + #else + diffuse_f.rgb *= lightmap_fragment(); + #endif + + #if defined(FULLBRIGHT) && r_skipFullbright == 0 + diffuse_f.rgb += texture2D(s_fullbright, tex_c).rgb; + #endif + + // start blend at half-way point + alpha = vex_color.a * 1.5; + + if (alpha > 1.0) + alpha = 1.0; + + gl_FragColor = vec4(fog3(diffuse_f.rgb), alpha); } #endif diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped_reflect.glsl b/platform/base_glsl.pk3dir/glsl/lightmapped_reflect.glsl index e57aa60f..e2f6ec93 100644 --- a/platform/base_glsl.pk3dir/glsl/lightmapped_reflect.glsl +++ b/platform/base_glsl.pk3dir/glsl/lightmapped_reflect.glsl @@ -10,13 +10,15 @@ !!permu FOG !!permu BUMP !!permu DELUXE -!!samps diffuse lightmap deluxemap reflection +!!samps diffuse lightmap deluxemap normalmap +!!samps reflect=0 !!permu FAKESHADOWS !!cvardf r_glsl_pcf !!samps =FAKESHADOWS shadowmap -!!cvardf r_skipSpecular +!!cvardf r_skipDiffuse +!!cvardf r_skipNormal !!cvardf r_skipLightmap #include "sys/defs.h" @@ -128,14 +130,22 @@ varying vec2 lm1, lm2, lm3; void main (void) { vec2 stc; - vec4 diffuse_f = texture2D(s_diffuse, tex_c); + vec4 diffuse_f; + + #if r_skipDiffuse == 0 + diffuse_f = texture2D(s_diffuse, tex_c); + #else + diffuse_f = vec4(1.0, 1.0, 1.0, 1.0); + #endif #if r_skipNormal==1 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - #else #define normal_f vec3(0.0,0.0,0.5) + #else + vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); #endif + float refl = texture2D(s_normalmap, tex_c).a; + #if r_skipNormal==1 diffuse_f.rgb *= lightmap_fragment(); #else @@ -146,8 +156,7 @@ varying vec2 lm1, lm2, lm3; stc = (1.0 + (tf.xy / tf.w)) * 0.5; stc.t -= 1.5* invsurface[2].z / 1080.0; - diffuse_f.rgb = mix(texture2D(s_reflection, stc).rgb, diffuse_f.rgb, diffuse_f.a); - diffuse_f.a = 1.0; + diffuse_f.rgb = mix(texture2D(s_reflect, stc).rgb, diffuse_f.rgb, refl); #ifdef FAKESHADOWS diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped_reflectcube.glsl b/platform/base_glsl.pk3dir/glsl/lightmapped_reflectcube.glsl deleted file mode 100644 index c0f13b1b..00000000 --- a/platform/base_glsl.pk3dir/glsl/lightmapped_reflectcube.glsl +++ /dev/null @@ -1,175 +0,0 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightmapped surface that contains an environment cube as a reflection. -// Alpha channel of the diffuse decides reflectivity. -//============================================================================== - -!!ver 110 -!!permu FOG -!!permu BUMP -!!permu DELUXE -!!samps diffuse normalmap reflectcube lightmap deluxemap - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipDiffuse -!!cvardf r_skipNormal -!!cvardf r_skipSpecular -!!cvardf r_skipLightmap - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; -varying mat3 invsurface; - -varying vec2 lm0; -#ifdef LIGHTSTYLED -varying vec2 lm1, lm2, lm3; -#endif - -#ifdef FAKESHADOWS - varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - void lightmapped_init(void) - { - lm0 = v_lmcoord; - #ifdef LIGHTSTYLED - lm1 = v_lmcoord2; - lm2 = v_lmcoord3; - lm3 = v_lmcoord4; - #endif - } - - void main (void) - { - lightmapped_init(); - invsurface[0] = v_svector; - invsurface[1] = v_tvector; - invsurface[2] = v_normal; - - vec3 eyeminusvertex = e_eyepos - v_position.xyz; - eyevector.x = dot(eyeminusvertex, v_svector.xyz); - eyevector.y = dot(eyeminusvertex, v_tvector.xyz); - eyevector.z = dot(eyeminusvertex, v_normal.xyz); - - tex_c = v_texcoord; - gl_Position = ftetransform(); - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - -#if r_skipLightmap==0 - #ifdef LIGHTSTYLED - #define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb - #define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb - #define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb - #define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb - #else - #define LIGHTMAP texture2D(s_lightmap, lm0).rgb - #endif -#else - #ifdef LIGHTSTYLED - #define LIGHTMAP0 vec3(0.5,0.5,0.5) - #define LIGHTMAP1 vec3(0.5,0.5,0.5) - #define LIGHTMAP2 vec3(0.5,0.5,0.5) - #define LIGHTMAP3 vec3(0.5,0.5,0.5) - #else - #define LIGHTMAP vec3(0.5,0.5,0.5) - #endif -#endif - - vec3 lightmap_fragment() - { - vec3 lightmaps; - -#ifdef LIGHTSTYLED - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb; - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb; - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb; - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb; -#else - lightmaps = LIGHTMAP * e_lmscale.rgb; -#endif - return lightmaps; - } - -#if r_skipNormal==0 - vec3 lightmap_fragment(vec3 normal_f) - { -#ifndef DELUXE - return lightmap_fragment(); -#else - vec3 lightmaps; - - #if defined(LIGHTSTYLED) - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); - #else - lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); - #endif - - return lightmaps; -#endif - } -#endif - - void main (void) - { - vec3 cube_c; - vec3 env_f; - - #if r_skipDiffuse==0 - vec4 diffuse_f = texture2D(s_diffuse, tex_c); - #else - vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0); - #endif - - #if r_skipNormal==0 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - #define refl diffuse_f.a - #else - #define normal_f vec3(0.0,0.0,1.0) - #define refl (diffuse_f.a / 2.0) + 0.5 - #endif - - #if r_skipNormal==1 - diffuse_f.rgb *= lightmap_fragment(); - #else - diffuse_f.rgb *= lightmap_fragment(normal_f); - #endif - - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - #if r_skipSpecular==0 - vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0); - cube_c = reflect(normalize(-eyevector), normal_f.rgb); - cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; - cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; - env_f = textureCube(s_reflectcube, cube_c).rgb * (e_lmscale.rgb * 0.25); - out_f.rgb = mix(env_f, diffuse_f.rgb, refl); - - // Add fog to the final fragment - gl_FragColor = fog4(out_f); - #else - gl_FragColor = fog4(diffuse_f);; - #endif - } -#endif diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped_speclazy.glsl b/platform/base_glsl.pk3dir/glsl/lightmapped_speclazy.glsl deleted file mode 100644 index c1a44b16..00000000 --- a/platform/base_glsl.pk3dir/glsl/lightmapped_speclazy.glsl +++ /dev/null @@ -1,167 +0,0 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightmapped surface with specular highlighting. It'll assume a base value -// for specularity... this is if you want to save VRAM but really want a glow. -//============================================================================== - -!!ver 110 -!!permu FOG -!!permu BUMP -!!permu DELUXE -!!samps diffuse normalmap lightmap deluxemap - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipNormal -!!cvardf r_skipSpecular -!!cvardf r_skipLightmap - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; - -varying vec2 lm0; -#ifdef LIGHTSTYLED -varying vec2 lm1, lm2, lm3; -#endif - -#ifdef FAKESHADOWS - varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - void lightmapped_init(void) - { - lm0 = v_lmcoord; - #ifdef LIGHTSTYLED - lm1 = v_lmcoord2; - lm2 = v_lmcoord3; - lm3 = v_lmcoord4; - #endif - } - - void main () - { - lightmapped_init(); - tex_c = v_texcoord; - - vec3 eyeminusvertex = e_eyepos - v_position.xyz; - eyevector.x = dot(eyeminusvertex, v_svector.xyz); - eyevector.y = dot(eyeminusvertex, v_tvector.xyz); - eyevector.z = dot(eyeminusvertex, v_normal.xyz); - - gl_Position = ftetransform(); - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - -#if r_skipLightmap==0 - #ifdef LIGHTSTYLED - #define LIGHTMAP0 texture2D(s_lightmap0, lm0).rgb - #define LIGHTMAP1 texture2D(s_lightmap1, lm1).rgb - #define LIGHTMAP2 texture2D(s_lightmap2, lm2).rgb - #define LIGHTMAP3 texture2D(s_lightmap3, lm3).rgb - #else - #define LIGHTMAP texture2D(s_lightmap, lm0).rgb - #endif -#else - #ifdef LIGHTSTYLED - #define LIGHTMAP0 vec3(0.5,0.5,0.5) - #define LIGHTMAP1 vec3(0.5,0.5,0.5) - #define LIGHTMAP2 vec3(0.5,0.5,0.5) - #define LIGHTMAP3 vec3(0.5,0.5,0.5) - #else - #define LIGHTMAP vec3(0.5,0.5,0.5) - #endif -#endif - - vec3 lightmap_fragment() - { - vec3 lightmaps; - -#ifdef LIGHTSTYLED - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb; - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb; - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb; - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb; -#else - lightmaps = LIGHTMAP * e_lmscale.rgb; -#endif - return lightmaps; - } - -#if r_skipNormal==0 - vec3 lightmap_fragment(vec3 normal_f) - { -#ifndef DELUXE - return lightmap_fragment(); -#else - vec3 lightmaps; - - #if defined(LIGHTSTYLED) - lightmaps = LIGHTMAP0 * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP1 * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP2 * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); - lightmaps += LIGHTMAP3 * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); - #else - lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); - #endif - - return lightmaps; -#endif - } -#endif - - void main (void) - { - float gloss = texture2D(s_normalmap, tex_c).a * 0.1; - float spec; - - #if r_skipDiffuse==0 - vec4 diffuse_f = texture2D(s_diffuse, tex_c); - #else - #define diffuse_f vec4(1.0, 1.0, 1.0, 1.0) - #endif - - #if r_skipNormal==0 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - #else - #define normal_f vec3(0.0,0.0,0.5) - #endif - - if (diffuse_f.a < 0.5) { - discard; - } - - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - #if r_skipNormal==1 - diffuse_f.rgb *= lightmap_fragment(); - #else - diffuse_f.rgb *= lightmap_fragment(normal_f); - #endif - - #if r_skipSpecular==0 - vec3 halfdir = normalize(normalize(eyevector) - e_light_dir); - spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT); - spec *= 0.05; - diffuse_f.rgb += spec; - #endif - - gl_FragColor = fog4(diffuse_f); - } -#endif diff --git a/platform/base_glsl.pk3dir/glsl/rtlight.glsl b/platform/base_glsl.pk3dir/glsl/rtlight.glsl index dfa17e71..c48f78d2 100644 --- a/platform/base_glsl.pk3dir/glsl/rtlight.glsl +++ b/platform/base_glsl.pk3dir/glsl/rtlight.glsl @@ -5,6 +5,9 @@ // Code for all the dynamic light passes. The renderer is not aware of any // surface properties beyond diffuse, normal and specularity. // Alpha-masked surfaces suffer greatly because of this. +// +// diffusemap = albedo (rgba) +// normalmap = normal (rgb), reflectmask (a) //============================================================================== !!ver 100 300 @@ -12,16 +15,13 @@ !!permu FRAMEBLEND !!permu SKELETAL !!permu FOG -!!permu REFLECTCUBEMASK !!cvardf r_glsl_pcf -!!samps diffuse normalmap specular reflectcube reflectmask +!!samps diffuse +!!samps =BUMP normalmap reflectcube !!samps =PCF shadowmap !!samps =CUBE projectionmap -!!cvardf r_skipDiffuse -!!cvardf r_skipNormal - #include "sys/defs.h" //if there's no vertex normals known, disable some stuff. @@ -40,11 +40,8 @@ varying vec3 lightvector; varying vec4 vc; #endif -#if defined(SPECULAR) || defined(REFLECTCUBEMASK) +#ifdef BUMP varying vec3 eyevector; -#endif - -#ifdef REFLECTCUBEMASK varying mat3 invsurface; #endif @@ -84,14 +81,11 @@ varying vec3 lightvector; vc = v_colour; #endif - #if defined(SPECULAR) || defined(REFLECTCUBEMASK) + #ifdef BUMP vec3 eyeminusvertex = e_eyepos - w.xyz; eyevector.x = dot(eyeminusvertex, s.xyz); eyevector.y = dot(eyeminusvertex, t.xyz); eyevector.z = dot(eyeminusvertex, n.xyz); - #endif - - #ifdef REFLECTCUBEMASK invsurface = mat3(v_svector, v_tvector, v_normal); #endif @@ -131,27 +125,12 @@ varying vec3 lightvector; #if defined(FLAT) vec4 bases = vec4(FLAT, FLAT, FLAT, 1.0); #else - #if r_skipDiffuse==0 - vec4 bases = texture2D(s_diffuse, tex_c); - #else - vec4 bases = vec4(0.5, 0.5, 0.5, 1.0); - #endif + vec4 bases = texture2D(s_diffuse, tex_c); #endif - #if defined(BUMP) || defined(SPECULAR) || defined(REFLECTCUBEMASK) - #if r_skipNormal==0 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; - #else - #define normal_f vec3(0.0,0.0,1.0) - #endif - #elif defined(REFLECTCUBEMASK) - #define normal_f vec3(0.0,0.0,1.0) - #endif - - #ifdef SPECULAR - vec4 specs = texture2D(s_specular, tex_c); - #define gloss specs.a - #define specrgb specs.rgb + #ifdef BUMP + vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; + float refl = 1.0 - texture2D(s_normalmap, tex_c).a; #endif #ifdef NOBUMP @@ -167,19 +146,12 @@ varying vec3 lightvector; #endif #endif - /* take existing specular map into account to appoint a new glossy light */ - #ifdef SPECULAR - vec3 halfdir = normalize(normalize(eyevector) + nl); - float spec = pow(max(dot(halfdir, normal_f), 0.0), gloss); - diff += l_lightcolourscale.z * spec * specrgb; - #endif - /* respect the reflectcube surface */ - #ifdef REFLECTCUBEMASK + #ifdef BUMP vec3 rtc = reflect(-eyevector, normal_f); rtc = rtc.x * invsurface[0] + rtc.y * invsurface[1] + rtc.z * invsurface[2]; rtc = (m_model * vec4(rtc.xyz,0.0)).xyz; - diff += texture2D(s_reflectmask, tex_c).rgb * textureCube(s_reflectcube, rtc).rgb; + diff += textureCube(s_reflectcube, rtc).rgb * refl; #endif /* filter the colour by the cubemap projection */ @@ -187,13 +159,11 @@ varying vec3 lightvector; diff *= textureCube(s_projectionmap, vtexprojcoord.xyz).rgb; #endif - if (bases.a < 0.5) - discard; - - if (vc.a < 0.5) - discard; + diff.rgb *= bases.a; diff *= colorscale * l_lightcolour; - gl_FragColor = vec4(fog3additive(diff), 1.0); + diff.rgb *= vc.a; + + gl_FragColor = vec4(fog3additive(diff), vc.a); } #endif diff --git a/platform/base_glsl.pk3dir/glsl/lightmapped_alphatest.glsl b/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl similarity index 71% rename from platform/base_glsl.pk3dir/glsl/lightmapped_alphatest.glsl rename to platform/base_glsl.pk3dir/glsl/terrain_mask.glsl index d4cd5fe7..81cbdba0 100644 --- a/platform/base_glsl.pk3dir/glsl/lightmapped_alphatest.glsl +++ b/platform/base_glsl.pk3dir/glsl/terrain_mask.glsl @@ -2,26 +2,33 @@ // // Purpose: // -// Lightmapped surface of which the alpha channel decides the masking. +// Blending terrain and masking its edges for a smooth transition into alpha. //============================================================================== !!ver 110 !!permu FOG !!permu BUMP !!permu DELUXE -!!samps diffuse normalmap lightmap deluxemap +!!samps diffuse normalmap + +!!samps lightmap +!!samps =LIGHTSTYLED lightmap1 lightmap2 lightmap3 +!!samps =DELUXE deluxemap +!!samps =LIGHTSTYLED =DELUXE deluxemap1 deluxemap2 deluxemap3 !!permu FAKESHADOWS !!cvardf r_glsl_pcf +!!cvardf r_fullbright !!samps =FAKESHADOWS shadowmap !!cvardf r_skipDiffuse -!!cvardf r_skipNormal !!cvardf r_skipLightmap +!!cvardf r_skipNormal #include "sys/defs.h" varying vec2 tex_c; +varying vec4 vex_color; varying vec2 lm0; #ifdef LIGHTSTYLED @@ -43,10 +50,12 @@ varying vec2 lm1, lm2, lm3; #endif } - void main () + void main ( void ) { lightmapped_init(); tex_c = v_texcoord; + vex_color = v_colour; + gl_Position = ftetransform(); #ifdef FAKESHADOWS @@ -91,7 +100,7 @@ varying vec2 lm1, lm2, lm3; #else lightmaps = LIGHTMAP * e_lmscale.rgb; #endif - return lightmaps; + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; } #if r_skipNormal==0 @@ -111,39 +120,47 @@ varying vec2 lm1, lm2, lm3; lightmaps = LIGHTMAP * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); #endif - return lightmaps; + return (r_fullbright == 1) ? vec3(1.0, 1.0, 1.0) : lightmaps; #endif } #endif - void main (void) + void main ( void ) { #if r_skipDiffuse==0 - vec4 diffuse_f = texture2D(s_diffuse, tex_c); + vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb; #else - vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0); + vec3 diffuse_f = vec3(1.0,1.0,1.0); #endif - #if r_skipNormal==1 - vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); - #else - #define normal_f vec3(0.0,0.0,1.0) + float bw = 1.0 - (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0; + vec4 vcol = vex_color; + + #if r_skipNormal==0 + vec3 normal_f; + normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); #endif - if (diffuse_f.a < 0.5) { - discard; + if (vcol.a < 1.0) { + // contrast enhancement + #ifdef BWMASK + bw *= ((bw * 2.0) * BWMASK); + #endif + if (bw > vcol.a) { + discard; + } } - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - #if r_skipNormal==1 - diffuse_f.rgb *= lightmap_fragment(); - #else + #if r_skipNormal==0 diffuse_f.rgb *= lightmap_fragment(normal_f); + #else + diffuse_f.rgb *= lightmap_fragment(); #endif - gl_FragColor = fog4(diffuse_f); + #ifdef FAKESHADOWS + diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord); + #endif + + gl_FragColor = vec4(fog3(diffuse_f), 1.0); } #endif diff --git a/platform/base_glsl.pk3dir/glsl/vertexlit.glsl b/platform/base_glsl.pk3dir/glsl/vertexlit.glsl index 7cab8d4d..973aeb58 100644 --- a/platform/base_glsl.pk3dir/glsl/vertexlit.glsl +++ b/platform/base_glsl.pk3dir/glsl/vertexlit.glsl @@ -2,27 +2,42 @@ // // Purpose: // -// Basic lightgrid-lit surface. Also supports a fullbrightmap. +// Lightgrid-lit surface, normalmap's alpha contains environment cube reflec- +// tivity. //============================================================================== !!ver 110 !!permu FRAMEBLEND -!!permu BUMP +!!permu FULLBRIGHT !!permu FOG +!!permu BUMP !!permu SKELETAL -!!samps diffuse fullbright normalmap +!!samps diffuse +!!samps =BUMP normalmap reflectcube +!!samps =FULLBRIGHT fullbright + +!!cvardf r_skipDiffuse +!!cvardf r_skipFullbright +!!cvardf r_skipNormal +!!cvardf r_skipEnvmap +!!cvardf r_skipLightmap !!permu FAKESHADOWS !!cvardf r_glsl_pcf +!!cvardf r_fullbright +!!cvardf r_lambertscale !!samps =FAKESHADOWS shadowmap -!!cvardf r_skipDiffuse - #include "sys/defs.h" varying vec2 tex_c; varying vec3 norm; +#ifdef BUMP +varying vec3 eyevector; +varying mat3 invsurface; +#endif + #ifdef FAKESHADOWS varying vec4 vtexprojcoord; #endif @@ -30,56 +45,103 @@ varying vec3 norm; #ifdef VERTEX_SHADER #include "sys/skeletal.h" - void main (void) + void main () { vec3 n, s, t, w; - tex_c = v_texcoord; gl_Position = skeletaltransform_wnst(w,n,s,t); norm = n; - + n = normalize(n); + s = normalize(s); + t = normalize(t); + tex_c = v_texcoord; + + #ifdef BUMP + /* normalmap */ + invsurface = mat3(s, t, n); + + /* reflect */ + vec3 eyeminusvertex = e_eyepos - w.xyz; + eyevector.x = dot(eyeminusvertex, s.xyz); + eyevector.y = dot(eyeminusvertex, t.xyz); + eyevector.z = dot(eyeminusvertex, n.xyz); + #endif + #ifdef FAKESHADOWS vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); #endif } #endif - #ifdef FRAGMENT_SHADER #include "sys/fog.h" #include "sys/pcf.h" +#ifdef HALFLAMBERT + float lambert(vec3 normal, vec3 dir) + { + return (lambert(normal, dir) * 0.5) + 0.5; + } +#else float lambert(vec3 normal, vec3 dir) { return max(dot(normal, dir), 0.0); } - - float halflambert(vec3 normal, vec3 dir) - { - return (lambert(normal, dir) * 0.5) + 0.5; - } +#endif void main (void) { - vec4 diff_f = texture2D(s_diffuse, tex_c); - vec4 fb_f = texture2D(s_fullbright, tex_c); + vec4 diff_f; vec3 light; - if (diff_f.a < 0.5) { + #if r_skipDiffuse == 0 + diff_f = texture2D(s_diffuse, tex_c); + #else + diff_f = vec4(1.0, 1.0, 1.0, 1.0); + #endif + + // bump goes here + #if defined(BUMP) + #if r_skipNormal==0 + vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; + #else + vec3 normal_f = vec3(0.0, 0.0, 1.0); + #endif + #endif + + #ifdef MASK + if (diff_f.a < MASK) { discard; } + #endif - #ifdef HALFLAMBERT - light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); - #else - light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); - #endif - - diff_f.rgb *= light; - diff_f.rgb += fb_f.rgb; + #if defined(BUMP) + /* directional light */ + light = (e_light_mul * lambert(normal_f, e_light_dir)) * 2.0f; + /* reverse ambient */ + light += (e_light_ambient * lambert(normal_f, reflect(normal_f, e_light_dir))) * 0.5f; + #else + light = (e_light_mul * lambert(norm, e_light_dir)) * 2.0f; + light += (e_light_ambient * lambert(norm, reflect(norm, e_light_dir))) * 0.5f; + light *= 2.0f; + #endif #ifdef FAKESHADOWS diff_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); #endif + diff_f.rgb *= light; + + #if defined(BUMP) && r_skipEnvmap==0 + vec3 cube_c; + float refl = 1.0 - texture2D(s_normalmap, tex_c).a; + cube_c = reflect(normalize(eyevector), normal_f.rgb); + cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; + cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; + diff_f.rgb += textureCube(s_reflectcube, cube_c).rgb * refl; + #endif + + #if defined(FULLBRIGHT) && r_skipFullbright==0 + diff_f.rgb += texture2D(s_fullbright, tex_c).rgb; + #endif gl_FragColor = fog4(diff_f * e_colourident) * e_lmscale; } diff --git a/platform/base_glsl.pk3dir/glsl/vertexlit_reflectcube.glsl b/platform/base_glsl.pk3dir/glsl/vertexlit_reflectcube.glsl deleted file mode 100644 index d1bbfa17..00000000 --- a/platform/base_glsl.pk3dir/glsl/vertexlit_reflectcube.glsl +++ /dev/null @@ -1,116 +0,0 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightgrid-lit surface, normalmap's alpha contains environment cube reflec- -// tivity. -//============================================================================== - -!!ver 110 -!!permu FRAMEBLEND -!!permu FOG -!!permu SKELETAL -!!samps diffuse reflectcube normalmap - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipSpecular -!!cvardf r_skipNormal - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; -varying vec3 norm; -varying mat3 invsurface; - -#ifdef FAKESHADOWS - varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - #include "sys/skeletal.h" - - void main () - { - vec3 n, s, t, w; - gl_Position = skeletaltransform_wnst(w,n,s,t); - norm = n; - n = normalize(n); - s = normalize(s); - t = normalize(t); - tex_c = v_texcoord; - - /* normalmap */ - invsurface = mat3(s, t, n); - - /* reflect */ - vec3 eyeminusvertex = e_eyepos - w.xyz; - eyevector.x = dot(eyeminusvertex, s.xyz); - eyevector.y = dot(eyeminusvertex, t.xyz); - eyevector.z = dot(eyeminusvertex, n.xyz); - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - - float lambert(vec3 normal, vec3 dir) - { - return max(dot(normal, dir), 0.0); - } - - float halflambert(vec3 normal, vec3 dir) - { - return (lambert(normal, dir) * 0.5) + 0.5; - } - - void main (void) - { - vec3 cube_c; - vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0); - vec4 diff_f = texture2D(s_diffuse, tex_c); - vec3 light; - - #if r_skipNormal==0 - vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; - float refl = texture2D(s_normalmap, tex_c).a; - #else - #define normal_f vec3(0.0,0.0,1.0) - float refl = texture2D(s_normalmap, tex_c).a; - #endif - - if (diff_f.a < 0.5) { - discard; - } - - #ifdef HALFLAMBERT - light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); - #else - light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); - #endif - - #if r_skipSpecular==0 - cube_c = reflect(normalize(eyevector), normal_f.rgb); - cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; - cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; - diff_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, diff_f.a); - #endif - - diff_f.rgb *= light; - out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, refl); - - #ifdef FAKESHADOWS - out_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - gl_FragColor = fog4(out_f * e_colourident) * e_lmscale; - } -#endif diff --git a/platform/base_glsl.pk3dir/glsl/vertexlit_specular.glsl b/platform/base_glsl.pk3dir/glsl/vertexlit_specular.glsl index 38c2cf48..c3d6da68 100644 --- a/platform/base_glsl.pk3dir/glsl/vertexlit_specular.glsl +++ b/platform/base_glsl.pk3dir/glsl/vertexlit_specular.glsl @@ -89,15 +89,17 @@ varying mat3 invsurface; #include "sys/fog.h" #include "sys/pcf.h" +#ifdef HALFLAMBERT + float lambert(vec3 normal, vec3 dir) + { + return (lambert(normal, dir) * 0.5) + 0.5; + } +#else float lambert(vec3 normal, vec3 dir) { return max(dot(normal, dir), 0.0); } - - float halflambert(vec3 normal, vec3 dir) - { - return (lambert(normal, dir) * 0.5) + 0.5; - } +#endif void main () { @@ -122,11 +124,9 @@ varying mat3 invsurface; discard; } - #ifdef HALFLAMBERT - light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); - #else - light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); - #endif + light += (e_light_mul * lambert(norm, e_light_dir)) * 2.0f; /* directional light */ + light += (e_light_ambient * lambert(norm, reflect(norm, e_light_dir))) * 0.5f; /* reverse ambient */ + light *= 2.0f; #if r_skipSpecular==0 vec3 halfdir = normalize(normalize(eyevector) + e_light_dir); diff --git a/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube.glsl b/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube.glsl deleted file mode 100644 index 8911054f..00000000 --- a/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube.glsl +++ /dev/null @@ -1,115 +0,0 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightgrid-lit surface that contains environment cube reflectivity in the -// diffusemaps' alpha channel and specularity in the normalmaps' alpha channel. -//============================================================================== - -!!ver 110 -!!permu FRAMEBLEND -!!permu FOG -!!permu SKELETAL -!!cvarf gl_specular -!!samps diffuse normalmap reflectcube - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipNormal -!!cvardf r_skipSpecular - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; -varying vec3 norm; -varying mat3 invsurface; - -#ifdef FAKESHADOWS - varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - #include "sys/skeletal.h" - void main () - { - vec3 n, s, t, w; - gl_Position = skeletaltransform_wnst(w,n,s,t); - norm = n; - n = normalize(n); - s = normalize(s); - t = normalize(t); - tex_c = v_texcoord; - - /* normalmap */ - invsurface = mat3(s, t, n); - - /* reflect */ - eyevector = e_eyepos - w.xyz; - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - - float lambert(vec3 normal, vec3 dir) - { - return max(dot(normal, dir), 0.0); - } - - float halflambert(vec3 normal, vec3 dir) - { - return (lambert(normal, dir) * 0.5) + 0.5; - } - - void main () - { - vec3 cube_c; - vec4 diffuse_f = texture2D( s_diffuse, tex_c ); - - vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0); - vec3 light; - - #if r_skipNormal==0 - vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; - float gloss = texture2D(s_normalmap, tex_c).a; - #else - #define normal_f vec3(0.0,0.0,1.0) - float gloss = texture2D(s_normalmap, tex_c).a; - #endif - - #ifdef HALFLAMBERT - light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); - #else - light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); - #endif - - #if r_skipSpecular==0 - vec3 halfdir = normalize(normalize(eyevector) + e_light_dir); - vec3 bumps = normalize(invsurface * (normal_f)); - float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT); - spec *= 5.0 * (1.0 - gloss); - diffuse_f.rgb += spec * diffuse_f.a; - #endif - - /* reflectcube */ - cube_c = reflect(normalize(-eyevector), normal_f.rgb); - cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; - cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; - diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, diffuse_f.a); - diffuse_f.rgb *= light; - - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - gl_FragColor = fog4( diffuse_f * e_colourident ) * e_lmscale; - } -#endif diff --git a/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube_alt.glsl b/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube_alt.glsl deleted file mode 100644 index 2edd3dca..00000000 --- a/platform/base_glsl.pk3dir/glsl/vertexlit_specularcube_alt.glsl +++ /dev/null @@ -1,109 +0,0 @@ -//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. ======= -// -// Purpose: -// -// Lightgrid-lit surface, normalmap alpha contains specularity & reflectivity. -//============================================================================== - -!!ver 110 -!!permu FRAMEBLEND -!!permu FOG -!!permu SKELETAL -!!cvarf gl_specular -!!samps diffuse normalmap reflectcube - -!!permu FAKESHADOWS -!!cvardf r_glsl_pcf -!!samps =FAKESHADOWS shadowmap - -!!cvardf r_skipDiffuse -!!cvardf r_skipNormal -!!cvardf r_skipSpecular - -#include "sys/defs.h" - -varying vec2 tex_c; -varying vec3 eyevector; -varying vec3 norm; -varying mat3 invsurface; - -#ifdef FAKESHADOWS - varying vec4 vtexprojcoord; -#endif - -#ifdef VERTEX_SHADER - #include "sys/skeletal.h" - void main () - { - vec3 n, s, t, w; - gl_Position = skeletaltransform_wnst(w,n,s,t); - norm = n; - n = normalize(n); - s = normalize(s); - t = normalize(t); - tex_c = v_texcoord; - - /* normalmap */ - invsurface = mat3(s, t, n); - - /* reflect */ - eyevector = e_eyepos - w.xyz; - - #ifdef FAKESHADOWS - vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0)); - #endif - } -#endif - -#ifdef FRAGMENT_SHADER - #include "sys/fog.h" - #include "sys/pcf.h" - - float lambert(vec3 normal, vec3 dir) - { - return max(dot(normal, dir), 0.0); - } - - float halflambert(vec3 normal, vec3 dir) - { - return (lambert(normal, dir) * 0.5) + 0.5; - } - - void main () - { - vec3 cube_c; - vec4 diffuse_f = texture2D( s_diffuse, tex_c ); - vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0; - float gloss = texture2D( s_normalmap, tex_c ).a; - vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0); - vec3 light; - - #ifdef HALFLAMBERT - light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); - #else - light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); - #endif - - #if r_skipSpecular==0 - // gloss pass - vec3 halfdir = normalize(normalize(eyevector) + e_light_dir); - vec3 bumps = normalize(invsurface * (normal_f)); - float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT); - spec *= 5.0 * (1.0 - gloss); - diffuse_f.rgb += spec; - // envmap pass - cube_c = reflect(normalize(-eyevector), normal_f.rgb * 0.5); - cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; - cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; - diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss); - #endif - - diffuse_f.rgb *= light; - - #ifdef FAKESHADOWS - diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); - #endif - - gl_FragColor = fog4( diffuse_f * e_colourident ) * e_lmscale; - } -#endif diff --git a/platform/base_textures.pk3dir/textures/sfx/mirror.mat b/platform/base_textures.pk3dir/textures/sfx/mirror.mat index 4e323c04..54941ffa 100644 --- a/platform/base_textures.pk3dir/textures/sfx/mirror.mat +++ b/platform/base_textures.pk3dir/textures/sfx/mirror.mat @@ -1,13 +1,11 @@ // Vera Visions Material { - surfaceparm metal - - diffusemap textures/sfx/alpha.tga + polygonOffset 1 + diffusemap "textures/sfx/mirror.tga" + normalmap "textures/sfx/mirror_n.tga" { - program lightmapped_reflectcube - map $diffuse - map $normalmap - map $reflectcube + program lightmapped_reflect + map $reflection } } diff --git a/platform/base_textures.pk3dir/textures/sfx/mirror_n.tga b/platform/base_textures.pk3dir/textures/sfx/mirror_n.tga new file mode 100644 index 0000000000000000000000000000000000000000..e8ef75a4001187aac1172e99efb5e552aef36b5b GIT binary patch literal 364 wcmZQz;9`IQ2L=ZQ1&;my>+2at39`cg7MdYJp{`+`!Jhtpx)E-kKCXHU04*%Eo&W#< literal 0 HcmV?d00001 diff --git a/platform/base_textures.pk3dir/textures/sfx/reflection.mat b/platform/base_textures.pk3dir/textures/sfx/reflection.mat index 471399da..8e5e464a 100644 --- a/platform/base_textures.pk3dir/textures/sfx/reflection.mat +++ b/platform/base_textures.pk3dir/textures/sfx/reflection.mat @@ -1,12 +1,7 @@ // Vera Visions Material { + program lightmapped polygonOffset 1 diffusemap "textures/sfx/alpha.tga" - - { - program lightmapped_reflectcube - map $diffuse - map $normalmap - map $reflectcube - } + normalmap "textures/sfx/mirror_n.tga" } diff --git a/platform/test_maps.pk3dir/textures/decals/puddle01.mat b/platform/test_maps.pk3dir/textures/decals/puddle01.mat index 78e38849..bd2812c8 100644 --- a/platform/test_maps.pk3dir/textures/decals/puddle01.mat +++ b/platform/test_maps.pk3dir/textures/decals/puddle01.mat @@ -4,6 +4,8 @@ surfaceParm nonsolid surfaceParm trans surfaceParm nodlight + surfaceParm noshadows + diffusemap textures/decals/puddle01.tga normalmap textures/liquid/water1_n.tga diff --git a/platform/test_maps.pk3dir/textures/measure/ladder.mat b/platform/test_maps.pk3dir/textures/measure/ladder.mat index fe6dc329..ad0e66eb 100644 --- a/platform/test_maps.pk3dir/textures/measure/ladder.mat +++ b/platform/test_maps.pk3dir/textures/measure/ladder.mat @@ -4,16 +4,16 @@ surfaceparm trans if $programs - program lightmapped_alphatest + program lightmapped diffusemap "textures/measure/ladder.tga" else - { - map "textures/measure/ladder.tga" - alphaFunc GE128 + { + map "textures/measure/ladder.tga" + alphaFunc GE128 depthWrite rgbGen identity - } - { + } + { map $lightmap rgbGen identity blendFunc filter diff --git a/platform/test_maps.pk3dir/textures/measure/rail.mat b/platform/test_maps.pk3dir/textures/measure/rail.mat index af832e22..effd6404 100644 --- a/platform/test_maps.pk3dir/textures/measure/rail.mat +++ b/platform/test_maps.pk3dir/textures/measure/rail.mat @@ -1,5 +1,5 @@ // Vera Visions Material { - program lightmapped_alphatest + program lightmapped diffusemap textures/measure/rail.tga } diff --git a/src/client/efx.qc b/src/client/efx.qc index 83a63dc4..e325e4ee 100644 --- a/src/client/efx.qc +++ b/src/client/efx.qc @@ -331,10 +331,12 @@ EFX_Init(void) int efx_default; int efx_underwater; + print("--------- Initializing EFXDefs ----------\n"); + #ifndef EFXDATA_DYNAMIC g_efx = (reverbinfo_t *)memalloc(sizeof(reverbinfo_t) * EFXDATA_MAX); g_efx_name = (string *)memalloc(sizeof(string) * EFXDATA_MAX); - print(sprintf("EFX_Init: Allocated %d bytes\n", (sizeof(string) * EFXDATA_MAX) + (sizeof(reverbinfo_t) * EFXDATA_MAX))); + print(sprintf("allocated %d bytes for EFXDefs.\n", (sizeof(string) * EFXDATA_MAX) + (sizeof(reverbinfo_t) * EFXDATA_MAX))); #endif efx_default = EFX_Load("default"); diff --git a/src/client/entry.qc b/src/client/entry.qc index 51bc8cca..be66ce22 100644 --- a/src/client/entry.qc +++ b/src/client/entry.qc @@ -14,6 +14,15 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* +================= +CSQC_UpdateSeat + +Updates our seat pointers, call this when you need to verify we're +getting the current player's info and not someone elses on the same +machine (splitscreen) +================= +*/ void CSQC_UpdateSeat(void) { @@ -22,11 +31,18 @@ CSQC_UpdateSeat(void) pSeatLocal = &g_seatslocal[s]; } -/* This file houses all of the callbacks and entry points the engine - calls by itself */ +/* +================= +CSQC_Init + +First thing inited in the progs. Before any world is initialized. +================= +*/ void CSQC_Init(float apilevel, string enginename, float engineversion) { + print("--------- Initializing Client Game ----------\n"); + pSeat = &g_seats[0]; pSeatLocal = &g_seatslocal[0]; @@ -113,12 +129,23 @@ CSQC_Init(float apilevel, string enginename, float engineversion) cvar_set("_menu_singleplayer", "1"); else cvar_set("_menu_singleplayer", "0"); + + /* end msg */ + print("Client game initialized.\n"); } -/* Rendering Caches */ +/* +================= +CSQC_RendererRestarted + +Called by vid_reload callbacks +================= +*/ void CSQC_RendererRestarted(string rstr) { + print("--------- Reloading Graphical Resources ----------\n"); + /* Fonts */ Font_Load("fonts/font16.font", FONT_16); Font_Load("fonts/font20.font", FONT_20); @@ -146,6 +173,9 @@ CSQC_RendererRestarted(string rstr) Sky_Update(TRUE); Entities_RendererRestarted(); DetailTex_Init(); + + /* end msg */ + print("Graphical resources reloaded.\n"); } /* this is so that profile_csqc reports more accurate statistics as to @@ -156,6 +186,13 @@ CSQC_RenderScene(void) renderscene(); } +/* +================= +CSQC_UpdateView + +Run every single frame we're connected to a session. +================= +*/ void CSQC_UpdateView(float w, float h, float focus) { @@ -211,19 +248,22 @@ CSQC_UpdateView(float w, float h, float focus) pSeat = &g_seats[s]; pSeatLocal = &g_seatslocal[s]; + /* set up our single/split viewport */ View_CalcViewport(s, w, h); setproperty(VF_ACTIVESEAT, (float)s); - setproperty(VF_MIN, video_mins); setproperty(VF_SIZE, video_res); pSeat->m_ePlayer = self = findfloat(world, entnum, player_localentnum); pl = (player)self; + /* player slot not present */ if (!self) { continue; } + /* this needs to be moved into a base_client method */ +#if 1 if (self.classname == "player") { Predict_PlayerPreFrame(pl); @@ -274,9 +314,12 @@ CSQC_UpdateView(float w, float h, float focus) pSeat->m_vecPredictedVelocity = spec.velocity; pSeat->m_flPredictedFlags = spec.flags; } +#endif addentities(MASK_ENGINE); + /* ideally move this into a base_player method */ +#if 1 if (pSeat->m_flCameraTime > time || pSeat->m_flCameraTime == -1) { view_angles = pSeat->m_vecCameraAngle; setproperty(VF_ORIGIN, pSeat->m_vecCameraOrigin); @@ -346,6 +389,7 @@ CSQC_UpdateView(float w, float h, float focus) setproperty(VF_CL_VIEWANGLES, view_angles); } } +#endif setproperty(VF_DRAWWORLD, 1); SkyCamera_Setup(getproperty(VF_ORIGIN)); @@ -365,6 +409,7 @@ CSQC_UpdateView(float w, float h, float focus) View_DrawViewModel(); } + /* this is running whenever we're doing 'buildcubemaps' */ if (g_iCubeProcess == TRUE) { setproperty(VF_ORIGIN, g_vecCubePos); setproperty(VF_SIZE_X, g_dCubeSize); @@ -373,9 +418,11 @@ CSQC_UpdateView(float w, float h, float focus) setproperty(VF_AFOV, 90); } + /* render the scene, then put monitor RenderTargets on top */ CSQC_RenderScene(); RenderTarget_Monitor_Update(); + /* all 2D operations happen after this point */ for (entity b = world; (b = findfloat(b, ::isCSQC, 1));) { NSEntity pf = (NSEntity) b; pf.postdraw(); @@ -409,18 +456,24 @@ CSQC_UpdateView(float w, float h, float focus) } } + /* move this into base_client methods */ +#if 1 if (self.classname == "player") Predict_PlayerPostFrame((player)self); else if (self.classname == "spectator") Predict_SpectatorPostFrame((spectator)self); +#endif } + /* this sucks and doesn't take seats into account */ EFX_UpdateListener(); DSP_UpdateSoundscape(); + /* draw AL debug info (no regard for seating */ if (autocvar_s_al_debug) EFX_DebugInfo(); + /* make sure we're not running these on invalid seats post frame */ pSeat = __NULL__; pSeatLocal = __NULL__; } @@ -1010,6 +1063,7 @@ Whenever the world is fully initialized... void CSQC_WorldLoaded(void) { + print("--------- Initializing Client World ----------\n"); DetailTex_Init(); /* Primarily for the flashlight */ @@ -1029,13 +1083,15 @@ CSQC_WorldLoaded(void) } if (strTokenized != "{") { print("^1[WARNING] ^7Bad entity data\n"); - return; + break; } if (!Entities_ParseLump()) { print("^1[WARNING] ^7Bad entity data\n"); - return; + break; } } + + print("Client world initialized.\n"); } /* @@ -1066,10 +1122,12 @@ Incase you need to free something void CSQC_Shutdown(void) { + print("--------- Shutting Client Game ----------\n"); Decal_Shutdown(); Sentences_Shutdown(); Titles_Shutdown(); Sound_Shutdown(); PropData_Shutdown(); EFX_Shutdown(); + print("Client game shutdown.\n"); } diff --git a/src/client/sentences.qc b/src/client/sentences.qc index edf4cbf5..9aa34d3e 100644 --- a/src/client/sentences.qc +++ b/src/client/sentences.qc @@ -95,12 +95,14 @@ Sentences_Init(void) string temp; int c, i; + print("--------- Initializing SentencesDef (CLIENT) ----------\n"); + Sentences_Shutdown(); fs_sentences = fopen("sound/sentences.txt", FILE_READ); if (fs_sentences < 0) { - print("^1WARNING: ^7Could NOT load sound/sentences.txt\n"); + print("^1could not load sound/sentences.txt\n"); return; } @@ -126,7 +128,7 @@ Sentences_Init(void) g_sentences_count); #else if (g_sentences_count + 1 >= SENTENCES_LIMIT) { - print("^1WARNING: ^7Reached limit of max sentences!\n"); + print("^1reached limit of max sentences!\n"); return; } @@ -152,6 +154,7 @@ Sentences_Init(void) } fclose(fs_sentences); + print(sprintf("SentencesDef initialized with %i entries.\n", g_sentences_count)); } string diff --git a/src/client/titles.qc b/src/client/titles.qc index 9c2eb790..90178186 100644 --- a/src/client/titles.qc +++ b/src/client/titles.qc @@ -86,12 +86,14 @@ Titles_Init(void) int braced; int id = 0; + print("--------- Initializing TitlesDef ----------\n"); + Titles_Shutdown(); fs_titles = fopen("titles.txt", FILE_READ); if (fs_titles < 0) { - print("^1WARNING: ^7Could NOT load titles.txt\n"); + print("^1could NOT load titles.txt\n"); return; } @@ -128,7 +130,7 @@ Titles_Init(void) } } - dprint(sprintf("^2Titles_Init^7: found %i titles\n", g_titles_count)); + print(sprintf("read %i titleDefs (%i bytes).\n", g_titles_count, sizeof(titles_t) * g_titles_count)); g_titles = memalloc(sizeof(titles_t) * g_titles_count); fseek(fs_titles, 0); diff --git a/src/gs-entbase/shared/light_dynamic.qc b/src/gs-entbase/shared/light_dynamic.qc index 44a14192..368800f1 100644 --- a/src/gs-entbase/shared/light_dynamic.qc +++ b/src/gs-entbase/shared/light_dynamic.qc @@ -160,6 +160,7 @@ light_dynamic::ReceiveEntity(float flNew, float flFlags) void light_dynamic::RendererRestarted(void) { +#if 0 float p = dynamiclight_spawnstatic(origin, m_flDistance, m_vecLight / 255); dynamiclight_set(p, LFIELD_ANGLES, angles); @@ -167,6 +168,7 @@ light_dynamic::RendererRestarted(void) dynamiclight_set(p, LFIELD_STYLE, m_flStyle); if (m_strPattern) dynamiclight_set(p, LFIELD_STYLESTRING, m_strPattern); +#endif } void light_dynamic::Initialized(void) diff --git a/src/server/entry.qc b/src/server/entry.qc index f64023e4..1b463590 100644 --- a/src/server/entry.qc +++ b/src/server/entry.qc @@ -270,7 +270,7 @@ The 'self' global does not refer to anything. void SetNewParms(void) { - iprint("Setting New Level Parameters"); + print("--------- Setting New Level Parameters ----------\n"); if (g_ents_initialized) g_grMode.LevelNewParms(); @@ -291,7 +291,7 @@ allocated for every client. void SetChangeParms(void) { - iprint("Setting Level-Change Parameters"); + print("--------- Setting Level-Change Parameters ----------\n"); if (g_ents_initialized) g_grMode.LevelChangeParms((base_player)self); @@ -385,7 +385,7 @@ Called when the QC module gets loaded. No entities exist yet. void init(float prevprogs) { - iprint("Initializing Server-Module"); + print("--------- Initializing Server-Module ----------\n"); Plugin_Init(); PropData_Init(); SurfData_Init(); @@ -402,7 +402,7 @@ method called at the beginning of them having spawned. void init_respawn(void) { - iprint("Respawning Entities"); + print("--------- Respawning Server Entities ----------\n"); if (g_ents_initialized) g_grMode.InitPostEnts(); @@ -425,7 +425,7 @@ initents void initents(void) { - iprint("Initializing Entities"); + print("--------- Initializing Server Entities ----------\n"); /* sound shader init */ Sound_Init(); @@ -524,7 +524,7 @@ var int autocvar_sv_levelexec = 1; void worldspawn(void) { - iprint("Initializing World"); + print("--------- Initializing World ----------\n"); lightstyle(0, "m"); lightstyle(1, "mmnmmommommnonmmonqnmmo"); lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba"); @@ -664,6 +664,7 @@ SV_PerformLoad(float fh, float entcount, float playerslots) float n; NSEntity loadent = __NULL__; + print("--------- Loading Existing Save ----------\n"); #ifdef REEDICT while ((e=nextent(e))) { @@ -733,6 +734,8 @@ SV_PerformSave(float fh, float entcount, float playerslots) float i = 0; entity e; + print("--------- Performing Save ----------\n"); + for (i = 0; i < entcount; i++) { NSEntity willsave; e = edict_num(i); diff --git a/src/server/hlmaterials.qc b/src/server/hlmaterials.qc index e42e2401..0e8d5fbb 100644 --- a/src/server/hlmaterials.qc +++ b/src/server/hlmaterials.qc @@ -17,6 +17,8 @@ /* FIXME: world.... sigh, we should box this into a worldspawn class */ .string materials_file; +var int g_hlmaterial_entries; + float HLMaterials_Fetch(string tex_name) { @@ -33,13 +35,14 @@ HLMaterials_Load(string filename) fileMaterial = fopen(filename, FILE_READ); if (fileMaterial >= 0) { - print(strcat("^2HLMaterials_Load: loading ", filename,"!\n")); + print(strcat("parsing material definitions from ", filename,"\n")); while ((sTemp = fgets(fileMaterial))) { /* tokenize and just parse this stuff in */ if (tokenize_console(sTemp) == 2) { mat_type = strtoupper(argv(0)); tex_name = Materials_FixName(strtolower(argv(1))); hash_add(hashMaterials, tex_name, str2chr(mat_type, 0)); + g_hlmaterial_entries++; } } fclose(fileMaterial); @@ -51,6 +54,9 @@ HLMaterials_Load(string filename) void HLMaterials_Init(void) { + print("--------- Initializing HLMaterials ----------\n"); + + g_hlmaterial_entries = 0; hashMaterials = __NULL__; hashMaterials = hash_createtab(2, HASH_ADD); @@ -72,6 +78,8 @@ HLMaterials_Init(void) /* the way TW did it back in '03 */ HLMaterials_Load(sprintf("maps/%s.mat", mapname)); - /* Trinity does it this way */ + /* Trinity-Renderer does it this way */ HLMaterials_Load(sprintf("maps/%s_materials.txt", mapname)); + + print(sprintf("HLMaterials initiailized with %i entries.\n", g_hlmaterial_entries)); } diff --git a/src/server/mapcycle.qc b/src/server/mapcycle.qc index b9578f8a..a88ddbad 100644 --- a/src/server/mapcycle.qc +++ b/src/server/mapcycle.qc @@ -28,13 +28,16 @@ Mapcycle_Init(void) if (!autocvar_mapcycle_enabled) return; + + print("--------- Initializing MapCycle ----------\n"); + /*if (Rules_IsMultiplayer()) return;*/ fs_mapcycle = fopen(autocvar_mapcycle_file, FILE_READ); if (fs_mapcycle < 0) { - print(strcat("^1WARNING: ^7Could NOT load ", autocvar_mapcycle_file, "\n")); + print(strcat("^1could not load ", autocvar_mapcycle_file, "\n")); return; } @@ -61,4 +64,6 @@ Mapcycle_Init(void) /* the current map in the list will decide the nextmap */ readcmd(sprintf("alias nextmap m%i\n", map_next)); + + print(sprintf("mapcycle initialized with %i entries.\n", mapcount)); } diff --git a/src/server/nodes.qc b/src/server/nodes.qc index 01066a4e..fafbaa5c 100644 --- a/src/server/nodes.qc +++ b/src/server/nodes.qc @@ -146,23 +146,10 @@ Node_AutoLink(node_t *new) } } -/* generate node tree, used for AI movement/navigation */ void -Nodes_Init(void) +Nodes_BuildFromEnts(void) { - iprint("Initializing Nodes-Subsystem"); - g_nodes_present = FALSE; - - /* skip if present. TODO: check if they're out of date? */ - if (whichpack(sprintf("data/%s.way", mapname))) { - g_nodes_present = TRUE; -#ifdef NODE_DEBUG - Nodes_Load(sprintf("%s.way", mapname)); -#endif - return; - } - - dprint("[^2NODES^7] Rebuilding node tree..."); + print("rebuilding node tree..."); /* run through the ents and rebuild the tree */ for (entity a = world; (a = find(a, ::classname, "info_node"));) { @@ -187,11 +174,33 @@ Nodes_Init(void) Node_AutoLink(n); } - dprint(" ^2DONE\n"); - dprint(sprintf("[^2NODES^7] %i nodes found.\n", g_iNodes)); + print(sprintf("%i possible nodes found in %s\n", g_iNodes, mapname)); - if (g_iNodes) + if (g_iNodes) { + print(sprintf("saving nodes nodes for %s\n", mapname)); Nodes_Save(sprintf("%s.way", mapname)); + } else { + print(sprintf("no node data found for %s\n", mapname)); + } +} + +/* generate node tree, used for AI movement/navigation */ +void +Nodes_Init(void) +{ + print("--------- Initializing Nodes Subsystem ----------\n"); + g_nodes_present = FALSE; + + /* skip if present. TODO: check if they're out of date? */ + if (whichpack(sprintf("data/%s.way", mapname))) { + g_nodes_present = TRUE; +#ifdef NODE_DEBUG + print(sprintf("loading existing nodes for %s\n", mapname)); + Nodes_Load(sprintf("%s.way", mapname)); +#endif + } else { + Nodes_BuildFromEnts(); + } /* we don't need these any longer */ #ifndef NODE_DEBUG @@ -201,6 +210,8 @@ Nodes_Init(void) memfree(g_pNodes); g_iNodes = 0; #endif + + print("Nodes subsystem initialized.\n"); } #ifdef NODE_DEBUG diff --git a/src/server/plugins.qc b/src/server/plugins.qc index 2dd48131..debc173a 100644 --- a/src/server/plugins.qc +++ b/src/server/plugins.qc @@ -31,7 +31,7 @@ Plugin_Init(void) int i; if (autocvar_sv_plugins) { - iprint("Initializing Plugins"); + print("--------- Initializing Plugins ----------\n"); g_plugins_enabled = 1; } else { g_plugins_enabled = 0; @@ -41,7 +41,7 @@ Plugin_Init(void) pdb = fopen("plugins.txt", FILE_READ); if (pdb < 0) { - print("^2Plugins^7: No plugins.txt found. Disabling.\n"); + print("^1no plugins.txt found.\n"); g_plugins_enabled = 0; return; } @@ -85,7 +85,7 @@ Plugin_Init(void) } } - print(sprintf("^1Plugins^7: Initialized %i plugins\n", g_plugincount)); + print(sprintf("initialized %i plugins.\n", g_plugincount)); } /* diff --git a/src/server/sentences.qc b/src/server/sentences.qc index 73b87b27..9c710837 100644 --- a/src/server/sentences.qc +++ b/src/server/sentences.qc @@ -30,7 +30,7 @@ Sentences_Init(void) string temp; int c; - iprint("Initializing Sentences-Subsystem"); + print("--------- Initializing SentencesDef (SERVER) ----------\n"); if (g_sentences_count > 0) { g_sentences_count = 0; @@ -44,7 +44,7 @@ Sentences_Init(void) fs_sentences = fopen("sound/sentences.txt", FILE_READ); if (fs_sentences < 0) { - print("^1WARNING: ^7Could NOT load sound/sentences.txt\n"); + print("^1could not load sound/sentences.txt\n"); return; } @@ -70,7 +70,7 @@ Sentences_Init(void) g_sentences_count); #else if (g_sentences_count + 1 >= SENTENCES_LIMIT) { - print("^1WARNING: ^7Reached limit of max sentences!\n"); + print("^1reached limit of max sentences!\n"); return; } @@ -81,6 +81,7 @@ Sentences_Init(void) } fclose(fs_sentences); + print(sprintf("SentencesDef initialized with %i entries.\n", g_sentences_count)); } string diff --git a/src/shared/defs.h b/src/shared/defs.h index d8dc5903..93df63ba 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -145,13 +145,6 @@ dprint(string m) return prior(m); } -/* info print */ -void -iprint(string m) -{ - print(sprintf("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081 %s ^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082\n", m)); -} - void crossprint(string m) { diff --git a/src/shared/propdata.qc b/src/shared/propdata.qc index 6f5e308f..49148e5d 100644 --- a/src/shared/propdata.qc +++ b/src/shared/propdata.qc @@ -379,11 +379,16 @@ PropData_ParseLine(string line) void PropData_Init(void) { - filestream fh; string line; int index; +#ifdef SERVER + print("--------- Initializing PropDefs (SERVER) ----------\n"); +#else + print("--------- Initializing PropDefs (CLIENT) ----------\n"); +#endif + /* remove old data */ PropData_Shutdown(); @@ -415,8 +420,8 @@ PropData_Init(void) /* alocate our stuff */ g_propdata = (propdata_t *)memalloc(sizeof(propdata_t) * PROPDATA_MAX); g_breakmodel = (breakmodel_t *)memalloc(sizeof(breakmodel_t) * PROPDATA_MAX); - print(sprintf("PropData_Init: Allocated %d bytes for prop data\n", sizeof(propdata_t) * PROPDATA_MAX)); - print(sprintf("PropData_Init: Allocated %d bytes for breakmodels\n", sizeof(breakmodel_t) * PROPDATA_MAX)); + print(sprintf("allocated %d bytes for prop data.\n", sizeof(propdata_t) * PROPDATA_MAX)); + print(sprintf("allocated %d bytes for breakmodels.\n", sizeof(breakmodel_t) * PROPDATA_MAX)); #endif fseek(fh, 0); @@ -426,6 +431,8 @@ PropData_Init(void) PropData_ParseLine(line); } fclose(fh); + + print("PropData initialized.\n"); } /* we can only tokenize one thing at a time, so we save the type for the current diff --git a/src/shared/sound.qc b/src/shared/sound.qc index c72b05a3..289b8b73 100644 --- a/src/shared/sound.qc +++ b/src/shared/sound.qc @@ -44,15 +44,23 @@ Sound_Shutdown(void) void Sound_Init(void) { +#ifdef SERVER + print("--------- Initializing SoundDef (SERVER) ----------\n"); +#else + print("--------- Initializing SoundDef (CLIENT) ----------\n"); +#endif + /* make sure it's all reset */ Sound_Shutdown(); #ifndef SOUNDSHADER_DYNAMIC g_sounds = (snd_t *)memalloc(sizeof(snd_t) * SOUNDSHADER_MAX); - print(sprintf("Sound_Init: Allocated %d bytes\n", sizeof(snd_t) * SOUNDSHADER_MAX)); + print(sprintf("allocated %d bytes for soundDef\n", sizeof(snd_t) * SOUNDSHADER_MAX)); #endif precache_sound("misc/missing.wav"); + + print("SoundDef initialized.\n"); } void @@ -313,9 +321,9 @@ Sound_Precache(string shader) fclose(fh); } - dprint("^1[SOUND] No shader found for "); - dprint(shader); - dprint("\n"); + print("^1no soundDef found for "); + print(shader); + print("\n"); search_end(sh); return -1;