// STATIC: "HALFLAMBERT" "0..1" // STATIC: "USE_STATIC_CONTROL_FLOW" "0..1" [vs20] // DYNAMIC: "DYNAMIC_LIGHT" "0..1" // DYNAMIC: "STATIC_LIGHT" "0..1" // DYNAMIC: "NUM_LIGHTS" "0..2" [vs20] // If using static control flow on Direct3D, we should use the NUM_LIGHTS=0 combo // SKIP: $USE_STATIC_CONTROL_FLOW && ( $NUM_LIGHTS > 0 ) [vs20] #include "common_vs_fxc.h" static const bool g_bHalfLambert = HALFLAMBERT ? true : false; const float3 cLeafCenter : register(SHADER_SPECIFIC_CONST_0); struct VS_INPUT { // This is all of the stuff that we ever use. float4 vPos : POSITION; float4 vNormal : NORMAL; float2 vTexCoord : TEXCOORD0; }; struct VS_OUTPUT { float4 projPos : POSITION; float2 texCoord : TEXCOORD0; float3 color : COLOR; }; VS_OUTPUT main( const VS_INPUT v ) { VS_OUTPUT o = ( VS_OUTPUT )0; bool bDynamicLight = DYNAMIC_LIGHT ? true : false; bool bStaticLight = STATIC_LIGHT ? true : false; float3 worldPos; worldPos = mul( v.vPos, cModel[0] ); float3 normal = v.vPos.xyz - cLeafCenter.xyz; normal = normalize( normal ); float3 worldNormal = mul( float4( normal, 0.0f ), cModel[0] ); #if ( USE_STATIC_CONTROL_FLOW ) || defined ( SHADER_MODEL_VS_3_0 ) float3 lighting = DoLighting( worldPos, worldNormal, float3(0,0,0), bStaticLight, bDynamicLight, g_bHalfLambert ); #else float3 lighting = DoLightingUnrolled( worldPos, worldNormal, float3(0,0,0), bStaticLight, bDynamicLight, g_bHalfLambert, NUM_LIGHTS ); #endif float3 xAxis = float3( cViewModel[0].x, cViewModel[1].x, cViewModel[2].x ); float3 yAxis = float3( cViewModel[0].y, cViewModel[1].y, cViewModel[2].y ); worldPos += xAxis * v.vTexCoord.x; worldPos += yAxis * (1.0f-v.vTexCoord.y); float4 projPos = mul( float4(worldPos, 1.0f), cViewProj ); float3 light_vec = float3( 1.0f, 0.0, 1.0 ); light_vec = normalize( light_vec ); o.projPos = projPos; // FIXME: if this shader gets put back into use, be sure this usage of normals jives with compressed verts o.texCoord = v.vNormal.xy; o.color = lighting; return o; }