Mapbase v4.1

- Exposed CAmmoDef to VScript and changed ammo type functions accordingly
- Added TakeHealth and IsAlive to CBaseEntity
- Added $treeSway
- Added several inputs to control env_wind keyvalues + a new $treeSway scale keyvalue
- Added "Expanded name fixup" keyvalue to point_template which allows name fixup to fix up output parameters
- Fixed the rope on rappelling NPCs causing graphical issues
- Fixed prop_vehicle_prisoner_pod missing "EnterVehicle", "EnterVehicleImmediate", and "ExitVehicle" inputs
- Fixed hostile citizens not damaging player
- Fixed an uncommon npc_metropolice crash from when it's not in a squad
- Made SetTarget input update target handling on NPCs
- Changed ammo type functions to be more organized, added AmmoDef singleton
- Added more precache functions
- Added various misc. entity functions, like GetAllWeapons or AddOutput
- Added more utility functions
This commit is contained in:
Blixibon
2020-06-21 15:10:56 +00:00
parent 5b2547a6ff
commit 418a9dcccc
39 changed files with 923 additions and 67 deletions

View File

@@ -1,6 +1,7 @@
// STATIC: "ONLY_PROJECT_POSITION" "0..1" [XBOX]
// STATIC: "ONLY_PROJECT_POSITION" "0..0" [PC]
// STATIC: "COLOR_DEPTH" "0..1"
// STATIC: "TREESWAY" "0..2"
// DYNAMIC: "COMPRESSED_VERTS" "0..1"
// DYNAMIC: "SKINNING" "0..1"
@@ -19,6 +20,37 @@ const float4 cMorphSubrect : register( SHADER_SPECIFIC_CONST_7 );
sampler2D morphSampler : register( D3DVERTEXTEXTURESAMPLER0, s0 );
#endif
#if ( TREESWAY )
const float4 g_vTreeSwayParams0 : register( SHADER_SPECIFIC_CONST_2 );
const float4 g_vTreeSwayParams1 : register( SHADER_SPECIFIC_CONST_3 );
const float4 g_vTreeSwayParams2 : register( SHADER_SPECIFIC_CONST_4 );
const float4 g_vTreeSwayParams3 : register( SHADER_SPECIFIC_CONST_5 );
const float4 g_vTreeSwayParams4 : register( SHADER_SPECIFIC_CONST_9 );
#define g_flTime g_vTreeSwayParams0.x
#define g_vWindDir g_vTreeSwayParams0.yz
#define g_flScrumbleFalloffCurve g_vTreeSwayParams1.x
#define g_flSwayFalloffCurve g_vTreeSwayParams1.y
#define g_flScrumbleSpeed g_vTreeSwayParams1.z
#define g_flFastSwaySpeedScale g_vTreeSwayParams1.w
#define g_flHeight g_vTreeSwayParams2.x
#define g_flStartHeight g_vTreeSwayParams2.y
#define g_flRadius g_vTreeSwayParams2.z
#define g_flStartRadius g_vTreeSwayParams2.w
#define g_flSwaySpeed g_vTreeSwayParams3.x
#define g_flSwayIntensity g_vTreeSwayParams3.y
#define g_flScrumbleWaveCount g_vTreeSwayParams3.z
#define g_flScrumbleIntensity g_vTreeSwayParams3.w
#define g_flWindSpeedLerpStart g_vTreeSwayParams4.x
#define g_flWindSpeedLerpEnd g_vTreeSwayParams4.y
#include "tree_sway.h"
#endif
struct VS_INPUT
{
@@ -62,6 +94,12 @@ VS_OUTPUT main( const VS_INPUT v )
v.vVertexID, float3(0, 0, 0), vPosition.xyz );
#endif
#if ( TREESWAY )
{
vPosition.xyz = ComputeTreeSway( vPosition.xyz, g_flTime );
}
#endif
SkinPosition( g_bSkinning, vPosition, v.vBoneWeights, v.vBoneIndices, vWorldPos );
float4 vProjPos = mul( float4( vWorldPos, 1.0f ), cViewProj );

View File

