// ---- Created with 3Dmigoto v1.3.10 on Sun Aug 26 11:17:41 2018



//NEW
cbuffer PER_FRAME : register(b13)
{
  row_major float4x4 g_VS_ViewProjMatr : packoffset(c0);
  float4 g_VS_ScreenSize : packoffset(c7);
  float4 g_VS_NearFarClipDist : packoffset(c9);
}

cbuffer PER_BATCH : register(b0)
{
  float4 g_WorldViewPos : packoffset(c0);
  float4 g_ScreenSize : packoffset(c1);
  row_major float4x4 g_mViewProjPrev : packoffset(c2);
  float4 PS_NearFarClipDist : packoffset(c6);
  float4 PS_ScreenSize : packoffset(c7);
  row_major float4x4 g_mViewProj : packoffset(c8);
  float4 PS_HPosScale : packoffset(c12);
}

cbuffer PER_FRAME : register(b2)
{
  float4 g_PS_ProjRatio : packoffset(c223);
}

SamplerState _tex0_s : register(s0);
SamplerState _tex1_s : register(s1);
SamplerState _tex2_s : register(s2);
SamplerState _tex3_s : register(s3);
SamplerState _tex4_s : register(s4);
SamplerState _tex5_s : register(s5);
Texture2D<float4> _tex0 : register(t0);
Texture2D<float4> _tex1 : register(t1);
Texture2D<float4> _tex2 : register(t2);
Texture2D<float4> _tex3 : register(t3);
Texture2D<float4> _tex4 : register(t4);
Texture2D<float4> _tex5 : register(t5);


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

