Skip to content

Commit a0a05e5

Browse files
authored
Shadows on water surfaces (#1965)
* yeet * LIGHTMAPWATERFOG * cleanup * leave alpha in as configurable parameter * dont bind sampler unnecessarily
1 parent 321c059 commit a0a05e5

7 files changed

Lines changed: 132 additions & 22 deletions

File tree

src/materialsystem/stdshaders/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ target_sources_grouped(
8282
example_model_dx9_helper.cpp
8383
lightmappedgeneric_dx9.cpp
8484
lightmappedgeneric_dx9_helper.cpp
85+
water.cpp
8586
screenspace_general.cpp
8687
)
8788

@@ -106,6 +107,7 @@ target_sources_grouped(
106107
common_vs_fxc.h
107108
example_model_dx9_helper.h
108109
lightmappedgeneric_dx9_helper.h
110+
water_ps2x_helper.h
109111
shader_constant_register_map.h
110112
)
111113

src/materialsystem/stdshaders/Water_vs20.fxc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// STATIC: "BASETEXTURE" "0..1"
22
// STATIC: "MULTITEXTURE" "0..1"
3+
// STATIC: "LIGHTMAPWATERFOG" "0..1"
34

45
// SKIP: $MULTITEXTURE && $BASETEXTURE
56

@@ -25,7 +26,11 @@ struct VS_OUTPUT
2526
#if !defined( _X360 )
2627
float vFog : FOG;
2728
#endif
29+
#if LIGHTMAPWATERFOG
30+
float4 vBumpTexCoordlightmapTexCoord3 : TEXCOORD0;
31+
#else
2832
float2 vBumpTexCoord : TEXCOORD0;
33+
#endif
2934
float3 vTangentEyeVect : TEXCOORD1;
3035
float4 vReflectXY_vRefractYX : TEXCOORD2;
3136
float4 vWorldPos_projPosW : TEXCOORD3;
@@ -34,9 +39,13 @@ struct VS_OUTPUT
3439
#if MULTITEXTURE
3540
float4 vExtraBumpTexCoord : TEXCOORD6;
3641
#endif
42+
#if LIGHTMAPWATERFOG
43+
HALF4 lightmapTexCoord1And2 : TEXCOORD7;
44+
#else
3745
#if BASETEXTURE
3846
HALF4 lightmapTexCoord1And2 : TEXCOORD6;
3947
HALF4 lightmapTexCoord3 : TEXCOORD7;
48+
#endif
4049
#endif
4150
float4 fogFactorW : COLOR1;
4251
};
@@ -88,8 +97,13 @@ VS_OUTPUT main( const VS_INPUT v )
8897
o.vTangentEyeVect.z = dot( vWorldEyeVect, vObjNormal );
8998

9099
// Tranform bump coordinates
100+
#if LIGHTMAPWATERFOG
101+
o.vBumpTexCoordlightmapTexCoord3.x = dot( v.vBaseTexCoord, cBumpTexCoordTransform[0] );
102+
o.vBumpTexCoordlightmapTexCoord3.y = dot( v.vBaseTexCoord, cBumpTexCoordTransform[1] );
103+
#else
91104
o.vBumpTexCoord.x = dot( v.vBaseTexCoord, cBumpTexCoordTransform[0] );
92105
o.vBumpTexCoord.y = dot( v.vBaseTexCoord, cBumpTexCoordTransform[1] );
106+
#endif
93107
float f45x=v.vBaseTexCoord.x+v.vBaseTexCoord.y;
94108
float f45y=v.vBaseTexCoord.y-v.vBaseTexCoord.x;
95109
#if MULTITEXTURE
@@ -99,7 +113,7 @@ VS_OUTPUT main( const VS_INPUT v )
99113
o.vExtraBumpTexCoord.w=v.vBaseTexCoord.x*0.45+TexOffsets.w;
100114
#endif
101115

102-
#if BASETEXTURE
116+
#if BASETEXTURE || LIGHTMAPWATERFOG
103117
o.lightmapTexCoord1And2.xy = v.vLightmapTexCoord + v.vLightmapTexCoordOffset;
104118

105119
float2 lightmapTexCoord2 = o.lightmapTexCoord1And2.xy + v.vLightmapTexCoordOffset;
@@ -109,7 +123,11 @@ VS_OUTPUT main( const VS_INPUT v )
109123
o.lightmapTexCoord1And2.w = lightmapTexCoord2.x;
110124
o.lightmapTexCoord1And2.z = lightmapTexCoord2.y;
111125

