// Shadows Pattern2 -2

cbuffer _Globals : register(b0)
{
  float3 LightingChannelsAndModel : packoffset(c0);
  float4 SampleOffsets[2] : packoffset(c1);
  float3 ShadowBufferSizeAndSoftTransitionScale : packoffset(c3);
  float2 ShadowTexelSize : packoffset(c4);
  float4 ShadowClampRect : packoffset(c5);
  uint LightingChannelMask : packoffset(c6);
  float ShadowFadeFraction : packoffset(c6.y);
  float4x4 ScreenToShadowMatrix : packoffset(c7);
  float4x4 ScreenToWorldMatrix : packoffset(c11);
  float4 ShadowFilterScale : packoffset(c15);
  float4 ShadowFilterBias : packoffset(c16);
  float4 LightPositionAndInvRadius : packoffset(c17);
  float4x4 ShadowViewProjectionMatrices[6] : packoffset(c18);
  float ShadowmapResolution : packoffset(c42);
}

cbuffer PSOffsetConstants : register(b2)
{
  float4 ScreenPositionScaleBias : packoffset(c0);
  float4 MinZ_MaxZRatio : packoffset(c1);
  float NvStereoEnabled : packoffset(c2);
  float MetallicOverrideParameter : packoffset(c2.y);
  float4 DiffuseOverrideParameter : packoffset(c3);
  float4 SpecularOverrideParameter : packoffset(c4);
  float4 CameraPositionPS : packoffset(c5);
  float4 ScreenAndTexelSize : packoffset(c6);
  float4 ViewClampRect : packoffset(c7);
  float2 ProjectionInvScale : packoffset(c8);
  float4x4 ViewProjectionMatrixPS : packoffset(c9);
  float2 SceneColorExponentBias : packoffset(c13);
}

