//Lights
// ---- Created with 3Dmigoto v1.2.56 on Wed May 24 18:33:04 2017

cbuffer _Globals : register(b0)
{
  float2 Params : packoffset(c0);
  float4 VPtoRTScaleBias : packoffset(c1);
  float3 lightColor : packoffset(c2);
  float4 lightInfo : packoffset(c3);
}

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);
}

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);


// 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,
float4 v4 : TexCoord3,  
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9;
  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;
  if (r2.y != 0) {
    r2.yz = GBuffer1.Load(r0.xyw).xy;
    r3.xyz = GBuffer2.Load(r0.xyw).xyz;
    r4.xy = r2.yz * float2(3.55539989,3.55539989) + float2(-1.77769995,-1.77769995);
    r4.z = 1;
    r2.y = dot(r4.xyz, r4.xyz);
    r2.y = 2 / r2.y;
    r4.xy = r2.yy * r4.xy;
    r4.z = -1 + r2.y;
    r1.x = max(0.0900000036, r1.x);
    r1.y = r1.y * r1.y;
    r1.y = 0.159999996 * r1.y;
	
    r2.y = global_ViewInfo.x / v4.z;
    r2.yzw = v4.xyz * r2.yyy;
    
float4 s = StereoParams.Load(0);
float4 r20;
r20.xyz = r2.yzw * r2.xxx;
r20.x -= s.x * (r20.z - s.y)/global_Projection._m00;  
	
	// r5.xyz = r2.yzw * r2.xxx;
r5.xyz = r20.xyz;
    
	// r6.xyz = r2.yzw * r2.xxx + -v2.xyz;
r6.xyz = r20.xyz + -v2.xyz;	
	
	
    r3.w = dot(r6.xyz, r6.xyz);
    r3.w = sqrt(r3.w);
    r3.w = lightInfo.x + -r3.w;
    r3.w = cmp(r3.w < 0);
    if (r3.w != 0) discard;
    r3.w = rcp(lightInfo.x);
    r4.w = dot(-r5.xyz, -r5.xyz);
    r4.w = rsqrt(r4.w);
    r6.xyz = -r5.xyz * r4.www;
    
	
	// r2.xyz = -r2.yzw * r2.xxx + v2.xyz;
r2.xyz = -r20.xyz + v2.xyz;	
	
    r2.w = dot(r2.xyz, r2.xyz);
    r5.w = rsqrt(r2.w);
    r2.xyz = r5.www * r2.xyz;
    r5.w = dot(r4.xyz, r6.xyz);
    r5.w = max(9.99999975e-006, r5.w);
    r5.xyz = -r5.xyz * r4.www + r2.xyz;
    r4.w = dot(r5.xyz, r5.xyz);
    r4.w = rsqrt(r4.w);
    r5.xyz = r5.xyz * r4.www;
    r4.w = saturate(dot(r2.xyz, r5.xyz));
    r6.x = saturate(dot(r4.xyz, r5.xyz));
    r4.x = saturate(dot(r4.xyz, r2.xyz));
    r4.y = 0.318309873 * lightInfo.y;
    r4.z = dot(v3.xyz, v3.xyz);
    r4.z = rsqrt(r4.z);
    r6.yzw = v3.xyz * r4.zzz;
    r2.x = dot(-r2.xyz, r6.yzw);
    r2.y = cmp(lightInfo.z < r2.x);
    r2.z = r3.w * r3.w;
    r2.z = r2.w * r2.z;
    r2.z = -r2.z * r2.z + 1;
    r2.zw = max(float2(0,9.99999975e-005), r2.zw);
    r2.z = r2.z * r2.z;
    r2.w = rcp(r2.w);
    r2.z = r2.z * r2.w;
    r2.x = -lightInfo.z + r2.x;
    r2.w = lightInfo.w + -lightInfo.z;
    r2.w = max(1.00000001e-007, r2.w);
    r2.x = saturate(r2.x / r2.w);
    r2.x = r2.x * r2.x;
    r2.x = r2.z * r2.x;
    r2.x = r4.x * r2.x;
    r2.x = r2.y ? r2.x : 0;
    r2.y = 1 + -r1.z;
    r6.yzw = r2.yyy * r3.xyz;
    r2.z = r1.x * -0.337748349 + 1;
    r2.w = r4.w * r4.w;
    r2.w = dot(r2.ww, r1.xx);
    r2.w = r1.x * 0.5 + r2.w;
    r2.w = -1 + r2.w;
    r3.w = 1 + -r4.x;
    r3.w = max(9.99999975e-005, r3.w);
    r4.z = r3.w * r3.w;
    r4.z = r4.z * r4.z;
    r3.w = r4.z * r3.w;
    r3.w = r2.w * r3.w + 1;
    r4.z = 1 + -r5.w;
    r4.z = max(9.99999975e-005, abs(r4.z));
    r7.x = r4.z * r4.z;
    r7.x = r7.x * r7.x;
    r4.z = r7.x * r4.z;
    r2.w = r2.w * r4.z + 1;
    r2.w = r3.w * r2.w;
    r2.z = r2.w * r2.z;
    r2.z = 0.318309873 * r2.z;
    if (r1.w == 0) {
      r7.xyz = r3.xyz * r1.zzz;
      r7.xyz = r2.yyy * r1.yyy + r7.xyz;
      r1.w = 1 + r1.x;
      r1.w = 0.5 * r1.w;
      r2.w = r1.x * r1.x;
      r8.xyz = float3(1,1,1) + -r7.xyz;
      r3.w = 1 + -r4.w;
      r3.w = max(9.99999975e-005, r3.w);
      r4.z = r3.w * r3.w;
      r4.z = r4.z * r4.z;
      r3.w = r4.z * r3.w;
      r7.xyz = r8.xyz * r3.www + r7.xyz;
      r1.w = r1.w * r1.w;
      r3.w = -r5.w * r1.w + r5.w;
      r3.w = r3.w * r5.w + r1.w;
      r3.w = sqrt(r3.w);
      r4.z = -r4.x * r1.w + r4.x;
      r1.w = r4.z * r4.x + r1.w;
      r1.w = sqrt(r1.w);
      r1.w = r5.w * r1.w;
      r1.w = r4.x * r3.w + r1.w;
      r1.w = rcp(r1.w);
      r1.w = 0.5 * r1.w;
      r2.w = r2.w * r2.w;
      r3.w = r6.x * r2.w + -r6.x;
      r3.w = r3.w * r6.x + 1;
      r3.w = r3.w * r3.w;
      r3.w = 3.14159274 * r3.w;
      r3.w = rcp(r3.w);
      r2.w = r3.w * r2.w;
      r7.xyz = r7.xyz * r1.www;
      r7.xyz = r7.xyz * r2.www;
    } else {
      r0.xyzw = GBuffer4.Load(r0.xyz).xyzw;
      r0.yz = float2(255,15.9375) * r0.zy;
      r1.w = floor(r0.z);
      r8.x = r0.x * 4080 + r1.w;
      r0.x = frac(r0.z);
      r8.y = r0.x * 4096 + r0.y;
      r0.xy = r8.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);
      r8.xyz = float3(1,1,1) + -abs(r0.xyx);
      r9.z = r8.x + -abs(r0.y);
      r0.z = cmp(r9.z >= 0);
      r8.xw = cmp(r0.xy >= float2(0,0));
      r8.xw = r8.xw ? float2(1,1) : float2(-1,-1);
      r8.xy = r8.yz * r8.xw;
      r9.xy = r0.zz ? r0.xy : r8.xy;
      r0.x = dot(r9.xyz, r9.xyz);
      r0.x = rsqrt(r0.x);
      r0.xyz = r9.xyz * r0.xxx;
      r0.x = dot(r5.xyz, r0.xyz);
      r3.xyz = r3.xyz * r1.zzz;
      r1.yzw = r2.yyy * r1.yyy + r3.xyz;
      r0.y = 1 + r1.x;
      r0.y = 0.5 * r0.y;
      r0.z = r1.x * r1.x;
      r3.xyz = float3(1,1,1) + -r1.yzw;
      r1.x = 1 + -r4.w;
      r1.x = max(9.99999975e-005, r1.x);
      r2.y = r1.x * r1.x;
      r2.y = r2.y * r2.y;
      r1.x = r2.y * r1.x;
      r1.xyz = r3.xyz * r1.xxx + r1.yzw;
      r0.y = r0.y * r0.y;
      r1.w = -r5.w * r0.y + r5.w;
      r1.w = r1.w * r5.w + r0.y;
      r1.w = sqrt(r1.w);
      r2.y = -r4.x * r0.y + r4.x;
      r0.y = r2.y * r4.x + r0.y;
      r0.y = sqrt(r0.y);
      r0.y = r5.w * r0.y;
      r0.y = r4.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 = -r6.x * r6.x + r0.x;
      r2.y = r1.w * r1.w;
      r0.w = r0.w / r2.y;
      r2.y = r0.z * r0.z;
      r0.x = r0.x / r2.y;
      r0.x = r0.w + r0.x;
      r0.x = r6.x * r6.x + 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;
      r7.xyz = r0.yzw * r0.xxx;
    }
    r0.x = r4.y * r2.x;
    r0.xyz = lightColor.xyz * r0.xxx;
    r1.xyz = r6.yzw * r2.zzz + r7.xyz;
    r0.xyz = r1.xyz * r0.xyz;
    r0.xyz = max(float3(0,0,0), r0.xyz);
    o0.w = 0;
    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;
  } else {
    o0.xyzw = float4(0,0,0,0);
  }
  return;
}

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