126+
#if LIGHTMAPWATERFOG
127+
o.vBumpTexCoordlightmapTexCoord3.zw = lightmapTexCoord3;
128+
#else
112129
o.lightmapTexCoord3.xy = lightmapTexCoord3;
130+
#endif
113131
#endif
114132

115133
return o;

src/materialsystem/stdshaders/include/Water_vs20.inc

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ class water_vs20_Static_Index
88
{
99
unsigned int m_nBASETEXTURE : 2;
1010
unsigned int m_nMULTITEXTURE : 2;
11+
unsigned int m_nLIGHTMAPWATERFOG : 2;
1112
#ifdef _DEBUG
1213
bool m_bBASETEXTURE : 1;
1314
bool m_bMULTITEXTURE : 1;
15+
bool m_bLIGHTMAPWATERFOG : 1;
1416
#endif // _DEBUG
1517
public:
1618
void SetBASETEXTURE( int i )
@@ -31,25 +33,36 @@ public:
3133
#endif // _DEBUG
3234
}
3335

36+
void SetLIGHTMAPWATERFOG( int i )
37+
{
38+
Assert( i >= 0 && i <= 1 );
39+
m_nLIGHTMAPWATERFOG = i;
40+
#ifdef _DEBUG
41+
m_bLIGHTMAPWATERFOG = true;
42+
#endif // _DEBUG
43+
}
44+
3445
water_vs20_Static_Index( )
3546
{
3647
m_nBASETEXTURE = 0;
3748
m_nMULTITEXTURE = 0;
49+
m_nLIGHTMAPWATERFOG = 0;
3850
#ifdef _DEBUG
3951
m_bBASETEXTURE = false;
4052
m_bMULTITEXTURE = false;
53+
m_bLIGHTMAPWATERFOG = false;
4154
#endif // _DEBUG
4255
}
4356

4457
int GetIndex() const
4558
{
46-
Assert( m_bBASETEXTURE && m_bMULTITEXTURE );
59+
Assert( m_bBASETEXTURE && m_bMULTITEXTURE && m_bLIGHTMAPWATERFOG );
4760
AssertMsg( !( m_nMULTITEXTURE && m_nBASETEXTURE ), "Invalid combo combination ( MULTITEXTURE && BASETEXTURE )" );
48-
return ( 1 * m_nBASETEXTURE ) + ( 2 * m_nMULTITEXTURE ) + 0;
61+
return ( 1 * m_nBASETEXTURE ) + ( 2 * m_nMULTITEXTURE ) + ( 4 * m_nLIGHTMAPWATERFOG ) + 0;
4962
}
5063
};
5164

52-
#define shaderStaticTest_water_vs20 vsh_forgot_to_set_static_BASETEXTURE + vsh_forgot_to_set_static_MULTITEXTURE
65+
#define shaderStaticTest_water_vs20 vsh_forgot_to_set_static_BASETEXTURE + vsh_forgot_to_set_static_MULTITEXTURE + vsh_forgot_to_set_static_LIGHTMAPWATERFOG
5366

5467

5568
class water_vs20_Dynamic_Index

src/materialsystem/stdshaders/include/water_ps20b.inc

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class water_ps20b_Static_Index
2020
unsigned int m_nABOVEWATER : 2;
2121
unsigned int m_nBLURRY_REFRACT : 2;
2222
unsigned int m_nNORMAL_DECODE_MODE : 1;
23+
unsigned int m_nLIGHTMAPWATERFOG : 2;
2324
#ifdef _DEBUG
2425
bool m_bBASETEXTURE : 1;
2526
bool m_bMULTITEXTURE : 1;
@@ -28,6 +29,7 @@ class water_ps20b_Static_Index
2829
bool m_bABOVEWATER : 1;
2930
bool m_bBLURRY_REFRACT : 1;
3031
bool m_bNORMAL_DECODE_MODE : 1;
32+
bool m_bLIGHTMAPWATERFOG : 1;
3133
#endif // _DEBUG
3234
public:
3335
void SetCONVERT_TO_SRGB( int i )
@@ -99,6 +101,15 @@ public:
99101
#endif // _DEBUG
100102
}
101103

