//Lights
// ---- Created with 3Dmigoto v1.2.56 on Wed May 24 00:15:48 2017

cbuffer _Globals : register(b0)
{
  float2 Params : packoffset(c0);
  row_major float4x4 ViewProjMatrix : packoffset(c1);
  float3 lightColor : packoffset(c5);
  float4 lightInfo : packoffset(c6);
}

cbuffer PerView : register(b12)
{
  row_major float4x4 global_View : packoffset(c0);
  row_major float4x4 global_Projection : packoffset(c4);
  row_major float4x4 global_ViewProjection : packoffset(c8);
  float4 global_ViewPos : packoffset(c12);
  float4 global_ViewInfo : packoffset(c13);
  float4 global_ScaleAndBias : packoffset(c14);
}

SamplerState LinearSampler_s : register(s0);
Texture2D<float4> Exposure : register(t0);
Texture2D<float4> LinearDepth : register(t1);
Texture2D<float4> GBuffer1 : register(t2);
Texture2D<float4> GBuffer2 : register(t3);
Texture2D<float4> GBuffer3 : register(t4);
Texture2D<float4> GBuffer4 : register(t5);
Texture2D<float4> Shadow : register(t6);


// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main( 
  float4 v0 : SV_Position0,
  float4 v1 : TexCoord0,
  float3 v2 : TexCoord1,
  float3 v3 : TexCoord2,
  float3 v4 : TexCoord3,  
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r1.xyzw = GBuffer3.Load(r0.xyw).xyzw;
  r2.x = LinearDepth.Load(r0.xyw).x;
  r1.w = 255 * r1.w;
  r1.w = round(r1.w);
  r1.w = (uint)r1.w;
  if (2 == 0) r1.w = 0; else if (2+1 < 32) {   r1.w = (uint)r1.w << (32-(2 + 1)); r1.w = (uint)r1.w >> (32-2);  } else r1.w = (uint)r1.w >> 1;
  r2.y = cmp(r2.x != 1.000000);
  r2.z = cmp((int)r1.w != 1);
  r2.y = r2.z ? r2.y : 0;
  
  r2.z = global_ViewInfo.x / v4.z;
  r3.xyz = v4.xyz * r2.zzz;
  
float4 s = StereoParams.Load(0);
float4 r20;
r20.xyz = r3.xyz * r2.xxx;
r20.x -= s.x * (r20.z - s.y)/global_Projection._m00;    
  
  // r4.xyz = r3.xyz * r2.xxx;
