//needs to be edited
// 3DMigoto: b3c0ee8bd67c89df |    Unity headers extracted from Internal-PrePassCollectShadows.shader
//    Shader "Hidden/Internal-PrePassCollectShadows" {
//      Properties {
//       _ShadowMapTexture ("", any) = "" { }
//      }
//      Fallback Off
//      SubShader 2/2 {
//        Tags { "ShadowmapFilter"="PCF_5x5" }
//        Pass 1/1 {
//          Tags { "ShadowmapFilter"="PCF_5x5" }
//          ZTest Always
//          ZWrite Off
//          Cull Off
//          GpuProgramID 128839
//          Program "fp" {
//            SubProgram "d3d11 " {
//              GpuProgramIndex 89
//            }
//          }
//        }
//      }
//    }
//
// Unity 5.3 headers extracted from Internal-PrePassCollectShadows.shader.decompressed:
//   API d3d11
//   Shader model ps_4_0
//   undeciphered1: 77 1 0
//   Keywords { "SHADOWS_NATIVE" }
//   undeciphered2: 1 2 4 2 0
//   undeciphered3: 0 0
//   ConstBuffer "$Globals" 128
//   Vector 112 [_ShadowMapTexture_TexelSize]
//   ConstBuffer "UnityPerCamera" 144
//   Vector 112 [_ZBufferParams]
//   Vector 128 [unity_OrthoParams]
//   ConstBuffer "UnityShadows" 416
//   Vector 96 [_LightSplitsNear]
//   Vector 112 [_LightSplitsFar]
//   Vector 384 [_LightShadowData]
//   Matrix 128 [unity_World2Shadow0]
//   Matrix 192 [unity_World2Shadow1]
//   Matrix 256 [unity_World2Shadow2]
//   Matrix 320 [unity_World2Shadow3]
//   ConstBuffer "UnityPerCamera2" 64
//   Matrix 0 [_CameraToWorld]
//   SetTexture 0 [_CameraDepthTexture] 2D 0
//   SetTexture 1 [_ShadowMapTexture] 2D 1
//   BindCB "$Globals" 0
//   BindCB "UnityPerCamera" 1
//   BindCB "UnityShadows" 2
//   BindCB "UnityPerCamera2" 3
//
// Headers extracted with DarkStarSword's extract_unity53_shaders.py
// https://raw.githubusercontent.com/DarkStarSword/3d-fixes/master/extract_unity53_shaders.py

// ---- Created with 3Dmigoto v1.2.38 on Mon Sep 12 06:51:25 2016
Texture2D<float4> t1 : register(t1);

Texture2D<float4> t0 : register(t0);

SamplerComparisonState s1_s : register(s1);

SamplerState s0_s : register(s0);

cbuffer cb3 : register(b3)
{
  float4 cb3[4];
}

cbuffer cb2 : register(b2)
{
  float4 cb2[25];
}

cbuffer cb1 : register(b1)
{
  float4 cb1[9];
}

cbuffer cb0 : register(b0)
{
  float4 cb0[8];
}




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


