Damn, I hate posting shaders on here. It's too messy.
Code:
TMULTI_VS_OUT TMulti_VS(
float4 inPos : POSITION,
float3 inNormal : NORMAL,
float3 inTangent : TANGENT,
float2 inTCoord : TEXCOORD0)
{
TMULTI_VS_OUT Out;
float3x3 worldToTangentSpace;
worldToTangentSpace[0] = mul(inTangent, matWorld);
worldToTangentSpace[1] = mul(cross(inTangent, inNormal), matWorld);
worldToTangentSpace[2] = mul(inNormal, matWorld);
Out.Pos = mul(inPos, matWorldViewProj);
float3 N = normalize(mul(inNormal, matWorldInv));
float3 P = mul(inPos, matWorld);
Out.Sun = mul(worldToTangentSpace, -vecSunDir);
float3 Viewer = P - vecViewPos;
Out.View = mul(worldToTangentSpace, -Viewer);
Out.Fog = DoFog(P);
Out.tCoord = inTCoord.xy;
return Out;
}
float4 TMulti_PS(TMULTI_PS_IN In): COLOR
{
float4 MaskColor = tex2D(mapMask, In.tCoord);
float4 NormalColor = 2*(tex2D(mapNormal, In.tCoord)-0.5);
float4 RColor = tex2D(mapRC, In.tCoord * 10);
float4 GColor = tex2D(mapGC, In.tCoord * 10);
float4 BColor = tex2D(mapBC, In.tCoord * 10);
float4 RNormal = 2*(tex2D(mapRN, In.tCoord * 10)-0.5);
float4 GNormal = 2*(tex2D(mapGN, In.tCoord * 10)-0.5);
float4 BNormal = 2*(tex2D(mapBN, In.tCoord * 10)-0.5);
float3 ViewDir = normalize(In.View);
float4 outColor = 0.5f;
outColor = lerp(outColor, RColor, MaskColor.r);
outColor = lerp(outColor, GColor, MaskColor.g);
outColor = lerp(outColor, BColor, MaskColor.b);
float3 outNormal = NormalColor;
outNormal = lerp(outNormal, RNormal, MaskColor.r);
outNormal = lerp(outNormal, GNormal, MaskColor.g);
outNormal = lerp(outNormal, BNormal, MaskColor.b);
float3 sunDir = In.Sun;
float4 sunDiff = saturate(dot(outNormal, sunDir));
float4 sunShadow = saturate(4 * sunDiff);
float4 sunOut = (outColor*sunDiff) * sunShadow * vecSunDiffuse;
sunOut.a = 1.0f;
return sunOut;
}