//INDOOR LOCAL 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);
  float4 shaderProperties : packoffset(c2);
  row_major float3x3 invViewMatrix : packoffset(c3);
}

cbuffer PerFrame : register(b13)
{
  float4x4 global_LightPropertyMatrix : packoffset(c0);
  float4x3 global_FogPropertyMatrix : packoffset(c4);
  float4 global_Data : packoffset(c7);
}

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> GBuffer0 : register(t1);
Texture2D<float4> GBuffer1 : register(t2);
Texture2D<float4> GBuffer2 : register(t3);
Texture2D<float4> GBuffer3 : register(t4);
Texture2D<float4> GBuffer4 : register(t5);
Texture2D<float4> LinearDepth : register(t6);
Texture2D<float4> IBL_Specular : register(t7);
Texture2D<float4> Base : register(t8);
Texture2D<float4> Shadow : register(t9);

// Resource bind info for ClusterInfoBuffer 17
struct ClusterInfoBuffer
{

  int2 Element;                     // Offset:    0 Size:     8

};
//
// Resource bind info for LightIndexListsBuffer 18
struct LightIndexListsBuffer
{

  int Element;                      // Offset:    0 Size:     4

};
//
// Resource bind info for LightDataBuffer 19
struct LightDataBuffer
{
//
//   struct PackedLight
//   {
//       
      float4 PositionRadius;         // Offset:    0
      float4 ColorOuterAngle;        // Offset:   16
      float4 DirectionInnerAngle;    // Offset:   32
//
//   } $Element;                        // Offset:    0 Size:    48

};



StructuredBuffer<ClusterInfoBuffer> ClusterInfoBufferSRV : register(t17);
StructuredBuffer<LightIndexListsBuffer> LightIndexListsBufferSRV : register(t18);
StructuredBuffer<LightDataBuffer> LightDataBufferSRV : register(t19);


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

#include <ShaderFixes/matrix.hlsl>

