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

cbuffer _Globals : register(b0)
{
  float2 Params : packoffset(c0);
  float4 PositionTransition : packoffset(c1);
  float4 SizeRadius : packoffset(c2);
  float4 ProbeProperties : packoffset(c3);
  float4x4 InvWorldTransform : packoffset(c4);
  float FadeValue : packoffset(c8);
  float4 VPtoRTScaleBias : packoffset(c9);
  row_major float3x3 invViewMatrix : packoffset(c10);
}

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 LinearSampler_s : register(s0);
Texture2D<float4> Exposure : register(t0);
TextureCube<float4> IBL_Diffuse : register(t1);
TextureCube<float4> IBL_Specular : register(t2);
Texture2D<float4> LUT : register(t3);
Texture2D<float4> LinearDepth : register(t4);
Texture2D<float4> GBuffer1 : register(t5);
Texture2D<float4> GBuffer2 : register(t6);
Texture2D<float4> GBuffer3 : register(t7);


// 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,
  out float4 o1 : SV_Target1)
{
  float4 r0,r1,r2,r3,r4,r5,r6;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v0.xy;
  r0.zw = float2(0,0);
  r1.xy = GBuffer1.Load(r0.xyw).xy;
  r2.xyzw = GBuffer3.Load(r0.xyw).xyzw;
  r1.z = LinearDepth.Load(r0.xyw).x;
  r3.xy = r1.xy * float2(3.55539989,3.55539989) + float2(-1.77769995,-1.77769995);
  r3.z = 1;
  r1.x = dot(r3.xyz, r3.xyz);
  r1.x = 2 / r1.x;
  r3.xy = r1.xx * r3.xy;
  r3.z = -1 + r1.x;
  r1.x = 255 * r2.w;
  r1.x = round(r1.x);
  r1.x = (uint)r1.x;
  if (2 == 0) r1.x = 0; else if (2+1 < 32) {   r1.x = (uint)r1.x << (32-(2 + 1)); r1.x = (uint)r1.x >> (32-2);  } else r1.x = (uint)r1.x >> 1;
  r1.y = cmp(r1.z != 1.000000);
  r1.x = cmp((int)r1.x != 1);
  r1.x = r1.x ? r1.y : 0;
  r4.z = max(0.0900000036, r2.x);
  r5.x = dot(invViewMatrix._m00_m01_m02, r3.xyz);
  r5.y = dot(invViewMatrix._m10_m11_m12, r3.xyz);
  r5.z = dot(invViewMatrix._m20_m21_m22, r3.xyz);
  r1.yzw = r1.zzz * v2.xyz + global_ViewPos.xyz;
  
//r6 is a world coord.  Needs correcting in Proj space
//CORRECT WORLD COORD
r6.xyz = r1.yzw;
r6.w = 1.0;
float4 s = StereoParams.Load(0);
float4 r25;
r25 = mul(global_ViewProjection, r6);  
r25.x -= s.x * (r25.w - s.y); 
r6 = mul(inverse(global_ViewProjection), r25); 
r1.yzw = r6.xyz;
  
  r1.yzw = global_ViewPos.xyz + -r1.yzw;
  r2.x = dot(r1.yzw, r1.yzw);
  r2.x = rsqrt(r2.x);
  r1.yzw = r2.xxx * r1.yzw;
  r4.y = dot(r5.xyz, r1.yzw);
  r2.x = LUT.Sample(LinearSampler_s, r4.yz).z;
  r3.xyz = IBL_Diffuse.Sample(LinearSampler_s, r5.xyz).xyz;
  r4.x = max(0.001953125, r4.y);
  r4.xy = LUT.Sample(LinearSampler_s, r4.xz).xy;
  if (r1.x != 0) {
    r0.xyz = GBuffer2.Load(r0.xyz).xyz;
    r0.w = r2.y * r2.y;
    r0.w = 0.159999996 * r0.w;
    r1.x = 1 + -r2.z;
    r6.xyz = r1.xxx * r0.xyz;
    r2.xyw = r3.xyz * r2.xxx;
    r2.xyw = r6.xyz * r2.xyw;
    r2.xyw = ProbeProperties.zzz * r2.xyw;
    r0.xyz = r2.zzz * r0.xyz;
    r0.xyz = r1.xxx * r0.www + r0.xyz;
    r0.w = dot(-r1.yzw, r5.xyz);
    r0.w = r0.w + r0.w;
    r1.xyz = r5.xyz * -r0.www + -r1.yzw;
    r0.w = ProbeProperties.y * r4.z;
    r1.xyz = IBL_Specular.SampleLevel(LinearSampler_s, r1.xyz, r0.w).xyz;
    r0.xyz = r0.xyz * r4.xxx + r4.yyy;
    r0.xyz = r1.xyz * r0.xyz;
    r0.xyz = ProbeProperties.zzz * r0.xyz;
    r1.xyz = float3(100,100,100) * r2.xyw;
    r0.xyz = float3(100,100,100) * r0.xyz;
    r0.w = Exposure.Load(float4(0,0,0,0)).x;
    r1.w = cmp(r0.w == 0.000000);
    r0.w = r1.w ? 0.00999999978 : r0.w;
    r1.xyz = r1.xyz * r0.www;
    r0.xyz = r0.xyz * r0.www;
  } else {
    r0.xyz = float3(0,0,0);
    r1.xyz = float3(0,0,0);
  }
  o0.xyz = r0.xyz;
  o0.w = 0;
  o1.xyz = r1.xyz;
  o1.w = 0;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HLSL errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:\SteamLibrary\SteamApps\common\Divinity Original Sin 2\bin\ShaderCache\98e7b432e575a55d-ps_replace.txt(106,12-41): warning X3206: 'Load': implicit truncation of vector type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
