// 3DMigoto: 9bc3912030b96845 |    Unity headers extracted from Hidden_Post FX_Screen Space Reflection
//    Shader "Hidden/Post FX/Screen Space Reflection" {
//      Fallback "Diffuse"
//      SubShader 1/1 {
//        Pass 1/9 {
//          ZWrite Off
//          Program "fp" {
//            SubProgram "d3d11" {
//            }
//          }
//        }
//      }
//    }
//
// Unity 5.3 headers extracted from Hidden_Post FX_Screen Space Reflection:
//   API d3d11
//   Shader model ps_4_0
//   undeciphered1: 201609010 151 3 8
//   undeciphered1a: 13
//   undeciphered2: 1 3 2 3 0 0
//   undeciphered3: 0 0
//   ConstBuffer "$Globals" 560
//   Vector 64 [_MainTex_TexelSize]
//   Vector 96 [_ProjInfo]
//   Vector 304 [_ScreenSize] 2
//   Float 352 [_RayStepSize]
//   Float 356 [_MaxRayTraceDistance]
//   Float 360 [_LayerThickness]
//   Float 364 [_FresnelFade]
//   Float 368 [_FresnelFadePower]
//   ScalarInt 380 [_TreatBackfaceHitAsMiss]
//   ScalarInt 384 [_AllowBackwardsRays]
//   Float 396 [_ScreenEdgeFading]
//   ScalarInt 400 [_MaxSteps]
//   Float 420 [_FadeDistance]
//   ScalarInt 424 [_TraceBehindObjects]
//   Matrix 112 [_WorldToCameraMatrix]
//   Matrix 176 [_CameraToWorldMatrix]
//   Matrix 240 [_ProjectToPixelMatrix]
//   ConstBuffer "UnityPerCamera" 144
//   Vector 112 [_ZBufferParams]
//   SetTexture 0 [_CameraDepthTexture] 2D 0
//   SetTexture 1 [_CameraGBufferTexture1] 2D 1
//   SetTexture 2 [_CameraGBufferTexture2] 2D 2
//   BindCB "$Globals" 0
//   BindCB "UnityPerCamera" 1
//
// Headers extracted with DarkStarSword's extract_unity55_shaders.py
// https://github.com/DarkStarSword/3d-fixes

// ---- Created with 3Dmigoto v1.2.65 on Thu Jan 25 16:57:59 2018
Texture2D<float4> t2 : register(t2);

Texture2D<float4> t1 : register(t1);

Texture2D<float4> t0 : register(t0);

SamplerState s2_s : register(s2);

SamplerState s1_s : register(s1);

SamplerState s0_s : register(s0);


// Unity constant buffers reconstructed with DarkStarSword's hlsltool.py:
// hlsltool.py --reconstruct-unity-cbuffers --in-place 9bc3912030b96845-ps_replace.txt

cbuffer UnityPerCamera : register(b1) {
  float4 _ZBufferParams : packoffset(c7);
}

cbuffer Globals : register(b0) {
  float4 _MainTex_TexelSize : packoffset(c4);
  float4 _ProjInfo : packoffset(c6);
  row_major matrix _WorldToCameraMatrix : packoffset(c7);
  row_major matrix _CameraToWorldMatrix : packoffset(c11);
  row_major matrix _ProjectToPixelMatrix : packoffset(c15);
  float2 _ScreenSize : packoffset(c19);
  float _RayStepSize : packoffset(c22);
  float _MaxRayTraceDistance : packoffset(c22.y);
  float _LayerThickness : packoffset(c22.z);
  float _FresnelFade : packoffset(c22.w);
  float _FresnelFadePower : packoffset(c23);
  int _TreatBackfaceHitAsMiss : packoffset(c23.w);
  int _AllowBackwardsRays : packoffset(c24);
  float _ScreenEdgeFading : packoffset(c24.w);
  int _MaxSteps : packoffset(c25);
  float _FadeDistance : packoffset(c26.y);
  int _TraceBehindObjects : packoffset(c26.z);
}




// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);
#define separation StereoParams.Load(0).x
#define convergence StereoParams.Load(0).y


