//AoE2
// ---- Created with 3Dmigoto v1.2.56 on Wed May 31 17:48:25 2017

cbuffer _Globals : register(b0)
{
  float4 VPtoRTScaleBias : packoffset(c0);
  float4 SightProperties : packoffset(c1);
  float2 WorldPositionOffset : packoffset(c2);
  float2 AiGridWorldPositionOffset : packoffset(c2.z);
  float3 SightSneakTextureInfo : packoffset(c3);
  float3 HeightTextureInfo : packoffset(c4);
  float2 Weights : packoffset(c5);
}

cbuffer PerView : register(b12)
{
  row_major float4x4 global_View : packoffset(c0);
  row_major float4x4 global_Projection : packoffset(c4);
  row_major float4x4 global_ViewProjection : packoffset(c8);
  float4 global_ViewPos : packoffset(c12);
  float4 global_ViewInfo : packoffset(c13);
  float4 global_ScaleAndBias : packoffset(c14);
}

SamplerState LinearClampSampler_s : register(s0);
SamplerState PointWrapSampler_s : register(s1);
Texture2D<float4> Base : register(t0);
Texture2D<float4> LinearDepth : register(t1);
Texture2D<float4> Base4 : register(t2);
Texture2D<float4> Base5 : register(t3);
Texture2D<float4> Base7 : register(t4);


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

#include <ShaderFixes/matrix.hlsl>

