#include "../VertexLighting_PS.h"

// main֐
PS_OUTPUT main( PS_INPUT PSInput )
{
	PS_OUTPUT PSOutput ;
	float4 TextureDiffuseColor ;
	float4 TextureSpecularColor ;
	float3 Normal ;
	float4 TotalDiffuse ;
	float4 TotalSpecular ;
	float TotalAngleGen ;
	float DiffuseAngleGen ;
	float3 TempF3 ;
	float Temp ;
	float3 ShadowRate ;
	float ShadowGen ;
	float ParamAlpha;

#if SHADOWMAP
	float2 DepthTexCoord ;
	float4 TextureDepth ;
#endif

	ParamAlpha = PSInput.Diffuse.a ;

	TextureDiffuseColor = tex2D( DiffuseMapTexture, PSInput.TexCoords0_1.xy ) ;

#ifdef INVERSE_COLOR
	TextureDiffuseColor.rgb = 1.0f - TextureDiffuseColor.rgb;
#endif
	
#ifdef USE_SPE
	#ifdef USE_SPETEX
	TextureSpecularColor = tex2D( SpecularMapTexture, PSInput.TexCoords0_1.xy ) ;
#ifdef INVERSE_COLOR
	TextureSpecularColor.rgb = 1.0f - TextureSpecularColor.rgb;
#endif
	#endif // USE_SPETEX
#endif // USE_SPE

	// CggȂꍇ̓J[̂܂܏o *****************************************( Jn )
	#ifndef LG_USE

		// VhE}bvւ̕` *********************************************************( Jn )
		#if SHADOWMAP_DRAW
			// o̓ = eNX` * fBt[Y * 惿
			PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
			
			// ylFƂďo
			PSOutput.Color0.r = PSInput.ShadowMap1Pos_ShadowMap3PosX.z;
			PSOutput.Color0.g = 0.0f ;
			PSOutput.Color0.b = 0.0f ;
		
		// VhE}bvւ̕` *********************************************************( I )
		#else // SHADOWMAP_DRAW
		
			#ifdef USE_SPE

				#ifdef USE_SPETEX

					PSOutput.Color0 = PSInput.Specular * TextureSpecularColor + PSInput.Diffuse * TextureDiffuseColor ;

				#else  // USE_SPETEX

					PSOutput.Color0 = PSInput.Specular + PSInput.Diffuse * TextureDiffuseColor ;

				#endif // USE_SPETEX

			#else  // USE_SPE

				PSOutput.Color0 = PSInput.Diffuse * TextureDiffuseColor ;

			#endif // USE_SPE

			PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
			
		#endif // SHADOWMAP_DRAW

	// CggȂꍇ̓J[̂܂܏o *****************************************( I )
	#else // LG_USE
	// Cggꍇ *******************************************************************( Jn )

		// ov}bv or tHVF[fBȌꍇ =========================================( Jn )
		#if BUMPMAP || PHONG

			#if BUMPMAP

				// @ 0`1 ̒l -1.0`1.0 ɕϊ
				Normal = ( tex2D( NormalMapTexture, PSInput.TexCoords0_1.xy ).rgb - cfZeroHalfOneTwo.y ) * cfZeroHalfOneTwo.w ;

			#else // BUMPMAP

				Normal = PSInput.Normal_Fog.xyz ;

			#endif // BUMPMAP


			#ifdef    PHONG
				Normal = normalize( Normal ) ;
			#endif

			#if	SHADOWMAP
				// _̃eNX`Wl͈͓̏ꍇ̂ݏ
				if( PSInput.ShadowMap1Pos_ShadowMap3PosX.x < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.x > 1.0f ||
					PSInput.ShadowMap1Pos_ShadowMap3PosX.y < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.y > 1.0f ||
					PSInput.ShadowMap1Pos_ShadowMap3PosX.z <  0.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.z > 1.0f )
				{
					ShadowRate.x = 1.0f;
				}
				else
				{
					// [xeNX`̍WZo
					// PSInput.ShadowMap1Pos_ShadowMap3PosX.xy  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
					DepthTexCoord.x = ( PSInput.ShadowMap1Pos_ShadowMap3PosX.x + 1.0f ) / 2.0f;

					// y͍Xɏ㉺]
					DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap1Pos_ShadowMap3PosX.y + 1.0f ) / 2.0f;

					// [xobt@eNX`[x擾
					TextureDepth = tex2D( ShadowMap1Texture, DepthTexCoord );

					// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
					ShadowRate.x = smoothstep( PSInput.ShadowMap1Pos_ShadowMap3PosX.z - cfShadowMap1_DAdj_Grad_Enbl0_1.y, PSInput.ShadowMap1Pos_ShadowMap3PosX.z, TextureDepth.r + cfShadowMap1_DAdj_Grad_Enbl0_1.x ) ;
				}

				// _̃eNX`Wl͈͓̏ꍇ̂ݏ
				if( PSInput.ShadowMap2Pos_ShadowMap3PosY.x < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.x > 1.0f ||
					PSInput.ShadowMap2Pos_ShadowMap3PosY.y < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.y > 1.0f ||
					PSInput.ShadowMap2Pos_ShadowMap3PosY.z <  0.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.z > 1.0f )
				{
					ShadowRate.y = 1.0f;
				}
				else
				{
					// [xeNX`̍WZo
					// PSInput.ShadowMap2Pos_ShadowMap3PosY.xy  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
					DepthTexCoord.x = ( PSInput.ShadowMap2Pos_ShadowMap3PosY.x + 1.0f ) / 2.0f;

					// y͍Xɏ㉺]
					DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap2Pos_ShadowMap3PosY.y + 1.0f ) / 2.0f;

					// [xobt@eNX`[x擾
					TextureDepth = tex2D( ShadowMap2Texture, DepthTexCoord );

					// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
					ShadowRate.y = smoothstep( PSInput.ShadowMap2Pos_ShadowMap3PosY.z - cfShadowMap1_Enb2_ShadowMap2_DAdj_Grad_Enbl0.z, PSInput.ShadowMap2Pos_ShadowMap3PosY.z, TextureDepth.r + cfShadowMap1_Enb2_ShadowMap2_DAdj_Grad_Enbl0.y ) ;
				}

				// _̃eNX`Wl͈͓̏ꍇ̂ݏ
				if( PSInput.ShadowMap1Pos_ShadowMap3PosX.w < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.w > 1.0f ||
					PSInput.ShadowMap2Pos_ShadowMap3PosY.w < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.w > 1.0f ||
					PSInput.V_to_Eye_ShadowMap3PosZ.w      <  0.0f || PSInput.V_to_Eye_ShadowMap3PosZ.w      > 1.0f )
				{
					ShadowRate.z = 1.0f;
				}
				else
				{
					// [xeNX`̍WZo
					// PSInput.ShadowMap1Pos_ShadowMap3PosX.w  PSInput.ShadowMap2Pos_ShadowMap3PosY.w  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
					DepthTexCoord.x = ( PSInput.ShadowMap1Pos_ShadowMap3PosX.w + 1.0f ) / 2.0f;

					// y͍Xɏ㉺]
					DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap2Pos_ShadowMap3PosY.w + 1.0f ) / 2.0f;

					// [xobt@eNX`[x擾
					TextureDepth = tex2D( ShadowMap3Texture, DepthTexCoord );

					// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
					ShadowRate.z = smoothstep( PSInput.V_to_Eye_ShadowMap3PosZ.w - cfShadowMap2_Enbl1_2_ShadowMap3_DAdj_Grad.w, PSInput.V_to_Eye_ShadowMap3PosZ.w, TextureDepth.r + cfShadowMap2_Enbl1_2_ShadowMap3_DAdj_Grad.z ) ;
				}

			#else // SHADOWMAP
				ShadowRate.x = 1.0f ;
				ShadowRate.y = 1.0f ;
				ShadowRate.z = 1.0f ;
			#endif // SHADOWMAP

			// fBt[YJ[ƃXyLJ[̒~ϒl
			TotalDiffuse = cfZeroHalfOneTwo.x ;
			TotalSpecular = cfZeroHalfOneTwo.x ;




			%Base_3D_VertexLighting_PS_Light.txt%$0$
			%Base_3D_VertexLighting_PS_Light.txt%$1$
			%Base_3D_VertexLighting_PS_Light.txt%$2$









			// o̓J[vZ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( Jn )

			// TotalDiffuse = CgfBt[YJ[~ϒl + ( }eÃArGgJ[ƃO[oArGgJ[Ẑƃ}eAG~bVuJ[Z )
			TotalDiffuse += cfAmbient_Emissive ;

			#ifdef USE_SPE
				#ifdef USE_SPETEX
					// TextureSpecularColor = Cg̃XyLJ[~ϒl * XyLJ[ * XyLeNX`J[
					TextureSpecularColor = tex2D( SpecularMapTexture, PSInput.TexCoords0_1.xy ) * TotalSpecular * PSInput.Specular ;
				#else  // USE_SPETEX
					// TextureSpecularColor = Cg̃XyLJ[~ϒl * XyLJ[
					TextureSpecularColor = TotalSpecular * PSInput.Specular ;
				#endif // USE_SPETEX

				// o̓J[ = TotalDiffuse * eNX`J[ + TextureSpecularColor
				PSOutput.Color0.rgb = TextureDiffuseColor.rgb * TotalDiffuse.rgb + TextureSpecularColor.rgb ;

				// o̓ = eNX` * fBt[Y * 惿
				PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

			#else  // USE_SPE

				// o̓J[ = TotalDiffuse * eNX`J[
				PSOutput.Color0.rgb = TotalDiffuse.rgb * TextureDiffuseColor.rgb ;

				// o̓ = eNX` * fBt[Y * 惿
				PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

			#endif // USE_SPE

			// o̓J[vZ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( I )


		// ov}bv or tHVF[fBȌꍇ =========================================( I )
		#else  // BUMPMAP || PHONG
			// ov}bv or tHVF[fBOł͂Ȃꍇ ===================================( Jn )

			#ifdef USE_SPE

				#ifdef USE_SPETEX

					PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb + TextureSpecularColor.rgb * PSInput.Specular.rgb ;

				#else  // USE_SPETEX

					PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb + PSInput.Specular.rgb ;

				#endif // USE_SPETEX

			#else  // USE_SPE

				PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb ;

			#endif // USE_SPE

			PSOutput.Color0.a   = TextureDiffuseColor.a   * ParamAlpha ;

		#endif // BUMPMAP || PHONG
		// ov}bv or tHVF[fBOł͂Ȃꍇ ===================================( I )

	#endif // LG_USE
	// Cggꍇ *******************************************************************( I )

#ifdef PRE_MUL_ALPHA
	PSOutput.Color0.rgb *= PSInput.Diffuse.a ;
#endif

#ifdef MUL_X_4
	PSOutput.Color0.rgb *= 4.0f ;
#endif

#ifdef MUL_BLEND
	PSOutput.Color0 = lerp( 1.0f, PSOutput.Color0, PSOutput.Color0.a ) ;
#endif

#if SM_3
	// tHO
	PSOutput.Color0.rgb = lerp( cfFogColor.rgb, PSOutput.Color0.rgb, saturate( PSInput.Normal_Fog.w ) );
#endif // SM_3

	return PSOutput ;
}

