#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 vec4 position;
varying vec4 projection_position;
varying vec4 ShadowPosZ;
varying vec4 Color;

varying vec4 projection_from_camera;

varying vec2 UVcoordinates;


uniform mat4 ProjectionMatrix;
				uniform sampler2D texture2d_1;
				uniform sampler2D texture2d_2;
				uniform sampler2D texture2d_reflection;
				uniform sampler2D texture2d_3;
				uniform sampler2D texture2d_chess;
				uniform sampler2D texture2d_blob;


				uniform sampler2D texture2d_paper;
				uniform sampler2D texture2d_texturedblob;

				/*				uniform sampler3D texture3d_2;
				uniform sampler1D texture_transfer_function;
				uniform sampler1D texture_palette_function;

					
				uniform float3 VolumeSize;
				uniform float3 RelativeSize;
				uniform float3 Registration_Offset;
				uniform float pet_alpha_blending;
				uniform float3 MousePos;
				uniform int Projection_mode;
uniform float3 InVolumePosition;
				uniform float3 Windowing_Levels;

				uniform float isosurface;
uniform float Sharpening;

*/

uniform float timer1;
uniform float ttimer2;

	uniform float PosY;
uniform float istank;
uniform float ttime;
varying vec4 OriginalPos;

void main (void) 
{

vec4 Final_Color;
	// discard segments
//if (projection_position.y<-0.746) if (sin(projection_position.z*6.5)*cos(projection_position.x*6.5)>0.7) discard;


if (istank<0.5)
if (sin(projection_position.x*5.5)*sin(projection_position.y*7.0)*cos(projection_position.z*6.5)>0.3)  discard;

if (istank>1.5)
if (sin(OriginalPos.x*4.0*5.5)*sin(OriginalPos.y*4.5*7.0)*cos(OriginalPos.z*4.0*6.5)>0.3)  discard;

///if (position.y<0.5)	if (position.z<0.5)	if (position.y>0.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,0.0,1.0));
dott=clamp (dott,0.0,1.0);
dott=pow(dott,2.0);
float4 Diffuse_Color=vec4 (dott)*vec4 (1.0,0.5,0.3,1.0)*0.2;

// 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=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,PosY);
H=normalize (H);
dott=dot(normalized_normal,H);
dott=clamp (dott,0.0,1.0);
dott=pow(dott,32.0);
Specular_Color=vec4 (dott)*vec4 (1.0,0.6,0.4,0.6)*3.0;


H=vec3 (-1.65,0,1.0)+vec3 (0.3,1.89,0.28);
H=normalize (H);
dott=dot(normalized_normal,H);
dott=clamp (dott,0.0,1.0);
dott=pow(dott,32.0);
Specular_Color=vec4 (dott)*vec4 (0.4,0.8,1.0,0.6)*0.2;

// combine all
vec4 Combine_Color=Diffuse_Color*1.0+4.0*Specular_Color;
Combine_Color*=3.3;



// soft shadow mapping
float shadow=1.0;
float divv=(ShadowPosZ.z+0.000)/ShadowPosZ.w;
if (istank<0.5) 
if (ShadowPosZ.w>0.0)
{
	for (int r=0;r<1;r++)
	{
	float Shadow=texture2D (texture2d_2,projection_pos.st+1.1*-PosY*6.11*float2 (-0.0002*float (r),-0.0002*float (r))).z;
	if (0.00202+Shadow-1.96*0.001<divv) shadow-=0.520;
	}
}
//shadow=1.0;
//Final_Color=vec4 (shadow);
// texture mapping
float4 ftex=tex2D (texture2d_3,UVcoordinates.xy*0.2+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,UVcoordinates.xy*0.2);
//ftexrefl+=tex2D (texture2d_paper,UVcoords2.xy*0.03)*vec4 (0.2,0.5,1.0,1.0)*0.5;
//*vec4 (0.3,0.7,1.0,1.0);
//ftexrefl=ftexrefl+(2.0*TheNormal.yxzz-ftexrefl)*0.37;


Final_Color=ftexrefl*0.6+Combine_Color;



float dd=sin(projection_position.z*1.4+0.0*ttime);


//dd=sin(length (projection_position.zx)*1.4+0.0*ttime);

dd=clamp (dd,0.0,1.0);
dd*=1.205;
dd=pow (dd,8.0)*1.0+0.2;
//dd=0
if (istank<0.5) 
if (projection_position.y>-0.746) dd=0.3;
//dd*=0.7;

if (istank>1.5) 
dd=0.4;


Final_Color*=dd*vec4 (0.7,0.9,1.0,1.0)*0.8;
if (istank>1.5) Final_Color*=vec4 (1.4,1.1,1.0,1.0)*1.0;
//Final_Color*=Combine_Color;

Final_Color*=0.6+tex2D (texture2d_blob,projection_from_camera.st*0.015+vec2 (0.46))*6.0*vec4 (1.0,1.0,1.0,1.0);


Final_Color+=0.4*vec4 (0.0,0.2,0.35,1.0)*(0.5+0.4*sin(3.0*ttime+projection_position.y*0.5+normal.x*3.0+normal.z*3.0));


//ftexrefl=tex2D (texture2d_reflection,vec2 (0.5)+0.50*projection_from_camera.st/projection_from_camera.w);
//Final_Color=Final_Color+(ftexrefl-Final_Color)*PosY;

//Final_Color*=1.0+(tex2D (texture2d_blob,projection_from_camera.st*0.01+vec2 (0.5*0.37)*PosY+0.163*ftex.xy)*1.2*vec4 (0.4,0.7,1.0,1.0))*interp;

}






//Final_Color=vec4 (0.3);
//Final_Color=Final_Color+(TheNormal.zxyy-Final_Color)*0.03;


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

dpth=clamp (dpth,0.0,1.0);
//if (Color.x>0.9)  dpth=1.0;
Final_Color*=dpth;


// normal
//Final_Color=Final_Color+(vec4 (0.3)-Final_Color)*PosY;
//Final_Color=vec4 (1.3);


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

TheNormal.w=1.0-shadow;
//TheNormal.w=0.5;
shadow=clamp (shadow*1.0,0.0,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;
}














