#include "../PixelLighting_PS.h"

// main֐
PS_OUTPUT main( PS_INPUT PSInput )
{
	PS_OUTPUT PSOutput ;
	float4 TextureDiffuseColor ;
	float4 TextureSpecularColor ;
	float4 ToonSpecularGradColor ;
	float4 ToonDiffuseGradColor ;
	float4 ToonSphereMapColor ;
	float4 ToonRGBtoVMaxRGBVolumeColor ;
	
	float DiffuseAngleGen ;
	float4 TotalDiffuse ;
	float4 TotalSpecular ;
	float4 TotalLightDiffuse ;
	float3 TotalAmbient ;
	float TotalAngleGen ;
	float Temp ;
	float3 TempF3 ;
	float4 TempF4 ;
	float3 Normal ;
	float3 V_to_Eye ;
	float3 VNrm ;
	float3 VTan ;
	float3 VBin ;
	float3 lLightTemp ;
	float lLightDistancePow2 ;
	float lLightGen ;
	float3 lLightDir ;
	float lLightDirectionCosA ;
	float3 ShadowRate ;
	float ShadowGen ;

#if SHADOWMAP
	float2 DepthTexCoord ;
	float4 TextureDepth ;
//	float4 variance_md_p_pmax ;
#endif
	
#if SUBTEXTUREMODE != 0
	float4 SubTextureColor;
#endif  // SUBTEXTUREMODE != 0

	// ڐE]@E@𐳋K
	VNrm = normalize( PSInput.VNormal ) ;
#ifdef BUMPMAP
	VTan = normalize( PSInput.VTan ) ;
	VBin = normalize( PSInput.VBin ) ;
#endif // BUMPMAP

#ifdef BUMPMAP
	// _W王_ւ̃xNgڒԂɓe㐳Kĕۑ
	TempF3.x = dot( VTan, -PSInput.VPosition.xyz ) ;
	TempF3.y = dot( VBin, -PSInput.VPosition.xyz ) ;
	TempF3.z = dot( VNrm, -PSInput.VPosition.xyz ) ;
	V_to_Eye = normalize( TempF3 ) ;
#else // BUMPMAP
	// _W王_ւ̃xNg𐳋K
	V_to_Eye = normalize( -PSInput.VPosition ) ;
#endif // BUMPMAP

	// @̏
	#if BUMPMAP
		// @ 0`1 ̒l -1.0`1.0 ɕϊ
		Normal = ( tex2D( NormalMapTexture, PSInput.TexCoords0_1.xy ).rgb - cfZeroHalfOneTwo.y ) * cfZeroHalfOneTwo.w ;
	#else // BUMPMAP
		Normal = normalize( PSInput.VNormal ) ;
	#endif // BUMPMAP

	// fBt[YeNX`J[擾
	TextureDiffuseColor = tex2D( DiffuseMapTexture, PSInput.TexCoords0_1.xy ) ;
	
#ifdef INVERSE_COLOR
	TextureDiffuseColor.rgb = 1.0f - TextureDiffuseColor.rgb;
#endif

#ifdef USE_SPE
	#ifdef USE_SPETEX
	// fXyLeNX`J[擾
	TextureSpecularColor = tex2D( SpecularMapTexture, PSInput.TexCoords0_1.xy ) ;
	#endif // USE_SPETEX
#endif // USE_SPE

#if SUBTEXTUREMODE != 0
	// TueNX`J[擾
	SubTextureColor = tex2D( SubTexture, PSInput.TexCoords0_1.zw );
#endif  // SUBTEXTUREMODE != 0

	// TueNX`J[ƃfBt[YeNX`J[̊|킹
#if SUBTEXTUREMODE == 1  // uh( MV1_LAYERBLEND_TYPE_TRANSLUCENT + 1 )
	TextureDiffuseColor.rgb = lerp( TextureDiffuseColor.rgb, SubTextureColor.rgb, SubTextureColor.a );
#endif // SUBTEXTUREMODE == 1

#if SUBTEXTUREMODE == 2  // Z( MV1_LAYERBLEND_TYPE_ADDITIVE + 1 )
	TextureDiffuseColor.rgb += SubTextureColor.rgb;
#endif // SUBTEXTUREMODE == 2

#if SUBTEXTUREMODE == 3  // Z( MV1_LAYERBLEND_TYPE_MODULATE + 1 )
	TextureDiffuseColor.rgb *= SubTextureColor.rgb;
#endif // SUBTEXTUREMODE == 3

#if SUBTEXTUREMODE == 4  // Z~Q( MV1_LAYERBLEND_TYPE_MODULATE2 + 1 )
	TextureDiffuseColor.rgb *= SubTextureColor.rgb * 2.0f;
#endif // SUBTEXTUREMODE == 4

	// Cggꍇ *******************************************************************( Jn )

	// fBt[YJ[ƃXyLJ[̒~ϒl
	TotalDiffuse = cfZeroHalfOneTwo.x ;
#ifdef USE_SPE
	TotalSpecular = cfZeroHalfOneTwo.x ;
#endif // USE_SPE
	
#if TOON
	#if TOON == 1
		TotalLightDiffuse = cfZeroHalfOneTwo.x ;
	#else // TOON == 1
		TotalAmbient = cfZeroHalfOneTwo.x ;
		TotalAngleGen = cfZeroHalfOneTwo.x ;
	#endif
#endif // TOON

	#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_ShadowMap3PosX.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.Fog_ShadowMap3PosZ.y           <  0.0f || PSInput.Fog_ShadowMap3PosZ.y           > 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.Fog_ShadowMap3PosZ.y - cfShadowMap2_Enbl1_2_ShadowMap3_DAdj_Grad.w, PSInput.Fog_ShadowMap3PosZ.y, 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


	%Base_3D_PixelLighting_PS_Light.txt%$0$
	%Base_3D_PixelLighting_PS_Light.txt%$1$
	%Base_3D_PixelLighting_PS_Light.txt%$2$
	%Base_3D_PixelLighting_PS_Light.txt%$3$
	%Base_3D_PixelLighting_PS_Light.txt%$4$
	%Base_3D_PixelLighting_PS_Light.txt%$5$






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

	#if TOON != 2
		// TotalDiffuse = CgfBt[YJ[~ϒl + ( }eÃArGgJ[ƃO[oArGgJ[Ẑƃ}eAG~bVuJ[Z )
		TotalDiffuse += cfAmbient_Emissive ;
	#else // TOON != 2
		// ArGgJ[̒~ϒl += }eÃArGgJ[ƃO[oArGgJ[Ẑƃ}eAG~bVuJ[Z
		TotalAmbient += cfAmbient_Emissive.rgb ;
	#endif  // TOON != 2

	#ifdef USE_SPE
		#if TOON
			#if TOON == 1
				// gD[P̎̏o͌vZ
				ToonSpecularGradColor = tex2D( ToonSpecularGradTexture, max( TotalSpecular.b, max( TotalSpecular.r, TotalSpecular.g ) ) ) ;
				
				#ifdef USE_SPETEX
					TextureSpecularColor.rgb *= ToonSpecularGradColor.rgb ;
				#else  // USE_SPETEX
					TextureSpecularColor = ToonSpecularGradColor ;
				#endif // USE_SPETEX
				
				TextureSpecularColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalSpecular.rgb ).rgb * PSInput.Specular.rgb ;

				TextureDiffuseColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalLightDiffuse.rgb ).rgb * PSInput.Diffuse.rgb ;

				ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, max( TotalDiffuse.b, max( TotalDiffuse.r, TotalDiffuse.g ) ) ) ;

				#if TOON_DIFOP_MUL
					PSOutput.Color0 = TextureDiffuseColor * ToonDiffuseGradColor ;
				#endif // TOON_DIFOP_MUL
				#if TOON_DIFOP_TRANS
					PSOutput.Color0 = lerp( TextureDiffuseColor, ToonDiffuseGradColor, ToonDiffuseGradColor.a ) ;
				#endif // TOON_DIFOP_TRANS

				#if TOON_SPEOP_ADD
					PSOutput.Color0 = PSOutput.Color0 + TextureSpecularColor ;
				#endif // TOON_SPEOP_ADD
				#if TOON_SPEOP_TRANS
					PSOutput.Color0 = lerp( PSOutput.Color0, TextureSpecularColor, TextureSpecularColor.a ) ;
				#endif // TOON_SPEOP_TRANS

				PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a ;

				#if TOON_DIFOP_MUL
					PSOutput.Color0.a *= ToonDiffuseGradColor.a ;
				#endif // TOON_DIFOP_MUL
				
			#else  // TOON == 1
				// gD[Q̎̏o͌vZ
				ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, TotalAngleGen ) ;

				// o = saturate( saturate( ArGgJ[̒~ϒl + }eÃfBt[YJ[ * Cg̃fBt[YJ[̒~ϒl ) * eNX`Of[VJ[ + XyLJ[~ϒl * }eÃXyLJ[ ) * eNX`J[
				PSOutput.Color0.rgb = saturate( saturate( TotalDiffuse.rgb * PSInput.Diffuse.rgb + TotalAmbient ) * ToonDiffuseGradColor.rgb + PSInput.Specular.rgb * TotalSpecular.rgb ) * TextureDiffuseColor.rgb ;
				
				#if TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD
					// XtBA}bv̐F擾
					TempF3 = Normal * float3( 0.5f, -0.5f, 0.0f ) + cfZeroHalfOneTwo.yyy ;
					ToonSphereMapColor = tex2D( ToonSphereMapTexture, TempF3.xy ) ;
					
					#if TOON_SPHEREOP_MUL
						// XtBA}bv̐Fo͂ɏZ
						PSOutput.Color0.rgb *= ToonSphereMapColor.rgb ;
					#endif // TOON_SPHEREOP_MUL
					
					#if TOON_SPHEREOP_ADD
						// XtBA}bv̐Fo͂ɉZ
						PSOutput.Color0.rgb += ToonSphereMapColor.rgb ;
					#endif // TOON_SPHEREOP_ADD
					
				#endif // TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD

				#if TOON_SPHEREOP_MUL

					// o̓At@ = eNX`At@ * FactorAt@ * _At@ * XtBA}bvAt@
					PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a * ToonSphereMapColor.a ;

				#else // TOON_SPHEREOP_MUL

					// o̓At@ = eNX`At@ * FactorAt@ * _At@
					PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a ;

				#endif // TOON_SPHEREOP_MUL

			#endif   // TOON == 1
		#else  // TOON

			#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 ;
			PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a ;

		#endif // TOON

	#else  // USE_SPE

		#if TOON
			#if TOON == 1
				ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, max( TotalDiffuse.b, max( TotalDiffuse.r, TotalDiffuse.g ) ) ) ;
				TextureDiffuseColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalLightDiffuse.rgb ).rgb * PSInput.Diffuse.rgb ;

				#if TOON_DIFOP_MUL
					// o̓J[ = eNX`J[ * fBt[YJ[~ϒl * Of[VJ[
					PSOutput.Color0 = TextureDiffuseColor * ToonDiffuseGradColor ;
				#endif // TOON_DIFOP_MUL
				#if TOON_DIFOP_TRANS
					// o̓J[ = Of[VJ[ * Of[V + ( 1 - Of[V ) * ( eNX`J[ * fBt[YJ[~ϒl )
					PSOutput.Color0 = lerp( TextureDiffuseColor, ToonDiffuseGradColor, ToonDiffuseGradColor.a ) ;
				#endif // TOON_DIFOP_TRANS

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

				// Z̏ꍇ̓lOf[VƏZ
				#if TOON_DIFOP_MUL
					PSOutput.Color0.a *= ToonDiffuseGradColor.a ;
				#endif // TOON_DIFOP_MUL

			#else	// TOON == 1
				// gD[Q̎̏o͌vZ
				ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, TotalAngleGen ) ;

				// o = ( ArGgJ[̒~ϒl + }eÃfBt[YJ[ * Cg̃fBt[YJ[̒~ϒl ) * eNX`Of[VJ[ * eNX`J[
				PSOutput.Color0.rgb = saturate( TotalDiffuse.rgb * PSInput.Diffuse.rgb + TotalAmbient.rgb ) * ToonDiffuseGradColor.rgb * TextureDiffuseColor.rgb ;

				#if TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD
					// XtBA}bv̐F擾
					TempF3 = Normal * float3( 0.5f, -0.5f, 0.0f ) + cfZeroHalfOneTwo.yyy ;
					ToonSphereMapColor = tex2D( ToonSphereMapTexture, TempF3.xy ) ;
					
					#if TOON_SPHEREOP_MUL
						// XtBA}bv̐Fo͂ɏZ
						PSOutput.Color0.rgb *= ToonSphereMapColor.rgb ;
					#endif // TOON_SPHEREOP_MUL
					
					#if TOON_SPHEREOP_ADD
						// XtBA}bv̐Fo͂ɉZ
						PSOutput.Color0.rgb += ToonSphereMapColor.rgb ;
					#endif // TOON_SPHEREOP_ADD
					
				#endif // TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD

				#if TOON_SPHEREOP_MUL

					PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a * ToonSphereMapColor.a ;

				#else // TOON_SPHEREOP_MUL

					PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a ;

				#endif // TOON_SPHEREOP_MUL

			#endif		// TOON == 1
		#else  // TOON
			// o̓J[ = TotalDiffuse * eNX`J[
			PSOutput.Color0.rgb = TotalDiffuse.rgb * TextureDiffuseColor.rgb ;

			// o̓ = eNX` * fBt[Y * 惿
			PSOutput.Color0.a = TextureDiffuseColor.a * cfFactorColor.a * PSInput.Diffuse.a ;
		#endif // TOON

	#endif // USE_SPE

	// tHO
	PSOutput.Color0.rgb = lerp( cfFogColor.rgb, PSOutput.Color0.rgb, saturate( PSInput.Fog_ShadowMap3PosZ.x ) );

	// At@ZJ[
	if( cfMulAlphaColor.x > 0.5f )
	{
		PSOutput.Color0.rgb *= PSOutput.Color0.a;
	}

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


	// Cggꍇ *******************************************************************( I )

	return PSOutput ;
}