void main( 
  float4 v0 : TEXCOORD0,
  float4 v1 : TEXCOORD1,
  float4 v2 : TEXCOORD2,
  float3 v3 : TEXCOORD3,
float fov : TEXCOORD4, // New input from vertex shader with unity_CameraInvProjection[0].x;
  float4 v4 : SV_POSITION0,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xyzw = t0.Sample(s0_s, v0.xy).xyzw;
  r0.y = cb1[7].x * r0.x + cb1[7].y;
  r0.y = 1 / r0.y;
  r0.z = r0.x + -r0.y;
  r0.y = cb1[8].w * r0.z + r0.y;

  r1.xyz = v3.xyz + -v2.xyz;
  r0.xzw = r0.xxx * r1.xyz + v2.xyz;
  r0.xzw = -v1.xyz * r0.yyy + r0.xzw;
  r1.xyz = v1.xyz * r0.yyy;
  r0.xyz = cb1[8].www * r0.xzw + r1.xyz;
  r1.xyzw = cmp(r0.zzzz >= cb2[6].xyzw);
  r1.xyzw = r1.xyzw ? 1.000000 : 0;
  r2.xyzw = cmp(r0.zzzz < cb2[7].xyzw);
  r2.xyzw = r2.xyzw ? 1.000000 : 0;
  r1.xyzw = r2.xyzw * r1.xyzw;

float depth = r0.z;
float4 stereo = StereoParams.Load(0);
float separation = stereo.x; float convergence = stereo.y;
r0.x -= separation * (depth - convergence) * fov;

  r2.xyzw = cb3[1].xyzw * r0.yyyy;
  r2.xyzw = cb3[0].xyzw * r0.xxxx + r2.xyzw;
  r2.xyzw = cb3[2].xyzw * r0.zzzz + r2.xyzw;
  r0.x = saturate(r0.z * cb2[24].z + cb2[24].w);
  r2.xyzw = cb3[3].xyzw + r2.xyzw;
  r0.yzw = cb2[13].xyz * r2.yyy;
  r0.yzw = cb2[12].xyz * r2.xxx + r0.yzw;
  r0.yzw = cb2[14].xyz * r2.zzz + r0.yzw;
  r0.yzw = cb2[15].xyz * r2.www + r0.yzw;
  r0.yzw = r0.yzw * r1.yyy;
  r3.xyz = cb2[9].xyz * r2.yyy;
  r3.xyz = cb2[8].xyz * r2.xxx + r3.xyz;
  r3.xyz = cb2[10].xyz * r2.zzz + r3.xyz;
  r3.xyz = cb2[11].xyz * r2.www + r3.xyz;
  r0.yzw = r3.xyz * r1.xxx + r0.yzw;
  r3.xyz = cb2[17].xyz * r2.yyy;
  r3.xyz = cb2[16].xyz * r2.xxx + r3.xyz;
  r3.xyz = cb2[18].xyz * r2.zzz + r3.xyz;
  r3.xyz = cb2[19].xyz * r2.www + r3.xyz;
  r0.yzw = r3.xyz * r1.zzz + r0.yzw;
  r1.xyz = cb2[21].xyz * r2.yyy;
  r1.xyz = cb2[20].xyz * r2.xxx + r1.xyz;
  r1.xyz = cb2[22].xyz * r2.zzz + r1.xyz;
  r1.xyz = cb2[23].xyz * r2.www + r1.xyz;
  r0.yzw = r1.xyz * r1.www + r0.yzw;
  r0.yz = r0.yz * cb0[7].zw + float2(0.5,0.5);
  r1.xy = floor(r0.yz);
  r0.yz = frac(r0.yz);
  r1.xy = float2(-0.5,-0.5) + r1.xy;
  r1.zw = -r0.yz * float2(2,2) + float2(3,3);
  r2.xy = -r0.yz * float2(3,3) + float2(4,4);
  r1.zw = r1.zw / r2.xy;
  r3.xy = float2(-2,-2) + r1.zw;
  r4.z = r3.y;
  r1.zw = r0.yz * float2(3,3) + float2(1,1);
  r2.xz = r0.yz / r1.zw;
  r4.xw = float2(2,2) + r2.xz;
  r3.w = r4.x;
  r2.xz = float2(3,3) + r0.yz;
  r0.y = 3 * r0.y;
  r5.xz = r0.yy * float2(-1,1) + float2(4,1);
  r4.xy = cb0[7].xy * r2.xz;
  r6.xz = cb0[7].yy;
  r6.y = 0.142857149;
  r6.xyz = r6.xyz * r4.zyw;
  r3.z = r4.x;
  r4.w = r6.x;
  r7.xz = cb0[7].xx;
  r7.y = 0.142857149;
  r4.xyz = r7.yxz * r3.zxw;
  r3.xyzw = r1.xyxy * cb0[7].xyxy + r4.ywxw;
  r0.yz = r1.xy * cb0[7].xy + r4.zw;
  r0.y = t1.SampleCmpLevelZero(s1_s, r0.yz, r0.w).x;
  r0.z = t1.SampleCmpLevelZero(s1_s, r3.xy, r0.w).x;
  r1.z = t1.SampleCmpLevelZero(s1_s, r3.zw, r0.w).x;
  r5.y = 7;
  r2.xyz = r5.xyz * r2.yyy;
  r3.xyz = r5.xyz * r1.www;
  r5.xy = float2(7,7) * r5.xz;
  r1.z = r2.y * r1.z;
  r0.z = r2.x * r0.z + r1.z;
  r0.y = r2.z * r0.y + r0.z;
  r6.w = r4.y;
  r2.xyzw = r1.xyxy * cb0[7].xyxy + r6.wywz;
  r4.yw = r6.yz;
  r0.z = t1.SampleCmpLevelZero(s1_s, r2.xy, r0.w).x;
  r1.z = t1.SampleCmpLevelZero(s1_s, r2.zw, r0.w).x;
  r0.y = r5.x * r0.z + r0.y;
  r2.xyzw = r1.xyxy * cb0[7].xyxy + r4.xyzy;
  r4.xyzw = r1.xyxy * cb0[7].xyxy + r4.xwzw;
  r0.z = t1.SampleCmpLevelZero(s1_s, r2.xy, r0.w).x;
  r1.x = t1.SampleCmpLevelZero(s1_s, r2.zw, r0.w).x;
  r0.y = r0.z * 49 + r0.y;
  r0.y = r5.y * r1.x + r0.y;
  r0.y = r3.x * r1.z + r0.y;
  r0.z = t1.SampleCmpLevelZero(s1_s, r4.xy, r0.w).x;
  r0.w = t1.SampleCmpLevelZero(s1_s, r4.zw, r0.w).x;
  r0.y = r3.y * r0.z + r0.y;
  r0.y = r3.z * r0.w + r0.y;
  r0.y = 0.0069444445 * r0.y;
  r0.z = 1 + -cb2[24].x;
  r0.y = r0.y * r0.z + cb2[24].x;
  o0.xyzw = r0.yyyy + r0.xxxx;
  return;
} 