//volumetric fog and light
// ---- Created with 3Dmigoto v1.3.16.41 on Wed Mar 29 14:23:03 2023
Texture2D<float4> t3 : register(t3);

Texture3D<float4> t2 : register(t2);

Texture2D<float4> t1 : register(t1);

Texture2D<float4> t0 : register(t0);

SamplerComparisonState s3_s : register(s3);

SamplerState s2_s : register(s2);

SamplerState s1_s : register(s1);

SamplerState s0_s : register(s0);

cbuffer cb2 : register(b2)
{
  float4 cb2[25];
}

cbuffer cb1 : register(b1)
{
  float4 cb1[8];
}

cbuffer cb0 : register(b0)
{
  float4 cb0[34];
}

cbuffer cb10 : register(b10)  ///
{                             /// camera coors
  float4 cb10[27];            ///
}                             ///

cbuffer cb11 : register(b11)////
{                           //// fov cb11[10].x 
  float4 cb11[27];          ////
}

//cbuffer cb13 : register(b13)//////  
//{                           //////
//  float4 cb13[4];           ////// matrix
//}                           //////

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


void main(
  float4 v0 : SV_POSITION0,
  float4 v1 : TEXCOORD0,
  float3 v2 : TEXCOORD1,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10;
  uint4 bitmask, uiDest;
  float4 fDest;
  
float4 stereo = StereoParams.Load(0);  
float4 testeo = IniParams.Load(int2(90,0));

//////////////////////float fov;otra forma de calcular el fov
//////////////////////fov = cb10[12].x * cb13[0].w + cb10[11].x * cb13[0].z + cb10[9].x  * cb13[0].x + cb10[10].x * cb13[0].y;

//float4 fov;
//  
//fov.x = cb10[9].x;
//fov.y = cb10[10].x;
//fov.z = cb10[11].x;
//
//
//fov.w = dot(fov.xyz,fov.xyz);

// you may need this if you get haloing issues
// if (v1.w != 1)
// v1.x += stereo.x * (v1.w - stereo.y) * 0.5;

  r0.xyzw = t0.Sample(s0_s, v1.xy).xyzw;
  r0.x = cb1[7].x * r0.x + cb1[7].y;
  r0.x = 1 / r0.x;
  r0.yzw = -cb1[4].xyz + v2.xyz;
  
//r0.y -= stereo.x *  cb10[9].x  * cb11[10].x * 1782;
//r0.z -= stereo.x *  cb10[10].x * cb11[10].x * 1782;
//r0.w -= stereo.x *  cb10[11].x * cb11[10].x * 1782;

r0.y -= stereo.x *  cb10[9].x  *   cb11[10].x * cb1[5].z;
r0.z -= stereo.x *  cb10[10].x *   cb11[10].x * cb1[5].z; /// cb1[5].z  far plane
r0.w -= stereo.x *  cb10[11].x *   cb11[10].x * cb1[5].z;

////r0.y -= stereo.x *  cb10[9].x  * fov * cb1[5].z;
////r0.z -= stereo.x *  cb10[10].x * fov * cb1[5].z;
////r0.w -= stereo.x *  cb10[11].x * fov * cb1[5].z;

//fov ---->cb11[10].x

	// x = 1 or -1 (-1 if projection is flipped)
	// y = near plane
	// z = far plane  -------------------->cb1[5].z
	// w = 1/far plane
	//uniform float4 _ProjectionParams;
	


  
  
  r0.yzw = r0.yzw * r0.xxx;
  r1.x = dot(r0.yzw, r0.yzw);
  r1.x = sqrt(r1.x);
  r0.yzw = r0.yzw / r1.xxx;
  r1.x = min(cb0[33].x, r1.x);
  r1.yz = floor(v0.xy);
  r1.yz = float2(0.125,0.125) * r1.yz;
  r2.xy = cmp(r1.yz >= -r1.yz);
  r1.yz = frac(abs(r1.yz));
  r1.yz = r2.xy ? r1.yz : -r1.yz;
  r1.yz = float2(0.0625,0.0625) + r1.yz;
  r2.xyzw = t1.Sample(s2_s, r1.yz).xyzw;
  r1.y = asint(cb0[33].y);
  r1.x = r1.x / r1.y;
  r1.yzw = r1.xxx * r0.yzw;
  r1.yzw = r1.yzw * r2.www + cb1[4].xyz;
  r2.x = dot(cb0[3].xyz, -r0.yzw);
  r2.y = 1 + -cb2[24].x;
  r3.xz = cb1[0].yy * cb0[31].xy;
  r2.zw = cb0[28].xy * r1.xx;
  r3.y = 0;
  r5.xyz = r1.yzw;
  r3.w = 0;
  r4.xyzw = float4(0,0,0,0);
  while (true) {
    r5.w = cmp((int)r4.w >= asint(cb0[33].y));
    if (r5.w != 0) break;
    r6.xyz = -cb2[0].xyz + r5.xyz;
    r7.xyz = -cb2[1].xyz + r5.xyz;
    r8.xyz = -cb2[2].xyz + r5.xyz;
    r9.xyz = -cb2[3].xyz + r5.xyz;
    r6.x = dot(r6.xyz, r6.xyz);
    r6.y = dot(r7.xyz, r7.xyz);
    r6.z = dot(r8.xyz, r8.xyz);
    r6.w = dot(r9.xyz, r9.xyz);
    r6.xyzw = cmp(r6.xyzw < cb2[4].xyzw);
    r7.xyzw = r6.xyzw ? float4(1,1,1,1) : 0;
    r6.xyz = r6.xyz ? float3(-1,-1,-1) : float3(-0,-0,-0);
    r6.xyz = r7.yzw + r6.xyz;
    r7.yzw = max(float3(0,0,0), r6.xyz);
    r5.w = dot(r7.xyzw, float4(1,1,1,1));
    r6.x = cmp(r5.w < 4);
    r6.yzw = cb2[9].xyz * r5.yyy;
    r6.yzw = cb2[8].xyz * r5.xxx + r6.yzw;
    r6.yzw = cb2[10].xyz * r5.zzz + r6.yzw;
    r6.yzw = cb2[11].xyz + r6.yzw;
    r8.xyz = cb2[13].xyz * r5.yyy;
    r8.xyz = cb2[12].xyz * r5.xxx + r8.xyz;
    r8.xyz = cb2[14].xyz * r5.zzz + r8.xyz;
    r8.xyz = cb2[15].xyz + r8.xyz;
    r9.xyz = cb2[17].xyz * r5.yyy;
    r9.xyz = cb2[16].xyz * r5.xxx + r9.xyz;
    r9.xyz = cb2[18].xyz * r5.zzz + r9.xyz;
    r9.xyz = cb2[19].xyz + r9.xyz;
    r10.xyz = cb2[21].xyz * r5.yyy;
    r10.xyz = cb2[20].xyz * r5.xxx + r10.xyz;
    r10.xyz = cb2[22].xyz * r5.zzz + r10.xyz;
    r10.xyz = cb2[23].xyz + r10.xyz;
    r8.xyz = r8.xyz * r7.yyy;
    r6.yzw = r6.yzw * r7.xxx + r8.xyz;
    r6.yzw = r9.xyz * r7.zzz + r6.yzw;
    r6.yzw = r10.xyz * r7.www + r6.yzw;
    r5.w = r6.w + -r5.w;
    r5.w = 1 + r5.w;
    r5.w = t3.SampleCmpLevelZero(s3_s, r6.yz, r5.w).x;
    r5.w = r6.x ? r5.w : 1;
    r5.w = r5.w * r2.y + cb2[24].x;
    r6.xyz = r5.xyz * cb0[30].xxx + r3.xyz;
    r6.xyz = frac(r6.xyz);
    r6.xyzw = t2.Sample(s1_s, r6.xyz).xyzw;
    r6.x = saturate(-cb0[30].z + r6.x);
    r6.x = saturate(cb0[30].y * r6.x);
    r6.y = cb0[32].x + r5.y;
    r6.y = cb0[32].y * -r6.y;
    r6.y = 1.44269502 * r6.y;
    r6.y = exp2(r6.y);
    r6.x = r6.x * r6.y;
    r6.y = r6.x * r2.z;
    r3.w = r2.w * r6.x + r3.w;
    r5.w = r6.y * r5.w;
    r6.x = -1.44269502 * r3.w;
    r6.x = exp2(r6.x);
    r4.xyz = r5.www * r6.xxx + r4.xyz;
    r5.xyz = r0.yzw * r1.xxx + r5.xyz;
    r4.w = (int)r4.w + 1;
  }
  r0.y = -cb0[29].z * r2.x + cb0[29].y;
  r0.y = log2(r0.y);
  r0.y = 1.5 * r0.y;
  r0.y = exp2(r0.y);
  r0.y = cb0[29].x / r0.y;
  r0.y = cb0[29].w * r0.y;
  r0.yzw = r4.xyz * r0.yyy;
  r0.yzw = cb0[5].xyz * r0.yzw;
  o0.xyz = max(float3(0,0,0), r0.yzw);
  r0.y = -1.44269502 * r3.w;
  r0.y = exp2(r0.y);
  r0.x = cmp(0.999998987 < r0.x);
  r0.z = 1 + -r0.y;
  r0.z = cb0[28].w * r0.z + r0.y;
  o0.w = r0.x ? r0.z : r0.y;
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
//   using 3Dmigoto v1.3.16.41 on Wed Mar 29 14:23:03 2023
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_POSITION              0   xyzw        0      POS   float   xy
// TEXCOORD                 0   xy          1     NONE   float   xy
// TEXCOORD                 1   xyz         2     NONE   float   xyz
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target                0   xyzw        0   TARGET   float   xyzw
//
ps_4_0
dcl_constantbuffer cb0[34], immediateIndexed
dcl_constantbuffer cb1[8], immediateIndexed
dcl_constantbuffer cb2[25], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s1, mode_default
dcl_sampler s2, mode_default
dcl_sampler s3, mode_comparison
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_resource_texture3d (float,float,float,float) t2
dcl_resource_texture2d (float,float,float,float) t3
dcl_input_ps_siv linear noperspective v0.xy, position
dcl_input_ps linear v1.xy
dcl_input_ps linear v2.xyz
dcl_output o0.xyzw
dcl_temps 11
sample r0.xyzw, v1.xyxx, t0.xyzw, s0
mad r0.x, cb1[7].x, r0.x, cb1[7].y
div r0.x, l(1.000000, 1.000000, 1.000000, 1.000000), r0.x
add r0.yzw, v2.xxyz, -cb1[4].xxyz
mul r0.yzw, r0.xxxx, r0.yyzw
dp3 r1.x, r0.yzwy, r0.yzwy
sqrt r1.x, r1.x
div r0.yzw, r0.yyzw, r1.xxxx
min r1.x, r1.x, cb0[33].x
round_ni r1.yz, v0.xxyx
mul r1.yz, r1.yyzy, l(0.000000, 0.125000, 0.125000, 0.000000)
ge r2.xy, r1.yzyy, -r1.yzyy
frc r1.yz, |r1.yyzy|
movc r1.yz, r2.xxyx, r1.yyzy, -r1.yyzy
add r1.yz, r1.yyzy, l(0.000000, 0.062500, 0.062500, 0.000000)
sample r2.xyzw, r1.yzyy, t1.xyzw, s2
itof r1.y, cb0[33].y
div r1.x, r1.x, r1.y
mul r1.yzw, r0.yyzw, r1.xxxx
mad r1.yzw, r1.yyzw, r2.wwww, cb1[4].xxyz
dp3 r2.x, cb0[3].xyzx, -r0.yzwy
add r2.y, -cb2[24].x, l(1.000000)
mul r3.xz, cb0[31].xxyx, cb1[0].yyyy
mul r2.zw, r1.xxxx, cb0[28].xxxy
mov r3.y, l(0)
mov r5.xyz, r1.yzwy
mov r3.w, l(0)
mov r4.xyzw, l(0,0,0,0)
loop
  ige r5.w, r4.w, cb0[33].y
  breakc_nz r5.w
  add r6.xyz, r5.xyzx, -cb2[0].xyzx
  add r7.xyz, r5.xyzx, -cb2[1].xyzx
  add r8.xyz, r5.xyzx, -cb2[2].xyzx
  add r9.xyz, r5.xyzx, -cb2[3].xyzx
  dp3 r6.x, r6.xyzx, r6.xyzx
  dp3 r6.y, r7.xyzx, r7.xyzx
  dp3 r6.z, r8.xyzx, r8.xyzx
  dp3 r6.w, r9.xyzx, r9.xyzx
  lt r6.xyzw, r6.xyzw, cb2[4].xyzw
  and r7.xyzw, r6.xyzw, l(0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000)
  movc r6.xyz, r6.xyzx, l(-1.000000,-1.000000,-1.000000,0), l(-0.000000,-0.000000,-0.000000,0)
  add r6.xyz, r6.xyzx, r7.yzwy
  max r7.yzw, r6.xxyz, l(0.000000, 0.000000, 0.000000, 0.000000)
  dp4 r5.w, r7.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)
  lt r6.x, r5.w, l(4.000000)
  mul r6.yzw, r5.yyyy, cb2[9].xxyz
  mad r6.yzw, cb2[8].xxyz, r5.xxxx, r6.yyzw
  mad r6.yzw, cb2[10].xxyz, r5.zzzz, r6.yyzw
  add r6.yzw, r6.yyzw, cb2[11].xxyz
  mul r8.xyz, r5.yyyy, cb2[13].xyzx
  mad r8.xyz, cb2[12].xyzx, r5.xxxx, r8.xyzx
  mad r8.xyz, cb2[14].xyzx, r5.zzzz, r8.xyzx
  add r8.xyz, r8.xyzx, cb2[15].xyzx
  mul r9.xyz, r5.yyyy, cb2[17].xyzx
  mad r9.xyz, cb2[16].xyzx, r5.xxxx, r9.xyzx
  mad r9.xyz, cb2[18].xyzx, r5.zzzz, r9.xyzx
  add r9.xyz, r9.xyzx, cb2[19].xyzx
  mul r10.xyz, r5.yyyy, cb2[21].xyzx
  mad r10.xyz, cb2[20].xyzx, r5.xxxx, r10.xyzx
  mad r10.xyz, cb2[22].xyzx, r5.zzzz, r10.xyzx
  add r10.xyz, r10.xyzx, cb2[23].xyzx
  mul r8.xyz, r7.yyyy, r8.xyzx
  mad r6.yzw, r6.yyzw, r7.xxxx, r8.xxyz
  mad r6.yzw, r9.xxyz, r7.zzzz, r6.yyzw
  mad r6.yzw, r10.xxyz, r7.wwww, r6.yyzw
  add r5.w, -r5.w, r6.w
  add r5.w, r5.w, l(1.000000)
  sample_c_lz r5.w, r6.yzyy, t3.xxxx, s3, r5.w
  movc r5.w, r6.x, r5.w, l(1.000000)
  mad r5.w, r5.w, r2.y, cb2[24].x
  mad r6.xyz, r5.xyzx, cb0[30].xxxx, r3.xyzx
  frc r6.xyz, r6.xyzx
  sample r6.xyzw, r6.xyzx, t2.xyzw, s1
  add_sat r6.x, r6.x, -cb0[30].z
  mul_sat r6.x, r6.x, cb0[30].y
  add r6.y, r5.y, cb0[32].x
  mul r6.y, -r6.y, cb0[32].y
  mul r6.y, r6.y, l(1.442695)
  exp r6.y, r6.y
  mul r6.x, r6.y, r6.x
  mul r6.y, r2.z, r6.x
  mad r3.w, r2.w, r6.x, r3.w
  mul r5.w, r5.w, r6.y
  mul r6.x, r3.w, l(-1.442695)
  exp r6.x, r6.x
  mad r4.xyz, r5.wwww, r6.xxxx, r4.xyzx
  mad r5.xyz, r0.yzwy, r1.xxxx, r5.xyzx
  iadd r4.w, r4.w, l(1)
endloop
mad r0.y, -cb0[29].z, r2.x, cb0[29].y
log r0.y, r0.y
mul r0.y, r0.y, l(1.500000)
exp r0.y, r0.y
div r0.y, cb0[29].x, r0.y
mul r0.y, r0.y, cb0[29].w
mul r0.yzw, r0.yyyy, r4.xxyz
mul r0.yzw, r0.yyzw, cb0[5].xxyz
max o0.xyz, r0.yzwy, l(0.000000, 0.000000, 0.000000, 0.000000)
mul r0.y, r3.w, l(-1.442695)
exp r0.y, r0.y
lt r0.x, l(0.999999), r0.x
add r0.z, -r0.y, l(1.000000)
mad r0.z, cb0[28].w, r0.z, r0.y
movc o0.w, r0.x, r0.z, r0.y
ret
// Approximately 0 instruction slots used

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