// 3DMigoto: 4e821607b4b7312e |    Unity headers extracted from Image Effects_Sonar
//    Shader "Image Effects/Sonar" {
//      SubShader 1/1 {
//        Pass 1/1 {
//          ZWrite Off
//          Program "fp" {
//            SubProgram "d3d11" {
//            }
//          }
//        }
//      }
//    }
//
// Unity 5.3 headers extracted from Image Effects_Sonar:
//   API d3d11
//   Shader model ps_4_0
//   undeciphered1: 201609010 74 3 0
//   undeciphered1a: 4
//   undeciphered2: 1 3 3 3 0 0
//   undeciphered3: 0 0
//   ConstBuffer "$Globals" 112
//   Float 100 [_SonarPingDistance]
//   Matrix 32 [_Camera2World]
//   ConstBuffer "UnityPerCamera" 144
//   Vector 0 [_Time]
//   Vector 80 [_ProjectionParams]
//   Vector 128 [unity_OrthoParams]
//   ConstBuffer "UnityPerCameraRare" 352
//   Matrix 96 [unity_CameraProjection]
//   SetTexture 0 [_CameraDepthTexture] 2D 1
//   SetTexture 1 [_MainTex] 2D 0
//   SetTexture 2 [_CameraGBufferTexture2] 2D 2
//   BindCB "$Globals" 0
//   BindCB "UnityPerCamera" 1
//   BindCB "UnityPerCameraRare" 2
//
// 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:55:31 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 4e821607b4b7312e-ps_replace.txt

cbuffer UnityPerCameraRare : register(b2) {
  row_major matrix unity_CameraProjection : packoffset(c6);
}

cbuffer UnityPerCamera : register(b1) {
  float4 _Time : packoffset(c0);
  float4 _ProjectionParams : packoffset(c5);
  float4 unity_OrthoParams : packoffset(c8);
}

cbuffer Globals : register(b0) {
  row_major matrix _Camera2World : packoffset(c2);
  float _SonarPingDistance : packoffset(c6.y);
}




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


void main( 
  float4 v0 : SV_POSITION0,
  float2 v1 : TEXCOORD0,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.x = _ProjectionParams.y * _ProjectionParams.z;
  r0.yz = _ProjectionParams.zy + -_ProjectionParams.yz;
  r1.xyzw = t0.Sample(s1_s, v1.xy).xyzw;
  r0.w = 1 + -r1.x;
  r0.yz = r0.ww * r0.yz + _ProjectionParams.yz;
  r0.x = r0.x / r0.z;

float depth = r0.x;

  r0.y = r0.y + -r0.x;
  r0.x = unity_OrthoParams.w * r0.y + r0.x;
  r0.y = 1 + -r0.x;
  r0.y = unity_OrthoParams.w * r0.y + r0.x;
  r1.xy = v1.xy * float2(2,2) + float2(-1,-1);
  r1.zw = -unity_CameraProjection[2].xy + r1.xy;
  r2.x = unity_CameraProjection[0].x;
  r2.y = unity_CameraProjection[1].y;
  r1.zw = r1.zw / r2.xy;
  r2.xy = r1.xy / r2.xy;
  r0.yz = r1.zw * r0.yy;

float4 s = StereoParams.Load(0);
r0.y -= s.x * (r0.x - s.y) / unity_CameraProjection[0].x;

  r1.xyz = _Camera2World[1].xyz * r0.zzz;
  r1.xyz = _Camera2World[0].xyz * r0.yyy + r1.xyz;
  r0.xyz = _Camera2World[2].xyz * -r0.xxx + r1.xyz;
  r0.xyz = _Camera2World[3].xyz + r0.xyz;
  r0.xyz = _Time.yyy * float3(0.300000012,0.300000012,0.300000012) + r0.xyz;
  r0.xyz = float3(1.33333337,1.33333337,1.33333337) * r0.xyz;
  r0.xyz = frac(r0.xyz);
  r0.x = min(r0.x, r0.y);
  r0.x = min(r0.x, r0.z);
  r0.x = 1 + -r0.x;
  r0.x = log2(r0.x);
  r0.x = 7 * r0.x;
  r0.x = exp2(r0.x);
  r2.z = -1;
  r0.z = dot(r2.xyz, r2.xyz);
  r0.z = rsqrt(r0.z);
  r1.xyz = r2.xyz * r0.zzz;
  r0.z = dot(-r1.xyz, -r1.xyz);
  r0.z = rsqrt(r0.z);
  r1.xyz = -r1.xyz * r0.zzz;
  r2.xyzw = t2.Sample(s2_s, v1.xy).xyzw;
  r2.xyz = float3(-0.5,-0.5,-0.5) + r2.xyz;
  r0.z = dot(r1.xyz, r2.xyz);
  r0.z = abs(r0.z) * abs(r0.z);
  r0.yz = float2(2,6) * r0.xz;
  r0.z = min(1, r0.z);
  r1.x = r0.y * r0.z;
  r0.y = -r0.z * 0.5 + 1;
  r0.z = 0.999899983 + -r0.w;
  r0.w = log2(r0.w);
  r0.w = 2000 * r0.w;
  r0.w = exp2(r0.w);
  r0.w = min(1, r0.w);
  r0.z = ceil(r0.z);
  r1.w = _SonarPingDistance * 2 + -r0.w;
  r2.x = 100 * r1.w;
  r1.w = saturate(r1.w * 4 + -2.5);
  r1.w = 1 + -r1.w;
  r2.x = saturate(r2.x);
  r2.x = r2.x * r1.w;
  r2.y = 0.899999976 + -r0.w;
  r2.x = r2.x * r2.y;
  r2.y = 1000 * r0.w;
  r2.y = min(1, r2.y);
  r2.x = r2.x * r2.y;
  r0.z = saturate(r2.x * r0.z);
  r0.xy = r0.xy * r0.zz;
  r0.y = r0.y * r0.w;
  r0.w = r0.w + r0.z;
  r0.w = min(1, r0.w);
  r2.xyz = r0.www * float3(0,-0.100000001,-0.800000012) + float3(0,0.100000001,0.800000012);
  r0.w = r1.w * r0.z;
  r0.w = -r0.w * 0.5 + 1;
  r1.w = r1.w * r0.w;
  r1.w = log2(r1.w);
  r1.w = 20 * r1.w;
  r1.w = exp2(r1.w);
  r1.w = r1.w * r0.z;
  r0.y = r1.w * 10 + r0.y;
  r2.xyz = r0.yyy * r2.xyz;
  r3.xyzw = t1.Sample(s0_s, v1.xy).xyzw;
  r0.yzw = r3.xyz * r0.www + r2.xyz;
  o0.w = r3.w;
  r1.yz = float2(0,0);
  r1.xyz = r1.xyz + -r0.yzw;
  o0.xyz = r0.xxx * r1.xyz + r0.yzw;
  return;
}