SamplerState SceneDepthTextureSampler_s : register(s2);
SamplerComparisonState ShadowDepthCubeComparisonSampler_s : register(s3);
Texture2D<float4> SceneDepthTexture : register(t0);
TextureCube<float4> ShadowDepthCubeTexture : register(t1);


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


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

  r0.xy = v0.xy / v0.ww;
  r0.zw = r0.xy * ScreenPositionScaleBias.xy + ScreenPositionScaleBias.wz;
  r0.z = SceneDepthTexture.SampleLevel(SceneDepthTextureSampler_s, r0.zw, 0).x;
  r0.z = max(0.00100000994, r0.z);
  r0.z = r0.z * MinZ_MaxZRatio.z + -MinZ_MaxZRatio.w;
  r0.z = 1 / r0.z;
  r0.xy = r0.xy * r0.zz;
  
  //Fix
  float4 stereo = StereoParams.Load(0);
  r0.x -= stereo.x * (r0.z - stereo.y);
  
  r1.xyz = ScreenToWorldMatrix._m01_m11_m21 * r0.yyy;
  r0.xyw = ScreenToWorldMatrix._m00_m10_m20 * r0.xxx + r1.xyz;
  r0.xyz = ScreenToWorldMatrix._m02_m12_m22 * r0.zzz + r0.xyw;
  r0.xyz = ScreenToWorldMatrix._m03_m13_m23 + r0.xyz;
  r1.xyz = LightPositionAndInvRadius.xyz + -r0.xyz;
  r0.w = dot(r1.xyz, r1.xyz);
  r0.w = sqrt(r0.w);
  r1.w = LightPositionAndInvRadius.w * r0.w;
  r1.w = cmp(r1.w < 1);
  if (r1.w != 0) {
    r2.xyz = r1.xyz / r0.www;
    r3.xyz = float3(0,0,1) * r2.yzx;
    r3.xyz = r2.xyz * float3(0,1,0) + -r3.xyz;
    r0.w = dot(r3.yz, r3.yz);
    r0.w = rsqrt(r0.w);
    r3.xyz = r3.xyz * r0.www;
    r4.xyz = r3.xyz * r2.yzx;
    r4.xyz = r3.zxy * r2.zxy + -r4.xyz;
    r0.w = 10.2399998 / ShadowmapResolution;
    r1.w = max(abs(r1.y), abs(r1.z));
    r1.w = max(abs(r1.x), r1.w);
    r5.xyz = cmp(r1.xyz == abs(r1.xyz));
    r1.xy = cmp(abs(r1.xy) == r1.ww);
    r5.xyz = r5.xyz ? float3(0,2.80259693e-045,5.60519386e-045) : float3(1,3,5);
    r1.y = r1.y ? r5.y : r5.z;
    r1.x = r1.x ? r5.x : r1.y;
    r1.x = (uint)r1.x << 2;
    r1.yz = ShadowViewProjectionMatrices[r1.x/4]._m21_m31 * r0.yy;
    r0.xy = ShadowViewProjectionMatrices[r1.x/4]._m20_m30 * r0.xx + r1.yz;
    r0.xy = ShadowViewProjectionMatrices[r1.x/4]._m22_m32 * r0.zz + r0.xy;
    r0.xy = ShadowViewProjectionMatrices[r1.x/4]._m23_m33 + r0.xy;
    r0.x = r0.x + -r0.w;
    r0.x = r0.x / r0.y;
    r1.xy = float2(-0.5,-0.5) * r3.yz;
    r1.z = -0;
    r0.yzw = r1.xyz / ShadowmapResolution;
    r0.yzw = r2.xyz + r0.yzw;
    r1.xyz = float3(-0.5,-0.5,-0.5) * r4.xyz;
    r1.xyz = r1.xyz / ShadowmapResolution;
    r5.xyz = r1.xyz + r0.yzw;
    r4.xyz = float3(0.5,0.5,0.5) * r4.xyz;
    r4.xyz = r4.xyz / ShadowmapResolution;
    r0.yzw = r4.xyz + r0.yzw;
    r3.xy = float2(0.5,0.5) * r3.yz;
    r3.z = 0;
    r3.xyz = r3.xyz / ShadowmapResolution;
    r2.xyz = r3.xyz + r2.xyz;
    r1.xyz = r2.xyz + r1.xyz;
    r2.xyz = r2.xyz + r4.xyz;
    r3.x = ShadowDepthCubeTexture.SampleCmpLevelZero(ShadowDepthCubeComparisonSampler_s, r5.xyz, r0.x).x;
    r3.y = ShadowDepthCubeTexture.SampleCmpLevelZero(ShadowDepthCubeComparisonSampler_s, r0.yzw, r0.x).x;
    r3.z = ShadowDepthCubeTexture.SampleCmpLevelZero(ShadowDepthCubeComparisonSampler_s, r1.xyz, r0.x).x;
    r3.w = ShadowDepthCubeTexture.SampleCmpLevelZero(ShadowDepthCubeComparisonSampler_s, r2.xyz, r0.x).x;
    r0.x = dot(r3.xyzw, float4(0.25,0.25,0.25,0.25));
  } else {
    r0.x = 1;
  }
  r0.x = r0.x * r0.x + -1;
  r0.x = ShadowFadeFraction * r0.x + 1;
  o0.xyzw = abs(r0.xxxx);
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Original ASM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.9200.20546
//
//
// Buffer Definitions: 
//
// cbuffer $Globals
// {
//
//   float3 LightingChannelsAndModel;   // Offset:    0 Size:    12 [unused]
//   float4 SampleOffsets[2];           // Offset:   16 Size:    32 [unused]
//   float3 ShadowBufferSizeAndSoftTransitionScale;// Offset:   48 Size:    12 [unused]
//   float2 ShadowTexelSize;            // Offset:   64 Size:     8 [unused]
//   float4 ShadowClampRect;            // Offset:   80 Size:    16 [unused]
//   uint LightingChannelMask;          // Offset:   96 Size:     4 [unused]
//   float ShadowFadeFraction;          // Offset:  100 Size:     4
//   float4x4 ScreenToShadowMatrix;     // Offset:  112 Size:    64 [unused]
//   float4x4 ScreenToWorldMatrix;      // Offset:  176 Size:    64
//   float4 ShadowFilterScale;          // Offset:  240 Size:    16 [unused]
//   float4 ShadowFilterBias;           // Offset:  256 Size:    16 [unused]
//   float4 LightPositionAndInvRadius;  // Offset:  272 Size:    16
//   float4x4 ShadowViewProjectionMatrices[6];// Offset:  288 Size:   384
//   float ShadowmapResolution;         // Offset:  672 Size:     4
//
// }
//
// cbuffer PSOffsetConstants
// {
//
//   float4 ScreenPositionScaleBias;    // Offset:    0 Size:    16
//   float4 MinZ_MaxZRatio;             // Offset:   16 Size:    16
//   float NvStereoEnabled;             // Offset:   32 Size:     4 [unused]
//   float MetallicOverrideParameter;   // Offset:   36 Size:     4 [unused]
//   float4 DiffuseOverrideParameter;   // Offset:   48 Size:    16 [unused]
//   float4 SpecularOverrideParameter;  // Offset:   64 Size:    16 [unused]
//   float4 CameraPositionPS;           // Offset:   80 Size:    16 [unused]
//   float4 ScreenAndTexelSize;         // Offset:   96 Size:    16 [unused]
//   float4 ViewClampRect;              // Offset:  112 Size:    16 [unused]
//   float2 ProjectionInvScale;         // Offset:  128 Size:     8 [unused]
//   float4x4 ViewProjectionMatrixPS;   // Offset:  144 Size:    64 [unused]
//   float2 SceneColorExponentBias;     // Offset:  208 Size:     8 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// SceneDepthTextureSampler          sampler      NA          NA    2        1
// ShadowDepthCubeComparisonSampler  sampler_c      NA          NA    3        1
// SceneDepthTexture                 texture  float4          2d    0        1
// ShadowDepthCubeTexture            texture  float4        cube    1        1
// $Globals                          cbuffer      NA          NA    0        1
// PSOffsetConstants                 cbuffer      NA          NA    2        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                 0   xyzw        0     NONE   float   xy w
//
//
// 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[43], dynamicIndexed
dcl_constantbuffer cb2[2], immediateIndexed
dcl_sampler s2, mode_default
dcl_sampler s3, mode_comparison
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texturecube (float,float,float,float) t1
dcl_input_ps linear v0.xyw
dcl_output o0.xyzw
dcl_temps 6
div r0.xy, v0.xyxx, v0.wwww
mad r0.zw, r0.xxxy, cb2[0].xxxy, cb2[0].wwwz
sample_l_indexable(texture2d)(float,float,float,float) r0.z, r0.zwzz, t0.yzxw, s2, l(0.000000)
max r0.z, r0.z, l(0.001000)
mad r0.z, r0.z, cb2[1].z, -cb2[1].w
div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.z
mul r0.xy, r0.zzzz, r0.xyxx
mul r1.xyz, r0.yyyy, cb0[12].xyzx
mad r0.xyw, cb0[11].xyxz, r0.xxxx, r1.xyxz
mad r0.xyz, cb0[13].xyzx, r0.zzzz, r0.xywx
add r0.xyz, r0.xyzx, cb0[14].xyzx
add r1.xyz, -r0.xyzx, cb0[17].xyzx
dp3 r0.w, r1.xyzx, r1.xyzx
sqrt r0.w, r0.w
mul r1.w, r0.w, cb0[17].w
lt r1.w, r1.w, l(1.000000)
if_nz r1.w
  div r2.xyz, r1.xyzx, r0.wwww
  mul r3.xyz, r2.yzxy, l(0.000000, 0.000000, 1.000000, 0.000000)
  mad r3.xyz, r2.xyzx, l(0.000000, 1.000000, 0.000000, 0.000000), -r3.xyzx
  dp2 r0.w, r3.yzyy, r3.yzyy
  rsq r0.w, r0.w
  mul r3.xyz, r0.wwww, r3.xyzx
  mul r4.xyz, r2.yzxy, r3.xyzx
  mad r4.xyz, r3.zxyz, r2.zxyz, -r4.xyzx
  div r0.w, l(10.240000), cb0[42].x
  max r1.w, |r1.z|, |r1.y|
  max r1.w, r1.w, |r1.x|
  eq r5.xyz, r1.xyzx, |r1.xyzx|
  eq r1.xy, |r1.xyxx|, r1.wwww
  movc r5.xyz, r5.xyzx, l(0,2,4,0), l(1,3,5,0)
  movc r1.y, r1.y, r5.y, r5.z
  movc r1.x, r1.x, r5.x, r1.y
  ishl r1.x, r1.x, l(2)
  mul r1.yz, r0.yyyy, cb0[r1.x + 19].zzwz
  mad r0.xy, cb0[r1.x + 18].zwzz, r0.xxxx, r1.yzyy
  mad r0.xy, cb0[r1.x + 20].zwzz, r0.zzzz, r0.xyxx
  add r0.xy, r0.xyxx, cb0[r1.x + 21].zwzz
  add r0.x, -r0.w, r0.x
  div r0.x, r0.x, r0.y
  mul r1.xy, r3.yzyy, l(-0.500000, -0.500000, 0.000000, 0.000000)
  mov r1.z, l(-0.000000)
  div r0.yzw, r1.xxyz, cb0[42].xxxx
  add r0.yzw, r0.yyzw, r2.xxyz
  mul r1.xyz, r4.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)
  div r1.xyz, r1.xyzx, cb0[42].xxxx
  add r5.xyz, r0.yzwy, r1.xyzx
  mul r4.xyz, r4.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000)
  div r4.xyz, r4.xyzx, cb0[42].xxxx
  add r0.yzw, r0.yyzw, r4.xxyz
  mul r3.xy, r3.yzyy, l(0.500000, 0.500000, 0.000000, 0.000000)
  mov r3.z, l(0)
  div r3.xyz, r3.xyzx, cb0[42].xxxx
  add r2.xyz, r2.xyzx, r3.xyzx
  add r1.xyz, r1.xyzx, r2.xyzx
  add r2.xyz, r4.xyzx, r2.xyzx
  sample_c_lz_indexable(texturecube)(float,float,float,float) r3.x, r5.xyzx, t1.xxxx, s3, r0.x
  sample_c_lz_indexable(texturecube)(float,float,float,float) r3.y, r0.yzwy, t1.xxxx, s3, r0.x
  sample_c_lz_indexable(texturecube)(float,float,float,float) r3.z, r1.xyzx, t1.xxxx, s3, r0.x
  sample_c_lz_indexable(texturecube)(float,float,float,float) r3.w, r2.xyzx, t1.xxxx, s3, r0.x
  dp4 r0.x, r3.xyzw, l(0.250000, 0.250000, 0.250000, 0.250000)
else 
  mov r0.x, l(1.000000)
endif 
mad r0.x, r0.x, r0.x, l(-1.000000)
mad r0.x, cb0[6].y, r0.x, l(1.000000)
mov o0.xyzw, |r0.xxxx|
ret 
// Approximately 68 instruction slots used

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