// Water effect VS
// PS e11b07d27e0d1010

cbuffer _Globals : register(b0)
{
  float4x4 LocalToWorld : packoffset(c0);
  float LocalToWorldRotDeterminantFlip : packoffset(c4);
  float3x3 WorldToLocal : packoffset(c5);
  float4 SharedFogParameter0 : packoffset(c8);
  float4 SharedFogParameter1 : packoffset(c9);
  float4 SharedFogParameter2 : packoffset(c10);
  float4 SharedFogParameter3 : packoffset(c11);
  bool bUseExponentialHeightFog : packoffset(c12);
  float4 FogInScattering[4] : packoffset(c13);
  float4 FogMaxHeight : packoffset(c17);
  float4 FirstDensityFunctionParameters : packoffset(c18);
  float4 SecondDensityFunctionParameters : packoffset(c19);
  float StartDistance : packoffset(c20);
  float3 ApproxFogColor : packoffset(c20.y);
  float3 FogVolumeBoxMin : packoffset(c21);
  float3 FogVolumeBoxMax : packoffset(c22);
  bool bUseVolumetricFog : packoffset(c22.w);
  float4 VolumetricFogTextureScaleBias : packoffset(c23);
  float3 VolumetricFogDepthRemap : packoffset(c24);
  float2 VolumetricClampRect : packoffset(c25);
}

cbuffer VSOffsetConstants : register(b1)
{
  float4x4 ViewProjectionMatrix : packoffset(c0);
  float4x4 ViewProjectionMatrixNoTemporal : packoffset(c4);
  float4 CameraPositionVS : packoffset(c8);
  float4 PreViewTranslation : packoffset(c9);
}

SamplerState VolumetricFogInScatteringTextureSampler_s : register(s2);
SamplerState VolumetricFogOpaqueTransmittanceSampler_s : register(s3);
Texture2D<float4> VolumetricFogInScatteringTexture : register(t1);
Texture2D<float4> VolumetricFogOpaqueTransmittance : register(t2);


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


