Advertisement
Guest User

1.5.03/rain_patch_normal.h

a guest
Apr 18th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. #include "common.h"
  2. #include "lmodel.h"
  3. #include "shadow.h"
  4.  
  5.  
  6. float3x4 m_sunmask; // ortho-projection
  7. //Texture2D s_water;
  8. Texture3D s_water;
  9. Texture3D s_waterFall;
  10. float4 RainDensity; // float
  11. float4 RainFallof; // float2
  12. float4 WorldX; // Float3
  13. float4 WorldZ; // Float3
  14.  
  15.  
  16. float3 GetNVNMap( Texture3D s_texture, float2 tc, float time)
  17. {
  18. // Unpack NVidia normal map
  19. // float4 water = s_water.SampleLevel( smp_linear, float3(tc, time), 0 ) - 0.5;
  20. // float4 water = s_water.Sample( smp_linear, float3(tc, time)) - 0.5;
  21. float4 water = s_texture.SampleBias( smp_base, float3(tc, time), -3.) - 0.5;
  22.  
  23. // Swizzle
  24. water.xyz = water.wyz;
  25.  
  26. // Renormalize (*2) and scale (*3)
  27. water.xyz *= 6;
  28.  
  29. // water.y = sqrt(1-water.x*water.x-water.z*water.z);
  30. water.y = 0;
  31.  
  32. return water.xyz;
  33. }
  34.  
  35.  
  36. float3 GetWaterNMap( Texture3D s_texture, float2 tc, float time)
  37. {
  38. // Unpack normal map
  39. // float4 water = s_texture.SampleLevel( smp_base, float3(tc, time), 0 );
  40. float4 water = s_texture.Sample( smp_base, float3(tc, time));
  41. water.xyz = (water.xzy-0.5)*2;
  42.  
  43. // water.xyz *= 3;
  44.  
  45. water.xyz *= 0.3;
  46.  
  47. water.y = 0;
  48.  
  49. return water.xyz;
  50. }
  51.  
  52.  
  53. #ifndef ISAMPLE
  54. #define ISAMPLE 0
  55. #endif
  56.  
  57.  
  58. #ifdef GBUFFER_OPTIMIZATION
  59. float4 main ( float2 tc : TEXCOORD0, float2 tcJ : TEXCOORD1, float4 Color : COLOR, float4 pos2d : SV_Position ) : SV_Target
  60. #else
  61. float4 main ( float2 tc : TEXCOORD0, float2 tcJ : TEXCOORD1 ) : SV_Target
  62. #endif
  63. {
  64. #ifdef GBUFFER_OPTIMIZATION
  65. gbuffer_data gbd = gbuffer_load_data( tc, pos2d, ISAMPLE );
  66. #else
  67. gbuffer_data gbd = gbuffer_load_data( tc, ISAMPLE );
  68. #endif
  69. float4 _P = float4( gbd.P, 1.0 );
  70. float3 _N = gbd.N;
  71. float3 D = gbd.C; // rgb //.gloss
  72.  
  73. _N.xyz = normalize(_N.xyz);
  74.  
  75. float4 PS = mul( m_shadow, _P );
  76.  
  77. float3 WorldP = mul( m_sunmask, _P );
  78. float3 WorldN = mul( m_sunmask, _N.xyz );
  79.  
  80. // floor ???? instead of step?
  81. //float delta = sin(WorldP.z*30);
  82. //float deltaX = step(0, sin(WorldP.z*30));
  83. //float deltaX = step(0, sin(WorldP.z*(2.0*3.14)/(1+frac(WorldP.x + WorldP.y)) ));
  84.  
  85. //float deltaY = step(0, sin(WorldP.z*10+3));
  86. //float deltaY = deltaX;
  87.  
  88. //deltaX *= 0.05;
  89. //deltaY *= 0.05;
  90.  
  91. //float s = shadow_rain( PS, WorldP.xz*2 + float2(deltaX, deltaY) );
  92. float s = shadow_rain( PS, WorldP.xz*2 );
  93.  
  94. // Apply distance falloff
  95. //float fAtten = 1 - smoothstep( 10, 30, length( _P.xyz ));
  96. float fAtten = 1 - smoothstep( RainFallof.x, RainFallof.y, length( _P.xyz ));
  97. s *= fAtten*fAtten;
  98.  
  99. // Apply rain density
  100. s *= RainDensity.x;
  101.  
  102. float fIsUp = -dot( Ldynamic_dir.xyz, _N.xyz );
  103. s *= saturate(fIsUp*10+(10*0.5)+0.5);
  104. fIsUp = max(0, fIsUp);
  105.  
  106. float fIsX = WorldN.x;
  107. float fIsZ = WorldN.z;
  108.  
  109. float3 waterSplash = GetNVNMap( s_water, WorldP.xz, timers.x*3.0 );
  110. // float3 waterFallX = GetWaterNMap( s_waterFall, float2(WorldP.x, WorldP.y-timers.x), 0.5 );
  111. // float3 waterFallZ = GetWaterNMap( s_waterFall, float2(WorldP.z, WorldP.y-timers.x), 0.5 );
  112.  
  113. float3 tc1 = WorldP / 2;
  114.  
  115. float fAngleFactor = 1 - fIsUp;
  116.  
  117. fAngleFactor = 0.1*ceil(10*fAngleFactor);
  118.  
  119. // Just slow down effect.
  120. // fAngleFactor *= 0.25;
  121. // fAngleFactor *= 0.5;
  122. fAngleFactor *= 1.3;
  123.  
  124. float3 waterFallX = GetWaterNMap( s_waterFall, float2(tc1.z, tc1.y+timers.x*fAngleFactor), 0.5 );
  125. float3 waterFallZ = GetWaterNMap( s_waterFall, float2(tc1.x, tc1.y+timers.x*fAngleFactor), 0.5 );
  126.  
  127. float2 IsDir = (float2(fIsZ, fIsX));
  128.  
  129. // float2 IsDir = float2(0, 1);
  130.  
  131. IsDir = normalize(IsDir);
  132.  
  133. float3 waterFall = GetWaterNMap( s_waterFall, float2( dot(tc1.xz, IsDir), tc1.y+timers.x), 0.5 );
  134.  
  135. // float WeaponAttenuation = smoothstep( 1.0, 1.1, length( _P.xyz ));
  136. float WeaponAttenuation = smoothstep( 0.8, 0.9, length( _P.xyz ));
  137. float ApplyNormalCoeff = s * WeaponAttenuation;
  138.  
  139. float3 water = waterSplash*(fIsUp*ApplyNormalCoeff);
  140.  
  141. water += waterFallX.yxz*(abs(fIsX)*ApplyNormalCoeff);
  142. water += waterFallZ.zxy*(abs(fIsZ)*ApplyNormalCoeff);
  143.  
  144. // Translate NM to view space
  145. water.xyz = mul( m_V, water.xyz );
  146.  
  147. //return float4(water.xyz,1); // holger
  148.  
  149. _N += water.xyz;
  150.  
  151. _N = normalize(_N);
  152.  
  153. s *= dot(D.xyz, float3(0.33, 0.33, 0.33));
  154. // s *= 0.5*fIsUp+0.5;
  155.  
  156. return float4(_N,s);
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement