// Shadows

cbuffer _Globals : register(b0)
{
  float4 CamNearFarInvXY : packoffset(c0);
  float2 PixelSize : packoffset(c1);
  float4 DebugMaskValues : packoffset(c2);
  float4x4 LocalToWorld : packoffset(c3);
  float3 SpherePosition : packoffset(c7);
  float Radius : packoffset(c7.w);
}

cbuffer SceneWideParameterConstantBuffer : register(b1)
{
  float4x4 ViewProjection : packoffset(c0);
  float4x4 View : packoffset(c4);
  float4x4 Projection : packoffset(c8);
  float4x4 ViewInverse : packoffset(c12);
  float3 EyePosition : packoffset(c16);
  float cameraNearTimesFar : packoffset(c16.w);
  float3 GlobalAmbientColor : packoffset(c17);
  float cameraFarMinusNear : packoffset(c17.w);
  float2 cameraNearFar : packoffset(c18);
  float2 ViewportWidthHeight : packoffset(c18.z);
  float2 screenWidthHeightInv : packoffset(c19);
  float2 screenWidthHeight : packoffset(c19.z);
  float4x4 PrevViewProj : packoffset(c20);
  float4 Jitter : packoffset(c24);
  float2 InvProjXY : packoffset(c25);
  uint PointLightCount : packoffset(c25.z);
  uint SpotLightCount : packoffset(c25.w);
  uint FoliageSpheresCount : packoffset(c26);
  float time : packoffset(c26.y);
  float2 CubeFadeValues : packoffset(c26.z);
  float4 FogParameters0 : packoffset(c27);
  float4 FogParameters1 : packoffset(c28);
  float4 FogParameters2 : packoffset(c29);
  float4 FogParameters3 : packoffset(c30);
  float3 CubeSunDir : packoffset(c31);
  float padding0 : packoffset(c31.w);
  float3 CubeSunColor : packoffset(c32);
  float padding1 : packoffset(c32.w);
  float2 WindDirection : packoffset(c33);
}

SamplerState PointSampler_s : register(s0);
Texture2D<float> LinearDepthBuffer : register(t0);
Texture2D<float4> NormalBuffer : register(t1);


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


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

  r0.xy = float2(1,1) / ViewportWidthHeight.xy;
  r1.z = -v0.y * r0.y + 1;
  r1.xy = v0.xy * r0.xy;
  r0.xy = r1.xz * float2(2,2) + float2(-1,-1);
  r0.xy = InvProjXY.xy * r0.xy;
  r2 = LinearDepthBuffer.SampleLevel(PointSampler_s, r1.xy, 0);
  r1 = NormalBuffer.SampleLevel(PointSampler_s, r1.xy, 0);
  r0.zw = r1.xy * float2(2,2) + float2(-1,-1);
  r1.x = cameraNearFar.y * r2.x;
  r2.xy = r1.xx * r0.xy;
  r2.z = -r1.x;
  r2.w = 1;
  
float4 stereo = StereoParams.Load(0);
r2.x -= stereo.x*(-r2.z - stereo.y) * InvProjXY.x;

  r1.x = dot(r2.xyzw, ViewInverse._m00_m10_m20_m30);
  r1.y = dot(r2.xyzw, ViewInverse._m01_m11_m21_m31);
  r1.z = dot(r2.xyzw, ViewInverse._m02_m12_m22_m32);
  r1.xyz = SpherePosition.xyz + -r1.xyz;
  r0.x = dot(r1.xyz, r1.xyz);
  r0.y = rsqrt(r0.x);
  r1.xyz = r1.xyz * r0.yyy;
  r2.xy = cmp(r0.zw >= float2(0,0));
  r2.xy = r2.xy ? float2(1,1) : float2(-1,-1);
  r3.xyz = float3(1,1,1) + -abs(r0.zwz);
  r2.xy = r3.yz * r2.xy;
  r3.z = r3.x + -abs(r0.w);
  r0.y = cmp(r3.z < 0);
  r3.xy = r0.yy ? r2.xy : r0.zw;
  r0.y = dot(r3.xyz, r3.xyz);
  r0.y = rsqrt(r0.y);
  r0.yzw = r3.xyz * r0.yyy;
  r0.y = saturate(dot(r0.yzw, r1.xyz));
  r0.z = Radius * Radius;
  r0.x = max(r0.z, r0.x);
  r0.x = r0.z / r0.x;
  r0.x = r0.x * r0.y + -0.0199999996;
  r0.x = saturate(1.02040815 * r0.x);
  r0.x = sqrt(r0.x);
  o0.x = 1 + -r0.x;
  o0.y = 0;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.9200.20546
//
//   using 3Dmigoto v1.2.29 on Wed Feb 10 13:34:39 2016
//
//
// Buffer Definitions: 
//
// cbuffer $Globals
// {
//
//   float4 CamNearFarInvXY;            // Offset:    0 Size:    16 [unused]
//   float2 PixelSize;                  // Offset:   16 Size:     8 [unused]
//   float4 DebugMaskValues;            // Offset:   32 Size:    16 [unused]
//   float4x4 LocalToWorld;             // Offset:   48 Size:    64 [unused]
//   float3 SpherePosition;             // Offset:  112 Size:    12
//   float Radius;                      // Offset:  124 Size:     4
//
// }
//
// cbuffer SceneWideParameterConstantBuffer
// {
//
//   float4x4 ViewProjection;           // Offset:    0 Size:    64 [unused]
//   float4x4 View;                     // Offset:   64 Size:    64 [unused]
//   float4x4 Projection;               // Offset:  128 Size:    64 [unused]
//   float4x4 ViewInverse;              // Offset:  192 Size:    64
//   float3 EyePosition;                // Offset:  256 Size:    12 [unused]
//   float cameraNearTimesFar;          // Offset:  268 Size:     4 [unused]
//   float3 GlobalAmbientColor;         // Offset:  272 Size:    12 [unused]
//   float cameraFarMinusNear;          // Offset:  284 Size:     4 [unused]
//   float2 cameraNearFar;              // Offset:  288 Size:     8
//   float2 ViewportWidthHeight;        // Offset:  296 Size:     8
//   float2 screenWidthHeightInv;       // Offset:  304 Size:     8 [unused]
//   float2 screenWidthHeight;          // Offset:  312 Size:     8 [unused]
//   float4x4 PrevViewProj;             // Offset:  320 Size:    64 [unused]
//   float4 Jitter;                     // Offset:  384 Size:    16 [unused]
//   float2 InvProjXY;                  // Offset:  400 Size:     8
//   uint PointLightCount;              // Offset:  408 Size:     4 [unused]
//   uint SpotLightCount;               // Offset:  412 Size:     4 [unused]
//   uint FoliageSpheresCount;          // Offset:  416 Size:     4 [unused]
//   float time;                        // Offset:  420 Size:     4 [unused]
//   float2 CubeFadeValues;             // Offset:  424 Size:     8 [unused]
//   float4 FogParameters0;             // Offset:  432 Size:    16 [unused]
//   float4 FogParameters1;             // Offset:  448 Size:    16 [unused]
//   float4 FogParameters2;             // Offset:  464 Size:    16 [unused]
//   float4 FogParameters3;             // Offset:  480 Size:    16 [unused]
//   float3 CubeSunDir;                 // Offset:  496 Size:    12 [unused]
//   float padding0;                    // Offset:  508 Size:     4 [unused]
//   float3 CubeSunColor;               // Offset:  512 Size:    12 [unused]
//   float padding1;                    // Offset:  524 Size:     4 [unused]
//   float2 WindDirection;              // Offset:  528 Size:     8 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// PointSampler                      sampler      NA          NA    0        1
// LinearDepthBuffer                 texture   float          2d    0        1
// NormalBuffer                      texture  float4          2d    1        1
// $Globals                          cbuffer      NA          NA    0        1
// SceneWideParameterConstantBuffer    cbuffer      NA          NA    1        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_POSITION              0   xyzw        0      POS   float   xy  
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_TARGET                0   xy          0   TARGET   float   xy  
//
ps_4_0
dcl_constantbuffer cb0[8], immediateIndexed
dcl_constantbuffer cb1[26], immediateIndexed
dcl_sampler s0, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_input_ps_siv linear noperspective v0.xy, position
dcl_output o0.xy
dcl_temps 4
div r0.xy, l(1.000000, 1.000000, 1.000000, 1.000000), cb1[18].zwzz
mad r1.z, -v0.y, r0.y, l(1.000000)
mul r1.xy, r0.xyxx, v0.xyxx
mad r0.xy, r1.xzxx, l(2.000000, 2.000000, 0.000000, 0.000000), l(-1.000000, -1.000000, 0.000000, 0.000000)
mul r0.xy, r0.xyxx, cb1[25].xyxx
sample_l r2.xyzw, r1.xyxx, t0.xyzw, s0, l(0.000000)
sample_l r1.xyzw, r1.xyxx, t1.xyzw, s0, l(0.000000)
mad r0.zw, r1.xxxy, l(0.000000, 0.000000, 2.000000, 2.000000), l(0.000000, 0.000000, -1.000000, -1.000000)
mul r1.x, r2.x, cb1[18].y
mul r2.xy, r0.xyxx, r1.xxxx
mov r2.z, -r1.x
mov r2.w, l(1.000000)
dp4 r1.x, r2.xyzw, cb1[12].xyzw
dp4 r1.y, r2.xyzw, cb1[13].xyzw
dp4 r1.z, r2.xyzw, cb1[14].xyzw
add r1.xyz, -r1.xyzx, cb0[7].xyzx
dp3 r0.x, r1.xyzx, r1.xyzx
rsq r0.y, r0.x
mul r1.xyz, r0.yyyy, r1.xyzx
ge r2.xy, r0.zwzz, l(0.000000, 0.000000, 0.000000, 0.000000)
movc r2.xy, r2.xyxx, l(1.000000,1.000000,0,0), l(-1.000000,-1.000000,0,0)
add r3.xyz, -|r0.zwzz|, l(1.000000, 1.000000, 1.000000, 0.000000)
mul r2.xy, r2.xyxx, r3.yzyy
add r3.z, -|r0.w|, r3.x
lt r0.y, r3.z, l(0.000000)
movc r3.xy, r0.yyyy, r2.xyxx, r0.zwzz
dp3 r0.y, r3.xyzx, r3.xyzx
rsq r0.y, r0.y
mul r0.yzw, r0.yyyy, r3.xxyz
dp3_sat r0.y, r0.yzwy, r1.xyzx
mul r0.z, cb0[7].w, cb0[7].w
max r0.x, r0.x, r0.z
div r0.x, r0.z, r0.x
mad r0.x, r0.x, r0.y, l(-0.020000)
mul_sat r0.x, r0.x, l(1.02040815)
sqrt r0.x, r0.x
add o0.x, -r0.x, l(1.000000)
mov o0.y, l(0)
ret 
// Approximately 39 instruction slots used

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