#include "Defines.hlsli"
#include "PosManipulation.hlsli"

static float Radius = 100;

float GetSSAO(float3 pos, float2 uv, int2 texCoord2, uint2 rndID)
{
	
	float occlusion = 0.0f;
	//create sample coordinate system
	float4 rnd = float4( SSAORand[int2(rndID.x % (SSAORand.Length.x),  rndID.y % (SSAORand.Length.y))].xyz, 0.0f );
	rnd = normalize(rnd);
	float3 normal = NormalSpec[texCoord2].xyz;
	float3 tangent = float3( normalize(rnd.xyz - (normal * dot(rnd.xyz, normal))));
	float3 biTangent = float3( cross(tangent.xyz, normal));

	float3x3 tbn = float3x3(tangent, biTangent, normal);

	for( uint i = 0; i < SSAOKernel.Length.x; ++i )
	{
		//int i = 0;
		//take sample from localspace to viewspace

		float3 sampled = mul(tbn, SSAOKernel[i].xyz);
		sampled = sampled * Radius + pos;
		//project sample to get uv.xy
		float4 ProjOffset = float4(sampled,1);
		ProjOffset = mul(Proj, ProjOffset);
		float4 offset = ProjOffset;
		float2 UV = offset.xy;
		offset /= offset.w;
		offset.xyz = offset.xyz * 0.5f + 0.5f;
		//extra invert y axis, DX11
		offset.y = 1.0f - offset.y;
		
		// get depth from that point in screenspace
		uint2 texCoord;
		texCoord = (uint2)(offset.xy * Pixels);
		float3 ViewPos = ToVpos(texCoord, UV);

		float sampleDepth = ViewPos.z;

		//compare to depth from sample
		float rangeCheck = (abs(pos.z - sampleDepth) < Radius) ? 1.0f : 0.0f;
		occlusion += (sampleDepth <= sampled.z ? 1.0f : 0.0f) * rangeCheck;
	}
	occlusion /= (float)(SSAOKernel.Length.x);
	occlusion = 1.0f - occlusion;

	return occlusion;
}

