//------------------------------------------------------------
// 似非cel_paint

//------------------------------------------------------------
uniform sampler2D mmv_tex0; // テクスチャ
uniform sampler2D mmv_tex2; // EXテクスチャ1
uniform sampler2D mmv_tex3; // EXテクスチャ2
uniform sampler2DShadow	mmv_shadowbuffer;

//------------------------------------------------------------
varying vec3 VERTEX_NORMAL;	// 法線ベクトル
varying vec3 VERTEX_LIGHT;	// ライトベクトル
varying vec3 VERTEX_LIGHT2;	// ライトベクトル
varying vec3 VERTEX_EYE;	// 視線ベクトル

// ------------------------------------------------------------
// フラグメントシェーダプログラム
// ------------------------------------------------------------
void main( void )
{
	vec3	N	= normalize(VERTEX_NORMAL);	// 法線ベクトル
	vec3	L	= normalize(VERTEX_LIGHT);	// ライトベクトル
	vec3	L2	= normalize(VERTEX_LIGHT2);	// ライトベクトル
	vec3	E	= normalize(VERTEX_EYE);	// 視線ベクトル
	vec3	R	= reflect( L, N );			// 反射ベクトル
	vec3	R2	= reflect( L2, N );			// 反射ベクトル
	
	//色
	vec4	tex		= texture2D( mmv_tex0, gl_TexCoord[ 0 ].st );
	vec3	color	= tex.rgb;
	float	a		= tex.a;
//	vec3	color	= gl_FrontMaterial.diffuse.rgb;	//マテリアル色
//	float	a		= gl_FrontMaterial.diffuse.a;	//不透明度

	//
//	float	lumi	= texture2D( mmv_tex3, gl_TexCoord[ 0 ].st ).r;

	//
	float	offset	= 1.5 / 2048.0;
	float	ret		= 0.0;

	vec4	coord	=	gl_TexCoord[ 1 ];
	coord.z	= coord.z - 0.005;
	
	ret	= ret + shadow2DProj( mmv_shadowbuffer, coord + vec4( 0.0, 0.0, 0.0, 0.0 ) ).r;
	ret	= ret + shadow2DProj( mmv_shadowbuffer, coord + vec4( offset, offset, 0.0, 0.0 ) ).r;
	ret	= ret + shadow2DProj( mmv_shadowbuffer, coord + vec4( -offset, offset, 0.0, 0.0 ) ).r;
	ret	= ret + shadow2DProj( mmv_shadowbuffer, coord + vec4( offset, -offset, 0.0, 0.0 ) ).r;
	ret	= ret + shadow2DProj( mmv_shadowbuffer, coord + vec4( -offset, -offset, 0.0, 0.0 ) ).r;
	ret	= ret / 5.0;

	float	amb;
	amb	= pow( 1.0 - dot( N, -E ), 3.0 );
	
	//
	float	dif		= max( dot( N, L ), 0.0 ) * 0.65;	//拡散強度（光の強さ）
	float	dif2	= max( dot( N, L2 ), 0.0 ) * 0.25;	//拡散強度（光の強さ）
	dif	= min( ( dif + dif2 ) * ret + amb, 1.0 );
	
	dif	= dif * 0.8 + 0.2;
	
	dif	= dif * ( 254.0 / 256.0 ) + ( 1.0 / 256.0 );	//オフセット
	
	vec4	cel_tex	= texture2D( mmv_tex2, vec2( dif, 0.5 ) );
	vec3	cel1	= vec3( cel_tex.a );
	vec3	cel2	= cel_tex.rgb;
	

	//スペキュラ
	vec4	s_tex		= texture2D( mmv_tex3, gl_TexCoord[ 0 ].st );
	
	float	powr	= gl_FrontMaterial.shininess;	//反射の強さ
	float	s_dif	= gl_FrontMaterial.specular.r;	//反射光(rgb同じ)

	powr	= powr + ( s_tex.r * 400.0 );

	
	float	spec	= pow( max( dot( R, E ), 0.0 ), powr ) * s_dif;
	spec	= spec + pow( max( dot( R2, E ), 0.0 ), powr ) * s_dif;
	
	
//	if( dot( E, N ) > -0.1 )	gl_FragColor	= vec4( 0, 0, 0, 1.0 );
//	else						gl_FragColor	= vec4( color * cel1 + cel2 + vec3( spec ), a );	//出力
	gl_FragColor	= vec4( color * cel1 + cel2 + vec3( spec ), a );	//出力
}