void main( 
  float4 v0 : POSITION0,
  float3 v1 : TANGENT0,
  float4 v2 : NORMAL0,
  float4 v3 : COLOR1,
  float2 v4 : TEXCOORD0,
  out float4 o0 : TEXCOORD10,
  out float4 o1 : TEXCOORD11,
  out float4 o2 : COLOR0,
  out float4 o3 : TEXCOORD0,
  out float4 o4 : TEXCOORD4,
  out float4 o5 : TEXCOORD5,
  out float4 o6 : SV_Position0)
{
  float4 r0,r1,r2,r3,r4,r5,r6;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xyzw = LocalToWorld._m01_m11_m21_m31 * v0.yyyy;
  r0.xyzw = LocalToWorld._m00_m10_m20_m30 * v0.xxxx + r0.xyzw;
  r0.xyzw = LocalToWorld._m02_m12_m22_m32 * v0.zzzz + r0.xyzw;
  r0.xyzw = LocalToWorld._m03_m13_m23_m33 * v0.wwww + r0.xyzw;
  r1.xyzw = ViewProjectionMatrix._m01_m11_m21_m31 * r0.yyyy;
  r1.xyzw = ViewProjectionMatrix._m00_m10_m20_m30 * r0.xxxx + r1.xyzw;
  r1.xyzw = ViewProjectionMatrix._m02_m12_m22_m32 * r0.zzzz + r1.xyzw;
  o6.xyzw = ViewProjectionMatrix._m03_m13_m23_m33 * r0.wwww + r1.xyzw;
  
  r1.xyzw = v2.xyzw * float4(2,2,2,2) + float4(-1,-1,-1,-1);
  r2.xyz = v1.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r3.xyz = r2.xyz * r1.yzx;
  r2.xyz = r1.xyz * r2.yzx + -r3.xyz;
  r2.xyz = r2.xyz * r1.www;
  r3.xyz = r2.xyz * r1.yzx;
  r3.xyz = r2.zxy * r1.zxy + -r3.xyz;
  r3.xyz = r3.xyz * r1.www;
  r3.yw = LocalToWorld._m01_m21 * r3.yy;
  r3.xy = LocalToWorld._m00_m20 * r3.xx + r3.yw;
  r3.xy = LocalToWorld._m02_m22 * r3.zz + r3.xy;
  r2.zw = LocalToWorld._m01_m21 * r2.zz;
  r2.yz = LocalToWorld._m00_m20 * r2.yy + r2.zw;
  r2.xy = LocalToWorld._m02_m22 * r2.xx + r2.yz;
  r2.zw = LocalToWorld._m01_m21 * r1.yy;
  r1.xy = LocalToWorld._m00_m20 * r1.xx + r2.zw;
  r1.xy = LocalToWorld._m02_m22 * r1.zz + r1.xy;
  o1.w = LocalToWorldRotDeterminantFlip * r1.w;
  if (bUseVolumetricFog != 0) {
    r4.xyz = ViewProjectionMatrix._m01_m11_m31 * r0.yyy;
    r4.xyz = ViewProjectionMatrix._m00_m10_m30 * r0.xxx + r4.xyz;
    r4.xyz = ViewProjectionMatrix._m02_m12_m32 * r0.zzz + r4.xyz;
    r4.xyz = ViewProjectionMatrix._m03_m13_m33 * r0.www + r4.xyz;
    r1.zw = r4.xy / r4.zz;
    r1.zw = r1.zw * VolumetricFogTextureScaleBias.xy + VolumetricFogTextureScaleBias.wz;
    r1.zw = min(VolumetricClampRect.xy, r1.zw);
    r4.xyz = VolumetricFogInScatteringTexture.SampleLevel(VolumetricFogInScatteringTextureSampler_s, r1.zw, 0).xyz;
    r1.z = VolumetricFogOpaqueTransmittance.SampleLevel(VolumetricFogOpaqueTransmittanceSampler_s, r1.zw, 0).y;
    o4.w = exp2(-r1.z);
    o4.xyz = r4.xyz;
  } else {
    if (bUseExponentialHeightFog != 0) {
      r4.xyz = -CameraPositionVS.xyz + r0.xyz;
      r1.z = dot(r4.xyz, r4.xyz);
      r1.w = sqrt(r1.z);
      r1.w = -SharedFogParameter0.w + r1.w;
      r1.w = max(0, r1.w);
      r1.w = SharedFogParameter0.x * r1.w;
      r2.z = cmp(0.00999999978 < abs(r4.z));
      r2.z = r2.z ? r4.z : 0.00999999978;
      r2.w = -SharedFogParameter0.y * r2.z;
      r2.w = exp2(r2.w);
      r2.w = 1 + -r2.w;
      r2.z = SharedFogParameter0.y * r2.z;
      r2.z = r2.w / r2.z;
      r1.w = r2.z * r1.w;
      r1.z = rsqrt(r1.z);
      r4.xyz = r4.xyz * r1.zzz;
      r1.z = dot(SharedFogParameter3.xyz, r4.xyz);
      r1.z = -r1.z * 0.499000013 + 0.5;
      r1.z = log2(r1.z);
      r1.z = SharedFogParameter0.z * r1.z;
      r1.z = exp2(r1.z);
      r4.xyz = -SharedFogParameter2.xyz + SharedFogParameter1.xyz;
      r4.xyz = r1.zzz * r4.xyz + SharedFogParameter2.xyz;
      r1.z = exp2(-r1.w);
      r1.z = min(1, r1.z);
      r1.z = max(SharedFogParameter1.w, r1.z);
      r1.w = 1 + -r1.z;
      o4.xyz = r4.xyz * r1.www;
      o4.w = r1.z;
    } else {
      r4.xyz = -CameraPositionVS.xyz + r0.xyz;
      r1.z = dot(r4.xyz, r4.xyz);
      r1.z = sqrt(r1.z);
      r5.xyzw = -CameraPositionVS.zzzz + SharedFogParameter3.xyzw;
      r1.w = cmp(0.00100000005 >= abs(r4.z));
      r1.w = r1.w ? 0.00100000005 : r4.z;
      r4.xyzw = saturate(r5.xyzw / r1.wwww);
      r5.xyzw = -CameraPositionVS.zzzz + FogMaxHeight.xyzw;
      r5.xyzw = saturate(r5.xyzw / r1.wwww);
      r6.xyzw = -SharedFogParameter2.xyzw + r1.zzzz;
      r6.xyzw = max(float4(0,0,0,0), r6.xyzw);
      r4.xyzw = r5.xyzw + -r4.xyzw;
      r4.xyzw = r6.xyzw * abs(r4.xyzw);
      r5.xyzw = cmp(r4.xyzw < SharedFogParameter1.xyzw);
      r4.xyzw = SharedFogParameter0.xyzw * r4.xyzw;
      r4.xyzw = exp2(r4.xyzw);
      r4.xyzw = r5.xyzw ? r4.xyzw : 0;
      r5.xyzw = float4(-1,-1,-1,-1) + r4.xyzw;
      r6.xyz = FogInScattering[0].xyz * r5.xxx;
      r6.w = r4.x;
      r6.xyzw = r6.xyzw * r4.yyyy;
      r6.xyz = r5.yyy * FogInScattering[1].xyz + r6.xyz;
      r6.xyzw = r6.xyzw * r4.zzzz;
      r6.xyz = r5.zzz * FogInScattering[2].xyz + r6.xyz;
      r4.xyzw = r6.xyzw * r4.wwww;
      o4.xyz = r5.www * FogInScattering[3].xyz + r4.xyz;
      o4.w = r4.w;
    }
  }
  o1.x = r3.y;
  o1.y = r2.y;
  o1.z = r1.y;
  o2.xyzw = v3.zyxw;
  o3.xy = v4.xy;
  o3.zw = float2(0,0);
  o5.xyzw = r0.xyzw;
  r3.z = r2.x;
  r3.w = r1.x;
  o0.xyz = r3.xzw;
  
  o6 = 0;
  
  
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Original ASM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.9200.20546
//
//
// Buffer Definitions: 
//
// cbuffer $Globals
// {
//
//   float4x4 LocalToWorld;             // Offset:    0 Size:    64
//   float LocalToWorldRotDeterminantFlip;// Offset:   64 Size:     4
//   float3x3 WorldToLocal;             // Offset:   80 Size:    44 [unused]
//   float4 SharedFogParameter0;        // Offset:  128 Size:    16
//   float4 SharedFogParameter1;        // Offset:  144 Size:    16
//   float4 SharedFogParameter2;        // Offset:  160 Size:    16
//   float4 SharedFogParameter3;        // Offset:  176 Size:    16
//   bool bUseExponentialHeightFog;     // Offset:  192 Size:     4
//   float4 FogInScattering[4];         // Offset:  208 Size:    64
//   float4 FogMaxHeight;               // Offset:  272 Size:    16
//   float4 FirstDensityFunctionParameters;// Offset:  288 Size:    16 [unused]
//   float4 SecondDensityFunctionParameters;// Offset:  304 Size:    16 [unused]
//   float StartDistance;               // Offset:  320 Size:     4 [unused]
//   float3 ApproxFogColor;             // Offset:  324 Size:    12 [unused]
//   float3 FogVolumeBoxMin;            // Offset:  336 Size:    12 [unused]
//   float3 FogVolumeBoxMax;            // Offset:  352 Size:    12 [unused]
//   bool bUseVolumetricFog;            // Offset:  364 Size:     4
//   float4 VolumetricFogTextureScaleBias;// Offset:  368 Size:    16
//   float3 VolumetricFogDepthRemap;    // Offset:  384 Size:    12 [unused]
//   float2 VolumetricClampRect;        // Offset:  400 Size:     8
//
// }
//
// cbuffer VSOffsetConstants
// {
//
//   float4x4 ViewProjectionMatrix;     // Offset:    0 Size:    64
//   float4x4 ViewProjectionMatrixNoTemporal;// Offset:   64 Size:    64 [unused]
//   float4 CameraPositionVS;           // Offset:  128 Size:    16
//   float4 PreViewTranslation;         // Offset:  144 Size:    16 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// VolumetricFogInScatteringTextureSampler    sampler      NA          NA    2        1
// VolumetricFogOpaqueTransmittanceSampler    sampler      NA          NA    3        1
// VolumetricFogInScatteringTexture    texture  float4          2d    1        1
// VolumetricFogOpaqueTransmittance    texture  float4          2d    2        1
// $Globals                          cbuffer      NA          NA    0        1
// VSOffsetConstants                 cbuffer      NA          NA    1        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION                 0   xyzw        0     NONE   float   xyzw
// TANGENT                  0   xyz         1     NONE   float   xyz 
// NORMAL                   0   xyzw        2     NONE   float   xyzw
// COLOR                    1   xyzw        3     NONE   float   xyzw
// TEXCOORD                 0   xy          4     NONE   float   xy  
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                10   xyz         0     NONE   float   xyz 
// TEXCOORD                11   xyzw        1     NONE   float   xyzw
// COLOR                    0   xyzw        2     NONE   float   xyzw
// TEXCOORD                 0   xyzw        3     NONE   float   xyzw
// TEXCOORD                 4   xyzw        4     NONE   float   xyzw
// TEXCOORD                 5   xyzw        5     NONE   float   xyzw
// SV_Position              0   xyzw        6      POS   float   xyzw
//
vs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[26], immediateIndexed
dcl_constantbuffer cb1[9], immediateIndexed
dcl_sampler s2, mode_default
dcl_sampler s3, mode_default
dcl_resource_texture2d (float,float,float,float) t1
dcl_resource_texture2d (float,float,float,float) t2
dcl_input v0.xyzw
dcl_input v1.xyz
dcl_input v2.xyzw
dcl_input v3.xyzw
dcl_input v4.xy
dcl_output o0.xyz
dcl_output o1.xyzw
dcl_output o2.xyzw
dcl_output o3.xyzw
dcl_output o4.xyzw
dcl_output o5.xyzw
dcl_output_siv o6.xyzw, position
dcl_temps 7
mul r0.xyzw, v0.yyyy, cb0[1].xyzw
mad r0.xyzw, cb0[0].xyzw, v0.xxxx, r0.xyzw
mad r0.xyzw, cb0[2].xyzw, v0.zzzz, r0.xyzw
mad r0.xyzw, cb0[3].xyzw, v0.wwww, r0.xyzw
mul r1.xyzw, r0.yyyy, cb1[1].xyzw
mad r1.xyzw, cb1[0].xyzw, r0.xxxx, r1.xyzw
mad r1.xyzw, cb1[2].xyzw, r0.zzzz, r1.xyzw
mad o6.xyzw, cb1[3].xyzw, r0.wwww, r1.xyzw
mad r1.xyzw, v2.xyzw, l(2.000000, 2.000000, 2.000000, 2.000000), l(-1.000000, -1.000000, -1.000000, -1.000000)
mad r2.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000)
mul r3.xyz, r1.yzxy, r2.xyzx
mad r2.xyz, r1.xyzx, r2.yzxy, -r3.xyzx
mul r2.xyz, r1.wwww, r2.xyzx
mul r3.xyz, r1.yzxy, r2.xyzx
mad r3.xyz, r2.zxyz, r1.zxyz, -r3.xyzx
mul r3.xyz, r1.wwww, r3.xyzx
mul r3.yw, r3.yyyy, cb0[1].xxxz
mad r3.xy, cb0[0].xzxx, r3.xxxx, r3.ywyy
mad r3.xy, cb0[2].xzxx, r3.zzzz, r3.xyxx
mul r2.zw, r2.zzzz, cb0[1].xxxz
mad r2.yz, cb0[0].xxzx, r2.yyyy, r2.zzwz
mad r2.xy, cb0[2].xzxx, r2.xxxx, r2.yzyy
mul r2.zw, r1.yyyy, cb0[1].xxxz
mad r1.xy, cb0[0].xzxx, r1.xxxx, r2.zwzz
mad r1.xy, cb0[2].xzxx, r1.zzzz, r1.xyxx
mul o1.w, r1.w, cb0[4].x
if_nz cb0[22].w
  mul r4.xyz, r0.yyyy, cb1[1].xywx
  mad r4.xyz, cb1[0].xywx, r0.xxxx, r4.xyzx
  mad r4.xyz, cb1[2].xywx, r0.zzzz, r4.xyzx
  mad r4.xyz, cb1[3].xywx, r0.wwww, r4.xyzx
  div r1.zw, r4.xxxy, r4.zzzz
  mad r1.zw, r1.zzzw, cb0[23].xxxy, cb0[23].wwwz
  min r1.zw, r1.zzzw, cb0[25].xxxy
  sample_l_indexable(texture2d)(float,float,float,float) r4.xyz, r1.zwzz, t1.xyzw, s2, l(0.000000)
  sample_l_indexable(texture2d)(float,float,float,float) r1.z, r1.zwzz, t2.xzyw, s3, l(0.000000)
  exp o4.w, -r1.z
  mov o4.xyz, r4.xyzx
