/**
 * @ Version: SCREEN SPACE SHADERS - UPDATE 21
 * @ Description: SSR - Blur Phase
 * @ Modified time: 2024-06-04 09:43
 * @ Author: https://www.moddb.com/members/ascii1457
 * @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders
 */

#include "screenspace_common.h"

uniform float4 blur_params; // x: | y: | z: Buffer width | w: Buffer Height
uniform float4 ssr_setup; // x: SSR Resolution | y: Blur Intensity

Texture2D ssr_image;

float4 main(p_screen I) : SV_Target
{
	// Sample SSR result
	float4 base_image = ssr_image.SampleLevel(smp_nofilter, I.tc0, 0);

#ifndef USE_MSAA
	float gloss = s_diffuse.Sample( smp_nofilter, I.tc0 * ssr_setup.x ).a;
#else
	float gloss = s_diffuse.Load( int3( I.hpos.xy * ssr_setup.x, 0 ), 0 ).a;
#endif

	float4 blur = 0;

	float2 buffer_pixel_size = 1.0 / blur_params.zw;
	
	float2 offset = 1.0f;
	float r = 0.9f;
	
	for (int i = 0; i < 12; i++) 
	{
		r += 1.0f / r; 
		offset = mul(offset, pp_rotation_matrix);

		float4 test = ssr_image.SampleLevel(smp_nofilter, I.tc0 + (offset * (r - 1.0f) * buffer_pixel_size), 0);

		blur.rgb += test.rgb;
	}
	blur /= 12;

	// Limit at lower resolution
	float Blur_Int = clamp(ssr_setup.y, ( ssr_setup.x / 10 - 0.1f ) * 3.0f, 1);

	// Blur <- 0.0f Gloss 0.4f -> Sharp
	blur.rgb = lerp(blur.rgb, base_image.rgb, saturate((gloss * (1.0f - Blur_Int)) * 2.5f));

	return blur;
}