void main( 
  float4 v0 : SV_Position0,
  float2 v1 : TexCoord0,
  float3 v2 : TexCoord1,
  out float4 o0 : SV_Target0)
{
// Needs manual fix for instruction: 
// unknown dcl_: dcl_resource_structured t17, 8 
// Needs manual fix for instruction: 
// unknown dcl_: dcl_resource_structured t18, 4 
// Needs manual fix for instruction: 
// unknown dcl_: dcl_resource_structured t19, 48 
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r1.xyz = GBuffer0.Load(r0.xyw).xyz;
  r2.xyzw = GBuffer3.Load(r0.xyw).xyzw;
  r3.z = LinearDepth.Load(r0.xyw).x;
  r1.w = 255 * r2.w;
  r1.w = round(r1.w);
  r1.w = (uint)r1.w;
  r2.w = (int)r1.w & 1;
  r3.w = cmp(0 < (uint)r2.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;
  r3.w = r3.w ? 0 : 1;
  r4.xyz = r3.www * r1.xyz;
  r4.w = cmp(0 != global_Data.y);
  r2.w = (int)r2.w;
  r5.xyz = r2.www * r1.xyz;
  r2.w = r4.w ? 0 : 1;
  r5.xyz = r5.xyz * r2.www;
  r2.w = cmp((int)r1.w == 1);
  r4.w = cmp(r3.z == 1.000000);
  r2.w = (int)r2.w | (int)r4.w;
  if (r2.w != 0) {
    r4.xyz = max(float3(0,0,0), r4.xyz);
    r2.w = Exposure.Load(float4(0,0,0,0)).x;
    r4.w = cmp(r2.w == 0.000000);
    r2.w = r4.w ? 0.00999999978 : r2.w;
    o0.xyz = r4.xyz * r2.www + r5.xyz;
    o0.w = 0;
    return;
  }
  r4.xy = GBuffer1.Load(r0.xyw).xy;
  r6.xyz = GBuffer2.Load(r0.xyw).xyz;
  r4.xy = r4.xy * float2(3.55539989,3.55539989) + float2(-1.77769995,-1.77769995);
  r4.z = 1;
  r2.w = dot(r4.xyz, r4.xyz);
  r2.w = 2 / r2.w;
  r4.xy = r2.ww * r4.xy;
  r4.z = -1 + r2.w;
  r2.x = max(0.0900000036, r2.x);
  r2.y = r2.y * r2.y;
  r2.y = 0.159999996 * r2.y;
  r7.x = dot(invViewMatrix._m00_m01_m02, r4.xyz);
  r7.y = dot(invViewMatrix._m10_m11_m12, r4.xyz);
  r7.z = dot(invViewMatrix._m20_m21_m22, r4.xyz);
  r4.xy = -VPtoRTScaleBias.zw * global_ViewInfo.zw + v0.xy;
  r4.z = global_ViewInfo.w + -r4.y;
  r4.xy = r4.xz / global_ViewInfo.zw;
  r3.xy = r4.xy * float2(2,2) + float2(-1,-1);
  r4.xyz = v2.xyz * r3.xyz;
  r8.xyz = global_View._m10_m11_m12 * r4.yyy;
  r4.xyw = r4.xxx * global_View._m00_m01_m02 + r8.xyz;
  r4.xyz = r4.zzz * global_View._m20_m21_m22 + r4.xyw;
  
  r4.xyz = global_ViewPos.xyz + r4.xyz;
  
//r4 is the WORLD COORD  
//CORRECT WORLD COORD
float4 r24;
r4.w = 1.0;
r24 = r4;
float4 s = StereoParams.Load(0);
float4 r25;
r25 = mul(global_ViewProjection, r4);  
r25.x -= s.x * (r25.w - s.y); 
r4 = mul(inverse(global_ViewProjection), r25);   
  
  
  r8.xyz = global_ViewPos.xyz + -r4.xyz;
  r2.w = dot(r8.xyz, r8.xyz);
  r2.w = rsqrt(r2.w);
  
  r9.xyz = r8.xyz * r2.www;
  r3.xy = cmp(float2(0,0) < shaderProperties.xw);
  if (r3.x != 0) {
    r10.x = Base.Sample(LinearSampler_s, v1.xy).x;
    r3.x = dot(r7.xyz, r9.xyz);
    r3.x = r3.x + r10.x;
    r4.w = r2.x * -16 + -1;
    r4.w = exp2(r4.w);
    r3.x = max(9.99999975e-005, abs(r3.x));
    r3.x = log2(r3.x);
    r3.x = r4.w * r3.x;
    r3.x = exp2(r3.x);
    r3.x = r3.x + r10.x;
    r10.y = saturate(-1 + r3.x);
  } else {
    r10.xy = float2(1,1);
  }
  if (r3.y != 0) {
    r11.xyz = Shadow.Load(r0.xyw).xyz;
  } else {
    r11.xyz = float3(1,1,1);
  }
  r12.xyz = IBL_Specular.Load(r0.xyw).xyz;
  r3.x = global_ViewInfo.x * r3.z;
  r3.yz = (uint2)r0.yx >> int2(7,7);
  r3.x = log2(r3.x);
  r3.x = r3.x * global_ScaleAndBias.x + global_ScaleAndBias.y;
  r3.x = max(0, r3.x);
  r3.x = min(31, r3.x);
  r3.x = trunc(r3.x);
  r3.yz = (int2)r3.yz;
  r3.x = r3.x * global_ScaleAndBias.w + r3.y;
  r3.x = r3.x * global_ScaleAndBias.z + r3.z;
  r3.x = (int)r3.x;
  if (r1.w == 0) {
    r1.w = dot(r9.xyz, r7.xyz);
    r3.y = r1.w + r1.w;
    r13.xyz = r7.xyz * -r3.yyy + r9.xyz;
    r1.w = max(9.99999975e-006, r1.w);
    r14.x = global_LightPropertyMatrix._m00;
    r14.y = global_LightPropertyMatrix._m01;
    r14.z = global_LightPropertyMatrix._m02;
    r15.xyz = r8.xyz * r2.www + r14.xyz;
    r3.y = dot(r15.xyz, r15.xyz);
    r3.y = rsqrt(r3.y);
    r15.xyz = r15.xyz * r3.yyy;
    r3.y = saturate(dot(r14.xyz, r15.xyz));
    r3.z = saturate(dot(r7.xyz, r14.xyz));
    r4.w = 1 + -r2.z;
    r15.xyz = r4.www * r6.xyz;
    r5.w = r2.x * -0.337748349 + 1;
    r3.y = r3.y * r3.y;
    r3.y = dot(r3.yy, r2.xx);
    r3.y = r2.x * 0.5 + r3.y;
    r3.y = -1 + r3.y;
    r6.w = 1 + -r3.z;
    r6.w = max(9.99999975e-005, r6.w);
    r7.w = r6.w * r6.w;
    r7.w = r7.w * r7.w;
    r6.w = r7.w * r6.w;
    r6.w = r3.y * r6.w + 1;
    r7.w = 1 + -r1.w;
    r7.w = max(9.99999975e-005, abs(r7.w));
    r8.w = r7.w * r7.w;
    r8.w = r8.w * r8.w;
    r7.w = r8.w * r7.w;
    r3.y = r3.y * r7.w + 1;
    r3.y = r6.w * r3.y;
    r3.y = r3.y * r5.w;
    r3.y = 0.318309873 * r3.y;
    r16.xyz = r15.xyz * r3.yyy;
    r3.y = dot(r14.xyz, r13.xyz);
    r17.xyz = -r3.yyy * r14.xyz + r13.xyz;
    r3.y = cmp(r3.y < 0.99998945);
    r6.w = dot(r17.xyz, r17.xyz);
    r6.w = rsqrt(r6.w);
    r17.xyz = r17.xyz * r6.www;
    r17.xyz = float3(0.00459006429,0.00459006429,0.00459006429) * r17.xyz;
    r14.xyz = r14.xyz * float3(0.99998945,0.99998945,0.99998945) + r17.xyz;
    r6.w = dot(r14.xyz, r14.xyz);
    r6.w = rsqrt(r6.w);
    r14.xyz = r14.xyz * r6.www;
    r13.xyz = r3.yyy ? r14.xyz : r13.xyz;
    r14.xyz = r8.xyz * r2.www + r13.xyz;
    r3.y = dot(r14.xyz, r14.xyz);
    r3.y = rsqrt(r3.y);
    r14.xyz = r14.xyz * r3.yyy;
    r3.y = saturate(dot(r13.xyz, r14.xyz));
    r6.w = saturate(dot(r7.xyz, r14.xyz));
    r8.w = saturate(dot(r7.xyz, r13.xyz));
    r13.xyz = r6.xyz * r2.zzz;
    r13.xyz = r4.www * r2.yyy + r13.xyz;
    r4.w = 1 + r2.x;
    r4.w = 0.5 * r4.w;
    r9.w = r2.x * r2.x;
    r14.xyz = float3(1,1,1) + -r13.xyz;
    r3.y = 1 + -r3.y;
    r3.y = max(9.99999975e-005, r3.y);
    r10.z = r3.y * r3.y;
    r10.z = r10.z * r10.z;
    r3.y = r10.z * r3.y;
    r17.xyz = r14.xyz * r3.yyy + r13.xyz;
    r3.y = r4.w * r4.w;
    r4.w = -r1.w * r3.y + r1.w;
    r4.w = r4.w * r1.w + r3.y;
    r4.w = sqrt(r4.w);
    r10.z = -r8.w * r3.y + r8.w;
    r10.z = r10.z * r8.w + r3.y;
    r10.z = sqrt(r10.z);
    r10.z = r10.z * r1.w;
    r8.w = r8.w * r4.w + r10.z;
    r8.w = rcp(r8.w);
    r8.w = 0.5 * r8.w;
    r9.w = r9.w * r9.w;
    r10.z = r6.w * r9.w + -r6.w;
    r6.w = r10.z * r6.w + 1;
    r6.w = r6.w * r6.w;
    r6.w = 3.14159274 * r6.w;
    r6.w = rcp(r6.w);
    r6.w = r9.w * r6.w;
    r17.xyz = r17.xyz * r8.www;
    r17.xyz = r17.xyz * r6.www;
    r18.x = global_LightPropertyMatrix._m20;
    r18.y = global_LightPropertyMatrix._m21;
    r18.z = global_LightPropertyMatrix._m22;
    r16.xyz = r18.xyz * r16.xyz;
    r16.xyz = r16.xyz * r3.zzz;
    r17.xyz = r18.xyz * r17.xyz;
    r17.xyz = r17.xyz * r3.zzz;
    r16.xyz = r16.xyz * r11.xyz;
    r17.xyz = r17.xyz * r11.xyz;
  // Known bad code for instruction (needs manual fix):
    // ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r10.zw, r3.x, l(0), t17.xxxy
  r10.z = ClusterInfoBufferSRV[r3.x].Element.x;
  r10.w = ClusterInfoBufferSRV[r3.x].Element.y;
    r3.z = (int)r10.w & 0x0000ffff;
    r6.w = (uint)r10.w >> 16;
    r18.xyz = r16.xyz;
    r19.xyz = r17.xyz;
    r8.w = r10.z;
    r10.w = 0;
    while (true) {
      r11.w = cmp((uint)r10.w >= (uint)r3.z);
      if (r11.w != 0) break;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r11.w, r8.w, l(0), t18.xxxx
    r11.w = LightIndexListsBufferSRV[r8.w].Element;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r20.xyzw, r11.w, l(0), t19.xyzw
    r20.x = LightDataBufferSRV[r11.w].PositionRadius.x;
    r20.y = LightDataBufferSRV[r11.w].PositionRadius.y;
    r20.z = LightDataBufferSRV[r11.w].PositionRadius.z;
    r20.w = LightDataBufferSRV[r11.w].PositionRadius.w;
      r20.xyz = r20.xyz + -r4.xyz;
      r12.w = dot(r20.xyz, r20.xyz);
      r13.w = r20.w * r20.w;
      r14.w = rcp(r13.w);
      r14.w = cmp(r12.w < r14.w);
      if (r14.w != 0) {
        r14.w = max(1.00000001e-010, r12.w);
        r14.w = rsqrt(r14.w);
        r20.xyz = r20.xyz * r14.www;
        r14.w = saturate(dot(r7.xyz, r20.xyz));
        r15.w = cmp(0 < r14.w);
        if (r15.w != 0) {
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r21.xyz, r11.w, l(16), t19.xyzx
        r21.x = LightDataBufferSRV[r11.w].ColorOuterAngle.x;
        r21.y = LightDataBufferSRV[r11.w].ColorOuterAngle.y;
        r21.z = LightDataBufferSRV[r11.w].ColorOuterAngle.z;
          r22.xyz = r8.xyz * r2.www + r20.xyz;
          r11.w = dot(r22.xyz, r22.xyz);
          r11.w = max(1.00000001e-010, r11.w);
          r11.w = rsqrt(r11.w);
          r22.xyz = r22.xyz * r11.www;
          r11.w = saturate(dot(r20.xyz, r22.xyz));
          r15.w = saturate(dot(r7.xyz, r22.xyz));
          r13.w = r13.w * r12.w;
          r13.w = -r13.w * r13.w + 1;
          r13.w = max(0, r13.w);
          r13.w = r13.w * r13.w;
          r12.w = max(9.99999975e-005, r12.w);
          r12.w = rcp(r12.w);
          r12.w = r13.w * r12.w;
          r12.w = r14.w * r12.w;
          r12.w = 0.0795774683 * r12.w;
          r20.xyz = r21.xyz * r12.www;
          r12.w = r11.w * r11.w;
          r12.w = dot(r12.ww, r2.xx);
          r12.w = r2.x * 0.5 + r12.w;
          r12.w = -1 + r12.w;
          r13.w = 1 + -r14.w;
          r13.w = max(9.99999975e-005, r13.w);
          r16.w = r13.w * r13.w;
          r16.w = r16.w * r16.w;
          r13.w = r16.w * r13.w;
          r13.w = r12.w * r13.w + 1;
          r12.w = r12.w * r7.w + 1;
          r12.w = r13.w * r12.w;
          r12.w = r12.w * r5.w;
          r12.w = 0.318309873 * r12.w;
          r21.xyz = r15.xyz * r12.www;
          r18.xyz = r20.xyz * r21.xyz + r18.xyz;
          r11.w = 1 + -r11.w;
          r11.w = max(9.99999975e-005, r11.w);
          r12.w = r11.w * r11.w;
          r12.w = r12.w * r12.w;
          r11.w = r12.w * r11.w;
          r21.xyz = r14.xyz * r11.www + r13.xyz;
          r11.w = -r14.w * r3.y + r14.w;
          r11.w = r11.w * r14.w + r3.y;
          r11.w = sqrt(r11.w);
          r11.w = r11.w * r1.w;
          r11.w = r14.w * r4.w + r11.w;
          r11.w = rcp(r11.w);
          r11.w = 0.5 * r11.w;
          r12.w = r15.w * r9.w + -r15.w;
          r12.w = r12.w * r15.w + 1;
          r12.w = r12.w * r12.w;
          r12.w = 3.14159274 * r12.w;
          r12.w = rcp(r12.w);
          r12.w = r12.w * r9.w;
          r21.xyz = r21.xyz * r11.www;
          r21.xyz = r21.xyz * r12.www;
          r19.xyz = r20.xyz * r21.xyz + r19.xyz;
        }
      }
      r8.w = (int)r8.w + 1;
      r10.w = (int)r10.w + 1;
    }
    r16.xyz = r18.xyz;
    r17.xyz = r19.xyz;
    r3.z = r8.w;
    r10.z = 0;
    while (true) {
      r10.w = cmp((uint)r10.z >= (uint)r6.w);
      if (r10.w != 0) break;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r10.w, r3.z, l(0), t18.xxxx
    r10.w = LightIndexListsBufferSRV[r3.z].Element;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r20.xyzw, r10.w, l(0), t19.xyzw
    r20.x = LightDataBufferSRV[r10.w].PositionRadius.x;
    r20.y = LightDataBufferSRV[r10.w].PositionRadius.y;
    r20.z = LightDataBufferSRV[r10.w].PositionRadius.z;
    r20.w = LightDataBufferSRV[r10.w].PositionRadius.w;
      r20.xyz = r20.xyz + -r4.xyz;
      r11.w = dot(r20.xyz, r20.xyz);
      r12.w = r20.w * r20.w;
      r13.w = rcp(r12.w);
      r13.w = cmp(r11.w < r13.w);
      if (r13.w != 0) {
        r13.w = max(1.00000001e-010, r11.w);
        r13.w = rsqrt(r13.w);
        r20.xyz = r20.xyz * r13.www;
        r13.w = saturate(dot(r7.xyz, r20.xyz));
        r14.w = cmp(0 < r13.w);
        if (r14.w != 0) {
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r21.xyzw, r10.w, l(16), t19.xyzw
        r21.x = LightDataBufferSRV[r10.w].ColorOuterAngle.x;
        r21.y = LightDataBufferSRV[r10.w].ColorOuterAngle.y;
        r21.z = LightDataBufferSRV[r10.w].ColorOuterAngle.z;
        r21.w = LightDataBufferSRV[r10.w].ColorOuterAngle.w;
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r22.xyzw, r10.w, l(32), t19.xyzw
        r22.x = LightDataBufferSRV[r10.w].DirectionInnerAngle.x;
        r22.y = LightDataBufferSRV[r10.w].DirectionInnerAngle.y;
        r22.z = LightDataBufferSRV[r10.w].DirectionInnerAngle.z;
        r22.w = LightDataBufferSRV[r10.w].DirectionInnerAngle.w;
          r23.xyz = r8.xyz * r2.www + r20.xyz;
          r10.w = dot(r23.xyz, r23.xyz);
          r10.w = max(1.00000001e-010, r10.w);
          r10.w = rsqrt(r10.w);
          r23.xyz = r23.xyz * r10.www;
          r10.w = saturate(dot(r20.xyz, r23.xyz));
          r14.w = saturate(dot(r7.xyz, r23.xyz));
          r15.w = dot(r22.xyz, r22.xyz);
          r15.w = rsqrt(r15.w);
          r22.xyz = r22.xyz * r15.www;
          r15.w = dot(-r20.xyz, r22.xyz);
          r16.w = cmp(r21.w < r15.w);
          r12.w = r12.w * r11.w;
          r12.w = -r12.w * r12.w + 1;
          r12.w = max(0, r12.w);
          r12.w = r12.w * r12.w;
          r11.w = max(9.99999975e-005, r11.w);
          r11.w = rcp(r11.w);
          r11.w = r12.w * r11.w;
          r12.w = r15.w + -r21.w;
          r15.w = r22.w + -r21.w;
          r15.w = max(1.00000001e-007, r15.w);
          r12.w = saturate(r12.w / r15.w);
          r12.w = r12.w * r12.w;
          r11.w = r12.w * r11.w;
          r11.w = r13.w * r11.w;
          r11.w = r16.w ? r11.w : 0;
          r11.w = 0.318309873 * r11.w;
          r20.xyz = r21.xyz * r11.www;
          r11.w = r10.w * r10.w;
          r11.w = dot(r11.ww, r2.xx);
          r11.w = r2.x * 0.5 + r11.w;
          r11.w = -1 + r11.w;
          r12.w = 1 + -r13.w;
          r12.w = max(9.99999975e-005, r12.w);
          r15.w = r12.w * r12.w;
          r15.w = r15.w * r15.w;
          r12.w = r15.w * r12.w;
          r12.w = r11.w * r12.w + 1;
          r11.w = r11.w * r7.w + 1;
          r11.w = r12.w * r11.w;
          r11.w = r11.w * r5.w;
          r11.w = 0.318309873 * r11.w;
          r21.xyz = r15.xyz * r11.www;
          r16.xyz = r20.xyz * r21.xyz + r16.xyz;
          r10.w = 1 + -r10.w;
          r10.w = max(9.99999975e-005, r10.w);
          r11.w = r10.w * r10.w;
          r11.w = r11.w * r11.w;
          r10.w = r11.w * r10.w;
          r21.xyz = r14.xyz * r10.www + r13.xyz;
          r10.w = -r13.w * r3.y + r13.w;
          r10.w = r10.w * r13.w + r3.y;
          r10.w = sqrt(r10.w);
          r10.w = r10.w * r1.w;
          r10.w = r13.w * r4.w + r10.w;
          r10.w = rcp(r10.w);
          r10.w = 0.5 * r10.w;
          r11.w = r14.w * r9.w + -r14.w;
          r11.w = r11.w * r14.w + 1;
          r11.w = r11.w * r11.w;
          r11.w = 3.14159274 * r11.w;
          r11.w = rcp(r11.w);
          r11.w = r11.w * r9.w;
          r21.xyz = r21.xyz * r10.www;
          r21.xyz = r21.xyz * r11.www;
          r17.xyz = r20.xyz * r21.xyz + r17.xyz;
        }
      }
      r3.z = (int)r3.z + 1;
      r10.z = (int)r10.z + 1;
    }
  } else {
    r0.xyzw = GBuffer4.Load(r0.xyz).xyzw;
    r0.yz = float2(255,15.9375) * r0.zy;
    r1.w = floor(r0.z);
    r13.x = r0.x * 4080 + r1.w;
    r0.x = frac(r0.z);
    r13.y = r0.x * 4096 + r0.y;
    r0.xy = r13.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);
    r13.xyz = float3(1,1,1) + -abs(r0.xyx);
    r14.z = r13.x + -abs(r0.y);
    r0.z = cmp(r14.z >= 0);
    r3.yz = cmp(r0.xy >= float2(0,0));
    r3.yz = r3.yz ? float2(1,1) : float2(-1,-1);
    r3.yz = r13.yz * r3.yz;
    r14.xy = r0.zz ? r0.xy : r3.yz;
    r0.x = dot(r14.xyz, r14.xyz);
    r0.x = rsqrt(r0.x);
    r0.xyz = r14.xyz * r0.xxx;
    r13.x = dot(invViewMatrix._m00_m01_m02, r0.xyz);
    r13.y = dot(invViewMatrix._m10_m11_m12, r0.xyz);
    r13.z = dot(invViewMatrix._m20_m21_m22, r0.xyz);
    r0.x = dot(r9.xyz, r7.xyz);
    r0.y = r0.x + r0.x;
    r9.xyz = r7.xyz * -r0.yyy + r9.xyz;
    r0.x = max(9.99999975e-006, r0.x);
    r14.x = global_LightPropertyMatrix._m00;
    r14.y = global_LightPropertyMatrix._m01;
    r14.z = global_LightPropertyMatrix._m02;
    r15.xyz = r8.xyz * r2.www + r14.xyz;
    r0.y = dot(r15.xyz, r15.xyz);
    r0.y = rsqrt(r0.y);
    r15.xyz = r15.xyz * r0.yyy;
    r0.y = saturate(dot(r14.xyz, r15.xyz));
    r0.z = saturate(dot(r7.xyz, r14.xyz));
    r1.w = 1 + -r2.z;
    r15.xyz = r1.www * r6.xyz;
    r3.y = r2.x * -0.337748349 + 1;
    r0.y = r0.y * r0.y;
    r0.y = dot(r0.yy, r2.xx);
    r0.y = r2.x * 0.5 + r0.y;
    r0.y = -1 + r0.y;
    r3.z = 1 + -r0.z;
    r3.z = max(9.99999975e-005, r3.z);
    r4.w = r3.z * r3.z;
    r4.w = r4.w * r4.w;
    r3.z = r4.w * r3.z;
    r3.z = r0.y * r3.z + 1;
    r4.w = 1 + -r0.x;
    r4.w = max(9.99999975e-005, abs(r4.w));
    r5.w = r4.w * r4.w;
    r5.w = r5.w * r5.w;
    r4.w = r5.w * r4.w;
    r0.y = r0.y * r4.w + 1;
    r0.y = r3.z * r0.y;
    r0.y = r0.y * r3.y;
    r0.y = 0.318309873 * r0.y;
    r18.xyz = r15.xyz * r0.yyy;
    r0.y = dot(r14.xyz, r9.xyz);
    r19.xyz = -r0.yyy * r14.xyz + r9.xyz;
    r0.y = cmp(r0.y < 0.99998945);
    r3.z = dot(r19.xyz, r19.xyz);
    r3.z = rsqrt(r3.z);
    r19.xyz = r19.xyz * r3.zzz;
    r19.xyz = float3(0.00459006429,0.00459006429,0.00459006429) * r19.xyz;
    r14.xyz = r14.xyz * float3(0.99998945,0.99998945,0.99998945) + r19.xyz;
    r3.z = dot(r14.xyz, r14.xyz);
    r3.z = rsqrt(r3.z);
    r14.xyz = r14.xyz * r3.zzz;
    r9.xyz = r0.yyy ? r14.xyz : r9.xyz;
    r14.xyz = r8.xyz * r2.www + r9.xyz;
    r0.y = dot(r14.xyz, r14.xyz);
    r0.y = rsqrt(r0.y);
    r14.xyz = r14.xyz * r0.yyy;
    r0.y = saturate(dot(r9.xyz, r14.xyz));
    r3.z = saturate(dot(r7.xyz, r14.xyz));
    r5.w = saturate(dot(r7.xyz, r9.xyz));
    r6.w = dot(r14.xyz, r13.xyz);
    r6.xyz = r6.xyz * r2.zzz;
    r6.xyz = r1.www * r2.yyy + r6.xyz;
    r1.w = 1 + r2.x;
    r1.w = 0.5 * r1.w;
    r2.y = r2.x * r2.x;
    r9.xyz = float3(1,1,1) + -r6.xyz;
    r0.y = 1 + -r0.y;
    r0.y = max(9.99999975e-005, r0.y);
    r2.z = r0.y * r0.y;
    r2.z = r2.z * r2.z;
    r0.y = r2.z * r0.y;
    r14.xyz = r9.xyz * r0.yyy + r6.xyz;
    r0.y = r1.w * r1.w;
    r1.w = -r0.x * r0.y + r0.x;
    r1.w = r1.w * r0.x + r0.y;
    r1.w = sqrt(r1.w);
    r2.z = -r5.w * r0.y + r5.w;
    r2.z = r2.z * r5.w + r0.y;
    r2.z = sqrt(r2.z);
    r2.z = r2.z * r0.x;
    r2.z = r5.w * r1.w + r2.z;
    r2.z = rcp(r2.z);
    r2.z = 0.5 * r2.z;
    r0.w = -r0.w * 0.899999976 + 1;
    r0.w = sqrt(r0.w);
    r5.w = r2.y / r0.w;
    r5.w = min(1, r5.w);
    r5.w = max(0.00100000005, r5.w);
    r0.w = r2.y * r0.w;
    r0.w = max(0.00100000005, r0.w);
    r2.y = r6.w * r6.w;
    r6.w = -r6.w * r6.w + 1;
    r6.w = -r3.z * r3.z + r6.w;
    r7.w = r5.w * r5.w;
    r2.y = r2.y / r7.w;
    r8.w = r0.w * r0.w;
    r6.w = r6.w / r8.w;
    r2.y = r6.w + r2.y;
    r2.y = r3.z * r3.z + r2.y;
    r0.w = r5.w * r0.w;
    r0.w = 3.14159274 * r0.w;
    r2.y = r2.y * r2.y;
    r2.y = r2.y * r0.w;
    r2.y = rcp(r2.y);
    r14.xyz = r14.xyz * r2.zzz;
    r14.xyz = r14.xyz * r2.yyy;
    r19.x = global_LightPropertyMatrix._m20;
    r19.y = global_LightPropertyMatrix._m21;
    r19.z = global_LightPropertyMatrix._m22;
    r18.xyz = r19.xyz * r18.xyz;
    r18.xyz = r18.xyz * r0.zzz;
    r14.xyz = r19.xyz * r14.xyz;
    r14.xyz = r14.xyz * r0.zzz;
    r18.xyz = r18.xyz * r11.xyz;
    r11.xyz = r14.xyz * r11.xyz;
  // Known bad code for instruction (needs manual fix):
    // ld_structured_indexable(structured_buffer, stride=8)(mixed,mixed,mixed,mixed) r2.yz, r3.x, l(0), t17.xxyx
  r2.y = ClusterInfoBufferSRV[r3.x].Element.x;
  r2.z = ClusterInfoBufferSRV[r3.x].Element.y;
    r0.z = (int)r2.z & 0x0000ffff;
    r2.z = (uint)r2.z >> 16;
    r14.xyz = r18.xyz;
    r19.xyz = r11.xyz;
    r3.x = r2.y;
    r3.z = 0;
    while (true) {
      r5.w = cmp((uint)r3.z >= (uint)r0.z);
      if (r5.w != 0) break;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r5.w, r3.x, l(0), t18.xxxx
    r5.w = LightIndexListsBufferSRV[r3.x].Element;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r20.xyzw, r5.w, l(0), t19.xyzw
    r20.x = LightDataBufferSRV[r5.w].PositionRadius.x;
    r20.y = LightDataBufferSRV[r5.w].PositionRadius.y;
    r20.z = LightDataBufferSRV[r5.w].PositionRadius.z;
    r20.w = LightDataBufferSRV[r5.w].PositionRadius.w;
      r20.xyz = r20.xyz + -r4.xyz;
      r6.w = dot(r20.xyz, r20.xyz);
      r9.w = r20.w * r20.w;
      r10.z = rcp(r9.w);
      r10.z = cmp(r6.w < r10.z);
      if (r10.z != 0) {
        r10.z = max(1.00000001e-010, r6.w);
        r10.z = rsqrt(r10.z);
        r20.xyz = r20.xyz * r10.zzz;
        r10.z = saturate(dot(r7.xyz, r20.xyz));
        r10.w = cmp(0 < r10.z);
        if (r10.w != 0) {
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r21.xyz, r5.w, l(16), t19.xyzx
        r21.x = LightDataBufferSRV[r5.w].ColorOuterAngle.x;
        r21.y = LightDataBufferSRV[r5.w].ColorOuterAngle.y;
        r21.z = LightDataBufferSRV[r5.w].ColorOuterAngle.z;
          r22.xyz = r8.xyz * r2.www + r20.xyz;
          r5.w = dot(r22.xyz, r22.xyz);
          r5.w = max(1.00000001e-010, r5.w);
          r5.w = rsqrt(r5.w);
          r22.xyz = r22.xyz * r5.www;
          r5.w = saturate(dot(r20.xyz, r22.xyz));
          r10.w = saturate(dot(r7.xyz, r22.xyz));
          r9.w = r9.w * r6.w;
          r9.w = -r9.w * r9.w + 1;
          r9.w = max(0, r9.w);
          r9.w = r9.w * r9.w;
          r6.w = max(9.99999975e-005, r6.w);
          r6.w = rcp(r6.w);
          r6.w = r9.w * r6.w;
          r6.w = r10.z * r6.w;
          r6.w = 0.0795774683 * r6.w;
          r9.w = dot(r22.xyz, r13.xyz);
          r20.xyz = r21.xyz * r6.www;
          r6.w = r5.w * r5.w;
          r6.w = dot(r6.ww, r2.xx);
          r6.w = r2.x * 0.5 + r6.w;
          r6.w = -1 + r6.w;
          r11.w = 1 + -r10.z;
          r11.w = max(9.99999975e-005, r11.w);
          r12.w = r11.w * r11.w;
          r12.w = r12.w * r12.w;
          r11.w = r12.w * r11.w;
          r11.w = r6.w * r11.w + 1;
          r6.w = r6.w * r4.w + 1;
          r6.w = r11.w * r6.w;
          r6.w = r6.w * r3.y;
          r6.w = 0.318309873 * r6.w;
          r21.xyz = r15.xyz * r6.www;
          r14.xyz = r20.xyz * r21.xyz + r14.xyz;
          r5.w = 1 + -r5.w;
          r5.w = max(9.99999975e-005, r5.w);
          r6.w = r5.w * r5.w;
          r6.w = r6.w * r6.w;
          r5.w = r6.w * r5.w;
          r21.xyz = r9.xyz * r5.www + r6.xyz;
          r5.w = -r10.z * r0.y + r10.z;
          r5.w = r5.w * r10.z + r0.y;
          r5.w = sqrt(r5.w);
          r5.w = r5.w * r0.x;
          r5.w = r10.z * r1.w + r5.w;
          r5.w = rcp(r5.w);
          r5.w = 0.5 * r5.w;
          r6.w = r9.w * r9.w;
          r9.w = -r9.w * r9.w + 1;
          r9.w = -r10.w * r10.w + r9.w;
          r6.w = r6.w / r7.w;
          r9.w = r9.w / r8.w;
          r6.w = r9.w + r6.w;
          r6.w = r10.w * r10.w + r6.w;
          r6.w = r6.w * r6.w;
          r6.w = r6.w * r0.w;
          r6.w = rcp(r6.w);
          r21.xyz = r21.xyz * r5.www;
          r21.xyz = r21.xyz * r6.www;
          r19.xyz = r20.xyz * r21.xyz + r19.xyz;
        }
      }
      r3.xz = (int2)r3.xz + int2(1,1);
    }
    r16.xyz = r14.xyz;
    r17.xyz = r19.xyz;
    r0.z = r3.x;
    r2.y = 0;
    while (true) {
      r3.z = cmp((uint)r2.y >= (uint)r2.z);
      if (r3.z != 0) break;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r3.z, r0.z, l(0), t18.xxxx
    r3.z = LightIndexListsBufferSRV[r0.z].Element;
    // Known bad code for instruction (needs manual fix):
        // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r11.xyzw, r3.z, l(0), t19.xyzw
    r11.x = LightDataBufferSRV[r3.z].PositionRadius.x;
    r11.y = LightDataBufferSRV[r3.z].PositionRadius.y;
    r11.z = LightDataBufferSRV[r3.z].PositionRadius.z;
    r11.w = LightDataBufferSRV[r3.z].PositionRadius.w;
      r11.xyz = r11.xyz + -r4.xyz;
      r5.w = dot(r11.xyz, r11.xyz);
      r6.w = r11.w * r11.w;
      r9.w = rcp(r6.w);
      r9.w = cmp(r5.w < r9.w);
      if (r9.w != 0) {
        r9.w = max(1.00000001e-010, r5.w);
        r9.w = rsqrt(r9.w);
        r11.xyz = r11.xyz * r9.www;
        r9.w = saturate(dot(r7.xyz, r11.xyz));
        r10.z = cmp(0 < r9.w);
        if (r10.z != 0) {
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r18.xyzw, r3.z, l(16), t19.xyzw
        r18.x = LightDataBufferSRV[r3.z].ColorOuterAngle.x;
        r18.y = LightDataBufferSRV[r3.z].ColorOuterAngle.y;
        r18.z = LightDataBufferSRV[r3.z].ColorOuterAngle.z;
        r18.w = LightDataBufferSRV[r3.z].ColorOuterAngle.w;
        // Known bad code for instruction (needs manual fix):
                // ld_structured_indexable(structured_buffer, stride=48)(mixed,mixed,mixed,mixed) r20.xyzw, r3.z, l(32), t19.xyzw
        r20.x = LightDataBufferSRV[r3.z].DirectionInnerAngle.x;
        r20.y = LightDataBufferSRV[r3.z].DirectionInnerAngle.y;
        r20.z = LightDataBufferSRV[r3.z].DirectionInnerAngle.z;
        r20.w = LightDataBufferSRV[r3.z].DirectionInnerAngle.w;
          r21.xyz = r8.xyz * r2.www + r11.xyz;
          r3.z = dot(r21.xyz, r21.xyz);
          r3.z = max(1.00000001e-010, r3.z);
          r3.z = rsqrt(r3.z);
          r21.xyz = r21.xyz * r3.zzz;
          r3.z = saturate(dot(r11.xyz, r21.xyz));
          r10.z = saturate(dot(r7.xyz, r21.xyz));
          r10.w = dot(r20.xyz, r20.xyz);
          r10.w = rsqrt(r10.w);
          r20.xyz = r20.xyz * r10.www;
          r10.w = dot(-r11.xyz, r20.xyz);
          r11.x = cmp(r18.w < r10.w);
          r6.w = r6.w * r5.w;
          r6.w = -r6.w * r6.w + 1;
          r6.w = max(0, r6.w);
          r6.w = r6.w * r6.w;
          r5.w = max(9.99999975e-005, r5.w);
          r5.w = rcp(r5.w);
          r5.w = r6.w * r5.w;
          r6.w = r10.w + -r18.w;
          r10.w = r20.w + -r18.w;
          r10.w = max(1.00000001e-007, r10.w);
          r6.w = saturate(r6.w / r10.w);
          r6.w = r6.w * r6.w;
          r5.w = r6.w * r5.w;
          r5.w = r9.w * r5.w;
          r5.w = r11.x ? r5.w : 0;
          r5.w = 0.318309873 * r5.w;
          r6.w = dot(r21.xyz, r13.xyz);
          r11.xyz = r18.xyz * r5.www;
          r5.w = r3.z * r3.z;
          r5.w = dot(r5.ww, r2.xx);
          r5.w = r2.x * 0.5 + r5.w;
          r5.w = -1 + r5.w;
          r10.w = 1 + -r9.w;
          r10.w = max(9.99999975e-005, r10.w);
          r11.w = r10.w * r10.w;
          r11.w = r11.w * r11.w;
          r10.w = r11.w * r10.w;
          r10.w = r5.w * r10.w + 1;
          r5.w = r5.w * r4.w + 1;
          r5.w = r10.w * r5.w;
          r5.w = r5.w * r3.y;
          r5.w = 0.318309873 * r5.w;
          r18.xyz = r15.xyz * r5.www;
          r16.xyz = r11.xyz * r18.xyz + r16.xyz;
          r3.z = 1 + -r3.z;
          r3.z = max(9.99999975e-005, r3.z);
          r5.w = r3.z * r3.z;
          r5.w = r5.w * r5.w;
          r3.z = r5.w * r3.z;
          r18.xyz = r9.xyz * r3.zzz + r6.xyz;
          r3.z = -r9.w * r0.y + r9.w;
          r3.z = r3.z * r9.w + r0.y;
          r3.z = sqrt(r3.z);
          r3.z = r3.z * r0.x;
          r3.z = r9.w * r1.w + r3.z;
          r3.z = rcp(r3.z);
          r3.z = 0.5 * r3.z;
          r5.w = r6.w * r6.w;
          r6.w = -r6.w * r6.w + 1;
          r6.w = -r10.z * r10.z + r6.w;
          r5.w = r5.w / r7.w;
          r6.w = r6.w / r8.w;
          r5.w = r6.w + r5.w;
          r5.w = r10.z * r10.z + r5.w;
          r5.w = r5.w * r5.w;
          r5.w = r5.w * r0.w;
          r5.w = rcp(r5.w);
          r18.xyz = r18.xyz * r3.zzz;
          r18.xyz = r18.xyz * r5.www;
          r17.xyz = r11.xyz * r18.xyz + r17.xyz;
        }
      }
      r0.z = (int)r0.z + 1;
      r2.y = (int)r2.y + 1;
    }
  }
  r0.xy = float2(-1,-1) + r10.xy;
  r0.xy = shaderProperties.yy * r0.xy + float2(1,1);
  r0.yzw = r17.xyz * r0.yyy;
  r0.xyz = r16.xyz * r0.xxx + r0.yzw;
  r0.xyz = r3.www * r1.xyz + r0.xyz;
  r0.xyz = max(float3(0,0,0), r0.xyz);
  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;
  r0.xyz = r0.xyz * r0.www + r5.xyz;
  o0.xyz = r12.xyz * r10.yyy + r0.xyz;
  o0.w = 1;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\a27647873f059abd-ps_replace.txt(39,18-34): error X3000: syntax error: unexpected token 'ClusterInfoBuffer'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
