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

cbuffer _Globals : register(b0)
{
  float4 ShadowProperties : packoffset(c0);
  float4 LightProperties : packoffset(c1);
  float4 ShadowFarPlanes : packoffset(c2);
  float4 ShadowFrustumWidths : packoffset(c3);
  row_major float4x4 ViewMatrix[5] : packoffset(c4);
  row_major float4x4 ProjectionMatrix[4] : packoffset(c24);
}

SamplerComparisonState ShadowSampler_s : register(s0);
Texture2D<float4> LinearDepth : register(t0);
Texture2D<float4> Shadow : register(t1);


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

#include <ShaderFixes/matrix.hlsl>

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

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r0.x = LinearDepth.Load(r0.xyz).x;
  r0.xyz = r0.xxx * v1.xyz + v2.xyz;
  r1.x = ShadowProperties.x * ShadowProperties.y;
  r1.x = (int)r1.x;
  r1.y = cmp(0 < (int)r1.x);
  
//CORRECT WORLD COORD
float4 s = StereoParams.Load(0);
float4 r20, r21;
r0.w = 1;
r21 = mul(global_ViewProjection, r0);  
r21.x -= s.x * (r21.w - s.y); 
r0 = mul(inverse(global_ViewProjection), r21);
  
  if (r1.y != 0) {
    r0.w = 1;
    r2.x = dot(ProjectionMatrix[0]._m00_m01_m02_m03, r0.xyzw);
    r2.y = dot(ProjectionMatrix[0]._m10_m11_m12_m13, r0.xyzw);
    r2.z = dot(ProjectionMatrix[0]._m20_m21_m22_m23, r0.xyzw);
    r1.z = dot(ProjectionMatrix[0]._m30_m31_m32_m33, r0.xyzw);
    r2.xyz = r2.xyz / r1.zzz;
    r3.xyzw = float4(2,2,2,2) / ShadowProperties.xyxy;
    r1.zw = float2(0.5,0.5) * r3.zw;
    r2.w = ShadowFrustumWidths.x * LightProperties.z;
    r2.w = 0.5 * r2.w;
    r4.xy = saturate(r2.xy / r1.zw);
    r4.xy = r4.xy * float2(2,2) + float2(-1,-1);
    r4.xy = float2(1,1) + -abs(r4.xy);
    r4.xy = saturate(r4.xy / LightProperties.zz);
    r4.z = saturate(1 + -r2.z);
    r4.z = ShadowFarPlanes.x * r4.z;
    r2.w = saturate(r4.z / r2.w);
    r4.x = r4.x * r4.y;
    r4.y = r4.x * r2.w;
    r4.z = cmp(0 < r4.y);
    if (r4.z != 0) {
      r4.w = 7 * LightProperties.x;
      r5.x = r4.w / ShadowFrustumWidths.x;
      r5.xyzw = r5.xxxx / ShadowProperties.xyxy;
      r6.xyzw = ShadowProperties.xyxy * ShadowProperties.zzzz;
      r7.xyzw = float4(1,1,1,1) / r6.zwzw;
      r6.xyzw = float4(10,10,0.5,0.5) / r6.xyzw;
      r5.xyzw = max(r7.xyzw, r5.xyzw);
      r5.xyzw = min(r5.xyzw, r6.xyxy);
      r8.xyzw = r5.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r2.xyxy;
      r9.xyzw = r3.zwzw * float4(0.5,0.5,0.5,0.5) + -r6.zwzw;
      r8.xyzw = max(r8.xyzw, r6.zwzw);
      r8.xyzw = min(r8.xyzw, r9.xyzw);
      r10.x = LightProperties.w / ShadowFarPlanes.x;
      r2.z = -r10.x + r2.z;
      r8.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r8.xy, r2.z).x;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r8.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r10.xyzw = r5.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r2.xyxy;
      r10.xyzw = max(r10.xyzw, r6.zwzw);
      r10.xyzw = min(r10.xyzw, r9.xyzw);
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.xy, r2.z).x;
      r8.x = r8.x + r8.y;
      r8.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r10.zw, r2.z).x;
      r8.x = r8.x + r8.y;
      r5.xyzw = r5.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r2.xyxy;
      r5.xyzw = max(r5.xyzw, r6.zwzw);
      r5.xyzw = min(r5.xyzw, r9.xyzw);
      r2.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r2.z).x;
      r2.x = r8.x + r2.x;
      r2.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r2.z).x;
      r2.x = r2.x + r2.y;
      r2.x = r2.x * r4.y;
      r2.y = 0.0625 * r2.x;
      r2.z = cmp(r4.y < 1);
      r5.x = (int)r1.x + -1;
      r5.x = cmp(0 < (int)r5.x);
      r2.z = r2.z ? r5.x : 0;
      if (r2.z != 0) {
        r5.x = dot(ProjectionMatrix[1]._m00_m01_m02_m03, r0.xyzw);
        r5.y = dot(ProjectionMatrix[1]._m10_m11_m12_m13, r0.xyzw);
        r5.z = dot(ProjectionMatrix[1]._m20_m21_m22_m23, r0.xyzw);
        r2.z = dot(ProjectionMatrix[1]._m30_m31_m32_m33, r0.xyzw);
        r5.xyz = r5.xyz / r2.zzz;
        r2.z = ShadowFrustumWidths.y * LightProperties.z;
        r2.z = 0.5 * r2.z;
        r8.xy = -r3.xy * float2(0,0.5) + r5.xy;
        r1.zw = saturate(r8.xy / r1.zw);
        r1.zw = r1.zw * float2(2,2) + float2(-1,-1);
        r1.zw = float2(1,1) + -abs(r1.zw);
        r1.zw = saturate(r1.zw / LightProperties.zz);
        r5.w = saturate(1 + -r5.z);
        r5.w = ShadowFarPlanes.y * r5.w;
        r2.z = saturate(r5.w / r2.z);
        r1.z = r1.z * r1.w;
        r1.z = r1.z * r2.z;
        r1.z = cmp(0 < r1.z);
        if (r1.z != 0) {
          r1.z = -r4.x * r2.w + 1;
          r1.w = r4.w / ShadowFrustumWidths.y;
          r8.xyzw = r1.wwww / ShadowProperties.xyxy;
          r1.w = ShadowFrustumWidths.y / ShadowFrustumWidths.x;
          r7.xyzw = r7.xyzw / r1.wwww;
          r9.xyzw = r6.xyxy / r1.wwww;
          r7.xyzw = max(r8.xyzw, r7.xyzw);
          r7.xyzw = min(r7.xyzw, r9.xyzw);
          r8.xyzw = r7.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r5.xyxy;
          r9.xyzw = r3.xyxy * float4(0,0.5,0,0.5) + r6.zwzw;
          r3.xyzw = r3.zwzw * float4(0.5,1,0.5,1) + -r6.zwzw;
          r6.xyzw = max(r9.xyzw, r8.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.z = LightProperties.w / ShadowFarPlanes.y;
          r1.w = -r2.z * r1.w + r5.z;
          r2.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r6.xyzw = r7.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r5.xyxy;
          r6.xyzw = max(r6.xyzw, r9.xyzw);
          r6.xyzw = min(r6.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r1.w).x;
          r2.z = r2.z + r2.w;
          r5.xyzw = r7.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r5.xyxy;
          r5.xyzw = max(r5.xyzw, r9.xyzw);
          r3.xyzw = min(r5.xyzw, r3.xyzw);
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.xy, r1.w).x;
          r2.z = r2.z + r2.w;
          r1.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.zw, r1.w).x;
          r1.w = r2.z + r1.w;
          r1.z = r1.w * r1.z;
          r2.y = r1.z * 0.0625 + r2.y;
        }
      } else {
        r1.z = r2.x * 0.0625 + -r4.y;
        r2.y = 1 + r1.z;
      }
    } else {
      r2.y = 1;
    }
    r1.z = r4.z ? 0 : 1;
  } else {
    r2.y = 1;
    r1.z = 0;
    r4.z = -1;
  }
  r1.w = ~(int)r4.z;
  r1.y = r1.y ? r1.w : 0;
  r1.w = cmp((int)r1.z < (int)r1.x);
  r1.y = r1.w ? r1.y : 0;
  if (r1.y != 0) {
    r0.w = 1;
    r3.x = dot(ProjectionMatrix[1]._m00_m01_m02_m03, r0.xyzw);
    r3.y = dot(ProjectionMatrix[1]._m10_m11_m12_m13, r0.xyzw);
    r3.z = dot(ProjectionMatrix[1]._m20_m21_m22_m23, r0.xyzw);
    r1.w = dot(ProjectionMatrix[1]._m30_m31_m32_m33, r0.xyzw);
    r2.xzw = r3.xyz / r1.www;
    r3.xyzw = float4(2,2,2,2) / ShadowProperties.xyxy;
    r4.xy = float2(0.5,0.5) * r3.wz;
    r1.w = ShadowFrustumWidths.y * LightProperties.z;
    r1.w = 0.5 * r1.w;
    r4.zw = -r3.zw * float2(0,0.5) + r2.xz;
    r4.zw = saturate(r4.zw / r4.yx);
    r4.zw = r4.zw * float2(2,2) + float2(-1,-1);
    r4.zw = float2(1,1) + -abs(r4.zw);
    r4.zw = saturate(r4.zw / LightProperties.zz);
    r5.x = saturate(1 + -r2.w);
    r5.x = ShadowFarPlanes.y * r5.x;
    r1.w = saturate(r5.x / r1.w);
    r4.z = r4.z * r4.w;
    r4.w = r4.z * r1.w;
    r5.x = cmp(0 < r4.w);
    if (r5.x != 0) {
      r5.y = 7 * LightProperties.x;
      r5.z = r5.y / ShadowFrustumWidths.y;
      r6.xyzw = r5.zzzz / ShadowProperties.xyxy;
      r5.z = ShadowFrustumWidths.y / ShadowFrustumWidths.x;
      r7.xyzw = ShadowProperties.xyxy * ShadowProperties.zzzz;
      r8.xyzw = float4(1,1,1,1) / r7.zwzw;
      r9.xyzw = r8.zwzw / r5.zzzz;
      r7.xyzw = float4(10,10,0.5,0.5) / r7.xyzw;
      r10.xyzw = r7.xyxy / r5.zzzz;
      r6.xyzw = max(r9.xyzw, r6.xyzw);
      r6.xyzw = min(r6.xyzw, r10.xyzw);
      r9.xyzw = r6.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r2.xzxz;
      r10.xyzw = r3.zwzw * float4(0,0.5,0,0.5) + r7.zwzw;
      r11.xyzw = r3.zwzw * float4(0.5,1,0.5,1) + -r7.zwzw;
      r9.xyzw = max(r10.xyzw, r9.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = LightProperties.w / ShadowFarPlanes.y;
      r2.w = -r5.w * r5.z + r2.w;
      r5.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r6.xyzw = r6.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r2.xzxz;
      r6.xyzw = max(r6.xyzw, r10.xyzw);
      r6.xyzw = min(r6.xyzw, r11.xyzw);
      r2.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r2.w).x;
      r2.x = r5.z + r2.x;
      r2.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r2.w).x;
      r2.x = r2.x + r2.z;
      r2.x = r2.x * r4.w;
      r2.y = 0.0625 * r2.x;
      r2.z = cmp(r4.w < 1);
      r2.w = (int)r1.x + -1;
      r2.w = cmp(1 < (int)r2.w);
      r2.z = r2.w ? r2.z : 0;
      if (r2.z != 0) {
        r6.x = dot(ProjectionMatrix[2]._m00_m01_m02_m03, r0.xyzw);
        r6.y = dot(ProjectionMatrix[2]._m10_m11_m12_m13, r0.xyzw);
        r6.z = dot(ProjectionMatrix[2]._m20_m21_m22_m23, r0.xyzw);
        r2.z = dot(ProjectionMatrix[2]._m30_m31_m32_m33, r0.xyzw);
        r6.xyz = r6.xyz / r2.zzz;
        r2.z = ShadowFrustumWidths.z * LightProperties.z;
        r2.z = 0.5 * r2.z;
        r5.zw = -r3.xy * float2(0.5,0) + r6.xy;
        r4.xy = saturate(r5.zw / r4.yx);
        r4.xy = r4.xy * float2(2,2) + float2(-1,-1);
        r4.xy = float2(1,1) + -abs(r4.xy);
        r4.xy = saturate(r4.xy / LightProperties.zz);
        r2.w = saturate(1 + -r6.z);
        r2.w = ShadowFarPlanes.z * r2.w;
        r2.z = saturate(r2.w / r2.z);
        r2.w = r4.x * r4.y;
        r2.z = r2.w * r2.z;
        r2.z = cmp(0 < r2.z);
        if (r2.z != 0) {
          r1.w = -r4.z * r1.w + 1;
          r2.z = r5.y / ShadowFrustumWidths.z;
          r9.xyzw = r2.zzzz / ShadowProperties.xyxy;
          r2.z = ShadowFrustumWidths.z / ShadowFrustumWidths.x;
          r8.xyzw = r8.xyzw / r2.zzzz;
          r10.xyzw = r7.xyxy / r2.zzzz;
          r8.xyzw = max(r9.xyzw, r8.xyzw);
          r8.xyzw = min(r8.xyzw, r10.xyzw);
          r9.xyzw = r8.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r6.xyxy;
          r10.xyzw = r3.xyxy * float4(0.5,0,0.5,0) + r7.zwzw;
          r3.xyzw = r3.zwzw * float4(1,0.5,1,0.5) + -r7.zwzw;
          r7.xyzw = max(r10.xyzw, r9.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r2.w = LightProperties.w / ShadowFarPlanes.z;
          r2.z = -r2.w * r2.z + r6.z;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r6.xyzw = r8.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r6.xyxy;
          r6.xyzw = max(r6.xyzw, r10.xyzw);
          r3.xyzw = min(r6.xyzw, r3.xyzw);
          r3.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.xy, r2.z).x;
          r2.w = r3.x + r2.w;
          r2.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.zw, r2.z).x;
          r2.z = r2.w + r2.z;
          r1.w = r2.z * r1.w;
          r2.y = r1.w * 0.0625 + r2.y;
        }
      } else {
        r1.w = r2.x * 0.0625 + -r4.w;
        r2.y = 1 + r1.w;
      }
    }
    r1.z = r5.x ? 1 : 2;
  } else {
    r5.x = -1;
  }
  r1.w = ~(int)r5.x;
  r1.y = r1.y ? r1.w : 0;
  r1.w = cmp((int)r1.z < (int)r1.x);
  r1.y = r1.w ? r1.y : 0;
  if (r1.y != 0) {
    r0.w = 1;
    r3.x = dot(ProjectionMatrix[2]._m00_m01_m02_m03, r0.xyzw);
    r3.y = dot(ProjectionMatrix[2]._m10_m11_m12_m13, r0.xyzw);
    r3.z = dot(ProjectionMatrix[2]._m20_m21_m22_m23, r0.xyzw);
    r1.w = dot(ProjectionMatrix[2]._m30_m31_m32_m33, r0.xyzw);
    r2.xzw = r3.xyz / r1.www;
    r3.xyzw = float4(2,2,2,2) / ShadowProperties.xyxy;
    r4.xy = float2(0.5,0.5) * r3.zw;
    r1.w = ShadowFrustumWidths.z * LightProperties.z;
    r1.w = 0.5 * r1.w;
    r4.zw = -r3.zw * float2(0.5,0) + r2.xz;
    r4.zw = saturate(r4.zw / r4.xy);
    r4.zw = r4.zw * float2(2,2) + float2(-1,-1);
    r4.zw = float2(1,1) + -abs(r4.zw);
    r4.zw = saturate(r4.zw / LightProperties.zz);
    r5.x = saturate(1 + -r2.w);
    r5.x = ShadowFarPlanes.z * r5.x;
    r1.w = saturate(r5.x / r1.w);
    r4.z = r4.z * r4.w;
    r4.w = r4.z * r1.w;
    r5.x = cmp(0 < r4.w);
    if (r5.x != 0) {
      r5.y = 7 * LightProperties.x;
      r5.z = r5.y / ShadowFrustumWidths.z;
      r6.xyzw = r5.zzzz / ShadowProperties.xyxy;
      r5.z = ShadowFrustumWidths.z / ShadowFrustumWidths.x;
      r7.xyzw = ShadowProperties.xyxy * ShadowProperties.zzzz;
      r8.xyzw = float4(1,1,1,1) / r7.zwzw;
      r9.xyzw = r8.zwzw / r5.zzzz;
      r7.xyzw = float4(10,10,0.5,0.5) / r7.xyzw;
      r10.xyzw = r7.xyxy / r5.zzzz;
      r6.xyzw = max(r9.xyzw, r6.xyzw);
      r6.xyzw = min(r6.xyzw, r10.xyzw);
      r9.xyzw = r6.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r2.xzxz;
      r10.xyzw = r3.zwzw * float4(0.5,0,0.5,0) + r7.zwzw;
      r11.xyzw = r3.zwzw * float4(1,0.5,1,0.5) + -r7.zwzw;
      r9.xyzw = max(r10.xyzw, r9.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = LightProperties.w / ShadowFarPlanes.z;
      r2.w = -r5.w * r5.z + r2.w;
      r5.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r9.xyzw = r6.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r2.xzxz;
      r9.xyzw = max(r9.xyzw, r10.xyzw);
      r9.xyzw = min(r9.xyzw, r11.xyzw);
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.xy, r2.w).x;
      r5.z = r5.z + r5.w;
      r5.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r9.zw, r2.w).x;
      r5.z = r5.z + r5.w;
      r6.xyzw = r6.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r2.xzxz;
      r6.xyzw = max(r6.xyzw, r10.xyzw);
      r6.xyzw = min(r6.xyzw, r11.xyzw);
      r2.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.xy, r2.w).x;
      r2.x = r5.z + r2.x;
      r2.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r6.zw, r2.w).x;
      r2.x = r2.x + r2.z;
      r2.x = r2.x * r4.w;
      r2.y = 0.0625 * r2.x;
      r2.z = cmp(r4.w < 1);
      r2.w = (int)r1.x + -1;
      r2.w = cmp(2 < (int)r2.w);
      r2.z = r2.w ? r2.z : 0;
      if (r2.z != 0) {
        r6.x = dot(ProjectionMatrix[3]._m00_m01_m02_m03, r0.xyzw);
        r6.y = dot(ProjectionMatrix[3]._m10_m11_m12_m13, r0.xyzw);
        r6.z = dot(ProjectionMatrix[3]._m20_m21_m22_m23, r0.xyzw);
        r2.z = dot(ProjectionMatrix[3]._m30_m31_m32_m33, r0.xyzw);
        r6.xyz = r6.xyz / r2.zzz;
        r2.z = ShadowFrustumWidths.w * LightProperties.z;
        r2.z = 0.5 * r2.z;
        r5.zw = -r3.xy * float2(0.5,0.5) + r6.xy;
        r4.xy = saturate(r5.zw / r4.xy);
        r4.xy = r4.xy * float2(2,2) + float2(-1,-1);
        r4.xy = float2(1,1) + -abs(r4.xy);
        r4.xy = saturate(r4.xy / LightProperties.zz);
        r2.w = saturate(1 + -r6.z);
        r2.w = ShadowFarPlanes.w * r2.w;
        r2.z = saturate(r2.w / r2.z);
        r2.w = r4.x * r4.y;
        r2.z = r2.w * r2.z;
        r2.z = cmp(0 < r2.z);
        if (r2.z != 0) {
          r1.w = -r4.z * r1.w + 1;
          r2.z = r5.y / ShadowFrustumWidths.w;
          r9.xyzw = r2.zzzz / ShadowProperties.xyxy;
          r2.z = ShadowFrustumWidths.w / ShadowFrustumWidths.x;
          r8.xyzw = r8.xyzw / r2.zzzz;
          r10.xyzw = r7.xyxy / r2.zzzz;
          r8.xyzw = max(r9.xyzw, r8.xyzw);
          r8.xyzw = min(r8.xyzw, r10.xyzw);
          r9.xyzw = r8.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r6.xyxy;
          r10.xyzw = r3.xyxy * float4(0.5,0.5,0.5,0.5) + r7.zwzw;
          r3.xyzw = r3.zwzw * float4(1,1,1,1) + -r7.zwzw;
          r7.xyzw = max(r10.xyzw, r9.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r2.w = LightProperties.w / ShadowFarPlanes.w;
          r2.z = -r2.w * r2.z + r6.z;
          r2.w = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r7.xyzw = r8.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r6.xyxy;
          r7.xyzw = max(r7.xyzw, r10.xyzw);
          r7.xyzw = min(r7.xyzw, r3.xyzw);
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.xy, r2.z).x;
          r2.w = r4.x + r2.w;
          r4.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r7.zw, r2.z).x;
          r2.w = r4.x + r2.w;
          r6.xyzw = r8.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r6.xyxy;
          r6.xyzw = max(r6.xyzw, r10.xyzw);
          r3.xyzw = min(r6.xyzw, r3.xyzw);
          r3.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.xy, r2.z).x;
          r2.w = r3.x + r2.w;
          r2.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.zw, r2.z).x;
          r2.z = r2.w + r2.z;
          r1.w = r2.z * r1.w;
          r2.y = r1.w * 0.0625 + r2.y;
        }
      } else {
        r1.w = r2.x * 0.0625 + -r4.w;
        r2.y = 1 + r1.w;
      }
    }
    r1.z = r5.x ? 2 : 3;
  } else {
    r5.x = -1;
  }
  r1.w = ~(int)r5.x;
  r1.y = r1.y ? r1.w : 0;
  r1.z = cmp((int)r1.z < (int)r1.x);
  r1.y = r1.z ? r1.y : 0;
  if (r1.y != 0) {
    r0.w = 1;
    r3.x = dot(ProjectionMatrix[3]._m00_m01_m02_m03, r0.xyzw);
    r3.y = dot(ProjectionMatrix[3]._m10_m11_m12_m13, r0.xyzw);
    r3.z = dot(ProjectionMatrix[3]._m20_m21_m22_m23, r0.xyzw);
    r0.x = dot(ProjectionMatrix[3]._m30_m31_m32_m33, r0.xyzw);
    r0.xyz = r3.xyz / r0.xxx;
    r3.xyzw = float4(2,2,2,2) / ShadowProperties.xyxy;
    r1.yz = float2(0.5,0.5) * r3.xy;
    r0.w = ShadowFrustumWidths.w * LightProperties.z;
    r0.w = 0.5 * r0.w;
    r2.xz = -r3.xy * float2(0.5,0.5) + r0.xy;
    r1.yz = saturate(r2.xz / r1.yz);
    r1.yz = r1.yz * float2(2,2) + float2(-1,-1);
    r1.yz = float2(1,1) + -abs(r1.yz);
    r1.yz = saturate(r1.yz / LightProperties.zz);
    r1.w = saturate(1 + -r0.z);
    r1.w = ShadowFarPlanes.w * r1.w;
    r0.w = saturate(r1.w / r0.w);
    r1.y = r1.y * r1.z;
    r0.w = r1.y * r0.w;
    r1.y = cmp(0 < r0.w);
    if (r1.y != 0) {
      r1.y = 7 * LightProperties.x;
      r1.y = r1.y / ShadowFrustumWidths.w;
      r4.xyzw = r1.yyyy / ShadowProperties.xyxy;
      r1.y = ShadowFrustumWidths.w / ShadowFrustumWidths.x;
      r5.xyzw = ShadowProperties.xyxy * ShadowProperties.zzzz;
      r6.xyzw = float4(1,1,1,1) / r5.zwzw;
      r6.xyzw = r6.xyzw / r1.yyyy;
      r5.xyzw = float4(10,10,0.5,0.5) / r5.xyzw;
      r7.xyzw = r5.xyxy / r1.yyyy;
      r4.xyzw = max(r6.xyzw, r4.xyzw);
      r4.xyzw = min(r4.xyzw, r7.xyzw);
      r6.xyzw = r4.zwzw * float4(-0.641573071,-0.170358405,-0.220173702,0.0666730404) + r0.xyxy;
      r7.xyzw = r3.xyxy * float4(0.5,0.5,0.5,0.5) + r5.zwzw;
      r3.xyzw = r3.zwzw * float4(1,1,1,1) + -r5.zwzw;
      r5.xyzw = max(r7.xyzw, r6.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = LightProperties.w / ShadowFarPlanes.w;
      r0.z = -r1.z * r1.y + r0.z;
      r1.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(-0.56526792,0.40981409,-0.372753888,-0.69012928) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(-0.963876784,0.0795568228,0.0895406604,-0.433672994) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(-0.815210223,-0.533595324,-0.0262216199,0.725986183) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(0.152993307,0.216891706,-0.394465297,0.896840572) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(0.566493392,0.677397907,0.65583998,-0.0949900225) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r5.xyzw = r4.zwzw * float4(0.0658113286,-0.885984778,0.465619504,-0.59089911) + r0.xyxy;
      r5.xyzw = max(r5.xyzw, r7.xyzw);
      r5.xyzw = min(r5.xyzw, r3.xyzw);
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.xy, r0.z).x;
      r1.y = r1.y + r1.z;
      r1.z = Shadow.SampleCmpLevelZero(ShadowSampler_s, r5.zw, r0.z).x;
      r1.y = r1.y + r1.z;
      r4.xyzw = r4.xyzw * float4(0.771781623,0.291234612,0.862963498,-0.501030385) + r0.xyxy;
      r4.xyzw = max(r4.xyzw, r7.xyzw);
      r3.xyzw = min(r4.xyzw, r3.xyzw);
      r0.x = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.xy, r0.z).x;
      r0.x = r1.y + r0.x;
      r0.y = Shadow.SampleCmpLevelZero(ShadowSampler_s, r3.zw, r0.z).x;
      r0.x = r0.x + r0.y;
      r0.x = r0.x * r0.w;
      r2.y = 0.0625 * r0.x;
      r0.y = cmp(r0.w < 1);
      r0.z = (int)r1.x + -1;
      r0.z = cmp(3 < (int)r0.z);
      r0.y = r0.z ? r0.y : 0;
      if (r0.y == 0) {
        r0.x = r0.x * 0.0625 + -r0.w;
        r2.y = 1 + r0.x;
      }
    }
  }
  o0.xyzw = r2.yyyy;
  return;
}