//========== Copyright (c) Valve Corporation, All rights reserved. ==========// #define CSM_MODE_VERY_LOW_OR_LOW (0) #define CSM_MODE_MEDIUM (1) #define CSM_MODE_HIGH (2) #define CSM_MODE_ATI_FETCH4 (3) #if defined( SHADER_MODEL_PS_2_B ) && !defined( _GAMECONSOLE ) && !defined( _CONSOLE ) // Register and interpolator usage, per shader #if defined( CSM_LIGHTMAPPEDGENERIC ) // use 7 registers which we have, just. No interpolators free at all const float4 g_matWorldToShadowTexMatrices0z : register( c22 ); const float4 g_matWorldToShadowTexMatrices1x : register( c23 ); const float4 g_matWorldToShadowTexMatrices1y : register( c24 ); const float4 g_matWorldToShadowTexMatrices2x : register( c25 ); const float4 g_matWorldToShadowTexMatrices2y : register( c26 ); const float4 g_vCamPosition : register( c27 ); const float4 g_vCSMTexParams : register( c6 ); #if ( PAINTREFRACT != 0 ) #error PAINTREFRACT assumed to be 0 as register slots being used for csm's #endif #elif defined( CSM_VERTEXLIT_AND_UNLIT_GENERIC ) const float4 g_vCamPosition : register( c8 ); const float4 g_vCSMTexParams : register( c9 ); #if ( OUTLINE != 0 ) #error OUTLINE assumed to be 0 as register slots being used for csm's #endif #if ( SEAMLESS_BASE != 0 ) || ( SEAMLESS_DETAIL != 0 ) #error SEAMLESS_BASE or SEAMLESS_DETAIL assumed to be 0 as register slots being used for csm's #endif // the following interpolators are used // baseTexCoord_csmXform1.zw : TEXCOORD0 - holds CSMTransformLightToTexture_1.xy // detailTexCoord_csmXform2.zw : TEXCOORD1 - holds CSMTransformLightToTexture_2.xy // worldSpaceNormal_csmXform0.w : TEXCOORD4 - holds CSMTransformLightToTexture_0.z #elif defined( CSM_VERTEXLIT_AND_UNLIT_GENERIC_BUMP ) const float4 g_vCamPosition : register( c17 ); const float4 g_vCSMTexParams : register( c18 ); // the following interpolators are used // baseTexCoord2_light0e01_or_csmXform0or1.zw : TEXCOORD0 - holds CSMTransformLightToTexture_0or1.xy // lightAtten_csmXform2.zw : TEXCOORD2 - holds CSMTransformLightToTexture_2.xy // vWorldNormal_light2e1_or_csmXform0.w : TEXCOORD3 - holds CSMTransformLightToTexture_0.z #elif defined( CSM_PHONG ) const float4 g_vCamPosition : register( c24 ); const float4 g_vCSMTexParams : register( c25 ); // the following interpolators are used // flTeamIdFade_csmXform0z_csmXform0or1xy.zw : TEXCOORD7 - holds CSMTransformLightToTexture_0or1.xy // lightAtten_csmXform2.zw : TEXCOORD1 - holds CSMTransformLightToTexture_2.xy // flTeamIdFade_csmXform0z_csmXform0or1xy.y : TEXCOORD3 - holds CSMTransformLightToTexture_0.z #elif defined( CSM_CHARACTER ) const float4 g_vCamPosition : register( c26 ); const float4 g_vCSMTexParams : register( c27 ); // the following interpolators are used // csmXform0z_csmXform0or1xy.yz : TEXCOORD7 - holds CSMTransformLightToTexture_0or1.xy // vTexCoord0_csmXform2.zw : TEXCOORD0 - holds CSMTransformLightToTexture_2.xy // csmXform0z_csmXform0or1xy.x : TEXCOORD7 - holds CSMTransformLightToTexture_0.z #else #error No support for this shader and csm's when using ps_2_b on pc #endif // note this is a different param mapping from non ps_2_b csmtexparams #define g_flSunShadowingZLerpFactorBase g_vCSMTexParams.x #define g_flSunShadowingZLerpFactorRange g_vCSMTexParams.y #define g_flInvCascadeResolution g_vCSMTexParams.z #else const float4 g_vCSMLightColor : register( c64 ); const float4 g_vCSMLightDir : register( c65 ); const float4 g_vCSMTexParams : register( c66 ); const float4 g_vCSMTexParams2 : register( c67 ); const float4 g_vCSMTexParams3 : register( c68 ); const float4x4 g_matWorldToShadowTexMatrices[4] : register( c69 ); const float4 g_vCascadeAtlasUVOffsets[4] : register( c85 ); const float4 g_vCamPosition : register( c89 ); #define g_flSunShadowingInvShadowTextureWidth g_vCSMTexParams.x #define g_flSunShadowingInvShadowTextureHeight g_vCSMTexParams.y #define g_flSunShadowingHalfInvShadowTextureWidth g_vCSMTexParams.z #define g_flSunShadowingHalfInvShadowTextureHeight g_vCSMTexParams.w #define g_flSunShadowingShadowTextureWidth g_vCSMTexParams2.x #define g_flSunShadowingShadowTextureHeight g_vCSMTexParams2.y #define g_flSunShadowingSplitLerpFactorBase g_vCSMTexParams2.z #define g_flSunShadowingSplitLerpFactorInvRange g_vCSMTexParams2.w #define g_flSunShadowingZLerpFactorBase g_vCSMTexParams3.x #define g_flSunShadowingZLerpFactorRange g_vCSMTexParams3.y #endif float3 CSMVisualizePosition( float3 vPositionWs ) { float3 cColor = float3( 0, 0, 1 ); int ix = vPositionWs.x / 8.0f; int iy = vPositionWs.y / 8.0f; if ( frac( iy / 2.0f ) ) { if ( frac( ix / 2.0f ) ) { cColor = float3( 1.0f, 0.0f, 0.0f ); } else { cColor = float3( 0.0f, 1.0f, 0.0f ); } } else { if ( frac( ix / 2.0f ) ) { cColor = float3( 0.0f, 1.0f, 0.0f ); } else { cColor = float3( 1.0f, 0.0f, 0.0f ); } } return cColor; } float3 CSMVisualizeSplit( float3 vPositionWs ) { #if defined( SHADER_MODEL_PS_2_B ) return float3( 1, 0, 0 ); #else float4 vPosition4Ws = float4( vPositionWs.xyz, 1.0f ); float3 vPositionToSampleLs = float3( 0.0f, 0.0f, 0.0f ); int nCascadeIndex = 0; vPositionToSampleLs.xy = mul( vPosition4Ws.xyzw, g_matWorldToShadowTexMatrices[0] ).xy; #if ( CASCADE_SIZE > 1 ) if ( dot( saturate( vPositionToSampleLs.xy ) - vPositionToSampleLs.xy, float2( 1, 1 ) ) != 0.0f ) { nCascadeIndex = 1; vPositionToSampleLs.xy = mul( vPosition4Ws.xyzw, g_matWorldToShadowTexMatrices[1] ).xy; #if ( CASCADE_SIZE > 2 ) if ( dot( saturate( vPositionToSampleLs.xy ) - vPositionToSampleLs.xy, float2( 1, 1 ) ) != 0.0f ) { nCascadeIndex = 2; vPositionToSampleLs.xy = mul( vPosition4Ws.xyzw, g_matWorldToShadowTexMatrices[2] ).xy; #if ( CASCADE_SIZE > 3 ) if ( dot( saturate( vPositionToSampleLs.xy ) - vPositionToSampleLs.xy, float2( 1, 1 ) ) != 0.0f ) { nCascadeIndex = 3; vPositionToSampleLs.xy = mul( vPosition4Ws.xyzw, g_matWorldToShadowTexMatrices[3] ).xy; } #endif } #endif } #endif float3 cColor = float3( 1, 0, 1 ); if ( dot( saturate( vPositionToSampleLs.xy ) - vPositionToSampleLs.xy, float2( 1, 1 ) ) == 0.0f ) { if ( nCascadeIndex == 0 ) cColor = float3( 0, 1, 0 ); else if ( nCascadeIndex == 1 ) cColor = float3( 0, 0, 1 ); else if ( nCascadeIndex == 2 ) cColor = float3( 0, 1, 1 ); else cColor = float3( 1, 0, 0 ); } return cColor; #endif } #if defined( _GAMECONSOLE ) || defined(_CONSOLE) #include "csm_common_gameconsole_fxc.h" #elif defined( SHADER_MODEL_PS_2_B ) #include "csm_common_pc_ps2b_fxc.h" #else #include "csm_common_pc_fxc.h" #endif