else 
  if_nz cb0[12].x
    add r4.xyz, r0.xyzx, -cb1[8].xyzx
    dp3 r1.z, r4.xyzx, r4.xyzx
    sqrt r1.w, r1.z
    add r1.w, r1.w, -cb0[8].w
    max r1.w, r1.w, l(0.000000)
    mul r1.w, r1.w, cb0[8].x
    lt r2.z, l(0.010000), |r4.z|
    movc r2.z, r2.z, r4.z, l(0.010000)
    mul r2.w, r2.z, -cb0[8].y
    exp r2.w, r2.w
    add r2.w, -r2.w, l(1.000000)
    mul r2.z, r2.z, cb0[8].y
    div r2.z, r2.w, r2.z
    mul r1.w, r1.w, r2.z
    rsq r1.z, r1.z
    mul r4.xyz, r1.zzzz, r4.xyzx
    dp3 r1.z, cb0[11].xyzx, r4.xyzx
    mad r1.z, -r1.z, l(0.499000), l(0.500000)
    log r1.z, r1.z
    mul r1.z, r1.z, cb0[8].z
    exp r1.z, r1.z
    add r4.xyz, cb0[9].xyzx, -cb0[10].xyzx
    mad r4.xyz, r1.zzzz, r4.xyzx, cb0[10].xyzx
    exp r1.z, -r1.w
    min r1.z, r1.z, l(1.000000)
    max r1.z, r1.z, cb0[9].w
    add r1.w, -r1.z, l(1.000000)
    mul o4.xyz, r1.wwww, r4.xyzx
    mov o4.w, r1.z
  else 
    add r4.xyz, r0.xyzx, -cb1[8].xyzx
    dp3 r1.z, r4.xyzx, r4.xyzx
    sqrt r1.z, r1.z
    add r5.xyzw, cb0[11].xyzw, -cb1[8].zzzz
    ge r1.w, l(0.001000), |r4.z|
    movc r1.w, r1.w, l(0.001000), r4.z
    div_sat r4.xyzw, r5.xyzw, r1.wwww
    add r5.xyzw, cb0[17].xyzw, -cb1[8].zzzz
    div_sat r5.xyzw, r5.xyzw, r1.wwww
    add r6.xyzw, r1.zzzz, -cb0[10].xyzw
    max r6.xyzw, r6.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)
    add r4.xyzw, -r4.xyzw, r5.xyzw
    mul r4.xyzw, |r4.xyzw|, r6.xyzw
    lt r5.xyzw, r4.xyzw, cb0[9].xyzw
    mul r4.xyzw, r4.xyzw, cb0[8].xyzw
    exp r4.xyzw, r4.xyzw
    and r4.xyzw, r4.xyzw, r5.xyzw
    add r5.xyzw, r4.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)
    mul r6.xyz, r5.xxxx, cb0[13].xyzx
    mov r6.w, r4.x
    mul r6.xyzw, r4.yyyy, r6.xyzw
    mad r6.xyz, r5.yyyy, cb0[14].xyzx, r6.xyzx
    mul r6.xyzw, r4.zzzz, r6.xyzw
    mad r6.xyz, r5.zzzz, cb0[15].xyzx, r6.xyzx
    mul r4.xyzw, r4.wwww, r6.xyzw
    mad o4.xyz, r5.wwww, cb0[16].xyzx, r4.xyzx
    mov o4.w, r4.w
  endif 
endif 
mov o1.x, r3.y
mov o1.y, r2.y
mov o1.z, r1.y
mov o2.xyzw, v3.zyxw
mov o3.xy, v4.xyxx
mov o3.zw, l(0,0,0,0)
mov o5.xyzw, r0.xyzw
mov r3.z, r2.x
mov r3.w, r1.x
mov o0.xyz, r3.xzwx
ret 
// Approximately 110 instruction slots used

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


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D:\GAMES\Outlast 2\Binaries\Win64\ShaderCache\795820e39c13ce99-vs_replace.txt(53,14-15): warning X3578: Output value 'o0' is not completely initialized
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
