!!permu BUMP
!!permu SPECULAR
!!permu OFFSETMAPPING
!!permu SKELETAL
!!permu FOG
!!samps diffuse

//	texture units:
//	s0=diffuse, s1=normal, s2=specular, s3=shadowmap
//	custom modifiers:
//	PCF(shadowmap)
//	CUBE(projected cubemap)



	struct a2v
	{
		float4 pos: POSITION;
		float3 tc: TEXCOORD0;
		float3 n: NORMAL0;
		float3 s: TANGENT0;
		float3 t: BINORMAL0;
	};
	struct v2f
	{
		#ifndef FRAGMENT_SHADER
		float4 pos: POSITION;
		#endif
		float3 tc: TEXCOORD0;
		float3 lpos: TEXCOORD1;
	};

#ifdef VERTEX_SHADER
	float4x4  m_modelviewprojection;
	float3 l_lightposition;
	v2f main (a2v inp)
	{
		v2f outp;
		outp.pos = mul(m_modelviewprojection, inp.pos);
		outp.tc = inp.tc;

		float3 lightminusvertex = l_lightposition - inp.pos.xyz;
		outp.lpos.x = dot(lightminusvertex, inp.s.xyz);
		outp.lpos.y = dot(lightminusvertex, inp.t.xyz);
		outp.lpos.z = dot(lightminusvertex, inp.n.xyz);
		return outp;
	}
#endif

#ifdef FRAGMENT_SHADER
	sampler s_diffuse;
	float l_lightradius;
	float3 l_lightcolour;
	float4 main (v2f inp) : COLOR0
	{
		float3 col = l_lightcolour;
		col *= max(1.0 - dot(inp.lpos, inp.lpos)/(l_lightradius*l_lightradius), 0.0);
#ifdef FLAT
		float3 diff = FLAT;
#else
		float3 diff = tex2D(s_diffuse, inp.tc);
#endif
		return float4(diff * col, 1);
	}
#endif