//==========================================//
#define COLORMAP_TEXTURE entSkin1
#define NORMALMAP_TEXTURE entSkin2
#define INTENSMASK_TEXTURE entSkin3
#define LIGHTGRADIANT_TEXTURE mtlSkin1
//==========================================//
//#define USE_TS_NORMALMAPPING
#define USE_OS_NORMALMAPPING
#define USE_SECOND_UVSET_FOR_NORMALMAPPING
//===================//
#define USE_COLOR_INTENSITY_SHIFT
#define USE_COLOR_INTENSITY_MASK
const float max_colorintensity=4;
const float max_sunintensity=1.1;
const float min_sunintensity=0.1;
//===================//
#define USE_OUTLINES
#define USE_PIXELSIZED_OUTLINES
#define USE_COLORED_OUTLINES
const float outline_thickness=1.5;
const float3 outline_color=float3(0.5,0.6,0.8);//RGB in range 0..1 (instead of 0..255)
//===================// requires USE_COLORED_OUTLINES:
#define USE_LIGHTING_ON_OUTLINES
#define USE_TEXTURED_OUTLINES
//#define USE_ALPHA_FOR_OUTLINES
const float texoutline_brightness=0.8;//0..darker..1..brighter..
const float texoutline_intensity=2;//0..less..1..more..
//==========================================//
bool AUTORELOAD;
float4x4 matWorldViewProj;
float4x4 matWorld;
float4x4 matWorldView;
float4x4 matView;
float4 vecSunDir;
float4 vecSunColor;
float4 vecViewPort;
texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4;
texture mtlSkin1;
texture mtlSkin2;
texture mtlSkin3;
texture mtlSkin4;
sampler COLOR_SAMPLER = sampler_state { Texture = <COLORMAP_TEXTURE>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = clamp; AddressV = clamp; };
sampler LGRAD_SAMPLER = sampler_state { Texture = <LIGHTGRADIANT_TEXTURE>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = clamp; AddressV = clamp; };
#if defined(USE_TS_NORMALMAPPING) || defined(USE_OS_NORMALMAPPING)
sampler BUMP_SAMPLER = sampler_state { Texture = <NORMALMAP_TEXTURE>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = clamp; AddressV = clamp; };
#endif
#ifdef USE_COLOR_INTENSITY_SHIFT
#ifdef USE_COLOR_INTENSITY_MASK
sampler MASK_SAMPLER = sampler_state { Texture = <INTENSMASK_TEXTURE>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = clamp; AddressV = clamp; };
#endif
#endif
////////////////////////////////////////////
#ifndef USE_COLORED_OUTLINES
#undef USE_LIGHTING_ON_OUTLINES
#undef USE_TEXTURED_OUTLINES
#undef USE_ALPHA_FOR_OUTLINES
#endif
#ifdef USE_ALPHA_FOR_OUTLINES
#define USE_TEXTURED_OUTLINES
#endif
#ifdef USE_TS_NORMALMAPPING
#undef USE_OS_NORMALMAPPING
#else
#ifdef USE_OS_NORMALMAPPING
#undef USE_TS_NORMALMAPPING
#endif
#endif
#if defined(USE_TS_NORMALMAPPING) || defined(USE_OS_NORMALMAPPING)
#define USE_NORMALMAPPING
#else
#undef USE_SECOND_UVSET_FOR_NORMALMAPPING
#endif
////////////////////////////////////////////
void VS(
in float4 vPos : POSITION,
in float3 normal : NORMAL,
in float2 InTex : TEXCOORD0,
#ifdef USE_SECOND_UVSET_FOR_NORMALMAPPING
in float2 InTex2 : TEXCOORD1,
#endif
#ifdef USE_TS_NORMALMAPPING
in float4 InTangent : TEXCOORD2,
#endif
out float2 OutTex : TEXCOORD0,
#ifdef USE_SECOND_UVSET_FOR_NORMALMAPPING
out float2 OutTex2 : TEXCOORD2,
#endif
#ifndef USE_NORMALMAPPING
out float3 outnormal : TEXCOORD1,
#else
#ifdef USE_TS_NORMALMAPPING
out float3 SunDir : TEXCOORD1,
#endif
#endif
out float4 Pos : POSITION
)
{
#ifndef USE_NORMALMAPPING
outnormal=mul(normal,matWorld);
#else
#ifdef USE_TS_NORMALMAPPING
float3x3 matTangent;
matTangent[0] = mul(InTangent.xyz,matWorld);
matTangent[1] = mul(cross(InTangent.xyz,normal),matWorld)*InTangent.w;
matTangent[2] = mul(normal,matWorld);
SunDir = normalize(mul( matTangent,vecSunDir.xyz));
#endif
#endif
Pos = mul(vPos,matWorldViewProj);
OutTex = InTex;
#ifdef USE_SECOND_UVSET_FOR_NORMALMAPPING
OutTex2 = InTex2;
#endif
}
void PS(
in float2 Tex : TEXCOORD0,
#ifdef USE_SECOND_UVSET_FOR_NORMALMAPPING
in float2 Tex2 : TEXCOORD2,
#endif
#ifndef USE_NORMALMAPPING
in float3 normal : TEXCOORD1,
#else
#ifdef USE_TS_NORMALMAPPING
in float3 SunDir : TEXCOORD1,
#endif
#endif
out float4 COL :COLOR0
)
{
#ifndef USE_NORMALMAPPING
normal = normalize(normal);
#else
#ifdef USE_TS_NORMALMAPPING
vecSunDir.xyz = normalize(SunDir);
#ifndef USE_SECOND_UVSET_FOR_NORMALMAPPING
float3 normal = normalize(tex2D(BUMP_SAMPLER,Tex).xyz*2.f-1.f);
#else
float3 normal = normalize(tex2D(BUMP_SAMPLER,Tex2).xyz*2.f-1.f);
#endif
#else
matWorld[3]=float4(0,0,0,1);
#ifndef USE_SECOND_UVSET_FOR_NORMALMAPPING
float3 normal=normalize(mul(float4(tex2D(BUMP_SAMPLER,Tex).xyz*2.f-1.f,0),matWorld)).xzy;
#else
float3 normal=normalize(mul(float4(tex2D(BUMP_SAMPLER,Tex2).xyz*2.f-1.f,0),matWorld)).xzy;
#endif
normal.z*=-1.f;
#endif
#endif
COL = tex2D(COLOR_SAMPLER,Tex);
float sun_blub=dot(vecSunDir,normal)*0.5f+0.5f;
float sun_diff=tex1D(LGRAD_SAMPLER,sun_blub);
sun_diff=lerp(min_sunintensity,max_sunintensity,sun_diff);
#ifdef USE_COLOR_INTENSITY_SHIFT
#ifdef USE_COLOR_INTENSITY_MASK
COL.rgb=lerp(COL.rgb,pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff))),tex2D(MASK_SAMPLER,Tex));
#else
COL.rgb=pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff)));
#endif
#endif
COL.rgb=COL.rgb*sun_diff;//*vecSunColor;
//COL=normal.y;
COL.a=1;
}
#ifdef USE_OUTLINES
void VS_OUTLINES(
in float4 vPos : POSITION,
in float3 normal : NORMAL,
#ifdef USE_TEXTURED_OUTLINES
in float2 InTex : TEXCOORD0,
out float2 OutTex : TEXCOORD0,
#endif
#ifdef USE_LIGHTING_ON_OUTLINES
out float3 outnormal : TEXCOORD1,
#endif
out float4 Pos : POSITION
)
{
#ifdef USE_PIXELSIZED_OUTLINES
float3 viewnormal=mul(normal,matWorldView);
Pos = mul(vPos,matWorldViewProj);
float2 sTex=(Pos.xy/Pos.w)*0.5f+0.5f;
sTex+=viewnormal.xy*outline_thickness*vecViewPort.zw;
Pos.xy=(sTex*Pos.w*2.f-Pos.w);
#else
Pos = mul(float4(vPos.xyz+normal*outline_thickness*0.2f,1),matWorldViewProj);
#endif
#ifdef USE_TEXTURED_OUTLINES
OutTex = InTex;
#endif
#ifdef USE_LIGHTING_ON_OUTLINES
outnormal=mul(normal,matWorld);
#endif
}
#ifdef USE_COLORED_OUTLINES
void PS_OUTLINES(
#ifdef USE_TEXTURED_OUTLINES
in float2 Tex : TEXCOORD0,
#endif
#ifdef USE_LIGHTING_ON_OUTLINES
in float3 normal : TEXCOORD1,
#endif
out float4 COL :COLOR0
)
{
COL.a=1;
#ifdef USE_TEXTURED_OUTLINES
COL = tex2D(COLOR_SAMPLER,Tex);
#else
COL.rgb=outline_color;
#endif
#ifdef USE_LIGHTING_ON_OUTLINES
normal = normalize(normal);
float sun_blub=dot(vecSunDir,normal)*0.5f+0.5f;
float sun_diff=tex1D(LGRAD_SAMPLER,sun_blub);
sun_diff=lerp(min_sunintensity,max_sunintensity,sun_diff);
#ifdef USE_COLOR_INTENSITY_SHIFT
#if defined(USE_COLOR_INTENSITY_MASK) && defined(USE_TEXTURED_OUTLINES)
COL.rgb=lerp(COL.rgb,pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff))),tex2D(MASK_SAMPLER,Tex));
#else
COL.rgb=pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff)));
#endif
#endif
COL.rgb=COL.rgb*sun_diff;//*vecSunColor;
#endif
#ifdef USE_TEXTURED_OUTLINES
#ifndef USE_ALPHA_FOR_OUTLINES
COL.rgb=pow(COL.rgb,texoutline_intensity)*texoutline_brightness;
#endif
#endif
#ifndef USE_ALPHA_FOR_OUTLINES
COL.a=1;
#endif
}
#endif
#endif
technique Shading
{
pass P0
{
zenable=true;
zwriteenable=true;
alphablendenable=false;
alphatestenable=true;
AlphaRef=0;
AlphaFunc=Greater;
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 PS();
}
#ifdef USE_OUTLINES
pass Outlines
{
cullmode=cw;
VertexShader = compile vs_2_0 VS_OUTLINES();
#ifdef USE_ALPHA_FOR_OUTLINES
zenable=true;
zwriteenable=true;
alphablendenable=false;
alphatestenable=true;
AlphaRef=0;
AlphaFunc=Greater;
#endif
#ifdef USE_COLORED_OUTLINES
PixelShader = compile ps_2_0 PS_OUTLINES();
#endif
}
#endif
}