void main( 
  float4 v0 : SV_POSITION0,
  float2 v1 : TEXCOORD0,
  float2 w1 : TEXCOORD1,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12;
  uint4 bitmask, uiDest;
  float4 fDest;

// Googled _ProjInfo, found this:
// https://forum.unity3d.com/threads/screen-space-raytracing-and-depth-buffer-sample-filtering.157330/
//P = this.camera.projectionMatrix;
//
//Vector4 projInfo = new Vector4
//	((-2.0f / (Screen.width * P[0])),
//	 (-2.0f / (Screen.height * P[5])),
//	 ((1.0f - P[2]) / P[0]),
//	 ((1.0f + P[6]) / P[5]));

// So, we can easily derive the FOV from this:
float fov = -2 / (_ProjInfo.x * _ScreenSize.x);

  r0.xyzw = t0.Sample(s0_s, w1.xy).xyzw;
  r0.x = _ZBufferParams.z * r0.x + _ZBufferParams.w;
  r0.x = 1 / r0.x;
  r1.z = -r0.x;
  r2.xyzw = t1.Sample(s1_s, w1.xy).xyzw;
  r0.y = cmp(r1.z < -100);
  r0.z = cmp(r2.w == 0.000000);
  r0.y = (int)r0.z | (int)r0.y;
  if (r0.y == 0) {
    r0.yz = _MainTex_TexelSize.zw * w1.xy;
    r0.yz = r0.yz * _ProjInfo.xy + _ProjInfo.zw;
    r1.xy = r0.yz * r1.zz;

r1.x += separation * (r1.z - convergence) / fov;

    r2.xyzw = t2.Sample(s2_s, w1.xy).xyzw;
    r0.yzw = r2.xyz * float3(2,2,2) + float3(-1,-1,-1);
    r2.xyz = _WorldToCameraMatrix[1].xyz * r0.zzz;
    r2.xyz = _WorldToCameraMatrix[0].xyz * r0.yyy + r2.xyz;
    r0.yzw = _WorldToCameraMatrix[2].xyz * r0.www + r2.xyz;

// Normal - do not adjust

    r1.w = dot(r1.xyz, r1.xyz);
    r1.w = rsqrt(r1.w);
    r2.xyz = r1.xyz * r1.www;
    r1.w = dot(r0.yzw, -r2.xyz);
    r1.w = r1.w + r1.w;
    r3.xyz = r0.yzw * r1.www + r2.xyz;
    r1.w = dot(r3.xyz, r3.xyz);
    r1.w = rsqrt(r1.w);
    r3.xyz = r3.xyz * r1.www;
    r1.w = cmp(asint(_AllowBackwardsRays) == 0);
    r2.w = cmp(0 < r3.z);
    r1.w = r1.w ? r2.w : 0;
    if (r1.w == 0) {
      r0.x = 0.00999999978 * r0.x;
      r0.x = max(0.00100000005, r0.x);
      r0.xyz = r0.yzw * r0.xxx + r1.xyz;
      r0.w = cmp(asint(_TraceBehindObjects) == 1);
      r4.xy = float2(1,1) / _ScreenSize.xy;
      r1.w = r3.z * _MaxRayTraceDistance + r0.z;
      r1.w = cmp(-0.00999999978 < r1.w);
      r2.w = -0.00999999978 + -r0.z;
      r2.w = r2.w / r3.z;
      r1.w = r1.w ? r2.w : _MaxRayTraceDistance;
      r5.xyz = r3.xyz * r1.www + r0.xyz;
      r6.xyz = _ProjectToPixelMatrix[1].xyw * r0.yyy;
      r6.xyz = _ProjectToPixelMatrix[0].xyw * r0.xxx + r6.xyz;
      r6.xyz = _ProjectToPixelMatrix[2].xyw * r0.zzz + r6.xyz;
      r6.xyz = _ProjectToPixelMatrix[3].xyw + r6.xyz;
      r7.xyz = _ProjectToPixelMatrix[1].xyw * r5.yyy;
      r7.xyz = _ProjectToPixelMatrix[0].xyw * r5.xxx + r7.xyz;
      r7.xyz = _ProjectToPixelMatrix[2].xyw * r5.zzz + r7.xyz;
      r7.xyz = _ProjectToPixelMatrix[3].xyw + r7.xyz;

r6.x -= separation * (r0.z - convergence) * _ScreenSize.x / 2;
r7.x -= separation * (r5.z - convergence) * _ScreenSize.x / 2;

      r1.w = 1 / r6.z;
      r2.w = 1 / r7.z;
      r4.zw = r6.yx * r1.ww;
      r6.zw = r7.xy * r2.ww;
      r8.xyz = r1.www * r0.xyz;
      r5.xyz = r5.xyz * r2.www;
      r7.zw = float2(-0.5,-0.5) + _ScreenSize.yx;
      r9.xy = cmp(r7.zw < r6.wz);
      r9.zw = cmp(r6.wz < float2(0.5,0.5));
      r9.zw = (int2)r9.zw | (int2)r9.xy;
      r7.zw = r9.xy ? -r7.zw : float2(-0.5,-0.5);
      r7.zw = r7.yx * r2.ww + r7.zw;
      r7.xy = r7.yx * r2.ww + -r4.zw;
      r7.xy = r7.zw / r7.xy;
      r3.w = r9.z ? r7.x : 0;
      r5.w = max(r3.w, r7.y);
      r3.w = r9.w ? r5.w : r3.w;
      r7.xy = r6.xy * r1.ww + -r6.zw;
      r6.zw = r3.ww * r7.xy + r6.zw;
      r5.w = -r2.w + r1.w;
      r2.w = r3.w * r5.w + r2.w;
      r7.xyz = r0.xyz * r1.www + -r5.xyz;
      r5.xyz = r3.www * r7.xyz + r5.xyz;
      r7.xy = r6.xy * r1.ww + -r6.zw;
      r3.w = dot(r7.xy, r7.xy);
      r3.w = cmp(r3.w < 9.99999975e-005);
      r7.xy = r6.xy * r1.ww + float2(0.00999999978,0.00999999978);
      r7.xy = r3.ww ? r7.xy : r6.zw;
      r7.zw = -r6.xy * r1.ww + r7.xy;
      r3.w = cmp(abs(r7.z) < abs(r7.w));
      r4.zw = r3.ww ? r4.zw : r4.wz;
      r6.xyz = r3.www ? r7.ywz : r7.xzw;
      r5.w = cmp(0 < r6.y);
      r6.w = cmp(r6.y < 0);
      r5.w = (int)-r5.w + (int)r6.w;
      r7.x = (int)r5.w;
      r5.w = r7.x / r6.y;
      r7.y = r5.w * r6.z;
      r5.xyz = -r0.xyz * r1.www + r5.xyz;
      r5.xyz = r5.xyz * r5.www;
      r0.x = r2.w + -r1.w;
      r0.x = r0.x * r5.w;
      r0.y = trunc(_RayStepSize);
      r5.xyw = r5.xyz * r0.yyy;
      r2.w = r0.x * r0.y;
      r6.x = r7.x * r6.x;
      r6.y = 100000 + -_LayerThickness;
      r6.y = cmp(r0.z >= r6.y);
      r6.z = cmp(100000 >= r0.z);
      r6.y = r6.z ? r6.y : 0;
      r9.x = r8.z;
      r9.y = r1.w;
      r6.zw = float2(-1,-1);
      r10.xy = r4.zw;
      r7.z = 0;
      r7.w = r6.y;
      r11.y = r0.z;
      r8.w = r6.y;
      while (true) {
        r9.z = r10.x * r7.x;
        r9.z = cmp(r6.x >= r9.z);
        r9.w = cmp((int)r7.z < asint(_MaxSteps));
        r9.z = r9.w ? r9.z : 0;
        r9.w = ~(int)r8.w;
        r9.z = r9.w ? r9.z : 0;
        if (r9.z == 0) break;
        r9.z = r5.w * 0.5 + r9.x;
        r9.w = r2.w * 0.5 + r9.y;
        r11.x = r9.z / r9.w;
        r9.z = cmp(r11.x < r11.y);
        r9.zw = r9.zz ? r11.xy : r11.yx;
        r6.zw = r3.ww ? r10.yx : r10.xy;
        r10.zw = r6.zw * r4.xy;
        r12.xyzw = t0.SampleLevel(s0_s, r10.zw, 0).xyzw;
        r10.z = _ZBufferParams.z * r12.x + _ZBufferParams.w;
        r10.z = 1 / r10.z;
        r9.z = cmp(-r10.z >= r9.z);
        r10.z = -_LayerThickness + -r10.z;
        r9.w = cmp(r9.w >= r10.z);
        r7.w = r9.w ? r9.z : 0;
        r8.w = r0.w ? r7.w : r9.z;
        r10.xy = r7.xy * r0.yy + r10.xy;
        r9.x = r5.z * r0.y + r9.x;
        r9.y = r0.x * r0.y + r9.y;
        r7.z = (int)r7.z + 1;
        r11.y = r11.x;
      }
      r4.z = -r5.z * r0.y + r9.x;
      r0.x = -r0.x * r0.y + r9.y;
      r0.y = (int)r7.z;
      r4.xy = r5.xy * r0.yy + r8.xy;
      r0.x = 1 / r0.x;
      r5.xy = r6.zw / _ScreenSize.xy;
      r0.xzw = r4.xyz * r0.xxx + -r1.xyz;
      r5.z = dot(r0.xzw, r3.xyz);
      if (r7.w != 0) {
        r0.x = r0.y + r0.y;
        r0.y = asint(_MaxSteps);
        r0.x = r0.x / r0.y;
        r0.x = -1 + r0.x;
        r0.x = max(0, r0.x);
        r0.x = 1 + -r0.x;
        r0.x = r0.x * r0.x;
        r0.y = _MaxRayTraceDistance + -r5.z;
        r0.y = saturate(r0.y / _FadeDistance);
        r0.x = r0.x * r0.y;
        r0.y = dot(r3.xyz, r2.xyz);
        r0.y = log2(abs(r0.y));
        r0.y = _FresnelFadePower * r0.y;
        r0.y = exp2(r0.y);
        r0.z = 1 + -_FresnelFade;
        r0.w = 1 + -r0.y;
        r0.y = r0.z * r0.w + r0.y;
        r0.y = max(0, r0.y);
        r0.x = r0.x * r0.y;
        r0.y = cmp(0 < asint(_TreatBackfaceHitAsMiss));
        if (r0.y != 0) {
          r1.xyzw = t2.SampleLevel(s2_s, r5.xy, 0).xyzw;
          r0.yzw = r1.xyz * float3(2,2,2) + float3(-1,-1,-1);
          r1.xyz = _CameraToWorldMatrix[1].xyz * r3.yyy;
          r1.xyz = _CameraToWorldMatrix[0].xyz * r3.xxx + r1.xyz;
          r1.xyz = _CameraToWorldMatrix[2].xyz * r3.zzz + r1.xyz;
          r0.y = dot(r0.yzw, r1.xyz);
          r0.y = cmp(0 < r0.y);
          r0.x = r0.y ? 0 : r0.x;
        }
      } else {
        r0.x = 0;
      }
      r0.yz = float2(1,1) + -r5.xy;
      r0.y = min(r0.y, r0.z);
      r0.z = min(r5.x, r5.x);
      r0.y = min(r0.y, r0.z);
      r0.z = _ScreenEdgeFading * 0.100000001 + 0.00100000005;
      r0.y = saturate(r0.y / r0.z);
      r0.y = log2(r0.y);
      r0.y = 0.200000003 * r0.y;
      r0.y = exp2(r0.y);
      r0.y = r0.y * r0.y;
      o0.w = r0.y * r0.x;
      o0.xyz = r5.xyz;
    } else {
      o0.xyzw = float4(0,0,0,0);
    }
  } else {
    o0.xyzw = float4(0,0,0,0);
  }
  return;
}
