Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "common.h"
- #include "lmodel.h"
- #include "shadow.h"
- float3x4 m_sunmask; // ortho-projection
- //Texture2D s_water;
- Texture3D s_water;
- Texture3D s_waterFall;
- float4 RainDensity; // float
- float4 RainFallof; // float2
- float4 WorldX; // Float3
- float4 WorldZ; // Float3
- float3 GetNVNMap( Texture3D s_texture, float2 tc, float time)
- {
- // Unpack NVidia normal map
- // float4 water = s_water.SampleLevel( smp_linear, float3(tc, time), 0 ) - 0.5;
- // float4 water = s_water.Sample( smp_linear, float3(tc, time)) - 0.5;
- float4 water = s_texture.SampleBias( smp_base, float3(tc, time), -3.) - 0.5;
- // Swizzle
- water.xyz = water.wyz;
- // Renormalize (*2) and scale (*3)
- water.xyz *= 6;
- // water.y = sqrt(1-water.x*water.x-water.z*water.z);
- water.y = 0;
- return water.xyz;
- }
- float3 GetWaterNMap( Texture3D s_texture, float2 tc, float time)
- {
- // Unpack normal map
- // float4 water = s_texture.SampleLevel( smp_base, float3(tc, time), 0 );
- float4 water = s_texture.Sample( smp_base, float3(tc, time));
- water.xyz = (water.xzy-0.5)*2;
- // water.xyz *= 3;
- water.xyz *= 0.3;
- water.y = 0;
- return water.xyz;
- }
- #ifndef ISAMPLE
- #define ISAMPLE 0
- #endif
- #ifdef GBUFFER_OPTIMIZATION
- float4 main ( float2 tc : TEXCOORD0, float2 tcJ : TEXCOORD1, float4 Color : COLOR, float4 pos2d : SV_Position ) : SV_Target
- #else
- float4 main ( float2 tc : TEXCOORD0, float2 tcJ : TEXCOORD1 ) : SV_Target
- #endif
- {
- #ifdef GBUFFER_OPTIMIZATION
- gbuffer_data gbd = gbuffer_load_data( tc, pos2d, ISAMPLE );
- #else
- gbuffer_data gbd = gbuffer_load_data( tc, ISAMPLE );
- #endif
- float4 _P = float4( gbd.P, 1.0 );
- float3 _N = gbd.N;
- float3 D = gbd.C; // rgb //.gloss
- _N.xyz = normalize(_N.xyz);
- float4 PS = mul( m_shadow, _P );
- float3 WorldP = mul( m_sunmask, _P );
- float3 WorldN = mul( m_sunmask, _N.xyz );
- // floor ???? instead of step?
- //float delta = sin(WorldP.z*30);
- //float deltaX = step(0, sin(WorldP.z*30));
- //float deltaX = step(0, sin(WorldP.z*(2.0*3.14)/(1+frac(WorldP.x + WorldP.y)) ));
- //float deltaY = step(0, sin(WorldP.z*10+3));
- //float deltaY = deltaX;
- //deltaX *= 0.05;
- //deltaY *= 0.05;
- //float s = shadow_rain( PS, WorldP.xz*2 + float2(deltaX, deltaY) );
- float s = shadow_rain( PS, WorldP.xz*2 );
- // Apply distance falloff
- //float fAtten = 1 - smoothstep( 10, 30, length( _P.xyz ));
- float fAtten = 1 - smoothstep( RainFallof.x, RainFallof.y, length( _P.xyz ));
- s *= fAtten*fAtten;
- // Apply rain density
- s *= RainDensity.x;
- float fIsUp = -dot( Ldynamic_dir.xyz, _N.xyz );
- s *= saturate(fIsUp*10+(10*0.5)+0.5);
- fIsUp = max(0, fIsUp);
- float fIsX = WorldN.x;
- float fIsZ = WorldN.z;
- float3 waterSplash = GetNVNMap( s_water, WorldP.xz, timers.x*3.0 );
- // float3 waterFallX = GetWaterNMap( s_waterFall, float2(WorldP.x, WorldP.y-timers.x), 0.5 );
- // float3 waterFallZ = GetWaterNMap( s_waterFall, float2(WorldP.z, WorldP.y-timers.x), 0.5 );
- float3 tc1 = WorldP / 2;
- float fAngleFactor = 1 - fIsUp;
- fAngleFactor = 0.1*ceil(10*fAngleFactor);
- // Just slow down effect.
- // fAngleFactor *= 0.25;
- // fAngleFactor *= 0.5;
- fAngleFactor *= 1.3;
- float3 waterFallX = GetWaterNMap( s_waterFall, float2(tc1.z, tc1.y+timers.x*fAngleFactor), 0.5 );
- float3 waterFallZ = GetWaterNMap( s_waterFall, float2(tc1.x, tc1.y+timers.x*fAngleFactor), 0.5 );
- float2 IsDir = (float2(fIsZ, fIsX));
- // float2 IsDir = float2(0, 1);
- IsDir = normalize(IsDir);
- float3 waterFall = GetWaterNMap( s_waterFall, float2( dot(tc1.xz, IsDir), tc1.y+timers.x), 0.5 );
- // float WeaponAttenuation = smoothstep( 1.0, 1.1, length( _P.xyz ));
- float WeaponAttenuation = smoothstep( 0.8, 0.9, length( _P.xyz ));
- float ApplyNormalCoeff = s * WeaponAttenuation;
- float3 water = waterSplash*(fIsUp*ApplyNormalCoeff);
- water += waterFallX.yxz*(abs(fIsX)*ApplyNormalCoeff);
- water += waterFallZ.zxy*(abs(fIsZ)*ApplyNormalCoeff);
- // Translate NM to view space
- water.xyz = mul( m_V, water.xyz );
- //return float4(water.xyz,1); // holger
- _N += water.xyz;
- _N = normalize(_N);
- s *= dot(D.xyz, float3(0.33, 0.33, 0.33));
- // s *= 0.5*fIsUp+0.5;
- return float4(_N,s);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement