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

cbuffer _Globals : register(b0)
{
  float2 Params : packoffset(c0);
  float4 PositionTransition : packoffset(c1);
  float4 SizeRadius : packoffset(c2);
  float4 ProbeProperties : packoffset(c3);
  float4x4 InvWorldTransform : packoffset(c4);
  float FadeValue : packoffset(c8);
  float4 VPtoRTScaleBias : packoffset(c9);
  row_major float4x4 invViewMatrix : packoffset(c10);
}

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);
TextureCube<float4> IBL_Diffuse : register(t1);
TextureCube<float4> IBL_Specular : register(t2);
Texture2D<float4> LUT : register(t3);
Texture2D<float4> GBuffer1 : register(t4);
Texture2D<float4> GBuffer2 : register(t5);
Texture2D<float4> GBuffer3 : register(t6);
Texture2D<float4> LinearDepth : register(t7);


// 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,
float4 v3 : TexCoord2,  
  out float4 o0 : SV_Target0,
  out float4 o1 : SV_Target1)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r1.x = LinearDepth.Load(r0.xyw).x;
  
  r1.y = global_ViewInfo.x / v3.z;
  r1.yzw = v3.xyz * r1.yyy;
  
float4 s = StereoParams.Load(0);
float4 r20;
r20.xyz = r1.yzw * r1.xxx;
r20.x -= s.x * (r20.z - s.y)/global_Projection._m00;  
  
  // r2.xyz = r1.yzw * r1.xxx;