104+
void SetLIGHTMAPWATERFOG( int i )
105+
{
106+
Assert( i >= 0 && i <= 1 );
107+
m_nLIGHTMAPWATERFOG = i;
108+
#ifdef _DEBUG
109+
m_bLIGHTMAPWATERFOG = true;
110+
#endif // _DEBUG
111+
}
112+
102113
water_ps20b_Static_Index( )
103114
{
104115
m_nCONVERT_TO_SRGB = g_pHardwareConfig->NeedsShaderSRGBConversion();
@@ -109,6 +120,7 @@ public:
109120
m_nABOVEWATER = 0;
110121
m_nBLURRY_REFRACT = 0;
111122
m_nNORMAL_DECODE_MODE = 0;
123+
m_nLIGHTMAPWATERFOG = 0;
112124
#ifdef _DEBUG
113125
m_bBASETEXTURE = false;
114126
m_bMULTITEXTURE = false;
@@ -117,18 +129,19 @@ public:
117129
m_bABOVEWATER = false;
118130
m_bBLURRY_REFRACT = false;
119131
m_bNORMAL_DECODE_MODE = false;
132+
m_bLIGHTMAPWATERFOG = false;
120133
#endif // _DEBUG
121134
}
122135

123136
int GetIndex() const
124137
{
125-
Assert( m_bBASETEXTURE && m_bMULTITEXTURE && m_bREFLECT && m_bREFRACT && m_bABOVEWATER && m_bBLURRY_REFRACT && m_bNORMAL_DECODE_MODE );
138+
Assert( m_bBASETEXTURE && m_bMULTITEXTURE && m_bREFLECT && m_bREFRACT && m_bABOVEWATER && m_bBLURRY_REFRACT && m_bNORMAL_DECODE_MODE && m_bLIGHTMAPWATERFOG );
126139
AssertMsg( !( m_nMULTITEXTURE && m_nBASETEXTURE ), "Invalid combo combination ( MULTITEXTURE && BASETEXTURE )" );
127-
return ( 6 * m_nCONVERT_TO_SRGB ) + ( 12 * m_nBASETEXTURE ) + ( 24 * m_nMULTITEXTURE ) + ( 48 * m_nREFLECT ) + ( 96 * m_nREFRACT ) + ( 192 * m_nABOVEWATER ) + ( 384 * m_nBLURRY_REFRACT ) + ( 768 * m_nNORMAL_DECODE_MODE ) + 0;
140+
return ( 6 * m_nCONVERT_TO_SRGB ) + ( 12 * m_nBASETEXTURE ) + ( 24 * m_nMULTITEXTURE ) + ( 48 * m_nREFLECT ) + ( 96 * m_nREFRACT ) + ( 192 * m_nABOVEWATER ) + ( 384 * m_nBLURRY_REFRACT ) + ( 768 * m_nNORMAL_DECODE_MODE ) + ( 768 * m_nLIGHTMAPWATERFOG ) + 0;
128141
}
129142
};
130143

131-
#define shaderStaticTest_water_ps20b psh_forgot_to_set_static_BASETEXTURE + psh_forgot_to_set_static_MULTITEXTURE + psh_forgot_to_set_static_REFLECT + psh_forgot_to_set_static_REFRACT + psh_forgot_to_set_static_ABOVEWATER + psh_forgot_to_set_static_BLURRY_REFRACT + psh_forgot_to_set_static_NORMAL_DECODE_MODE
144+
#define shaderStaticTest_water_ps20b psh_forgot_to_set_static_BASETEXTURE + psh_forgot_to_set_static_MULTITEXTURE + psh_forgot_to_set_static_REFLECT + psh_forgot_to_set_static_REFRACT + psh_forgot_to_set_static_ABOVEWATER + psh_forgot_to_set_static_BLURRY_REFRACT + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_LIGHTMAPWATERFOG
132145

133146

134147
class water_ps20b_Dynamic_Index

