// STATIC: "EFFECT" "0..3" // STATIC: "VERTEXCOLOR" "0..1" // STATIC: "HALFLAMBERT" "0..1" // STATIC: "VERTEX_LIT" "0..1" // STATIC: "FULLBRIGHT" "0..1" // STATIC: "USE_STATIC_CONTROL_FLOW" "0..1" [vs20] // STATIC: "BASETEXTURE2" "0..1" // STATIC: "STRIPES" "0..1" // STATIC: "STRIPES_USE_NORMAL2" "0..1" // DYNAMIC: "COMPRESSED_VERTS" "0..1" // DYNAMIC: "SKINNING" "0..1" // DYNAMIC: "DYNAMIC_LIGHT" "0..1" // DYNAMIC: "STATIC_LIGHT" "0..1" // DYNAMIC: "NUM_LIGHTS" "0..2" [vs20] // SKIP: ( STRIPES == 0 ) && ( STRIPES_USE_NORMAL2 == 1 ) // SKIP: ( EFFECT == 2 || EFFECT == 3 ) && ( VERTEXCOLOR == 1 || HALFLAMBERT == 1 || VERTEX_LIT == 1 || FULLBRIGHT == 1 || USE_STATIC_CONTROL_FLOW == 1 || BASETEXTURE2 == 1 || STRIPES == 1 || STRIPES_USE_NORMAL2 == 1 ) // SKIP: ( EFFECT == 2 || EFFECT == 3 ) && ( SKINNING == 1 || DYNAMIC_LIGHT == 1 || STATIC_LIGHT == 1 || NUM_LIGHTS != 0 ) // SKIP: ( FULLBRIGHT == 1 ) && ( VERTEX_LIT == 0 || DYNAMIC_LIGHT == 1 || STATIC_LIGHT == 1 || NUM_LIGHTS != 0 ) #include "common_vs_fxc.h" static const bool g_bSkinning = SKINNING ? true : false; static const bool g_bHalfLambert = HALFLAMBERT ? true : false; const float4 g_vPyroParms1 : register( SHADER_SPECIFIC_CONST_0 ); #define g_vStripeScale g_vPyroParms1.xyz #define g_flUnused1 g_vPyroParms1.w #if EFFECT == 0 || EFFECT == 1 const float4 g_vPyroParms2 : register( SHADER_SPECIFIC_CONST_1 ); #define g_vCanvasScale g_vPyroParms2.xyz #define g_flUnused2 g_vPyroParms2.w #endif const float4 cBlendMaskTexCoordTransform[ 2 ] : register( SHADER_SPECIFIC_CONST_10 ); // not contiguous with the rest! struct VS_INPUT { float4 vPos : POSITION; float4 vBoneWeights : BLENDWEIGHT; float4 vBoneIndices : BLENDINDICES; #if ( VERTEX_LIT == 1 ) float4 vNormal : NORMAL; #endif float2 vBaseTexCoord : TEXCOORD0; float2 vLightmapTexCoord : TEXCOORD1; float2 vLightmapTexCoordOffset : TEXCOORD2; float3 vTangentS : TANGENT; float3 vTangentT : BINORMAL; float4 vColor : COLOR0; float3 vSpecular : COLOR1; }; struct VS_OUTPUT { float4 vProjPos : POSITION; #if EFFECT == 0 || EFFECT == 1 float4 vBaseAndSeamlessTexCoord : TEXCOORD0; #if ( STRIPES == 1 ) float2 vStripeSeamlessTexCoord : TEXCOORD1; #endif #if ( VERTEX_LIT == 0 ) float2 vLightmapBlendTexCoord : TEXCOORD2; #endif #if BASETEXTURE2 == 1 float3 vBlendFactor : TEXCOORD3; #endif float4 worldPos_projPosZ : TEXCOORD4; float3 vWorldNormal : TEXCOORD5; float4 vVertexColor : COLOR; #else float2 vBaseTexCoord : TEXCOORD0; #endif }; VS_OUTPUT main( const VS_INPUT v ) { VS_OUTPUT o; #if EFFECT == 0 || EFFECT == 1 float4 vObjPosition = v.vPos; #if ( VERTEX_LIT == 1 ) float3 vObjNormal; DecompressVertex_Normal( v.vNormal, vObjNormal ); #else float3 vObjNormal = float3( 0.0, 0.0, 1.0 ); #endif float3 vWorldNormal, vWorldPos; SkinPositionAndNormal( g_bSkinning, vObjPosition, vObjNormal, v.vBoneWeights, v.vBoneIndices, vWorldPos, vWorldNormal ); float4 vProjPos = mul( float4( vWorldPos, 1 ), cViewProj ); o.vProjPos = vProjPos; vProjPos.z = dot( float4( vWorldPos, 1 ), cViewProjZ ); o.worldPos_projPosZ = float4( vWorldPos, vProjPos.z ); #if 0 if ( !g_bSkinning ) { vWorldNormal = vObjNormal; } #endif vWorldNormal = normalize( vWorldNormal ); o.vWorldNormal = vWorldNormal; o.vBaseAndSeamlessTexCoord.xy = v.vBaseTexCoord; float flZFactor = vWorldPos.z * g_vCanvasScale.z; o.vBaseAndSeamlessTexCoord.zw = float2( vWorldPos.x + flZFactor, vWorldPos.y - flZFactor ) * g_vCanvasScale.xy; #if ( STRIPES == 1 ) float3 vWorldStripeCoord = vWorldPos * g_vStripeScale; o.vStripeSeamlessTexCoord.xy = vWorldStripeCoord.yz + vWorldStripeCoord.xz + vWorldStripeCoord.xy; #endif #if VERTEX_LIT == 0 o.vLightmapBlendTexCoord.xy = v.vLightmapTexCoord; #endif #if BASETEXTURE2 == 1 o.vBlendFactor.x = dot( v.vBaseTexCoord, cBlendMaskTexCoordTransform[ 0 ] ) + cBlendMaskTexCoordTransform[ 0 ].w; o.vBlendFactor.y = dot( v.vBaseTexCoord, cBlendMaskTexCoordTransform[ 1 ] ) + cBlendMaskTexCoordTransform[ 1 ].w; o.vBlendFactor.z = v.vColor.a; #endif #if VERTEXCOLOR == 1 o.vVertexColor = v.vColor; #elif VERTEX_LIT == 1 && FULLBRIGHT == 0 bool bDynamicLight = DYNAMIC_LIGHT ? true : false; bool bStaticLight = STATIC_LIGHT ? true : false; #if ( ( USE_STATIC_CONTROL_FLOW ) || defined ( SHADER_MODEL_VS_3_0 ) ) { o.vVertexColor.xyz = DoLighting( vWorldPos, vWorldNormal, v.vSpecular, bStaticLight, bDynamicLight, g_bHalfLambert ); } #else { o.vVertexColor.xyz = DoLightingUnrolled( vWorldPos, vWorldNormal, v.vSpecular, bStaticLight, bDynamicLight, g_bHalfLambert, NUM_LIGHTS ); } #endif o.vVertexColor.a = 1.0f; #else o.vVertexColor = 1.0f; #endif #else o.vProjPos = v.vPos; o.vBaseTexCoord = v.vBaseTexCoord; #endif return o; }