#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 isFish;
	uniform float RedHot;
	uniform float Beginning;
void main (void) 
{

vec4 Final_Color;

	// discard segments
		//if (sin	(TheGoodPosition.z*15.5)*sin(TheGoodPosition.x*15.5)*cos(TheGoodPosition.y*15.5)>0.7) 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,1.0));
dott=clamp (dott,0.0,1.0);
dott=0.8+0.2*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<3;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.170;
	}
}

//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);
if (isSide>0.5)
{
	ftexrefl=(vec4 (0.5)+0.3*tex2D (texture2d_flower,MaterialMultiplier*UVcoordinates.xy*0.2))*vec4 (0.5,0.7,1.0,1.0);
}


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

Diffuse_Color*=vec4 (0.5)*Color;




if (isReflective>0.5)
Specular_Color=vec4 (0.0);

Final_Color=ftexrefl*Diffuse_Color+Specular_Color*0.06;
//Final_Color+=0.6*Specular_Color;
if (isFish>0.5) 
{
	Final_Color*=0.7;
	Final_Color+=0.12*1.1*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;
//*vec4 (0.8,0.9,1.1,1.0);
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 (isReflective>0.5)
{

float4 bump=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.25);;
bump.xy-=vec2 (0.23);
bump*=0.03;


	ftexrefl=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*vec2 (0.014,0.013)+vec2 (0.3,0.2));

	//ftexrefl=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*vec2 (0.003,0.03)+vec2 (0.3,0.2));
ftexrefl*=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*vec2 (0.005,0.005));
float ref=ftexrefl.x;
ref*=1.14+10.0-0.25+2.0;

//if (normalB.z>0.9) ref+=PosY;

ref=pow (ref,12.0);
ref=clamp (ref,0.2,1.0-0.36);
//ref=1.0;
//Final_Color=vec4 (Final_Color.x);
//Final_Color*=0.5;
//ref=1.0;
vec4 Refletion=ref*tex2D (texture2d_reflection,bump.xy+vec2 (0.5)+0.50*projection_from_camera.st/projection_from_camera.w);
//nal_Color=Refletion;
//ref*=PosY;
Final_Color=Final_Color+ (Refletion-Final_Color)*ref;

float4 ftexrefl2=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.15);
 ftexrefl2*=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*vec2 (0.32,0.51));
float ref2=ftexrefl2.x;


vec4 ConvColor=vec4 ( 0.1,0.4,1.0,1.0);
vec4 ConvColor2=vec4 ( 1.0,0.3,0.15,1.0);

float emu=clamp (RedHot+sin(TheGoodPosition.z*3.0),0.0,1.0);

if (emu>0.01) { 
float ftexn=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.0135).x;
emu+=emu*(0.25*sin(ttime*3.5+ftexn*15.0));
ConvColor=ConvColor+(ConvColor2-ConvColor)*emu;
}



ref2*=1.14+3.1+emu*2.0;
ref2=pow (ref2,6.0);
ref2=clamp (ref2,0.0,1.0);



//Final_Color*=vec4 (1.0)+15.0*vec4 (ref2)*vec4 (0.1,0.4,1.0,1.0);
Final_Color*=vec4 (1.0)+15.0*vec4 (ref2)*ConvColor;

if (normalB.z>0.9)
Final_Color*=vec4 (1.0,1.0,1.2,1.0);

}





}



if (isHappiness>0.5)
{
float4 ftexrefl2=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.15*0.3);
 ftexrefl2*=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.3*vec2 (0.32,0.51));
float ref2=ftexrefl2.x;
ref2*=1.14+4.1+14.0;
ref2=pow (ref2,6.0);
ref2=clamp (ref2,0.0,1.0);
Final_Color*=vec4 (1.0)+6.0*vec4 (ref2)*vec4 (1.0,0.3,0.2,1.0)*(1.3-TheGoodPosition.y*1.3);
//Final_Color*=vec4 (1.0)+2.0*vec4 (ref2)*vec4 (0.1,0.4,1.0,1.0)*(1.3-TheGoodPosition.y*0.6);
Final_Color*=1.0+1.3*Specular_Color;




}



if (isManRunning>0.5)
{

//Final_Color*=vec4 (1.0)+1.6*vec4 (1.0,0.3,0.2,1.0)*(3.3-TheGoodPosition.y*3.3);
Final_Color*=vec4 (1.0)+5.0*6.6*vec4 (1.0,0.3,0.2,1.0)*(TheGoodPosition.y*TheGoodPosition.y+0.01*1.7);
//Final_Color*=vec4 (1.0)+2.0*vec4 (ref2)*vec4 (0.1,0.4,1.0,1.0)*(1.3-TheGoodPosition.y*0.6);
Final_Color*=1.0+0.2*Specular_Color;
}


//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;
if (Beginning<3.992) 
{
vec4 Coll=tex2D (texture2d_paper,MaterialMultiplier*UVcoordinates.xy*0.35)*0.26;
Coll*=0.6+1.3*tex2D (texture2d_blob,MaterialMultiplier*projection_from_camera.st*0.13+vec2 (0.46))*1.7;


float ss=Beginning+2.0*sin(UVcoordinates.y*1.45+Coll.z*50.0)*sin(UVcoordinates.x*1.4+Coll.x*50.0);
ss=clamp (ss,0.0,1.0);
Final_Color=Coll+(Final_Color-Coll)*ss;



}

//Final_Color*=Beginning;

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


dpth=clamp (dpth,0.0,1.0);



//Final_Color=vec4(0.3);


Final_Color*=1.3*dpth;
Final_Color*=2.0;

//Final_Color.xy*=vec2 (PosY,PosY*0.5);
//Final_Color=Color;

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

TheNormal.w=1.0-shadow;
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);

gl_FragData[1]=Final_Color*shadow;

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














