// Lensflares with the camera

cbuffer _Globals : register(b0)
{
  float4x4 LocalToWorld : packoffset(c0);
  float4 PrimitiveDynamicData : packoffset(c4);
  float OcclusionPercentage : packoffset(c5);
  float4 CameraRight : packoffset(c6);
  float4 CameraUp : packoffset(c7);
  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 VolumetricFogTextureSampler_s : register(s2);
Texture3D<float4> VolumetricFogTexture : register(t1);


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


void main( 
  float4 v0 : POSITION0,
  float4 v1 : TANGENT0,
  float2 v2 : BLENDWEIGHT0,
  float4 v3 : TEXCOORD0,
  float4 v4 : TEXCOORD1,
  float4 v5 : TEXCOORD2,
  out float4 o0 : TEXCOORD10,
  out float4 o1 : TEXCOORD11,
  out float4 o2 : TEXCOORD0,
  out float4 o3 : TEXCOORD1,
  out float4 o4 : TEXCOORD2,
  out float4 o5 : TEXCOORD4,
  out float4 o6 : TEXCOORD5,
  out float4 o7 : 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;
  sincos(v2.x, r1.x, r2.x);
  r3.xyzw = CameraRight.xyzw * r1.xxxx;
  r3.xyzw = -r2.xxxx * CameraUp.xyzw + r3.xyzw;
  r2.xyzw = CameraRight.xyzw * r2.xxxx;
  r1.xyzw = r1.xxxx * CameraUp.xyzw + r2.xyzw;
  r2.xy = v1.xy * v1.zw;
  r2.zw = float2(-0.5,-0.5) + v3.xy;
  r2.xy = r2.xy * r2.zw;
  r0.xyzw = r2.xxxx * r3.xyzw + r0.xyzw;
  r0.xyzw = r2.yyyy * r1.xyzw + r0.xyzw;
  r2.xyzw = ViewProjectionMatrix._m01_m11_m21_m31 * r0.yyyy;
  r2.xyzw = ViewProjectionMatrix._m00_m10_m20_m30 * r0.xxxx + r2.xyzw;
  r2.xyzw = ViewProjectionMatrix._m02_m12_m22_m32 * r0.zzzz + r2.xyzw;
  
  //Fix
  float4 stereo = StereoParams.Load(0);
  r2.x -= stereo.x * (r2.w /4 - stereo.y); 
  
  o7.xyzw = ViewProjectionMatrix._m03_m13_m23_m33 * r0.wwww + r2.xyzw;
  
  
  
  r2.xyz = r3.xyz * r1.zxy;
  r2.xyz = r3.zxy * r1.xyz + -r2.xyz;
  r1.w = dot(r2.xyz, r2.xyz);
  r1.w = rsqrt(r1.w);
  r2.xyz = r2.xyz * r1.www;
  r4.xy = LocalToWorld._m01_m21 * r3.yy;
  r4.xy = LocalToWorld._m00_m20 * r3.xx + r4.xy;
  r4.xy = LocalToWorld._m02_m22 * r3.zz + r4.xy;
  r5.xy = LocalToWorld._m01_m21 * r1.yy;
  r5.xy = LocalToWorld._m00_m20 * r1.xx + r5.xy;
  r5.xy = LocalToWorld._m02_m22 * r1.zz + r5.xy;
  r5.zw = LocalToWorld._m01_m21 * r2.xx;
  r5.zw = LocalToWorld._m00_m20 * r2.zz + r5.zw;
  r5.zw = LocalToWorld._m02_m22 * r2.yy + r5.zw;
  r6.xyz = r2.xyz * r1.zxy;
  r1.xyz = r1.yzx * r2.yzx + -r6.xyz;
  r1.x = dot(r1.xyz, r3.xyz);
  r1.y = cmp(0 < r1.x);
  r1.x = cmp(r1.x < 0);
  r1.x = (int)-r1.y + (int)r1.x;
  o1.w = (int)r1.x;
  if (bUseVolumetricFog != 0) {
    r1.xyz = ViewProjectionMatrix._m01_m11_m31 * r0.yyy;
    r1.xyz = ViewProjectionMatrix._m00_m10_m30 * r0.xxx + r1.xyz;
    r1.xyz = ViewProjectionMatrix._m02_m12_m32 * r0.zzz + r1.xyz;
    r1.xyz = ViewProjectionMatrix._m03_m13_m33 * r0.www + r1.xyz;
    r1.xy = r1.xy / r1.zz;
    r1.xy = r1.xy * VolumetricFogTextureScaleBias.xy + VolumetricFogTextureScaleBias.wz;
    r1.z = VolumetricFogDepthRemap.z + r1.z;
    r1.z = sqrt(r1.z);
    r2.z = VolumetricFogDepthRemap.y * r1.z + VolumetricFogDepthRemap.x;
    r2.xy = min(VolumetricClampRect.xy, r1.xy);
    o5.xyzw = VolumetricFogTexture.SampleLevel(VolumetricFogTextureSampler_s, r2.xyz, 0).xyzw;
  } else {
    if (bUseExponentialHeightFog != 0) {
      r1.xyz = -CameraPositionVS.xyz + r0.xyz;
      r1.w = dot(r1.xyz, r1.xyz);
      r2.x = sqrt(r1.w);
      r2.x = -SharedFogParameter0.w + r2.x;
      r2.x = max(0, r2.x);
      r2.y = cmp(0.00999999978 < abs(r1.z));
      r2.y = r2.y ? r1.z : 0.00999999978;
      r2.z = -SharedFogParameter0.y * r2.y;
      r2.z = exp2(r2.z);
      r2.z = 1 + -r2.z;
      r2.xy = SharedFogParameter0.xy * r2.xy;
      r2.y = r2.z / r2.y;
      r2.x = r2.x * r2.y;
      r1.w = rsqrt(r1.w);
      r1.xyz = r1.xyz * r1.www;
      r1.x = dot(SharedFogParameter3.xyz, r1.xyz);
      r1.x = -r1.x * 0.499000013 + 0.5;
      r1.x = log2(r1.x);
      r1.x = SharedFogParameter0.z * r1.x;
      r1.x = exp2(r1.x);
      r1.yzw = -SharedFogParameter2.xyz + SharedFogParameter1.xyz;
      r1.xyz = r1.xxx * r1.yzw + SharedFogParameter2.xyz;
      r1.w = exp2(-r2.x);
      r1.w = min(1, r1.w);
      r1.w = max(SharedFogParameter1.w, r1.w);
      r2.x = 1 + -r1.w;
      o5.xyz = r2.xxx * r1.xyz;
      o5.w = r1.w;
    } else {
      r1.xyz = -CameraPositionVS.xyz + r0.xyz;
      r1.x = dot(r1.xyz, r1.xyz);
      r1.x = sqrt(r1.x);
      r2.xyzw = -CameraPositionVS.zzzz + SharedFogParameter3.xyzw;
      r1.y = cmp(0.00100000005 >= abs(r1.z));
      r1.y = r1.y ? 0.00100000005 : r1.z;
      r2.xyzw = saturate(r2.xyzw / r1.yyyy);
      r3.xyzw = -CameraPositionVS.zzzz + FogMaxHeight.xyzw;
      r3.xyzw = saturate(r3.xyzw / r1.yyyy);
      r1.xyzw = -SharedFogParameter2.xyzw + r1.xxxx;
      r1.xyzw = max(float4(0,0,0,0), r1.xyzw);
      r2.xyzw = r3.xyzw + -r2.xyzw;
      r1.xyzw = abs(r2.xyzw) * r1.xyzw;
      r2.xyzw = cmp(r1.xyzw < SharedFogParameter1.xyzw);
      r1.xyzw = SharedFogParameter0.xyzw * r1.xyzw;
      r1.xyzw = exp2(r1.xyzw);
      r1.xyzw = r2.xyzw ? r1.xyzw : 0;
      r2.xyzw = float4(-1,-1,-1,-1) + r1.xyzw;
      r3.xyz = FogInScattering[0].xyz * r2.xxx;
      r3.w = r1.x;
      r3.xyzw = r3.xyzw * r1.yyyy;
      r3.xyz = r2.yyy * FogInScattering[1].xyz + r3.xyz;
      r3.xyzw = r3.xyzw * r1.zzzz;
      r3.xyz = r2.zzz * FogInScattering[2].xyz + r3.xyz;
      r1.xyzw = r3.xyzw * r1.wwww;
      o5.xyz = r2.www * FogInScattering[3].xyz + r1.xyz;
      o5.w = r1.w;
    }
  }
  o1.x = r4.y;
  o1.yz = r5.yw;
  o3.xyzw = v4.xyzw;
  o4.xyzw = v5.xyzw;
  o6.xyzw = r0.xyzw;
  r4.zw = r5.xz;
  o0.xyz = r4.xzw;
  o2.xy = v3.xy;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.9200.20546
//
//   using 3Dmigoto v1.2.57 on Fri Jun 02 22:25:15 2017
//
//
// Buffer Definitions: 
//
// cbuffer $Globals
// {
//
//   float4x4 LocalToWorld;             // Offset:    0 Size:    64
//   float4 PrimitiveDynamicData;       // Offset:   64 Size:    16 [unused]
//   float OcclusionPercentage;         // Offset:   80 Size:     4 [unused]
//   float4 CameraRight;                // Offset:   96 Size:    16
//   float4 CameraUp;                   // Offset:  112 Size:    16
//   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
//   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
// ------------------------------ ---------- ------- ----------- ---- --------
// VolumetricFogTextureSampler       sampler      NA          NA    2        1
// VolumetricFogTexture              texture  float4          3d    1        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   xyzw        1     NONE   float   xyzw
// BLENDWEIGHT              0   xy          2     NONE   float   x   
// TEXCOORD                 0   xy          3     NONE   float   xy  
// TEXCOORD                 1   xyzw        4     NONE   float   xyzw
// TEXCOORD                 2   xyzw        5     NONE   float   xyzw
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                10   xyz         0     NONE   float   xyz 
// TEXCOORD                11   xyzw        1     NONE   float   xyzw
// TEXCOORD                 0   xy          2     NONE   float   xy  
// TEXCOORD                 1   xyzw        3     NONE   float   xyzw
// TEXCOORD                 2   xyzw        4     NONE   float   xyzw
// TEXCOORD                 4   xyzw        5     NONE   float   xyzw
// TEXCOORD                 5   xyzw        6     NONE   float   xyzw
// SV_Position              0   xyzw        7      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_resource_texture3d (float,float,float,float) t1
dcl_input v0.xyzw
dcl_input v1.xyzw
dcl_input v2.x
dcl_input v3.xy
dcl_input v4.xyzw
dcl_input v5.xyzw
dcl_output o0.xyz
dcl_output o1.xyzw
dcl_output o2.xy
dcl_output o3.xyzw
dcl_output o4.xyzw
dcl_output o5.xyzw
dcl_output o6.xyzw
dcl_output_siv o7.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
sincos r1.x, r2.x, v2.x
mul r3.xyzw, r1.xxxx, cb0[6].xyzw
mad r3.xyzw, -r2.xxxx, cb0[7].xyzw, r3.xyzw
mul r2.xyzw, r2.xxxx, cb0[6].xyzw
mad r1.xyzw, r1.xxxx, cb0[7].xyzw, r2.xyzw
mul r2.xy, v1.zwzz, v1.xyxx
add r2.zw, v3.xxxy, l(0.000000, 0.000000, -0.500000, -0.500000)
mul r2.xy, r2.zwzz, r2.xyxx
mad r0.xyzw, r2.xxxx, r3.xyzw, r0.xyzw
mad r0.xyzw, r2.yyyy, r1.xyzw, r0.xyzw
mul r2.xyzw, r0.yyyy, cb1[1].xyzw
mad r2.xyzw, cb1[0].xyzw, r0.xxxx, r2.xyzw
mad r2.xyzw, cb1[2].xyzw, r0.zzzz, r2.xyzw
mad o7.xyzw, cb1[3].xyzw, r0.wwww, r2.xyzw
mul r2.xyz, r1.zxyz, r3.xyzx
mad r2.xyz, r3.zxyz, r1.xyzx, -r2.xyzx
dp3 r1.w, r2.xyzx, r2.xyzx
rsq r1.w, r1.w
mul r2.xyz, r1.wwww, r2.xyzx
mul r4.xy, r3.yyyy, cb0[1].xzxx
mad r4.xy, cb0[0].xzxx, r3.xxxx, r4.xyxx
mad r4.xy, cb0[2].xzxx, r3.zzzz, r4.xyxx
mul r5.xy, r1.yyyy, cb0[1].xzxx
mad r5.xy, cb0[0].xzxx, r1.xxxx, r5.xyxx
mad r5.xy, cb0[2].xzxx, r1.zzzz, r5.xyxx
mul r5.zw, r2.xxxx, cb0[1].xxxz
mad r5.zw, cb0[0].xxxz, r2.zzzz, r5.zzzw
mad r5.zw, cb0[2].xxxz, r2.yyyy, r5.zzzw
mul r6.xyz, r1.zxyz, r2.xyzx
mad r1.xyz, r1.yzxy, r2.yzxy, -r6.xyzx
dp3 r1.x, r1.xyzx, r3.xyzx
lt r1.y, l(0.000000), r1.x
lt r1.x, r1.x, l(0.000000)
iadd r1.x, -r1.y, r1.x
itof o1.w, r1.x
if_nz cb0[22].w
  mul r1.xyz, r0.yyyy, cb1[1].xywx
  mad r1.xyz, cb1[0].xywx, r0.xxxx, r1.xyzx
  mad r1.xyz, cb1[2].xywx, r0.zzzz, r1.xyzx
  mad r1.xyz, cb1[3].xywx, r0.wwww, r1.xyzx
  div r1.xy, r1.xyxx, r1.zzzz
  mad r1.xy, r1.xyxx, cb0[23].xyxx, cb0[23].wzww
  add r1.z, r1.z, cb0[24].z
  sqrt r1.z, r1.z
  mad r2.z, cb0[24].y, r1.z, cb0[24].x
  min r2.xy, r1.xyxx, cb0[25].xyxx
  sample_l_indexable(texture3d)(float,float,float,float) o5.xyzw, r2.xyzx, t1.xyzw, s2, l(0.000000)
else 
  if_nz cb0[12].x
    add r1.xyz, r0.xyzx, -cb1[8].xyzx
    dp3 r1.w, r1.xyzx, r1.xyzx
    sqrt r2.x, r1.w
    add r2.x, r2.x, -cb0[8].w
    max r2.x, r2.x, l(0.000000)
    lt r2.y, l(0.010000), |r1.z|
    movc r2.y, r2.y, r1.z, l(0.010000)
    mul r2.z, r2.y, -cb0[8].y
    exp r2.z, r2.z
    add r2.z, -r2.z, l(1.000000)
    mul r2.xy, r2.xyxx, cb0[8].xyxx
    div r2.y, r2.z, r2.y
    mul r2.x, r2.y, r2.x
    rsq r1.w, r1.w
    mul r1.xyz, r1.wwww, r1.xyzx
    dp3 r1.x, cb0[11].xyzx, r1.xyzx
    mad r1.x, -r1.x, l(0.499000), l(0.500000)
    log r1.x, r1.x
    mul r1.x, r1.x, cb0[8].z
    exp r1.x, r1.x
    add r1.yzw, cb0[9].xxyz, -cb0[10].xxyz
    mad r1.xyz, r1.xxxx, r1.yzwy, cb0[10].xyzx
    exp r1.w, -r2.x
    min r1.w, r1.w, l(1.000000)
    max r1.w, r1.w, cb0[9].w
    add r2.x, -r1.w, l(1.000000)
    mul o5.xyz, r1.xyzx, r2.xxxx
    mov o5.w, r1.w
  else 
    add r1.xyz, r0.xyzx, -cb1[8].xyzx
    dp3 r1.x, r1.xyzx, r1.xyzx
    sqrt r1.x, r1.x
    add r2.xyzw, cb0[11].xyzw, -cb1[8].zzzz
    ge r1.y, l(0.001000), |r1.z|
    movc r1.y, r1.y, l(0.001000), r1.z
    div_sat r2.xyzw, r2.xyzw, r1.yyyy
    add r3.xyzw, cb0[17].xyzw, -cb1[8].zzzz
    div_sat r3.xyzw, r3.xyzw, r1.yyyy
    add r1.xyzw, r1.xxxx, -cb0[10].xyzw
    max r1.xyzw, r1.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)
    add r2.xyzw, -r2.xyzw, r3.xyzw
    mul r1.xyzw, r1.xyzw, |r2.xyzw|
    lt r2.xyzw, r1.xyzw, cb0[9].xyzw
    mul r1.xyzw, r1.xyzw, cb0[8].xyzw
    exp r1.xyzw, r1.xyzw
    and r1.xyzw, r1.xyzw, r2.xyzw
    add r2.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)
    mul r3.xyz, r2.xxxx, cb0[13].xyzx
    mov r3.w, r1.x
    mul r3.xyzw, r1.yyyy, r3.xyzw
    mad r3.xyz, r2.yyyy, cb0[14].xyzx, r3.xyzx
    mul r3.xyzw, r1.zzzz, r3.xyzw
    mad r3.xyz, r2.zzzz, cb0[15].xyzx, r3.xyzx
    mul r1.xyzw, r1.wwww, r3.xyzw
    mad o5.xyz, r2.wwww, cb0[16].xyzx, r1.xyzx
    mov o5.w, r1.w
  endif 
endif 
mov o1.x, r4.y
mov o1.yz, r5.yywy
mov o3.xyzw, v4.xyzw
mov o4.xyzw, v5.xyzw
mov o6.xyzw, r0.xyzw
mov r4.zw, r5.xxxz
mov o0.xyz, r4.xzwx
mov o2.xy, v3.xyxx
ret 
// Approximately 120 instruction slots used

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