void main(
  float4 v0 : SV_Position0,
  float4 v1 : TEXCOORD0,
  float4 v2 : TEXCOORD1,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = g_ScreenSize.zw + v1.xy;
  r1.xyz = _tex1.Sample(_tex1_s, r0.xy).xyz;
  r0.x = _tex2.Sample(_tex2_s, r0.xy).x;
  r0.yzw = r1.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r1.x = dot(r0.yzw, r0.yzw);
  r1.x = rsqrt(r1.x);
  r0.yzw = r1.xxx * r0.yzw;
  r1.z = _tex0.Sample(_tex0_s, v1.xy).x;

// World space adjustment:
float4 stereo = StereoParams.Load(0);
matrix ivp = inverse(g_mViewProj);
float4 tmp;
float depth = r1.z * PS_NearFarClipDist.y;
float adj = stereo.x * (depth - stereo.y);
tmp = mul(float4(adj, 0, 0, 0), ivp);
v2.xyz -= tmp.xyz / r1.z;


  r2.xyz = v2.xyz * r1.zzz;
  r2.w = dot(r2.xyz, r2.xyz);
  r2.w = rsqrt(r2.w);
  r2.xyz = r2.xyz * r2.www;
  r2.w = PS_NearFarClipDist.y * r1.z;
  r2.w = 1.5 * r2.w;
  r3.x = dot(r2.xyz, r0.yzw);
  r3.x = r3.x + r3.x;
  r0.yzw = r0.yzw * -r3.xxx + r2.xyz;
  r3.x = dot(r0.yzw, r0.yzw);
  r3.x = rsqrt(r3.x);
  r0.yzw = r3.xxx * r0.yzw;
  r3.xyz = r0.yzw * r2.www;
  r2.x = dot(r2.xyz, r3.xyz);
  r2.x = saturate(0.5 + r2.x);
  r2.y = cmp(r2.x < 0.00999999978);
  r2.z = cmp(r1.z == 1.000000);
  r2.y = (int)r2.z | (int)r2.y;
  if (r2.y != 0) {
    o0.xyzw = float4(0,0,0,0);
    return;
  }
  r4.xyz = r1.zzz * v2.xyz + g_WorldViewPos.xyz;



/*original code
  r5.xyz = g_mViewProj._m10_m11_m13 * r4.yyy;
  r5.xyz = r4.xxx * g_mViewProj._m00_m01_m03 + r5.xyz;
  r5.xyz = r4.zzz * g_mViewProj._m20_m21_m23 + r5.xyz;
  r1.xyw = g_mViewProj._m30_m31_m33 + r5.xyz;
  r5.xyz = float3(0.5,-0.5,0.5) * r1.xyw;
  r2.yz = r5.xy + r5.zz;
  r1.xy = PS_HPosScale.xy * r2.yz;
  r0.yzw = r0.yzw * r2.www + r4.xyz;
  r5.xyzw = g_mViewProj._m10_m11_m12_m13 * r0.zzzz;
  r5.xyzw = r0.yyyy * g_mViewProj._m00_m01_m02_m03 + r5.xyzw;
  r5.xyzw = r0.wwww * g_mViewProj._m20_m21_m22_m23 + r5.xyzw;
  r5.xyzw = g_mViewProj._m30_m31_m32_m33 + r5.xyzw;
*/

  r4.xyz = r1.zzz * v2.xyz + g_WorldViewPos.xyz;

// Correcting g_WorldViewPos here is not right:
//r4.xyz += mul(float4(stereo.x * -stereo.y, 0, 0, 0), ivp);

  r5.xyz = g_mViewProj._m10_m11_m13 * r4.yyy;
  r5.xyz = r4.xxx * g_mViewProj._m00_m01_m03 + r5.xyz;
  r5.xyz = r4.zzz * g_mViewProj._m20_m21_m23 + r5.xyz;
  r1.xyw = g_mViewProj._m30_m31_m33 + r5.xyz;

// Adjusts ray-trace start point, exactly countering the above v2 adjustment to
// start at screen depth, which is where we want an SSR ray trace to start:
r1.x += stereo.x * (r1.w - stereo.y);

  r5.xyz = float3(0.5,-0.5,0.5) * r1.xyw;
  r2.yz = r5.xy + r5.zz;
  r1.xy = PS_HPosScale.xy * r2.yz;

// Correct g_WorldViewPos here for accurate reflections, but not above since
// it messes up the ray trace start point:
r4.xyz += mul(float4(stereo.x * -stereo.y, 0, 0, 0), ivp);

  r0.yzw = r0.yzw * r2.www + r4.xyz;

  r5.xyzw = g_mViewProj._m10_m11_m12_m13 * r0.zzzz;
  r5.xyzw = r0.yyyy * g_mViewProj._m00_m01_m02_m03 + r5.xyzw;
  r5.xyzw = r0.wwww * g_mViewProj._m20_m21_m22_m23 + r5.xyzw;
  r5.xyzw = g_mViewProj._m30_m31_m32_m33 + r5.xyzw;

// Adjusts ray-trace end point:
r5.x += stereo.x * (r5.w - stereo.y);




  r0.y = r5.z / r5.w;
  r0.y = -g_PS_ProjRatio.x + r0.y;
  r5.z = g_PS_ProjRatio.y / r0.y;
  r0.yzw = float3(0.5,-0.5,0.5) * r5.xyw;
  r0.yz = r0.yz + r0.ww;
  r5.xy = PS_HPosScale.xy * r0.yz;
  r5.xyzw = r5.xyzw + -r1.xyzw;
  r0.x = r0.x * 28 + 4;
  r0.y = (int)r0.x;
  r0.x = trunc(r0.x);
  r0.z = 1 / r0.x;
  r0.x = 1.60000002 * r0.x;
  r0.x = r2.w / r0.x;
  r0.x = r0.x / PS_NearFarClipDist.y;
  r6.y = 0;
  r2.z = r0.z;
  r2.y = 0;
  r0.w = 0;
  while (true) {
    r2.w = cmp((int)r0.w >= (int)r0.y);
    if (r2.w != 0) break;
    r7.xyzw = r5.xyzw * r2.zzzz + r1.xyzw;
    r6.zw = r7.xy / r7.ww;
    r2.w = _tex3.SampleLevel(_tex3_s, r6.zw, 0).x;
    r2.w = r2.w + -r7.z;
    r2.w = cmp(abs(r2.w) < r0.x);
    if (r2.w != 0) {
      r2.y = r2.z;
      break;
    }
    r6.x = r2.z + r0.z;
    r0.w = (int)r0.w + 1;
    r2.yz = r6.yx;
  }
  r0.x = cmp(0 < r2.y);
  if (r0.x != 0) {
    r0.x = 0.0700000003 * PS_HPosScale.x;
    r0.yzw = r3.xyz * r2.yyy + r4.xyz;
    r1.xyz = g_mViewProjPrev._m10_m11_m13 * r0.zzz;
    r1.xyz = r0.yyy * g_mViewProjPrev._m00_m01_m03 + r1.xyz;
    r0.yzw = r0.www * g_mViewProjPrev._m20_m21_m23 + r1.xyz;
    r0.yzw = g_mViewProjPrev._m30_m31_m33 + r0.yzw;

// Affects the fade to black outline at the edge of the screen, leave untouched?
r0.y += stereo.x * (r0.w - stereo.y);
    
    r0.yz = saturate(r0.yz / r0.ww);
    r0.w = min(r0.y, r0.z);
    r1.x = max(r0.y, r0.z);
    r1.x = 1 + -r1.x;
    r0.w = min(r1.x, r0.w);
    r1.x = cmp(r0.x < r0.w);
    r0.x = r0.w / r0.x;
    r0.x = sqrt(r0.x);
    r0.x = r1.x ? 1 : r0.x;
    r0.yz = PS_HPosScale.zw * r0.yz;
    r0.w = _tex5.SampleLevel(_tex5_s, v1.xy, 0).x;
    r0.w = 100 * r0.w;
    r1.xyz = _tex4.SampleLevel(_tex4_s, r0.yz, 0).xyz;
    r0.yzw = min(r1.xyz, r0.www);
    r1.xyz = (int3)r0.yzw & int3(0,0,0);
    r1.xyz = cmp((int3)r1.xyz != int3(0,0,0));
    o0.xyz = r1.xyz ? r0.yzw : 0;
    o0.w = r0.x * r2.x;
  } else {
    o0.xyzw = float4(0,0,0,0);
  }
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.960.8229
//
//   using 3Dmigoto v1.3.10 on Sun Aug 26 11:17:41 2018
//
//
// Buffer Definitions:
//
// cbuffer PER_BATCH
// {
//
//   float4 g_WorldViewPos;             // Offset:    0 Size:    16
//   float4 g_ScreenSize;               // Offset:   16 Size:    16
//   row_major float4x4 g_mViewProjPrev;// Offset:   32 Size:    64
//   float4 PS_NearFarClipDist;         // Offset:   96 Size:    16
//   float4 PS_ScreenSize;              // Offset:  112 Size:    16 [unused]
//   row_major float4x4 g_mViewProj;    // Offset:  128 Size:    64
//   float4 PS_HPosScale;               // Offset:  192 Size:    16
//
// }
//
// cbuffer PER_FRAME
// {
//
//   float4 g_PS_ProjRatio;             // Offset: 3568 Size:    16
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// _tex0                             sampler      NA          NA    0        1
// _tex1                             sampler      NA          NA    1        1
// _tex2                             sampler      NA          NA    2        1
// _tex3                             sampler      NA          NA    3        1
// _tex4                             sampler      NA          NA    4        1
// _tex5                             sampler      NA          NA    5        1
// _tex0                             texture  float4          2d    0        1
// _tex1                             texture  float4          2d    1        1
// _tex2                             texture  float4          2d    2        1
// _tex3                             texture  float4          2d    3        1
// _tex4                             texture  float4          2d    4        1
// _tex5                             texture  float4          2d    5        1
// PER_BATCH                         cbuffer      NA          NA    0        1
// PER_FRAME                         cbuffer      NA          NA    2        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Position              0   xyzw        0      POS   float
// TEXCOORD                 0   xyzw        1     NONE   float   xy
// TEXCOORD                 1   xyzw        2     NONE   float   xyz
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target                0   xyzw        0   TARGET   float   xyzw
//
ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[13], immediateIndexed
dcl_constantbuffer cb2[224], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s1, mode_default
dcl_sampler s2, mode_default
dcl_sampler s3, mode_default
dcl_sampler s4, mode_default
dcl_sampler s5, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_resource_texture2d (float,float,float,float) t2
dcl_resource_texture2d (float,float,float,float) t3
dcl_resource_texture2d (float,float,float,float) t4
dcl_resource_texture2d (float,float,float,float) t5
dcl_input_ps linear v1.xy
dcl_input_ps linear v2.xyz
dcl_output o0.xyzw
dcl_temps 8
add r0.xy, v1.xyxx, cb0[1].zwzz
sample_indexable(texture2d)(float,float,float,float) r1.xyz, r0.xyxx, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r0.xyxx, t2.xyzw, s2
mad r0.yzw, r1.xxyz, l(0.000000, 2.000000, 2.000000, 2.000000), l(0.000000, -1.000000, -1.000000, -1.000000)
dp3 r1.x, r0.yzwy, r0.yzwy
rsq r1.x, r1.x
mul r0.yzw, r0.yyzw, r1.xxxx
sample_indexable(texture2d)(float,float,float,float) r1.z, v1.xyxx, t0.yzxw, s0
mul r2.xyz, r1.zzzz, v2.xyzx
dp3 r2.w, r2.xyzx, r2.xyzx
rsq r2.w, r2.w
mul r2.xyz, r2.wwww, r2.xyzx
mul r2.w, r1.z, cb0[6].y
mul r2.w, r2.w, l(1.500000)
dp3 r3.x, r2.xyzx, r0.yzwy
add r3.x, r3.x, r3.x
mad r0.yzw, r0.yyzw, -r3.xxxx, r2.xxyz
dp3 r3.x, r0.yzwy, r0.yzwy
rsq r3.x, r3.x
mul r0.yzw, r0.yyzw, r3.xxxx
mul r3.xyz, r2.wwww, r0.yzwy
dp3 r2.x, r2.xyzx, r3.xyzx
add_sat r2.x, r2.x, l(0.500000)
lt r2.y, r2.x, l(0.010000)
eq r2.z, r1.z, l(1.000000)
or r2.y, r2.z, r2.y
if_nz r2.y
  mov o0.xyzw, l(0,0,0,0)
  ret
endif
mad r4.xyz, r1.zzzz, v2.xyzx, cb0[0].xyzx
mul r5.xyz, r4.yyyy, cb0[9].xywx
mad r5.xyz, r4.xxxx, cb0[8].xywx, r5.xyzx
mad r5.xyz, r4.zzzz, cb0[10].xywx, r5.xyzx
add r1.xyw, r5.xyxz, cb0[11].xyxw
mul r5.xyz, r1.xywx, l(0.500000, -0.500000, 0.500000, 0.000000)
add r2.yz, r5.zzzz, r5.xxyx
mul r1.xy, r2.yzyy, cb0[12].xyxx
mad r0.yzw, r0.yyzw, r2.wwww, r4.xxyz
mul r5.xyzw, r0.zzzz, cb0[9].xyzw
mad r5.xyzw, r0.yyyy, cb0[8].xyzw, r5.xyzw
mad r5.xyzw, r0.wwww, cb0[10].xyzw, r5.xyzw
add r5.xyzw, r5.xyzw, cb0[11].xyzw
div r0.y, r5.z, r5.w
add r0.y, r0.y, -cb2[223].x
div r5.z, cb2[223].y, r0.y
mul r0.yzw, r5.xxyw, l(0.000000, 0.500000, -0.500000, 0.500000)
add r0.yz, r0.wwww, r0.yyzy
mul r5.xy, r0.yzyy, cb0[12].xyxx
add r5.xyzw, -r1.xyzw, r5.xyzw
mad r0.x, r0.x, l(28.000000), l(4.000000)
ftoi r0.y, r0.x
round_z r0.x, r0.x
div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.x
mul r0.x, r0.x, l(1.600000)
div r0.x, r2.w, r0.x
div r0.x, r0.x, cb0[6].y
mov r6.y, l(0)
mov r2.z, r0.z
mov r2.y, l(0)
mov r0.w, l(0)
loop
  ige r2.w, r0.w, r0.y
  breakc_nz r2.w
  mad r7.xyzw, r5.xyzw, r2.zzzz, r1.xyzw
  div r6.zw, r7.xxxy, r7.wwww
  sample_l_indexable(texture2d)(float,float,float,float) r2.w, r6.zwzz, t3.yzwx, s3, l(0.000000)
  add r2.w, -r7.z, r2.w
  lt r2.w, |r2.w|, r0.x
  if_nz r2.w
    mov r2.y, r2.z
    break
  endif
  add r6.x, r0.z, r2.z
  iadd r0.w, r0.w, l(1)
  mov r2.yz, r6.yyxy
endloop
lt r0.x, l(0.000000), r2.y
if_nz r0.x
  mul r0.x, cb0[12].x, l(0.070000)
  mad r0.yzw, r3.xxyz, r2.yyyy, r4.xxyz
  mul r1.xyz, r0.zzzz, cb0[3].xywx
  mad r1.xyz, r0.yyyy, cb0[2].xywx, r1.xyzx
  mad r0.yzw, r0.wwww, cb0[4].xxyw, r1.xxyz
  add r0.yzw, r0.yyzw, cb0[5].xxyw
  div_sat r0.yz, r0.yyzy, r0.wwww
  min r0.w, r0.z, r0.y
  max r1.x, r0.z, r0.y
  add r1.x, -r1.x, l(1.000000)
  min r0.w, r0.w, r1.x
  lt r1.x, r0.x, r0.w
  div r0.x, r0.w, r0.x
  sqrt r0.x, r0.x
  movc r0.x, r1.x, l(1.000000), r0.x
  mul r0.yz, r0.yyzy, cb0[12].zzwz
  sample_l_indexable(texture2d)(float,float,float,float) r0.w, v1.xyxx, t5.yzwx, s5, l(0.000000)
  mul r0.w, r0.w, l(100.000000)
  sample_l_indexable(texture2d)(float,float,float,float) r1.xyz, r0.yzyy, t4.xyzw, s4, l(0.000000)
  min r0.yzw, r0.wwww, r1.xxyz
  and r1.xyz, r0.yzwy, l(0x7f800000, 0x7f800000, 0x7f800000, 0)
  ine r1.xyz, r1.xyzx, l(0x7f800000, 0x7f800000, 0x7f800000, 0)
  and o0.xyz, r0.yzwy, r1.xyzx
  mul o0.w, r2.x, r0.x
else
  mov o0.xyzw, l(0,0,0,0)
endif
ret
// Approximately 107 instruction slots used

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