r2.xyz = r20.xyz;  
  
  r2.w = 1;
  r3.x = dot(invViewMatrix._m00_m01_m02_m03, r2.xyzw);
  r3.y = dot(invViewMatrix._m10_m11_m12_m13, r2.xyzw);
  r3.z = dot(invViewMatrix._m20_m21_m22_m23, r2.xyzw);
  r1.y = cmp(0 >= ProbeProperties.w);
  r1.z = ~(int)r1.y;
  r2.xyz = -PositionTransition.xyz + r3.xyz;
  r1.w = dot(r2.xyz, r2.xyz);
  r2.w = sqrt(r1.w);
  r2.w = SizeRadius.w + -r2.w;
  r4.x = cmp(r2.w < 0);
  r1.y = r1.y ? r4.x : 0;
  if (r1.y != 0) discard;
  r3.w = 1;
  r4.x = dot(r3.xyzw, InvWorldTransform._m00_m10_m20_m30);
  r4.y = dot(r3.xyzw, InvWorldTransform._m01_m11_m21_m31);
  r4.z = dot(r3.xyzw, InvWorldTransform._m02_m12_m22_m32);
  r5.xyz = SizeRadius.xyz + -abs(r4.xyz);
  r5.xyz = cmp(r5.xyz < float3(0,0,0));
  r5.xyz = r5.xyz ? r1.zzz : 0;
  if (r5.x != 0) discard;
  if (r5.y != 0) discard;
  if (r5.z != 0) discard;
  r1.yz = GBuffer1.Load(r0.xyw).xy;
  r5.xyzw = GBuffer3.Load(r0.xyw).xyzw;
  r6.xy = r1.yz * float2(3.55539989,3.55539989) + float2(-1.77769995,-1.77769995);
  r6.z = 1;
  r1.y = dot(r6.xyz, r6.xyz);
  r1.y = 2 / r1.y;
  r6.xy = r1.yy * r6.xy;
  r6.z = -1 + r1.y;
  r1.y = 255 * r5.w;
  r1.y = round(r1.y);
  r1.y = (uint)r1.y;
  if (2 == 0) r1.y = 0; else if (2+1 < 32) {   r1.y = (uint)r1.y << (32-(2 + 1)); r1.y = (uint)r1.y >> (32-2);  } else r1.y = (uint)r1.y >> 1;
  r1.x = cmp(r1.x != 1.000000);
  r1.y = cmp((int)r1.y != 1);
  r1.x = r1.y ? r1.x : 0;
  r1.y = max(0.0900000036, r5.x);
  r7.x = dot(invViewMatrix._m00_m01_m02, r6.xyz);
  r7.y = dot(invViewMatrix._m10_m11_m12, r6.xyz);
  r7.z = dot(invViewMatrix._m20_m21_m22, r6.xyz);
  r6.xyz = global_ViewPos.xyz + -r3.xyz;
  r1.z = dot(r6.xyz, r6.xyz);
  r1.z = rsqrt(r1.z);
  r6.xyz = r6.xyz * r1.zzz;
  r1.z = dot(r7.xyz, r6.xyz);
  r3.w = cmp(0 < ProbeProperties.w);
  if (r3.w != 0) {
    r8.x = dot(r7.xyz, InvWorldTransform._m00_m10_m20);
    r8.y = dot(r7.xyz, InvWorldTransform._m01_m11_m21);
    r8.z = dot(r7.xyz, InvWorldTransform._m02_m12_m22);
    r9.xyz = SizeRadius.xyz + -r4.xyz;
    r9.xyz = r9.xyz / r8.xyz;
    r10.xyz = -SizeRadius.xyz + -r4.xyz;
    r10.xyz = r10.xyz / r8.xyz;
    r11.xyz = min(r10.xyz, r9.xyz);
    r9.xyz = max(r10.xyz, r9.xyz);
    r4.w = max(r11.y, r11.z);
    r4.w = max(r11.x, r4.w);
    r5.x = min(r9.y, r9.z);
    r5.x = min(r9.x, r5.x);
    r5.w = cmp(r5.x >= r4.w);
    r9.xyz = r5.xxx * r8.xyz + r4.xyz;
    r10.xyz = SizeRadius.xyz + -PositionTransition.www;
    r10.xyz = -r10.xyz + abs(r4.xyz);
    r10.xyz = max(float3(0,0,0), r10.xyz);
    r4.w = dot(r10.xyz, r10.xyz);
    r4.w = sqrt(r4.w);
    r6.w = max(9.99999975e-005, PositionTransition.w);
    r6.w = rcp(r6.w);
    r4.w = r6.w * r4.w;
    r4.w = min(1, r4.w);
    r4.w = 1 + -r4.w;
  } else {
    r6.w = dot(r7.xyz, r7.xyz);
    r7.w = dot(r7.xyz, r2.xyz);
    r8.w = r7.w + r7.w;
    r9.w = -SizeRadius.w * SizeRadius.w + r1.w;
    r10.x = r9.w * r6.w;
    r10.x = 4 * r10.x;
    r8.w = r8.w * r8.w + -r10.x;
    r10.x = cmp(r8.w == 0.000000);
    r6.w = rcp(r6.w);
    r10.y = -r7.w * r6.w;
    r10.z = cmp(0 < r7.w);
    r10.w = sqrt(r8.w);
    r11.x = r7.w * 2 + r10.w;
    r11.x = -0.5 * r11.x;
    r7.w = r7.w * 2 + -r10.w;
    r7.w = -0.5 * r7.w;
    r7.w = r10.z ? r11.x : r7.w;
    r11.x = r7.w * r6.w;
    r6.w = rcp(r7.w);
    r11.y = r9.w * r6.w;
    r10.xy = r10.xx ? r10.yy : r11.xy;
    r6.w = cmp(r8.w >= 0);
    r10.zw = cmp(r10.xy < float2(0,0));
    r7.w = r10.w ? r10.z : 0;
    r11.y = ~(int)r7.w;
    r8.w = cmp(r10.y < r10.x);
    r8.w = r8.w ? r10.x : r10.y;
    r11.x = r7.w ? 0 : r8.w;
    r5.xw = r6.ww ? r11.xy : 0;
    r10.xyz = r5.xxx * r7.xyz + r3.xyz;
    r9.xyz = -PositionTransition.xyz + r10.xyz;
    r6.w = max(9.99999975e-005, PositionTransition.w);
    r6.w = rcp(r6.w);
    r4.w = saturate(r6.w * r2.w);
    r8.xyz = r7.xyz;
  }
  r6.w = dot(r9.xyz, r9.xyz);
  r6.w = sqrt(r6.w);
  r6.w = rcp(r6.w);
  r5.x = r6.w * r5.x;
  r5.x = r5.x * r1.y;
  r5.x = max(0, r5.x);
  r5.x = min(r5.x, r1.y);
  r6.w = -r5.x + r1.y;
  r10.y = r1.y * r6.w + r5.x;
  r10.x = max(0.001953125, r1.z);
  r1.z = LUT.Sample(LinearSampler_s, r10.xy).z;
  r5.x = dot(-r6.xyz, r7.xyz);
  r5.x = r5.x + r5.x;
  r6.xyz = r7.xyz * -r5.xxx + -r6.xyz;
  if (r3.w != 0) {
    r7.x = dot(r6.xyz, InvWorldTransform._m00_m10_m20);
    r7.y = dot(r6.xyz, InvWorldTransform._m01_m11_m21);
    r7.z = dot(r6.xyz, InvWorldTransform._m02_m12_m22);
    r11.xyz = SizeRadius.xyz + -r4.xyz;
    r11.xyz = r11.xyz / r7.xyz;
    r12.xyz = -SizeRadius.xyz + -r4.xyz;
    r12.xyz = r12.xyz / r7.xyz;
    r13.xyz = min(r12.xyz, r11.xyz);
    r11.xyz = max(r12.xyz, r11.xyz);
    r3.w = max(r13.y, r13.z);
    r3.w = max(r13.x, r3.w);
    r5.x = min(r11.y, r11.z);
    r11.x = min(r11.x, r5.x);
    r11.y = cmp(r11.x >= r3.w);
    r12.xyz = r11.xxx * r7.xyz + r4.xyz;
    r13.xyz = SizeRadius.xyz + -PositionTransition.www;
    r4.xyz = -r13.xyz + abs(r4.xyz);
    r4.xyz = max(float3(0,0,0), r4.xyz);
    r3.w = dot(r4.xyz, r4.xyz);
    r3.w = sqrt(r3.w);
    r4.x = max(9.99999975e-005, PositionTransition.w);
    r4.x = rcp(r4.x);
    r3.w = r4.x * r3.w;
    r3.w = min(1, r3.w);
    r3.w = 1 + -r3.w;
    r6.xyz = r7.xyz;
  } else {
    r4.x = dot(r6.xyz, r6.xyz);
    r2.x = dot(r6.xyz, r2.xyz);
    r2.y = r2.x + r2.x;
    r1.w = -SizeRadius.w * SizeRadius.w + r1.w;
    r2.z = r1.w * r4.x;
    r2.z = 4 * r2.z;
    r2.y = r2.y * r2.y + -r2.z;
    r2.z = cmp(r2.y == 0.000000);
    r4.x = rcp(r4.x);
    r4.y = r4.x * -r2.x;
    r4.z = cmp(0 < r2.x);
    r5.x = sqrt(r2.y);
    r6.w = r2.x * 2 + r5.x;
    r6.w = -0.5 * r6.w;
    r2.x = r2.x * 2 + -r5.x;
    r2.x = -0.5 * r2.x;
    r2.x = r4.z ? r6.w : r2.x;
    r7.x = r2.x * r4.x;
    r2.x = rcp(r2.x);
    r7.y = r2.x * r1.w;
    r2.xz = r2.zz ? r4.yy : r7.xy;
    r1.w = cmp(r2.y >= 0);
    r4.xy = cmp(r2.xz < float2(0,0));
    r2.y = r4.y ? r4.x : 0;
    r4.y = ~(int)r2.y;
    r4.z = cmp(r2.z < r2.x);
    r2.x = r4.z ? r2.x : r2.z;
    r4.x = r2.y ? 0 : r2.x;
    r11.xy = r1.ww ? r4.xy : 0;
    r2.xyz = r11.xxx * r6.xyz + r3.xyz;
    r12.xyz = -PositionTransition.xyz + r2.xyz;
    r1.w = max(9.99999975e-005, PositionTransition.w);
    r1.w = rcp(r1.w);
    r3.w = saturate(r2.w * r1.w);
  }
  r1.w = dot(r12.xyz, r12.xyz);
  r1.w = sqrt(r1.w);
  r1.w = rcp(r1.w);
  r1.w = r11.x * r1.w;
  r1.w = r1.w * r1.y;
  r1.w = max(0, r1.w);
  r1.w = min(r1.w, r1.y);
  r2.x = r1.y + -r1.w;
  r10.z = r1.y * r2.x + r1.w;
  r1.yw = LUT.Sample(LinearSampler_s, r10.xz).xy;
  if (r1.x != 0) {
    r0.xyz = GBuffer2.Load(r0.xyz).xyz;
    r2.xyz = cmp(ProbeProperties.xxx == float3(2,0,1));
    r2.xy = (int2)r2.yz | (int2)r2.xx;
    if (r2.x != 0) {
      r0.w = r5.w ? 1.000000 : 0;
      r1.x = r4.w * -2 + 3;
      r2.x = r4.w * r4.w;
      r1.x = r2.x * r1.x;
      r0.w = r1.x * r0.w;
      r1.x = cmp(9.99999975e-005 < r0.w);
      if (r1.x != 0) {
        r2.xzw = -r9.xyz + r8.xyz;
        r2.xzw = r10.yyy * r2.xzw + r9.xyz;
        r4.xyzw = IBL_Diffuse.SampleLevel(LinearSampler_s, r2.xzw, 0).wxyz;
        r2.xzw = float3(100,100,100) * r4.yzw;
        r1.x = 1 + -r5.z;
        r3.xyz = r1.xxx * r0.xyz;
        r3.xyz = r3.xyz * r1.zzz;
        r2.xzw = r3.xyz * r2.xzw;
        r4.x = saturate(r4.x);
        r0.w = r4.x * r0.w;
        r4.w = FadeValue * r0.w;
        r2.xzw = ProbeProperties.zzz * r2.xzw;
        r2.xzw = FadeValue * r2.xzw;
      } else {
        r2.xzw = float3(0,0,0);
        r4.w = 0;
      }
    } else {
      r2.xzw = float3(0,0,0);
      r4.w = 0;
    }
    if (r2.y != 0) {
      r0.w = r11.y ? 1.000000 : 0;
      r1.x = r3.w * -2 + 3;
      r1.z = r3.w * r3.w;
      r1.x = r1.x * r1.z;
      r0.w = r1.x * r0.w;
      r1.x = cmp(9.99999975e-005 < r0.w);
      if (r1.x != 0) {
        r1.x = r5.y * r5.y;
        r1.x = 0.159999996 * r1.x;
        r3.xyz = -r12.xyz + r6.xyz;
        r3.xyz = r10.zzz * r3.xyz + r12.xyz;
        r1.z = ProbeProperties.y * r10.z;
        r3.xyzw = IBL_Specular.SampleLevel(LinearSampler_s, r3.xyz, r1.z).wxyz;
        r3.yzw = float3(100,100,100) * r3.yzw;
        r1.z = 1 + -r5.z;
        r0.xyz = r5.zzz * r0.xyz;
        r0.xyz = r1.zzz * r1.xxx + r0.xyz;
        r0.xyz = r0.xyz * r1.yyy + r1.www;
        r0.xyz = r3.yzw * r0.xyz;
        r3.x = saturate(r3.x);
        r0.w = r3.x * r0.w;
        r1.w = FadeValue * r0.w;
        r0.xyz = ProbeProperties.zzz * r0.xyz;
        r0.xyz = FadeValue * r0.xyz;
      } else {
        r0.xyz = float3(0,0,0);
        r1.w = 0;
      }
    } else {
      r0.xyz = float3(0,0,0);
      r1.w = 0;
    }
    r0.w = Exposure.Load(float4(0,0,0,0)).x;
    r2.y = cmp(r0.w == 0.000000);
    r0.w = r2.y ? 0.00999999978 : r0.w;
    r4.xyz = r2.xzw * r0.www;
    r1.xyz = r0.xyz * r0.www;
    o0.xyzw = r1.xyzw;
    o1.xyzw = r4.xyzw;
  } else {
    o0.xyzw = float4(0,0,0,0);
    o1.xyzw = float4(0,0,0,0);
  }
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\1a4284625b32435e-ps_replace.txt(323,12-41): warning X3206: 'Load': implicit truncation of vector type
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\1a4284625b32435e-ps_replace.txt(308,18-41): warning X4121: gradient-based operations must be moved out of flow control to prevent divergence. Performance may improve by using a non-gradient operation
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\1a4284625b32435e-ps_replace.txt(308,18-32): warning X4121: gradient-based operations must be moved out of flow control to prevent divergence. Performance may improve by using a non-gradient operation
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\1a4284625b32435e-ps_replace.txt(275,18-32): warning X4121: gradient-based operations must be moved out of flow control to prevent divergence. Performance may improve by using a non-gradient operation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 