// CIRRUS ----

cbuffer _Globals : register(b0)
{
  float4x4 viewproj : packoffset(c0);
  float4 cv4 : packoffset(c4);
  float4 cam : packoffset(c5);
  float4 LightDir : packoffset(c6);
  float4 Ambient : packoffset(c7);
  float4 TexSteps : packoffset(c8);
}

SamplerState SkyLerpSampler_s : register(s0);
SamplerState mySampler_s : register(s1);
SamplerState AndSampler_s : register(s2);
Texture2D<float4> AndSampler : register(t0);
Texture2D<float4> mySampler : register(t1);
Texture2DArray<float4> g_tSky : register(t2);


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


void main(
  float4 v0 : SV_Position0,
  float4 v1 : TEXCOORD0,
  float4 v2 : TEXCOORD1,
  float2 v3 : TEXCOORD2,
  float4 v4 : COLOR0, /// sun dir z opposite
  float4 v5 : COLOR1, /// edge hori v5.yzw = suncolor
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = v2.xy / v2.ww;                                          // orig
  r0.z = 0;                                                       // orig
  r0.xyzw = g_tSky.SampleLevel(SkyLerpSampler_s, r0.xyz, 0).xyzw; // orig
//////////////////////////////////////////////////////////////////// NEW NEW NEW NEW NEW \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
//// CLOUD CREATION \/ \/ \/
//// ....this could be done with one tex sample instead of two
    r1.x = AndSampler.Sample(AndSampler_s, v3.xy).y; ///// green channel only since it has less noise
    r1.y = mySampler.Sample(mySampler_s, v1.xy).y;   ///// again green channel only for less noise
    r1.z = r1.x * r1.y;                              ///// multiply
////////////////////////////////////////////////////////////////////
//// LIGHTING SET UP \/ \/ \/
////////////////////////////////////////////////////////////////////
    r3.w = v5.x * v4.y;                              ///// sun shine horizon
    r2.xyz = v5.yzw;                                 ///// sun color
    r4.w = saturate(1.0 + -r2.y);                    ///// sun color switch
    r4.x = 0.5;                                      ///// hard coded color for subtraction
    r4.y = 0.9;                                      /////
    r4.z = 1.0;                                      /////
    r4.xyz = r4.xyz * r4.www;                        ///// multi by switch
    r4.xyz = r4.xyz * v4.zzz;                        ///// multi by opposite
    r2.xyz = saturate(r2.xyz + -r4.xyz);             ///// hacky hue shift sun color
    /////////////////////////////
    r5.x = saturate(1.0 + -v5.x);                    ///// horizon extinction
    r5.x = r5.x + r3.w;                              ///// adding sunrise edge
    /////////////////////////////
    r1.w = r1.z * r5.x;                              ///// alpha
    r2.xyz = r2.xyz * r5.xxx;                        ///// sun color
    ///////////////////////////// beer powder

r1.z = exp(-r1.z);
r1.z = 1.0 + -r1.z;
r1.z = saturate(r1.z * 1.0);
r2.xyz = r1.zzz * r2.xyz;
//r3.xyz = Ambient.xyz * r1.zzz;
//o0.xyz = r3.xyz + r2.xyz;
o0.xyz = r2.xyz + Ambient.xyz;
o0.w = r1.w;
//////////////////////////////////////////////////////////////////
  r0.xyz = -Ambient.xyz * Ambient.xyz + r0.xyz;
  r1.xyz = Ambient.xyz * Ambient.xyz;

  //o0.xyz = saturate(v5.xyz * r0.xyz + r1.xyz);            // orig
  //r0.xyzw = AndSampler.Sample(AndSampler_s, v3.xy).xyzw;  // orig
  //r1.xyzw = mySampler.Sample(mySampler_s, v1.xy).xyzw;    // orig
  //r0.x = r1.x * r0.y;                                     // orig
  //o0.w = v4.w * r0.x;                                     // orig
  return;
}