@@ -11,6 +11,7 @@
// STATIC: "SM30_VERTEXID" "0..1" [vs30]
// STATIC: "USE_STATIC_CONTROL_FLOW" "0..1" [vs20]
// STATIC: "DONT_GAMMA_CONVERT_VERTEX_COLOR" "0..1"
// STATIC: "TREESWAY" "0..2"
// DYNAMIC: "COMPRESSED_VERTS" "0..1"
// DYNAMIC: "DYNAMIC_LIGHT" "0..1"
// DYNAMIC: "STATIC_LIGHT" "0..1"
@@ -25,6 +26,7 @@
// SKIP: $USE_STATIC_CONTROL_FLOW && ( $NUM_LIGHTS > 0 ) [vs20]
// SKIP: ($SEPARATE_DETAIL_UVS) && ($SEAMLESS_DETAIL)
// SKIP: ($DONT_GAMMA_CONVERT_VERTEX_COLOR && ( ! $VERTEXCOLOR ) )
// SKIP: ( $TREESWAY ) && ( $SEAMLESS_DETAIL || $SEAMLESS_BASE )
#include "common_vs_fxc.h"
static const bool g_bSkinning = SKINNING ? true : false;
@@ -51,6 +53,34 @@ const float4 cDetailTexCoordTransform[2] : register( SHADER_SPECIFIC_CONST_4 );
const float4x4 g_FlashlightWorldToTexture : register( SHADER_SPECIFIC_CONST_6 ); // 6, 7, 8, 9
#endif
#if ( TREESWAY )
const float4 g_vMiscParams1 : register( SHADER_SPECIFIC_CONST_6 );
const float4 g_vMiscParams2 : register( SHADER_SPECIFIC_CONST_7 );
const float4 g_vMiscParams3 : register( SHADER_SPECIFIC_CONST_8 );
const float4 g_vMiscParams4 : register( SHADER_SPECIFIC_CONST_9 );
#define g_flTime g_vMiscParams2.y
#define g_vWindDir g_vMiscParams2.zw
#define g_flFastSwaySpeedScale g_vMiscParams1.x
#define g_flScrumbleFalloffCurve g_vMiscParams1.y
#define g_flSwayFalloffCurve g_vMiscParams1.z
#define g_flScrumbleSpeed g_vMiscParams1.w
#define g_flHeight g_vMiscParams3.x
#define g_flStartHeight g_vMiscParams3.y
#define g_flRadius g_vMiscParams3.z
#define g_flStartRadius g_vMiscParams3.w
#define g_flSwaySpeed g_vMiscParams4.x
#define g_flSwayIntensity g_vMiscParams4.y
#define g_flScrumbleWaveCount g_vMiscParams4.z
#define g_flScrumbleIntensity g_vMiscParams4.w
#define g_flWindSpeedLerpStart cDetailTexCoordTransform[0].x
#define g_flWindSpeedLerpEnd cDetailTexCoordTransform[0].y
#include "tree_sway.h"
#endif
#if defined( SHADER_MODEL_VS_3_0 ) && SM30_VERTEXID
// NOTE: cMorphTargetTextureDim.xy = target dimensions,
// cMorphTargetTextureDim.z = 4tuples/morph
@@ -149,6 +179,10 @@ VS_OUTPUT main( const VS_INPUT v )
ApplyMorph( morphSampler, cMorphTargetTextureDim, cMorphSubrect,
v.vVertexID, v.vTexCoord2, vPosition.xyz, vNormal );
#endif
#if ( TREESWAY )
vPosition.xyz = ComputeTreeSway( vPosition.xyz, g_flTime );
#endif
// Perform skinning
float3 worldNormal, worldPos;
@@ -225,10 +259,18 @@ VS_OUTPUT main( const VS_INPUT v )
// that scale works. More smartness could allow 3d xform.
o.SeamlessDetailTexCoord.xyz = (SEAMLESS_SCALE*cDetailTexCoordTransform[0].x) * v.vPos.xyz;
#else
// Detail texture coordinates
// FIXME: This shouldn't have to be computed all the time.
o.detailTexCoord.x = dot( v.vTexCoord0, cDetailTexCoordTransform[0] );
o.detailTexCoord.y = dot( v.vTexCoord0, cDetailTexCoordTransform[1] );
#if ( TREESWAY )
{
o.detailTexCoord.xy = v.vTexCoord0;
}
#else
{
// Detail texture coordinates
// FIXME: This shouldn't have to be computed all the time.
o.detailTexCoord.x = dot( v.vTexCoord0, cDetailTexCoordTransform[0] );
o.detailTexCoord.y = dot( v.vTexCoord0, cDetailTexCoordTransform[1] );
}
#endif
#endif
#if SEPARATE_DETAIL_UVS

View File

@@ -22,6 +22,25 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
BEGIN_SHADER_PARAMS
SHADER_PARAM( ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value" )
SHADER_PARAM( COLOR_DEPTH, SHADER_PARAM_TYPE_BOOL, "0", "Write depth as color")
// vertexlitgeneric tree sway animation control
SHADER_PARAM( TREESWAY, SHADER_PARAM_TYPE_INTEGER, "0", "" )
SHADER_PARAM( TREESWAYHEIGHT, SHADER_PARAM_TYPE_FLOAT, "1000", "" )
SHADER_PARAM( TREESWAYSTARTHEIGHT, SHADER_PARAM_TYPE_FLOAT, "0.2", "" )
SHADER_PARAM( TREESWAYRADIUS, SHADER_PARAM_TYPE_FLOAT, "300", "" )
SHADER_PARAM( TREESWAYSTARTRADIUS, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSPEED, SHADER_PARAM_TYPE_FLOAT, "1", "" )
SHADER_PARAM( TREESWAYSPEEDHIGHWINDMULTIPLIER, SHADER_PARAM_TYPE_FLOAT, "2", "" )
SHADER_PARAM( TREESWAYSTRENGTH, SHADER_PARAM_TYPE_FLOAT, "10", "" )
SHADER_PARAM( TREESWAYSCRUMBLESPEED, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLESTRENGTH, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFREQUENCY, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.5", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.0", "" )
SHADER_PARAM( TREESWAYSPEEDLERPSTART, SHADER_PARAM_TYPE_FLOAT, "3", "" )
SHADER_PARAM( TREESWAYSPEEDLERPEND, SHADER_PARAM_TYPE_FLOAT, "6", "" )
SHADER_PARAM( TREESWAYSTATIC, SHADER_PARAM_TYPE_BOOL, "0", "" )
SHADER_PARAM( TREESWAYSTATICVALUES, SHADER_PARAM_TYPE_VEC2, "[0.5 0.5]", "" )
END_SHADER_PARAMS
SHADER_INIT_PARAMS()
@@ -46,6 +65,7 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
{
bool bAlphaClip = IS_FLAG_SET( MATERIAL_VAR_ALPHATEST );
int nColorDepth = GetIntParam( COLOR_DEPTH, params, 0 );
int nTreeSwayMode = clamp( GetIntParam( TREESWAY, params, 0 ), 0, 2 );
SHADOW_STATE
{
@@ -79,6 +99,7 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
DECLARE_STATIC_VERTEX_SHADER( sdk_depthwrite_vs20 );
SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, !bAlphaClip && IsX360() && !nColorDepth ); //360 needs to know if it *shouldn't* output texture coordinates to avoid shader patches
SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, nTreeSwayMode );
SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs20 );
if ( bAlphaClip || g_pHardwareConfig->PlatformRequiresNonNullPixelShaders() || nColorDepth )
@@ -111,6 +132,7 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
DECLARE_STATIC_VERTEX_SHADER( sdk_depthwrite_vs30 );
SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, 0 ); //360 only combo, and this is a PC path
SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, nTreeSwayMode );
SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs30 );
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
@@ -190,6 +212,50 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
}
#endif
if ( nTreeSwayMode != 0 )
{
float flParams[4];
flParams[0] = pShaderAPI->CurrentTime();
if (params[TREESWAYSTATIC]->GetIntValue() == 0)
{
const Vector& windDir = pShaderAPI->GetVectorRenderingParameter( VECTOR_RENDERPARM_WIND_DIRECTION );
flParams[1] = windDir.x;
flParams[2] = windDir.y;
}
else
{
// Use a static value instead of the env_wind value.
params[TREESWAYSTATICVALUES]->GetVecValue( flParams + 1, 2 );
}
flParams[3] = 0.0f;
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_2, flParams );
flParams[0] = GetFloatParam( TREESWAYSCRUMBLEFALLOFFEXP, params, 1.0f );
flParams[1] = GetFloatParam( TREESWAYFALLOFFEXP, params, 1.0f );
flParams[2] = GetFloatParam( TREESWAYSCRUMBLESPEED, params, 3.0f );
flParams[3] = GetFloatParam( TREESWAYSPEEDHIGHWINDMULTIPLIER, params, 2.0f );
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_3, flParams );
flParams[0] = GetFloatParam( TREESWAYHEIGHT, params, 1000.0f );
flParams[1] = GetFloatParam( TREESWAYSTARTHEIGHT, params, 0.1f );
flParams[2] = GetFloatParam( TREESWAYRADIUS, params, 300.0f );
flParams[3] = GetFloatParam( TREESWAYSTARTRADIUS, params, 0.2f );
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, flParams );
flParams[0] = GetFloatParam( TREESWAYSPEED, params, 1.0f );
flParams[1] = GetFloatParam( TREESWAYSTRENGTH, params, 10.0f );
flParams[2] = GetFloatParam( TREESWAYSCRUMBLEFREQUENCY, params, 12.0f );
flParams[3] = GetFloatParam( TREESWAYSCRUMBLESTRENGTH, params, 10.0f );
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_5, flParams );
flParams[0] = GetFloatParam( TREESWAYSPEEDLERPSTART, params, 3.0f );
flParams[1] = GetFloatParam( TREESWAYSPEEDLERPEND, params, 6.0f );
flParams[2] = 0.0f;
flParams[3] = 0.0f;
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_9, flParams );
}
Vector4D vParms;
// set up arbitrary far planes, as the real ones are too far ( 30,000 )

