#version 110
#define float4 vec4
#define float3 vec3
#define float2 vec2
#define oUV gl_TexCoord[0]
#define tex3D texture3D
#define tex2D texture2D
#define tex1D texture1D

varying vec3 normal;
varying vec3 normalB;
//varying vec4 position;
varying vec4 projection_position;
varying vec4 ShadowPosZ;
varying vec4 Color;

varying vec4 projection_from_camera;

varying vec2 UVcoordinates;
varying vec4 TheGoodPosition;

uniform mat4 ProjectionMatrix;
				uniform sampler2D texture2d_1;
				uniform sampler2D texture2d_2;
				uniform sampler2D texture2d_3;
				uniform sampler2D texture2d_flower;
				uniform sampler2D texture2d_blob;
				uniform samplerCube texture2d_cube;
uniform sampler2D texture2d_reflection;
				uniform sampler2D texture2d_paper;


	uniform float PosY;
	uniform float ttime;
	uniform float isReflective;
	uniform float MaterialMultiplier;
	uniform float ReflectPass;
	uniform float isHappiness;
	uniform float isManRunning;
	uniform float isSide;
	uniform float isMoon;
	uniform float isFish;
	uniform float RedHot;
uniform float isBigTree;
uniform float isLeaf;
varying float Leaf;
	void main (void) 
{

vec4 Final_Color;

	// discard segments
if (Leaf<0.99) { 
	if (sin	(TheGoodPosition.z*3.5)*sin(TheGoodPosition.x*4.5)*sin(TheGoodPosition.y*4.5)>Leaf) discard;
}


//t uff=clamp (0.2*(ttime-64.0+TheGoodPosition.z*0.03),0.0,1.0);

//if (uff<0.999) { 	 if (sin	(TheGoodPosition.z*TheGoodPosition.x*0.005)>-1.0+2.0*uff) discard;}

	
	//	if (sin	(TheGoodPosition.z*0.5)*sin(TheGoodPosition.x*0.5)*sin(TheGoodPosition.y*0.5)>-0.3) discard;


///if (position.y<0.5)	if (position.z<0.5)	if (position.y>0.0) discard;
//if (projection_position.x>22.0) discard;
//if (projection_position.x<-22.0) discard;

float4 nnormal= (normal.xyzz);
float4 projection_pos=projection_position;

projection_pos=ShadowPosZ / ShadowPosZ.w ;;


vec4 ReflCol=texture2D (texture2d_3,projection_pos.st);

// Bump mapping?
///float3 BumpNormal=tex2D (texture2d_3,UVcoordinates.xy*0.4).xyz*2.0-vec3 (1.0);


// calculate ambient
float4 Ambient_Color=vec4 (0.6);

// calculate diffuse color
vec3 normalized_normal=normalize(normal.xyz);
float dott=dot(normalized_normal.xyz,vec3 (0.0,-4.0+4.13+0.05*10.0,1.0));
dott=clamp (dott,0.0,1.0);
dott=0.5+1.6*dott;
//pow(dott,1.0);
float4 Diffuse_Color=vec4 (dott);
//*vec4 (0.9,0.95,1.0,1.0);

// calculate specular 
vec3 H=vec3 (0.0,0.0,1.0)+vec3 (0.3,-0.1,0.0);
H=normalize (H);

dott=dot(normalized_normal,H);
dott=abs (dott);
dott=clamp (dott,0.0,1.0);
dott=pow(dott,64.0);
float4 Specular_Color=vec4 (dott)*vec4 (0.7,0.8,1.0,1.0);

H=vec3 (-1.65,0,1.0)+vec3 (0.3,-0.1,-1.58);
H=normalize (H);
dott=dot(normalized_normal,H);
dott=abs (dott);
dott=clamp (dott,0.0,1.0);
dott=pow(dott,32.0);
Specular_Color+=vec4 (dott)*vec4 (1.0,0.6,0.5,0.6)*1.0;


H=vec3 (-1.65,0,1.0)+vec3 (0.3,1.89,6.5);
H=normalize (H);
dott=dot(normalized_normal,H);
dott=abs (dott);
dott=clamp (dott,0.0,1.0);
dott=pow(dott,22.0);
Specular_Color+=vec4 (dott)*vec4 (0.3,0.7,1.0,0.6)*0.4;

// combine all

if (isHappiness>0.5)
{
	Specular_Color*=3.0;
//	Diffuse_Color*=Diffuse_Color;
}

// soft shadow mapping
float shadow=1.0;
float divv=(ShadowPosZ.z+0.000)/ShadowPosZ.w;


if (MaterialMultiplier>0.1)
if (ShadowPosZ.w>0.0)
{
	for (int r=0;r<0;r++)
	{
	float Shadow=texture2D (texture2d_2,projection_pos.st-10.0*float2 (-0.0002*float (r),-0.0002*float (r))).z;
	if (0.00202+Shadow-1.96*0.001<divv) shadow-=0.500;
	}
}

//Final_Color=vec4 (shadow);
// texture mapping
float4 ftex=tex2D (texture2d_3,MaterialMultiplier*UVcoordinates.xy*0.02+float2 (0.5,0.5));

//Final_Color=vec4 (0.5);
// projection of spot light onto scene (with texture on top)
///float2 ftex=tex2D (texture2d_3,UVcoordinates.xy*0.2+float2 (0.5,0.5)).xy;



Final_Color*=1.0+0.6*ftex;

float2 UVcoords2=projection_position.xz*0.11;

float4 TheNormal=(nnormal.xyzz+float4 (1.0))*0.5;


{



float4 ftexrefl=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.65);



ftexrefl=ftexrefl+(2.0*TheNormal.xyzz-ftexrefl)*-0.03;

Diffuse_Color*=vec4 (0.5)*Color;





Final_Color=ftexrefl*Diffuse_Color+Specular_Color*0.06;
//Final_Color+=0.6*Specular_Color;



///Final_Color*=vec4(0.9,0.9,1.0,1.0)+Specular_Color*0.6;
//Final_Color*=0.6+tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.015+vec2 (0.46))*1.0;


//if (isHappiness>0.5) Final_Color*=1.7;


Final_Color*=0.3+2.1*tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.23+vec2 (0.46)+0.1*ftexrefl.xy)*1.7;
Final_Color*=1.0+2.0*tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.33+vec2 (0)+0.1*ftexrefl.xy)*1.7*vec4 (0.3,0.6,0.9,1.0);





