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

cbuffer _Globals : register(b0)
{
  float4 VPtoRTScaleBias : packoffset(c0);
  float4 ShadowProperties : packoffset(c1);
  float4 LightProperties : packoffset(c2);
  float4 shadowFarPlanes : packoffset(c3);
  float4 SliceDistances : packoffset(c4);
  row_major float4x4 ViewMatrix[5] : packoffset(c5);
  row_major float4x4 ProjectionMatrix[4] : packoffset(c25);
}

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> 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,
  float2 v1 : TexCoord0,
  float3 v2 : TexCoord1,
  float3 v3 : TexCoord2,
  out float4 o0 : SV_Target0)
{
  const float4 icb[] = { { 1.000000, 0, 0, 0},
                              { 0, 1.000000, 0, 0},
                              { 0, 0, 1.000000, 0},
                              { 0, 0, 0, 1.000000} };
  float4 r0,r1,r2,r3;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r0.z = LinearDepth.Load(r0.xyz).x;
  r0.w = global_ViewInfo.x * r0.z;
  r1.xyz = cmp(SliceDistances.xyz < r0.www);
  r2.xyzw = cmp(SliceDistances.xyzw >= r0.wwww);
  r1.xyz = r1.xyz ? r2.yzw : 0;
  r0.w = r1.x ? 1 : 4;
  r0.w = r2.x ? 0 : r0.w;
  r1.x = ShadowProperties.x * ShadowProperties.y;
  r1.w = cmp(2 < r1.x);
  r1.z = r1.z ? 3 : r0.w;
  r1.y = r1.y ? 2 : r1.z;
  r0.w = r1.w ? r1.y : r0.w;
  r1.y = (int)r0.w;
  r1.x = cmp(r1.y < r1.x);
  r2.xy = -VPtoRTScaleBias.zw * global_ViewInfo.zw + v0.xy;
  r2.z = global_ViewInfo.w + -r2.y;
  r1.zw = r2.xz / global_ViewInfo.zw;
  r0.xy = r1.zw * float2(2,2) + float2(-1,-1);
  r2.xyz = v2.xyz * r0.xyz;
  r3.xyz = global_View._m10_m11_m12 * r2.yyy;
  r2.xyw = r2.xxx * global_View._m00_m01_m02 + r3.xyz;
  r2.xyz = r2.zzz * global_View._m20_m21_m22 + r2.xyw;
  r2.xyz = global_ViewPos.xyz + r2.xyz;
  r0.x = (uint)r0.w << 2;
  r2.w = 1;
  
//CORRECT WORLD COORD
float4 s = StereoParams.Load(0);
float4 r20, r21;
r21 = mul(global_ViewProjection, r2);  
r21.x -= s.x * (r21.w - s.y); 
r2 = mul(inverse(global_ViewProjection), r21);
  
  r3.x = dot(ProjectionMatrix[r0.x/4]._m00_m01_m02_m03, r2.xyzw);
  r3.y = dot(ProjectionMatrix[r0.x/4]._m10_m11_m12_m13, r2.xyzw);
  r0.y = dot(ProjectionMatrix[r0.x/4]._m30_m31_m32_m33, r2.xyzw);
  r1.zw = r3.xy / r0.yy;
  r1.zw = Shadow.Sample(LinearSampler_s, r1.zw).xy;
  if (r1.x != 0) {
    r0.x = dot(ViewMatrix[r0.x/4]._m20_m21_m22_m23, r2.xyzw);
    r0.y = dot(shadowFarPlanes.xyzw, icb[r0.w+0].xyzw);
    r0.x = saturate(r0.x / r0.y);
    r0.y = cmp(r1.z >= r0.x);
    r0.y = r0.y ? 1.000000 : 0;
    r1.x = -r1.z * r1.z + r1.w;
    r1.x = max(1.00000001e-007, r1.x);
    r0.x = r0.x + -r1.z;
    r0.x = r0.x * r0.x + r1.x;
    r0.x = r1.x / r0.x;
    r0.x = -0.400000006 + r0.x;
    r0.x = saturate(1.66666663 * r0.x);
    r0.x = max(r0.y, r0.x);
    r0.y = ShadowProperties.x * ShadowProperties.y + -1;
    r0.y = cmp(r1.y == r0.y);
    if (r0.y != 0) {
      r0.y = (int)r0.w + -1;
      r0.y = dot(SliceDistances.xyzw, icb[r0.y+0].xyzw);
      r0.z = global_ViewInfo.x * r0.z + -r0.y;
      r0.w = dot(SliceDistances.xyzw, icb[r0.w+0].xyzw);
      r0.y = r0.w + -r0.y;
      r0.y = saturate(r0.z / r0.y);
      r0.z = 1 + -LightProperties.z;
      r0.y = saturate(r0.y + -r0.z);
      r0.z = 1 / LightProperties.z;
      r0.y = saturate(r0.y * r0.z);
      r0.z = 1 + -r0.x;
      r0.x = r0.y * r0.z + r0.x;
    }
  } else {
    r0.x = 1;
  }
  o0.xyzw = r0.xxxx;
  return;
}