<?xml version="1.0" encoding="utf-8" ?>
<shader compiler="xmlshader" name="clouds2">

  <shadervars>
	<shadervar name="specular" type="vector2">0.0, 0.8</shadervar>
	<shadervar name="control1" type="vector2">0.2, 0.0</shadervar>
	<shadervar name="control2" type="vector2">0.2, 0.2</shadervar>
	<shadervar name="control3" type="vector2">0.2, 0.2</shadervar>
	<!-- cloud density, grouping/spreading(higher gibes more groups) -->
	<shadervar name="mnvars" type="vector2">1.8, 0.2</shadervar>
	<shadervar name="skycol" type="vector3">0.9, 0.9, 0.9</shadervar>
	<shadervar name="cloudcol" type="vector3">0.6, 0.6,0.6</shadervar>
	
    	<shadervar name="time" type="expression">
        	<sexp>(* "standard time" 0.8)</sexp>
    	</shadervar>
    	<shadervar name="windvec" type="vector2">0.0, 0.15</shadervar>
  </shadervars>

<technique priority="300" lights="0">
  <pass>
      <mixmode>
        <copy />
      </mixmode>
      <buffer source="normal" destination="normal" />
      <buffer source="tangent" destination="texture coordinate 1" />
      <buffer source="binormal" destination="texture coordinate 2" />
      <buffer source="texture coordinate 0" destination="texture coordinate 0" />
	      <vp plugin="glcg">
	      <cgvp>
	          <variablemap variable="time" destination="time"/>
	          <variablemap variable="windvec" destination="windvec"/>
		  <variablemap variable="specular" destination="specular"/>
		  <variablemap variable="control1" destination="control1"/>
		  <variablemap variable="control2" destination="control2"/>
		  <variablemap variable="control3" destination="control3"/>
		 <program>
		     struct app2vertex {
			float4 Position : POSITION;
			float3 Normal : NORMAL;
			float2 TexCoord : TEXCOORD0;
		      };

		      struct vertex2fragment { 
			float4 Position : POSITION;
			float2 TexCoord0 : TEXCOORD0;
			float2 TexCoord1 : TEXCOORD1;
			float2 TexCoord2 : TEXCOORD2;
			float2 TexCoord3 : TEXCOORD3;
			float3 LightIntensity : TEXCOORD4;
		      };

		      vertex2fragment main (app2vertex IN,
			uniform float4x4 ModelViewI : state.matrix.modelview.inverse,
			uniform float4x4 ModelViewIT : state.matrix.modelview.invtrans,
			uniform float4x4 ModelViewProj : state.matrix.mvp,
			uniform float time,
			uniform float2 windvec,
			uniform float2 specular,
			uniform float2 control1,
			uniform float2 control2,
			uniform float2 control3,
			uniform float3 LightColor)
		      {
			vertex2fragment OUT;
			
			// Create some turbulence
			// to apply to the smallest noise.
			float sine, cosine;
			sincos (time/10.0, sine, cosine);
			float2 turbulence;
			turbulence.x = sine * 0.2;
			turbulence.y = -cosine * 0.2;
			
			// Create a wind vector based on time.
			float2 wind;
			wind.x = - time * windvec.x * 0.1;
			wind.y = - time * windvec.y * 0.1;

			OUT.Position = mul (ModelViewProj, IN.Position);
			OUT.TexCoord0 = specular + (IN.TexCoord + wind)/8.0;
			OUT.TexCoord1 = control1 + (IN.TexCoord + wind)/4.0;
			OUT.TexCoord2 = control2 + (IN.TexCoord + wind*2.2)/2.0;
			OUT.TexCoord3 = control3 + (IN.TexCoord + wind + turbulence)/1.0;
		
			OUT.LightIntensity  = IN.Position;


			return OUT;
		      }
		 </program>
              </cgvp>
              </vp>
	
      <texture destination="diffuse" name="tex diffuse" />
      <texture destination="noise1" name="noise1" />
      <texture destination="noise2" name="noise2" />
      <texture destination="noise3" name="noise3" />
		<fp plugin="glcg">
		 <cgfp>
		  <variablemap variable="mnvars" destination="mnvars"/>
		  <variablemap variable="cloudcol" destination="cloudcol"/>
		  <variablemap variable="skycol" destination="skycol"/>
		  
		  <variablemap variable="timeOfDay" destination="time"/>
		  <variablemap variable="sun direction" destination="sun_vec" />
                 <program>
		 struct vertex2fragment { 
		 	float4 Position : POSITION;
		 	float2 TexCoord0 : TEXCOORD0;
		 	float2 TexCoord1 : TEXCOORD1;
		 	float2 TexCoord2 : TEXCOORD2;
		 	float2 TexCoord3 : TEXCOORD3;
		 	float3 LightIntensity : TEXCOORD4;
		 };
		 
		 
		 float4 main (vertex2fragment IN,
		 			uniform float time,
		 			uniform float2 mnvars,
		 			uniform float3 cloudcol,
		 			uniform float3 skycol,
		 			uniform float3 sun_vec,
		 			uniform sampler2D diffuse,
		 			uniform sampler2D noise1,
		 			uniform sampler2D noise2,
		 			uniform sampler2D noise3) : COLOR
		 {

		 	float4 n1 = tex2D(noise3, IN.TexCoord0);
		 	float4 n2 = tex2D(noise3, IN.TexCoord1.yx);
		 	float4 n3 = tex2D(noise3, IN.TexCoord2);
		 	float4 n4 = tex2D(noise3, IN.TexCoord3);
		 	
		 	float4 fbm = 0.5000 * n1;
		 	fbm         += 0.2000 * n2;
		 	fbm         += 0.1050 * n3;
		 	fbm         += 0.0625 * n4;
		 	
		 	
		 	// remaping: scale, bias, threshold
		 	fbm = saturate( (fbm * mnvars.x) + mnvars.y);
			     
			//float4 ray = {0.0, 0.3, 0.6, 0.9};  
			float4 ray = dot(normalize(IN.LightIntensity), sun_vec);
			
			float4 de = max( 0.0, (fbm - ray) );
			
			// integration : de.w = 0.25*(de.x+de.y+de.z+de.w)
			de.w = dot(de, 0.25);
			
			cloudcol = lerp (float3(0.05,0.05,0.1), cloudcol, time);
			skycol = lerp (float3(0.2,0.2,0.3), skycol, time);
			
			// calc cloud color
			float4 result; 
			result.xyz = lerp(skycol, cloudcol, de.w);
			
			fbm.w = 1 - fbm.w;
			     
			result.w = fbm.w;     
			    
		 	
		 	return result;
	
		 }
		 </program>
		 </cgfp>
		</fp>
		 

          </pass>
 </technique> 	
 
</shader> 
  