void main( 
  float4 v0 : SV_Position0,
  float2 v1 : TexCoord0,
  float3 v2 : TexCoord1,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xyz = Base.Sample(LinearClampSampler_s, v1.xy).xyz;
  r1.z = LinearDepth.Sample(PointWrapSampler_s, v1.xy).x;
  r0.w = cmp(r1.z < 1);
  if (r0.w != 0) {
    r2.xy = -VPtoRTScaleBias.zw * global_ViewInfo.zw + v0.xy;
    r2.z = global_ViewInfo.w + -r2.y;
    r2.xy = r2.xz / global_ViewInfo.zw;
    r1.xy = r2.xy * float2(2,2) + float2(-1,-1);
    r1.xyz = v2.xyz * r1.xyz;
    r2.xyz = global_View._m10_m11_m12 * r1.yyy;
    r1.xyw = r1.xxx * global_View._m00_m01_m02 + r2.xyz;
    r1.xyz = r1.zzz * global_View._m20_m21_m22 + r1.xyw;
    r1.xyz = global_ViewPos.xyz + r1.xyz;
	
//CORRECT WORLD COORD
r1.w = 1.0;
float4 s = StereoParams.Load(0);
float4 r25;
r25 = mul(global_ViewProjection, r1);  
r25.x -= s.x * (r25.w - s.y); 
r1 = mul(inverse(global_ViewProjection), r25); 		
	
    // r2.xyzw = -WorldPositionOffset.xyzw + r1.xzxz;
r2.xy = -WorldPositionOffset.xy + r1.xz;
r2.zw = -AiGridWorldPositionOffset.xy + r1.xz;	
    r2.xy = r2.xy / SightSneakTextureInfo.zz;
    r2.xy = r2.xy / SightSneakTextureInfo.xy;
    r2.zw = r2.zw / HeightTextureInfo.zz;
    r2.zw = r2.zw / HeightTextureInfo.xy;
    r2.zw = Base7.SampleLevel(LinearClampSampler_s, r2.zw, 0).xy;
    r0.w = r2.z + -r1.y;
    r0.w = min(1, abs(r0.w));
    r0.w = 1.42857146 * r0.w;
    r0.w = min(1, r0.w);
    r1.y = r0.w * -2 + 3;
    r0.w = r0.w * r0.w;
    r0.w = -r1.y * r0.w + 1;
    r1.yw = cmp(float2(0,0) < Weights.xy);
    if (r1.y != 0) {
      r3.xyz = Base4.SampleLevel(LinearClampSampler_s, r2.xy, 0).xyw;
      r3.xy = ceil(r3.yx);
      r1.y = r3.x + -r3.y;
      r2.z = saturate(dot(r0.xyz, float3(0.300000012,0.589999974,0.109999999)));
      r2.z = log2(r2.z);
      r2.z = 0.699999988 * r2.z;
      r2.z = exp2(r2.z);
      r3.x = 1 + -SightProperties.w;
      r4.xyz = r2.zzz * float3(0.699999988,0.699999988,0.699999988) + -r0.xyz;
      r3.xyw = r3.xxx * r4.xyz + r0.xyz;
      r4.xyzw = float4(1.5,1.5,1.5,1.5) * r1.xzxz;
      r4.xyzw = frac(r4.xyzw);
      r1.xz = cmp(float2(0.5,0.5) >= r4.zw);
      r1.xz = r1.xz ? float2(1,1) : 0;
      r4.xyzw = cmp(r4.xyzw >= float4(0.25,0.25,0.75,0.75));
      r4.xy = r4.xy ? float2(1,1) : 0;
      r1.xz = r4.xy * r1.xz;
      r1.x = r1.x + r1.z;
      r4.xy = r4.zw ? float2(-1,-1) : float2(-0,-0);
      r1.x = r4.x + r1.x;
      r1.x = saturate(r1.x + r4.y);
      r1.z = SightProperties.w * 0.225000009 + 0.075000003;
      r4.xyz = SightProperties.xyz + -r0.xyz;
      r4.xyz = r1.zzz * r4.xyz + r0.xyz;
      r5.xyz = float3(0.400000006,0.800000012,0.200000003) + -r0.xyz;
      r5.xyz = r5.xyz * float3(0.400000006,0.400000006,0.400000006) + r0.xyz;
      r1.x = r1.y * r1.x;
      r5.xyz = r5.xyz + -r4.xyz;
      r1.xyz = r1.xxx * r5.xyz + r4.xyz;
      r1.xyz = r1.xyz + -r0.xyz;
      r1.xyz = r0.www * r1.xyz + r0.xyz;
      r2.z = cmp(r3.z >= 0.430000007);
      r2.z = r2.z ? 1.000000 : 0;
      r4.x = cmp(0.569999993 >= r3.z);
      r4.x = r4.x ? 1.000000 : 0;
      r2.z = r4.x * r2.z;
      r4.x = saturate(2.32558131 * r3.z);
      r4.y = r4.x * -2 + 3;
      r4.x = r4.x * r4.x;
      r4.x = r4.y * r4.x;
      r4.y = -0.670000017 + r3.z;
      r4.y = saturate(-9.99999809 * r4.y);
      r4.z = r4.y * -2 + 3;
      r4.y = r4.y * r4.y;
      r4.y = r4.z * r4.y;
      r4.x = saturate(r4.x * r4.y + -r2.z);
      r1.xyz = r1.xyz + -r3.xyw;
      r1.xyz = r3.zzz * r1.xyz + r3.xyw;
      r3.x = r4.x * r0.w;
      r3.x = 0.5 * r3.x;
      r1.xyz = r3.xxx * -r1.xyz + r1.xyz;
      r2.z = r2.z * r0.w;
      r2.z = 0.699999988 * r2.z;
      r3.xyz = SightProperties.xyz + -r1.xyz;
      r1.xyz = r2.zzz * r3.xyz + r1.xyz;
      r1.xyz = r1.xyz + -r0.xyz;
      r0.xyz = Weights.xxx * r1.xyz + r0.xyz;
    }
    if (r1.w != 0) {
      r1.x = Base5.SampleLevel(LinearClampSampler_s, r2.xy, 0).x;
      r1.y = r1.x * r2.w;
      r2.xyz = float3(0.800000012,0.100000001,0.100000001) + -r0.xyz;
      r2.xyz = r2.xyz * r0.www;
      r2.xyz = r2.xyz * r1.yyy;
      r1.z = cmp(r1.y >= 0.430000007);
      r1.w = cmp(0.569999993 >= r1.y);
      r1.zw = r1.zw ? float2(1,1) : 0;
      r1.z = r1.z * r1.w;
      r1.y = saturate(2.32558131 * r1.y);
      r1.w = r1.y * -2 + 3;
      r1.y = r1.y * r1.y;
      r1.y = r1.w * r1.y;
      r1.x = r1.x * r2.w + -0.670000017;
      r1.x = saturate(-9.99999809 * r1.x);
      r1.w = r1.x * -2 + 3;
      r1.x = r1.x * r1.x;
      r1.x = r1.w * r1.x;
      r1.x = saturate(r1.y * r1.x + -r1.z);
      r2.xyz = r2.xyz * float3(0.200000003,0.200000003,0.200000003) + r0.xyz;
      r1.x = r1.x * r0.w;
      r1.x = 0.5 * r1.x;
      r1.xyw = r1.xxx * -r2.xyz + r2.xyz;
      r0.w = r1.z * r0.w;
      r0.w = 0.699999988 * r0.w;
      r2.xyz = float3(0.800000012,0.100000001,0.100000001) + -r1.xyw;
      r1.xyz = r0.www * r2.xyz + r1.xyw;
      r1.xyz = r1.xyz + -r0.xyz;
      r0.xyz = Weights.yyy * r1.xyz + r0.xyz;
    }
  }
  o0.xyz = r0.xyz;
  o0.w = 1;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\d6c5a24e3c021685-ps_replace.txt(62,16-39): error X3018: invalid subscript 'xyzw'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
