diff --git a/res/gamedata/shaders/r5/accum_base.ps b/res/gamedata/shaders/r5/accum_base.ps index 18767bffa24..3a5df321775 100644 Binary files a/res/gamedata/shaders/r5/accum_base.ps and b/res/gamedata/shaders/r5/accum_base.ps differ diff --git a/res/gamedata/shaders/r5/accum_sun_far.ps b/res/gamedata/shaders/r5/accum_sun_far.ps index f7851aa2402..2891c39d5ab 100644 Binary files a/res/gamedata/shaders/r5/accum_sun_far.ps and b/res/gamedata/shaders/r5/accum_sun_far.ps differ diff --git a/res/gamedata/shaders/r5/accum_sun_near.ps b/res/gamedata/shaders/r5/accum_sun_near.ps index c2587464af0..0222d437419 100644 Binary files a/res/gamedata/shaders/r5/accum_sun_near.ps and b/res/gamedata/shaders/r5/accum_sun_near.ps differ diff --git a/res/gamedata/shaders/r5/accum_volumetric.ps b/res/gamedata/shaders/r5/accum_volumetric.ps index c894d7698fa..ac6352ff3bc 100644 Binary files a/res/gamedata/shaders/r5/accum_volumetric.ps and b/res/gamedata/shaders/r5/accum_volumetric.ps differ diff --git a/res/gamedata/shaders/r5/accum_volumetric.s b/res/gamedata/shaders/r5/accum_volumetric.s index c12a5ed64a1..3ba92e9e7ce 100644 --- a/res/gamedata/shaders/r5/accum_volumetric.s +++ b/res/gamedata/shaders/r5/accum_volumetric.s @@ -3,19 +3,13 @@ function normal (shader, t_base, t_second, t_detail) : fog (false) : zb (true,false) : blend (true,blend.one,blend.one) --- : aref (true,0) : sorting (2, false) --- TODO: Implement sampler states --- shader:sampler ("s_lmap") :texture (t_base): clamp() --- shader:sampler ("s_smap") :texture ("null") --- shader:sampler ("s_noise") :texture("fx\\fx_noise") : f_linear () shader:dx10texture ("s_lmap", t_base) shader:dx10texture ("s_smap", "null") - shader:dx10texture ("s_noise", "fx\\fx_noise") + shader:dx10texture ("s_position", "$user$position") shader:dx10sampler ("smp_rtlinear") - shader:dx10sampler ("smp_linear") --- shader:dx10sampler ("smp_jitter") shader:dx10sampler ("smp_smap") + shader:dx10sampler ("smp_jitter") end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/accum_volumetric.vs b/res/gamedata/shaders/r5/accum_volumetric.vs index 88557d56ed5..16b4fce3687 100644 --- a/res/gamedata/shaders/r5/accum_volumetric.vs +++ b/res/gamedata/shaders/r5/accum_volumetric.vs @@ -12,27 +12,25 @@ struct v2p float3 lightToPos : TEXCOORD0; // light center to plane vector float3 vPos : TEXCOORD1; // position in camera space float fDensity : TEXCOORD2; // plane density alon Z axis -// float2 tNoise : TEXCOORD3; // projective noise float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; float4 hpos : SV_Position; }; +//float4x4 m_texgen; + v2p main ( float3 P : POSITION ) { v2p o; float4 vPos; vPos.xyz = lerp( vMinBounds, vMaxBounds, P); // Position in camera space - vPos.w = 1; - o.hpos = mul (m_P, vPos); // xform, input in camera coordinates + vPos.w = 1.0; + o.hpos = mul(m_P, vPos); // xform, input in camera coordinates o.lightToPos = vPos.xyz - Ldynamic_pos.xyz; o.vPos = vPos; -// o.fDensity = (vMaxBounds.z-vMinBounds.z)/2000.0h; -// o.fDensity = (vMaxBounds.z-vMinBounds.z)/2000.0h*2; - o.fDensity = 1.0h/40.0h; -// o.fDensity = 1.0h/20.0h; + o.fDensity = 1.0 / 40.0; for (int i=0; i<3; ++i) { diff --git a/res/gamedata/shaders/r5/accum_volumetric_nomsaa.s b/res/gamedata/shaders/r5/accum_volumetric_nomsaa.s index c12a5ed64a1..3ba92e9e7ce 100644 --- a/res/gamedata/shaders/r5/accum_volumetric_nomsaa.s +++ b/res/gamedata/shaders/r5/accum_volumetric_nomsaa.s @@ -3,19 +3,13 @@ function normal (shader, t_base, t_second, t_detail) : fog (false) : zb (true,false) : blend (true,blend.one,blend.one) --- : aref (true,0) : sorting (2, false) --- TODO: Implement sampler states --- shader:sampler ("s_lmap") :texture (t_base): clamp() --- shader:sampler ("s_smap") :texture ("null") --- shader:sampler ("s_noise") :texture("fx\\fx_noise") : f_linear () shader:dx10texture ("s_lmap", t_base) shader:dx10texture ("s_smap", "null") - shader:dx10texture ("s_noise", "fx\\fx_noise") + shader:dx10texture ("s_position", "$user$position") shader:dx10sampler ("smp_rtlinear") - shader:dx10sampler ("smp_linear") --- shader:dx10sampler ("smp_jitter") shader:dx10sampler ("smp_smap") + shader:dx10sampler ("smp_jitter") end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/accum_volumetric_sun.ps b/res/gamedata/shaders/r5/accum_volumetric_sun.ps index 48e12d6392a..3df21d7b6f1 100644 Binary files a/res/gamedata/shaders/r5/accum_volumetric_sun.ps and b/res/gamedata/shaders/r5/accum_volumetric_sun.ps differ diff --git a/res/gamedata/shaders/r5/check_screenspace.h b/res/gamedata/shaders/r5/check_screenspace.h index feabe7d5180..023ed9273e3 100644 --- a/res/gamedata/shaders/r5/check_screenspace.h +++ b/res/gamedata/shaders/r5/check_screenspace.h @@ -7,4 +7,9 @@ #include "check_screenspace_IL.h" #include "check_screenspace_FLORA.h" #include "check_screenspace_INTER_GRASS.h" -#include "check_screenspace_NEWGLOSS.h" \ No newline at end of file +#include "check_screenspace_NEWGLOSS.h" +#include "check_screenspace_WIND.h" +#include "check_screenspace_SHADOWS.h" +#include "check_screenspace_SSS.h" +#include "check_screenspace_LUT.h" +#include "check_screenspace_PUDDLES.h" \ No newline at end of file diff --git a/res/gamedata/shaders/r5/check_screenspace_LUT.h b/res/gamedata/shaders/r5/check_screenspace_LUT.h new file mode 100644 index 00000000000..c1ea61ac6c4 --- /dev/null +++ b/res/gamedata/shaders/r5/check_screenspace_LUT.h @@ -0,0 +1 @@ +#define SSFX_LUT_INUSE \ No newline at end of file diff --git a/res/gamedata/shaders/r5/check_screenspace_PUDDLES.h b/res/gamedata/shaders/r5/check_screenspace_PUDDLES.h new file mode 100644 index 00000000000..b472f8ce4f2 --- /dev/null +++ b/res/gamedata/shaders/r5/check_screenspace_PUDDLES.h @@ -0,0 +1 @@ +#define SSFX_PUDDLES \ No newline at end of file diff --git a/res/gamedata/shaders/r5/check_screenspace_SHADOWS.h b/res/gamedata/shaders/r5/check_screenspace_SHADOWS.h new file mode 100644 index 00000000000..8da1e966fbd --- /dev/null +++ b/res/gamedata/shaders/r5/check_screenspace_SHADOWS.h @@ -0,0 +1 @@ +#define SSFX_SHADOWS \ No newline at end of file diff --git a/res/gamedata/shaders/r5/check_screenspace_SSS.h b/res/gamedata/shaders/r5/check_screenspace_SSS.h new file mode 100644 index 00000000000..79181b22c82 --- /dev/null +++ b/res/gamedata/shaders/r5/check_screenspace_SSS.h @@ -0,0 +1 @@ +#define SSFX_SSS \ No newline at end of file diff --git a/res/gamedata/shaders/r5/check_screenspace_WIND.h b/res/gamedata/shaders/r5/check_screenspace_WIND.h new file mode 100644 index 00000000000..2045ec42769 --- /dev/null +++ b/res/gamedata/shaders/r5/check_screenspace_WIND.h @@ -0,0 +1 @@ +#define SSFX_WIND \ No newline at end of file diff --git a/res/gamedata/shaders/r5/combine_1.ps b/res/gamedata/shaders/r5/combine_1.ps index 1001896073c..25f750cb129 100644 Binary files a/res/gamedata/shaders/r5/combine_1.ps and b/res/gamedata/shaders/r5/combine_1.ps differ diff --git a/res/gamedata/shaders/r5/combine_2_naa.ps b/res/gamedata/shaders/r5/combine_2_naa.ps index 5919ddb7a1f..63753a393ee 100644 Binary files a/res/gamedata/shaders/r5/combine_2_naa.ps and b/res/gamedata/shaders/r5/combine_2_naa.ps differ diff --git a/res/gamedata/shaders/r5/combine_volumetric.ps b/res/gamedata/shaders/r5/combine_volumetric.ps index c74f3dcb784..341ccb052fa 100644 Binary files a/res/gamedata/shaders/r5/combine_volumetric.ps and b/res/gamedata/shaders/r5/combine_volumetric.ps differ diff --git a/res/gamedata/shaders/r5/combine_volumetric.s b/res/gamedata/shaders/r5/combine_volumetric.s index f01a15d3828..8030e8a83fb 100644 --- a/res/gamedata/shaders/r5/combine_volumetric.s +++ b/res/gamedata/shaders/r5/combine_volumetric.s @@ -2,12 +2,16 @@ function normal (shader, t_base, t_second, t_detail) shader:begin ("combine_1", "combine_volumetric") : fog (false) : zb (false,false) - : blend (true,blend.invdestcolor,blend.one) + : blend (true,blend.one,blend.one) -- : aref (true,0) -- enable to save bandwith? : sorting (2, false) shader:dx10texture ("s_vollight", "$user$generic2") shader:dx10texture ("s_tonemap", "$user$tonemap") + shader:dx10texture ("noise_tex", "fx\\blue_noise") + shader:dx10texture ("s_position", "$user$position") + + shader:dx10sampler ("smp_linear") shader:dx10sampler ("smp_nofilter") end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/deffer_base_hud_aref_bump.ps b/res/gamedata/shaders/r5/deffer_base_hud_aref_bump.ps index bb755e006ea..b02b19c43f3 100644 Binary files a/res/gamedata/shaders/r5/deffer_base_hud_aref_bump.ps and b/res/gamedata/shaders/r5/deffer_base_hud_aref_bump.ps differ diff --git a/res/gamedata/shaders/r5/deffer_base_hud_flat.ps b/res/gamedata/shaders/r5/deffer_base_hud_flat.ps index 3633abcafd1..1ecaa38a4ef 100644 Binary files a/res/gamedata/shaders/r5/deffer_base_hud_flat.ps and b/res/gamedata/shaders/r5/deffer_base_hud_flat.ps differ diff --git a/res/gamedata/shaders/r5/deffer_grass.vs b/res/gamedata/shaders/r5/deffer_grass.vs index 799d406efe4..b8ef9322e6a 100644 --- a/res/gamedata/shaders/r5/deffer_grass.vs +++ b/res/gamedata/shaders/r5/deffer_grass.vs @@ -1,3 +1,5 @@ +#define SSFX_WIND_ISGRASS + #include "common.h" #include "check_screenspace.h" @@ -9,6 +11,12 @@ float4 wave; // cx,cy,cz,tm float4 dir2D; float4 array[61*4]; +float4 wind; + +#ifdef SSFX_WIND + #include "screenspace_wind.h" +#endif + v2p_bumped main (v_detail v) { v2p_bumped O; @@ -20,23 +28,26 @@ v2p_bumped main (v_detail v) float4 c0 = array[i+3]; // Transform pos to world coords - float4 pos; - pos.x = dot(m0, v.pos); - pos.y = dot(m1, v.pos); - pos.z = dot(m2, v.pos); - pos.w = 1; - - //Wave effect - float base = m1.w; - float dp = calc_cyclic(dot(pos, wave)); - float H = pos.y - base; // height of vertex (scaled) + float4 P; + P.x = dot(m0, v.pos); + P.y = dot(m1, v.pos); + P.z = dot(m2, v.pos); + P.w = 1; + + float H = P.y - m1.w; // height of vertex (scaled) + +#ifndef SSFX_WIND + float dp = calc_cyclic(dot(P, wave)); float frac = v.misc.z * consts.x; // fractional float inten = H * dp; float2 result = calc_xz_wave(dir2D.xz * inten, frac); - // Add wind - pos = float4(pos.x + result.x, pos.y, pos.z + result.y, 1); - + float4 pos = float4(P.x + result.x, P.y, P.z + result.y, 1); +#else + float3 wind_result = ssfx_wind_grass(P.xyz, H, ssfx_wind_setup()); + float4 pos = float4(P.xyz + wind_result.xyz, 1); +#endif + // INTERACTIVE GRASS - SSS Update 15.4 // https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders/ #ifdef SSFX_INTER_GRASS @@ -71,10 +82,9 @@ v2p_bumped main (v_detail v) #endif // FLORA FIXES & IMPROVEMENTS - SSS Update 14.6 - // https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders/ - + // https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders/ // Fake Normal, Bi-Normal and Tangent - float3 N = normalize(float3(pos.x - m0.w, pos.y - m1.w + 1.0f, pos.z - m2.w)); + float3 N = normalize(float3(P.x - m0.w, P.y - m1.w + 1.0f, P.z - m2.w)); float3x3 xform = mul ((float3x3)m_WV, float3x3( 0,0,N.x, diff --git a/res/gamedata/shaders/r5/deffer_impl_flat.ps b/res/gamedata/shaders/r5/deffer_impl_flat.ps index 487f6f5aa8d..7690397903c 100644 Binary files a/res/gamedata/shaders/r5/deffer_impl_flat.ps and b/res/gamedata/shaders/r5/deffer_impl_flat.ps differ diff --git a/res/gamedata/shaders/r5/deffer_terrain_flat_d.vs b/res/gamedata/shaders/r5/deffer_terrain_flat_d.vs new file mode 100644 index 00000000000..d80789ddd8c --- /dev/null +++ b/res/gamedata/shaders/r5/deffer_terrain_flat_d.vs @@ -0,0 +1,67 @@ +#define USE_TDETAIL + +#include "common.h" + +#if defined(USE_R2_STATIC_SUN) && !defined(USE_LM_HEMI) +#define v_in v_static_color +#else +#define v_in v_static +#endif + + +v2p_bumped main( v_in I ) +{ + float4 w_pos = I.P ; + float2 tc = unpack_tc_base (I.tc,I.T.w,I.B.w); // copy tc + float hemi = I.Nh.w ; + + // Eye-space pos/normal + v2p_bumped O; + float3 Pe = mul (m_WV, w_pos ); + O.hpos = mul (m_WVP, w_pos ); + O.tcdh = float4 (tc.xyyy ); + O.position = float4 (Pe, hemi ); + +#if defined(USE_R2_STATIC_SUN) && !defined(USE_LM_HEMI) + O.tcdh.w = I.color.w; // (r,g,b,dir-occlusion) +#endif + + // Calculate the 3x3 transform from tangent space to eye-space + // TangentToEyeSpace = object2eye * tangent2object + // = object2eye * transpose(object2tangent) (since the inverse of a rotation is its transpose) + I.Nh = unpack_D3DCOLOR(I.Nh); + I.T = unpack_D3DCOLOR(I.T); + I.B = unpack_D3DCOLOR(I.B); + float3 N = unpack_bx4(I.Nh); // just scale (assume normal in the -.5f, .5f) + float3 T = unpack_bx4(I.T); // + float3 B = unpack_bx4(I.B); // + float3x3 xform = mul ((float3x3)m_WV, float3x3( + T.x,B.x,N.x, + T.y,B.y,N.y, + T.z,B.z,N.z + )); + // The pixel shader operates on the bump-map in [0..1] range + // Remap this range in the matrix, anyway we are pixel-shader limited :) + // ...... [ 2 0 0 0] + // ...... [ 0 2 0 0] + // ...... [ 0 0 2 0] + // ...... [-1 -1 -1 1] + // issue: strange, but it's slower :( + // issue: interpolators? dp4? VS limited? black magic? + + // Feed this transform to pixel shader + O.M1 = xform[0]; + O.M2 = xform[1]; + O.M3 = xform[2]; + +#ifdef USE_TDETAIL + O.tcdbump = O.tcdh * dt_params; // dt tc +#endif + +#ifdef USE_LM_HEMI + O.lmh = unpack_tc_lmap (I.lmh); +#endif + return O; +} + +FXVS; diff --git a/res/gamedata/shaders/r5/deffer_terrain_high_flat_d.ps b/res/gamedata/shaders/r5/deffer_terrain_high_flat_d.ps new file mode 100644 index 00000000000..12131861c0e Binary files /dev/null and b/res/gamedata/shaders/r5/deffer_terrain_high_flat_d.ps differ diff --git a/res/gamedata/shaders/r5/deffer_terrain_low_flat.ps b/res/gamedata/shaders/r5/deffer_terrain_low_flat.ps new file mode 100644 index 00000000000..ec2552bd250 Binary files /dev/null and b/res/gamedata/shaders/r5/deffer_terrain_low_flat.ps differ diff --git a/res/gamedata/shaders/r5/deffer_terrain_mid_flat.ps b/res/gamedata/shaders/r5/deffer_terrain_mid_flat.ps new file mode 100644 index 00000000000..b4b064d7316 Binary files /dev/null and b/res/gamedata/shaders/r5/deffer_terrain_mid_flat.ps differ diff --git a/res/gamedata/shaders/r5/deffer_tree_branch_bump-hq.vs b/res/gamedata/shaders/r5/deffer_tree_branch_bump-hq.vs index be330104707..6a8a7b9205d 100644 --- a/res/gamedata/shaders/r5/deffer_tree_branch_bump-hq.vs +++ b/res/gamedata/shaders/r5/deffer_tree_branch_bump-hq.vs @@ -1,4 +1,13 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 19 + * @ Description: Trees - Branches/Bushes + * @ Modified time: 2023-12-16 13:53 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + #include "common.h" +#include "check_screenspace.h" float4 benders_pos[32]; float4 benders_setup; @@ -9,6 +18,10 @@ uniform float4 consts; // {1/quant,1/quant,???,???} uniform float4 c_scale,c_bias,wind,wave; uniform float2 c_sun; // x=*, y=+ +#ifdef SSFX_WIND + #include "screenspace_wind.h" +#endif + v2p_bumped main (v_tree I) { I.Nh = unpack_D3DCOLOR(I.Nh); @@ -16,20 +29,28 @@ v2p_bumped main (v_tree I) I.B = unpack_D3DCOLOR(I.B); // Transform to world coords - float3 pos = mul (m_xform, I.P); - // + float3 pos = mul(m_xform, I.P); + float H = pos.y - m_xform._24; // height of vertex + float2 tc = (I.tc * consts).xy; + +#ifndef SSFX_WIND float base = m_xform._24 ; // take base height from matrix float dp = calc_cyclic (wave.w+dot(pos,(float3)wave)); - float H = pos.y - base ; // height of vertex (scaled, rotated, etc.) float frac = I.tc.z*consts.x; // fractional (or rigidity) float inten = H * dp; // intensity float2 result = calc_xz_wave (wind.xz*inten*2.0f, frac); + + float3 wind_result = float3(result.x, 0, result.y); +#else + float3 wind_result = ssfx_wind_tree_branches(pos, H, tc.y, ssfx_wind_setup()); +#endif + #ifdef USE_TREEWAVE - result = 0; + wind_result = 0; #endif - float4 w_pos = float4(pos.x+result.x, pos.y, pos.z+result.y, 1); - float2 tc = (I.tc * consts).xy; + float4 w_pos = float4(pos.xyz + wind_result.xyz, 1); + // INTERACTIVE GRASS ( Bushes ) - SSS Update 15.4 // https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders/ diff --git a/res/gamedata/shaders/r5/deffer_tree_bump-hq.vs b/res/gamedata/shaders/r5/deffer_tree_bump-hq.vs index 6ef7b31d049..a47ee03ef53 100644 --- a/res/gamedata/shaders/r5/deffer_tree_bump-hq.vs +++ b/res/gamedata/shaders/r5/deffer_tree_bump-hq.vs @@ -1,4 +1,13 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 19 + * @ Description: Trees - Trunk + * @ Modified time: 2023-12-16 13:58 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + #include "common.h" +#include "check_screenspace.h" uniform float3x4 m_xform ; uniform float3x4 m_xform_v ; @@ -6,6 +15,10 @@ uniform float4 consts; // {1/quant,1/quant,???,???} uniform float4 c_scale,c_bias,wind,wave; uniform float2 c_sun; // x=*, y=+ +#ifdef SSFX_WIND + #include "screenspace_wind.h" +#endif + v2p_bumped main (v_tree I) { I.Nh = unpack_D3DCOLOR(I.Nh); @@ -13,19 +26,22 @@ v2p_bumped main (v_tree I) I.B = unpack_D3DCOLOR(I.B); // Transform to world coords - float3 pos = mul (m_xform, I.P); + float3 pos = mul(m_xform, I.P); + float H = pos.y - m_xform._24; // height of vertex - // - float base = m_xform._24 ; // take base height from matrix +#ifndef SSFX_WIND float dp = calc_cyclic (wave.w+dot(pos,(float3)wave)); - float H = pos.y - base ; // height of vertex (scaled, rotated, etc.) float frac = I.tc.z*consts.x; // fractional (or rigidity) float inten = H * dp; // intensity - float2 result = calc_xz_wave (wind.xz*inten, frac); + float2 wind_result = calc_xz_wave (wind.xz*inten, frac); +#else + float2 wind_result = ssfx_wind_tree_trunk(pos, H, ssfx_wind_setup()).xy; +#endif + #ifdef USE_TREEWAVE - result = 0; + wind_result = 0; #endif - float4 w_pos = float4(pos.x+result.x, pos.y, pos.z+result.y, 1); + float4 w_pos = float4(pos.x + wind_result.x, pos.y, pos.z + wind_result.y, 1); float2 tc = (I.tc * consts).xy; float hemi = clamp(I.Nh.w * c_scale.w + c_bias.w, 0.3f, 1.0f); // Limit hemi - SSS Update 14.5 // float hemi = I.Nh.w; diff --git a/res/gamedata/shaders/r5/deffer_tree_bump.vs b/res/gamedata/shaders/r5/deffer_tree_bump.vs index 1f58510da51..8230796ee38 100644 --- a/res/gamedata/shaders/r5/deffer_tree_bump.vs +++ b/res/gamedata/shaders/r5/deffer_tree_bump.vs @@ -1,4 +1,13 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 19 + * @ Description: Trees - Trunk ( Burn Sections ) + * @ Modified time: 2023-12-16 13:42 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + #include "common.h" +#include "check_screenspace.h" uniform float3x4 m_xform ; uniform float3x4 m_xform_v ; @@ -6,6 +15,10 @@ uniform float4 consts; // {1/quant,1/quant,???,???} uniform float4 c_scale,c_bias,wind,wave; uniform float2 c_sun; // x=*, y=+ +#ifdef SSFX_WIND + #include "screenspace_wind.h" +#endif + v2p_bumped main (v_tree I) { I.Nh = unpack_D3DCOLOR(I.Nh); @@ -13,22 +26,24 @@ v2p_bumped main (v_tree I) I.B = unpack_D3DCOLOR(I.B); // Transform to world coords - float3 pos = mul (m_xform, I.P); + float3 pos = mul(m_xform, I.P); + float H = pos.y - m_xform._24; // height of vertex - // - float base = m_xform._24 ; // take base height from matrix +#ifndef SSFX_WIND float dp = calc_cyclic (wave.w+dot(pos,(float3)wave)); - float H = pos.y - base ; // height of vertex (scaled, rotated, etc.) float frac = I.tc.z*consts.x; // fractional (or rigidity) float inten = H * dp; // intensity - float2 result = calc_xz_wave (wind.xz*inten, frac); + float2 wind_result = calc_xz_wave (wind.xz*inten, frac); +#else + float2 wind_result = ssfx_wind_tree_trunk(pos, H, ssfx_wind_setup()).xy; +#endif + #ifdef USE_TREEWAVE - result = 0; + wind_result = 0; #endif - float4 w_pos = float4(pos.x+result.x, pos.y, pos.z+result.y, 1); + float4 w_pos = float4(pos.x + wind_result.x, pos.y, pos.z + wind_result.y, 1); float2 tc = (I.tc * consts).xy; float hemi = I.Nh.w * c_scale.w + c_bias.w; -// float hemi = I.Nh.w; // Eye-space pos/normal v2p_bumped O; diff --git a/res/gamedata/shaders/r5/details_blend.s b/res/gamedata/shaders/r5/details_blend.s index fc9f7f5bc3f..94f5837be3f 100644 --- a/res/gamedata/shaders/r5/details_blend.s +++ b/res/gamedata/shaders/r5/details_blend.s @@ -13,6 +13,10 @@ function normal (shader, t_base, t_second, t_detail) shader:dx10texture("s_base", t_base) shader:dx10texture("s_bump", "levels\\" .. opt:getLevel() .. "\\" .. t_base.."_bump") shader:dx10texture("s_bumpX", t_base.."_bump#") + + shader:dx10texture("s_waves", "fx\\wind_wave") shader:dx10sampler("smp_base") + shader:dx10sampler("smp_linear") + shader:dx10sampler("smp_linear2") end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/effects_rain.ps b/res/gamedata/shaders/r5/effects_rain.ps index f54005eee21..f01d75872bb 100644 Binary files a/res/gamedata/shaders/r5/effects_rain.ps and b/res/gamedata/shaders/r5/effects_rain.ps differ diff --git a/res/gamedata/shaders/r5/img_corrections.h b/res/gamedata/shaders/r5/img_corrections.h index 64d6cc1e651..6031ad00c8b 100644 --- a/res/gamedata/shaders/r5/img_corrections.h +++ b/res/gamedata/shaders/r5/img_corrections.h @@ -1,36 +1,28 @@ -//DISABLED FOR ACES - - #ifndef IMG_CORRECTIONS_H #define IMG_CORRECTIONS_H #include "common.h" #include "anomaly_shaders.h" -#define COLOR_GRADING_LUMINANCE float3(0.213, 0.715, 0.072) + float3 img_corrections(float3 img) { - /* //exposure img.xyz *= pp_img_corrections.x; - //do color in tonemap - //color grading (thanks KD and Crytek) - float fLum = dot(img.xyz, COLOR_GRADING_LUMINANCE)*2; - float3 cMin = 0.0; - float3 cMed = pp_img_cg.xyz; - float3 cMax = 1.0; - float3 cColor = lerp(cMin, cMed , saturate(fLum * 2.0 ) ); - cColor = lerp(cColor, cMax, saturate(fLum - 0.5 ) * 2.0 ); + //color grading (thanks KD and Crytek and Cjayho) + float fLum = dot(img.xyz, LUMINANCE_VECTOR); + float3 cColor = lerp(0.0, pp_img_cg.xyz, saturate( fLum * 2.0 ) ); + cColor = lerp( cColor, 1.0, saturate( fLum - 0.5) * 2.0 ); - //if (pp_img_cg.x > 0.0 || pp_img_cg.y > 0.0 || pp_img_cg.z > 0.0) + if (pp_img_cg.x > 0.0 || pp_img_cg.y > 0.0 || pp_img_cg.z > 0.0) { - img.xyz = saturate(lerp(img.xyz, cColor.xyz , saturate(fLum * 0.15f ) )); + img.xyz = saturate(lerp( img.xyz, cColor.xyz , saturate( fLum * 0.15 ) )); } //saturation - img.xyz = max(0, lerp(img.xyz, dot(img.xyz, LUMINANCE_VECTOR), (1.0 - pp_img_corrections.z))); - */ + img.xyz = saturate(lerp(img.xyz, dot(img.xyz, LUMINANCE_VECTOR), (1.0 - pp_img_corrections.z))); + //gamma correction - img.xyz = pow(img,(1./pp_img_corrections.y)); + img.xyz = pow(img,(1.0/pp_img_corrections.y)); //that's all :) return img.xyz; diff --git a/res/gamedata/shaders/r5/pbr_brdf.h b/res/gamedata/shaders/r5/pbr_brdf.h index 1a98ff12685..c4ca3b154a7 100644 --- a/res/gamedata/shaders/r5/pbr_brdf.h +++ b/res/gamedata/shaders/r5/pbr_brdf.h @@ -1,7 +1,7 @@ /** * @ Description: Enhanced Shaders and Color Grading 1.10 * @ Author: https://www.moddb.com/members/kennshade - * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/enhanced-shaders-and-color-grading-for-151 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ //================================================================================================= @@ -125,8 +125,6 @@ void calc_rain(inout float3 albedo, inout float3 specular, inout float rough, in { //rain based on Remember Me's implementation //float wetness = saturate(rain_params.x*rainmask); - // yohji - edited to clamp rain_density between 0-0.5, to prevent weird shading with high rain_density - //float wetness = saturate(smoothstep(0.1,0.9,clamp(rain_params.x, 0.0, 0.5)*rainmask)); float wetness = saturate(smoothstep(0.1,0.9,rain_params.x*rainmask)); float porosity = 1-saturate(material_ID*1.425); //metal material at 0, concrete at 1 @@ -249,7 +247,8 @@ float3 Lit_BRDF(float rough, float3 albedo, float3 f0, float3 V, float3 N, float specular_term *= 1.0f - ((light.r + light.g + light.b) / 3.0) * (1.0f - ssfx_lightsetup_1.x); specular_term *= lerp(1.0f, Ldynamic_color.rgb, ssfx_lightsetup_1.y); - return (diffuse_term + specular_term) * nDotL * PI; + // SSS Update 19 - Smooth Shading ( squared nDotL ) + return (diffuse_term + specular_term) * nDotL * nDotL * PI; } //================================================================================================= diff --git a/res/gamedata/shaders/r5/pp_lut.ps b/res/gamedata/shaders/r5/pp_lut.ps new file mode 100644 index 00000000000..771cc5b8ce2 Binary files /dev/null and b/res/gamedata/shaders/r5/pp_lut.ps differ diff --git a/res/gamedata/shaders/r5/rain_patch_normal.ps b/res/gamedata/shaders/r5/rain_patch_normal.ps index 56343750e61..5dc30e9f87a 100644 Binary files a/res/gamedata/shaders/r5/rain_patch_normal.ps and b/res/gamedata/shaders/r5/rain_patch_normal.ps differ diff --git a/res/gamedata/shaders/r5/screenspace_common.h b/res/gamedata/shaders/r5/screenspace_common.h index e00a0f72c38..219638fdc2b 100644 --- a/res/gamedata/shaders/r5/screenspace_common.h +++ b/res/gamedata/shaders/r5/screenspace_common.h @@ -1,7 +1,7 @@ /** * @ Version: SCREEN SPACE SHADERS - UPDATE 14 * @ Description: Main file - * @ Modified time: 2023-01-18 21:11 + * @ Modified time: 2024-04-02 06:25 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ @@ -17,7 +17,7 @@ #include "check_screenspace.h" -static const float3 ssfx_hemisphere[32] = +static const float3 ssfx_hemisphere[64] = { float3(-0.134, 0.044, -0.825), float3(0.045, -0.431, -0.529), float3(-0.537, 0.195, -0.371), float3(0.525, -0.397, 0.713), float3(0.895, 0.302, 0.139), float3(-0.613, -0.408, -0.141), @@ -30,6 +30,18 @@ static const float3 ssfx_hemisphere[32] = float3(-0.638, 0.319, 0.686), float3(-0.663, 0.230, -0.634), float3(0.235, -0.547, 0.664), float3(0.164, -0.710, 0.086), float3(-0.009, 0.493, -0.038), float3(-0.322, 0.147, -0.105), float3(-0.554, -0.725, 0.289), float3(0.534, 0.157, -0.250), + + float3(-0.234, 0.084, -0.425), float3(0.085, -0.831, -0.229), float3(-0.837, 0.295, -0.671), + float3(0.225, -0.697, 0.113), float3(0.295, 0.602, 0.239), float3(-0.413, -0.808, -0.241), + float3(0.607, 0.222, 0.269), float3(-0.219, 0.067, -0.688), float3(0.676, 0.0, 0.293), + float3(-0.00, -0.203, -0.135), float3(0.198, 0.693, 0.019), float3(0.842, -0.418, -0.193), + float3(0.526, -0.283, 0.824), float3(-0.529, -0.278, 0.484), float3(0.166, -0.707, -0.170), + float3(-0.414, 0.488, 0.288), float3(-0.489, -0.422, -0.292), float3(-0.008, -0.412, -0.321), + float3(0.153, -0.263, 0.054), float3(0.439, -0.558, 0.489), float3(-0.455, 0.158, 0.099), + float3(-0.888, 0.873, -0.681), float3(-0.192, -0.632, 0.237), float3(0.080, 0.356, -0.894), + float3(-0.438, 0.619, 0.486), float3(-0.463, 0.430, -0.434), float3(0.435, -0.547, 0.464), + float3(0.264, -0.310, 0.186), float3(-0.109, 0.893, -0.038), float3(-0.622, 0.247, -0.205), + float3(-0.500, -0.325, 0.489), float3(0.534, 0.247, -0.450) }; #ifdef USE_MSAA @@ -257,9 +269,9 @@ float3 SSFX_calc_sky(float3 dir) // Use hemi color or real sky color if the modded executable is installed. #ifndef SSFX_MODEXE - return saturate(L_hemi_color.rgb * 3.0f) * lerp(sky0, sky1, L_ambient.w); + return saturate(L_hemi_color.rgb) * lerp(sky0, sky1, L_ambient.w); #else - return saturate(sky_color.bgr * 3.0f) * lerp(sky0, sky1, L_ambient.w); + return saturate(sky_color.bgr) * lerp(sky0, sky1, L_ambient.w); #endif } diff --git a/res/gamedata/shaders/r5/screenspace_common_noise.h b/res/gamedata/shaders/r5/screenspace_common_noise.h index c166c84c073..4f68fdca15f 100644 --- a/res/gamedata/shaders/r5/screenspace_common_noise.h +++ b/res/gamedata/shaders/r5/screenspace_common_noise.h @@ -1,11 +1,18 @@ /** * @ Version: SCREEN SPACE SHADERS - UPDATE 12.5 * @ Description: Main file - Noise - * @ Modified time: 2022-11-23 14:22 + * @ Modified time: 2024-04-25 01:58 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ +float3 hash33(float3 p3) +{ + p3 = frac(p3 * float3(0.1031f, 0.1030f, 0.0973f)); + p3 += dot(p3, p3.yxz + 33.33f); + return frac((p3.xxy + p3.yxx) * p3.zyx); +} + float4 SSFX_mod289(float4 x) { return x - floor(x / 289.0f) * 289.0f; diff --git a/res/gamedata/shaders/r5/screenspace_common_ripples.h b/res/gamedata/shaders/r5/screenspace_common_ripples.h index 14b2ae724cc..b682719eb26 100644 --- a/res/gamedata/shaders/r5/screenspace_common_ripples.h +++ b/res/gamedata/shaders/r5/screenspace_common_ripples.h @@ -5,7 +5,7 @@ * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders * - * Based on the work of Sébastien Lagarde for the game "Remember Me" + * Based on the work of SĂ©bastien Lagarde for the game "Remember Me" * https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/ * * Setup : [ x: speed | y: intensity | z: ripple frequency ] diff --git a/res/gamedata/shaders/r5/screenspace_fog.h b/res/gamedata/shaders/r5/screenspace_fog.h index 205fb788c96..e270f10425e 100644 --- a/res/gamedata/shaders/r5/screenspace_fog.h +++ b/res/gamedata/shaders/r5/screenspace_fog.h @@ -1,7 +1,7 @@ /** * @ Version: SCREEN SPACE SHADERS - UPDATE 14.4 * @ Description: 2 Layers fog ( Distance + Height ) - * @ Modified time: 2023-01-30 09:14 + * @ Modified time: 2024-01-22 05:45 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ @@ -47,4 +47,14 @@ float SSFX_FOGGING(float Fog, float World_Py) float fog_extra = saturate(Fog + fog_height * (Fog * G_FOG_HEIGHT_DENSITY)); return 1.0f - fog_extra; +} + +float SSFX_CALC_FOG(float3 P) +{ + float3 WorldP = mul(m_inv_V, float4(P.xyz, 1)); + float distance = length(P.xyz); + float fog = saturate(distance * fog_params.w + fog_params.x); // Vanilla fog + float fogheight = smoothstep(G_FOG_HEIGHT, -G_FOG_HEIGHT, WorldP.y) * G_FOG_HEIGHT_INTENSITY; // Height fog + + return saturate(fog + fogheight * (fog * G_FOG_HEIGHT_DENSITY)); } \ No newline at end of file diff --git a/res/gamedata/shaders/r5/screenspace_lut.h b/res/gamedata/shaders/r5/screenspace_lut.h new file mode 100644 index 00000000000..86ac5e3c1a2 --- /dev/null +++ b/res/gamedata/shaders/r5/screenspace_lut.h @@ -0,0 +1,54 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 20 + * @ Description: LUT shader + * @ Modified time: 2024-01-22 04:12 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +// Settings +#include "settings_screenspace_LUT.h" + +// Internal -- +#define LUT_GROUPS max(1, G_CELLS_GROUPS) +#define TEXEL_SIZE float2(1.0f / G_LUT_SIZE_W, 1.0f / (G_CELLS_SIZE * LUT_GROUPS)) +#define TEXEL_HALF float2(TEXEL_SIZE.xy / 2.0f) +#define TEXEL_FIX TEXEL_SIZE.y * LUT_GROUPS + +uniform float4 ssfx_lut; + +float3 ssfx_lut_pp(float3 base_col) +{ + // Prepare LUT UVs + float3 cells = base_col * G_CELLS_SIZE - base_col; + float lut_frac = frac(cells.b); + cells.rg = TEXEL_HALF + cells.rg * TEXEL_SIZE; + cells.r += (cells.b - lut_frac) * TEXEL_FIX; + + // Final LUT UVs + float4 uvs = float4(cells.rg, cells.r + TEXEL_FIX, cells.g); + + // Group offset + float2 grp_offset = float2(0.0, ssfx_lut.y / LUT_GROUPS); + + // Sample LUTs + float3 lut_col = lerp( s_lut_atlas.Sample(smp_linear, uvs.xy + grp_offset).rgb, + s_lut_atlas.Sample(smp_linear, uvs.zw + grp_offset).rgb, + lut_frac); + +#ifdef G_ADVANCE_TRANSITION + + // Group2 offset + grp_offset = float2(0.0, ssfx_lut.z / LUT_GROUPS); + + // Sample transition LUTs + float3 SecondLUT = lerp(s_lut_atlas.Sample(smp_linear, uvs.xy + grp_offset).rgb, + s_lut_atlas.Sample(smp_linear, uvs.zw + grp_offset).rgb, + lut_frac); + + lut_col = lerp(lut_col, SecondLUT, ssfx_lut.w); +#endif + + return lerp(base_col.rgb, lut_col.rgb, ssfx_lut.x); + +} \ No newline at end of file diff --git a/res/gamedata/shaders/r5/screenspace_reflections.h b/res/gamedata/shaders/r5/screenspace_reflections.h index 48e98795a95..1eb9a6d73d0 100644 --- a/res/gamedata/shaders/r5/screenspace_reflections.h +++ b/res/gamedata/shaders/r5/screenspace_reflections.h @@ -1,46 +1,49 @@ /** - * @ Version: SCREEN SPACE SHADERS - UPDATE 18 - * @ Description: SSR implementation - * @ Modified time: 2023-09-29 06:42 + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: SSR Ray-march + * @ Modified time: 2024-06-03 09:42 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ +#ifndef SSFX_SSR_QUALITY + #define SSFX_SSR_QUALITY 0 +#endif + #include "screenspace_common.h" #include "settings_screenspace_SSR.h" +uniform float4 ssr_setup; // x: SSR Resolution | y: Blur Intensity | z: Temporal Intensity +uniform float4 ssfx_ssr_2; // x: Intensity | y: Sky Intensity | z: Weapon Intensity | w: Max Weapon Intensity uniform float4 ssfx_is_underground; +Texture2D blue_noise; + static const int2 q_ssr_steps[6] = { - int2(8,200), - int2(16,35), + int2(8,72), + int2(16,36), int2(24,18), int2(32,5), int2(48,1), int2(64,1), }; -static const float q_ssr_noise[6] = -{ - float(0.04f), - float(0.04f), - float(0.04f), - float(0.06f), - float(0.08f), - float(0.08f), -}; -float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint iSample : SV_SAMPLEINDEX) +float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, float HudMask, inout float2 noise, uint iSample : SV_SAMPLEINDEX) { float2 sky_tc = 0; float2 behind_hit = 0; // Noise to "improve" consistency between steps - float3 noise = SSFX_noise(tc * float2(70,35) * 20) * q_ssr_noise[G_SSR_QUALITY]; + float2 uv_noise = tc + timers.x * (ssr_setup.w > 0); + uv_noise.x *= screen_res.x / screen_res.y; + noise = blue_noise.Sample(smp_linear, uv_noise).x * ssr_setup.w * 0.5f * HudMask; + + noise = noise * 2 - 1; // Initialize Ray - RayTrace ssr_ray = SSFX_ray_init(ray_start_vs, ray_dir_vs, 150, q_ssr_steps[G_SSR_QUALITY].x, 1.0f); + RayTrace ssr_ray = SSFX_ray_init(ray_start_vs, ray_dir_vs, 150, q_ssr_steps[SSFX_SSR_QUALITY].x, 1.0f - noise); // Save the original step.x float ori_x = ssr_ray.r_step.x; @@ -48,9 +51,11 @@ float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint // Depth from the start of the ray float ray_depthstart = SSFX_get_depth(ssr_ray.r_start, iSample); + float2 ray_check = 0; + // Ray-march - [unroll (q_ssr_steps[G_SSR_QUALITY].x)] - for (int i = 0; i < q_ssr_steps[G_SSR_QUALITY].x; i++) + [unroll (q_ssr_steps[SSFX_SSR_QUALITY].x)] + for (int i = 0; i < q_ssr_steps[SSFX_SSR_QUALITY].x; i++) { // Ray out of screen... if (ssr_ray.r_pos.y < 0.0f || ssr_ray.r_pos.y > 1.0f) @@ -65,7 +70,7 @@ float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint } // Ray intersect check - float2 ray_check = SSFX_ray_intersect(ssr_ray, iSample); + ray_check = SSFX_ray_intersect(ssr_ray, iSample); // Sampled depth is not weapon or sky ( SKY_EPS float(0.001) ) bool NoWpnSky = ray_check.y > 1.3f; @@ -76,10 +81,10 @@ float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint // Return if ray is not reflecting backward if (ray_check.x > 0) { - if (ray_check.x <= q_ssr_steps[G_SSR_QUALITY].y) - return float4(ssr_ray.r_pos, 0, 0); + if (ray_check.x <= q_ssr_steps[SSFX_SSR_QUALITY].y) + return float4(ssr_ray.r_pos, ray_check.y, 0); -#if G_SSR_QUALITY > 2 // 1 Binary Search step in higher quality settigns ( Quality 4 & 5 ) +#if SSFX_SSR_QUALITY > 2 // 1 Binary Search step in higher quality settigns ( Quality 4 & 5 ) // Current ray pos & step to restore later... float4 prev_step = 0; @@ -97,7 +102,7 @@ float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint // Depth test... Conditions to use as reflections... if (abs(ray_check.x) <= 1.25f) - return float4(ssr_ray.r_pos, 0, 0); + return float4(ssr_ray.r_pos, ray_check.y, 0); // Restore previous ray position & step ssr_ray.r_pos = prev_step.xy; @@ -118,116 +123,52 @@ float4 SSFX_ssr_fast_ray(float3 ray_start_vs, float3 ray_dir_vs, float2 tc, uint behind_hit *= (ray_depthstart - 2.0f < ray_check.y) && NoWpnSky; } + // Step the ray - ssr_ray.r_pos += ssr_ray.r_step * (1.0f + noise.x * (1.0f - smoothstep(0, q_ssr_steps[G_SSR_QUALITY].x * 0.33f, i))); + ssr_ray.r_pos += ssr_ray.r_step; } - return float4(behind_hit, sky_tc); + return float4(behind_hit, ray_check.y, sky_tc.y); } -void SSFX_ScreenSpaceReflections(float2 tc, float4 P, float3 N, float gloss, inout float3 color, uint iSample : SV_SAMPLEINDEX) +void SSFX_ScreenSpaceReflections(float2 tc, float4 P, float3 N, float4 gloss, inout float4 color, float HudMask, inout float2 noise, uint iSample : SV_SAMPLEINDEX) { // Note: Distance falloff on "rain_patch_normal.ps" - - // Material conditions ( MAT_FLORA and Terrain for now... ) - bool m_terrain = abs(P.w - 0.95f) <= 0.02f; - bool m_flora = abs(P.w - MAT_FLORA) <= 0.04f; - // Let's start with pure gloss. - float refl_power = gloss; + // Material condition + bool m_terrain = abs(P.w - 0.95f) <= 0.02f; // Calc reflection bounce float3 inVec = normalize(P.xyz); // Incident float3 reVec = reflect(inVec , N); // Reflected - // Transform space and calc reflection vector ( Skybox & Fresnel ) - float3 nw = mul(m_inv_V, N); - float3 v2point = mul(m_inv_V, inVec); - float3 v2reflect = reflect(v2point, nw); - - // Fresnel - float fresnel = saturate (dot(v2reflect, v2point)); - float fresnel_amount = pow(fresnel, 3); - refl_power *= fresnel_amount; - float4 hit_uv = 0; // Calc SSR ray. Discard low reflective pixels - if (refl_power > 0.02f) - hit_uv = SSFX_ssr_fast_ray(P.xyz, reVec, tc, iSample); - - float3 refl_ray; - float3 reflection = 0; - float2 uvcoor = 0; - - // Sky is the reflection base... -#ifdef G_SSR_CHEAP_SKYBOX - reflection = SSFX_calc_env(v2reflect) * G_SSR_SKY_INTENSITY * !ssfx_is_underground.x; -#else - reflection = SSFX_calc_sky(v2reflect) * G_SSR_SKY_INTENSITY * !ssfx_is_underground.x; -#endif + if (gloss.w > 0.02f) + hit_uv = SSFX_ssr_fast_ray(P.xyz, reVec, tc, HudMask, noise, iSample); + + float3 reflection = gloss.rgb; // Valid UV coor? SSFX_trace_ssr_ray return 0.0f if uv is out of bounds or sky. if (all(hit_uv.xy)) { // Get scene reflection - refl_ray = SSFX_get_scene(hit_uv.xy, iSample); + float3 scene = SSFX_get_image(hit_uv.xy, iSample); - // Set reflection UV - uvcoor = hit_uv.xy; - - // Let's fade the reflection based on ray XY coor to avoid abrupt changes and glitches + // Vertical screen fade float HitFade = saturate(hit_uv.y * G_SSR_VERTICAL_SCREENFADE); - // Mix base reflection ( skybox ) with ray reflection - reflection = lerp(reflection, refl_ray, HitFade); + // Mix base reflection ( skybox if m_terrain ) with ray reflection + reflection.rgb = lerp(reflection * m_terrain, scene, HitFade); } else { - // Reset gloss. - refl_power = gloss * fresnel_amount; - - // Set reflection UV - uvcoor = hit_uv.zw; + // Keep skybox if m_terrain + float ray_fade = saturate(saturate(hit_uv.w * G_SSR_VERTICAL_SCREENFADE) + m_terrain); + reflection *= ray_fade; } - // Fade sky if !m_terrain ( Terrain MAT ) - float ray_fade = saturate(saturate(uvcoor.y * G_SSR_VERTICAL_SCREENFADE) + 1.0f * m_terrain); - - // Adjust the intensity of MAT_FLORA - refl_power *= m_flora ? G_SSR_FLORA_INTENSITY : 1.0f; - - // Weapon Attenuation factor. - float WeaponFactor = smoothstep(G_SSR_WEAPON_MAX_LENGTH - 0.2f, G_SSR_WEAPON_MAX_LENGTH, length(P.xyz)); - - // Terrain MAT overwrite WeaponFactor. - WeaponFactor = saturate(WeaponFactor + 1.0f * m_terrain); - - // Global intensity and limit max value. - float main_clamp = clamp(refl_power * G_SSR_INTENSITY, 0, G_SSR_MAX_INTENSITY); - - // Raise reflection intensity and max limit when raining. ( NOTE: Reverted to rain intensity, but improvements are on the way... ) - float rain_extra = G_SSR_WEAPON_RAIN_FACTOR * rain_params.x; - - // Weapon intensity and limit max value. - float wpn_clamp = clamp((refl_power + rain_extra) * G_SSR_WEAPON_INTENSITY, 0, G_SSR_WEAPON_MAX_INTENSITY + rain_extra); - - #ifdef G_SSR_WEAPON_REFLECT_ONLY_WITH_RAIN - wpn_clamp *= rain_params.x; - #endif - - // Lerp between general reflections and weapon reflections. - refl_power = lerp(wpn_clamp, main_clamp, WeaponFactor); - - // Apply SSR fade to reflection. - refl_power *= ray_fade; - - // 'Beefs Shader Based NVGs' optional intensity adjustment -#ifdef G_SSR_BEEFS_NVGs_ADJUSTMENT - refl_power *= saturate(1.0f - (1.0f - G_SSR_BEEFS_NVGs_ADJUSTMENT) * (shader_param_8.x > 0.0f)); -#endif - - // Add the reflection to the scene. - color = lerp(color, reflection, refl_power); + color.rgb = reflection; } \ No newline at end of file diff --git a/res/gamedata/shaders/r5/screenspace_shadows.h b/res/gamedata/shaders/r5/screenspace_shadows.h index d1c7948f8dd..d7ee49ca349 100644 --- a/res/gamedata/shaders/r5/screenspace_shadows.h +++ b/res/gamedata/shaders/r5/screenspace_shadows.h @@ -1,7 +1,7 @@ /** * @ Version: SCREEN SPACE SHADERS - UPDATE 11.3 * @ Description: SSS implementation - * @ Modified time: 2022-09-27 09:10 + * @ Modified time: 2023-12-11 08:23 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ @@ -9,6 +9,48 @@ #include "screenspace_common.h" #include "settings_screenspace_SSS.h" +float SSFX_ScreenSpaceShadows_Far(float4 P, float2 tc, uint iSample) +{ + if ( abs(P.w - MAT_FLORA) > 0.03f ) + return 1; + + // Light vector + float3 L_dir = mul(m_V, float4(-normalize(L_sun_dir_w), 0)).xyz; + + RayTrace sss_ray = SSFX_ray_init(P.xyz, L_dir, 2.5, 2, 1); + + [unroll (2)] + for (int i = 0; i < 2; i++) + { + // Break the march if ray go out of screen... + if (!SSFX_is_valid_uv(sss_ray.r_pos)) + return 1; + + // Sample current ray pos ( x = difference | y = sample depth | z = current ray len ) + float3 depth_ray = SSFX_ray_intersect(sss_ray, iSample); + + // Check depth difference + float diff = depth_ray.x; + + // No Sky + diff *= depth_ray.y > SKY_EPS; + + // Negative: Ray is closer to the camera ( not occluded ) + // Positive: Ray is beyond the depth sample ( occluded ) + if (diff > 0 && diff < 3) + { + return 0; + } + + // Step the ray + sss_ray.r_pos += sss_ray.r_step; + } + + return 1; +} + + + float SSFX_ScreenSpaceShadows(float4 P, float2 tc, uint iSample) { // Light vector diff --git a/res/gamedata/shaders/r5/screenspace_water.h b/res/gamedata/shaders/r5/screenspace_water.h index ceeb263ad6d..ae30153b7b8 100644 --- a/res/gamedata/shaders/r5/screenspace_water.h +++ b/res/gamedata/shaders/r5/screenspace_water.h @@ -1,7 +1,7 @@ /** - * @ Version: SCREEN SPACE SHADERS - UPDATE 12.6 + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 * @ Description: Water implementation - * @ Modified time: 2022-11-26 02:05 + * @ Modified time: 2024-06-14 08:39 * @ Author: https://www.moddb.com/members/ascii1457 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders */ @@ -25,10 +25,10 @@ float3 SSFX_ssr_water_ray(float3 ray_start_vs, float3 ray_dir_vs, float noise, u int prev_sign; float3 behind_hit = 0; - float RayThick = clamp( 48.0f / q_steps[G_SSR_WATER_QUALITY].x, 1.0f, 3.0f); + float RayThick = clamp( 48.0f / q_steps[SSFX_WATER_QUALITY].x, 1.0f, 3.0f); // Initialize Ray - RayTrace ssr_ray = SSFX_ray_init(ray_start_vs, ray_dir_vs, 150, q_steps[G_SSR_WATER_QUALITY].x, noise); + RayTrace ssr_ray = SSFX_ray_init(ray_start_vs, ray_dir_vs, 150, q_steps[SSFX_WATER_QUALITY].x, noise); // Save the original step.x float ori_x = ssr_ray.r_step.x; @@ -37,17 +37,17 @@ float3 SSFX_ssr_water_ray(float3 ray_start_vs, float3 ray_dir_vs, float noise, u float ray_depthstart = SSFX_get_depth(ssr_ray.r_start, iSample); // Ray-march - [unroll (q_steps[G_SSR_WATER_QUALITY].x)] - for (int st = 1; st <= q_steps[G_SSR_WATER_QUALITY].x; st++) + [unroll (q_steps[SSFX_WATER_QUALITY].x)] + for (int st = 1; st <= q_steps[SSFX_WATER_QUALITY].x; st++) { - // Ray out of screen... - if (ssr_ray.r_pos.y < 0.0f || ssr_ray.r_pos.y > 1.0f) - return 0; - // Horizontal stretch to avoid borders float2 hor = ssr_ray.r_pos.x > 0.5f ? float2(1.0f, -0.1) : float2(-0.1, 1.0f); ssr_ray.r_step.x = ori_x * lerp(hor.x, hor.y, saturate(ssr_ray.r_pos.x * 2.0f)); + // Ray out of screen... + if (!SSFX_is_valid_uv(ssr_ray.r_pos.xy)) + return 0; + // Ray intersect check ( x = difference | y = depth sample ) float2 ray_check = SSFX_ray_intersect(ssr_ray, iSample); @@ -71,7 +71,7 @@ float3 SSFX_ssr_water_ray(float3 ray_start_vs, float3 ray_dir_vs, float noise, u prev_sign = -1; // Binary Search - for (int x = 0; x < q_steps[G_SSR_WATER_QUALITY].y; x++) + for (int x = 0; x < q_steps[SSFX_WATER_QUALITY].y; x++) { // Half and flip depending on depth difference sign if (sign(ray_check.x) != prev_sign) @@ -105,7 +105,7 @@ float3 SSFX_ssr_water_ray(float3 ray_start_vs, float3 ray_dir_vs, float noise, u } // Pass through condition - bool PTh = (!NoWpnSky && ray_check.y > 0.01f && st > q_steps[G_SSR_WATER_QUALITY].x * 0.4f); + bool PTh = (!NoWpnSky && ray_check.y > 0.01f && st > q_steps[SSFX_WATER_QUALITY].x * 0.4f); // Step ray... Try to pass through closer objects ( Like weapons and sights ) ssr_ray.r_pos += ssr_ray.r_step * (1.0f + 2.5f * PTh); diff --git a/res/gamedata/shaders/r5/screenspace_wind.h b/res/gamedata/shaders/r5/screenspace_wind.h new file mode 100644 index 00000000000..8165c3321d0 --- /dev/null +++ b/res/gamedata/shaders/r5/screenspace_wind.h @@ -0,0 +1,146 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 19 + * @ Description: Wind Main File + * @ Modified time: 2023-12-23 16:05 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +uniform float4 wind_params; + +uniform float4 ssfx_wsetup_grass; // Anim Speed - Turbulence - Push - Wave +uniform float4 ssfx_wsetup_trees; // Branches Speed - Trunk Speed - Bending - Min Wind Speed +uniform float4 ssfx_wind_anim; + +Texture2D s_waves; +sampler smp_linear2; + +struct wind_setup +{ + float2 direction; + float speed; + float sqrt_speed; + + float trees_animspeed; + float trees_trunk_animspeed; + float trees_bend; + + float grass_animspeed; + float grass_turbulence; + float grass_push; + float grass_wave; +}; + +wind_setup ssfx_wind_setup() +{ + wind_setup wsetup; + + // Direction. Radians to Vector + float r = -wind_params.x + 1.57079f; + wsetup.direction = float2(cos(r),sin(r)); + + // Wind Speed + wsetup.speed = max(ssfx_wsetup_trees.w, saturate(wind_params.y * 0.001)); + wsetup.sqrt_speed = saturate(sqrt(wsetup.speed * 1.66f)); + + // Setup + wsetup.grass_animspeed = ssfx_wsetup_grass.x; + wsetup.grass_turbulence = ssfx_wsetup_grass.y; + wsetup.grass_push = ssfx_wsetup_grass.z; + wsetup.grass_wave = ssfx_wsetup_grass.w; + + wsetup.trees_animspeed = ssfx_wsetup_trees.x; + wsetup.trees_trunk_animspeed = ssfx_wsetup_trees.y; + wsetup.trees_bend = ssfx_wsetup_trees.z; + + return wsetup; +} + +#ifdef SSFX_WIND_ISGRASS + +// Flow Map - X: X-Anim | Y: Z-Anim | Z: Wind Wave | W : Detail + +float3 ssfx_wind_grass(float3 pos, float H, wind_setup W) +{ + // Height Limit. ( Add stiffness to tall grass ) + float HLimit = saturate(H * H - 0.01f) * saturate(1.0f - H * 0.1f); + + // Offset animation + float2 Offset = -ssfx_wind_anim.xy * W.grass_animspeed; + + // Sample ( The scale defines the detail of the motion ) + float3 Flow = s_waves.SampleLevel( smp_linear2, (pos.xz + Offset) * 0.018f, 0); + + // Grass Motion ( -1.0 ~ 1.0 ). Turbulence. + float2 GrassMotion = (Flow.xy * 2.0f - 1.0f) * W.grass_turbulence; + + // Apply wind direction and flow. Wind push. + float2 WindDir = Flow.z * W.direction * W.grass_push; + + // Add everything and apply height limit + float3 Final = float3(GrassMotion.x + WindDir.x, Flow.z * W.grass_wave, GrassMotion.y + WindDir.y) * W.speed * HLimit; + + return Final; +} + +#else // Non Grass + +float3 ssfx_wind_tree_trunk(float3 pos, float Tree_H, wind_setup W) +{ + // Phase ( from matrix ) + Offset + float Phase = m_xform._24 + ssfx_wind_anim.z * W.trees_trunk_animspeed; + + // Trunk wave + float TWave = (cos(Phase) * sin(Phase * 5.0f) + 0.5f) * W.trees_bend; + + // Wind speed + float WSpeed = saturate(W.sqrt_speed * 1.5f); + + // Base wind speed displacement + float Base_Bend = WSpeed * 0.006f * saturate(1.0f - Tree_H * 0.005f); + + // Intensity ( Squared height ) + Base_Bend *= Tree_H * Tree_H * TWave * WSpeed; + + // Apply direction + float2 Final = Base_Bend.xx * W.direction; + + return float3(Final, saturate((TWave + 1.0f) * 0.5)); +} + +float3 ssfx_wind_tree_branches(float3 pos, float Tree_H, float tc_y, wind_setup W) +{ + // UV Offset + float2 Offset = -ssfx_wind_anim.xy * W.trees_animspeed; + + // Sample flow map + float3 Flow = s_waves.SampleLevel( smp_linear2, (pos.xz + Offset) * 0.02f, 0); + + // Sample 2, slower and detailed + float3 Flow2 = s_waves.SampleLevel( smp_linear2, (pos.xz + Offset * 0.2f) * 0.1f, 0); + + // Branch motion [ -1.0 ~ 1.0 ] + float3 branchMotion = float3(Flow.x, Flow2.y, Flow.y) * 2.0f - 1.0f; + + // Trunk position + float3 Trunk = ssfx_wind_tree_trunk(pos, Tree_H, W); + + // Gust from trunk data. + branchMotion.xz *= Trunk.z * clamp(Tree_H * 0.1f, 1.0f, 2.5f); + + // Add wind direction + branchMotion.xz += Flow2.z * W.direction; + + // Add wind gust + branchMotion.y *= saturate(Tree_H * 0.1f); + + // Everything is limited by the UV and wind speed + branchMotion *= (1.0f - tc_y) * W.speed; + + // Add trunk animation + branchMotion.xz += Trunk.xy; + + return branchMotion; +} + +#endif \ No newline at end of file diff --git a/res/gamedata/shaders/r5/settings_screenspace_AO.h b/res/gamedata/shaders/r5/settings_screenspace_AO.h index e247fad932d..2d96d5c2a4b 100644 --- a/res/gamedata/shaders/r5/settings_screenspace_AO.h +++ b/res/gamedata/shaders/r5/settings_screenspace_AO.h @@ -1,22 +1,3 @@ // [ SETTINGS ] [ AMBIENT OCCLUSION ] -#define G_SSDO_RENDER_DIST 150.0f // Max rendering distance. - -#define G_SSDO_RADIUS 0.4f // AO radius, higher values means more occlusion coverage with less detail and intensity. ( Recommended 0.1 ~ 0.5 ) -#define G_SSDO_INTENSITY 7.0f // General AO intensity. - -#define G_SSDO_FLORA_INTENSITY 1.0f // Flora intensity. [ 1.0f = 100% ~ 2.0f = 200% ] - -#define G_SSDO_NOISE_MIN 0.2f // Minimum noise intensity. -#define G_SSDO_NOISE_MAX 1.0f // Maximum noise intensity. ( Noise increase intensity through distance ) - -#define G_SSDO_MAX_OCCLUSION 0.0f // Maximum obscurance for a pixel. 0 = full black -#define G_SSDO_SMOOTH 1.3f // AO softer. Highly occluded pixels will be more affected than low occluded ones. - -#define G_SSDO_WEAPON_LENGTH 2.0f // Maximum distance to apply G_SSDO_WEAPON_RADIUS, G_SSDO_WEAPON_INTENSITY, etc. -#define G_SSDO_WEAPON_RADIUS 0.02f // Weapon radius, higher values means more occlusion coverage with less details. -#define G_SSDO_WEAPON_INTENSITY 0.4f // Weapon intensity. [ 1.0f = 100% ] - -//#define G_SSDO_DETAILED_SEARCH // Add an extra check to the AO search. By default more detailed. ( 20% of G_SSDO_RADIUS for Scenary and 50% for weapons ) -#define G_SSDO_DETAILED_RADIUS 0.2f // Detailed search radius. [ 1.0f = 100% ] -#define G_SSDO_DETAILED_WEAPON_RADIUS 0.5f // Detailed serach radius for weapons. [ 1.0f = 100% ] \ No newline at end of file +#define G_SSDO_AO_BLUR_SAMPLES 4 \ No newline at end of file diff --git a/res/gamedata/shaders/r5/settings_screenspace_FOG.h b/res/gamedata/shaders/r5/settings_screenspace_FOG.h index 76b339f2974..0ffc67b974a 100644 --- a/res/gamedata/shaders/r5/settings_screenspace_FOG.h +++ b/res/gamedata/shaders/r5/settings_screenspace_FOG.h @@ -4,4 +4,6 @@ #define G_FOG_HEIGHT_INTENSITY 1.0f // Intensity of the ground fog. #define G_FOG_HEIGHT_DENSITY 1.3f // Density of the ground fog. -#define G_FOG_SUNCOLOR_INTENSITY 0.1f // Intensity of sun color in the fog. [ 0.0f = 0% | 1.0f = 100% ] \ No newline at end of file +#define G_FOG_SUNCOLOR_INTENSITY 0.1f // Intensity of sun color in the fog. [ 0.0f = 0% | 1.0f = 100% ] + +#define G_FOG_USE_SCATTERING // Enable/Disable fog scattering \ No newline at end of file diff --git a/res/gamedata/shaders/r5/settings_screenspace_IL.h b/res/gamedata/shaders/r5/settings_screenspace_IL.h index e518225ae83..6afa54af3b1 100644 --- a/res/gamedata/shaders/r5/settings_screenspace_IL.h +++ b/res/gamedata/shaders/r5/settings_screenspace_IL.h @@ -1,20 +1,3 @@ // [ SETTINGS ] [ INDIRECT LIGHT ] -#define G_IL_QUALITY 1 // Quality of the IL [ 0 = Very Low | 1 = Low | 2 = Normal | 3 = High ] - -#define G_IL_INTENSITY 1.0f // Intensity of the indirect ilumination -#define G_IL_SKYLIGHT_INTENSITY 0.3f // Intensity of the sky light -#define G_IL_COLOR_VIBRANCE 1.5f // Vibrance of the indirect ilumination - -#define G_IL_NOISE 0.25f // Intensity of the noise applied to the IL - -#define G_IL_RANGE 0.6f // Radius of the IL sampling [ Recommended 0.3f ~ 1.0f ] -#define G_IL_MAX_DIFFERENCE 10.0f // Maximum distance the sampled color can travel - -#define G_IL_WEAPON_LENGTH 1.5f // Maximum lenght of the weapon -#define G_IL_WEAPON_RANGE 0.015f // Weapons radius for the IL sampling - -#define G_IL_DISCARD_SAMPLE_AT 0.1f // If the intensity of the bounce is lower or equal to this value, discard the sample. ( 1.0f = 100% intensity ) - // The intensity of the bounce will vary depending on the angle of the surfaces and the distance. - -//#define G_IL_DEBUG_MODE // Uncomment if you want to check what the IL is doing \ No newline at end of file +#define G_IL_BLUR_SAMPLES 8 // Blur samples \ No newline at end of file diff --git a/res/gamedata/shaders/r5/settings_screenspace_LUT.h b/res/gamedata/shaders/r5/settings_screenspace_LUT.h new file mode 100644 index 00000000000..fe1635eec37 --- /dev/null +++ b/res/gamedata/shaders/r5/settings_screenspace_LUT.h @@ -0,0 +1,8 @@ +// [ SETTINGS ] [ LUT ] + +#define G_LUT_SIZE_W 1024.0 // Width of your LUT texture + +#define G_CELLS_SIZE 32 // Width/Height of your cell +#define G_CELLS_GROUPS 4 // Quantity of tables in your texture + +//#define G_ADVANCE_TRANSITION // Note for Modders: You can enable this option to do smooth transitions between tables in realtime. Check the script \ No newline at end of file diff --git a/res/gamedata/shaders/r5/settings_screenspace_SSR.h b/res/gamedata/shaders/r5/settings_screenspace_SSR.h index 14b6884f043..faddd0534e8 100644 --- a/res/gamedata/shaders/r5/settings_screenspace_SSR.h +++ b/res/gamedata/shaders/r5/settings_screenspace_SSR.h @@ -1,18 +1,10 @@ // [ SETTINGS ] [ SCREEN SPACE REFLECTIONS ] -#define G_SSR_QUALITY 0 // Quality of the SSR. ( 0 = Very low | 1 = Low | 2 = Medium | 3 = High | 4 = Very High | 5 = Ultra ) - #define G_SSR_VERTICAL_SCREENFADE 4.0f // Vertical fade. ( higher values = sharp gradient ) -#define G_SSR_INTENSITY 1.3f // Global reflection intensity ( 1.0f = 100% ~ 0.0f = 0% ) -#define G_SSR_MAX_INTENSITY 0.5f // Global reflection MAX intensity. -#define G_SSR_SKY_INTENSITY 0.6f // Sky reflection intensity ( 1.0f = 100% ~ 0.0f = 0% ) -#define G_SSR_FLORA_INTENSITY 0.2f // Adjust grass and tree branches intensity -#define G_SSR_TERRAIN_BUMP_INTENSITY 0.6f // Terrain bump intensity ( Lower values will generate cleaner reflections ) +#define G_SSR_MAX_INTENSITY 1.0f // Global reflection MAX intensity. +#define G_SSR_FLORA_INTENSITY 0.33f // Adjust grass and tree branches intensity -#define G_SSR_WEAPON_INTENSITY 0.5f // Weapons & arms reflection intensity. ( 1.0f = 100% ~ 0.0f = 0% ) -#define G_SSR_WEAPON_MAX_INTENSITY 0.015f // Weapons & arms MAX intensity. -#define G_SSR_WEAPON_MAX_LENGTH 1.3f // Maximum distance to apply G_SSR_WEAPON_INTENSITY. #define G_SSR_WEAPON_RAIN_FACTOR 0.2f // Weapons reflections boost when raining ( 0 to disable ) ( Affected by rain intensity ) //#define G_SSR_BEEFS_NVGs_ADJUSTMENT 0.5f // Uncomment to adjust the reflection intensity when 'Beefs Shader Based NVGs' are in use. ( Use only if Beefs NVGs addon is installed ) diff --git a/res/gamedata/shaders/r5/settings_screenspace_TERRAIN.h b/res/gamedata/shaders/r5/settings_screenspace_TERRAIN.h new file mode 100644 index 00000000000..6d162e0ab7a --- /dev/null +++ b/res/gamedata/shaders/r5/settings_screenspace_TERRAIN.h @@ -0,0 +1,14 @@ +// [ SETTINGS ] [ Terrain ] + +#define TERRAIN_WATER_LEVEL 1.0 // Max water level + +#define TERRAIN_POM_STEPS_MAX 12 // More samples generate smoother results. You can lower this value to improve performance. +#define TERRAIN_POM_STEPS_MIN 3 // Minimum quantity of steps + +#define TERRAIN_POM_AO 0.125f // Basic ambient occlusion strength +#define TERRAIN_POM_PLANE 0.5 // [ 0.5f ~ 1.0f ] +#define TERRAIN_POM_RANGE 20 // Max distance of the parallax rendering + +//#define TERRAIN_GTR_COMPATIBILITY // Read the height from the alpha channel of the color texture. + + diff --git a/res/gamedata/shaders/r5/settings_screenspace_WATER.h b/res/gamedata/shaders/r5/settings_screenspace_WATER.h index 6c8df987aaa..cdcff42df83 100644 --- a/res/gamedata/shaders/r5/settings_screenspace_WATER.h +++ b/res/gamedata/shaders/r5/settings_screenspace_WATER.h @@ -1,27 +1,13 @@ // [ SETTINGS ] [ WATER ] -#define G_SSR_WATER_QUALITY 1 // Quality of the water. ( 0 = low | 1 = medium | 2 = high | 3 = Very High | 4 = Ultra ) +#define G_SSR_PARALLAX_DISTANCE 25.0f // Max distance to render the parallax waves -#define G_SSR_WATER_WAVES 1.0f // Water waves intensity -#define G_SSR_WATER_REFLECTION 0.5f // Reflection intensity. ( 1.0f = 100% ) -#define G_SSR_WATER_REFRACTION 0.05f // Intensity of refraction distortion - -#define G_SSR_WATER_SKY_REFLECTION 1.0f // Sky reflection factor. ( 1.0f = 100% ) #define G_SSR_WATER_MAP_REFLECTION 1.0f // Objects reflection factor. ( 1.0f = 100% ) - -#define G_SSR_WATER_TEX_DISTORTION 0.2f // Water texture distortion. -#define G_SSR_WATER_TURBIDITY 3.0f // Turbidity factor. ( 0.0f = Clear water ) +#define G_SSR_WATER_SKY_REFLECTION 1.0f // Sky reflection factor. ( 1.0f = 100% ) +#define G_SSR_WATER_REFLECTION_VIBRANCE 0.6f // Reflection color vibrance ( 0 = Gray Scale ~ 1 = Full Color ) #define G_SSR_WATER_FOG_MAXDEPTH 2.0f // Maximum visibility underwater. -#define G_SSR_WATER_RAIN 1.25f // Intensity of rain ripples - -#define G_SSR_WATER_SPECULAR 6.0f // Sun/Moon specular intensity -#define G_SSR_WATER_SPECULAR_NORMAL 0.2f // Specular normal intensity. ( You may need to adjust this if you change the value of G_SSR_WATER_WAVES ) - -#define G_SSR_WATER_CAUSTICS 0.25f // Caustics intensity -#define G_SSR_WATER_CAUSTICS_SCALE 1.0f // Caustics Size - -#define G_SSR_WATER_SOFTBORDER 0.1f // Soft border factor. ( 0.0f = hard edge ) +#define G_SSR_WATER_SPECULAR_NORMAL 0.2f // Specular normal intensity. -#define G_SSR_WATER_CHEAPFRESNEL // Uncomment/comment this if you want to use a faster/accurate fresnel calc \ No newline at end of file +#define G_SSR_WATER_CAUSTICS_SCALE 1.0f // Caustics Size \ No newline at end of file diff --git a/res/gamedata/shaders/r5/shadow.h b/res/gamedata/shaders/r5/shadow.h index 51ade95f9c5..f8ff5c9901a 100644 --- a/res/gamedata/shaders/r5/shadow.h +++ b/res/gamedata/shaders/r5/shadow.h @@ -14,6 +14,8 @@ Texture2D s_smap_minmax; // 2D/cube shadowmap SamplerComparisonState smp_smap; // Special comare sampler sampler smp_jitter; +uniform float4 ssfx_shadow_bias; + Texture2D jitter0; Texture2D jitter1; Texture2D jitterMipped; @@ -213,16 +215,20 @@ float shadow_pcss( float4 tc ) #else // No blocker search ( Penumbra ), just filter - float fRatio = max(PCSS_PIXEL_MIN, 0.5f * float(PCSS_PIXEL)) / float(SMAP_size); + + float fRatio = 4.0f / float(SMAP_size); float s = 0.0; [unroll] for( uint i = 0; i < PCSS_NUM_SAMPLES; ++i ) { float2 offset = poissonDisk[i] * fRatio; - s += s_smap.SampleCmpLevelZero( smp_smap, tc.xy + offset, tc.z ).x; + float test = s_smap.SampleCmpLevelZero( smp_smap, tc.xy + offset, tc.z ).x; + s += test; } + return s / PCSS_NUM_SAMPLES; + #endif diff --git a/res/gamedata/shaders/r5/shadow_direct_terrain.vs b/res/gamedata/shaders/r5/shadow_direct_terrain.vs new file mode 100644 index 00000000000..76475b3cbc6 --- /dev/null +++ b/res/gamedata/shaders/r5/shadow_direct_terrain.vs @@ -0,0 +1,34 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 20 + * @ Description: Terrain Shader ( Shadows ) + * @ Modified time: 2024-01-13 22:30 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "common.h" + +struct a2v +{ + float4 P : POSITION; // Object-space position +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// Vertex +v2p_shadow_direct main ( a2v I ) +{ + v2p_shadow_direct O; + + // Apply a small offset to avoid the Parallax depth offset. + float4 pos = I.P; + pos.y -= 0.1f; + + O.hpos = mul (m_WVP, pos ); + + +#ifndef USE_HWSMAP + O.depth = O.hpos.z; +#endif + return O; +} +FXVS; diff --git a/res/gamedata/shaders/r5/shadow_direct_tree.vs b/res/gamedata/shaders/r5/shadow_direct_tree.vs index b2a25a19c24..194ca8387fc 100644 --- a/res/gamedata/shaders/r5/shadow_direct_tree.vs +++ b/res/gamedata/shaders/r5/shadow_direct_tree.vs @@ -1,54 +1,60 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 19 + * @ Description: Trees - Shadows + * @ Modified time: 2023-12-16 13:42 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + #include "common.h" uniform float3x4 m_xform; -uniform float3x4 m_xform_v; uniform float4 consts; // {1/quant,1/quant,???,???} -uniform float4 c_scale,c_bias,wind,wave; -////////////////////////////////////////////////////////////////////////////////////////// -// Vertex +#include "screenspace_wind.h" + #ifdef USE_AREF v2p_shadow_direct_aref main ( v_shadow_direct_aref I ) -#else // USE_AREF +#else v2p_shadow_direct main ( v_shadow_direct I ) -#endif // USE_AREF +#endif { #ifdef USE_AREF v2p_shadow_direct_aref O; -#else // USE_AREF +#else v2p_shadow_direct O; -#endif // USE_AREF +#endif - // Transform to world coords - float3 pos = mul (m_xform , I.P); - - // - float base = m_xform._24; // take base height from matrix - float dp = calc_cyclic (wave.w+dot(pos,(float3)wave)); - float H = pos.y - base; // height of vertex (scaled, rotated, etc.) - float inten = H * dp; // intensity - float2 result; + float3 pos = mul(m_xform , I.P); + float H = pos.y - m_xform._24; // height of vertex (scaled, rotated, etc.) + float2 tc = 0; + float3 wind_result = 0; + #ifdef USE_TREEWAVE - result = 0; -#else // USE_TREEWAVE -#ifdef USE_AREF - float frac = I.tc.z*consts.x; // fractional (or rigidity) -#else // USE_AREF - float frac = 0; -#endif // USE_AREF - result = calc_xz_wave (wind.xz*inten, frac); -#endif // USE_TREEWAVE + wind_result = 0; +#else - float4 f_pos = float4(pos.x+result.x, pos.y, pos.z+result.y, 1); + #ifdef USE_AREF + tc = (I.tc * consts).xy; + wind_result = ssfx_wind_tree_branches(pos, H, tc.y, ssfx_wind_setup()); + #else + wind_result.xz = ssfx_wind_tree_trunk(pos, H, ssfx_wind_setup()).xy; + #endif + +#endif + + float4 f_pos = float4(pos.xyz + wind_result.xyz, 1); + + O.hpos = mul(m_VP, f_pos ); - O.hpos = mul (m_VP, f_pos ); #ifdef USE_AREF - O.tc0 = (I.tc * consts).xy; // + result; -#endif // USE_AREF + O.tc0 = tc; +#endif + #ifndef USE_HWSMAP O.depth = O.hpos.z; #endif - return O; + return O; } -FXVS; +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_ao.ps b/res/gamedata/shaders/r5/ssfx_ao.ps new file mode 100644 index 00000000000..7070ce9e0e5 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ao.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_ao_blur.ps b/res/gamedata/shaders/r5/ssfx_ao_blur.ps new file mode 100644 index 00000000000..4d68dfd5277 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ao_blur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_hud_motion.ps b/res/gamedata/shaders/r5/ssfx_hud_motion.ps new file mode 100644 index 00000000000..ba1156e7ed1 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_hud_motion.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin0.s b/res/gamedata/shaders/r5/ssfx_hud_skin0.s new file mode 100644 index 00000000000..05a9497c097 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin0.s @@ -0,0 +1,6 @@ +function normal (shader, t_base, t_second, t_detail) + shader:begin ("ssfx_hud_skin0","ssfx_hud_motion") + : fog (false) + : emissive (false) + : zb (true, true) +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin0.vs b/res/gamedata/shaders/r5/ssfx_hud_skin0.vs new file mode 100644 index 00000000000..1bdbca04239 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin0.vs @@ -0,0 +1,31 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: HUD Motion Vectors ( RM_SINGLE ) + * @ Modified time: 2024-07-18 07:26 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "ssfx_skin_hud.h" + +float4x4 m_bone; // Bone matrix +float4x4 m_WVP_prev; + +v2p_hud _main( v_model_hud I, float3 psp ) +{ + v2p_hud O; + + O.HPos = mul( m_WVP, I.P ); + + // Apply bone matrix + float3 Pbone = mul( m_bone, I.P ); + + O.PC = O.HPos; // Current + O.PP = mul(m_WVP_prev, float4(Pbone, 1.0f)); // Previous + + return O; +} + +v2p_hud main(v_model_hud v) { return _main(v, 0); } + +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin1.s b/res/gamedata/shaders/r5/ssfx_hud_skin1.s new file mode 100644 index 00000000000..df1f29b2635 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin1.s @@ -0,0 +1,6 @@ +function normal (shader, t_base, t_second, t_detail) + shader:begin ("ssfx_hud_skin1","ssfx_hud_motion") + : fog (false) + : emissive (false) + : zb (true, true) +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin1.vs b/res/gamedata/shaders/r5/ssfx_hud_skin1.vs new file mode 100644 index 00000000000..68e4dbd2dab --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin1.vs @@ -0,0 +1,27 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: HUD Motion Vectors ( RM_SKINNING_1B ) + * @ Modified time: 2024-07-06 04:10 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "ssfx_skin_hud.h" + +float4x4 m_WVP_prev; + +v2p_hud _main( v_model_hud I ) +{ + v2p_hud O; + + O.HPos = mul( m_WVP, I.P ); + + O.PC = O.HPos; // Current + O.PP = mul(m_WVP_prev, I.P_prev); // Previous + + return O; +} + +v2p_hud main(v_model_skinned_1 v) { return _main(skinning_1(v)); } + +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin2.s b/res/gamedata/shaders/r5/ssfx_hud_skin2.s new file mode 100644 index 00000000000..688630f4c2d --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin2.s @@ -0,0 +1,6 @@ +function normal (shader, t_base, t_second, t_detail) + shader:begin ("ssfx_hud_skin2","ssfx_hud_motion") + : fog (false) + : emissive (false) + : zb (true, true) +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin2.vs b/res/gamedata/shaders/r5/ssfx_hud_skin2.vs new file mode 100644 index 00000000000..e5cfa255aff --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin2.vs @@ -0,0 +1,27 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: HUD Motion Vectors ( RM_SKINNING_2B ) + * @ Modified time: 2024-07-06 04:10 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "ssfx_skin_hud.h" + +float4x4 m_WVP_prev; + +v2p_hud _main( v_model_hud I ) +{ + v2p_hud O; + + O.HPos = mul( m_WVP, I.P ); + + O.PC = O.HPos; // Current + O.PP = mul(m_WVP_prev, I.P_prev); // Previous + + return O; +} + +v2p_hud main(v_model_skinned_2 v) { return _main(skinning_2(v)); } + +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin3.s b/res/gamedata/shaders/r5/ssfx_hud_skin3.s new file mode 100644 index 00000000000..1cba12b0a69 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin3.s @@ -0,0 +1,6 @@ +function normal (shader, t_base, t_second, t_detail) + shader:begin ("ssfx_hud_skin3","ssfx_hud_motion") + : fog (false) + : emissive (false) + : zb (true, true) +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin3.vs b/res/gamedata/shaders/r5/ssfx_hud_skin3.vs new file mode 100644 index 00000000000..468de7e32d0 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin3.vs @@ -0,0 +1,27 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: HUD Motion Vectors ( RM_SKINNING_3B ) + * @ Modified time: 2024-07-06 04:10 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "ssfx_skin_hud.h" + +float4x4 m_WVP_prev; + +v2p_hud _main( v_model_hud I ) +{ + v2p_hud O; + + O.HPos = mul( m_WVP, I.P ); + + O.PC = O.HPos; // Current + O.PP = mul(m_WVP_prev, I.P_prev); // Previous + + return O; +} + +v2p_hud main(v_model_skinned_3 v) { return _main(skinning_3(v)); } + +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin4.s b/res/gamedata/shaders/r5/ssfx_hud_skin4.s new file mode 100644 index 00000000000..17592ef860c --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin4.s @@ -0,0 +1,6 @@ +function normal (shader, t_base, t_second, t_detail) + shader:begin ("ssfx_hud_skin4","ssfx_hud_motion") + : fog (false) + : emissive (false) + : zb (true, true) +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_hud_skin4.vs b/res/gamedata/shaders/r5/ssfx_hud_skin4.vs new file mode 100644 index 00000000000..7e236b72220 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_hud_skin4.vs @@ -0,0 +1,27 @@ +/** + * @ Version: SCREEN SPACE SHADERS - UPDATE 21 + * @ Description: HUD Motion Vectors ( RM_SKINNING_4B ) + * @ Modified time: 2024-07-06 04:10 + * @ Author: https://www.moddb.com/members/ascii1457 + * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + */ + +#include "ssfx_skin_hud.h" + +float4x4 m_WVP_prev; + +v2p_hud _main( v_model_hud I ) +{ + v2p_hud O; + + O.HPos = mul( m_WVP, I.P ); + + O.PC = O.HPos; // Current + O.PP = mul(m_WVP_prev, I.P_prev); // Previous + + return O; +} + +v2p_hud main(v_model_skinned_4 v) { return _main(skinning_4(v)); } + +FXVS; \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_il.ps b/res/gamedata/shaders/r5/ssfx_il.ps new file mode 100644 index 00000000000..48288db9c77 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_il.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_il_blur.ps b/res/gamedata/shaders/r5/ssfx_il_blur.ps new file mode 100644 index 00000000000..b7ceb3693b3 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_il_blur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_skin_hud.h b/res/gamedata/shaders/r5/ssfx_skin_hud.h new file mode 100644 index 00000000000..732f1601cf9 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_skin_hud.h @@ -0,0 +1,322 @@ +#ifndef SKIN_H +#define SKIN_H + +#include "common.h" + +struct v_model_hud +{ + float4 P : POSITION; // (float,float,float,1) + float4 P_prev : TEXCOORD0; // (float,float,float,1) +}; + +struct v2p_hud +{ + float4 PC : POSITION; + float4 PP : TEXCOORD0; + float4 HPos : SV_Position; +}; + +//RoH & SM+ +struct v_model_skinned_0 +{ + float4 P : POSITION; // (float,float,float,1) - quantized // short4 + float3 N : NORMAL; // normal // DWORD + float3 T : TANGENT; // tangent // DWORD + float3 B : BINORMAL; // binormal // DWORD + float2 tc : TEXCOORD0; // (u,v) // short2 +}; +struct v_model_skinned_1 // 24 bytes +{ + float4 P : POSITION; // (float,float,float,1) - quantized // short4 + float4 N : NORMAL; // (nx,ny,nz,index) // DWORD + float3 T : TANGENT; // tangent // DWORD + float3 B : BINORMAL; // binormal // DWORD + float2 tc : TEXCOORD0; // (u,v) // short2 +}; +struct v_model_skinned_2 // 28 bytes +{ + float4 P : POSITION; // (float,float,float,1) - quantized // short4 + float4 N : NORMAL; // (nx,ny,nz,weight) // DWORD + float3 T : TANGENT; // tangent // DWORD + float3 B : BINORMAL; // binormal // DWORD + float4 tc : TEXCOORD0; // (u,v, w=m-index0, z=m-index1) // short4 +}; + +struct v_model_skinned_3 // 28 bytes +{ + float4 P : POSITION; // (float,float,float,1) - quantized // short4 + float4 N : NORMAL; // (nx,ny,nz,weight0) // DWORD + float4 T : TANGENT; // (tx,ty,tz,weight1) // DWORD + float4 B : BINORMAL; // (bx,by,bz,m-index2) // DWORD + float4 tc : TEXCOORD0; // (u,v, w=m-index0, z=m-index1) // short4 +}; + +struct v_model_skinned_4 // 28 bytes +{ + float4 P : POSITION; // (float,float,float,1) - quantized // short4 + float4 N : NORMAL; // (nx,ny,nz,weight0) // DWORD + float4 T : TANGENT; // (tx,ty,tz,weight1) // DWORD + float4 B : BINORMAL; // (bx,by,bz,weight2) // DWORD + float2 tc : TEXCOORD0; // (u,v) // short2 + float4 ind: TEXCOORD1; // (x=m-index0, y=m-index1, z=m-index2, w=m-index3) // DWORD +}; + +////////////////////////////////////////////////////////////////////////////////////////// + +float4 u_position (float4 v) { return float4(v.xyz, 1.0); } // -12..+12 + +////////////////////////////////////////////////////////////////////////////////////////// +//uniform float4 sbones_array [256-22] : register(vs,c22); +//tbuffer SkeletonBones +//{ + float4 sbones_array[256-22]; + float4 sbones_array_prev[256-22]; +//} + +float3 skinning_dir (float3 dir, float3 m0, float3 m1, float3 m2) +{ + float3 U = unpack_normal (dir); + return float3 + ( + dot (m0, U), + dot (m1, U), + dot (m2, U) + ); +} +float4 skinning_pos (float4 pos, float4 m0, float4 m1, float4 m2) +{ + float4 P = u_position (pos); + return float4 + ( + dot (m0, P), + dot (m1, P), + dot (m2, P), + 1 + ); +} + +v_model_hud skinning_0 (v_model_skinned_0 v) +{ + // Swizzle for D3DCOLOUR format + v.N = v.N.zyx; + v.T = v.T.zyx; + v.B = v.B.zyx; + + // skinning + v_model_hud o; + o.P = u_position (v.P); + o.P_prev = o.P; + + return o; +} +v_model_hud skinning_1 (v_model_skinned_1 v) +{ + // Swizzle for D3DCOLOUR format + v.N.xyz = v.N.zyx; + v.T.xyz = v.T.zyx; + v.B.xyz = v.B.zyx; + + // matrices + int mid = v.N.w * 255 + 0.3; + float4 m0 = sbones_array[mid+0]; + float4 m1 = sbones_array[mid+1]; + float4 m2 = sbones_array[mid+2]; + + // skinning + v_model_hud o; + o.P = skinning_pos(v.P, m0,m1,m2 ); + + // Prev Skinning + o.P_prev = skinning_pos(v.P, sbones_array_prev[mid + 0], sbones_array_prev[mid + 1], sbones_array_prev[mid + 2]); + + return o; +} +v_model_hud skinning_2 (v_model_skinned_2 v) +{ + // Swizzle for D3DCOLOUR format + v.N.xyz = v.N.zyx; + v.T.xyz = v.T.zyx; + v.B.xyz = v.B.zyx; + + // matrices + int id_0 = v.tc.z; + float4 m0_0 = sbones_array[id_0+0]; + float4 m1_0 = sbones_array[id_0+1]; + float4 m2_0 = sbones_array[id_0+2]; + int id_1 = v.tc.w; + float4 m0_1 = sbones_array[id_1+0]; + float4 m1_1 = sbones_array[id_1+1]; + float4 m2_1 = sbones_array[id_1+2]; + + // Prev Matrices + float4 m0_0_prev = sbones_array_prev[id_0 + 0]; + float4 m1_0_prev = sbones_array_prev[id_0 + 1]; + float4 m2_0_prev = sbones_array_prev[id_0 + 2]; + + float4 m0_1_prev = sbones_array_prev[id_1 + 0]; + float4 m1_1_prev = sbones_array_prev[id_1 + 1]; + float4 m2_1_prev = sbones_array_prev[id_1 + 2]; + + // lerp + float w = v.N.w; + float4 m0 = lerp(m0_0, m0_1, w); + float4 m1 = lerp(m1_0, m1_1, w); + float4 m2 = lerp(m2_0, m2_1, w); + + // Prev Lerp + float4 m0_prev = lerp(m0_0_prev, m0_1_prev, w); + float4 m1_prev = lerp(m1_0_prev, m1_1_prev, w); + float4 m2_prev = lerp(m2_0_prev, m2_1_prev, w); + + // skinning + v_model_hud o; + o.P = skinning_pos(v.P, m0,m1,m2 ); + + // Previus Skinning + o.P_prev = skinning_pos(v.P, m0_prev, m1_prev, m2_prev); + + return o; +} +v_model_hud skinning_3 (v_model_skinned_3 v) +{ + // Swizzle for D3DCOLOUR format + v.N.xyz = v.N.zyx; + v.T.xyz = v.T.zyx; + v.B.xyz = v.B.zyx; + + // matrices + int id_0 = v.tc.z; + float4 m0_0 = sbones_array[id_0+0]; + float4 m1_0 = sbones_array[id_0+1]; + float4 m2_0 = sbones_array[id_0+2]; + int id_1 = v.tc.w; + float4 m0_1 = sbones_array[id_1+0]; + float4 m1_1 = sbones_array[id_1+1]; + float4 m2_1 = sbones_array[id_1+2]; + int id_2 = v.B.w*255+0.3; + float4 m0_2 = sbones_array[id_2+0]; + float4 m1_2 = sbones_array[id_2+1]; + float4 m2_2 = sbones_array[id_2+2]; + + // Prev Matrices + float4 m0_0_prev = sbones_array_prev[id_0 + 0]; + float4 m1_0_prev = sbones_array_prev[id_0 + 1]; + float4 m2_0_prev = sbones_array_prev[id_0 + 2]; + + float4 m0_1_prev = sbones_array_prev[id_1 + 0]; + float4 m1_1_prev = sbones_array_prev[id_1 + 1]; + float4 m2_1_prev = sbones_array_prev[id_1 + 2]; + + float4 m0_2_prev = sbones_array_prev[id_2 + 0]; + float4 m1_2_prev = sbones_array_prev[id_2 + 1]; + float4 m2_2_prev = sbones_array_prev[id_2 + 2]; + + // lerp + float w0 = v.N.w; + float w1 = v.T.w; + float w2 = 1-w0-w1; + float4 m0 = m0_0*w0; + float4 m1 = m1_0*w0; + float4 m2 = m2_0*w0; + + m0 += m0_1*w1; + m1 += m1_1*w1; + m2 += m2_1*w1; + + m0 += m0_2*w2; + m1 += m1_2*w2; + m2 += m2_2*w2; + + // Prev Lerp + float4 m0_prev = m0_0_prev * w0; + float4 m1_prev = m1_0_prev * w0; + float4 m2_prev = m2_0_prev * w0; + + m0_prev += m0_1_prev * w1; + m1_prev += m1_1_prev * w1; + m2_prev += m2_1_prev * w1; + + m0_prev += m0_2_prev * w2; + m1_prev += m1_2_prev * w2; + m2_prev += m2_2_prev * w2; + + // skinning + v_model_hud o; + o.P = skinning_pos(v.P, m0,m1,m2 ); + + // Previus Skinning + o.P_prev = skinning_pos(v.P, m0_prev, m1_prev, m2_prev); + +#ifdef SKIN_COLOR + o.rgb_tint = float3 (2,0,0) ; + if (id_0==id_1) o.rgb_tint = float3(1,2,0); +#endif + return o; +} +v_model_hud skinning_4 (v_model_skinned_4 v) +{ + // Swizzle for D3DCOLOUR format + v.N.xyz = v.N.zyx; + v.T.xyz = v.T.zyx; + v.B.xyz = v.B.zyx; + v.ind.xyz = v.ind.zyx; + + // matrices + float id[4]; + float4 m[4][3]; // [bone index][matrix row or column???] + float4 m_prev[4][3]; // Prev data + + [unroll] + for (int i=0; i<4; ++i) + { + id[i] = v.ind[i]*255+0.3; + [unroll] + for (int j=0; j<3; ++j) + { + m[i][j] = sbones_array[id[i] + j]; // Current + m_prev[i][j] = sbones_array_prev[id[i] + j]; // Prev + } + } + + // lerp + float w[4]; + w[0] = v.N.w; + w[1] = v.T.w; + w[2] = v.B.w; + w[3] = 1-w[0]-w[1]-w[2]; + + // Current + float4 m0 = m[0][0] * w[0]; + float4 m1 = m[0][1] * w[0]; + float4 m2 = m[0][2] * w[0]; + + // Prev + float4 m0_prev = m_prev[0][0] * w[0]; + float4 m1_prev = m_prev[0][1] * w[0]; + float4 m2_prev = m_prev[0][2] * w[0]; + + [unroll] + for (int i=1; i<4; ++i) + { + // Current + m0 += m[i][0]*w[i]; + m1 += m[i][1]*w[i]; + m2 += m[i][2]*w[i]; + + // Prev + m0_prev += m_prev[i][0] * w[i]; + m1_prev += m_prev[i][1] * w[i]; + m2_prev += m_prev[i][2] * w[i]; + } + + // skinning + v_model_hud o; + o.P = skinning_pos(v.P, m0,m1,m2 ); + + // Previus Skinning + o.P_prev = skinning_pos(v.P, m0_prev, m1_prev, m2_prev); + + return o; +} + +#endif \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_ssr.ps b/res/gamedata/shaders/r5/ssfx_ssr.ps new file mode 100644 index 00000000000..9914c822037 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ssr.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_ssr_blur.ps b/res/gamedata/shaders/r5/ssfx_ssr_blur.ps new file mode 100644 index 00000000000..5cba7542953 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ssr_blur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_ssr_combine.ps b/res/gamedata/shaders/r5/ssfx_ssr_combine.ps new file mode 100644 index 00000000000..59f94b764d9 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ssr_combine.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_ssr_gloss.ps b/res/gamedata/shaders/r5/ssfx_ssr_gloss.ps new file mode 100644 index 00000000000..a6f812ca522 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ssr_gloss.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_ssr_noblur.ps b/res/gamedata/shaders/r5/ssfx_ssr_noblur.ps new file mode 100644 index 00000000000..49b7b8fc59d Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_ssr_noblur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_volumetric_blur.ps b/res/gamedata/shaders/r5/ssfx_volumetric_blur.ps new file mode 100644 index 00000000000..3ea873dec37 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_volumetric_blur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_water.ps b/res/gamedata/shaders/r5/ssfx_water.ps new file mode 100644 index 00000000000..02ef395c8bc Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_water.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_water.s b/res/gamedata/shaders/r5/ssfx_water.s new file mode 100644 index 00000000000..c9898d4eb09 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_water.s @@ -0,0 +1,36 @@ +-- @ Version: SCREEN SPACE SHADERS - UPDATE 21 +-- @ Description: Water - Shader Config +-- @ Author: https://www.moddb.com/members/ascii1457 +-- @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + +function normal(shader, t_base, t_second, t_detail) + shader :begin ("ssfx_water","ssfx_water") + :sorting (2, false) + :blend (true,blend.srcalpha,blend.invsrcalpha) + :zb (true,false) + :distort (true) + :fog (true) + + shader:dx10texture ("s_position", "$user$position") + shader:dx10texture ("s_diffuse", "$user$albedo") + shader:dx10texture ("s_accumulator", "$user$accum") + shader:dx10texture ("s_rimage", "$user$generic_temp") + + +shader:dx10texture ("s_perlin", "water\\water_perlin") +shader:dx10texture ("s_water_ssr_noblur", "$user$ssfx_water") + + shader:dx10texture ("s_water_ssr", "$user$ssfx_temp") + shader:dx10texture ("s_water_height", "$user$ssfx_water_waves") + + shader:dx10texture ("s_base", "water\\water_water") + shader:dx10texture ("s_nmap", "fx\\water_normal") + + shader:dx10texture ("s_rainsplash", "fx\\water_sbumpvolume") + shader:dx10texture ("s_watercaustics", "fx\\water_caustics") + shader:dx10texture ("s_wind", "fx\\water_wind") + + shader:dx10sampler ("smp_base") + shader:dx10sampler ("smp_linear") + shader:dx10sampler ("smp_nofilter") +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_water.vs b/res/gamedata/shaders/r5/ssfx_water.vs new file mode 100644 index 00000000000..16e6e6b5921 --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_water.vs @@ -0,0 +1,87 @@ +#include "common.h" + +uniform float4 shader_param_7; + +struct v_vert +{ + float4 P : POSITION; // (float,float,float,1) + float4 N : NORMAL; // (nx,ny,nz,hemi occlusion) + float4 T : TANGENT; + float4 B : BINORMAL; + float4 color : COLOR0; // (r,g,b,dir-occlusion) + int2 uv : TEXCOORD0; // (u0,v0) +}; + +struct vf +{ + float2 tbase : TEXCOORD0; // base + float4 tnorm0 : TEXCOORD1; // nm0 + float3 position_w : TEXCOORD2; // nm1 + float3 M1 : TEXCOORD3; + float3 M2 : TEXCOORD4; + float3 M3 : TEXCOORD5; + float3 v2point_w : TEXCOORD6; + float4 tctexgen : TEXCOORD7; + float4 c0 : COLOR0; + float fog : FOG; + float4 hpos : SV_Position; +}; + +uniform float4x4 m_texgen; + +vf main (v_vert v) +{ + v.N = unpack_D3DCOLOR(v.N); + v.T = unpack_D3DCOLOR(v.T); + v.B = unpack_D3DCOLOR(v.B); + v.color = unpack_D3DCOLOR(v.color); + + vf o; + + float4 P = v.P; + o.position_w = P.xyz; + + //P = watermove(P); + + o.v2point_w = P - eye_position; + o.tbase = unpack_tc_base(v.uv * 1.5f, v.T.w, v.B.w); + + // Calculate the 3x3 transform from tangent space to eye-space + // TangentToEyeSpace = object2eye * tangent2object + // = object2eye * transpose(object2tangent) (since the inverse of a rotation is its transpose) + float3 N = unpack_bx2(v.N); + float3 T = unpack_bx2(v.T); + float3 B = unpack_bx2(v.B); + float3x3 xform = mul((float3x3)m_W, float3x3( + T.x,B.x,N.x, + T.y,B.y,N.y, + T.z,B.z,N.z + )); + // The pixel shader operates on the bump-map in [0..1] range + // Remap this range in the matrix, anyway we are pixel-shader limited :) + // ...... [ 2 0 0 0] + // ...... [ 0 2 0 0] + // ...... [ 0 0 2 0] + // ...... [-1 -1 -1 1] + // issue: strange, but it's slower :( + // issue: interpolators? dp4? VS limited? black magic? + + // Feed this transform to pixel shader + o.M1 = xform[0]; + o.M2 = xform[1]; + o.M3 = xform[2]; + + float3 L_rgb = v.color.xyz; // precalculated RGB lighting + float3 L_hemi = v_hemi(N) * v.N.w; // hemisphere + float3 L_sun = v_sun(N) * v.color.w; // sun + float3 L_final = L_rgb + L_hemi + L_sun + L_ambient; + + o.hpos = mul(m_VP, P); + o.fog = saturate(calc_fogging(v.P)); + o.c0 = float4(L_final,1); + + o.tctexgen = mul( m_texgen, P); + float3 Pe = mul(m_V, P); + o.tctexgen.z = Pe.z; + return o; +} \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_water_blur.ps b/res/gamedata/shaders/r5/ssfx_water_blur.ps new file mode 100644 index 00000000000..90ca0b6552e Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_water_blur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_water_noblur.ps b/res/gamedata/shaders/r5/ssfx_water_noblur.ps new file mode 100644 index 00000000000..65d4782b0a6 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_water_noblur.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_water_ssr.ps b/res/gamedata/shaders/r5/ssfx_water_ssr.ps new file mode 100644 index 00000000000..e5a68ac06a7 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_water_ssr.ps differ diff --git a/res/gamedata/shaders/r5/ssfx_water_ssr.s b/res/gamedata/shaders/r5/ssfx_water_ssr.s new file mode 100644 index 00000000000..752e4b01f9a --- /dev/null +++ b/res/gamedata/shaders/r5/ssfx_water_ssr.s @@ -0,0 +1,23 @@ +-- @ Version: SCREEN SPACE SHADERS - UPDATE 21 +-- @ Description: Water SSR - Shader Config +-- @ Author: https://www.moddb.com/members/ascii1457 +-- @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders + +function normal(shader, t_base, t_second, t_detail) + shader :begin ("water_regular","ssfx_water_ssr") + :sorting (2, false) + :zb (true,false) + :distort (true) + :fog (true) + + shader:dx10texture ("ssr_image", "$user$ssfx_water") + + shader:dx10texture ("sky_s0", "$user$sky0") + shader:dx10texture ("sky_s1", "$user$sky1") + shader:dx10texture ("s_position", "$user$position") + shader:dx10texture ("s_rimage", "$user$generic_temp") + shader:dx10texture ("s_bluenoise", "fx\\blue_noise") + + shader:dx10sampler ("smp_linear") + shader:dx10sampler ("smp_nofilter") +end \ No newline at end of file diff --git a/res/gamedata/shaders/r5/ssfx_water_waves.ps b/res/gamedata/shaders/r5/ssfx_water_waves.ps new file mode 100644 index 00000000000..7a30a911da5 Binary files /dev/null and b/res/gamedata/shaders/r5/ssfx_water_waves.ps differ diff --git a/res/gamedata/shaders/r5/water.ps b/res/gamedata/shaders/r5/water.ps index 0bb9134af76..cd60803a652 100644 Binary files a/res/gamedata/shaders/r5/water.ps and b/res/gamedata/shaders/r5/water.ps differ diff --git a/res/gamedata/shaders/r5/water.vs b/res/gamedata/shaders/r5/water.vs index 233668cabbe..ceb7dd740da 100644 --- a/res/gamedata/shaders/r5/water.vs +++ b/res/gamedata/shaders/r5/water.vs @@ -45,7 +45,7 @@ vf main (v_vert v) float4 P = v.P; // world o.position_w = P.xyz; - P = watermove(P); + //P = watermove(P); o.v2point_w = P-eye_position; o.tbase = unpack_tc_base(v.uv,v.T.w,v.B.w); // copy tc diff --git a/res/gamedata/textures/detail/detail_grnd_asphalt_height.dds b/res/gamedata/textures/detail/detail_grnd_asphalt_height.dds new file mode 100644 index 00000000000..8410104e223 Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_asphalt_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_cracked_height.dds b/res/gamedata/textures/detail/detail_grnd_cracked_height.dds new file mode 100644 index 00000000000..d7fef08215a Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_cracked_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_earth_height.dds b/res/gamedata/textures/detail/detail_grnd_earth_height.dds new file mode 100644 index 00000000000..db5731002df Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_earth_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_grass_height.dds b/res/gamedata/textures/detail/detail_grnd_grass_height.dds new file mode 100644 index 00000000000..56efb6ddce9 Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_grass_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_leaves_height.dds b/res/gamedata/textures/detail/detail_grnd_leaves_height.dds new file mode 100644 index 00000000000..605d96eb60d Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_leaves_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_pebbles_height.dds b/res/gamedata/textures/detail/detail_grnd_pebbles_height.dds new file mode 100644 index 00000000000..66e068975b9 Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_pebbles_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_plates_height.dds b/res/gamedata/textures/detail/detail_grnd_plates_height.dds new file mode 100644 index 00000000000..74e70a69374 Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_plates_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_sand_height.dds b/res/gamedata/textures/detail/detail_grnd_sand_height.dds new file mode 100644 index 00000000000..5cc95c369b8 Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_sand_height.dds differ diff --git a/res/gamedata/textures/detail/detail_grnd_yantar_height.dds b/res/gamedata/textures/detail/detail_grnd_yantar_height.dds new file mode 100644 index 00000000000..c3413828dde Binary files /dev/null and b/res/gamedata/textures/detail/detail_grnd_yantar_height.dds differ diff --git a/res/gamedata/textures/fx/water_height.dds b/res/gamedata/textures/fx/water_height.dds new file mode 100644 index 00000000000..1b9eaf59f08 Binary files /dev/null and b/res/gamedata/textures/fx/water_height.dds differ diff --git a/res/gamedata/textures/fx/water_wind.dds b/res/gamedata/textures/fx/water_wind.dds new file mode 100644 index 00000000000..85b0da786ab Binary files /dev/null and b/res/gamedata/textures/fx/water_wind.dds differ diff --git a/res/gamedata/textures/fx/wind_wave.dds b/res/gamedata/textures/fx/wind_wave.dds new file mode 100644 index 00000000000..4bf353cb0b4 Binary files /dev/null and b/res/gamedata/textures/fx/wind_wave.dds differ diff --git a/res/gamedata/textures/grnd/grnd_rocks_02_bump.dds b/res/gamedata/textures/grnd/grnd_rocks_02_bump.dds new file mode 100644 index 00000000000..35ecfa5d42d Binary files /dev/null and b/res/gamedata/textures/grnd/grnd_rocks_02_bump.dds differ diff --git a/res/gamedata/textures/levels/jupiter/build_details_bump.dds b/res/gamedata/textures/levels/jupiter/build_details_bump.dds new file mode 100644 index 00000000000..e7c958367dd Binary files /dev/null and b/res/gamedata/textures/levels/jupiter/build_details_bump.dds differ diff --git a/res/gamedata/textures/levels/pripyat/build_details_bump.dds b/res/gamedata/textures/levels/pripyat/build_details_bump.dds new file mode 100644 index 00000000000..e6e5c445d94 Binary files /dev/null and b/res/gamedata/textures/levels/pripyat/build_details_bump.dds differ diff --git a/res/gamedata/textures/levels/zaton/build_details_bump.dds b/res/gamedata/textures/levels/zaton/build_details_bump.dds new file mode 100644 index 00000000000..1c45ad71a65 Binary files /dev/null and b/res/gamedata/textures/levels/zaton/build_details_bump.dds differ diff --git a/res/gamedata/textures/shaders/lut_atlas.dds b/res/gamedata/textures/shaders/lut_atlas.dds new file mode 100644 index 00000000000..988239e27c3 Binary files /dev/null and b/res/gamedata/textures/shaders/lut_atlas.dds differ diff --git a/res/gamedata/textures/terrain/default_lod_textures.dds b/res/gamedata/textures/terrain/default_lod_textures.dds new file mode 100644 index 00000000000..7bef7bf77e7 Binary files /dev/null and b/res/gamedata/textures/terrain/default_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_bar_lod_textures.dds b/res/gamedata/textures/terrain/terrain_bar_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_bar_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_darkvalley_lod_textures.dds b/res/gamedata/textures/terrain/terrain_darkvalley_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_darkvalley_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_dry_gully_1_lod_textures.dds b/res/gamedata/textures/terrain/terrain_dry_gully_1_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_dry_gully_1_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_escape_lod_textures.dds b/res/gamedata/textures/terrain/terrain_escape_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_escape_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_garbage_new_lod_textures.dds b/res/gamedata/textures/terrain/terrain_garbage_new_lod_textures.dds new file mode 100644 index 00000000000..38c65d9504e Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_garbage_new_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_gr.thm b/res/gamedata/textures/terrain/terrain_gr.thm new file mode 100644 index 00000000000..bd41b862b03 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_gr.thm differ diff --git a/res/gamedata/textures/terrain/terrain_jupiter_lod_textures.dds b/res/gamedata/textures/terrain/terrain_jupiter_lod_textures.dds new file mode 100644 index 00000000000..8ee1d23778a Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_jupiter_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_marsh_lod_textures.dds b/res/gamedata/textures/terrain/terrain_marsh_lod_textures.dds new file mode 100644 index 00000000000..c2bfddd6963 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_marsh_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_pole.thm b/res/gamedata/textures/terrain/terrain_pole.thm new file mode 100644 index 00000000000..117d80a2efc Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_pole.thm differ diff --git a/res/gamedata/textures/terrain/terrain_pole_lod_textures.dds b/res/gamedata/textures/terrain/terrain_pole_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_pole_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_poligon2_lod_textures.dds b/res/gamedata/textures/terrain/terrain_poligon2_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_poligon2_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_radar_2_lod_textures.dds b/res/gamedata/textures/terrain/terrain_radar_2_lod_textures.dds new file mode 100644 index 00000000000..bfdfa4df0e6 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_radar_2_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_red_forest_lod_textures.dds b/res/gamedata/textures/terrain/terrain_red_forest_lod_textures.dds new file mode 100644 index 00000000000..387a4802ef9 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_red_forest_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_yantar_lod_textures.dds b/res/gamedata/textures/terrain/terrain_yantar_lod_textures.dds new file mode 100644 index 00000000000..387a4802ef9 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_yantar_lod_textures.dds differ diff --git a/res/gamedata/textures/terrain/terrain_zaton.thm b/res/gamedata/textures/terrain/terrain_zaton.thm new file mode 100644 index 00000000000..40f90521dd1 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_zaton.thm differ diff --git a/res/gamedata/textures/terrain/terrain_zaton_lod_textures.dds b/res/gamedata/textures/terrain/terrain_zaton_lod_textures.dds new file mode 100644 index 00000000000..9aa144b2b90 Binary files /dev/null and b/res/gamedata/textures/terrain/terrain_zaton_lod_textures.dds differ diff --git a/res/gamedata/textures/water/water_perlin.dds b/res/gamedata/textures/water/water_perlin.dds new file mode 100644 index 00000000000..a4d28c328f7 Binary files /dev/null and b/res/gamedata/textures/water/water_perlin.dds differ diff --git a/src/Layers/xrRender/Blender_Recorder_StandartBinding.cpp b/src/Layers/xrRender/Blender_Recorder_StandartBinding.cpp index b2c094b07d3..68b64aa5323 100644 --- a/src/Layers/xrRender/Blender_Recorder_StandartBinding.cpp +++ b/src/Layers/xrRender/Blender_Recorder_StandartBinding.cpp @@ -378,6 +378,24 @@ extern ENGINE_API Fvector4 ps_ssfx_wetsurfaces_2; extern ENGINE_API int ps_ssfx_is_underground; extern ENGINE_API Fvector4 ps_ssfx_lightsetup_1; +extern ENGINE_API float ps_ssfx_hud_hemi; +extern ENGINE_API Fvector4 ps_ssfx_il; +extern ENGINE_API Fvector4 ps_ssfx_il_setup1; +extern ENGINE_API Fvector4 ps_ssfx_ao; +extern ENGINE_API Fvector4 ps_ssfx_ao_setup1; +extern ENGINE_API Fvector4 ps_ssfx_water; +extern ENGINE_API Fvector4 ps_ssfx_water_setup1; +extern ENGINE_API Fvector4 ps_ssfx_water_setup2; + +extern ENGINE_API Fvector4 ps_ssfx_volumetric; +extern ENGINE_API Fvector4 ps_ssfx_ssr_2; +extern ENGINE_API Fvector4 ps_ssfx_terrain_offset; + +extern ENGINE_API Fvector3 ps_ssfx_shadow_bias; +extern ENGINE_API Fvector4 ps_ssfx_lut; +extern ENGINE_API Fvector4 ps_ssfx_wind_grass; +extern ENGINE_API Fvector4 ps_ssfx_wind_trees; + class cl_inv_v : public R_constant_setup { Fmatrix result; @@ -617,6 +635,159 @@ class ssfx_florafixes_2 : public R_constant_setup }; static ssfx_florafixes_2 binder_ssfx_florafixes_2; +class ssfx_wind_grass : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_wind_grass); + } +}; +static ssfx_wind_grass binder_ssfx_wind_grass; + +class ssfx_wind_trees : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_wind_trees); + } +}; +static ssfx_wind_trees binder_ssfx_wind_trees; + +class ssfx_wind_anim : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, g_pGamePersistent->Environment().wind_anim); + } +}; +static ssfx_wind_anim binder_ssfx_wind_anim; + +class ssfx_lut : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_lut); + } +}; +static ssfx_lut binder_ssfx_lut; + +class ssfx_shadow_bias : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_shadow_bias.x, ps_ssfx_shadow_bias.y, 0.f, 0.f); + } +}; +static ssfx_shadow_bias binder_ssfx_shadow_bias; + +class ssfx_terrain_offset : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_terrain_offset); + } +}; +static ssfx_terrain_offset binder_ssfx_terrain_offset; + +class ssfx_ssr_2 : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_ssr_2); + } +}; +static ssfx_ssr_2 binder_ssfx_ssr_2; + +class ssfx_volumetric : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_volumetric); + } +}; +static ssfx_volumetric binder_ssfx_volumetric; + +class ssfx_water : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_water); + } +}; +static ssfx_water binder_ssfx_water; + +class ssfx_water_setup1 : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_water_setup1); + } +}; +static ssfx_water_setup1 binder_ssfx_water_setup1; + +class ssfx_water_setup2 : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_water_setup2); + } +}; +static ssfx_water_setup2 binder_ssfx_water_setup2; + +class ssfx_ao : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_ao); + } +}; +static ssfx_ao binder_ssfx_ao; + +class ssfx_ao_setup1 : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_ao_setup1); + } +}; +static ssfx_ao_setup1 binder_ssfx_ao_setup1; + +class ssfx_il : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_il); + } +}; +static ssfx_il binder_ssfx_il; + +class ssfx_il_setup1 : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_il_setup1); + } +}; +static ssfx_il_setup1 binder_ssfx_il_setup1; + +class ssfx_hud_hemi : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, ps_ssfx_hud_hemi, 0.f, 0.f, 0.f); + } +}; +static ssfx_hud_hemi binder_ssfx_hud_hemi; + +class ssfx_issvp : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + cmd_list.set_c(C, Device.m_SecondViewport.IsSVPFrame() ? 1.f : 0.f, 0.f, 0.f, 0.f); + } +}; +static ssfx_issvp binder_ssfx_issvp; + // Standart constant-binding void CBlender_Compile::SetMapping() { @@ -726,4 +897,21 @@ void CBlender_Compile::SetMapping() r_Constant("ssfx_gloss", &binder_ssfx_gloss); r_Constant("ssfx_florafixes_1", &binder_ssfx_florafixes_1); r_Constant("ssfx_florafixes_2", &binder_ssfx_florafixes_2); + r_Constant("ssfx_issvp", &binder_ssfx_issvp); + r_Constant("ssfx_hud_hemi", &binder_ssfx_hud_hemi); + r_Constant("ssfx_il_setup", &binder_ssfx_il); + r_Constant("ssfx_il_setup2", &binder_ssfx_il_setup1); + r_Constant("ssfx_ao_setup", &binder_ssfx_ao); + r_Constant("ssfx_ao_setup2", &binder_ssfx_ao_setup1); + r_Constant("ssfx_water", &binder_ssfx_water); + r_Constant("ssfx_water_setup1", &binder_ssfx_water_setup1); + r_Constant("ssfx_water_setup2", &binder_ssfx_water_setup2); + r_Constant("ssfx_volumetric", &binder_ssfx_volumetric); + r_Constant("ssfx_ssr_2", &binder_ssfx_ssr_2); + r_Constant("ssfx_terrain_offset", &binder_ssfx_terrain_offset); + r_Constant("ssfx_shadow_bias", &binder_ssfx_shadow_bias); + r_Constant("ssfx_wind_anim", &binder_ssfx_wind_anim); + r_Constant("ssfx_wsetup_grass", &binder_ssfx_wind_grass); + r_Constant("ssfx_wsetup_trees", &binder_ssfx_wind_trees); + r_Constant("ssfx_lut", &binder_ssfx_lut); } diff --git a/src/Layers/xrRender/D3DXRenderBase.cpp b/src/Layers/xrRender/D3DXRenderBase.cpp index 09a46881024..de8882afd68 100644 --- a/src/Layers/xrRender/D3DXRenderBase.cpp +++ b/src/Layers/xrRender/D3DXRenderBase.cpp @@ -70,6 +70,11 @@ void D3DXRenderBase::OnDeviceDestroy(bool bKeepTextures) void D3DXRenderBase::Destroy() { + for (int id = 0; id < R__NUM_CONTEXTS; ++id) + { + contexts_pool[id].destroy(); + } + xr_delete(Resources); HW.DestroyDevice(); } diff --git a/src/Layers/xrRender/Light_Render_Direct_ComputeXFS.cpp b/src/Layers/xrRender/Light_Render_Direct_ComputeXFS.cpp index 14192e84353..77a0f8fa78f 100644 --- a/src/Layers/xrRender/Light_Render_Direct_ComputeXFS.cpp +++ b/src/Layers/xrRender/Light_Render_Direct_ComputeXFS.cpp @@ -51,8 +51,9 @@ void CLight_Compute_XFORM_and_VIS::compute_xf_spot(light* L) float intensity1 = (L->color.r * 0.2125f + L->color.g * 0.7154f + L->color.b * 0.0721f); float intensity = (intensity0 + intensity1) / 2.f; // intensity1 tends to underestimate... + // [SSS 19] Improve this code later? // compute how much duelling frusta occurs [-1..1]-> 1 + [-0.5 .. +0.5] - float duel_dot = 1.f - 0.5f * Device.vCameraDirection.dotproduct(L_dir); + //float duel_dot = 1.f - 0.5f * Device.vCameraDirection.dotproduct(L_dir); // compute how large the light is - give more texels to larger lights, assume 8m as being optimal radius float sizefactor = L->range / 8.f; // 4m = .5, 8m=1.f, 16m=2.f, 32m=4.f @@ -63,17 +64,20 @@ void CLight_Compute_XFORM_and_VIS::compute_xf_spot(light* L) // factors float factor0 = powf(ssa, 1.f / 2.f); // ssa is quadratic float factor1 = powf(intensity, 1.f / 16.f); // less perceptually important? - float factor2 = powf(duel_dot, 1.f / 4.f); // difficult to fast-change this -> visible + //float factor2 = powf(duel_dot, 1.f / 4.f); // difficult to fast-change this -> visible float factor3 = powf(sizefactor, 1.f / 4.f); // this shouldn't make much difference float factor4 = powf(widefactor, 1.f / 2.f); // make it linear ??? - float factor = ps_r2_ls_squality * factor0 * factor1 * factor2 * factor3 * factor4; + //float factor = ps_r2_ls_squality * factor0 * factor1 * factor2 * factor3 * factor4; + float factor = ps_r2_ls_squality * factor0 * factor1 * factor3 * factor4; // final size calc + extern ENGINE_API Fvector3 ps_ssfx_shadows; + u32 max_size = (u32)(RImplementation.o.smapsize <= ps_ssfx_shadows.y ? RImplementation.o.smapsize : ps_ssfx_shadows.y); u32 _size = iFloor(factor * SMAP_adapt_optimal); - if (_size < SMAP_adapt_min) - _size = SMAP_adapt_min; - if (_size > SMAP_adapt_max) - _size = SMAP_adapt_max; + if (_size < ps_ssfx_shadows.x) + _size = (u32)ps_ssfx_shadows.x; + if (_size > max_size) + _size = max_size; int _epsilon = iCeil(float(_size) * 0.01f); int _diff = _abs(int(_size) - int(_cached_size)); L->X.S.size = (_diff >= _epsilon) ? _size : _cached_size; @@ -91,10 +95,12 @@ void CLight_Compute_XFORM_and_VIS::compute_xf_spot(light* L) // _min(L->cone + deg2rad(4.5f), PI*0.98f) - Here, it is needed to enlarge the shadow map frustum to include also // displaced pixels and the pixels neighbor to the examining one. float tan_shift; - if (L->flags.type == IRender_Light::POINT) - tan_shift = deg2rad(11.5f); + if (L->flags.type == IRender_Light::OMNIPART) // [ SSS ] 0.3f fix almost all frustum problems... 0.5f was the old value ( SSS 19 ) but was causing issues? + tan_shift = 0.3f; + else if (L->flags.type == IRender_Light::POINT) + tan_shift = 0.2007129f; // deg2rad(11.5f); else - tan_shift = deg2rad(3.5f); + tan_shift = 0.0610865f; //deg2rad(3.5f); L->X.S.project.build_projection(L->cone + tan_shift, 1.f, L->virtual_size, L->range + EPS_S); L->X.S.combine.mul(L->X.S.project, L->X.S.view); diff --git a/src/Layers/xrRender/ResourceManager.cpp b/src/Layers/xrRender/ResourceManager.cpp index f7898ed8df5..7bc30fb3caf 100644 --- a/src/Layers/xrRender/ResourceManager.cpp +++ b/src/Layers/xrRender/ResourceManager.cpp @@ -233,6 +233,13 @@ Shader* CResourceManager::_cpp_Create( S.E[5] = _CreateElement(std::move(E)); } + // Hacky way to remove from the HUD mask transparent stuff. ( Let's try something better later... ) + if (GEnv.Render->hud_loading) + { + if (strstr(s_shader, "lens")) + S.E[0]->passes[0]->ps->hud_disabled = TRUE; + } + // Search equal in shaders array for (u32 it = 0; it < v_shaders.size(); it++) if (S.equal(v_shaders[it])) diff --git a/src/Layers/xrRender/Shader.cpp b/src/Layers/xrRender/Shader.cpp index e36d92aeabb..0ce2ea214f7 100644 --- a/src/Layers/xrRender/Shader.cpp +++ b/src/Layers/xrRender/Shader.cpp @@ -83,6 +83,10 @@ ShaderElement::ShaderElement() flags.bEmissive = FALSE; flags.bDistort = FALSE; flags.bWmark = FALSE; + + // SSS Custom rendering + flags.isLandscape = FALSE; + flags.isWater = FALSE; } BOOL ShaderElement::equal(ShaderElement& S) diff --git a/src/Layers/xrRender/Shader.h b/src/Layers/xrRender/Shader.h index f3dd6018489..d6b4bc75762 100644 --- a/src/Layers/xrRender/Shader.h +++ b/src/Layers/xrRender/Shader.h @@ -121,6 +121,8 @@ struct ECORE_API ShaderElement : public xr_resource_flagged u32 bEmissive : 1; u32 bDistort : 1; u32 bWmark : 1; + u32 isLandscape : 1; + u32 isWater : 1; }; Sflags flags; diff --git a/src/Layers/xrRender/SkeletonCustom.h b/src/Layers/xrRender/SkeletonCustom.h index f9cf7bd34fa..ff685800d81 100644 --- a/src/Layers/xrRender/SkeletonCustom.h +++ b/src/Layers/xrRender/SkeletonCustom.h @@ -134,6 +134,7 @@ class CKinematics : public FHierrarhyVisual, public IKinematics protected: SkeletonWMVec wallmarks; u32 wm_frame; + u32 CurrentFrame; xr_vector children_invisible; diff --git a/src/Layers/xrRender/SkeletonX.cpp b/src/Layers/xrRender/SkeletonX.cpp index d6f95c87245..c0350258609 100644 --- a/src/Layers/xrRender/SkeletonX.cpp +++ b/src/Layers/xrRender/SkeletonX.cpp @@ -10,6 +10,7 @@ #include "xrCore/FMesh.hpp" shared_str s_bones_array_const; +shared_str s_bones_array_prev_const; ////////////////////////////////////////////////////////////////////// // Body Part @@ -40,6 +41,33 @@ void CSkeletonX::_Copy(CSkeletonX* B) ////////////////////////////////////////////////////////////////////// void CSkeletonX::_Render(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u32 iOffset, u32 pCount) { + bool CalcVelocity = false; + +#ifdef USE_DX11 + + CalcVelocity = RImplementation.Target->RVelocity; + + if (CalcVelocity) + { + // Previous WVP + RCache.set_c("m_WVP_prev", RImplementation.Target->Matrix_HUD_previous); + + if (RenderMode > 1 && Device.dwFrame > Parent->CurrentFrame) + { + Parent->CurrentFrame = Device.dwFrame; + + // Save bone matrix to use next frame + for (u16 b = 0; b < Parent->LL_BoneCount(); b++) + { + CBoneInstance& Bone = Parent->LL_GetBoneInstance(b); + Bone.mRenderTransform_prev.set(Bone.mRenderTransform_temp); + Bone.mRenderTransform_temp.set(Bone.mRenderTransform); + } + } + } + +#endif + cmd_list.stat.r.s_dynamic.add(vCount); switch (RenderMode) { @@ -53,6 +81,11 @@ void CSkeletonX::_Render(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u32 iO Fmatrix W; W.mul_43(cmd_list.xforms.m_w, Parent->LL_GetTransform_R(u16(RMS_boneid))); cmd_list.set_xform_world(W); + + // Add the bone transform + if (CalcVelocity) + cmd_list.set_c("m_bone", Parent->LL_GetTransform_R(u16(RMS_boneid))); + cmd_list.set_Geometry(hGeom); cmd_list.Render(D3DPT_TRIANGLELIST, 0, 0, vCount, iOffset, pCount); cmd_list.stat.r.s_dynamic_inst.add(vCount); @@ -67,8 +100,10 @@ void CSkeletonX::_Render(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u32 iO case RM_SKINNING_4B: case RM_SKINNING_4B_HQ: { - // transfer matrices + // transfer matrices ( current and previous ) ref_constant array = cmd_list.get_c(s_bones_array_const); + ref_constant array_prev = cmd_list.get_c(s_bones_array_prev_const); + u32 count = RMS_bonecount; for (u32 mid = 0; mid < count; mid++) { @@ -77,6 +112,15 @@ void CSkeletonX::_Render(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u32 iO cmd_list.set_ca(&*array, id + 0, M._11, M._21, M._31, M._41); cmd_list.set_ca(&*array, id + 1, M._12, M._22, M._32, M._42); cmd_list.set_ca(&*array, id + 2, M._13, M._23, M._33, M._43); + + if (CalcVelocity) + { + // Previus transform + Fmatrix& Mprev = Parent->LL_GetBoneInstance(u16(mid)).mRenderTransform_prev; + cmd_list.set_ca(&*array_prev, id + 0, Mprev._11, Mprev._21, Mprev._31, Mprev._41); + cmd_list.set_ca(&*array_prev, id + 1, Mprev._12, Mprev._22, Mprev._32, Mprev._42); + cmd_list.set_ca(&*array_prev, id + 2, Mprev._13, Mprev._23, Mprev._33, Mprev._43); + } } // render @@ -153,6 +197,7 @@ void CSkeletonX::_Render_soft(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u void CSkeletonX::_Load(const char* N, IReader* data, u32& dwVertCount) { s_bones_array_const = "sbones_array"; + s_bones_array_prev_const = "sbones_array_prev"; xr_vector bids; // Load vertices diff --git a/src/Layers/xrRender/blenders/Blender_Blur.cpp b/src/Layers/xrRender/blenders/Blender_Blur.cpp index 4da1576b4e4..5c02d18e2d3 100644 --- a/src/Layers/xrRender/blenders/Blender_Blur.cpp +++ b/src/Layers/xrRender/blenders/Blender_Blur.cpp @@ -121,3 +121,261 @@ void CBlender_Blur::Compile(CBlender_Compile& C) } } #endif + + +CBlender_ssfx_ssr::CBlender_ssfx_ssr() { description.CLS = 0; } + +void CBlender_ssfx_ssr::Compile(CBlender_Compile& C) +{ + IBlender::Compile(C); + + switch (C.iElement) + { + case 0: // Do SSR + C.r_Pass("stub_screen_space", "ssfx_ssr", FALSE, FALSE, FALSE); + + C.r_dx11Texture("s_position", r2_RT_P); + C.r_dx11Texture("ssr_image", r2_RT_ssfx_ssr); // Prev Frame + C.r_dx11Texture("s_rimage", "$user$generic_temp"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + C.r_dx11Texture("s_prev_pos", r2_RT_ssfx_prevPos); + C.r_dx11Texture("s_gloss_data", r2_RT_ssfx_temp3); + + C.r_dx11Texture("blue_noise", "fx\\blue_noise"); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_rtlinear"); + C.r_dx11Sampler("smp_linear"); + + C.r_End(); + break; + + case 1: // Blur Phase 1 + C.r_Pass("stub_screen_space", "ssfx_ssr_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ssr_image", r2_RT_ssfx); + C.r_dx11Texture("s_diffuse", r2_RT_albedo); + + C.r_dx11Sampler("smp_nofilter"); + C.r_End(); + break; + + case 2: // Blur Phase 2 + C.r_Pass("stub_screen_space", "ssfx_ssr_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ssr_image", r2_RT_ssfx_temp); + C.r_dx11Texture("s_diffuse", r2_RT_albedo); + + C.r_dx11Sampler("smp_nofilter"); + C.r_End(); + break; + + case 3: // Combine + C.r_Pass("stub_screen_space", "ssfx_ssr_combine", FALSE, FALSE, FALSE); + + C.r_dx11Texture("s_position", r2_RT_P); + C.r_dx11Texture("s_rimage", "$user$generic_temp"); + + C.r_dx11Texture("ssr_image", r2_RT_ssfx_temp2); + C.r_dx11Texture("s_gloss_data", r2_RT_ssfx_temp3); + + C.r_dx11Sampler("smp_linear"); + C.r_dx11Sampler("smp_nofilter"); + C.r_End(); + + break; + + case 4: // No blur just direct to [r2_RT_ssfx_temp2] + C.r_Pass("stub_screen_space", "ssfx_ssr_noblur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ssr_image", r2_RT_ssfx); + + C.r_dx11Sampler("smp_nofilter"); + C.r_End(); + break; + + case 5: + C.r_Pass("stub_screen_space", "ssfx_ssr_gloss", FALSE, FALSE, FALSE); + + C.r_dx11Texture("s_position", r2_RT_P); + C.r_dx11Texture("s_diffuse", r2_RT_albedo); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Texture("env_s0", r2_T_envs0); + C.r_dx11Texture("env_s1", r2_T_envs1); + C.r_dx11Texture("sky_s0", r2_T_sky0); + C.r_dx11Texture("sky_s1", r2_T_sky1); + + C.r_dx11Sampler("smp_nofilter"); + C.r_End(); + break; + } +} + + + +CBlender_ssfx_volumetric_blur::CBlender_ssfx_volumetric_blur() { description.CLS = 0; } + +void CBlender_ssfx_volumetric_blur::Compile(CBlender_Compile& C) +{ + IBlender::Compile(C); + + switch (C.iElement) + { + case 0: // Blur Phase 1 + C.r_Pass("stub_screen_space", "ssfx_volumetric_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("vol_buffer", r2_RT_generic2); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 1: // Blur Phase 2 + C.r_Pass("stub_screen_space", "ssfx_volumetric_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("vol_buffer", r2_RT_ssfx_accum); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 2: // Blur Phase 1 + C.r_Pass("stub_screen_space", "ssfx_water_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("water_buffer", r2_RT_ssfx_temp); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 3: // Blur Phase 2 + C.r_Pass("stub_screen_space", "ssfx_water_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("water_buffer", r2_RT_ssfx_temp2); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 4: // No Blur + C.r_Pass("stub_screen_space", "ssfx_water_noblur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("water_buffer", r2_RT_ssfx_temp2); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 5: // Water Waves + C.r_Pass("stub_screen_space", "ssfx_water_waves", FALSE, FALSE, FALSE); + + C.r_dx11Texture("water_waves", "fx\\water_height"); + + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + } +} + +CBlender_ssfx_ao::CBlender_ssfx_ao() { description.CLS = 0; } + +void CBlender_ssfx_ao::Compile(CBlender_Compile& C) +{ + IBlender::Compile(C); + + switch (C.iElement) + { + case 0: // AO + C.r_Pass("stub_screen_space", "ssfx_ao", FALSE, FALSE, FALSE); + + C.r_dx11Texture("s_position", r2_RT_P); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + C.r_dx11Texture("ssfx_ao", r2_RT_ssfx_ao); + + C.r_dx11Texture("s_prev_pos", r2_RT_ssfx_prevPos); + + C.r_dx11Texture("jitter0", JITTER(0)); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_dx11Sampler("smp_jitter"); + + C.r_End(); + + break; + + case 1: // Blur Phase 1 + C.r_Pass("stub_screen_space", "ssfx_ao_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ao_image", r2_RT_ssfx_temp); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 2: // Blur Phase 2 + C.r_Pass("stub_screen_space", "ssfx_ao_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ao_image", r2_RT_ssfx_temp3); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + + case 3: // IL + C.r_Pass("stub_screen_space", "ssfx_il", FALSE, FALSE, FALSE); + + C.r_dx11Texture("s_accumulator", r2_RT_accum); + C.r_dx11Texture("s_position", r2_RT_P); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Texture("ssfx_ao", r2_RT_ssfx_il); + + + + C.r_dx11Texture("s_prev_pos", r2_RT_ssfx_prevPos); + + C.r_dx11Texture("jitter0", JITTER(0)); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_dx11Sampler("smp_jitter"); + + C.r_End(); + + break; + + case 4: // Blur Phase 1 + C.r_Pass("stub_screen_space", "ssfx_il_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ao_image", r2_RT_ssfx_temp2); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + + case 5: // Blur Phase 2 + C.r_Pass("stub_screen_space", "ssfx_il_blur", FALSE, FALSE, FALSE); + + C.r_dx11Texture("ao_image", r2_RT_ssfx_temp3); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); + break; + } +} diff --git a/src/Layers/xrRender/blenders/Blender_Blur.h b/src/Layers/xrRender/blenders/Blender_Blur.h index a89fd03a6eb..43d99ee191b 100644 --- a/src/Layers/xrRender/blenders/Blender_Blur.h +++ b/src/Layers/xrRender/blenders/Blender_Blur.h @@ -9,3 +9,34 @@ class CBlender_Blur : public IBlender LPCSTR getComment() override; void Compile(CBlender_Compile& C) override; }; + +// SSS +class CBlender_ssfx_ssr : public IBlender +{ +public: + CBlender_ssfx_ssr(); + ~CBlender_ssfx_ssr() override = default; + + LPCSTR getComment() override { return "ssfx_ssr"; } + void Compile(CBlender_Compile& C) override; +}; + +class CBlender_ssfx_volumetric_blur : public IBlender +{ +public: + CBlender_ssfx_volumetric_blur(); + ~CBlender_ssfx_volumetric_blur() override = default; + + LPCSTR getComment() override { return "ssfx_volumetric_blur"; } + void Compile(CBlender_Compile& C) override; +}; + +class CBlender_ssfx_ao : public IBlender +{ +public: + CBlender_ssfx_ao(); + ~CBlender_ssfx_ao() override = default; + + LPCSTR getComment() override { return "ssfx_ao"; } + void Compile(CBlender_Compile& C) override; +}; diff --git a/src/Layers/xrRender/blenders/Blender_BmmD_deferred.cpp b/src/Layers/xrRender/blenders/Blender_BmmD_deferred.cpp index 9e8ba641059..6a444d467bc 100644 --- a/src/Layers/xrRender/blenders/Blender_BmmD_deferred.cpp +++ b/src/Layers/xrRender/blenders/Blender_BmmD_deferred.cpp @@ -194,12 +194,24 @@ void CBlender_BmmD::Compile(CBlender_Compile& C) IBlender::Compile(C); // codepath is the same, only the shaders differ // ***only pixel shaders differ*** + C.SH->flags.isLandscape = FALSE; string256 mask; strconcat(sizeof(mask), mask, C.L_textures[0].c_str(), "_mask"); switch (C.iElement) { case SE_R2_NORMAL_HQ: // deffer - uber_deffer(C, true, "impl", "impl", false, oT2_Name[0] ? oT2_Name : 0, true); +#if RENDER == R_R4 + if (RImplementation.o.ssfx_terrain) + { + C.SH->flags.isLandscape = TRUE; + uber_deffer(C, true, "terrain", "terrain_high", false, oT2_Name[0] ? oT2_Name : 0, true); + } + else +#endif + { + uber_deffer(C, true, "impl", "impl", false, oT2_Name[0] ? oT2_Name : 0, true); + } + // C.r_Sampler ("s_mask", mask); // C.r_Sampler ("s_lmap", C.L_textures[1]); @@ -230,6 +242,16 @@ void CBlender_BmmD::Compile(CBlender_Compile& C) C.r_dx11Texture("s_dn_b", strconcat(sizeof(mask), mask, oB_Name, "_bump")); C.r_dx11Texture("s_dn_a", strconcat(sizeof(mask), mask, oA_Name, "_bump")); +#if RENDER == R_R4 + if (RImplementation.o.ssfx_terrain) + { + C.r_dx11Texture("s_height_r", strconcat(sizeof(mask), mask, oR_Name, "_height")); + C.r_dx11Texture("s_height_g", strconcat(sizeof(mask), mask, oG_Name, "_height")); + C.r_dx11Texture("s_height_b", strconcat(sizeof(mask), mask, oB_Name, "_height")); + C.r_dx11Texture("s_height_a", strconcat(sizeof(mask), mask, oA_Name, "_height")); + } +#endif + C.r_dx11Texture("s_puddles_normal", "fx\\water_normal"); C.r_dx11Texture("s_puddles_perlin", "fx\\puddles_perlin"); C.r_dx11Texture("s_puddles_mask", strconcat(sizeof(mask), mask, C.L_textures[0].c_str(), "_puddles_mask")); @@ -252,11 +274,44 @@ void CBlender_BmmD::Compile(CBlender_Compile& C) C.r_End(); break; case SE_R2_NORMAL_LQ: // deffer - uber_deffer(C, false, "base", "impl", false, oT2_Name[0] ? oT2_Name : 0, true); +#if RENDER == R_R4 + if (RImplementation.o.ssfx_terrain) + { + C.SH->flags.isLandscape = TRUE; + uber_deffer(C, false, "base", "terrain_mid", false, oT2_Name[0] ? oT2_Name : 0, true); + } + else +#endif + { + // Vanilla + uber_deffer(C, false, "base", "impl", false, oT2_Name[0] ? oT2_Name : 0, true); + } // C.r_Sampler ("s_lmap", C.L_textures[1]); - C.r_dx11Texture("s_lmap", C.L_textures[1]); +#if RENDER == R_R4 + if (RImplementation.o.ssfx_terrain) + { + C.r_dx11Texture("s_mask", mask); + LPSTR LodTexture = strconcat(sizeof(mask), mask, C.L_textures[0].c_str(), "_lod_textures"); + string_path fn; + if (FS.exist(fn, "$game_textures$", LodTexture, ".dds")) + { + C.r_dx11Texture("s_lod_texture", LodTexture); + } + else + { + C.r_dx11Texture("s_lod_texture", "terrain\\default_lod_textures"); + } + + C.r_dx11Sampler("smp_base"); + } + else +#endif + { + C.r_dx11Texture("s_lmap", C.L_textures[1]); + } + C.r_dx11Sampler("smp_linear"); C.r_Stencil(TRUE, D3DCMP_ALWAYS, 0xff, 0x7f, D3DSTENCILOP_KEEP, D3DSTENCILOP_REPLACE, D3DSTENCILOP_KEEP); @@ -267,12 +322,34 @@ void CBlender_BmmD::Compile(CBlender_Compile& C) case SE_R2_SHADOW: // smap // if (RImplementation.o.HW_smap) C.r_Pass ("shadow_direct_base","dumb", FALSE,TRUE,TRUE,FALSE); // else C.r_Pass ("shadow_direct_base","shadow_direct_base",FALSE); - C.r_Pass("shadow_direct_base", "dumb", FALSE, TRUE, TRUE, FALSE); +#if RENDER == R_R4 + if (RImplementation.o.ssfx_terrain) + { + C.r_Pass("shadow_direct_terrain", "dumb", FALSE, TRUE, TRUE, FALSE); + } + else +#endif + { + // Vanilla + C.r_Pass("shadow_direct_base", "dumb", FALSE, TRUE, TRUE, FALSE); + } // C.r_Sampler ("s_base",C.L_textures[0]); C.r_dx11Texture("s_base", C.L_textures[0]); C.r_dx11Sampler("smp_base"); C.r_dx11Sampler("smp_linear"); C.r_ColorWriteEnable(false, false, false, false); + C.r_End(); + break; + case SE_R2_SSFX_LQ_TERRAIN: // SSFX Low quality terrain + C.SH->flags.isLandscape = TRUE; + + uber_deffer(C, false, "base", "terrain_low", false, oT2_Name[0] ? oT2_Name : 0, true); + + C.r_dx11Sampler("smp_linear"); + + C.r_Stencil(TRUE, D3DCMP_ALWAYS, 0xff, 0x7f, D3DSTENCILOP_KEEP, D3DSTENCILOP_REPLACE, D3DSTENCILOP_KEEP); + C.r_StencilRef(0x01); + C.r_End(); break; } diff --git a/src/Layers/xrRender/blenders/Blender_tree_deferred.cpp b/src/Layers/xrRender/blenders/Blender_tree_deferred.cpp index facd356240f..4d9c1bc617f 100644 --- a/src/Layers/xrRender/blenders/Blender_tree_deferred.cpp +++ b/src/Layers/xrRender/blenders/Blender_tree_deferred.cpp @@ -119,6 +119,11 @@ void CBlender_Tree::Compile(CBlender_Compile& C) uber_deffer(C, true, tvs, "base", oBlend.value, 0, true); C.r_Stencil(TRUE, D3DCMP_ALWAYS, 0xff, 0x7f, D3DSTENCILOP_KEEP, D3DSTENCILOP_REPLACE, D3DSTENCILOP_KEEP); C.r_StencilRef(0x01); +#if RENDER == R_R4 + C.r_dx11Texture("s_waves", "fx\\wind_wave"); + C.r_dx11Sampler("smp_linear2"); +#endif + // Need only for ATOC to emulate stencil test if (bUseATOC) C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL); @@ -140,6 +145,11 @@ void CBlender_Tree::Compile(CBlender_Compile& C) uber_deffer(C, false, tvs, "base", oBlend.value, 0, true); C.r_Stencil(TRUE, D3DCMP_ALWAYS, 0xff, 0x7f, D3DSTENCILOP_KEEP, D3DSTENCILOP_REPLACE, D3DSTENCILOP_KEEP); C.r_StencilRef(0x01); +#if RENDER == R_R4 + C.r_dx11Texture("s_waves", "fx\\wind_wave"); + C.r_dx11Sampler("smp_linear2"); +#endif + // Need only for ATOC to emulate stencil test if (bUseATOC) C.RS.SetRS(D3DRS_ZFUNC, D3DCMP_EQUAL); @@ -153,6 +163,11 @@ void CBlender_Tree::Compile(CBlender_Compile& C) else C.r_Pass(tvs_s, "null", FALSE); C.SampledImage("smp_linear", "s_base", C.L_textures[0]); +#if RENDER == R_R4 + C.r_dx11Texture("s_waves", "fx\\wind_wave"); + C.r_dx11Sampler("smp_linear2"); +#endif + C.r_ColorWriteEnable(false, false, false, false); C.r_End(); break; diff --git a/src/Layers/xrRender/blenders/blender_combine.cpp b/src/Layers/xrRender/blenders/blender_combine.cpp index 38045a6f08c..08ccb1c09a1 100644 --- a/src/Layers/xrRender/blenders/blender_combine.cpp +++ b/src/Layers/xrRender/blenders/blender_combine.cpp @@ -171,9 +171,13 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_dx11Texture("sky_s1", r2_T_sky1); C.r_dx11Texture("s_occ", r2_RT_ssao_temp); C.r_dx11Texture("s_half_depth", r2_RT_half_depth); + C.r_dx11Texture("ssfx_ao", r2_RT_ssfx_temp); + C.r_dx11Texture("ssfx_il", r2_RT_ssfx_temp2); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); jitter(C); + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_material"); C.r_dx11Sampler("smp_rtlinear"); @@ -196,6 +200,10 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -218,6 +226,10 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -239,6 +251,10 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -260,7 +276,10 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_2", r2_RT_blur_2); C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -382,8 +401,13 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_dx11Texture("sky_s0", r2_T_sky0); C.r_dx11Texture("sky_s1", r2_T_sky1); + C.r_dx11Texture("ssfx_ao", r2_RT_ssfx_temp); + C.r_dx11Texture("ssfx_il", r2_RT_ssfx_temp2); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + jitter(C); + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_material"); C.r_dx11Sampler("smp_rtlinear"); @@ -406,6 +430,10 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -428,6 +456,10 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -449,6 +481,10 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); @@ -471,6 +507,10 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_dx11Texture("s_blur_4", r2_RT_blur_4); C.r_dx11Texture("s_blur_8", r2_RT_blur_8); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); + + C.r_dx11Sampler("smp_linear"); C.r_dx11Sampler("smp_nofilter"); C.r_dx11Sampler("smp_rtlinear"); C.r_End(); diff --git a/src/Layers/xrRender/blenders/blender_lut.cpp b/src/Layers/xrRender/blenders/blender_lut.cpp new file mode 100644 index 00000000000..1ccb05cc695 --- /dev/null +++ b/src/Layers/xrRender/blenders/blender_lut.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" + +#include "blender_lut.h" + +CBlender_lut::CBlender_lut() { description.CLS = 0; } + +LPCSTR CBlender_lut::getComment() +{ + return "INTERNAL: LUT"; +} + +void CBlender_lut::Compile(CBlender_Compile& C) +{ + IBlender::Compile(C); + + C.r_Pass("stub_screen_space", "pp_lut", FALSE, FALSE, FALSE); + C.r_dx11Texture("s_image", r2_RT_generic0); + C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas"); + + C.r_dx11Sampler("smp_base"); + C.r_dx11Sampler("smp_nofilter"); + C.r_dx11Sampler("smp_rtlinear"); + C.r_dx11Sampler("smp_linear"); + C.r_End(); +} diff --git a/src/Layers/xrRender/blenders/blender_lut.h b/src/Layers/xrRender/blenders/blender_lut.h new file mode 100644 index 00000000000..bb2a54c858c --- /dev/null +++ b/src/Layers/xrRender/blenders/blender_lut.h @@ -0,0 +1,11 @@ +#pragma once + +class CBlender_lut : public IBlender +{ +public: + CBlender_lut(); + ~CBlender_lut() override = default; + + LPCSTR getComment() override; + void Compile(CBlender_Compile& C) override; +}; diff --git a/src/Layers/xrRender/blenders/dx11RainBlender.cpp b/src/Layers/xrRender/blenders/dx11RainBlender.cpp index 369209fba2c..a277de1e5f9 100644 --- a/src/Layers/xrRender/blenders/dx11RainBlender.cpp +++ b/src/Layers/xrRender/blenders/dx11RainBlender.cpp @@ -70,6 +70,10 @@ void CBlender_rain::Compile(CBlender_Compile& C) // C.r_dx11Texture ("s_waterFall", "water\\water_normal"); C.r_dx11Texture("s_waterFall", "water\\water_flowing_nmap"); +#if defined(USE_DX11) + C.r_dx11Texture("s_hud_mask", r2_RT_ssfx_hud); +#endif + C.r_End(); break; diff --git a/src/Layers/xrRender/dxRainRender.cpp b/src/Layers/xrRender/dxRainRender.cpp index 30f9a70d5dc..4f996585148 100644 --- a/src/Layers/xrRender/dxRainRender.cpp +++ b/src/Layers/xrRender/dxRainRender.cpp @@ -6,14 +6,14 @@ // Warning: duplicated in rain.cpp static const int max_desired_items = 2500; -static const float source_radius = 12.5f; -static const float source_offset = 40.f; -static const float max_distance = source_offset * 1.25f; +static const float source_radius = 15;//12.5f; +static const float source_offset = 20.f; // 40 +static const float max_distance = source_offset * 1.5f; //1.25f; static const float sink_offset = -(max_distance - source_offset); static const float drop_length = 5.f; static const float drop_width = 0.30f; static const float drop_angle = 3.0f; -static const float drop_max_angle = deg2rad(10.f); +static const float drop_max_angle = deg2rad(35.f); //10 static const float drop_max_wind_vel = 20.0f; static const float drop_speed_min = 40.f; static const float drop_speed_max = 80.f; @@ -22,8 +22,12 @@ const int max_particles = 1000; const int particles_cache = 400; const float particles_time = .3f; +int current_items; + dxRainRender::dxRainRender() { + current_items = 0; + IReader* F = FS.r_open("$game_meshes$", "dm" DELIMITER "rain.dm"); VERIFY3(F, "Can't open file.", "dm" DELIMITER "rain.dm"); @@ -68,13 +72,23 @@ void dxRainRender::Render(CEffect_Rain& owner) } #endif - const u32 desired_items = iFloor(0.5f * (1.f + factor) * float(max_desired_items)); + u32 desired_items = iFloor(0.01f * (1.f + factor * 99.0f) * float(max_desired_items)); + + // Get to the desired items + if (current_items < desired_items) + current_items += desired_items - current_items; + + // visual + float factor_visual = factor / 2.f + .5f; + Fvector3 f_rain_color = g_pGamePersistent->Environment().CurrentEnv.rain_color; + u32 u_rain_color = color_rgba_f(f_rain_color.x, f_rain_color.y, f_rain_color.z, factor_visual); // born _new_ if needed - if (owner.items.size() < desired_items) + float b_radius_wrap_sqr = _sqr((source_radius * 1.5f)); + if (owner.items.size() < current_items) { - owner.items.reserve(desired_items); - while (owner.items.size() < desired_items) + // owner.items.reserve (desired_items); + while (owner.items.size() < current_items) { CEffect_Rain::Item one; owner.Born(one, source_radius, _drop_speed); @@ -82,13 +96,6 @@ void dxRainRender::Render(CEffect_Rain& owner) } } - // visual - const float factor_visual = factor / 2.f + .5f; - const Fvector3 f_rain_color = g_pGamePersistent->Environment().CurrentEnv.rain_color; - const u32 u_rain_color = color_rgba_f(f_rain_color.x, f_rain_color.y, f_rain_color.z, factor_visual); - - const float b_radius_wrap_sqr = _sqr((source_radius + .5f)); - // build source plane Fplane src_plane; Fvector norm = {0.f, -1.f, 0.f}; @@ -101,15 +108,21 @@ void dxRainRender::Render(CEffect_Rain& owner) FVF::LIT* verts = (FVF::LIT*)RImplementation.Vertex.Lock(desired_items * 4, hGeom_Rain->vb_stride, vOffset); FVF::LIT* start = verts; const Fvector& vEye = Device.vCameraPosition; - for (u32 I = 0; I < desired_items; I++) + for (u32 I = 0; I < current_items; I++) { // physics and time control CEffect_Rain::Item& one = owner.items[I]; if (one.dwTime_Hit < Device.dwTimeGlobal) + { owner.Hit(one.Phit); + if (current_items > desired_items) current_items--; // Hit something + } if (one.dwTime_Life < Device.dwTimeGlobal) + { owner.Born(one, source_radius, _drop_speed); + if (current_items > desired_items) current_items--; // Out of life ( invalidated, never hit something, etc. ) + } // поŃледняя дельта ?? //. float xdt = float(one.dwTime_Hit-Device.dwTimeGlobal)/1000.f; diff --git a/src/Layers/xrRender/light.cpp b/src/Layers/xrRender/light.cpp index ebf01da9d4f..2c03adcf778 100644 --- a/src/Layers/xrRender/light.cpp +++ b/src/Layers/xrRender/light.cpp @@ -368,7 +368,9 @@ void light::Export(light_Package& package) #endif // (RENDER==R_R3) || (RENDER==R_R4) || (RENDER==R_GL) // Igor: add volumetric support - L->set_volumetric(flags.bVolumetric); + if (ps_ssfx_volumetric.x <= 0) + L->set_volumetric(flags.bVolumetric); + L->set_volumetric_quality(m_volumetric_quality); L->set_volumetric_intensity(m_volumetric_intensity); L->set_volumetric_distance(m_volumetric_distance); @@ -377,7 +379,10 @@ void light::Export(light_Package& package) } } break; - case IRender_Light::SPOT: package.v_shadowed.push_back(this); break; + case IRender_Light::SPOT: + this->set_volumetric_intensity(m_volumetric_intensity); + package.v_shadowed.push_back(this); + break; } } else diff --git a/src/Layers/xrRender/light.h b/src/Layers/xrRender/light.h index 85cb5e7ea74..c2d7cbda227 100644 --- a/src/Layers/xrRender/light.h +++ b/src/Layers/xrRender/light.h @@ -9,6 +9,8 @@ #include "light_gi.h" #endif //(RENDER==R_R2) || (RENDER==R_R3) || (RENDER==R_R4) || (RENDER==R_GL) +extern ENGINE_API Fvector4 ps_ssfx_volumetric; + class light : public IRender_Light, public SpatialBase { public: @@ -117,13 +119,19 @@ class light : public IRender_Light, public SpatialBase void set_shadow(bool b) override { flags.bShadow = b; } - void set_volumetric(bool b) override { flags.bVolumetric = b; } + void set_volumetric(bool b) override + { + if (ps_ssfx_volumetric.x > 0) + b = true; + + flags.bVolumetric = b; + } void set_volumetric_quality(float fValue) override { m_volumetric_quality = fValue; } - void set_volumetric_intensity(float fValue) override { m_volumetric_intensity = fValue; } + void set_volumetric_intensity(float fValue) override { m_volumetric_intensity = ps_ssfx_volumetric.y; } - void set_volumetric_distance(float fValue) override { m_volumetric_distance = fValue; } + void set_volumetric_distance(float fValue) override { m_volumetric_distance = 1.0f; } void set_position(const Fvector& P) override; diff --git a/src/Layers/xrRender/light_vis.cpp b/src/Layers/xrRender/light_vis.cpp index 27674c1f2a9..eccc145ea01 100644 --- a/src/Layers/xrRender/light_vis.cpp +++ b/src/Layers/xrRender/light_vis.cpp @@ -8,6 +8,8 @@ const u32 delay_large_min = 10; const u32 delay_large_max = 20; const u32 cullfragments = 4; +ENGINE_API Fvector4 ps_ssfx_volumetric; + void light::vis_prepare(CBackend& cmd_list) { if (int(indirect_photons) != ps_r2_GI_photons) @@ -39,6 +41,8 @@ void light::vis_prepare(CBackend& cmd_list) skiptest = true; if (ps_r2_ls_flags.test(R2FLAG_EXP_DONT_TEST_SHADOWED) && flags.bShadow) skiptest = true; + if (ps_ssfx_volumetric.x > 0 && flags.bShadow) + skiptest = true; // Temp Fix vis.distance = Device.vCameraPosition.distance_to(spatial.sphere.P); diff --git a/src/Layers/xrRender/r__dsgraph_build.cpp b/src/Layers/xrRender/r__dsgraph_build.cpp index bc226a5b609..e83680a62a9 100644 --- a/src/Layers/xrRender/r__dsgraph_build.cpp +++ b/src/Layers/xrRender/r__dsgraph_build.cpp @@ -87,6 +87,16 @@ void R_dsgraph_structure::insert_dynamic(IRenderable* root, dxRender_Visual* pVi } mapHUD.insert_anyway(distSQ, _MatrixItemS({ SSA, root, pVisual, xform, sh })); + if (!sh->passes[0]->ps->hud_disabled) + { + auto hudMaskNode = HUDMask.insert_anyway(distSQ); + hudMaskNode->second.ssa = SSA; + hudMaskNode->second.pObject = root; + hudMaskNode->second.pVisual = pVisual; + hudMaskNode->second.Matrix = xform; + hudMaskNode->second.se = sh; + } + #if RENDER != R_R1 if (sh->flags.bEmissive && sh_d) mapHUDEmissive.insert_anyway(distSQ, _MatrixItemS({ SSA, root, pVisual, xform, sh_d })); // sh_d -> L_special @@ -194,6 +204,18 @@ void R_dsgraph_structure::insert_static(dxRender_Visual* pVisual) if (!o.pmask[sh->flags.iPriority / 2]) return; + // Water rendering + if (sh->flags.isWater) + { + auto waterNode = mapWater.insert_anyway(distSQ); + waterNode->second.ssa = SSA; + waterNode->second.pObject = NULL; + waterNode->second.pVisual = pVisual; + waterNode->second.Matrix = Fidentity; + waterNode->second.se = sh; + return; + } + // strict-sorting selection if (sh->flags.bStrictB2F) { diff --git a/src/Layers/xrRender/r__dsgraph_render.cpp b/src/Layers/xrRender/r__dsgraph_render.cpp index 86b1eba36ce..070a41a4d6f 100644 --- a/src/Layers/xrRender/r__dsgraph_render.cpp +++ b/src/Layers/xrRender/r__dsgraph_render.cpp @@ -235,18 +235,110 @@ ICF void sort_back_to_front_render_and_clean(u32 context_id, T& vec) vec.clear(); } +template +void __fastcall water_node_ssr(u32 context_id, T& item) +{ +#ifdef USE_DX11 + auto& dsgraph = RImplementation.get_context(context_id); + + dxRender_Visual* V = item.second.pVisual; + VERIFY(V && V->shader._get()); + + dsgraph.cmd_list.set_Shader(RImplementation.Target->s_ssfx_water_ssr); + + dsgraph.cmd_list.set_xform_world(item.second.Matrix); + RImplementation.apply_object(dsgraph.cmd_list, item.second.pObject); + dsgraph.cmd_list.apply_lmaterial(); + + dsgraph.cmd_list.set_c("cam_pos", RImplementation.Target->Position_previous.x, RImplementation.Target->Position_previous.y, RImplementation.Target->Position_previous.z, 0.0f); + + // Previous matrix data + dsgraph.cmd_list.set_c("m_previous", item.second.PrevMatrix); + item.second.PrevMatrix.set(dsgraph.cmd_list.xforms.m_wvp); + + V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), false); +#endif +} + +template +void __fastcall water_node(u32 context_id, T& item) +{ +#ifdef USE_DX11 + auto& dsgraph = RImplementation.get_context(context_id); + + dxRender_Visual* V = item.second.pVisual; + VERIFY(V && V->shader._get()); + + if (RImplementation.o.ssfx_water) + { + dsgraph.cmd_list.set_Shader(RImplementation.Target->s_ssfx_water); + } + + dsgraph.cmd_list.set_xform_world(item.second.Matrix); + RImplementation.apply_object(dsgraph.cmd_list, item.second.pObject); + dsgraph.cmd_list.apply_lmaterial(); + + // Wind settings + float WindDir = g_pGamePersistent->Environment().CurrentEnv.wind_direction; + float WindVel = g_pGamePersistent->Environment().CurrentEnv.wind_velocity; + dsgraph.cmd_list.set_c("wind_setup", WindDir, WindVel, 0.f, 0.f); + + V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), false); +#endif +} + +template +void __fastcall hud_node(u32 context_id, T& item) +{ + auto& dsgraph = RImplementation.get_context(context_id); + + dxRender_Visual* V = item.second.pVisual; + VERIFY(V && V->shader._get()); + + dsgraph.cmd_list.set_xform_world(item.second.Matrix); + +#ifdef USE_DX11 + if (item.second.se->passes[0]->ps->hud_disabled) + return; + + int skinning = item.second.se->passes[0]->vs->skinning; + dsgraph.cmd_list.set_Shader(RImplementation.Target->s_ssfx_hud[skinning]); + + RImplementation.Target->Matrix_HUD_previous.set(item.second.PrevMatrix); + item.second.PrevMatrix.set(dsgraph.cmd_list.xforms.m_wvp); + + RImplementation.Target->RVelocity = true; + +#endif + + V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), dsgraph.o.phase == CRender::PHASE_SMAP); + +#ifdef USE_DX11 + RImplementation.Target->RVelocity = false; +#endif +} + ////////////////////////////////////////////////////////////////////////// // HUD render -void R_dsgraph_structure::render_hud() +void R_dsgraph_structure::render_hud(bool NoPS) { ZoneScoped; PIX_EVENT_CTX(cmd_list, dsgraph_render_hud); - if (!mapHUD.empty()) + if (mapHUD.empty()) + return; + + hud_transform_helper helper{ cmd_list }; + + if (!NoPS) { - hud_transform_helper helper{ cmd_list }; sort_front_to_back_render_and_clean(context_id, mapHUD); } + else + { + HUDMask.traverse_left_right(context_id, hud_node); + HUDMask.clear(); + } #if RENDER == R_R1 if (g_pGameLevel->pHUD && g_pGameLevel->pHUD->RenderActiveItemUIQuery()) @@ -414,3 +506,14 @@ void R_dsgraph_structure::render_R1_box(IRender_Sector::sector_id_t sector_id, F } } } + +void R_dsgraph_structure::r_dsgraph_render_water_ssr() +{ + mapWater.traverse_left_right(context_id, water_node_ssr); +} + +void R_dsgraph_structure::r_dsgraph_render_water() +{ + mapWater.traverse_left_right(context_id, water_node); + mapWater.clear(); +} diff --git a/src/Layers/xrRender/r__dsgraph_structure.h b/src/Layers/xrRender/r__dsgraph_structure.h index aaf34015d32..4e59e5f6329 100644 --- a/src/Layers/xrRender/r__dsgraph_structure.h +++ b/src/Layers/xrRender/r__dsgraph_structure.h @@ -53,6 +53,8 @@ struct R_dsgraph_structure R_dsgraph::mapLOD_T mapLOD; R_dsgraph::mapSorted_T mapDistort; R_dsgraph::mapHUD_T mapHUDSorted; + R_dsgraph::HUDMask_T HUDMask; + R_dsgraph::mapWater_T mapWater; #if RENDER != R_R1 R_dsgraph::mapSorted_T mapWmark; // sorted @@ -148,6 +150,12 @@ struct R_dsgraph_structure cmd_list.Invalidate(); } + void destroy() + { + HUDMask.destroy(); + mapWater.destroy(); + } + void r_pmask(bool _1, bool _2, bool _wm = false) { o.pmask[0] = _1; @@ -180,7 +188,7 @@ struct R_dsgraph_structure // render primitives void render_graph(u32 _priority); - void render_hud(); + void render_hud(bool NoPS = false); void render_hud_ui(); void render_lods(bool _setup_zb, bool _clear); void render_sorted(); @@ -189,5 +197,8 @@ struct R_dsgraph_structure void render_distort(); void render_R1_box(IRender_Sector::sector_id_t sector_id, Fbox& _bb, int _element); + void r_dsgraph_render_water_ssr(); + void r_dsgraph_render_water(); + void build_subspace(); }; diff --git a/src/Layers/xrRender/r__dsgraph_types.h b/src/Layers/xrRender/r__dsgraph_types.h index d79e132eda4..2972b6851c9 100644 --- a/src/Layers/xrRender/r__dsgraph_types.h +++ b/src/Layers/xrRender/r__dsgraph_types.h @@ -21,6 +21,16 @@ struct _MatrixItem Fmatrix Matrix; // matrix (copy) }; +struct _MatrixItemSSFX +{ + float ssa; + IRenderable* pObject; + dxRender_Visual* pVisual; + Fmatrix Matrix; // matrix (copy) + ShaderElement* se; + mutable Fmatrix PrevMatrix{}; +}; + struct _MatrixItemS { // ĐĄĐ°Đş для иŃпользования ŃпиŃков инициализации @@ -66,4 +76,7 @@ using mapMatrixPasses_T = mapMatrix_T[SHADER_PASSES_MAX]; using mapSorted_T = xr_fixed_map; using mapHUD_T = xr_fixed_map; using mapLOD_T = xr_fixed_map; + +using HUDMask_T = xr_fixed_map; +using mapWater_T = xr_fixed_map; } diff --git a/src/Layers/xrRender/rendertarget_phase_blur.cpp b/src/Layers/xrRender/rendertarget_phase_blur.cpp index b1144f60307..6ebe4b9d6a2 100644 --- a/src/Layers/xrRender/rendertarget_phase_blur.cpp +++ b/src/Layers/xrRender/rendertarget_phase_blur.cpp @@ -147,3 +147,387 @@ void CRenderTarget::phase_blur() RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); /////////////////////////////////////////////////////////////////////////////////// }; + +#if defined(USE_DX11) +extern ENGINE_API Fvector4 ps_ssfx_ssr; +extern ENGINE_API Fvector4 ps_ssfx_water; +void CRenderTarget::phase_ssfx_ssr() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + float ScaleFactor = _min(_max(ps_ssfx_ssr.x, 1.0f), 2.0f); + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(1.0f, 1.0f); + + + // GLOSS ///////////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp3, 0, 0, get_base_zb()); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ssr->E[5]); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + /////////////////////////////////////////////////////////////////////////// + + p1.set(1.0f / ScaleFactor, 1.0f / ScaleFactor); + + // Fill VB + float scale_X = w / ScaleFactor; + float scale_Y = h / ScaleFactor; + + // SSR /////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx, 0, 0, get_base_zb()); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + if (ScaleFactor > 1.0f) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), scale_X, scale_Y); + + //Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + //Set pass + RCache.set_Element(s_ssfx_ssr->E[0]); + RCache.set_c("m_current", Matrix_current); + RCache.set_c("m_previous", Matrix_previous); + RCache.set_c("cam_pos", ::Random.randF(-1.0, 1.0), ::Random.randF(-1.0, 1.0), 0.0f, 0.0f); + + RCache.set_c("ssr_setup", ps_ssfx_ssr); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // COPY SSR RESULT ( ACC ) //////////////////////////////////////////// + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_ssr->pTexture->surface_get(), rt_ssfx->pTexture->surface_get()); + + // Disable/Enable Blur if the value is <= 0 + //if (ps_ssfx_ssr.y > 0 || ps_ssfx_ssr.x > 1.0) + { + // BLUR PHASE 1 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp, 0, 0, get_base_zb()); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ssr->E[1]); + RCache.set_c("blur_params", 1.f, 0.f, scale_X, scale_Y); + RCache.set_c("ssr_setup", ps_ssfx_ssr); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 2 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp2, 0, 0, get_base_zb()); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ssr->E[2]); + RCache.set_c("blur_params", 0.f, 1.f, w, h); + RCache.set_c("ssr_setup", ps_ssfx_ssr); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + } + + // COMBINE ////////////////////////////////////////////////////////// + // Reset Viewport + if (ScaleFactor > 1.0f) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); + + p1.set(1.0f, 1.0f); + + if (!RImplementation.o.msaa) + u_setrt(RCache, rt_Generic_0, nullptr, nullptr, nullptr); + else + u_setrt(RCache, rt_Generic_0_r, nullptr, nullptr, nullptr); + + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ssr->E[3]); + RCache.set_c("ssr_setup", ps_ssfx_ssr); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); +}; + +void CRenderTarget::phase_ssfx_volumetric_blur() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + float ScaleFactor = ps_ssfx_volumetric.w; + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(1.0f / ScaleFactor, 1.0f / ScaleFactor); + + // Scale Viewport + if (ScaleFactor > 1.0) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w / ScaleFactor, h / ScaleFactor); + + FLOAT ColorRGBA[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + HW.get_context(CHW::IMM_CTX_ID)->ClearRenderTargetView(rt_ssfx_accum->pRT, ColorRGBA); + + // BLUR PHASE 1 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_accum, 0, 0, NULL); //!RImplementation.o.dx10_msaa ? get_base_zb() : rt_MSAADepth->pZRT + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[0]); + RCache.set_c("blur_setup", w, h, 0.f, 2.f); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, (u32)w, (u32)h, 0, 2); + + // BLUR PHASE 2 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_Generic_2, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[1]); + RCache.set_c("blur_setup", w, h, 1.f, 0.5f); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, (u32)w, (u32)h, 0, 2); + + + // BLUR PHASE 3 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_accum, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[0]); + RCache.set_c("blur_setup", w, h, 1.f, 2.0f); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 4 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_Generic_2, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[1]); + RCache.set_c("blur_setup", w, h, 2.f, 0.5f); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // Restore Viewport + if (ScaleFactor > 1.0f) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); + +}; + +void CRenderTarget::phase_ssfx_water_blur() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(0.5f, 0.5f); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w / 2, h / 2); + + if (ps_ssfx_water.y > 0) + { + // BLUR PHASE 1 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp2, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[2]); + RCache.set_c("blur_setup", 1.f, 0.f, 0.f, 2.0f / ps_ssfx_water.x); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // BLUR PHASE 2 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[3]); + RCache.set_c("blur_setup", 0.f, 1.f, 0.f, 1.0f); + + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + } + else + { + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_temp2->pTexture->surface_get(), rt_ssfx_temp->pTexture->surface_get()); + + u_setrt(RCache, rt_ssfx_temp, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[4]); + RCache.set_c("blur_setup", 0.f, 0.f, 0.f, 2.0f / ps_ssfx_water.x); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + } + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); + p1.set(1.0f, 1.0f); + +}; + +void CRenderTarget::phase_ssfx_water_waves() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = (float)Device.dwWidth; + float h = (float)Device.dwHeight; + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(1.0f, 1.0f); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), 512, 512); + + u_setrt(RCache, rt_ssfx_water_waves, 0, 0, NULL); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_volumetric_blur->E[5]); + RCache.set_c("wind_setup", g_pGamePersistent->Environment().wind_anim.w, g_pGamePersistent->Environment().CurrentEnv.wind_velocity, 0.f, 0.f); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); +}; + +#endif diff --git a/src/Layers/xrRender/rendertarget_phase_lut.cpp b/src/Layers/xrRender/rendertarget_phase_lut.cpp new file mode 100644 index 00000000000..be0eb80fc5f --- /dev/null +++ b/src/Layers/xrRender/rendertarget_phase_lut.cpp @@ -0,0 +1,55 @@ +#include "stdafx.h" + +void CRenderTarget::phase_lut() +{ + PIX_EVENT(phase_LUT); + + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + Fvector2 p0, p1; +#if defined(USE_DX10) || defined(USE_DX11) + p0.set(0.0f, 0.0f); + p1.set(1.0f, 1.0f); +#else + p0.set(0.5f / w, 0.5f / h); + p1.set((w + 0.5f) / w, (h + 0.5f) / h); +#endif + + ////////////////////////////////////////////////////////////////////////// + //Set MSAA/NonMSAA rendertarget +#if defined(USE_DX10) || defined(USE_DX11) + ref_rt& dest_rt = RImplementation.o.msaa ? rt_Generic : rt_Color; + u_setrt(RCache, dest_rt, 0, 0, NULL); +#else + u_setrt(rt_Generic_0, nullptr, nullptr, nullptr); +#endif + + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + //Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, float(h), d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(float(w), float(h), d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(float(w), 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + //Set pass + RCache.set_Element(s_lut->E[0]); + + //Set geometry + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + +#if defined(USE_DX10) || defined(USE_DX11) + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pTexture->surface_get(), dest_rt->pTexture->surface_get()); +#endif +}; diff --git a/src/Layers/xrRender/xrRender_console.cpp b/src/Layers/xrRender/xrRender_console.cpp index 8162dd264ce..8a2628ed4c9 100644 --- a/src/Layers/xrRender/xrRender_console.cpp +++ b/src/Layers/xrRender/xrRender_console.cpp @@ -282,6 +282,29 @@ extern ENGINE_API float ps_ssfx_gloss_factor; extern ENGINE_API Fvector3 ps_ssfx_gloss_minmax; extern ENGINE_API Fvector4 ps_ssfx_lightsetup_1; +extern ENGINE_API float ps_ssfx_hud_hemi; +extern ENGINE_API int ps_ssfx_il_quality; +extern ENGINE_API Fvector4 ps_ssfx_il; +extern ENGINE_API Fvector4 ps_ssfx_il_setup1; +extern ENGINE_API int ps_ssfx_ao_quality; +extern ENGINE_API Fvector4 ps_ssfx_ao; +extern ENGINE_API Fvector4 ps_ssfx_ao_setup1; +extern ENGINE_API Fvector4 ps_ssfx_water; +extern ENGINE_API Fvector3 ps_ssfx_water_quality; +extern ENGINE_API Fvector4 ps_ssfx_water_setup1; +extern ENGINE_API Fvector4 ps_ssfx_water_setup2; +extern ENGINE_API int ps_ssfx_ssr_quality; +extern ENGINE_API Fvector4 ps_ssfx_ssr; +extern ENGINE_API Fvector4 ps_ssfx_ssr_2; +extern ENGINE_API Fvector4 ps_ssfx_terrain_quality; +extern ENGINE_API Fvector4 ps_ssfx_terrain_offset; +extern ENGINE_API Fvector3 ps_ssfx_shadows; +extern ENGINE_API Fvector4 ps_ssfx_volumetric; +extern ENGINE_API Fvector3 ps_ssfx_shadow_bias; +extern ENGINE_API Fvector4 ps_ssfx_lut; +extern ENGINE_API Fvector4 ps_ssfx_wind_grass; +extern ENGINE_API Fvector4 ps_ssfx_wind_trees; + // x - min (0), y - focus (1.4), z - max (100) Fvector3 ps_r2_dof = Fvector3().set(-1.25f, 1.4f, 600.f); float ps_r2_dof_sky = 30; // distance to sky @@ -944,7 +967,7 @@ void xrRender_initconsole() CMD4(CCC_Float, "r2_ls_dsm_kernel", &ps_r2_ls_dsm_kernel, .1f, 3.f); CMD4(CCC_Float, "r2_ls_psm_kernel", &ps_r2_ls_psm_kernel, .1f, 3.f); CMD4(CCC_Float, "r2_ls_ssm_kernel", &ps_r2_ls_ssm_kernel, .1f, 3.f); - CMD4(CCC_Float, "r2_ls_squality", &ps_r2_ls_squality, .5f, 1.f); + CMD4(CCC_Float, "r2_ls_squality", &ps_r2_ls_squality, .5f, 3.f); CMD3(CCC_Mask, "r2_zfill", &ps_r2_ls_flags, R2FLAG_ZFILL); CMD4(CCC_Float, "r2_zfill_depth", &ps_r2_zfill, .001f, .5f); @@ -1151,6 +1174,39 @@ void xrRender_initconsole() CMD4(CCC_Float, "ssfx_gloss_factor", &ps_ssfx_gloss_factor, 0.0f, 1.0f); CMD4(CCC_Vector4, "ssfx_lightsetup_1", &ps_ssfx_lightsetup_1, Fvector4().set(0, 0, 0, 0), Fvector4().set(1.0, 1.0, 1.0, 1.0)); + // Screen Space Shaders + CMD4(CCC_Float, "ssfx_hud_hemi", &ps_ssfx_hud_hemi, 0.0f, 1.0f); + + CMD4(CCC_Integer, "ssfx_il_quality", &ps_ssfx_il_quality, 16, 64); + CMD4(CCC_Vector4, "ssfx_il", &ps_ssfx_il, Fvector4().set(0, 0, 0, 0), Fvector4().set(8, 10, 3, 6)); + CMD4(CCC_Vector4, "ssfx_il_setup1", &ps_ssfx_il_setup1, Fvector4().set(0, 0, 0, 0), Fvector4().set(300, 1, 1, 1)); + + CMD4(CCC_Integer, "ssfx_ao_quality", &ps_ssfx_ao_quality, 2, 8); + CMD4(CCC_Vector4, "ssfx_ao", &ps_ssfx_ao, Fvector4().set(0, 0, 0, 0), Fvector4().set(8, 10, 1, 10)); + CMD4(CCC_Vector4, "ssfx_ao_setup1", &ps_ssfx_ao_setup1, Fvector4().set(0, 0, 0, 0), Fvector4().set(300, 1, 1, 1)); + + CMD4(CCC_Vector4, "ssfx_water", &ps_ssfx_water, Fvector4().set(1, 0, 0, 0), Fvector4().set(8, 1, 1, 0)); + CMD4(CCC_Vector3, "ssfx_water_quality", &ps_ssfx_water_quality, Fvector3().set(0, 0, 0), Fvector3().set(4, 3, 0)); + CMD4(CCC_Vector4, "ssfx_water_setup1", &ps_ssfx_water_setup1, Fvector4().set(0, 0, 0, 0), Fvector4().set(2, 10, 1, 0.1)); + CMD4(CCC_Vector4, "ssfx_water_setup2", &ps_ssfx_water_setup2, Fvector4().set(0, 0, 0, 0), Fvector4().set(1, 10, 1, 1)); + + CMD4(CCC_Integer, "ssfx_ssr_quality", &ps_ssfx_ssr_quality, 0, 5); + CMD4(CCC_Vector4, "ssfx_ssr", &ps_ssfx_ssr, Fvector4().set(1, 0, 0, 0), Fvector4().set(2, 1, 1, 1)); + CMD4(CCC_Vector4, "ssfx_ssr_2", &ps_ssfx_ssr_2, Fvector4().set(0, 0, 0, 0), Fvector4().set(2, 2, 2, 2)); + + CMD4(CCC_Vector4, "ssfx_terrain_quality", &ps_ssfx_terrain_quality, Fvector4().set(0, 0, 0, 0), Fvector4().set(12, 0, 0, 0)); + CMD4(CCC_Vector4, "ssfx_terrain_offset", &ps_ssfx_terrain_offset, Fvector4().set(-1, -1, -1, -1), Fvector4().set(1, 1, 1, 1)); + + CMD4(CCC_Vector3, "ssfx_shadows", &ps_ssfx_shadows, Fvector3().set(128, 1536, 0), Fvector3().set(1536, 4096, 0)); + CMD4(CCC_Vector4, "ssfx_volumetric", &ps_ssfx_volumetric, Fvector4().set(0, 0, 1.0, 1.0), Fvector4().set(1.0, 5.0, 5.0, 16.0)); + + CMD4(CCC_Vector3, "ssfx_shadow_bias", &ps_ssfx_shadow_bias, Fvector3().set(0, 0, 0), Fvector3().set(1.0, 1.0, 1.0)); + + CMD4(CCC_Vector4, "ssfx_lut", &ps_ssfx_lut, Fvector4().set(0.0, 0.0, 0.0, 0.0), tw2_max); + + CMD4(CCC_Vector4, "ssfx_wind_grass", &ps_ssfx_wind_grass, Fvector4().set(0.0, 0.0, 0.0, 0.0), Fvector4().set(20.0, 5.0, 5.0, 5.0)); + CMD4(CCC_Vector4, "ssfx_wind_trees", &ps_ssfx_wind_trees, Fvector4().set(0.0, 0.0, 0.0, 0.0), Fvector4().set(20.0, 5.0, 5.0, 1.0)); + tw_min.set(0, 0, 0); tw_max.set(1, 1, 1); CMD4(CCC_Vector3, "r__color_grading", &ps_r2_img_cg, tw_min, tw_max); diff --git a/src/Layers/xrRenderDX11/Blender_Recorder_R3.cpp b/src/Layers/xrRenderDX11/Blender_Recorder_R3.cpp index 9a8adb4fd43..b985f4b0079 100644 --- a/src/Layers/xrRenderDX11/Blender_Recorder_R3.cpp +++ b/src/Layers/xrRenderDX11/Blender_Recorder_R3.cpp @@ -126,6 +126,18 @@ u32 CBlender_Compile::r_dx11Sampler(LPCSTR ResourceName) i_Filter(stage, D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_POINT); } + if (0 == xr_strcmp(ResourceName, "smp_linear2")) + { + i_Address(stage, D3DTADDRESS_WRAP); + i_Filter(stage, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTEXF_LINEAR); + } + + if (0 == xr_strcmp(ResourceName, "smp_point")) + { + i_Address(stage, D3DTADDRESS_WRAP); + i_Filter(stage, D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT); + } + return stage; } diff --git a/src/Layers/xrRenderDX11/dx11ResourceManager_Resources.cpp b/src/Layers/xrRenderDX11/dx11ResourceManager_Resources.cpp index 1c9c57b1153..eee10c5b6dc 100644 --- a/src/Layers/xrRenderDX11/dx11ResourceManager_Resources.cpp +++ b/src/Layers/xrRenderDX11/dx11ResourceManager_Resources.cpp @@ -40,28 +40,39 @@ SPass* CResourceManager::_CreatePass(const SPass& proto) //-------------------------------------------------------------------------------------------------------------- SVS* CResourceManager::_CreateVS(cpcstr shader, u32 flags /*= 0*/) { + int skinning = -1; + string_path name; xr_strcpy(name, shader); switch (RImplementation.m_skinning) { case 0: xr_strcat(name, "_0"); + skinning = 0; break; case 1: xr_strcat(name, "_1"); + skinning = 1; break; case 2: xr_strcat(name, "_2"); + skinning = 2; break; case 3: xr_strcat(name, "_3"); + skinning = 3; break; case 4: xr_strcat(name, "_4"); + skinning = 4; break; } - return CreateShader(name, shader, flags); + SVS* vs = CreateShader(name, shader, flags); + + vs->skinning = skinning; + + return vs; } void CResourceManager::_DeleteVS(const SVS* vs) diff --git a/src/Layers/xrRenderDX11/dx11ResourceManager_Scripting.cpp b/src/Layers/xrRenderDX11/dx11ResourceManager_Scripting.cpp index 469bccbd98c..02fcb32b6b6 100644 --- a/src/Layers/xrRenderDX11/dx11ResourceManager_Scripting.cpp +++ b/src/Layers/xrRenderDX11/dx11ResourceManager_Scripting.cpp @@ -517,6 +517,16 @@ Shader* CResourceManager::_lua_Create(LPCSTR d_shader, LPCSTR s_textures) C.iElement = 0; C.bDetail = m_textures_description.GetDetailTexture(C.L_textures[0], C.detail_texture, C.detail_scaler); S.E[0] = C._lua_Compile(s_shader, "normal"); + + /// SSS fix water for DX10 +#if RENDER == R_R4 + // Water Flag + if (S.E[0]->flags.bDistort) + { + if (strstr(s_shader, "effects_water")) + S.E[0]->flags.isWater = TRUE; + } +#endif } } diff --git a/src/Layers/xrRenderPC_R4/r4_rendertarget.h b/src/Layers/xrRenderPC_R4/r4_rendertarget.h index 3c326b5e6e8..e3ad42d4f6f 100644 --- a/src/Layers/xrRenderPC_R4/r4_rendertarget.h +++ b/src/Layers/xrRenderPC_R4/r4_rendertarget.h @@ -30,6 +30,11 @@ class CRenderTarget : public IRender_Target IBlender* b_accum_spot_msaa[8]{}; IBlender* b_accum_volumetric_msaa[8]{}; + // [SSS Stuff] + IBlender* b_ssfx_ssr; + IBlender* b_ssfx_volumetric_blur; + IBlender* b_ssfx_ao; + #ifdef DEBUG struct dbg_line_t { @@ -77,6 +82,32 @@ class CRenderTarget : public IRender_Target ref_rt rt_smap_rain; ref_rt rt_smap_depth_minmax; // is used for min/max sm + // Screen Space Shaders Stuff + ref_rt rt_ssfx; + ref_rt rt_ssfx_temp; + ref_rt rt_ssfx_temp2; + ref_rt rt_ssfx_temp3; + + ref_rt rt_ssfx_accum; + ref_rt rt_ssfx_hud; + ref_rt rt_ssfx_ssr; + ref_rt rt_ssfx_water; + ref_rt rt_ssfx_water_waves; + ref_rt rt_ssfx_ao; + ref_rt rt_ssfx_il; + + ref_rt rt_ssfx_prevPos; + + ref_shader s_ssfx_water; + ref_shader s_ssfx_water_ssr; + ref_shader s_ssfx_ao; + ref_shader s_ssfx_hud[5]; + + Fmatrix Matrix_previous, Matrix_current; + Fmatrix Matrix_HUD_previous, Matrix_HUD_current; + Fvector3 Position_previous; + bool RVelocity; + // Igor: for async screenshots ID3DTexture2D* t_ss_async; // 32bit (r,g,b,a) is situated in the system memory @@ -127,6 +158,11 @@ class CRenderTarget : public IRender_Target ref_shader s_gasmask_drops; ref_shader s_gasmask_dudv; ref_shader s_nightvision; + ref_shader s_lut; + + // Screen Space Shaders Stuff + ref_shader s_ssfx_ssr; + ref_shader s_ssfx_volumetric_blur; // generate min/max ref_shader s_create_minmax_sm; @@ -294,6 +330,18 @@ class CRenderTarget : public IRender_Target void phase_gasmask_dudv(); void phase_nightvision(); + // SSS Stuff + void phase_ssfx_ssr(); // SSR Phase + void phase_ssfx_volumetric_blur(); // Volumetric Blur + void phase_ssfx_water_blur(); // Water Blur + void phase_ssfx_water_waves(); // Water Waves +#if (RENDER == R_R4) // Yohji: note - this if/endif was unnecessary in monolith engine, can we refactor? + void phase_ssfx_ao(); // AO + void phase_ssfx_il(); // IL + void set_viewport_size(ID3DDeviceContext* dev, float w, float h); + void phase_lut(); +#endif + // Generates min/max sm void create_minmax_SM(CBackend& cmd_list); diff --git a/src/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp b/src/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp index 4fee884b391..25186378bcf 100644 --- a/src/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp +++ b/src/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp @@ -208,10 +208,11 @@ void CRenderTarget::accum_direct(CBackend& cmd_list, u32 sub_phase) Fmatrix m_xform; Fvector direction = fuckingsun->direction; float w_dir = g_pGamePersistent->Environment().CurrentEnv.wind_direction; - // float w_speed = g_pGamePersistent->Environment().CurrentEnv.wind_velocity ; + float w_speed = g_pGamePersistent->Environment().CurrentEnv.wind_velocity * 0.001f; + clamp(w_speed, 0.1f, 1.0f); Fvector normal; normal.setHP(w_dir, 0); - w_shift += 0.003f * Device.fTimeDelta; + w_shift -= 0.005f * w_speed * Device.fTimeDelta; Fvector position; position.set(0, 0, 0); m_xform.build_camera_dir(position, direction, normal); @@ -523,9 +524,11 @@ void CRenderTarget::accum_direct_cascade(CBackend& cmd_list, u32 sub_phase, Fmat Fmatrix m_xform; Fvector direction = fuckingsun->direction; float w_dir = g_pGamePersistent->Environment().CurrentEnv.wind_direction; - // float w_speed = g_pGamePersistent->Environment().CurrentEnv.wind_velocity ; + float w_speed = g_pGamePersistent->Environment().CurrentEnv.wind_velocity * 0.001f; + clamp(w_speed, 0.1f, 1.0f); Fvector normal; - normal.setHP(w_dir, 0); + normal.setHP(-w_dir, 0); + w_shift -= 0.005f * w_speed * Device.fTimeDelta; w_shift += 0.003f * Device.fTimeDelta; Fvector position; position.set(0, 0, 0); @@ -1194,6 +1197,12 @@ void CRenderTarget::accum_direct_volumetric(CBackend& cmd_list, u32 sub_phase, c if ((sub_phase != SE_SUN_NEAR) && (sub_phase != SE_SUN_FAR)) return; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + if (RImplementation.o.ssfx_volumetric) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w / ps_ssfx_volumetric.w, h / ps_ssfx_volumetric.w); + phase_vol_accumulator(cmd_list); cmd_list.set_ColorWriteEnable(); @@ -1344,5 +1353,8 @@ void CRenderTarget::accum_direct_volumetric(CBackend& cmd_list, u32 sub_phase, c // TODO: DX11: Check if DX11 has analog for NV DBT // disable depth bounds // u_DBT_disable (); + + if (RImplementation.o.ssfx_volumetric) + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); } } diff --git a/src/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/src/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index 82f3d1a9386..840a881aa72 100644 --- a/src/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/src/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -7,11 +7,17 @@ float hclip(float v, float dim) { return 2.f * v / dim - 1.f; } +extern ENGINE_API Fvector4 ps_ssfx_il; +extern ENGINE_API Fvector4 ps_ssfx_ao; +extern ENGINE_API Fvector4 ps_ssfx_water; + void CRenderTarget::phase_combine() { ZoneScoped; PIX_EVENT(phase_combine); + bool ssfx_PrevPos_Requiered = false; + // TODO: DX11: Remove half pixel offset bool _menu_pp = g_pGamePersistent ? g_pGamePersistent->OnRenderPPUI_query() : false; @@ -42,6 +48,50 @@ void CRenderTarget::phase_combine() } } + // Save previus and current matrices + Fvector2 m_blur_scale; + { + static Fmatrix m_saved_viewproj; + + if (!Device.m_SecondViewport.IsSVPFrame()) + { + static Fvector3 saved_position; + Position_previous.set(saved_position); + saved_position.set(Device.vCameraPosition); + + Fmatrix m_invview; + m_invview.invert(Device.mView); + Matrix_previous.mul(m_saved_viewproj, m_invview); + Matrix_current.set(Device.mProject); + m_saved_viewproj.set(Device.mFullTransform); + } + float scale = ps_r2_mblur / 2.f; + m_blur_scale.set(scale, -scale).div(12.f); + } + + { + // Disable when rendering SecondViewport + if (!Device.m_SecondViewport.IsSVPFrame()) + { + // Clear RT + Fcolor ColorRGBA = { 0.0f, 0.0f, 0.0f, 1.0f }; + RCache.ClearRT(rt_ssfx_temp->pRT, ColorRGBA); + RCache.ClearRT(rt_ssfx_temp2->pRT, ColorRGBA); + + if (RImplementation.o.ssfx_ao && ps_ssfx_ao.y > 0) + { + ssfx_PrevPos_Requiered = true; + phase_ssfx_ao(); // [SSFX] - New AO Phase + } + + if (RImplementation.o.ssfx_il && ps_ssfx_il.y > 0) + { + ssfx_PrevPos_Requiered = true; + phase_ssfx_il(); // [SSFX] - New IL Phase + } + } + } + // low/hi RTs { // Clear to zero @@ -83,7 +133,7 @@ void CRenderTarget::phase_combine() //} // calc m-blur matrices - Fmatrix m_previous, m_current; + /*Fmatrix m_previous, m_current; Fvector2 m_blur_scale; { static Fmatrix m_saved_viewproj; @@ -94,7 +144,7 @@ void CRenderTarget::phase_combine() m_saved_viewproj.set(Device.mFullTransform); float scale = ps_r2_mblur / 2.f; m_blur_scale.set(scale, -scale).div(12.f); - } + }*/ // Draw full-screen quad textured with our scene image if (!_menu_pp) @@ -230,6 +280,61 @@ void CRenderTarget::phase_combine() else HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_temp->pTexture->surface_get(), rt_Generic_0_r->pTexture->surface_get()); + auto& dsgraph = RImplementation.get_imm_context(); + if (RImplementation.o.ssfx_ssr && !Device.m_SecondViewport.IsSVPFrame()) + { + ssfx_PrevPos_Requiered = true; + phase_ssfx_ssr(); // [SSFX] - New SSR Phase + } + + // [SSFX] - Water SSR rendering + if (RImplementation.o.ssfx_water && !Device.m_SecondViewport.IsSVPFrame()) + { + Fcolor ColorRGBA = { 0.0f, 0.0f, 0.0f, 1.0f }; + RCache.ClearRT(rt_ssfx_temp->pRT, ColorRGBA); + RCache.ClearRT(rt_ssfx_temp2->pRT, ColorRGBA); + + if (!RImplementation.o.msaa) + u_setrt(RCache, rt_ssfx_temp, 0, 0, 0); + else + u_setrt(RCache, rt_ssfx_temp, 0, 0, 0); + + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + // Render Scale + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w / ps_ssfx_water.x, h / ps_ssfx_water.x); + + // Render Water SSR + RCache.set_xform_world(Fidentity); + dsgraph.r_dsgraph_render_water_ssr(); + + // Restore Viewport + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); + + // Save Frame + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_water->pTexture->surface_get(), rt_ssfx_temp->pTexture->surface_get()); + + // Water SSR Blur + phase_ssfx_water_blur(); + + // Water waves + phase_ssfx_water_waves(); + } + + if (!RImplementation.o.msaa) + u_setrt(RCache, rt_Generic_0, 0, 0, get_base_zb()); + else + u_setrt(RCache, rt_Generic_0_r, 0, 0, rt_MSAADepth); + + // Final water rendering ( All the code above can be omitted if the Water module isn't installed ) + RCache.set_xform_world(Fidentity); + dsgraph.r_dsgraph_render_water(); + g_pGamePersistent->Environment().RenderLast(); // rain/thunder-bolts + + if (ssfx_PrevPos_Requiered) + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_prevPos->pTexture->surface_get(), rt_Position->pTexture->surface_get()); + // Forward rendering { PIX_EVENT(Forward_rendering); @@ -266,7 +371,6 @@ void CRenderTarget::phase_combine() // u_setrt(rt_Generic_1,0,0,get_base_zb()); // Distortion filter - auto& dsgraph = RImplementation.get_imm_context(); BOOL bDistort = RImplementation.o.distortion_enabled; // This can be modified { if ((0 == dsgraph.mapDistort.size()) && !_menu_pp) @@ -288,12 +392,16 @@ void CRenderTarget::phase_combine() if (RImplementation.o.new_shader_support) { //(Anomaly) Compute blur textures - phase_blur(); + + if (!Device.m_SecondViewport.IsSVPFrame()) // Temp fix for blur buffer and SVP + phase_blur(); //(Anomaly) Compute depth of field effect if (ps_r2_ls_flags.test(R2FLAG_DOF)) phase_dof(); + phase_lut(); + //(Anomaly) Compute night vision effect if (ps_r2_nightvision > 0) phase_nightvision(); @@ -419,8 +527,8 @@ void CRenderTarget::phase_combine() RCache.set_c("e_barrier", ps_r2_aa_barier.x, ps_r2_aa_barier.y, ps_r2_aa_barier.z, 0.f); RCache.set_c("e_weights", ps_r2_aa_weight.x, ps_r2_aa_weight.y, ps_r2_aa_weight.z, 0.f); RCache.set_c("e_kernel", ps_r2_aa_kernel, ps_r2_aa_kernel, ps_r2_aa_kernel, 0.f); - RCache.set_c("m_current", m_current); - RCache.set_c("m_previous", m_previous); + RCache.set_c("m_current", Matrix_current); + RCache.set_c("m_previous", Matrix_previous); RCache.set_c("m_blur", m_blur_scale.x, m_blur_scale.y, 0.f, 0.f); Fvector3 dof; g_pGamePersistent->GetCurrentDof(dof); @@ -594,18 +702,18 @@ void CRenderTarget::phase_combine_volumetric() RCache.set_ColorWriteEnable(D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE); { // Fill VB - float scale_X = float(Device.dwWidth) / float(TEX_jitter); - float scale_Y = float(Device.dwHeight) / float(TEX_jitter); + //float scale_X = float(Device.dwWidth) / float(TEX_jitter); + //float scale_Y = float(Device.dwHeight) / float(TEX_jitter); // Fill vertex buffer FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); - pv->set(-1, 1, 0, 1, 0, 0, scale_Y); + pv->set(-1, 1, 0, 1, 0, 0, 1); pv++; pv->set(-1, -1, 0, 0, 0, 0, 0); pv++; - pv->set(1, 1, 1, 1, 0, scale_X, scale_Y); + pv->set(1, 1, 1, 1, 0, 1, 1); pv++; - pv->set(1, -1, 1, 0, 0, scale_X, 0); + pv->set(1, -1, 1, 0, 0, 1, 0); pv++; RImplementation.Vertex.Unlock(4, g_combine->vb_stride); diff --git a/src/Layers/xrRenderPC_R4/r4_shaders.cpp b/src/Layers/xrRenderPC_R4/r4_shaders.cpp index b5681053453..1fa433c701e 100644 --- a/src/Layers/xrRenderPC_R4/r4_shaders.cpp +++ b/src/Layers/xrRenderPC_R4/r4_shaders.cpp @@ -3,6 +3,11 @@ #include "Layers/xrRender/ShaderResourceTraits.h" #include "xrCore/FileCRC32.h" +extern ENGINE_API int ps_ssfx_ssr_quality; +extern ENGINE_API Fvector3 ps_ssfx_water_quality; +extern ENGINE_API int ps_ssfx_il_quality; +extern ENGINE_API int ps_ssfx_ao_quality; + void CRender::addShaderOption(const char* name, const char* value) { D3D_SHADER_MACRO macro = {name, value}; @@ -226,6 +231,13 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName, string32 c_sun_quality; char c_msaa_samples[2]; char c_msaa_current_sample[2]; + + // SSS preprocessor stuff + char c_ssfx_il[32]; + char c_ssfx_ao[32]; + char c_ssfx_water[32]; + char c_ssfx_water_parallax[32]; + char c_ssr_quality[32]; char c_rain_quality[32]; char c_inter_grass[32]; @@ -437,6 +449,28 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName, else sh_name.append(static_cast(0)); + xr_sprintf(c_ssr_quality, "%d", u8(_min(_max(ps_ssfx_ssr_quality, 0), 5))); + options.add("SSFX_SSR_QUALITY", c_ssr_quality); + sh_name.append(c_ssr_quality); + + xr_sprintf(c_ssfx_water, "%d", u8(_min(_max(ps_ssfx_water_quality.x, 0.0f), 4.0f))); + options.add("SSFX_WATER_QUALITY", c_ssfx_water); + sh_name.append(c_ssfx_water); + + + xr_sprintf(c_ssfx_water_parallax, "%d", u8(_min(_max(ps_ssfx_water_quality.y, 0.0f), 3.0f))); + options.add("SSFX_WATER_PARALLAX", c_ssfx_water_parallax); + sh_name.append(c_ssfx_water_parallax); + + + xr_sprintf(c_ssfx_il, "%d", u8(_min(_max(ps_ssfx_il_quality, 0), 64))); + options.add("SSFX_IL_QUALITY", c_ssfx_il); + sh_name.append(c_ssfx_il); + + xr_sprintf(c_ssfx_ao, "%d", u8(_min(_max(ps_ssfx_ao_quality, 2), 8))); + options.add("SSFX_AO_QUALITY", c_ssfx_ao); + sh_name.append(c_ssfx_ao); + appendShaderOption(1, "SSFX_MODEXE", "1"); // Be carefull!!!!! this should be at the end to correctly generate diff --git a/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj b/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj index 320dc225c48..8acd3cb482e 100644 --- a/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj +++ b/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj @@ -75,6 +75,7 @@ + @@ -246,6 +247,7 @@ + @@ -335,6 +337,7 @@ + diff --git a/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj.filters b/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj.filters index 2ccc307a713..3d2e21bde99 100644 --- a/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj.filters +++ b/src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj.filters @@ -744,6 +744,9 @@ Lights + + Shading templates + @@ -1376,6 +1379,12 @@ Core_Target + + Shading templates + + + Core_Target + diff --git a/src/Layers/xrRender_R2/r2.cpp b/src/Layers/xrRender_R2/r2.cpp index 24322539a7a..1edaf62ed83 100644 --- a/src/Layers/xrRender_R2/r2.cpp +++ b/src/Layers/xrRender_R2/r2.cpp @@ -15,6 +15,8 @@ CRender RImplementation; +extern ENGINE_API Fvector4 ps_ssfx_terrain_quality; + ////////////////////////////////////////////////////////////////////////// class CGlow : public IRender_Glow { @@ -52,7 +54,19 @@ ShaderElement* CRender::rimp_select_sh_static(dxRender_Visual* pVisual, float cd int id = SE_R2_SHADOW; if (CRender::PHASE_NORMAL == phase) { - id = ((_sqrt(cdist_sq) - pVisual->vis.sphere.R) < r_dtex_range) ? SE_R2_NORMAL_HQ : SE_R2_NORMAL_LQ; + if (pVisual->shader->E[0]->flags.isLandscape) + { + float sec_dist = _sqrt(cdist_sq) - pVisual->vis.sphere.R; + id = (sec_dist < ps_ssfx_terrain_quality.x * 10) ? SE_R2_NORMAL_HQ : SE_R2_NORMAL_LQ; + + // Very low shader variation + if (sec_dist > 240) + id = 3; + } + else + { + id = ((_sqrt(cdist_sq) - pVisual->vis.sphere.R) < r_dtex_range) ? SE_R2_NORMAL_HQ : SE_R2_NORMAL_LQ; + } } return pVisual->shader->E[id]._get(); } @@ -509,6 +523,33 @@ void CRender::create() } } + // Check if SSS shaders exist + string_path fn; + o.ssfx_core = FS.exist(fn, "$game_shaders$", "r5\\screenspace_common", ".h") ? 1 : 0; + o.ssfx_rain = FS.exist(fn, "$game_shaders$", "r5\\effects_rain_splash", ".ps") ? 1 : 0; + o.ssfx_blood = FS.exist(fn, "$game_shaders$", "r5\\effects_wallmark_blood", ".ps") ? 1 : 0; + o.ssfx_branches = FS.exist(fn, "$game_shaders$", "r5\\deffer_tree_branch_bump-hq", ".vs") ? 1 : 0; + o.ssfx_hud_raindrops = FS.exist(fn, "$game_shaders$", "r5\\deffer_base_hud_bump", ".ps") ? 1 : 0; + o.ssfx_ssr = FS.exist(fn, "$game_shaders$", "r5\\ssfx_ssr", ".ps") ? 1 : 0; + o.ssfx_terrain = FS.exist(fn, "$game_shaders$", "r5\\deffer_terrain_high_flat_d", ".ps") ? 1 : 0; + o.ssfx_volumetric = FS.exist(fn, "$game_shaders$", "r5\\ssfx_volumetric_blur", ".ps") ? 1 : 0; + o.ssfx_water = FS.exist(fn, "$game_shaders$", "r5\\ssfx_water", ".ps") ? 1 : 0; + o.ssfx_ao = FS.exist(fn, "$game_shaders$", "r5\\ssfx_ao", ".ps") ? 1 : 0; + o.ssfx_il = FS.exist(fn, "$game_shaders$", "r5\\ssfx_il", ".ps") ? 1 : 0; + + Msg("- Supports SSS UPDATE 21"); + Msg("- SSS CORE INSTALLED %i", o.ssfx_core); + Msg("- SSS HUD RAINDROPS SHADER INSTALLED %i", o.ssfx_hud_raindrops); + Msg("- SSS RAIN SHADER INSTALLED %i", o.ssfx_rain); + Msg("- SSS BLOOD SHADER INSTALLED %i", o.ssfx_blood); + Msg("- SSS BRANCHES SHADER INSTALLED %i", o.ssfx_branches); + Msg("- SSS SSR SHADER INSTALLED %i", o.ssfx_ssr); + Msg("- SSS TERRAIN SHADER INSTALLED %i", o.ssfx_terrain); + Msg("- SSS VOLUMETRIC SHADER INSTALLED %i", o.ssfx_volumetric); + Msg("- SSS WATER SHADER INSTALLED %i", o.ssfx_water); + Msg("- SSS AO SHADER INSTALLED %i", o.ssfx_ao); + Msg("- SSS IL SHADER INSTALLED %i", o.ssfx_il); + // constants Resources->RegisterConstantSetup("parallax", &binder_parallax); Resources->RegisterConstantSetup("water_intensity", &binder_water_intensity); diff --git a/src/Layers/xrRender_R2/r2.h b/src/Layers/xrRender_R2/r2.h index 209d345390a..27fe7617047 100644 --- a/src/Layers/xrRender_R2/r2.h +++ b/src/Layers/xrRender_R2/r2.h @@ -271,6 +271,18 @@ class CRender final : public D3DXRenderBase // Yohji - New shader support u32 new_shader_support : 1; + + u32 ssfx_branches : 1; + u32 ssfx_blood : 1; + u32 ssfx_rain : 1; + u32 ssfx_hud_raindrops : 1; + u32 ssfx_ssr : 1; + u32 ssfx_terrain : 1; + u32 ssfx_volumetric : 1; + u32 ssfx_water : 1; + u32 ssfx_ao : 1; + u32 ssfx_il : 1; + u32 ssfx_core : 1; } o; struct RenderR2Statistics diff --git a/src/Layers/xrRender_R2/r2_R_lights.cpp b/src/Layers/xrRender_R2/r2_R_lights.cpp index 06903e21139..f93578be97d 100644 --- a/src/Layers/xrRender_R2/r2_R_lights.cpp +++ b/src/Layers/xrRender_R2/r2_R_lights.cpp @@ -285,9 +285,31 @@ void CRender::render_lights(light_Package& LP) PIX_EVENT(ACCUM_VOLUMETRIC); if (RImplementation.o.advancedpp && ps_r2_ls_flags.is(R2FLAG_VOLUMETRIC_LIGHTS)) + { + // Current Resolution + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + // Adjust resolution +#if RENDER == R_R4 + if (RImplementation.o.ssfx_volumetric && ps_ssfx_volumetric.w > 1) + Target->set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w / ps_ssfx_volumetric.w, h / ps_ssfx_volumetric.w); +#endif + for (light* p_light : L_spot_s) Target->accum_volumetric(cmd_list, p_light); + // Restore resolution +#if RENDER == R_R4 + if (RImplementation.o.ssfx_volumetric && ps_ssfx_volumetric.w > 1) + Target->set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); +#endif + } + + + //for (light* p_light : L_spot_s) + //Target->accum_volumetric(cmd_list, p_light); + L_spot_s.clear(); } } diff --git a/src/Layers/xrRender_R2/r2_R_render.cpp b/src/Layers/xrRender_R2/r2_R_render.cpp index 9443c3ee12b..7960a1a9ce8 100644 --- a/src/Layers/xrRender_R2/r2_R_render.cpp +++ b/src/Layers/xrRender_R2/r2_R_render.cpp @@ -166,6 +166,20 @@ void CRender::Render() if (ps_r2_ls_flags.test(R2FLAG_EXP_SPLIT_SCENE)) split_the_scene_to_minimize_wait = TRUE; +#if RENDER == R_R4 + if (RImplementation.o.ssfx_core) + { + // HUD Masking rendering + Fcolor ColorRGBA = { 1.0f, 0.0f, 0.0f, 1.0f }; + RCache.ClearRT(Target->rt_ssfx_hud->pRT, ColorRGBA); + Target->u_setrt(RCache, Target->rt_ssfx_hud, 0, 0, Target->get_base_zb()); + dsgraph.render_hud(true); + + // Reset Depth + RCache.ClearZB(Target->get_base_zb(), 1.0); + } +#endif + //******* Main render :: PART-0 -- first #ifdef USE_OGL if (psDeviceFlags.test(rsWireframe)) @@ -373,6 +387,13 @@ void CRender::Render() render_lights(LP_pending); } +#if RENDER == R_R4 + { + if (RImplementation.o.ssfx_volumetric) + Target->phase_ssfx_volumetric_blur(); + } +#endif + // Postprocess { PIX_EVENT(DEFER_LIGHT_COMBINE); @@ -398,7 +419,7 @@ void CRender::render_forward() dsgraph.render_graph(1); // normal level, secondary priority dsgraph.PortalTraverser.fade_render(); // faded-portals dsgraph.render_sorted(); // strict-sorted geoms - g_pGamePersistent->Environment().RenderLast(); // rain/thunder-bolts + //g_pGamePersistent->Environment().RenderLast(); // rain/thunder-bolts } } diff --git a/src/Layers/xrRender_R2/r2_loader.cpp b/src/Layers/xrRender_R2/r2_loader.cpp index c703c7e96ce..1ffcd3fbb84 100644 --- a/src/Layers/xrRender_R2/r2_loader.cpp +++ b/src/Layers/xrRender_R2/r2_loader.cpp @@ -102,6 +102,9 @@ void CRender::level_Load(IReader* fs) // End g_pGamePersistent->LoadEnd(); + // Yohji: Originally added here, where should we put it? + //mapWater.clear(); + // signal loaded b_loaded = TRUE; } diff --git a/src/Layers/xrRender_R2/r2_rendertarget.cpp b/src/Layers/xrRender_R2/r2_rendertarget.cpp index 7972f2afad7..54d48df67d8 100644 --- a/src/Layers/xrRender_R2/r2_rendertarget.cpp +++ b/src/Layers/xrRender_R2/r2_rendertarget.cpp @@ -26,6 +26,18 @@ #include "Layers/xrRender/blenders/blender_nightvision.h" #include "Layers/xrRender/blenders/blender_gasmask_drops.h" #include "Layers/xrRender/blenders/blender_gasmask_dudv.h" + #include "Layers/xrRender/blenders/blender_lut.h" +#endif + +#if (RENDER == R_R4) +D3D_VIEWPORT custom_viewport = { 0.f, 0.f, 0.f, 0.f, 0.f, 1.f }; + +void CRenderTarget::set_viewport_size(ID3DDeviceContext* dev, float w, float h) +{ + custom_viewport.Width = w; + custom_viewport.Height = h; + dev->RSSetViewports(1, &custom_viewport); +} #endif void CRenderTarget::u_stencil_optimize(CBackend& cmd_list, eStencilOptimizeMode eSOM) @@ -346,6 +358,11 @@ CRenderTarget::CRenderTarget() CBlender_gasmask_dudv b_gasmask_dudv; CBlender_nightvision b_nightvision; + CBlender_lut b_lut; + b_ssfx_ssr = xr_new(); + b_ssfx_volumetric_blur = xr_new(); + b_ssfx_ao = xr_new(); + //Rendertargets rt_dof.create(r2_RT_dof, w, h, D3DFMT_A8R8G8B8); @@ -358,12 +375,46 @@ CRenderTarget::CRenderTarget() rt_blur_h_8.create(r2_RT_blur_h_8, u32(w / 8), u32(h / 8), D3DFMT_A8R8G8B8); rt_blur_8.create(r2_RT_blur_8, u32(w / 8), u32(h / 8), D3DFMT_A8R8G8B8); + // Screen Space Shaders Stuff + rt_ssfx.create(r2_RT_ssfx, w, h, D3DFMT_A8R8G8B8); // Temp RT + rt_ssfx_temp.create(r2_RT_ssfx_temp, w, h, D3DFMT_A8R8G8B8); // Temp RT + rt_ssfx_temp2.create(r2_RT_ssfx_temp2, w, h, D3DFMT_A8R8G8B8); // Temp RT + rt_ssfx_temp3.create(r2_RT_ssfx_temp3, w, h, D3DFMT_A8R8G8B8); // Temp RT + + rt_ssfx_accum.create(r2_RT_ssfx_accum, w, h, D3DFMT_A16B16G16R16F, SampleCount); // Volumetric Acc + rt_ssfx_ssr.create(r2_RT_ssfx_ssr, w, h, D3DFMT_A8R8G8B8); // SSR Acc + rt_ssfx_water.create(r2_RT_ssfx_water, w, h, D3DFMT_A8R8G8B8); // Water Acc + rt_ssfx_ao.create(r2_RT_ssfx_ao, w, h, D3DFMT_A8R8G8B8); // AO Acc + rt_ssfx_il.create(r2_RT_ssfx_il, w, h, D3DFMT_A8R8G8B8); // IL Acc + + rt_ssfx_water_waves.create(r2_RT_ssfx_water_waves, 512, 512, D3DFMT_A8R8G8B8); // Water Waves + + rt_ssfx_prevPos.create(r2_RT_ssfx_prevPos, w, h, D3DFMT_A16B16G16R16F, SampleCount); + + rt_ssfx_hud.create(r2_RT_ssfx_hud, w, h, D3DFMT_A16B16G16R16F); // HUD mask & Velocity buffer + + s_ssfx_ssr.create(b_ssfx_ssr, "r2\\ssfx_ssr"); // SSR + s_ssfx_volumetric_blur.create(b_ssfx_volumetric_blur, "r2\\ssfx_volumetric_blur"); // Volumetric Blur + + s_ssfx_water_ssr.create("ssfx_water_ssr"); // Water SSR + s_ssfx_water.create("ssfx_water"); // Water + + s_ssfx_ao.create(b_ssfx_ao, "ssfx_ao"); // SSR + + string32 cskin_buffer; + for (int skin_num = 0; skin_num < 5; skin_num++) + { + sprintf(cskin_buffer, "ssfx_hud_skin%i", skin_num); + s_ssfx_hud[skin_num].create(cskin_buffer); + } + //Shader s_blur.create(&b_blur, "r2\\blur"); s_dof.create(&b_dof, "r2\\dof"); s_gasmask_drops.create(&b_gasmask_drops, "r2\\gasmask_drops"); s_gasmask_dudv.create(&b_gasmask_dudv, "r2\\gasmask_dudv"); s_nightvision.create(&b_nightvision, "r2\\nightvision"); + s_lut.create(&b_lut, "r2\\lut"); } #endif @@ -785,6 +836,13 @@ CRenderTarget::~CRenderTarget() xr_delete(b_accum_volumetric_msaa[i]); } } + +#if RENDER == R_R4 + // [ SSS Stuff ] + xr_delete(b_ssfx_ssr); // SSR Phase + xr_delete(b_ssfx_volumetric_blur); // Volumetric Phase + xr_delete(b_ssfx_ao); // AO Phase +#endif } void CRenderTarget::reset_light_marker(CBackend& cmd_list, bool bResetStencil) diff --git a/src/Layers/xrRender_R2/r2_rendertarget_phase_accumulator.cpp b/src/Layers/xrRender_R2/r2_rendertarget_phase_accumulator.cpp index 07df52f2442..6dfbdb5551d 100644 --- a/src/Layers/xrRender_R2/r2_rendertarget_phase_accumulator.cpp +++ b/src/Layers/xrRender_R2/r2_rendertarget_phase_accumulator.cpp @@ -55,13 +55,24 @@ void CRenderTarget::phase_accumulator(CBackend& cmd_list) void CRenderTarget::phase_vol_accumulator(CBackend& cmd_list) { - u_setrt(cmd_list, rt_Generic_2, nullptr, nullptr, rt_MSAADepth); - if (!m_bHasActiveVolumetric) { m_bHasActiveVolumetric = true; + + if (!RImplementation.o.msaa) + u_setrt(cmd_list, rt_Generic_2, nullptr, nullptr, RImplementation.o.ssfx_volumetric ? nullptr : rt_Base_Depth); + else + u_setrt(cmd_list, rt_Generic_2, nullptr, nullptr, RImplementation.o.ssfx_volumetric ? nullptr : rt_Base_Depth); + cmd_list.ClearRT(rt_Generic_2, {}); // black } + else + { + if (!RImplementation.o.msaa) + u_setrt(cmd_list, rt_Generic_2, nullptr, nullptr, RImplementation.o.ssfx_volumetric ? nullptr : rt_Base_Depth); + else + u_setrt(cmd_list, rt_Generic_2, nullptr, nullptr, RImplementation.o.ssfx_volumetric ? nullptr : rt_Base_Depth); + } cmd_list.set_Stencil(FALSE); cmd_list.set_CullMode(CULL_NONE); diff --git a/src/Layers/xrRender_R2/r2_types.h b/src/Layers/xrRender_R2/r2_types.h index 78262aabf25..bb9780156a3 100644 --- a/src/Layers/xrRender_R2/r2_types.h +++ b/src/Layers/xrRender_R2/r2_types.h @@ -71,6 +71,21 @@ #define r2_RT_blur_h_8 "$user$blur_h_8" #define r2_RT_blur_8 "$user$blur_8" +#define r2_RT_ssfx "$user$ssfx" // SSS Temp1 +#define r2_RT_ssfx_temp "$user$ssfx_temp" // SSS Temp2 +#define r2_RT_ssfx_temp2 "$user$ssfx_temp2" // SSS Temp3 +#define r2_RT_ssfx_temp3 "$user$ssfx_temp3" +#define r2_RT_ssfx_accum "$user$ssfx_accum" // SSS Volumetric +#define r2_RT_ssfx_hud "$user$ssfx_hud" // HUD & Velocity Buffer + +#define r2_RT_ssfx_ssr "$user$ssfx_ssr" // SSR Acc +#define r2_RT_ssfx_water "$user$ssfx_water" // Water Acc +#define r2_RT_ssfx_water_waves "$user$ssfx_water_waves" +#define r2_RT_ssfx_ao "$user$ssfx_ao" // AO Acc +#define r2_RT_ssfx_il "$user$ssfx_il" // IL Acc + +#define r2_RT_ssfx_prevPos "$user$ssfx_prev_p" // Prev Position + static constexpr auto c_lmaterial = "L_material"; static constexpr auto c_sbase = "s_base"; static constexpr auto c_snoise = "s_noise"; @@ -101,6 +116,7 @@ const u32 LUMINANCE_size = 16; #define SE_R2_NORMAL_HQ 0 // high quality/detail #define SE_R2_NORMAL_LQ 1 // low quality #define SE_R2_SHADOW 2 // shadow generation +#define SE_R2_SSFX_LQ_TERRAIN 3 // SSFX Low quality terrain // spot #define SE_L_FILL 0 diff --git a/src/Layers/xrRender_R2/r3_rendertarget_accum_spot.cpp b/src/Layers/xrRender_R2/r3_rendertarget_accum_spot.cpp index 9aa282a18c3..1bbd46e8382 100644 --- a/src/Layers/xrRender_R2/r3_rendertarget_accum_spot.cpp +++ b/src/Layers/xrRender_R2/r3_rendertarget_accum_spot.cpp @@ -160,14 +160,14 @@ void CRenderTarget::accum_spot(CBackend& cmd_list, light* L) } // Common constants - Fvector L_dir, L_clr, L_pos; + Fvector L_clr, L_pos; // L_dir float L_spec; L_clr.set(L->color.r, L->color.g, L->color.b); L_clr.mul(L->get_LOD()); L_spec = u_diffuse2s(L_clr); Device.mView.transform_tiny(L_pos, L->position); - Device.mView.transform_dir(L_dir, L->direction); - L_dir.normalize(); + //Device.mView.transform_dir(L_dir, L->direction); + //L_dir.normalize(); // Draw volume with projective texgen { @@ -315,10 +315,24 @@ void CRenderTarget::accum_spot(CBackend& cmd_list, light* L) void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) { + // [ SSS ] Fade through distance volumetric lights. + if (ps_ssfx_volumetric.x > 0) + { + float Falloff = ps_ssfx_volumetric.y - std::min(std::max((L->vis.distance - 20) * 0.01f, 0.0f), 1.0f) * ps_ssfx_volumetric.y; + L->m_volumetric_intensity = Falloff; + L->flags.bVolumetric = Falloff <= 0 ? false : true; + } + // if (L->flags.type != IRender_Light::SPOT) return; if (!L->flags.bVolumetric) return; + /*float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + if (RImplementation.o.ssfx_volumetric) + set_viewport_size(HW.pContext, w / ps_ssfx_volumetric.w, h / ps_ssfx_volumetric.w);*/ + phase_vol_accumulator(cmd_list); ref_shader shader; @@ -349,10 +363,10 @@ void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) cmd_list.set_CullMode(CULL_NONE); // back // 2D texgens - Fmatrix m_Texgen; + /*Fmatrix m_Texgen; u_compute_texgen_screen(cmd_list, m_Texgen); Fmatrix m_Texgen_J; - u_compute_texgen_jitter(cmd_list, m_Texgen_J); + u_compute_texgen_jitter(cmd_list, m_Texgen_J);*/ // Shadow xform (+texture adjustment matrix) Fmatrix m_Shadow, m_Lmap; @@ -478,24 +492,52 @@ void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) } } */ - // Common constants - float fQuality = L->m_volumetric_quality; - int iNumSlises = int(float(VOLUMETRIC_SLICES) * fQuality); - // min 10 surfaces - iNumSlises = _max(10, iNumSlises); - // Adjust slice intensity - fQuality = float(iNumSlises) / float(VOLUMETRIC_SLICES); - Fvector L_dir, L_clr, L_pos; + // Common vars + float fQuality = 0; + int iNumSlices = 0; + + // Color and intensity vars + Fvector L_clr, L_pos; float L_spec; + float IntensityMod = 1.0f; L_clr.set(L->color.r, L->color.g, L->color.b); - L_clr.mul(L->m_volumetric_intensity); L_clr.mul(L->m_volumetric_distance); - L_clr.mul(1 / fQuality); - L_clr.mul(L->get_LOD()); + + if (ps_ssfx_volumetric.x <= 0) + { + // Vanilla Method + fQuality = L->m_volumetric_quality; + iNumSlices = (int)(VOLUMETRIC_SLICES * fQuality); + // min 10 surfaces + iNumSlices = _max(10, iNumSlices); + + // Set Intensity + fQuality = ((float)iNumSlices) / VOLUMETRIC_SLICES; + L_clr.mul(L->m_volumetric_intensity); + L_clr.mul(1 / fQuality); + L_clr.mul(L->get_LOD()); + } + else + { + // SSS Method + fQuality = ps_ssfx_volumetric.z; + iNumSlices = (int)(24 * fQuality); + + // Intensity mod to OMNIPART && HUD + if (L->flags.type == IRender_Light::OMNIPART || L->flags.bHudMode) + IntensityMod = 0.2f; + + // Set Intensity + L_clr.mul(L->m_volumetric_intensity * IntensityMod); + L_clr.mul(1.0f / fQuality); + L_clr.mul(L->get_LOD()); + fQuality = ((float)iNumSlices) / 120; // Max setting ( 24 * 5 ) + } + L_spec = u_diffuse2s(L_clr); Device.mView.transform_tiny(L_pos, L->position); - Device.mView.transform_dir(L_dir, L->direction); - L_dir.normalize(); + //Device.mView.transform_dir(L_dir, L->direction); + //L_dir.normalize(); // Draw volume with projective texgen { @@ -521,8 +563,8 @@ void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) float att_factor = 1.f / (att_R * att_R); cmd_list.set_c("Ldynamic_pos", L_pos.x, L_pos.y, L_pos.z, att_factor); cmd_list.set_c("Ldynamic_color", L_clr.x, L_clr.y, L_clr.z, L_spec); - cmd_list.set_c("m_texgen", m_Texgen); - cmd_list.set_c("m_texgen_J", m_Texgen_J); + //cmd_list.set_c("m_texgen", m_Texgen); + //cmd_list.set_c("m_texgen_J", m_Texgen_J); cmd_list.set_c("m_shadow", m_Shadow); cmd_list.set_ca("m_lmap", 0, m_Lmap._11, m_Lmap._21, m_Lmap._31, m_Lmap._41); cmd_list.set_ca("m_lmap", 1, m_Lmap._12, m_Lmap._22, m_Lmap._32, m_Lmap._42); @@ -597,7 +639,7 @@ void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) cmd_list.set_Geometry(g_accum_volumetric); // Igor: no need to do it per sub-sample. Plain AA will go just fine. - cmd_list.Render(D3DPT_TRIANGLELIST, 0, 0, VOLUMETRIC_SLICES * 4, 0, VOLUMETRIC_SLICES * 2); + cmd_list.Render(D3DPT_TRIANGLELIST, 0, 0, iNumSlices * 4, 0, iNumSlices * 2); /* if( !RImplementation.o.msaa ) @@ -659,4 +701,7 @@ void CRenderTarget::accum_volumetric(CBackend& cmd_list, light* L) } */ cmd_list.set_Scissor(0); + + /*if (RImplementation.o.ssfx_volumetric) + set_viewport_size(HW.pContext, w, h);*/ } diff --git a/src/Layers/xrRender_R2/r3_rendertarget_phase_ssao.cpp b/src/Layers/xrRender_R2/r3_rendertarget_phase_ssao.cpp index 15aad057c82..2b3e73c1fac 100644 --- a/src/Layers/xrRender_R2/r3_rendertarget_phase_ssao.cpp +++ b/src/Layers/xrRender_R2/r3_rendertarget_phase_ssao.cpp @@ -142,3 +142,287 @@ void CRenderTarget::phase_downsamp() if (RImplementation.o.ssao_half_data) RCache.SetViewport({ 0.f, 0.f, float(Device.dwWidth), float(Device.dwHeight), 0.f, 1.f }); } + +#if (RENDER == R_R4) +extern ENGINE_API Fvector4 ps_ssfx_il; +extern ENGINE_API Fvector4 ps_ssfx_ao; +void CRenderTarget::phase_ssfx_ao() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + float ScaleFactor = _min(_max(ps_ssfx_ao.x, 1.0f), 8.0f); + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(1.0f / ScaleFactor, 1.0f / ScaleFactor); + + // Fill VB + float scale_X = w / ScaleFactor; + float scale_Y = h / ScaleFactor; + + // AO /////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), scale_X, scale_Y); + + //Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + //Set pass + RCache.set_Element(s_ssfx_ao->E[0]); + RCache.set_c("ao_setup", ps_ssfx_ao); + + RCache.set_c("m_current", Matrix_current); + RCache.set_c("m_previous", Matrix_previous); + + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // Save AO frame + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_ao->pTexture->surface_get(), rt_ssfx_temp->pTexture->surface_get()); + + //scale_X = w / (ScaleFactor * 2.0f); + //scale_Y = h / (ScaleFactor * 2.0f); + + p1.set(1.0f, 1.0f); + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); + + // BLUR PHASE 1 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp3, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[1]); + RCache.set_c("blur_setup", ps_ssfx_ao.x, 0.25f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_ao); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 2 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[2]); + RCache.set_c("blur_setup", 1.f, 0.5f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_ao); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 3 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp3, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[1]); + RCache.set_c("blur_setup", 1.f, 0.75f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_ao); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // BLUR PHASE 4 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[2]); + RCache.set_c("blur_setup", 1.f, 1.0f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_ao); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); +} + +void CRenderTarget::phase_ssfx_il() +{ + //Constants + u32 Offset = 0; + u32 C = color_rgba(0, 0, 0, 255); + + float d_Z = EPS_S; + float d_W = 1.0f; + float w = float(Device.dwWidth); + float h = float(Device.dwHeight); + + float ScaleFactor = _min(_max(ps_ssfx_il.x, 1.0f), 8.0f); + + Fvector2 p0, p1; + p0.set(0.0f, 0.0f); + p1.set(1.0f / ScaleFactor, 1.0f / ScaleFactor); + + // Fill VB + float scale_X = w / ScaleFactor; + float scale_Y = h / ScaleFactor; + + // AO /////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp2, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), scale_X, scale_Y); + + //Fill vertex buffer + FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + //Set pass + RCache.set_Element(s_ssfx_ao->E[3]); + RCache.set_c("ao_setup", ps_ssfx_il); + RCache.set_c("m_current", Matrix_current); + RCache.set_c("m_previous", Matrix_previous); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // Save AO frame + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssfx_il->pTexture->surface_get(), rt_ssfx_temp2->pTexture->surface_get()); + + //scale_X = w / ScaleFactor; + //scale_Y = h / ScaleFactor; + + //p1.set(1.0f / ScaleFactor, 1.0f / ScaleFactor); + //set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), scale_X, scale_Y); + + // BLUR PHASE 1 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp3, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[4]); + RCache.set_c("blur_setup", 1.f, 0.25f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_il); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 2 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp2, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[5]); + RCache.set_c("blur_setup", 1.f, 0.5f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_il); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + // BLUR PHASE 3 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp3, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[4]); + RCache.set_c("blur_setup", 1.f, 0.75f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_il); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + // BLUR PHASE 4 ////////////////////////////////////////////////////////// + u_setrt(RCache, rt_ssfx_temp2, 0, 0, 0); + RCache.set_CullMode(CULL_NONE); + RCache.set_Stencil(FALSE); + + // Fill vertex buffer + pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset); + pv->set(0, h, d_Z, d_W, C, p0.x, p1.y); pv++; + pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++; + pv->set(w, h, d_Z, d_W, C, p1.x, p1.y); pv++; + pv->set(w, 0, d_Z, d_W, C, p1.x, p0.y); pv++; + RImplementation.Vertex.Unlock(4, g_combine->vb_stride); + + // Draw COLOR + RCache.set_Element(s_ssfx_ao->E[5]); + RCache.set_c("blur_setup", 1.f, 1.0f, scale_X, scale_Y); + RCache.set_c("ao_setup", ps_ssfx_il); + RCache.set_Geometry(g_combine); + RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + + + set_viewport_size(HW.get_context(CHW::IMM_CTX_ID), w, h); +} +#endif diff --git a/src/xrCore/Animation/Bone.hpp b/src/xrCore/Animation/Bone.hpp index ec0c6dc472d..30abeb7a2d6 100644 --- a/src/xrCore/Animation/Bone.hpp +++ b/src/xrCore/Animation/Bone.hpp @@ -35,6 +35,8 @@ class XRCORE_API CBoneInstance // data Fmatrix mTransform; // final x-form matrix (local to model) Fmatrix mRenderTransform; // final x-form matrix (model_base -> bone -> model) + Fmatrix mRenderTransform_prev; // Prev x-form matrix + Fmatrix mRenderTransform_temp; // Temp var private: BoneCallback Callback; void* Callback_Param; @@ -509,6 +511,9 @@ IC void CBoneInstance::construct() mTransform.identity(); mRenderTransform.identity(); + mRenderTransform_prev.identity(); + mRenderTransform_temp.identity(); + Callback = nullptr; Callback_Param = nullptr; Callback_overwrite = FALSE; diff --git a/src/xrCore/xr_resource.h b/src/xrCore/xr_resource.h index a659caa65f2..a406cf7450c 100644 --- a/src/xrCore/xr_resource.h +++ b/src/xrCore/xr_resource.h @@ -30,6 +30,8 @@ struct xr_resource_flagged : public xr_resource }; u32 dwFlags{ 0 }; + int skinning; + bool hud_disabled; }; struct xr_resource_named : public xr_resource_flagged diff --git a/src/xrEngine/Environment.cpp b/src/xrEngine/Environment.cpp index 70951527604..832c0c114cb 100644 --- a/src/xrEngine/Environment.cpp +++ b/src/xrEngine/Environment.cpp @@ -34,6 +34,7 @@ static const float MAX_NOISE_FREQ = 0.03f; // real WEATHER->WFX transition time #define WFX_TRANS_TIME 5.f +extern ENGINE_API Fvector4 ps_ssfx_wind_trees; ////////////////////////////////////////////////////////////////////////// // environment @@ -46,6 +47,8 @@ CEnvironment::CEnvironment() wind_blast_direction.set(1.f, 0.f, 0.f); + wind_anim = { 0.0f, 0.0f, 0.0f, 0.0f }; + // fill clouds hemi verts & faces const Fvector* verts; CloudsVerts.resize(xrHemisphereVertices(2, verts)); @@ -404,6 +407,20 @@ void CEnvironment::OnFrame() if (!g_pGameLevel) return; + // Min wind velocity. [ ps_ssfx_wind_trees.w 0 ~ 1 ] + float WindVel = _max(CurrentEnv.wind_velocity, ps_ssfx_wind_trees.w * 1000); + + // Limit min at 200 to avoid slow-mo at extremly low speed. + WindVel = _max(WindVel, 200.f) * 0.001f; + + float WindDir = -CurrentEnv.wind_direction + PI_DIV_2; + Fvector2 WDir = { _cos(WindDir), _sin(WindDir) }; + + wind_anim.x += WindVel * WDir.x * Device.fTimeDelta; + wind_anim.y += WindVel * WDir.y * Device.fTimeDelta; + wind_anim.z += clampr(WindVel * 1.33f, 0.0f, 1.0f) * Device.fTimeDelta; + wind_anim.w += 1.0f * Device.fTimeDelta; + lerp(); PerlinNoise1D->SetFrequency(wind_gust_factor * MAX_NOISE_FREQ); diff --git a/src/xrEngine/Environment.h b/src/xrEngine/Environment.h index b62e6c7ecb4..7a1d894a14c 100644 --- a/src/xrEngine/Environment.h +++ b/src/xrEngine/Environment.h @@ -270,6 +270,7 @@ class ENGINE_API CEnvironment : public xray::editor::ide_tool float wind_gust_factor{}; float wetness_factor{}; + Fvector4 wind_anim; // wind blast params float wind_blast_strength{}; diff --git a/src/xrEngine/Rain.cpp b/src/xrEngine/Rain.cpp index 1274990642b..c02f8148687 100644 --- a/src/xrEngine/Rain.cpp +++ b/src/xrEngine/Rain.cpp @@ -4,6 +4,8 @@ #include "IGame_Persistent.h" #include "Environment.h" +#include "perlin.h" + #ifdef _EDITOR #include "ui_toolscustom.h" #else @@ -16,13 +18,13 @@ // Warning: duplicated in dxRainRender //static const int max_desired_items = 2500; //static const float source_radius = 12.5f; -static const float source_offset = 40.f; -static const float max_distance = source_offset * 1.25f; +static const float source_offset = 20.f; // 40 +static const float max_distance = source_offset * 1.5f;//1.25f; //static const float sink_offset = -(max_distance - source_offset); //static const float drop_length = 5.f; //static const float drop_width = 0.30f; -static const float drop_angle = 3.0f; -static const float drop_max_angle = deg2rad(10.f); +static const float drop_angle = deg2rad(15.0f); // 3.0 +static const float drop_max_angle = deg2rad(35.f); // 10 static const float drop_max_wind_vel = 20.0f; static const float drop_speed_min = 40.f; static const float drop_speed_max = 80.f; @@ -30,6 +32,7 @@ static const float drop_speed_max = 80.f; const int max_particles = 1000; //const int particles_cache = 400; const float particles_time = .3f; +CPerlinNoise1D* RainPerlin; ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -41,41 +44,84 @@ CEffect_Rain::CEffect_Rain() snd_Ambient.create("ambient" DELIMITER "rain", st_Effect, sg_Undefined); + RainPerlin = xr_new(Random.randI(0, 0xFFFF)); + RainPerlin->SetOctaves(2); + RainPerlin->SetAmplitude(0.66666f); + p_create(); } CEffect_Rain::~CEffect_Rain() { + xr_delete(RainPerlin); snd_Ambient.destroy(); // Cleanup p_destroy(); } +void CEffect_Rain::Prepare(Fvector2& offset, Fvector3& axis, float W_Velocity, float W_Direction) +{ + // Wind gust, to add variation. + float Wind_Gust = RainPerlin->GetContinious(Device.fTimeGlobal * 0.3f) * 2.0f; + + // Wind velocity [ 0 ~ 1 ] + float Wind_Velocity = W_Velocity + Wind_Gust; + + clamp(Wind_Velocity, 0.0f, 1.0f); + + // Wind velocity controles the angle + float pitch = drop_max_angle * Wind_Velocity; + axis.setHP(W_Direction, pitch - PI_DIV_2); + + // Get distance + float dist = _sin(pitch) * source_offset; + float C = PI_DIV_2 - pitch; + dist /= _sin(C); + + // 0 is North + float fixNorth = W_Direction - PI_DIV_2; + + // Set offset + offset.set(dist * _cos(fixNorth), dist * _sin(fixNorth)); +} + // Born void CEffect_Rain::Born(Item& dest, float radius, float speed) { ZoneScoped; - Fvector axis; - axis.set(0, -1, 0); - float gust = g_pGamePersistent->Environment().wind_strength_factor / 10.f; - float k = g_pGamePersistent->Environment().CurrentEnv.wind_velocity * gust / drop_max_wind_vel; - clamp(k, 0.f, 1.f); - float pitch = drop_max_angle * k - PI_DIV_2; - axis.setHP(g_pGamePersistent->Environment().CurrentEnv.wind_direction, pitch); + // Prepare correct angle and distance to hit the player + Fvector Rain_Axis = { 0, -1, 0 }; + Fvector2 Rain_Offset; + + float Wind_Direction = -g_pGamePersistent->Environment().CurrentEnv.wind_direction; + + // Wind Velocity [ From 0 ~ 1000 to 0 ~ 1 ] + float Wind_Velocity = g_pGamePersistent->Environment().CurrentEnv.wind_velocity * 0.001f; + clamp(Wind_Velocity, 0.0f, 1.0f); + Prepare(Rain_Offset, Rain_Axis, Wind_Velocity, Wind_Direction); + + // Camera Position Fvector& view = Device.vCameraPosition; - float angle = ::Random.randF(0, PI_MUL_2); - float dist = ::Random.randF(); - dist = _sqrt(dist) * radius; - float x = dist * _cos(angle); - float z = dist * _sin(angle); - dest.D.random_dir(axis, deg2rad(drop_angle)); - dest.P.set(x + view.x - dest.D.x * source_offset, source_offset + view.y, z + view.z - dest.D.z * source_offset); - // dest.P.set (x+view.x,height+view.y,z+view.z); - dest.fSpeed = ::Random.randF(drop_speed_min, drop_speed_max) * speed; + // Random Position + float r = radius * 0.5f; + Fvector2 RandomP = { ::Random.randF(-r, r), ::Random.randF(-r, r) }; + + // Aim ahead of where the player is facing + Fvector FinalView = Fvector().mad(view, Device.vCameraDirection, 5.0f); + // Random direction. Higher angle at lower velocity + dest.D.random_dir(Rain_Axis, ::Random.randF(-drop_angle, drop_angle) * (1.5f - Wind_Velocity)); + + // Set final destination + dest.P.set(Rain_Offset.x + FinalView.x + RandomP.x, source_offset + view.y, Rain_Offset.y + FinalView.z + RandomP.y); + + // Set speed + dest.fSpeed = ::Random.randF(drop_speed_min, drop_speed_max) * speed * clampr(Wind_Velocity * 1.5f, 0.5f, 1.0f); + + // Born float height = max_distance; RenewItem(dest, height, RayPick(dest.P, dest.D, height, collide::rqtBoth)); } @@ -127,7 +173,14 @@ void CEffect_Rain::OnFrame() return; // Parse states - float factor = g_pGamePersistent->Environment().CurrentEnv.rain_density; + float rain_density = g_pGamePersistent->Environment().CurrentEnv.rain_density; + float wind_velocity = g_pGamePersistent->Environment().CurrentEnv.wind_velocity * 0.001f; + clamp(wind_velocity, 0.0f, 1.0f); + + wind_velocity *= (rain_density > 0.0f ? 1.0f : 0.0f); // Only when raining + + // 50% of the volume is by rain_density and 50% wind_velocity; + float factor = rain_density * 0.5f + wind_velocity * 0.5f; static float hemi_factor = 0.f; #ifndef _EDITOR IGameObject* E = g_pGameLevel->CurrentViewEntity(); diff --git a/src/xrEngine/Rain.h b/src/xrEngine/Rain.h index f1945819db6..26fe3e03172 100644 --- a/src/xrEngine/Rain.h +++ b/src/xrEngine/Rain.h @@ -75,6 +75,7 @@ class ENGINE_API CEffect_Rain void Hit(Fvector& pos); bool RayPick(const Fvector& s, const Fvector& d, float& range, collide::rq_target tgt); void RenewItem(Item& dest, float height, bool bHit); + void Prepare(Fvector2& offset, Fvector3& axis, float Wind_Vel, float Wind_Dir); public: CEffect_Rain(); diff --git a/src/xrEngine/device.h b/src/xrEngine/device.h index 26afdd47581..1d924285b7c 100644 --- a/src/xrEngine/device.h +++ b/src/xrEngine/device.h @@ -29,6 +29,22 @@ // refs class Task; +class ENGINE_API CSecondVPParams //--#SM+#-- +SecondVP+ +{ + bool isActive = false; + +public: + bool isCamReady; + u32 screenWidth; + u32 screenHeight; + float scale{ 1.0f }; + float fov{ 1.f }; + Fvector position{}, direction{}, normal{}, right{}; + IC bool IsSVPActive() { return isActive; } + IC void SetSVPActive(bool bState) {}; + IC bool IsSVPFrame() { return false; } +}; + class ENGINE_API CRenderDevice : public IWindowHandler { public: @@ -156,6 +172,8 @@ class ENGINE_API CRenderDevice : public IWindowHandler bool m_allowWindowDrag{}; // For windowed mode bool IsAnselActive{}; + CSecondVPParams m_SecondViewport; + CRenderDevice() { Timer.Start(); diff --git a/src/xrEngine/xr_ioc_cmd.cpp b/src/xrEngine/xr_ioc_cmd.cpp index 4442eac7907..462181d923b 100644 --- a/src/xrEngine/xr_ioc_cmd.cpp +++ b/src/xrEngine/xr_ioc_cmd.cpp @@ -595,7 +595,7 @@ ENGINE_API Fvector4 ps_ssfx_hud_drops_1_cfg = { 3.0f, 1.f, 1.f, 50.f }; // Quant ENGINE_API Fvector4 ps_ssfx_hud_drops_2_cfg = { 50.f, 50.f, 0.75f, 2.f }; // Drops build up speed, Drying speed, Size of the drops, Raindrops gloss intensity ENGINE_API Fvector4 ps_ssfx_blood_decals = { 0.6f, 0.6f, 0.f, 0.f }; ENGINE_API Fvector4 ps_ssfx_rain_1 = { 2.0f, 0.1f, 0.6f, 2.f }; // Len, Width, Speed, Quality -ENGINE_API Fvector4 ps_ssfx_rain_2 = { 0.7f, 0.1f, 1.0f, 0.5f }; // Alpha, Brigthness, Refraction, Reflection +ENGINE_API Fvector4 ps_ssfx_rain_2 = { 0.5f, 0.1f, 1.0f, 0.5f }; // Alpha, Brigthness, Refraction, Reflection ENGINE_API Fvector4 ps_ssfx_rain_3 = { 0.01f, 1.0f, 0.0f, 0.0f }; // Alpha, Refraction ( Splashes ) - Yohji: Alpha was edited (0.5->0.01f) due to a bug with transparency and other particles. ENGINE_API Fvector3 ps_ssfx_shadow_cascades = { 20.f, 40.f, 160.f }; ENGINE_API Fvector4 ps_ssfx_grass_shadows = { .0f, .35f, 30.0f, .0f }; @@ -613,11 +613,33 @@ ENGINE_API int ps_ssfx_gloss_method = 1; ENGINE_API float ps_ssfx_gloss_factor = 0.5f; ENGINE_API Fvector3 ps_ssfx_gloss_minmax = { 0.0f,0.92f,0.0f }; // Gloss ENGINE_API Fvector4 ps_ssfx_lightsetup_1 = { 0.35f, 0.5f, 0.0f, 0.0f }; // Spec intensity - ENGINE_API float ps_r3_dyn_wet_surf_near = 5.f; // 10.0f ENGINE_API float ps_r3_dyn_wet_surf_far = 20.f; // 30.0f ENGINE_API int ps_r3_dyn_wet_surf_sm_res = 256; // 256 +ENGINE_API float ps_ssfx_hud_hemi = 0.15f; // HUD Hemi Offset +ENGINE_API int ps_ssfx_il_quality = 32; // IL Samples +ENGINE_API Fvector4 ps_ssfx_il = { 6.66f, 1.0f, 1.0f, 5.0f }; // Res, Int, Vibrance, Blur +ENGINE_API Fvector4 ps_ssfx_il_setup1 = { 150.0f, 1.0f, 0.5f, 0.0f }; // Distance, HUD, Flora, - +ENGINE_API int ps_ssfx_ao_quality = 4; // AO Samples +ENGINE_API Fvector4 ps_ssfx_ao = { 1.0f, 5.0f, 1.0f, 2.5f }; // Res, AO int, Blur, Radius +ENGINE_API Fvector4 ps_ssfx_ao_setup1 = { 150.0, 1.0, 1.0, 0.0 }; // Distance, HUD, Flora, Max OCC +ENGINE_API Fvector4 ps_ssfx_water = { 1.0f, 0.8f, 1.0f, 0.0f }; // Res, Blur, Blur Perlin, - +ENGINE_API Fvector3 ps_ssfx_water_quality = { 1.0, 2.0, 0.0 }; // SSR Quality, Parallax Quality, - +ENGINE_API Fvector4 ps_ssfx_water_setup1 = { 0.6f, 3.0f, 0.3f, 0.05f }; // Distortion, Turbidity, Softborder, Parallax Height +ENGINE_API Fvector4 ps_ssfx_water_setup2 = { 0.8f, 6.0f, 0.3f, 0.5f }; // Reflection, Specular, Caustics, Ripples +ENGINE_API int ps_ssfx_ssr_quality = 0; // Quality +ENGINE_API Fvector4 ps_ssfx_ssr = { 1.0f, 0.2f, 0.0f, 0.0f }; // Res, Blur, Temp, Noise +ENGINE_API Fvector4 ps_ssfx_ssr_2 = { 0.0f, 1.3f, 1.0f, 0.015f }; // Quality, Fade, Int, Wpn Int +ENGINE_API Fvector4 ps_ssfx_terrain_quality = { 6, 0, 0, 0 }; +ENGINE_API Fvector4 ps_ssfx_terrain_offset = { 0, 0, 0, 0 }; +ENGINE_API Fvector3 ps_ssfx_shadows = { 256, 1536, 0.0f }; +ENGINE_API Fvector4 ps_ssfx_volumetric = { 0, 1.0f, 3.0f, 8.0f }; +ENGINE_API Fvector3 ps_ssfx_shadow_bias = { 0.4f, 0.03f, 0.0f }; +ENGINE_API Fvector4 ps_ssfx_lut = { 0.0f, 0.0f, 0.0f, 0.0f }; +ENGINE_API Fvector4 ps_ssfx_wind_grass = { 9.5f, 1.4f, 1.5f, 0.4f }; +ENGINE_API Fvector4 ps_ssfx_wind_trees = { 11.0f, 0.15f, 0.5f, 0.15f }; + int ps_disable_lens_flare = 1; class CCC_renderer : public CCC_Token diff --git a/src/xrEngine/xr_ioc_cmd.h b/src/xrEngine/xr_ioc_cmd.h index 9920e3e4b2d..689eafb7772 100644 --- a/src/xrEngine/xr_ioc_cmd.h +++ b/src/xrEngine/xr_ioc_cmd.h @@ -64,6 +64,21 @@ extern ENGINE_API Fvector4 ps_ssfx_grass_interactive; extern ENGINE_API Fvector4 ps_ssfx_int_grass_params_1; extern ENGINE_API Fvector4 ps_ssfx_int_grass_params_2; +extern ENGINE_API int ps_ssfx_il_quality; +extern ENGINE_API int ps_ssfx_ao_quality; +extern ENGINE_API Fvector3 ps_ssfx_water_quality; +extern ENGINE_API Fvector4 ps_ssfx_il; +extern ENGINE_API Fvector4 ps_ssfx_ao; +extern ENGINE_API Fvector4 ps_ssfx_water; +extern ENGINE_API int ps_ssfx_ssr_quality; +extern ENGINE_API Fvector4 ps_ssfx_ssr; +extern ENGINE_API Fvector4 ps_ssfx_ssr_2; +extern ENGINE_API Fvector4 ps_ssfx_terrain_quality; +extern ENGINE_API Fvector3 ps_ssfx_shadows; +extern ENGINE_API Fvector4 ps_ssfx_volumetric; +extern ENGINE_API Fvector4 ps_ssfx_wind_grass; +extern ENGINE_API Fvector4 ps_ssfx_wind_trees; + extern ENGINE_API float ps_r3_dyn_wet_surf_near; // 10.0f extern ENGINE_API float ps_r3_dyn_wet_surf_far; // 30.0f extern ENGINE_API int ps_r3_dyn_wet_surf_sm_res; // 256 diff --git a/src/xrGame/Torch.cpp b/src/xrGame/Torch.cpp index cdeb21d913a..be51603ab06 100644 --- a/src/xrGame/Torch.cpp +++ b/src/xrGame/Torch.cpp @@ -239,6 +239,11 @@ bool CTorch::net_Spawn(CSE_Abstract* DC) light_render->set_color(clr); light_render->set_range(range); + if (parent_id() == g_actor->ID()) + { + light_render->set_hud_mode(true); // Enable HUD flag to player headlamp + } + if (b_r2) { bool useVolumetric = pUserData->read_if_exists(TORCH_DEFINITION, "volumetric_enabled", false);