//if (isSide<1.0)



}



if (isHappiness>0.5)
{


}



//Final_Color*=0.6+1.3*texture (texture2d_cube,nnormal.xyz);




float dpth=gl_FragCoord.z/gl_FragCoord.w+0.14*0.001;
dpth*=1.867*0.02;

Final_Color=Diffuse_Color*vec4 (1.0);


//if (isBigTree>0.5) Final_Color+=Specular_Color.x*vec4 (0.3);

vec4 FTex;

vec2 ftt=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.003).xy*0.8;
if (isBigTree<0.5)
Final_Color*=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.15*0.027);
else
{
	FTex=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.15*0.047*34.0)*1.3;
	Final_Color*=FTex;
	Final_Color*=vec4 (0.8,1.0,1.0,1.0)*1.4;
}


Final_Color*=0.7+1.1*tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.053+vec2 (0.46)+ftt+vec2 (-0.18)+0.00000933*Final_Color.xy)*1.7;
Final_Color*=1.0+2.0*tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.073+vec2 (0.834))*1.7*vec4 (0.3,0.6,0.9,1.0);
//Final_Color*=shadow;
//Final_Color=Final_Color+(2.0*TheNormal.xyzz-Final_Color)*+0.005;
//Final_Color=TheNormal.xyzz;
Final_Color*=8.0*Color;

float distcenter=length (TheGoodPosition.xz);
distcenter*=-0.181*0.01;
distcenter*=distcenter;


Final_Color*=1.0-clamp (distcenter,0.0,1.0);


 distcenter=length (TheGoodPosition.xy);
distcenter*=0.377*0.01;

Final_Color*=1.2-0.99*clamp (distcenter,0.0,1.0);




if (distcenter>2.0){
	discard;
	//if (sin	(TheGoodPosition.x*0.15)*sin(TheGoodPosition.z*0.15)>0.7) discard;
}
	//if (Final_Color.x<0.01) discard;
if (isBigTree<0.5)
if (ttime>74.0)
{ 

 distcenter=length (TheGoodPosition.xz-vec2 (-3.22,0.0)*50.0)*0.01;

 float f=clamp ((ttime-74.0)*0.3,0.0,1.0);
 Final_Color*=(2.0*f+1.0)-f*2.8*clamp (distcenter,0.0,1.0);
}



//dpth=0.0;
dpth=1.0-dpth;


dpth=clamp (dpth,0.0,1.0);



//Final_Color=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.15*0.027);

//Final_Color=Color;;

Final_Color*=1.3*dpth;
Final_Color*=2.0;
//Final_Color+=vec4 (0.0,0.0,0.05,0.0);
//Final_Color.xy*=vec2 (PosY,PosY*0.5);
//Final_Color=Color;
if (isMoon>0.5)
Final_Color=vec4 (1.0,0.95,0.9,1.0);


if (isBigTree>0.5)
{
float ft=1.0-(ttime-74.6)*0.21;
float fire=0.7+0.4*sin(3.38+ttime+ft*10.0+4.0*TheGoodPosition.y+2.0*TheGoodPosition.z+2.0*FTex.z);	
ft=clamp (ft,0.0,1.0);
if (TheGoodPosition.z<5.08) ft*=0.2;
Final_Color*=1.0+ft*fire*vec4 (9.0,3.0,0.9,1.0);
}



//shadow=clamp (shadow*1.4,0.0,1.0);

TheNormal.w=0.0;
//shadow=clamp (shadow*1.0,0.0,1.0);



//Final_Color=MaterialMultiplier*vec4 (1.0);
gl_FragData[0]=TheNormal;


// Back facing culling etc.
///if (!gl_FrontFacing)  {
///	Diffuse.xyz=vec3 (0.8,0.5,0.1);
///	TheNormal.w=1.0;
///}

// cube mapping
///Final_Color=texture (texture2d_cube,nnormal.xyz);
if (isBigTree>0.5)
Final_Color*=vec4 (0.08,0.07,0.08,1.0)*0.8;

if (isLeaf>0.5)
{
	Final_Color*=1.0+clamp (1.0*sin (3.0*TheGoodPosition.x-2.2*ttime)*sin (5.0*TheGoodPosition.y),0.0,1.0);
	Final_Color*=1.0+clamp (4.3*sin (8.0*TheGoodPosition.x)*sin (8.0*TheGoodPosition.y+3.1*ttime)*sin (4.0*TheGoodPosition.z),0.0,4.0);
Final_Color*=vec4 (1.3,0.4+0.15*sin(1.0*TheGoodPosition.z+ttime),0.1,1.0);
}

//if (isBigTree>0.5) Final_Color*=vec4 (0.08,0.07,0.08,1.0)*0.8;

gl_FragData[1]=Final_Color;

// Depth fragment 
///gl_FragDepth=gl_FragCoord.z+0.02*ftex;
}