r4.xyz = r20.xyz;  
  
  r4.w = 1;
  r5.x = dot(ViewProjMatrix._m00_m01_m02_m03, r4.xyzw);
  r5.y = dot(ViewProjMatrix._m10_m11_m12_m13, r4.xyzw);
  r2.z = dot(ViewProjMatrix._m30_m31_m32_m33, r4.xyzw);
  r2.zw = r5.xy / r2.zz;
  r2.zw = Shadow.Sample(LinearSampler_s, r2.zw).xy;
  if (r2.y != 0) {
    r5.xy = GBuffer1.Load(r0.xyw).xy;
    r6.xyz = GBuffer2.Load(r0.xyw).xyz;
    r5.xy = r5.xy * float2(3.55539989,3.55539989) + float2(-1.77769995,-1.77769995);
    r5.z = 1;
    r2.y = dot(r5.xyz, r5.xyz);
    r2.y = 2 / r2.y;
    r5.xy = r2.yy * r5.xy;
    r5.z = -1 + r2.y;
    r1.x = max(0.0900000036, r1.x);
    r1.y = r1.y * r1.y;
    r1.y = 0.159999996 * r1.y;
	
    // r7.xyz = r3.xyz * r2.xxx + -v2.xyz;
r7.xyz = r20.xyz + -v2.xyz;
	
    r2.y = dot(r7.xyz, r7.xyz);
    r2.y = sqrt(r2.y);
    r2.y = lightInfo.x + -r2.y;
    r2.y = cmp(r2.y < 0);
    if (r2.y != 0) discard;
    r2.y = rcp(lightInfo.x);
    r3.w = dot(-r4.xyz, -r4.xyz);
    r3.w = rsqrt(r3.w);
    r7.xyz = -r4.xyz * r3.www;
	
    // r3.xyz = -r3.xyz * r2.xxx + v2.xyz;
r3.xyz = -r20.xyz + v2.xyz;	
	
    r2.x = dot(r3.xyz, r3.xyz);
    r4.w = rsqrt(r2.x);
    r3.xyz = r4.www * r3.xyz;
    r4.w = dot(r5.xyz, r7.xyz);
    r4.w = max(9.99999975e-006, r4.w);
    r4.xyz = -r4.xyz * r3.www + r3.xyz;
    r3.w = dot(r4.xyz, r4.xyz);
    r3.w = rsqrt(r3.w);
    r4.xyz = r4.xyz * r3.www;
    r3.w = saturate(dot(r3.xyz, r4.xyz));
    r5.w = saturate(dot(r5.xyz, r4.xyz));
    r5.x = saturate(dot(r5.xyz, r3.xyz));
    r5.y = 0.318309873 * lightInfo.y;
    r5.z = dot(v3.xyz, v3.xyz);
    r5.z = rsqrt(r5.z);
    r7.xyz = v3.xyz * r5.zzz;
    r3.x = dot(-r3.xyz, r7.xyz);
    r3.y = cmp(lightInfo.z < r3.x);
    r2.y = r2.y * r2.y;
    r2.y = r2.x * r2.y;
    r2.y = -r2.y * r2.y + 1;
    r2.y = max(0, r2.y);
    r2.y = r2.y * r2.y;
    r3.z = max(9.99999975e-005, r2.x);
    r3.z = rcp(r3.z);
    r2.y = r3.z * r2.y;
    r3.x = -lightInfo.z + r3.x;
    r3.z = lightInfo.w + -lightInfo.z;
    r3.z = max(1.00000001e-007, r3.z);
    r3.x = saturate(r3.x / r3.z);
    r3.xz = r3.xw * r3.xw;
    r2.y = r3.x * r2.y;
    r2.y = r5.x * r2.y;
    r2.y = r3.y ? r2.y : 0;
    r3.x = 1 + -r1.z;
    r7.xyz = r3.xxx * r6.xyz;
    r3.y = r1.x * -0.337748349 + 1;
    r3.z = dot(r3.zz, r1.xx);
    r3.z = r1.x * 0.5 + r3.z;
    r3.z = -1 + r3.z;
    r5.z = 1 + -r5.x;
    r5.z = max(9.99999975e-005, r5.z);
    r6.w = r5.z * r5.z;
    r6.w = r6.w * r6.w;
    r5.z = r6.w * r5.z;
    r5.z = r3.z * r5.z + 1;
    r6.w = 1 + -r4.w;
    r6.w = max(9.99999975e-005, abs(r6.w));
    r7.w = r6.w * r6.w;
    r7.w = r7.w * r7.w;
    r6.w = r7.w * r6.w;
    r3.z = r3.z * r6.w + 1;
    r3.z = r5.z * r3.z;
    r3.y = r3.z * r3.y;
    r3.y = 0.318309873 * r3.y;
    if (r1.w == 0) {
      r8.xyz = r6.xyz * r1.zzz;
      r8.xyz = r3.xxx * r1.yyy + r8.xyz;
      r1.w = 1 + r1.x;
      r1.w = 0.5 * r1.w;
      r3.z = r1.x * r1.x;
      r9.xyz = float3(1,1,1) + -r8.xyz;
      r5.z = 1 + -r3.w;
      r5.z = max(9.99999975e-005, r5.z);
      r6.w = r5.z * r5.z;
      r6.w = r6.w * r6.w;
      r5.z = r6.w * r5.z;
      r8.xyz = r9.xyz * r5.zzz + r8.xyz;
      r1.w = r1.w * r1.w;
      r5.z = -r4.w * r1.w + r4.w;
      r5.z = r5.z * r4.w + r1.w;
      r5.z = sqrt(r5.z);
      r6.w = -r5.x * r1.w + r5.x;
      r1.w = r6.w * r5.x + r1.w;
      r1.w = sqrt(r1.w);
      r1.w = r4.w * r1.w;
      r1.w = r5.x * r5.z + r1.w;
      r1.w = rcp(r1.w);
      r1.w = 0.5 * r1.w;
      r3.z = r3.z * r3.z;
      r5.z = r5.w * r3.z + -r5.w;
      r5.z = r5.z * r5.w + 1;
      r5.z = r5.z * r5.z;
      r5.z = 3.14159274 * r5.z;
      r5.z = rcp(r5.z);
      r3.z = r5.z * r3.z;
      r8.xyz = r8.xyz * r1.www;
      r8.xyz = r8.xyz * r3.zzz;
    } else {
      r0.xyzw = GBuffer4.Load(r0.xyz).xyzw;
      r0.yz = float2(255,15.9375) * r0.zy;
      r1.w = floor(r0.z);
      r9.x = r0.x * 4080 + r1.w;
      r0.x = frac(r0.z);
      r9.y = r0.x * 4096 + r0.y;
      r0.xy = r9.xy * float2(0.000488519785,0.000488519785) + float2(-1,-1);
      r0.xy = max(float2(-1,-1), r0.xy);
      r0.xy = min(float2(1,1), r0.xy);
      r9.xyz = float3(1,1,1) + -abs(r0.xyx);
      r10.z = r9.x + -abs(r0.y);
      r0.z = cmp(r10.z >= 0);
      r9.xw = cmp(r0.xy >= float2(0,0));
      r9.xw = r9.xw ? float2(1,1) : float2(-1,-1);
      r9.xy = r9.yz * r9.xw;
      r10.xy = r0.zz ? r0.xy : r9.xy;
      r0.x = dot(r10.xyz, r10.xyz);
      r0.x = rsqrt(r0.x);
      r0.xyz = r10.xyz * r0.xxx;
      r0.x = dot(r4.xyz, r0.xyz);
      r4.xyz = r6.xyz * r1.zzz;
      r1.yzw = r3.xxx * r1.yyy + r4.xyz;
      r0.y = 1 + r1.x;
      r0.y = 0.5 * r0.y;
      r0.z = r1.x * r1.x;
      r4.xyz = float3(1,1,1) + -r1.yzw;
      r1.x = 1 + -r3.w;
      r1.x = max(9.99999975e-005, r1.x);
      r3.x = r1.x * r1.x;
      r3.x = r3.x * r3.x;
      r1.x = r3.x * r1.x;
      r1.xyz = r4.xyz * r1.xxx + r1.yzw;
      r0.y = r0.y * r0.y;
      r1.w = -r4.w * r0.y + r4.w;
      r1.w = r1.w * r4.w + r0.y;
      r1.w = sqrt(r1.w);
      r3.x = -r5.x * r0.y + r5.x;
      r0.y = r3.x * r5.x + r0.y;
      r0.y = sqrt(r0.y);
      r0.y = r4.w * r0.y;
      r0.y = r5.x * r1.w + r0.y;
      r0.y = rcp(r0.y);
      r0.w = -r0.w * 0.899999976 + 1;
      r0.w = sqrt(r0.w);
      r1.w = r0.z / r0.w;
      r1.w = min(1, r1.w);
      r1.w = max(0.00100000005, r1.w);
      r0.z = r0.z * r0.w;
      r0.z = max(0.00100000005, r0.z);
      r0.w = r0.x * r0.x;
      r0.x = -r0.x * r0.x + 1;
      r0.x = -r5.w * r5.w + r0.x;
      r3.x = r1.w * r1.w;
      r0.w = r0.w / r3.x;
      r3.x = r0.z * r0.z;
      r0.x = r0.x / r3.x;
      r0.x = r0.w + r0.x;
      r0.x = r5.w * r5.w + r0.x;
      r0.z = r1.w * r0.z;
      r0.x = r0.x * r0.x;
      r0.x = r0.x * r0.z;
      r0.xy = float2(3.14159274,0.5) * r0.xy;
      r0.x = rcp(r0.x);
      r0.yzw = r1.xyz * r0.yyy;
      r8.xyz = r0.yzw * r0.xxx;
    }
    r0.x = sqrt(r2.x);
    r0.y = cmp(r2.z >= r0.x);
    r0.y = r0.y ? 1.000000 : 0;
    r0.z = -r2.z * r2.z + r2.w;
    r0.z = max(1.00000001e-007, r0.z);
    r0.x = r0.x + -r2.z;
    r0.x = r0.x * r0.x + r0.z;
    r0.x = r0.z / r0.x;
    r0.x = -0.400000006 + r0.x;
    r0.x = saturate(1.66666663 * r0.x);
    r0.x = max(r0.y, r0.x);
    r0.y = r5.y * r2.y;
    r0.yzw = lightColor.xyz * r0.yyy;
    r1.xyz = r7.xyz * r3.yyy + r8.xyz;
    r0.yzw = r1.xyz * r0.yzw;
    r0.yzw = max(float3(0,0,0), r0.yzw);
    r0.xyz = r0.yzw * r0.xxx;
    r0.w = Exposure.Load(float4(0,0,0,0)).x;
    r1.x = cmp(r0.w == 0.000000);
    r0.w = r1.x ? 0.00999999978 : r0.w;
    o0.xyz = r0.xyz * r0.www;
    o0.w = 0;
  } else {
    o0.xyzw = float4(0,0,0,0);
  }
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\a4b68d0b7130ed97-ps_replace.txt(263,12-41): warning X3206: 'Load': implicit truncation of vector type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