View File

@@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_depthwrite_vs20_Static_Index( )
{
@@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false;
#endif // _DEBUG
m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH;
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 4 * m_nONLY_PROJECT_POSITION ) + ( 4 * m_nCOLOR_DEPTH ) + 0;
return ( 4 * m_nONLY_PROJECT_POSITION ) + ( 4 * m_nCOLOR_DEPTH ) + ( 8 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_depthwrite_vs20 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + 0
#define shaderStaticTest_sdk_depthwrite_vs20 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_depthwrite_vs20_Dynamic_Index
{
private:

View File

@@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_depthwrite_vs30_Static_Index( )
{
@@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false;
#endif // _DEBUG
m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH;
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 8 * m_nONLY_PROJECT_POSITION ) + ( 8 * m_nCOLOR_DEPTH ) + 0;
return ( 8 * m_nONLY_PROJECT_POSITION ) + ( 8 * m_nCOLOR_DEPTH ) + ( 16 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_depthwrite_vs30 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + 0
#define shaderStaticTest_sdk_depthwrite_vs30 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_depthwrite_vs30_Dynamic_Index
{
private:

View File

@@ -190,6 +190,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_vertexlit_and_unlit_generic_vs20_Static_Index( )
{
@@ -229,19 +250,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bUSE_STATIC_CONTROL_FLOW && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR;
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bUSE_STATIC_CONTROL_FLOW && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 192 * m_nVERTEXCOLOR ) + ( 384 * m_nCUBEMAP ) + ( 768 * m_nHALFLAMBERT ) + ( 1536 * m_nFLASHLIGHT ) + ( 3072 * m_nSEAMLESS_BASE ) + ( 6144 * m_nSEAMLESS_DETAIL ) + ( 12288 * m_nSEPARATE_DETAIL_UVS ) + ( 24576 * m_nUSE_STATIC_CONTROL_FLOW ) + ( 49152 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + 0;
return ( 192 * m_nVERTEXCOLOR ) + ( 384 * m_nCUBEMAP ) + ( 768 * m_nHALFLAMBERT ) + ( 1536 * m_nFLASHLIGHT ) + ( 3072 * m_nSEAMLESS_BASE ) + ( 6144 * m_nSEAMLESS_DETAIL ) + ( 12288 * m_nSEPARATE_DETAIL_UVS ) + ( 24576 * m_nUSE_STATIC_CONTROL_FLOW ) + ( 49152 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + ( 98304 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs20 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_USE_STATIC_CONTROL_FLOW + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + 0
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs20 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_USE_STATIC_CONTROL_FLOW + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_vertexlit_and_unlit_generic_vs20_Dynamic_Index
{
private:

View File

@@ -211,6 +211,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_vertexlit_and_unlit_generic_vs30_Static_Index( )
{
@@ -254,19 +275,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bDECAL && m_bSM30_VERTEXID && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR;
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bDECAL && m_bSM30_VERTEXID && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 128 * m_nVERTEXCOLOR ) + ( 256 * m_nCUBEMAP ) + ( 512 * m_nHALFLAMBERT ) + ( 1024 * m_nFLASHLIGHT ) + ( 2048 * m_nSEAMLESS_BASE ) + ( 4096 * m_nSEAMLESS_DETAIL ) + ( 8192 * m_nSEPARATE_DETAIL_UVS ) + ( 16384 * m_nDECAL ) + ( 32768 * m_nSM30_VERTEXID ) + ( 65536 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + 0;
return ( 128 * m_nVERTEXCOLOR ) + ( 256 * m_nCUBEMAP ) + ( 512 * m_nHALFLAMBERT ) + ( 1024 * m_nFLASHLIGHT ) + ( 2048 * m_nSEAMLESS_BASE ) + ( 4096 * m_nSEAMLESS_DETAIL ) + ( 8192 * m_nSEPARATE_DETAIL_UVS ) + ( 16384 * m_nDECAL ) + ( 32768 * m_nSM30_VERTEXID ) + ( 65536 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + ( 131072 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs30 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_DECAL + vsh_forgot_to_set_static_SM30_VERTEXID + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + 0
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs30 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_DECAL + vsh_forgot_to_set_static_SM30_VERTEXID + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_vertexlit_and_unlit_generic_vs30_Dynamic_Index
{
private:

View File

@@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_depthwrite_vs20_Static_Index( )
{
@@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false;
#endif // _DEBUG
m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH;
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 4 * m_nONLY_PROJECT_POSITION ) + ( 4 * m_nCOLOR_DEPTH ) + 0;
return ( 4 * m_nONLY_PROJECT_POSITION ) + ( 4 * m_nCOLOR_DEPTH ) + ( 8 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_depthwrite_vs20 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + 0
#define shaderStaticTest_sdk_depthwrite_vs20 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_depthwrite_vs20_Dynamic_Index
{
private:

View File

@@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_depthwrite_vs30_Static_Index( )
{
@@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false;
#endif // _DEBUG
m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH;
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 8 * m_nONLY_PROJECT_POSITION ) + ( 8 * m_nCOLOR_DEPTH ) + 0;
return ( 8 * m_nONLY_PROJECT_POSITION ) + ( 8 * m_nCOLOR_DEPTH ) + ( 16 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_depthwrite_vs30 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + 0
#define shaderStaticTest_sdk_depthwrite_vs30 vsh_forgot_to_set_static_ONLY_PROJECT_POSITION + vsh_forgot_to_set_static_COLOR_DEPTH + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_depthwrite_vs30_Dynamic_Index
{
private:

View File

@@ -190,6 +190,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_vertexlit_and_unlit_generic_vs20_Static_Index( )
{
@@ -229,19 +250,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bUSE_STATIC_CONTROL_FLOW && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR;
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bUSE_STATIC_CONTROL_FLOW && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 192 * m_nVERTEXCOLOR ) + ( 384 * m_nCUBEMAP ) + ( 768 * m_nHALFLAMBERT ) + ( 1536 * m_nFLASHLIGHT ) + ( 3072 * m_nSEAMLESS_BASE ) + ( 6144 * m_nSEAMLESS_DETAIL ) + ( 12288 * m_nSEPARATE_DETAIL_UVS ) + ( 24576 * m_nUSE_STATIC_CONTROL_FLOW ) + ( 49152 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + 0;
return ( 192 * m_nVERTEXCOLOR ) + ( 384 * m_nCUBEMAP ) + ( 768 * m_nHALFLAMBERT ) + ( 1536 * m_nFLASHLIGHT ) + ( 3072 * m_nSEAMLESS_BASE ) + ( 6144 * m_nSEAMLESS_DETAIL ) + ( 12288 * m_nSEPARATE_DETAIL_UVS ) + ( 24576 * m_nUSE_STATIC_CONTROL_FLOW ) + ( 49152 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + ( 98304 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs20 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_USE_STATIC_CONTROL_FLOW + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + 0
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs20 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_USE_STATIC_CONTROL_FLOW + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_vertexlit_and_unlit_generic_vs20_Dynamic_Index
{
private:

View File

@@ -211,6 +211,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif
}
private:
int m_nTREESWAY;
#ifdef _DEBUG
bool m_bTREESWAY;
#endif
public:
void SetTREESWAY( int i )
{
Assert( i >= 0 && i <= 2 );
m_nTREESWAY = i;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
void SetTREESWAY( bool i )
{
m_nTREESWAY = i ? 1 : 0;
#ifdef _DEBUG
m_bTREESWAY = true;
#endif
}
public:
sdk_vertexlit_and_unlit_generic_vs30_Static_Index( )
{
@@ -254,19 +275,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
}
int GetIndex()
{
// Asserts to make sure that we aren't using any skipped combinations.
// Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bDECAL && m_bSM30_VERTEXID && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR;
bool bAllStaticVarsDefined = m_bVERTEXCOLOR && m_bCUBEMAP && m_bHALFLAMBERT && m_bFLASHLIGHT && m_bSEAMLESS_BASE && m_bSEAMLESS_DETAIL && m_bSEPARATE_DETAIL_UVS && m_bDECAL && m_bSM30_VERTEXID && m_bDONT_GAMMA_CONVERT_VERTEX_COLOR && m_bTREESWAY;
Assert( bAllStaticVarsDefined );
#endif // _DEBUG
return ( 128 * m_nVERTEXCOLOR ) + ( 256 * m_nCUBEMAP ) + ( 512 * m_nHALFLAMBERT ) + ( 1024 * m_nFLASHLIGHT ) + ( 2048 * m_nSEAMLESS_BASE ) + ( 4096 * m_nSEAMLESS_DETAIL ) + ( 8192 * m_nSEPARATE_DETAIL_UVS ) + ( 16384 * m_nDECAL ) + ( 32768 * m_nSM30_VERTEXID ) + ( 65536 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + 0;
return ( 128 * m_nVERTEXCOLOR ) + ( 256 * m_nCUBEMAP ) + ( 512 * m_nHALFLAMBERT ) + ( 1024 * m_nFLASHLIGHT ) + ( 2048 * m_nSEAMLESS_BASE ) + ( 4096 * m_nSEAMLESS_DETAIL ) + ( 8192 * m_nSEPARATE_DETAIL_UVS ) + ( 16384 * m_nDECAL ) + ( 32768 * m_nSM30_VERTEXID ) + ( 65536 * m_nDONT_GAMMA_CONVERT_VERTEX_COLOR ) + ( 131072 * m_nTREESWAY ) + 0;
}
};
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs30 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_DECAL + vsh_forgot_to_set_static_SM30_VERTEXID + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + 0
#define shaderStaticTest_sdk_vertexlit_and_unlit_generic_vs30 vsh_forgot_to_set_static_VERTEXCOLOR + vsh_forgot_to_set_static_CUBEMAP + vsh_forgot_to_set_static_HALFLAMBERT + vsh_forgot_to_set_static_FLASHLIGHT + vsh_forgot_to_set_static_SEAMLESS_BASE + vsh_forgot_to_set_static_SEAMLESS_DETAIL + vsh_forgot_to_set_static_SEPARATE_DETAIL_UVS + vsh_forgot_to_set_static_DECAL + vsh_forgot_to_set_static_SM30_VERTEXID + vsh_forgot_to_set_static_DONT_GAMMA_CONVERT_VERTEX_COLOR + vsh_forgot_to_set_static_TREESWAY + 0
class sdk_vertexlit_and_unlit_generic_vs30_Dynamic_Index
{
private:

View File

@@ -0,0 +1,89 @@
//============ Copyright (c) Valve Corporation, All rights reserved. ============
#ifndef _TREE_SWAY_H
#define _TREE_SWAY_H
// Tree sway vertex animation function. Requires a number of global variables to be defined. See vertexlit_and_unlit_generic_vs20.fxc or depthwrite_vs20.fxc for details.
// Tree sway mode 2:
// Hacks to use tree sway code on rectangular sheets of plastic/tarp attached at the four corners.
// Inverts the sway scale radius to be 1 at (0,0,0) in model space and fall off radially towards the edges of the model.
// The model is expected to be build lying in the xy plane in model space, with its center at the origin.
// Treeswaystrength should be 0 in the vmt.
#if ( TREESWAY )
float3 ComputeTreeSway( float3 vPositionOS, float flTime )
{
static const float g_flWindOffsetScale = 19;
float flWindIntensity = length( g_vWindDir );
// Model root position is the translation component of the model to world matrix
float3 vModelRoot = float3( cModel[0][3].x, cModel[0][3].y, cModel[0][3].z );
// Transform the wind direction into model space
float3 vWindDirAndIntensityOS = mul( ( float3x3 )cModel[0], float3( g_vWindDir, 0 ) );
float flSwayScaleHeight = saturate( ( vPositionOS.z - g_flHeight * g_flStartHeight ) /
( ( 1.0 - g_flStartHeight ) * g_flHeight ) );
float flSwayScaleRadius = saturate( length( ( vPositionOS.xy ) - g_flRadius * g_flStartRadius ) /
( ( 1.0 - g_flStartRadius ) * g_flRadius ) );
// Used to turn off branch sway and scrumble below the minimum sway height
float flHeightThreshold = step( 0, vPositionOS.z - g_flHeight * g_flStartHeight );
#if ( TREESWAY == 2 )
{
// Works better for hanging vines
flHeightThreshold = step( vPositionOS.z - g_flHeight * g_flStartHeight, 0 );
}
#endif
// Scale branch motion based on how orthogonal they are
// This is what I want to compute:
// float flOrthoBranchScale = 1.0 - abs( dot( normalize( vWindDirAndIntensityOS.xyz ), float3( normalize( vPositionOS.xy ), 0 ) ) );
// Some NV hardware (7800) will do bad things when normalizing a 0 length vector. Instead, I'm doing the dot product unnormalized
// and divide by the length of the vectors, making sure to avoid divide by 0.
float flOrthoBranchScale = abs( dot( vWindDirAndIntensityOS.xyz, float3( vPositionOS.xy, 0 ) ) );
flOrthoBranchScale = 1.0 - saturate( flOrthoBranchScale / ( max( length( vWindDirAndIntensityOS.xyz ), 0.0001 ) * max( length( vPositionOS.xy ), 0.0001 ) ) );
float flSwayScaleTrunk = g_flSwayIntensity * pow( flSwayScaleHeight, g_flSwayFalloffCurve );
float flSwayScaleBranches = g_flSwayIntensity * flOrthoBranchScale * flSwayScaleRadius * flHeightThreshold;
#if ( TREESWAY == 2 )
{
// Looks stupid on vines
flSwayScaleBranches = 0.0;
}
#endif
float flWindTimeOffset = dot( vModelRoot.xyz, float3( 1, 1, 1 ) ) * g_flWindOffsetScale;
float flSlowSwayTime = ( flTime + flWindTimeOffset ) * g_flSwaySpeed;
float3 vSwayPosOS = normalize( vPositionOS.xyz );
float3 vScrumblePosOS = vSwayPosOS * g_flScrumbleWaveCount;
float flScrumbleScale = pow( flSwayScaleRadius, g_flScrumbleFalloffCurve ) * g_flScrumbleIntensity * flHeightThreshold;
float3 vPositionOffset = float3( 0, 0, 0 );
// lerp between slow and fast sines based on wind speed
float flSpeedLerp = smoothstep( g_flWindSpeedLerpStart, g_flWindSpeedLerpEnd, flWindIntensity );
float4 vABunchOfSines = sin( float4( 1.0, 2.31, g_flFastSwaySpeedScale, 2.14 * g_flFastSwaySpeedScale ) * flSlowSwayTime.xxxx );
vABunchOfSines.xy = lerp( vABunchOfSines.xy, vABunchOfSines.zw, flSpeedLerp );
vPositionOffset.xyz = vWindDirAndIntensityOS * flSwayScaleTrunk * ( vABunchOfSines.x + 0.1 );
vPositionOffset.xyz += vWindDirAndIntensityOS * flSwayScaleBranches * ( vABunchOfSines.y + 0.4 );
float3 vScrumbleScale = flScrumbleScale.xxx;
#if ( TREESWAY == 2 )
{
vScrumbleScale *= float3( 0.5, 0.5, 1.0 );
}
#endif
vPositionOffset.xyz += flWindIntensity * ( vScrumbleScale.xyz * sin( g_flScrumbleSpeed * flTime.xxx + vScrumblePosOS.yzx + flWindTimeOffset.xxx ) );
return vPositionOS.xyz + vPositionOffset.xyz;
}
#endif
#endif // _TREE_SWAY_H

View File

@@ -78,6 +78,25 @@ BEGIN_VS_SHADER( SDK_UnlitGeneric, "Help for SDK_UnlitGeneric" )
SHADER_PARAM( DEPTHBLENDSCALE, SHADER_PARAM_TYPE_FLOAT, "50.0", "Amplify or reduce DEPTHBLEND fading. Lower values make harder edges." )
SHADER_PARAM( RECEIVEFLASHLIGHT, SHADER_PARAM_TYPE_INTEGER, "0", "Forces this material to receive flashlights." )
// vertexlitgeneric tree sway animation control (on unlitgeneric)
SHADER_PARAM( TREESWAY, SHADER_PARAM_TYPE_INTEGER, "0", "" )
SHADER_PARAM( TREESWAYHEIGHT, SHADER_PARAM_TYPE_FLOAT, "1000", "" )
SHADER_PARAM( TREESWAYSTARTHEIGHT, SHADER_PARAM_TYPE_FLOAT, "0.2", "" )
SHADER_PARAM( TREESWAYRADIUS, SHADER_PARAM_TYPE_FLOAT, "300", "" )
SHADER_PARAM( TREESWAYSTARTRADIUS, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSPEED, SHADER_PARAM_TYPE_FLOAT, "1", "" )
SHADER_PARAM( TREESWAYSPEEDHIGHWINDMULTIPLIER, SHADER_PARAM_TYPE_FLOAT, "2", "" )
SHADER_PARAM( TREESWAYSTRENGTH, SHADER_PARAM_TYPE_FLOAT, "10", "" )
SHADER_PARAM( TREESWAYSCRUMBLESPEED, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLESTRENGTH, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFREQUENCY, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.5", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.0", "" )
SHADER_PARAM( TREESWAYSPEEDLERPSTART, SHADER_PARAM_TYPE_FLOAT, "3", "" )
SHADER_PARAM( TREESWAYSPEEDLERPEND, SHADER_PARAM_TYPE_FLOAT, "6", "" )
SHADER_PARAM( TREESWAYSTATIC, SHADER_PARAM_TYPE_BOOL, "0", "" )
SHADER_PARAM( TREESWAYSTATICVALUES, SHADER_PARAM_TYPE_VEC2, "[0.5 0.5]", "" )
END_SHADER_PARAMS
void SetupVars( VertexLitGeneric_DX9_Vars_t& info )
@@ -157,6 +176,24 @@ BEGIN_VS_SHADER( SDK_UnlitGeneric, "Help for SDK_UnlitGeneric" )
info.m_nDepthBlend = DEPTHBLEND;
info.m_nDepthBlendScale = DEPTHBLENDSCALE;
info.m_nReceiveFlashlight = RECEIVEFLASHLIGHT;
info.m_nTreeSway = TREESWAY;
info.m_nTreeSwayHeight = TREESWAYHEIGHT;
info.m_nTreeSwayStartHeight = TREESWAYSTARTHEIGHT;
info.m_nTreeSwayRadius = TREESWAYRADIUS;
info.m_nTreeSwayStartRadius = TREESWAYSTARTRADIUS;
info.m_nTreeSwaySpeed = TREESWAYSPEED;
info.m_nTreeSwaySpeedHighWindMultiplier = TREESWAYSPEEDHIGHWINDMULTIPLIER;
info.m_nTreeSwayStrength = TREESWAYSTRENGTH;
info.m_nTreeSwayScrumbleSpeed = TREESWAYSCRUMBLESPEED;
info.m_nTreeSwayScrumbleStrength = TREESWAYSCRUMBLESTRENGTH;
info.m_nTreeSwayScrumbleFrequency = TREESWAYSCRUMBLEFREQUENCY;
info.m_nTreeSwayFalloffExp = TREESWAYFALLOFFEXP;
info.m_nTreeSwayScrumbleFalloffExp = TREESWAYSCRUMBLEFALLOFFEXP;
info.m_nTreeSwaySpeedLerpStart = TREESWAYSPEEDLERPSTART;
info.m_nTreeSwaySpeedLerpEnd = TREESWAYSPEEDLERPEND;
info.m_nTreeSwayStatic = TREESWAYSTATIC;
info.m_nTreeSwayStaticValues = TREESWAYSTATICVALUES;
}
SHADER_INIT_PARAMS()

View File

@@ -143,6 +143,25 @@ BEGIN_VS_SHADER( SDK_VertexLitGeneric, "Help for SDK_VertexLitGeneric" )
#ifdef MAPBASE
SHADER_PARAM( PHONGDISABLEHALFLAMBERT, SHADER_PARAM_TYPE_BOOL, "0", "Disable half lambert for phong" )
#endif
// vertexlitgeneric tree sway animation control
SHADER_PARAM( TREESWAY, SHADER_PARAM_TYPE_INTEGER, "0", "" )
SHADER_PARAM( TREESWAYHEIGHT, SHADER_PARAM_TYPE_FLOAT, "1000", "" )
SHADER_PARAM( TREESWAYSTARTHEIGHT, SHADER_PARAM_TYPE_FLOAT, "0.2", "" )
SHADER_PARAM( TREESWAYRADIUS, SHADER_PARAM_TYPE_FLOAT, "300", "" )
SHADER_PARAM( TREESWAYSTARTRADIUS, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSPEED, SHADER_PARAM_TYPE_FLOAT, "1", "" )
SHADER_PARAM( TREESWAYSPEEDHIGHWINDMULTIPLIER, SHADER_PARAM_TYPE_FLOAT, "2", "" )
SHADER_PARAM( TREESWAYSTRENGTH, SHADER_PARAM_TYPE_FLOAT, "10", "" )
SHADER_PARAM( TREESWAYSCRUMBLESPEED, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLESTRENGTH, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFREQUENCY, SHADER_PARAM_TYPE_FLOAT, "0.1", "" )
SHADER_PARAM( TREESWAYFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.5", "" )
SHADER_PARAM( TREESWAYSCRUMBLEFALLOFFEXP, SHADER_PARAM_TYPE_FLOAT, "1.0", "" )
SHADER_PARAM( TREESWAYSPEEDLERPSTART, SHADER_PARAM_TYPE_FLOAT, "3", "" )
SHADER_PARAM( TREESWAYSPEEDLERPEND, SHADER_PARAM_TYPE_FLOAT, "6", "" )
SHADER_PARAM( TREESWAYSTATIC, SHADER_PARAM_TYPE_BOOL, "0", "" )
SHADER_PARAM( TREESWAYSTATICVALUES, SHADER_PARAM_TYPE_VEC2, "[0.5 0.5]", "" )
END_SHADER_PARAMS
void SetupVars( VertexLitGeneric_DX9_Vars_t& info )
@@ -222,6 +241,24 @@ BEGIN_VS_SHADER( SDK_VertexLitGeneric, "Help for SDK_VertexLitGeneric" )
#ifdef MAPBASE
info.m_nPhongDisableHalfLambert = PHONGDISABLEHALFLAMBERT;
#endif
info.m_nTreeSway = TREESWAY;
info.m_nTreeSwayHeight = TREESWAYHEIGHT;
info.m_nTreeSwayStartHeight = TREESWAYSTARTHEIGHT;
info.m_nTreeSwayRadius = TREESWAYRADIUS;
info.m_nTreeSwayStartRadius = TREESWAYSTARTRADIUS;
info.m_nTreeSwaySpeed = TREESWAYSPEED;
info.m_nTreeSwaySpeedHighWindMultiplier = TREESWAYSPEEDHIGHWINDMULTIPLIER;
info.m_nTreeSwayStrength = TREESWAYSTRENGTH;
info.m_nTreeSwayScrumbleSpeed = TREESWAYSCRUMBLESPEED;
info.m_nTreeSwayScrumbleStrength = TREESWAYSCRUMBLESTRENGTH;
info.m_nTreeSwayScrumbleFrequency = TREESWAYSCRUMBLEFREQUENCY;
info.m_nTreeSwayFalloffExp = TREESWAYFALLOFFEXP;
info.m_nTreeSwayScrumbleFalloffExp = TREESWAYSCRUMBLEFALLOFFEXP;
info.m_nTreeSwaySpeedLerpStart = TREESWAYSPEEDLERPSTART;
info.m_nTreeSwaySpeedLerpEnd = TREESWAYSPEEDLERPEND;
info.m_nTreeSwayStatic = TREESWAYSTATIC;
info.m_nTreeSwayStaticValues = TREESWAYSTATICVALUES;
}
// Cloak Pass

View File

@@ -223,6 +223,22 @@ void InitParamsVertexLitGeneric_DX9( CBaseVSShader *pShader, IMaterialVar** para
InitIntParam( info.m_nDepthBlend, params, 0 );
InitFloatParam( info.m_nDepthBlendScale, params, 50.0f );
InitIntParam( info.m_nTreeSway, params, 0 );
InitFloatParam( info.m_nTreeSwayHeight, params, 1000.0f );
InitFloatParam( info.m_nTreeSwayStartHeight, params, 0.1f );
InitFloatParam( info.m_nTreeSwayRadius, params, 300.0f );
InitFloatParam( info.m_nTreeSwayStartRadius, params, 0.2f );
InitFloatParam( info.m_nTreeSwaySpeed, params, 1.0f );
InitFloatParam( info.m_nTreeSwaySpeedHighWindMultiplier, params, 2.0f );
InitFloatParam( info.m_nTreeSwayStrength, params, 10.0f );
InitFloatParam( info.m_nTreeSwayScrumbleSpeed, params, 5.0f );
InitFloatParam( info.m_nTreeSwayScrumbleStrength, params, 10.0f );
InitFloatParam( info.m_nTreeSwayScrumbleFrequency, params, 12.0f );
InitFloatParam( info.m_nTreeSwayFalloffExp, params, 1.5f );
InitFloatParam( info.m_nTreeSwayScrumbleFalloffExp, params, 1.0f );
InitFloatParam( info.m_nTreeSwaySpeedLerpStart, params, 3.0f );
InitFloatParam( info.m_nTreeSwaySpeedLerpEnd, params, 6.0f );
}
@@ -391,6 +407,8 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
bFlashlightNoLambert = true;
}
int nTreeSwayMode = clamp( GetIntParam( info.m_nTreeSway, params, 0 ), 0, 2 );
bool bTreeSway = nTreeSwayMode != 0;
bool bAmbientOnly = IsBoolSet( info.m_nAmbientOnly, params );
float fBlendFactor = GetFloatParam( info.m_nDetailTextureBlendFactor, params, 1.0 );
@@ -429,14 +447,11 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
bool bHasVertexColor = bVertexLitGeneric ? false : IS_FLAG_SET( MATERIAL_VAR_VERTEXCOLOR );
bool bHasVertexAlpha = bVertexLitGeneric ? false : IS_FLAG_SET( MATERIAL_VAR_VERTEXALPHA );
/*^*/ // printf("\t\t[%d] bHasVertexColor\n",(int)bHasVertexColor);
/*^*/ // printf("\t\t[%d] bHasVertexAlpha\n",(int)bHasVertexAlpha);
if ( pShader->IsSnapshotting() || (! pContextData ) || ( pContextData->m_bMaterialVarsChanged ) )
{
/*^*/ // printf("\t\t[1] snapshotting=%d pContextData=%08x pContextData->m_bMaterialVarsChanged=%d \n",(int)pShader->IsSnapshotting(), (int)pContextData, pContextData ? (int)pContextData->m_bMaterialVarsChanged : -1 );
bool bSeamlessBase = IsBoolSet( info.m_nSeamlessBase, params );
bool bSeamlessDetail = IsBoolSet( info.m_nSeamlessDetail, params );
bool bSeamlessBase = IsBoolSet( info.m_nSeamlessBase, params ) && !bTreeSway;
bool bSeamlessDetail = IsBoolSet( info.m_nSeamlessDetail, params ) && !bTreeSway;
bool bDistanceAlpha = IsBoolSet( info.m_nDistanceAlpha, params );
bool bHasSelfIllum = (!bHasFlashlight || IsX360() ) && IS_FLAG_SET( MATERIAL_VAR_SELFILLUM );
bool bHasEnvmapMask = (!bHasFlashlight || IsX360() ) && info.m_nEnvmapMask != -1 && params[info.m_nEnvmapMask]->IsTexture();
@@ -778,6 +793,7 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
SET_STATIC_VERTEX_SHADER_COMBO( SEPARATE_DETAIL_UVS, IsBoolSet( info.m_nSeparateDetailUVs, params ) );
SET_STATIC_VERTEX_SHADER_COMBO( USE_STATIC_CONTROL_FLOW, bUseStaticControlFlow );
SET_STATIC_VERTEX_SHADER_COMBO( DONT_GAMMA_CONVERT_VERTEX_COLOR, (! bSRGBWrite ) && bHasVertexColor );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, bTreeSway ? nTreeSwayMode : 0 );
SET_STATIC_VERTEX_SHADER( sdk_vertexlit_and_unlit_generic_vs20 );
//if ( g_pHardwareConfig->SupportsPixelShaders_2_b() || g_pHardwareConfig->ShouldAlwaysUseShaderModel2bShaders() ) // Always send Gl this way
@@ -852,6 +868,7 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
SET_STATIC_VERTEX_SHADER_COMBO( DECAL, bIsDecal );
SET_STATIC_VERTEX_SHADER_COMBO( SM30_VERTEXID, bFastVertexTextures );
SET_STATIC_VERTEX_SHADER_COMBO( DONT_GAMMA_CONVERT_VERTEX_COLOR, bSRGBWrite ? 0 : 1 );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, bTreeSway ? nTreeSwayMode : 0 );
SET_STATIC_VERTEX_SHADER( sdk_vertexlit_and_unlit_generic_vs30 );
DECLARE_STATIC_PIXEL_SHADER( sdk_vertexlit_and_unlit_generic_ps30 );
@@ -957,10 +974,13 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
if ( bHasDetailTexture )
{
if ( IS_PARAM_DEFINED( info.m_nDetailTextureTransform ) )
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nDetailTextureTransform, info.m_nDetailScale );
else
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nBaseTextureTransform, info.m_nDetailScale );
if ( !bTreeSway )
{
if ( IS_PARAM_DEFINED( info.m_nDetailTextureTransform ) )
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nDetailTextureTransform, info.m_nDetailScale );
else
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nBaseTextureTransform, info.m_nDetailScale );
}
//Assert( !bHasBump );
if ( info.m_nDetailTint != -1 )
pContextData->m_SemiStaticCmdsOut.SetPixelShaderConstantGammaToLinear( 10, info.m_nDetailTint );
@@ -1173,6 +1193,36 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
}
pContextData->m_SemiStaticCmdsOut.SetPixelShaderConstant_W( 4, info.m_nSelfIllumTint, fBlendFactor );
pContextData->m_SemiStaticCmdsOut.SetAmbientCubeDynamicStateVertexShader();
if ( bTreeSway )
{
float flParams[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
flParams[0] = GetFloatParam( info.m_nTreeSwaySpeedHighWindMultiplier, params, 2.0f );
flParams[1] = GetFloatParam( info.m_nTreeSwayScrumbleFalloffExp, params, 1.0f );
flParams[2] = GetFloatParam( info.m_nTreeSwayFalloffExp, params, 1.0f );
flParams[3] = GetFloatParam( info.m_nTreeSwayScrumbleSpeed, params, 3.0f );
pContextData->m_SemiStaticCmdsOut.SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_6, flParams );
flParams[0] = GetFloatParam( info.m_nTreeSwaySpeedLerpStart, params, 3.0f );
flParams[1] = GetFloatParam( info.m_nTreeSwaySpeedLerpEnd, params, 6.0f );
flParams[2] = 0;
flParams[3] = 0;
pContextData->m_SemiStaticCmdsOut.SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, flParams );
flParams[0] = GetFloatParam( info.m_nTreeSwayHeight, params, 1000.0f );
flParams[1] = GetFloatParam( info.m_nTreeSwayStartHeight, params, 0.1f );
flParams[2] = GetFloatParam( info.m_nTreeSwayRadius, params, 300.0f );
flParams[3] = GetFloatParam( info.m_nTreeSwayStartRadius, params, 0.2f );
pContextData->m_SemiStaticCmdsOut.SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_8, flParams );
flParams[0] = GetFloatParam( info.m_nTreeSwaySpeed, params, 1.0f );
flParams[1] = GetFloatParam( info.m_nTreeSwayStrength, params, 10.0f );
flParams[2] = GetFloatParam( info.m_nTreeSwayScrumbleFrequency, params, 12.0f );
flParams[3] = GetFloatParam( info.m_nTreeSwayScrumbleStrength, params, 10.0f );
pContextData->m_SemiStaticCmdsOut.SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_9, flParams );
}
pContextData->m_SemiStaticCmdsOut.End();
}
}
@@ -1435,6 +1485,25 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
DynamicCmdsOut.SetPixelShaderConstant( 24, worldToTexture.Base(), 4 );
}
if ( bTreeSway )
{
float fTempConst[4];
fTempConst[1] = pShaderAPI->CurrentTime();
if ( params[info.m_nTreeSwayStatic]->GetIntValue() == 0 )
{
const Vector& windDir = pShaderAPI->GetVectorRenderingParameter( VECTOR_RENDERPARM_WIND_DIRECTION );
fTempConst[2] = windDir.x;
fTempConst[3] = windDir.y;
}
else
{
// Use a static value instead of the env_wind value.
params[info.m_nTreeSwayStaticValues]->GetVecValue( fTempConst+2, 2 );
}
DynamicCmdsOut.SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_7, fTempConst );
}
DynamicCmdsOut.End();
pShaderAPI->ExecuteCommandBuffer( DynamicCmdsOut.Base() );
}

View File

@@ -136,6 +136,23 @@ struct VertexLitGeneric_DX9_Vars_t
int m_nPhongDisableHalfLambert;
#endif
int m_nTreeSway;
int m_nTreeSwayHeight;
int m_nTreeSwayStartHeight;
int m_nTreeSwayRadius;
int m_nTreeSwayStartRadius;
int m_nTreeSwaySpeed;
int m_nTreeSwaySpeedHighWindMultiplier;
int m_nTreeSwayStrength;
int m_nTreeSwayScrumbleSpeed;
int m_nTreeSwayScrumbleStrength;
int m_nTreeSwayScrumbleFrequency;
int m_nTreeSwayFalloffExp;
int m_nTreeSwayScrumbleFalloffExp;
int m_nTreeSwaySpeedLerpStart;
int m_nTreeSwaySpeedLerpEnd;
int m_nTreeSwayStatic;
int m_nTreeSwayStaticValues;
};
void InitParamsVertexLitGeneric_DX9( CBaseVSShader *pShader, IMaterialVar** params, const char *pMaterialName, bool bVertexLitGeneric, VertexLitGeneric_DX9_Vars_t &info );