src/materialsystem/stdshaders/water.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ BEGIN_VS_SHADER( Water_DX90,
5656
SHADER_PARAM( SCROLL1, SHADER_PARAM_TYPE_COLOR, "", "" )
5757
SHADER_PARAM( SCROLL2, SHADER_PARAM_TYPE_COLOR, "", "" )
5858
SHADER_PARAM( BLURREFRACT, SHADER_PARAM_TYPE_BOOL, "0", "Cause the refraction to be blurry on ps2b hardware" )
59+
#ifdef NEO
60+
SHADER_PARAM( LIGHTMAPWATERFOG, SHADER_PARAM_TYPE_BOOL, "0", "Cast shadows onto the fog component of the water surface" )
61+
#endif // NEO
5962
END_SHADER_PARAMS
6063

6164
SHADER_INIT_PARAMS()
@@ -179,6 +182,7 @@ BEGIN_VS_SHADER( Water_DX90,
179182
inline void DrawReflectionRefraction( IMaterialVar **params, IShaderShadow* pShaderShadow,
180183
IShaderDynamicAPI* pShaderAPI, bool bReflection, bool bRefraction )
181184
{
185+
bool blightMapWaterFog = params[LIGHTMAPWATERFOG]->GetIntValue();
182186
SHADOW_STATE
183187
{
184188
SetInitialShadowState( );
@@ -205,6 +209,15 @@ BEGIN_VS_SHADER( Water_DX90,
205209
pShaderShadow->EnableSRGBRead( SHADER_SAMPLER3, true );
206210
}
207211
}
212+
#ifdef NEO
213+
if (blightMapWaterFog)
214+
{
215+
// LIGHTMAP
216+
pShaderShadow->EnableTexture( SHADER_SAMPLER3, true );
217+
pShaderShadow->EnableSRGBRead( SHADER_SAMPLER3, true );
218+
}
219+
#endif // NEO
220+
208221
// normal map
209222
pShaderShadow->EnableTexture( SHADER_SAMPLER4, true );
210223
// Normalizing cube map
@@ -216,7 +229,11 @@ BEGIN_VS_SHADER( Water_DX90,
216229
// texcoord1 : lightmap texcoord
217230
// texcoord2 : lightmap texcoord offset
218231
int numTexCoords = 1;
232+
#ifdef NEO
233+
if( params[BASETEXTURE]->IsTexture() || blightMapWaterFog )
234+
#else
219235
if( params[BASETEXTURE]->IsTexture() )
236+
#endif // NEO
220237
{
221238
numTexCoords = 3;
222239
}
@@ -228,6 +245,11 @@ BEGIN_VS_SHADER( Water_DX90,
228245
DECLARE_STATIC_VERTEX_SHADER( water_vs20 );
229246
SET_STATIC_VERTEX_SHADER_COMBO( MULTITEXTURE,fabs(Scroll1.x) > 0.0);
230247
SET_STATIC_VERTEX_SHADER_COMBO( BASETEXTURE, params[BASETEXTURE]->IsTexture() );
248+
#ifdef NEO
249+
SET_STATIC_VERTEX_SHADER_COMBO(LIGHTMAPWATERFOG, blightMapWaterFog);
250+
#else // Still custom NEO code
251+
SET_STATIC_VERTEX_SHADER_COMBO(LIGHTMAPWATERFOG, 0);
252+
#endif // NEO
231253
SET_STATIC_VERTEX_SHADER( water_vs20 );
232254

233255
// "REFLECT" "0..1"
@@ -243,6 +265,11 @@ BEGIN_VS_SHADER( Water_DX90,
243265
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURE, params[BASETEXTURE]->IsTexture() );
244266
SET_STATIC_PIXEL_SHADER_COMBO( BLURRY_REFRACT, params[BLURREFRACT]->GetIntValue() );
245267
SET_STATIC_PIXEL_SHADER_COMBO( NORMAL_DECODE_MODE, (int) NORMAL_DECODE_NONE );
268+
#ifdef NEO
269+
SET_STATIC_PIXEL_SHADER_COMBO(LIGHTMAPWATERFOG, blightMapWaterFog);
270+
#else // Still custom NEO code
271+
SET_STATIC_PIXEL_SHADER_COMBO(LIGHTMAPWATERFOG, 0);
272+
#endif // NEO
246273
SET_STATIC_PIXEL_SHADER( water_ps20b );
247274
}
248275
else
@@ -282,6 +309,12 @@ BEGIN_VS_SHADER( Water_DX90,
282309
BindTexture( SHADER_SAMPLER1, BASETEXTURE, FRAME );
283310
pShaderAPI->BindStandardTexture( SHADER_SAMPLER3, TEXTURE_LIGHTMAP );
284311
}
312+
#ifdef NEO
313+
else if (blightMapWaterFog)
314+
{
315+
pShaderAPI->BindStandardTexture( SHADER_SAMPLER3, TEXTURE_LIGHTMAP );
316+
}
317+
#endif // NEO
285318

286319
pShaderAPI->BindStandardTexture( SHADER_SAMPLER5, TEXTURE_NORMALIZATION_CUBEMAP_SIGNED );
287320

src/materialsystem/stdshaders/water_ps2x.fxc

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
// STATIC: "NORMAL_DECODE_MODE" "0..0" [XBOX]
1212
// STATIC: "NORMAL_DECODE_MODE" "0..0" [PC]
1313

14+
// STATIC: "LIGHTMAPWATERFOG" "0..1"
15+
1416
// DYNAMIC: "PIXELFOGTYPE" "0..2"
1517
// DYNAMIC: "WRITE_DEPTH_TO_DESTALPHA" "0..1" [ps20b] [PC]
1618
// DYNAMIC: "WRITE_DEPTH_TO_DESTALPHA" "0..0" [ps20b] [XBOX]
@@ -30,7 +32,7 @@ sampler RefractSampler : register( s0 );
3032
sampler BaseTextureSampler : register( s1 );
3133
#endif
3234
sampler ReflectSampler : register( s2 );
33-
#if BASETEXTURE
35+
#if BASETEXTURE || LIGHTMAPWATERFOG
3436
sampler LightmapSampler : register( s3 );
3537
#endif
3638
sampler NormalSampler : register( s4 );
@@ -51,7 +53,11 @@ const float3 g_EyePos : register( c9 );
5153

5254
struct PS_INPUT
5355
{
56+
#if LIGHTMAPWATERFOG
57+
float4 vBumpTexCoordlightmapTexCoord3 : TEXCOORD0;
58+
#else
5459
float2 vBumpTexCoord : TEXCOORD0;
60+
#endif
5561
half3 vTangentEyeVect : TEXCOORD1;
5662
float4 vReflectXY_vRefractYX : TEXCOORD2;
5763
float4 vWorldPos_projPosW : TEXCOORD3;
@@ -60,11 +66,15 @@ struct PS_INPUT
6066
#if MULTITEXTURE
6167
float4 vExtraBumpTexCoord : TEXCOORD6;
6268
#endif
69+
#if LIGHTMAPWATERFOG
70+
HALF4 lightmapTexCoord1And2 : TEXCOORD7;
71+
#else
6372
#if BASETEXTURE
6473
// CENTROID: TEXCOORD6
6574
HALF4 lightmapTexCoord1And2 : TEXCOORD6;
6675
// CENTROID: TEXCOORD7
6776
HALF4 lightmapTexCoord3 : TEXCOORD7;
77+
#endif
6878
#endif
6979

7080
float4 fogFactorW : COLOR1;
@@ -74,7 +84,11 @@ float4 main( PS_INPUT i ) : COLOR
7484
{
7585
DrawWater_params_t params;
7686

87+
#if LIGHTMAPWATERFOG
88+
params.vBumpTexCoord = i.vBumpTexCoordlightmapTexCoord3.xy;
89+
#else
7790
params.vBumpTexCoord = i.vBumpTexCoord;
91+
#endif
7892
#if MULTITEXTURE
7993
params.vExtraBumpTexCoord = i.vExtraBumpTexCoord;
8094
#endif
@@ -86,9 +100,13 @@ float4 main( PS_INPUT i ) : COLOR
86100
params.vRefractTint = vRefractTint;
87101
params.vTangentEyeVect = i.vTangentEyeVect;
88102
params.waterFogColor = g_WaterFogColor;
89-
#if BASETEXTURE
103+
#if BASETEXTURE || LIGHTMAPWATERFOG
90104
params.lightmapTexCoord1And2 = i.lightmapTexCoord1And2;
105+
#if LIGHTMAPWATERFOG
106+
params.lightmapTexCoord3 = i.vBumpTexCoordlightmapTexCoord3.zw;
107+
#else
91108
params.lightmapTexCoord3 = i.lightmapTexCoord3;
109+
#endif
92110
#endif
93111
params.vProjPos = i.vProjPos;
94112
params.pixelFogParams = g_PixelFogParams;
@@ -102,8 +120,10 @@ float4 main( PS_INPUT i ) : COLOR
102120
DrawWater( params,
103121
// yay. . can't put sampler in a struct.
104122
#if BASETEXTURE
105-
BaseTextureSampler,
106-
LightmapSampler,
123+
BaseTextureSampler,
124+
#endif
125+
#if BASETEXTURE || LIGHTMAPWATERFOG
126+
LightmapSampler,
107127
#endif
108128
NormalSampler, RefractSampler, ReflectSampler,
109129
result, fogFactor );

0 commit comments

Comments
 (0)