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

@ -1210,6 +1210,7 @@ BEGIN_RECV_TABLE_NOBASE(CEnvWindShared, DT_EnvWindShared)
RecvPropFloat (RECVINFO(m_windRadius)), RecvPropFloat (RECVINFO(m_windRadius)),
RecvPropFloat (RECVINFO(m_windRadiusInner)), RecvPropFloat (RECVINFO(m_windRadiusInner)),
RecvPropVector (RECVINFO(m_location)), RecvPropVector (RECVINFO(m_location)),
RecvPropFloat (RECVINFO(m_flTreeSwayScale)),
#endif #endif
END_RECV_TABLE() END_RECV_TABLE()

View File

@ -159,6 +159,70 @@ string_t Templates_FindByTargetName(const char *pszName)
return NULL_STRING; return NULL_STRING;
} }
#ifdef MAPBASE
//-----------------------------------------------------------------------------
// Purpose: A new version of name fixup which targets all instances of a name
// in a keyvalue, including output parameters.
//-----------------------------------------------------------------------------
void Templates_NewNameFixup( CUtlVector< grouptemplate_t > &GroupTemplates, int i, int iCount, CEntityMapData *mapData, CUtlDict< int, int > &KeyInstanceCount, char *keyName, char *value )
{
do
{
// Ignore targetnames
if ( !stricmp( keyName, "targetname" ) )
continue;
// Add to the count for this
int idx = KeyInstanceCount.Find( keyName );
if ( idx == KeyInstanceCount.InvalidIndex() )
{
idx = KeyInstanceCount.Insert( keyName, 0 );
}
KeyInstanceCount[idx]++;
// Loop through our group templates
for ( int iTName = 0; iTName < iCount; iTName++ )
{
char *pName = GroupTemplates[iTName].pszName;
if (strstr( value, pName ) == NULL)
continue;
if ( template_debug.GetInt() )
{
Msg("Template Connection Found: Key %s (\"%s\") in entity named \"%s\"(%d) matches entity %d's targetname\n", keyName, value, GroupTemplates[i].pszName, i, iTName );
}
char newvalue[MAPKEY_MAXLENGTH];
char fixedup[MAPKEY_MAXLENGTH];
Q_strncpy( fixedup, pName, MAPKEY_MAXLENGTH );
Q_strncat( fixedup, ENTITYIO_FIXUP_STRING, sizeof( fixedup ), COPY_ALL_CHARACTERS );
// Get the current key instance. (-1 because it's this one we're changing)
int nKeyInstance = KeyInstanceCount[idx] - 1;
// Add our IO value to the targetname
V_StrSubst( value, pName, fixedup, newvalue, MAPKEY_MAXLENGTH );
if ( template_debug.GetInt() )
{
Msg(" Fixed up value: Key %s with \"%s\" in entity named \"%s\"(%d) has become \"%s\"\n", keyName, value, GroupTemplates[i].pszName, i, newvalue );
}
mapData->SetValue( keyName, newvalue, nKeyInstance );
Q_strncpy( value, newvalue, MAPKEY_MAXLENGTH );
// Remember we changed this targetname
GroupTemplates[iTName].bChangeTargetname = true;
// Set both entity's flags telling them their template needs fixup when it's spawned
g_Templates[ GroupTemplates[i].iIndex ]->bNeedsEntityIOFixup = true;
g_Templates[ GroupTemplates[iTName].iIndex ]->bNeedsEntityIOFixup = true;
}
}
while ( mapData->GetNextKey(keyName, value) );
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: A CPointTemplate has asked us to reconnect all the entity I/O links // Purpose: A CPointTemplate has asked us to reconnect all the entity I/O links
// inside it's templates. Go through the keys and add look for values // inside it's templates. Go through the keys and add look for values
@ -208,6 +272,14 @@ void Templates_ReconnectIOForGroup( CPointTemplate *pGroup )
if ( !mapData->GetFirstKey(keyName, value) ) if ( !mapData->GetFirstKey(keyName, value) )
continue; continue;
#ifdef MAPBASE
if ( pGroup->NameFixupExpanded() )
{
Templates_NewNameFixup( GroupTemplates, i, iCount, mapData, KeyInstanceCount, keyName, value );
continue;
}
#endif
do do
{ {
// Ignore targetnames // Ignore targetnames

View File

@ -2041,6 +2041,29 @@ void CAI_BaseNPC::InputSetDistTooFar( inputdata_t &inputdata )
} }
} }
} }
//------------------------------------------------------------------------------
// Purpose:
//------------------------------------------------------------------------------
void CAI_BaseNPC::InputSetTarget( inputdata_t &inputdata )
{
m_target = inputdata.value.StringID();
if ( m_target != NULL_STRING )// this npc has a target
{
// Find the npc's initial target entity, stash it
SetGoalEnt( gEntList.FindEntityByName( NULL, m_target ) );
if ( !GetGoalEnt() )
{
Warning( "ReadyNPC()--%s couldn't find target %s\n", GetClassname(), STRING(m_target));
}
else
{
StartTargetHandling( GetGoalEnt() );
}
}
}
#endif #endif
//--------------------------------------------------------- //---------------------------------------------------------

View File

@ -1117,6 +1117,9 @@ public:
CBaseEntity *GetEnemyOccluder(void); CBaseEntity *GetEnemyOccluder(void);
virtual void StartTargetHandling( CBaseEntity *pTargetEnt ); virtual void StartTargetHandling( CBaseEntity *pTargetEnt );
#ifdef MAPBASE
void InputSetTarget( inputdata_t &inputdata );
#endif
//--------------------------------- //---------------------------------

View File

@ -125,6 +125,9 @@ bool CAI_RappelBehavior::KeyValue( const char *szKeyName, const char *szValue )
void CAI_RappelBehavior::Precache() void CAI_RappelBehavior::Precache()
{ {
#ifdef MAPBASE
CBaseEntity::PrecacheModel( "cable/cable_rappel.vmt" );
#endif
CBaseEntity::PrecacheModel( "cable/cable.vmt" ); CBaseEntity::PrecacheModel( "cable/cable.vmt" );
} }
@ -386,7 +389,11 @@ void CAI_RappelBehavior::CreateZipline()
if( attachment > 0 ) if( attachment > 0 )
{ {
CBeam *pBeam; CBeam *pBeam;
#ifdef MAPBASE
pBeam = CBeam::BeamCreate( "cable/cable_rappel.vmt", 1 );
#else
pBeam = CBeam::BeamCreate( "cable/cable.vmt", 1 ); pBeam = CBeam::BeamCreate( "cable/cable.vmt", 1 );
#endif
pBeam->SetColor( 150, 150, 150 ); pBeam->SetColor( 150, 150, 150 );
pBeam->SetWidth( 0.3 ); pBeam->SetWidth( 0.3 );
pBeam->SetEndWidth( 0.3 ); pBeam->SetEndWidth( 0.3 );

View File

@ -157,6 +157,7 @@ BEGIN_ENT_SCRIPTDESC( CBaseCombatCharacter, CBaseFlex, "The base class shared by
DEFINE_SCRIPTFUNC( WeaponCount, "Get the number of weapons a character possesses." ) DEFINE_SCRIPTFUNC( WeaponCount, "Get the number of weapons a character possesses." )
DEFINE_SCRIPTFUNC_NAMED( GetScriptWeaponIndex, "GetWeapon", "Get a specific weapon in the character's inventory." ) DEFINE_SCRIPTFUNC_NAMED( GetScriptWeaponIndex, "GetWeapon", "Get a specific weapon in the character's inventory." )
DEFINE_SCRIPTFUNC_NAMED( GetScriptWeaponByType, "FindWeapon", "Find a specific weapon in the character's inventory by its classname." ) DEFINE_SCRIPTFUNC_NAMED( GetScriptWeaponByType, "FindWeapon", "Find a specific weapon in the character's inventory by its classname." )
DEFINE_SCRIPTFUNC_NAMED( GetScriptAllWeapons, "GetAllWeapons", "Get the character's weapon inventory." )
DEFINE_SCRIPTFUNC_NAMED( Weapon_ShootPosition, "ShootPosition", "Get the character's shoot position." ) DEFINE_SCRIPTFUNC_NAMED( Weapon_ShootPosition, "ShootPosition", "Get the character's shoot position." )
DEFINE_SCRIPTFUNC_NAMED( Weapon_DropAll, "DropAllWeapons", "Make the character drop all of its weapons." ) DEFINE_SCRIPTFUNC_NAMED( Weapon_DropAll, "DropAllWeapons", "Make the character drop all of its weapons." )
@ -4377,6 +4378,19 @@ HSCRIPT CBaseCombatCharacter::GetScriptWeaponByType( const char *pszWeapon, int
return ToHScript( Weapon_OwnsThisType( pszWeapon, iSubType ) ); return ToHScript( Weapon_OwnsThisType( pszWeapon, iSubType ) );
} }
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseCombatCharacter::GetScriptAllWeapons( HSCRIPT hTable )
{
for (int i=0;i<MAX_WEAPONS;i++)
{
if (m_hMyWeapons[i])
{
g_pScriptVM->SetValue( hTable, m_hMyWeapons[i]->GetClassname(), ToHScript( m_hMyWeapons[i] ) );
}
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void CBaseCombatCharacter::ScriptEquipWeapon( HSCRIPT hWeapon ) void CBaseCombatCharacter::ScriptEquipWeapon( HSCRIPT hWeapon )

View File

@ -414,6 +414,7 @@ public:
HSCRIPT GetScriptActiveWeapon(); HSCRIPT GetScriptActiveWeapon();
HSCRIPT GetScriptWeaponIndex( int i ); HSCRIPT GetScriptWeaponIndex( int i );
HSCRIPT GetScriptWeaponByType( const char *pszWeapon, int iSubType = 0 ); HSCRIPT GetScriptWeaponByType( const char *pszWeapon, int iSubType = 0 );
void GetScriptAllWeapons( HSCRIPT hTable );
void ScriptEquipWeapon( HSCRIPT hWeapon ); void ScriptEquipWeapon( HSCRIPT hWeapon );

View File

@ -2210,11 +2210,15 @@ BEGIN_ENT_SCRIPTDESC_ROOT( CBaseEntity, "Root class of all server-side entities"
DEFINE_SCRIPTFUNC_NAMED( ScriptTakeDamage, "TakeDamage", "Apply damage to this entity with a given info handle" ) DEFINE_SCRIPTFUNC_NAMED( ScriptTakeDamage, "TakeDamage", "Apply damage to this entity with a given info handle" )
DEFINE_SCRIPTFUNC_NAMED( ScriptFireBullets, "FireBullets", "Fire bullets from entity with a given info handle" ) DEFINE_SCRIPTFUNC_NAMED( ScriptFireBullets, "FireBullets", "Fire bullets from entity with a given info handle" )
DEFINE_SCRIPTFUNC( TakeHealth, "Give this entity health" )
DEFINE_SCRIPTFUNC( IsAlive, "Return true if this entity is alive" )
DEFINE_SCRIPTFUNC_NAMED( ScriptGetContext, "GetContext", "Get a response context value" ) DEFINE_SCRIPTFUNC_NAMED( ScriptGetContext, "GetContext", "Get a response context value" )
DEFINE_SCRIPTFUNC_NAMED( ScriptAddContext, "AddContext", "Add a response context value" ) DEFINE_SCRIPTFUNC_NAMED( ScriptAddContext, "AddContext", "Add a response context value" )
DEFINE_SCRIPTFUNC_NAMED( ScriptClassify, "Classify", "Get Class_T class ID" ) DEFINE_SCRIPTFUNC_NAMED( ScriptClassify, "Classify", "Get Class_T class ID" )
DEFINE_SCRIPTFUNC_NAMED( ScriptAddOutput, "AddOutput", "Add an output" )
DEFINE_SCRIPTFUNC_NAMED( ScriptGetKeyValue, "GetKeyValue", "Get a keyvalue" ) DEFINE_SCRIPTFUNC_NAMED( ScriptGetKeyValue, "GetKeyValue", "Get a keyvalue" )
DEFINE_SCRIPTFUNC( GetSpawnFlags, "Get spawnflags" ) DEFINE_SCRIPTFUNC( GetSpawnFlags, "Get spawnflags" )
@ -9605,6 +9609,14 @@ int CBaseEntity::ScriptClassify( void )
return (int)Classify(); return (int)Classify();
} }
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CBaseEntity::ScriptAddOutput( const char *pszOutputName, const char *pszTarget, const char *pszAction, const char *pszParameter, float flDelay, int iMaxTimes )
{
const char *pszValue = UTIL_VarArgs("%s,%s,%s,%f,%i", pszTarget, pszAction, pszParameter, flDelay, iMaxTimes);
return KeyValue( pszOutputName, pszValue );
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char *CBaseEntity::ScriptGetKeyValue( const char *pszKeyName ) const char *CBaseEntity::ScriptGetKeyValue( const char *pszKeyName )

View File

@ -2018,6 +2018,7 @@ public:
int ScriptClassify(void); int ScriptClassify(void);
bool ScriptAddOutput( const char *pszOutputName, const char *pszTarget, const char *pszAction, const char *pszParameter, float flDelay, int iMaxTimes );
const char *ScriptGetKeyValue( const char *pszKeyName ); const char *ScriptGetKeyValue( const char *pszKeyName );
#endif #endif

View File

@ -1594,6 +1594,7 @@ BEGIN_DATADESC( CEnvWind )
#ifdef MAPBASE #ifdef MAPBASE
DEFINE_KEYFIELD( m_EnvWindShared.m_windRadius, FIELD_FLOAT, "windradius" ), DEFINE_KEYFIELD( m_EnvWindShared.m_windRadius, FIELD_FLOAT, "windradius" ),
DEFINE_KEYFIELD( m_EnvWindShared.m_windRadiusInner, FIELD_FLOAT, "windradiusinner" ), DEFINE_KEYFIELD( m_EnvWindShared.m_windRadiusInner, FIELD_FLOAT, "windradiusinner" ),
DEFINE_KEYFIELD( m_EnvWindShared.m_flTreeSwayScale, FIELD_FLOAT, "treeswayscale" ),
#endif #endif
// Just here to quiet down classcheck // Just here to quiet down classcheck
@ -1602,6 +1603,20 @@ BEGIN_DATADESC( CEnvWind )
DEFINE_FIELD( m_EnvWindShared.m_iWindDir, FIELD_INTEGER ), DEFINE_FIELD( m_EnvWindShared.m_iWindDir, FIELD_INTEGER ),
DEFINE_FIELD( m_EnvWindShared.m_flWindSpeed, FIELD_FLOAT ), DEFINE_FIELD( m_EnvWindShared.m_flWindSpeed, FIELD_FLOAT ),
#ifdef MAPBASE
DEFINE_INPUT( m_EnvWindShared.m_iMinWind, FIELD_INTEGER, "SetMinWind" ),
DEFINE_INPUT( m_EnvWindShared.m_iMaxWind, FIELD_INTEGER, "SetMaxWind" ),
DEFINE_INPUT( m_EnvWindShared.m_iMinGust, FIELD_INTEGER, "SetMinGust" ),
DEFINE_INPUT( m_EnvWindShared.m_iMaxGust, FIELD_INTEGER, "SetMaxGust" ),
DEFINE_INPUT( m_EnvWindShared.m_flMinGustDelay, FIELD_FLOAT, "SetMinGustDelay" ),
DEFINE_INPUT( m_EnvWindShared.m_flMaxGustDelay, FIELD_FLOAT, "SetMaxGustDelay" ),
DEFINE_INPUT( m_EnvWindShared.m_iGustDirChange, FIELD_INTEGER, "SetGustDirChange" ),
DEFINE_INPUT( m_EnvWindShared.m_flGustDuration, FIELD_FLOAT, "SetGustDuration" ),
DEFINE_INPUT( m_EnvWindShared.m_windRadius, FIELD_FLOAT, "SetWindRadius" ),
DEFINE_INPUT( m_EnvWindShared.m_windRadiusInner, FIELD_FLOAT, "SetWindRadiusInner" ),
DEFINE_INPUT( m_EnvWindShared.m_flTreeSwayScale, FIELD_FLOAT, "SetTreeSwayScale" ),
#endif
DEFINE_OUTPUT( m_EnvWindShared.m_OnGustStart, "OnGustStart" ), DEFINE_OUTPUT( m_EnvWindShared.m_OnGustStart, "OnGustStart" ),
DEFINE_OUTPUT( m_EnvWindShared.m_OnGustEnd, "OnGustEnd" ), DEFINE_OUTPUT( m_EnvWindShared.m_OnGustEnd, "OnGustEnd" ),
@ -1634,6 +1649,7 @@ BEGIN_SEND_TABLE_NOBASE(CEnvWindShared, DT_EnvWindShared)
SendPropFloat (SENDINFO(m_windRadius), 0, SPROP_NOSCALE), SendPropFloat (SENDINFO(m_windRadius), 0, SPROP_NOSCALE),
SendPropFloat (SENDINFO(m_windRadiusInner), 0, SPROP_NOSCALE), SendPropFloat (SENDINFO(m_windRadiusInner), 0, SPROP_NOSCALE),
SendPropVector (SENDINFO(m_location), -1, SPROP_COORD), SendPropVector (SENDINFO(m_location), -1, SPROP_COORD),
SendPropFloat (SENDINFO(m_flTreeSwayScale), 0, SPROP_NOSCALE),
#endif #endif
END_SEND_TABLE() END_SEND_TABLE()

View File

@ -1055,7 +1055,12 @@ void CNPC_MetroPolice::SpeakSentence( int nSentenceType )
{ {
if ( SpeakIfAllowed( TLK_COP_PLAYERHIT, SENTENCE_PRIORITY_HIGH ) ) if ( SpeakIfAllowed( TLK_COP_PLAYERHIT, SENTENCE_PRIORITY_HIGH ) )
{ {
#ifdef MAPBASE
if (GetSquad())
GetSquad()->SquadRemember(bits_MEMORY_PLAYER_HURT);
#else
m_pSquad->SquadRemember(bits_MEMORY_PLAYER_HURT); m_pSquad->SquadRemember(bits_MEMORY_PLAYER_HURT);
#endif
} }
} }
} }

View File

@ -115,10 +115,8 @@ public:
void HandleAnimEvent( animevent_t *pEvent ); void HandleAnimEvent( animevent_t *pEvent );
// Inputs // Inputs
#ifndef MAPBASE
void InputEnterVehicleImmediate( inputdata_t &inputdata ); void InputEnterVehicleImmediate( inputdata_t &inputdata );
void InputEnterVehicle( inputdata_t &inputdata ); void InputEnterVehicle( inputdata_t &inputdata );
#endif
void InputExitVehicle( inputdata_t &inputdata ); void InputExitVehicle( inputdata_t &inputdata );
void InputLock( inputdata_t &inputdata ); void InputLock( inputdata_t &inputdata );
void InputUnlock( inputdata_t &inputdata ); void InputUnlock( inputdata_t &inputdata );
@ -190,10 +188,8 @@ BEGIN_DATADESC( CPropVehiclePrisonerPod )
// Inputs // Inputs
DEFINE_INPUTFUNC( FIELD_VOID, "Lock", InputLock ), DEFINE_INPUTFUNC( FIELD_VOID, "Lock", InputLock ),
DEFINE_INPUTFUNC( FIELD_VOID, "Unlock", InputUnlock ), DEFINE_INPUTFUNC( FIELD_VOID, "Unlock", InputUnlock ),
#ifndef MAPBASE
DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicle", InputEnterVehicle ), DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicle", InputEnterVehicle ),
DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicleImmediate", InputEnterVehicleImmediate ), DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicleImmediate", InputEnterVehicleImmediate ),
#endif
DEFINE_INPUTFUNC( FIELD_VOID, "ExitVehicle", InputExitVehicle ), DEFINE_INPUTFUNC( FIELD_VOID, "ExitVehicle", InputExitVehicle ),
DEFINE_INPUTFUNC( FIELD_VOID, "Open", InputOpen ), DEFINE_INPUTFUNC( FIELD_VOID, "Open", InputOpen ),
DEFINE_INPUTFUNC( FIELD_VOID, "Close", InputClose ), DEFINE_INPUTFUNC( FIELD_VOID, "Close", InputClose ),
@ -587,7 +583,6 @@ void CPropVehiclePrisonerPod::InputUnlock( inputdata_t &inputdata )
} }
#ifndef MAPBASE
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: Force the player to enter the vehicle. // Purpose: Force the player to enter the vehicle.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -650,7 +645,6 @@ void CPropVehiclePrisonerPod::InputEnterVehicleImmediate( inputdata_t &inputdata
Assert( 0 ); Assert( 0 );
} }
} }
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: Force the player to exit the vehicle. // Purpose: Force the player to exit the vehicle.

View File

@ -980,7 +980,7 @@ void CBasePlayer::TraceAttack( const CTakeDamageInfo &inputInfo, const Vector &v
// -------------------------------------------------- // --------------------------------------------------
CAI_BaseNPC *pNPC = info.GetAttacker()->MyNPCPointer(); CAI_BaseNPC *pNPC = info.GetAttacker()->MyNPCPointer();
#ifdef MAPBASE #ifdef MAPBASE
if ( pNPC && (pNPC->CapabilitiesGet() & bits_CAP_NO_HIT_PLAYER) && pNPC->IRelationType( this ) <= D_FR ) if ( pNPC && (pNPC->CapabilitiesGet() & bits_CAP_NO_HIT_PLAYER) && pNPC->IRelationType( this ) > D_FR )
#else #else
if ( pNPC && (pNPC->CapabilitiesGet() & bits_CAP_NO_HIT_PLAYER) && pNPC->IRelationType( this ) != D_HT ) if ( pNPC && (pNPC->CapabilitiesGet() & bits_CAP_NO_HIT_PLAYER) && pNPC->IRelationType( this ) != D_HT )
#endif #endif

View File

@ -55,6 +55,9 @@ BEGIN_DATADESC( CPointTemplate )
DEFINE_KEYFIELD( m_iszTemplateEntityNames[14], FIELD_STRING, "Template15"), DEFINE_KEYFIELD( m_iszTemplateEntityNames[14], FIELD_STRING, "Template15"),
DEFINE_KEYFIELD( m_iszTemplateEntityNames[15], FIELD_STRING, "Template16"), DEFINE_KEYFIELD( m_iszTemplateEntityNames[15], FIELD_STRING, "Template16"),
DEFINE_UTLVECTOR( m_hTemplateEntities, FIELD_CLASSPTR ), DEFINE_UTLVECTOR( m_hTemplateEntities, FIELD_CLASSPTR ),
#ifdef MAPBASE
DEFINE_KEYFIELD( m_bFixupExpanded, FIELD_BOOLEAN, "FixupMode" ),
#endif
DEFINE_UTLVECTOR( m_hTemplates, FIELD_EMBEDDED ), DEFINE_UTLVECTOR( m_hTemplates, FIELD_EMBEDDED ),

View File

@ -46,6 +46,9 @@ public:
void AddTemplate( CBaseEntity *pEntity, const char *pszMapData, int nLen ); void AddTemplate( CBaseEntity *pEntity, const char *pszMapData, int nLen );
bool ShouldRemoveTemplateEntities( void ); bool ShouldRemoveTemplateEntities( void );
bool AllowNameFixup(); bool AllowNameFixup();
#ifdef MAPBASE
bool NameFixupExpanded() { return m_bFixupExpanded; }
#endif
// Templates accessors // Templates accessors
int GetNumTemplates( void ); int GetNumTemplates( void );
@ -74,6 +77,12 @@ private:
// code removes all the entities in it once it finishes turning them into templates. // code removes all the entities in it once it finishes turning them into templates.
CUtlVector< CBaseEntity * > m_hTemplateEntities; CUtlVector< CBaseEntity * > m_hTemplateEntities;
#ifdef MAPBASE
// Allows name fixup to target all instances of a name in a keyvalue, including output parameters.
// TODO: Support for multiple fixup modes?
bool m_bFixupExpanded;
#endif
// List of templates, generated from our template entities. // List of templates, generated from our template entities.
CUtlVector< template_t > m_hTemplates; CUtlVector< template_t > m_hTemplates;

View File

@ -24,6 +24,21 @@ Ammo_t *CAmmoDef::GetAmmoOfIndex(int nAmmoIndex)
return &m_AmmoType[ nAmmoIndex ]; return &m_AmmoType[ nAmmoIndex ];
} }
#ifdef MAPBASE
//-----------------------------------------------------------------------------
// Purpose:
// Input :
// Output :
//-----------------------------------------------------------------------------
const char* CAmmoDef::Name(int nAmmoIndex)
{
if ( nAmmoIndex < 1 || nAmmoIndex >= m_nAmmoIndex )
return NULL;
return m_AmmoType[nAmmoIndex].pName;
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: // Purpose:
// Input : // Input :
@ -292,4 +307,22 @@ CAmmoDef::~CAmmoDef( void )
} }
} }
#ifdef MAPBASE_VSCRIPT
BEGIN_SCRIPTDESC_ROOT( CAmmoDef, SCRIPT_SINGLETON "The ammo type definition manager." )
DEFINE_SCRIPTFUNC( Name, "Gets the name of the specified ammo type index." )
DEFINE_SCRIPTFUNC( Index, "Gets the index of the specified ammo type name." )
DEFINE_SCRIPTFUNC( PlrDamage, "Gets the damage players deal for the specified ammo type." )
DEFINE_SCRIPTFUNC( NPCDamage, "Gets the damage NPCs deal for the specified ammo type." )
DEFINE_SCRIPTFUNC( MaxCarry, "Gets the maximum amount of this ammo type which players should be able to carry." )
DEFINE_SCRIPTFUNC( DamageType, "Gets the type of damage this ammo type deals." )
DEFINE_SCRIPTFUNC( TracerType, "Gets the type of tracer this ammo type uses." )
DEFINE_SCRIPTFUNC( DamageForce, "Gets the amount of force this ammo type deals." )
DEFINE_SCRIPTFUNC( MinSplashSize, "Gets the minimum size of water splashes caused by impacts from this ammo type." )
DEFINE_SCRIPTFUNC( MaxSplashSize, "Gets the maximum size of water splashes caused by impacts from this ammo type." )
DEFINE_SCRIPTFUNC( Flags, "Gets the flags this ammo type uses." )
END_SCRIPTDESC();
#endif

View File

@ -72,6 +72,9 @@ public:
Ammo_t m_AmmoType[MAX_AMMO_TYPES]; Ammo_t m_AmmoType[MAX_AMMO_TYPES];
Ammo_t *GetAmmoOfIndex(int nAmmoIndex); Ammo_t *GetAmmoOfIndex(int nAmmoIndex);
#ifdef MAPBASE
const char* Name(int nAmmoIndex);
#endif
int Index(const char *psz); int Index(const char *psz);
int PlrDamage(int nAmmoIndex); int PlrDamage(int nAmmoIndex);
int NPCDamage(int nAmmoIndex); int NPCDamage(int nAmmoIndex);

View File

@ -1801,22 +1801,6 @@ void CBaseCombatWeapon::InputHideWeapon( inputdata_t &inputdata )
SetWeaponVisible( false ); SetWeaponVisible( false );
} }
} }
#ifdef MAPBASE_VSCRIPT
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
const char *CBaseCombatWeapon::ScriptGetPrimaryAmmoType()
{
return GetPrimaryAmmoType() <= GetAmmoDef()->m_nAmmoIndex ? GetAmmoDef()->m_AmmoType[GetPrimaryAmmoType()].pName : NULL;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
const char *CBaseCombatWeapon::ScriptGetSecondaryAmmoType()
{
return GetSecondaryAmmoType() <= GetAmmoDef()->m_nAmmoIndex ? GetAmmoDef()->m_AmmoType[GetSecondaryAmmoType()].pName : NULL;
}
#endif
#endif #endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -2910,8 +2894,8 @@ BEGIN_ENT_SCRIPTDESC( CBaseCombatWeapon, CBaseAnimating, "The base class for all
DEFINE_SCRIPTFUNC( UsesClipsForAmmo2, "Check if the weapon uses clips for secondary ammo." ) DEFINE_SCRIPTFUNC( UsesClipsForAmmo2, "Check if the weapon uses clips for secondary ammo." )
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
DEFINE_SCRIPTFUNC_NAMED( ScriptGetPrimaryAmmoType, "GetPrimaryAmmoType", "Get the weapon's primary ammo type." ) DEFINE_SCRIPTFUNC( GetPrimaryAmmoType, "Get the weapon's primary ammo type." )
DEFINE_SCRIPTFUNC_NAMED( ScriptGetSecondaryAmmoType, "GetSecondaryAmmoType", "Get the weapon's secondary ammo type." ) DEFINE_SCRIPTFUNC( GetSecondaryAmmoType, "Get the weapon's secondary ammo type." )
#endif #endif
DEFINE_SCRIPTFUNC( GetSubType, "Get the weapon's subtype." ) DEFINE_SCRIPTFUNC( GetSubType, "Get the weapon's subtype." )

View File

@ -519,11 +519,6 @@ public:
virtual CDmgAccumulator *GetDmgAccumulator( void ) { return NULL; } virtual CDmgAccumulator *GetDmgAccumulator( void ) { return NULL; }
#ifdef MAPBASE_VSCRIPT
const char* ScriptGetPrimaryAmmoType();
const char* ScriptGetSecondaryAmmoType();
#endif
// Client only methods // Client only methods
#else #else

View File

@ -70,6 +70,9 @@
#include "IEffects.h" #include "IEffects.h"
#include "engine/IEngineSound.h" #include "engine/IEngineSound.h"
#include "sharedInterface.h" #include "sharedInterface.h"
#ifdef CLIENT_DLL
#include "renderparm.h"
#endif
// memdbgon must be the last include file in a .cpp file!!! // memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h" #include "tier0/memdbgon.h"
@ -89,6 +92,7 @@ CEnvWindShared::CEnvWindShared() : m_WindAveQueue(10), m_WindVariationQueue(10)
#ifdef MAPBASE #ifdef MAPBASE
s_windControllers.AddToTail( this ); s_windControllers.AddToTail( this );
m_windRadius = -1.0f; m_windRadius = -1.0f;
m_flTreeSwayScale = 1.0f;
#endif #endif
} }
@ -180,6 +184,31 @@ void CEnvWindShared::UpdateWindSound( float flTotalWindSpeed )
} }
#ifdef MAPBASE
#define TREE_SWAY_UPDATE_TIME 2.0f
void CEnvWindShared::UpdateTreeSway( float flTime )
{
#ifdef CLIENT_DLL
while( flTime >= m_flSwayTime )
{
// Since the wind is constantly changing, but we need smooth values, we cache them off here.
m_PrevSwayVector = m_CurrentSwayVector;
m_CurrentSwayVector = m_flTreeSwayScale != 1.0f ? (m_currentWindVector * m_flTreeSwayScale) : m_currentWindVector;
m_flSwayTime += TREE_SWAY_UPDATE_TIME;
}
// Update vertex shader
float flPercentage = ( 1 - ( ( m_flSwayTime - flTime ) / TREE_SWAY_UPDATE_TIME ) );
CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
// Dividing by 2 helps the numbers the shader is expecting stay in line with other expected game values.
Vector vecWind = Lerp( flPercentage, m_PrevSwayVector, m_CurrentSwayVector ) / 25.f;
pRenderContext->SetVectorRenderingParameter( VECTOR_RENDERPARM_WIND_DIRECTION, vecWind );
#endif
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Updates the wind speed // Updates the wind speed
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -196,6 +225,14 @@ float CEnvWindShared::WindThink( float flTime )
ComputeWindVariation( flTime ); ComputeWindVariation( flTime );
#if defined(MAPBASE) && defined(CLIENT_DLL)
if (m_flTreeSwayScale != 0.0f)
{
// Update Tree Sway
UpdateTreeSway( flTime );
}
#endif
while (true) while (true)
{ {
// First, simulate up to the next switch time... // First, simulate up to the next switch time...

View File

@ -183,6 +183,10 @@ public:
#ifdef MAPBASE #ifdef MAPBASE
Vector m_currentWindVector; // For all the talk of proper prediction, we ended up just storing and returning through a static vector. Now we can have multiple env_wind, so we need this in here. Vector m_currentWindVector; // For all the talk of proper prediction, we ended up just storing and returning through a static vector. Now we can have multiple env_wind, so we need this in here.
Vector m_CurrentSwayVector;
Vector m_PrevSwayVector;
CNetworkVar( float, m_flTreeSwayScale );
#endif #endif
CNetworkVar( int, m_iInitialWindDir ); CNetworkVar( int, m_iInitialWindDir );
@ -211,7 +215,12 @@ private:
// Updates the wind sound // Updates the wind sound
void UpdateWindSound( float flTotalWindSpeed ); void UpdateWindSound( float flTotalWindSpeed );
#ifdef MAPBASE
void UpdateTreeSway( float flTime );
#endif
float m_flVariationTime; float m_flVariationTime;
float m_flSwayTime;
float m_flSimTime; // What's the time I last simulated up to? float m_flSimTime; // What's the time I last simulated up to?
float m_flSwitchTime; // when do I actually switch from gust to not gust float m_flSwitchTime; // when do I actually switch from gust to not gust
float m_flAveWindSpeed; // the average wind speed float m_flAveWindSpeed; // the average wind speed

View File

@ -12,6 +12,7 @@
#include "cbase.h" #include "cbase.h"
#include "matchers.h" #include "matchers.h"
#include "takedamageinfo.h" #include "takedamageinfo.h"
#include "ammodef.h"
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
#include "globalstate.h" #include "globalstate.h"
@ -752,6 +753,19 @@ FireBulletsInfo_t *GetFireBulletsInfoFromInfo( HSCRIPT hBulletsInfo )
//============================================================================= //=============================================================================
//============================================================================= //=============================================================================
static int ScriptPrecacheModel( const char *modelname )
{
return CBaseEntity::PrecacheModel( modelname );
}
static void ScriptPrecacheOther( const char *classname )
{
UTIL_PrecacheOther( classname );
}
//=============================================================================
//=============================================================================
static void ScriptEntitiesInBox( HSCRIPT hTable, int listMax, const Vector &hullMin, const Vector &hullMax, int iMask ) static void ScriptEntitiesInBox( HSCRIPT hTable, int listMax, const Vector &hullMin, const Vector &hullMax, int iMask )
{ {
CBaseEntity *list[1024]; CBaseEntity *list[1024];
@ -785,6 +799,14 @@ static void ScriptEntitiesInSphere( HSCRIPT hTable, int listMax, const Vector &c
} }
} }
//-----------------------------------------------------------------------------
static void ScriptDecalTrace( HSCRIPT hTrace, const char *decalName )
{
CTraceInfoAccessor *traceInfo = HScriptToClass<CTraceInfoAccessor>(hTrace);
UTIL_DecalTrace( &traceInfo->GetTrace(), decalName );
}
//============================================================================= //=============================================================================
//============================================================================= //=============================================================================
@ -813,6 +835,8 @@ void RegisterSharedScriptFunctions()
ScriptRegisterFunction( g_pScriptVM, SpawnEntityFromTable, "Native function for entity spawning." ); ScriptRegisterFunction( g_pScriptVM, SpawnEntityFromTable, "Native function for entity spawning." );
#endif #endif
g_pScriptVM->RegisterInstance( GetAmmoDef(), "AmmoDef" );
g_pScriptVM->RegisterInstance( &g_ScriptConvarLookup, "Convars" ); g_pScriptVM->RegisterInstance( &g_ScriptConvarLookup, "Convars" );
g_pScriptVM->RegisterInstance( &g_ScriptNetPropManager, "NetProps" ); g_pScriptVM->RegisterInstance( &g_ScriptNetPropManager, "NetProps" );
@ -839,10 +863,23 @@ void RegisterSharedScriptFunctions()
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptTraceLineComplex, "TraceLineComplex", "Complex version of TraceLine which takes 2 points, an ent to ignore, a trace mask, and a collision group. Returns a handle which can access all trace info." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptTraceLineComplex, "TraceLineComplex", "Complex version of TraceLine which takes 2 points, an ent to ignore, a trace mask, and a collision group. Returns a handle which can access all trace info." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptTraceHullComplex, "TraceHullComplex", "Takes 2 points, min/max hull bounds, an ent to ignore, a trace mask, and a collision group to trace to a point using a hull. Returns a handle which can access all trace info." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptTraceHullComplex, "TraceHullComplex", "Takes 2 points, min/max hull bounds, an ent to ignore, a trace mask, and a collision group to trace to a point using a hull. Returns a handle which can access all trace info." );
//
// Precaching
//
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptPrecacheModel, "PrecacheModel", "Precaches a model for later usage." );
ScriptRegisterFunction( g_pScriptVM, PrecacheMaterial, "Precaches a material for later usage." );
ScriptRegisterFunction( g_pScriptVM, PrecacheParticleSystem, "Precaches a particle system for later usage." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptPrecacheOther, "PrecacheOther", "Precaches an entity class for later usage." );
//
// Misc. Utility
//
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesInBox, "EntitiesInBox", "Gets all entities which are within a worldspace box." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesInBox, "EntitiesInBox", "Gets all entities which are within a worldspace box." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesAtPoint, "EntitiesAtPoint", "Gets all entities which are intersecting a point in space." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesAtPoint, "EntitiesAtPoint", "Gets all entities which are intersecting a point in space." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesInSphere, "EntitiesInSphere", "Gets all entities which are within a sphere." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptEntitiesInSphere, "EntitiesInSphere", "Gets all entities which are within a sphere." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptDecalTrace, "DecalTrace", "Creates a dynamic decal based on the given trace info. The trace information can be generated by TraceLineComplex() and the decal name must be from decals_subrect.txt." );
ScriptRegisterFunctionNamed( g_pScriptVM, ScriptMatcherMatch, "Matcher_Match", "Compares a string to a query using Mapbase's matcher system, supporting wildcards, RS matchers, etc." ); ScriptRegisterFunctionNamed( g_pScriptVM, ScriptMatcherMatch, "Matcher_Match", "Compares a string to a query using Mapbase's matcher system, supporting wildcards, RS matchers, etc." );
ScriptRegisterFunction( g_pScriptVM, Matcher_NamesMatch, "Compares a string to a query using Mapbase's matcher system using wildcards only." ); ScriptRegisterFunction( g_pScriptVM, Matcher_NamesMatch, "Compares a string to a query using Mapbase's matcher system using wildcards only." );
ScriptRegisterFunction( g_pScriptVM, AppearsToBeANumber, "Checks if the given string appears to be a number." ); ScriptRegisterFunction( g_pScriptVM, AppearsToBeANumber, "Checks if the given string appears to be a number." );

View File

@ -1,6 +1,7 @@
// STATIC: "ONLY_PROJECT_POSITION" "0..1" [XBOX] // STATIC: "ONLY_PROJECT_POSITION" "0..1" [XBOX]
// STATIC: "ONLY_PROJECT_POSITION" "0..0" [PC] // STATIC: "ONLY_PROJECT_POSITION" "0..0" [PC]
// STATIC: "COLOR_DEPTH" "0..1" // STATIC: "COLOR_DEPTH" "0..1"
// STATIC: "TREESWAY" "0..2"
// DYNAMIC: "COMPRESSED_VERTS" "0..1" // DYNAMIC: "COMPRESSED_VERTS" "0..1"
// DYNAMIC: "SKINNING" "0..1" // DYNAMIC: "SKINNING" "0..1"
@ -19,6 +20,37 @@ const float4 cMorphSubrect : register( SHADER_SPECIFIC_CONST_7 );
sampler2D morphSampler : register( D3DVERTEXTEXTURESAMPLER0, s0 ); sampler2D morphSampler : register( D3DVERTEXTEXTURESAMPLER0, s0 );
#endif #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 struct VS_INPUT
{ {
@ -62,6 +94,12 @@ VS_OUTPUT main( const VS_INPUT v )
v.vVertexID, float3(0, 0, 0), vPosition.xyz ); v.vVertexID, float3(0, 0, 0), vPosition.xyz );
#endif #endif
#if ( TREESWAY )
{
vPosition.xyz = ComputeTreeSway( vPosition.xyz, g_flTime );
}
#endif
SkinPosition( g_bSkinning, vPosition, v.vBoneWeights, v.vBoneIndices, vWorldPos ); SkinPosition( g_bSkinning, vPosition, v.vBoneWeights, v.vBoneIndices, vWorldPos );
float4 vProjPos = mul( float4( vWorldPos, 1.0f ), cViewProj ); float4 vProjPos = mul( float4( vWorldPos, 1.0f ), cViewProj );

View File

@ -11,6 +11,7 @@
// STATIC: "SM30_VERTEXID" "0..1" [vs30] // STATIC: "SM30_VERTEXID" "0..1" [vs30]
// STATIC: "USE_STATIC_CONTROL_FLOW" "0..1" [vs20] // STATIC: "USE_STATIC_CONTROL_FLOW" "0..1" [vs20]
// STATIC: "DONT_GAMMA_CONVERT_VERTEX_COLOR" "0..1" // STATIC: "DONT_GAMMA_CONVERT_VERTEX_COLOR" "0..1"
// STATIC: "TREESWAY" "0..2"
// DYNAMIC: "COMPRESSED_VERTS" "0..1" // DYNAMIC: "COMPRESSED_VERTS" "0..1"
// DYNAMIC: "DYNAMIC_LIGHT" "0..1" // DYNAMIC: "DYNAMIC_LIGHT" "0..1"
// DYNAMIC: "STATIC_LIGHT" "0..1" // DYNAMIC: "STATIC_LIGHT" "0..1"
@ -25,6 +26,7 @@
// SKIP: $USE_STATIC_CONTROL_FLOW && ( $NUM_LIGHTS > 0 ) [vs20] // SKIP: $USE_STATIC_CONTROL_FLOW && ( $NUM_LIGHTS > 0 ) [vs20]
// SKIP: ($SEPARATE_DETAIL_UVS) && ($SEAMLESS_DETAIL) // SKIP: ($SEPARATE_DETAIL_UVS) && ($SEAMLESS_DETAIL)
// SKIP: ($DONT_GAMMA_CONVERT_VERTEX_COLOR && ( ! $VERTEXCOLOR ) ) // SKIP: ($DONT_GAMMA_CONVERT_VERTEX_COLOR && ( ! $VERTEXCOLOR ) )
// SKIP: ( $TREESWAY ) && ( $SEAMLESS_DETAIL || $SEAMLESS_BASE )
#include "common_vs_fxc.h" #include "common_vs_fxc.h"
static const bool g_bSkinning = SKINNING ? true : false; 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 const float4x4 g_FlashlightWorldToTexture : register( SHADER_SPECIFIC_CONST_6 ); // 6, 7, 8, 9
#endif #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 #if defined( SHADER_MODEL_VS_3_0 ) && SM30_VERTEXID
// NOTE: cMorphTargetTextureDim.xy = target dimensions, // NOTE: cMorphTargetTextureDim.xy = target dimensions,
// cMorphTargetTextureDim.z = 4tuples/morph // cMorphTargetTextureDim.z = 4tuples/morph
@ -149,6 +179,10 @@ VS_OUTPUT main( const VS_INPUT v )
ApplyMorph( morphSampler, cMorphTargetTextureDim, cMorphSubrect, ApplyMorph( morphSampler, cMorphTargetTextureDim, cMorphSubrect,
v.vVertexID, v.vTexCoord2, vPosition.xyz, vNormal ); v.vVertexID, v.vTexCoord2, vPosition.xyz, vNormal );
#endif #endif
#if ( TREESWAY )
vPosition.xyz = ComputeTreeSway( vPosition.xyz, g_flTime );
#endif
// Perform skinning // Perform skinning
float3 worldNormal, worldPos; float3 worldNormal, worldPos;
@ -225,10 +259,18 @@ VS_OUTPUT main( const VS_INPUT v )
// that scale works. More smartness could allow 3d xform. // that scale works. More smartness could allow 3d xform.
o.SeamlessDetailTexCoord.xyz = (SEAMLESS_SCALE*cDetailTexCoordTransform[0].x) * v.vPos.xyz; o.SeamlessDetailTexCoord.xyz = (SEAMLESS_SCALE*cDetailTexCoordTransform[0].x) * v.vPos.xyz;
#else #else
// Detail texture coordinates #if ( TREESWAY )
// FIXME: This shouldn't have to be computed all the time. {
o.detailTexCoord.x = dot( v.vTexCoord0, cDetailTexCoordTransform[0] ); o.detailTexCoord.xy = v.vTexCoord0;
o.detailTexCoord.y = dot( v.vTexCoord0, cDetailTexCoordTransform[1] ); }
#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 #endif
#if SEPARATE_DETAIL_UVS #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 BEGIN_SHADER_PARAMS
SHADER_PARAM( ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value" ) SHADER_PARAM( ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value" )
SHADER_PARAM( COLOR_DEPTH, SHADER_PARAM_TYPE_BOOL, "0", "Write depth as color") 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 END_SHADER_PARAMS
SHADER_INIT_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 ); bool bAlphaClip = IS_FLAG_SET( MATERIAL_VAR_ALPHATEST );
int nColorDepth = GetIntParam( COLOR_DEPTH, params, 0 ); int nColorDepth = GetIntParam( COLOR_DEPTH, params, 0 );
int nTreeSwayMode = clamp( GetIntParam( TREESWAY, params, 0 ), 0, 2 );
SHADOW_STATE 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 ); 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( 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( COLOR_DEPTH, nColorDepth );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, nTreeSwayMode );
SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs20 ); SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs20 );
if ( bAlphaClip || g_pHardwareConfig->PlatformRequiresNonNullPixelShaders() || nColorDepth ) 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 ); 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( 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( COLOR_DEPTH, nColorDepth );
SET_STATIC_VERTEX_SHADER_COMBO( TREESWAY, nTreeSwayMode );
SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs30 ); SET_STATIC_VERTEX_SHADER( sdk_depthwrite_vs30 );
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
@ -190,6 +212,50 @@ BEGIN_VS_SHADER_FLAGS( SDK_DepthWrite, "Help for Depth Write", SHADER_NOT_EDITAB
} }
#endif #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; Vector4D vParms;
// set up arbitrary far planes, as the real ones are too far ( 30,000 ) // 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; m_bCOLOR_DEPTH = true;
#endif #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: public:
sdk_depthwrite_vs20_Static_Index( ) sdk_depthwrite_vs20_Static_Index( )
{ {
@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false; m_bCOLOR_DEPTH = false;
#endif // _DEBUG #endif // _DEBUG
m_nCOLOR_DEPTH = 0; m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH; bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_depthwrite_vs20_Dynamic_Index
{ {
private: private:

View File

@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true; m_bCOLOR_DEPTH = true;
#endif #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: public:
sdk_depthwrite_vs30_Static_Index( ) sdk_depthwrite_vs30_Static_Index( )
{ {
@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false; m_bCOLOR_DEPTH = false;
#endif // _DEBUG #endif // _DEBUG
m_nCOLOR_DEPTH = 0; m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH; bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_depthwrite_vs30_Dynamic_Index
{ {
private: private:

View File

@ -190,6 +190,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif #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: public:
sdk_vertexlit_and_unlit_generic_vs20_Static_Index( ) sdk_vertexlit_and_unlit_generic_vs20_Static_Index( )
{ {
@ -229,19 +250,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG #endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0; m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #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 ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_vertexlit_and_unlit_generic_vs20_Dynamic_Index
{ {
private: private:

View File

@ -211,6 +211,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif #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: public:
sdk_vertexlit_and_unlit_generic_vs30_Static_Index( ) sdk_vertexlit_and_unlit_generic_vs30_Static_Index( )
{ {
@ -254,19 +275,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG #endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0; m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #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 ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_vertexlit_and_unlit_generic_vs30_Dynamic_Index
{ {
private: private:

View File

@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true; m_bCOLOR_DEPTH = true;
#endif #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: public:
sdk_depthwrite_vs20_Static_Index( ) sdk_depthwrite_vs20_Static_Index( )
{ {
@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false; m_bCOLOR_DEPTH = false;
#endif // _DEBUG #endif // _DEBUG
m_nCOLOR_DEPTH = 0; m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH; bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_depthwrite_vs20_Dynamic_Index
{ {
private: private:

View File

@ -43,6 +43,27 @@ public:
m_bCOLOR_DEPTH = true; m_bCOLOR_DEPTH = true;
#endif #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: public:
sdk_depthwrite_vs30_Static_Index( ) sdk_depthwrite_vs30_Static_Index( )
{ {
@ -54,19 +75,23 @@ public:
m_bCOLOR_DEPTH = false; m_bCOLOR_DEPTH = false;
#endif // _DEBUG #endif // _DEBUG
m_nCOLOR_DEPTH = 0; m_nCOLOR_DEPTH = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #ifdef _DEBUG
bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH; bool bAllStaticVarsDefined = m_bONLY_PROJECT_POSITION && m_bCOLOR_DEPTH && m_bTREESWAY;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_depthwrite_vs30_Dynamic_Index
{ {
private: private:

View File

@ -190,6 +190,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif #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: public:
sdk_vertexlit_and_unlit_generic_vs20_Static_Index( ) sdk_vertexlit_and_unlit_generic_vs20_Static_Index( )
{ {
@ -229,19 +250,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG #endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0; m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #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 ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_vertexlit_and_unlit_generic_vs20_Dynamic_Index
{ {
private: private:

View File

@ -211,6 +211,27 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = true;
#endif #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: public:
sdk_vertexlit_and_unlit_generic_vs30_Static_Index( ) sdk_vertexlit_and_unlit_generic_vs30_Static_Index( )
{ {
@ -254,19 +275,23 @@ public:
m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false; m_bDONT_GAMMA_CONVERT_VERTEX_COLOR = false;
#endif // _DEBUG #endif // _DEBUG
m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0; m_nDONT_GAMMA_CONVERT_VERTEX_COLOR = 0;
#ifdef _DEBUG
m_bTREESWAY = false;
#endif // _DEBUG
m_nTREESWAY = 0;
} }
int GetIndex() int GetIndex()
{ {
// Asserts to make sure that we aren't using any skipped combinations. // 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. // Asserts to make sure that we are setting all of the combination vars.
#ifdef _DEBUG #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 ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #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 class sdk_vertexlit_and_unlit_generic_vs30_Dynamic_Index
{ {
private: 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( 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." ) 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 END_SHADER_PARAMS
void SetupVars( VertexLitGeneric_DX9_Vars_t& info ) 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_nDepthBlend = DEPTHBLEND;
info.m_nDepthBlendScale = DEPTHBLENDSCALE; info.m_nDepthBlendScale = DEPTHBLENDSCALE;
info.m_nReceiveFlashlight = RECEIVEFLASHLIGHT; 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() SHADER_INIT_PARAMS()

View File

@ -143,6 +143,25 @@ BEGIN_VS_SHADER( SDK_VertexLitGeneric, "Help for SDK_VertexLitGeneric" )
#ifdef MAPBASE #ifdef MAPBASE
SHADER_PARAM( PHONGDISABLEHALFLAMBERT, SHADER_PARAM_TYPE_BOOL, "0", "Disable half lambert for phong" ) SHADER_PARAM( PHONGDISABLEHALFLAMBERT, SHADER_PARAM_TYPE_BOOL, "0", "Disable half lambert for phong" )
#endif #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 END_SHADER_PARAMS
void SetupVars( VertexLitGeneric_DX9_Vars_t& info ) void SetupVars( VertexLitGeneric_DX9_Vars_t& info )
@ -222,6 +241,24 @@ BEGIN_VS_SHADER( SDK_VertexLitGeneric, "Help for SDK_VertexLitGeneric" )
#ifdef MAPBASE #ifdef MAPBASE
info.m_nPhongDisableHalfLambert = PHONGDISABLEHALFLAMBERT; info.m_nPhongDisableHalfLambert = PHONGDISABLEHALFLAMBERT;
#endif #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 // Cloak Pass

View File

@ -223,6 +223,22 @@ void InitParamsVertexLitGeneric_DX9( CBaseVSShader *pShader, IMaterialVar** para
InitIntParam( info.m_nDepthBlend, params, 0 ); InitIntParam( info.m_nDepthBlend, params, 0 );
InitFloatParam( info.m_nDepthBlendScale, params, 50.0f ); 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; bFlashlightNoLambert = true;
} }
int nTreeSwayMode = clamp( GetIntParam( info.m_nTreeSway, params, 0 ), 0, 2 );
bool bTreeSway = nTreeSwayMode != 0;
bool bAmbientOnly = IsBoolSet( info.m_nAmbientOnly, params ); bool bAmbientOnly = IsBoolSet( info.m_nAmbientOnly, params );
float fBlendFactor = GetFloatParam( info.m_nDetailTextureBlendFactor, params, 1.0 ); 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 bHasVertexColor = bVertexLitGeneric ? false : IS_FLAG_SET( MATERIAL_VAR_VERTEXCOLOR );
bool bHasVertexAlpha = bVertexLitGeneric ? false : IS_FLAG_SET( MATERIAL_VAR_VERTEXALPHA ); 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 ) ) 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 ) && !bTreeSway;
bool bSeamlessBase = IsBoolSet( info.m_nSeamlessBase, params ); bool bSeamlessDetail = IsBoolSet( info.m_nSeamlessDetail, params ) && !bTreeSway;
bool bSeamlessDetail = IsBoolSet( info.m_nSeamlessDetail, params );
bool bDistanceAlpha = IsBoolSet( info.m_nDistanceAlpha, params ); bool bDistanceAlpha = IsBoolSet( info.m_nDistanceAlpha, params );
bool bHasSelfIllum = (!bHasFlashlight || IsX360() ) && IS_FLAG_SET( MATERIAL_VAR_SELFILLUM ); bool bHasSelfIllum = (!bHasFlashlight || IsX360() ) && IS_FLAG_SET( MATERIAL_VAR_SELFILLUM );
bool bHasEnvmapMask = (!bHasFlashlight || IsX360() ) && info.m_nEnvmapMask != -1 && params[info.m_nEnvmapMask]->IsTexture(); 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( SEPARATE_DETAIL_UVS, IsBoolSet( info.m_nSeparateDetailUVs, params ) );
SET_STATIC_VERTEX_SHADER_COMBO( USE_STATIC_CONTROL_FLOW, bUseStaticControlFlow ); 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( 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 ); SET_STATIC_VERTEX_SHADER( sdk_vertexlit_and_unlit_generic_vs20 );
//if ( g_pHardwareConfig->SupportsPixelShaders_2_b() || g_pHardwareConfig->ShouldAlwaysUseShaderModel2bShaders() ) // Always send Gl this way //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( DECAL, bIsDecal );
SET_STATIC_VERTEX_SHADER_COMBO( SM30_VERTEXID, bFastVertexTextures ); 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( 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 ); SET_STATIC_VERTEX_SHADER( sdk_vertexlit_and_unlit_generic_vs30 );
DECLARE_STATIC_PIXEL_SHADER( sdk_vertexlit_and_unlit_generic_ps30 ); 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 ( bHasDetailTexture )
{ {
if ( IS_PARAM_DEFINED( info.m_nDetailTextureTransform ) ) if ( !bTreeSway )
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nDetailTextureTransform, info.m_nDetailScale ); {
else if ( IS_PARAM_DEFINED( info.m_nDetailTextureTransform ) )
pContextData->m_SemiStaticCmdsOut.SetVertexShaderTextureScaledTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_4, info.m_nBaseTextureTransform, info.m_nDetailScale ); 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 ); //Assert( !bHasBump );
if ( info.m_nDetailTint != -1 ) if ( info.m_nDetailTint != -1 )
pContextData->m_SemiStaticCmdsOut.SetPixelShaderConstantGammaToLinear( 10, info.m_nDetailTint ); 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.SetPixelShaderConstant_W( 4, info.m_nSelfIllumTint, fBlendFactor );
pContextData->m_SemiStaticCmdsOut.SetAmbientCubeDynamicStateVertexShader(); 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(); pContextData->m_SemiStaticCmdsOut.End();
} }
} }
@ -1435,6 +1485,25 @@ static void DrawVertexLitGeneric_DX9_Internal( CBaseVSShader *pShader, IMaterial
DynamicCmdsOut.SetPixelShaderConstant( 24, worldToTexture.Base(), 4 ); 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(); DynamicCmdsOut.End();
pShaderAPI->ExecuteCommandBuffer( DynamicCmdsOut.Base() ); pShaderAPI->ExecuteCommandBuffer( DynamicCmdsOut.Base() );
} }

View File

@ -136,6 +136,23 @@ struct VertexLitGeneric_DX9_Vars_t
int m_nPhongDisableHalfLambert; int m_nPhongDisableHalfLambert;
#endif #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 ); void InitParamsVertexLitGeneric_DX9( CBaseVSShader *pShader, IMaterialVar** params, const char *pMaterialName, bool bVertexLitGeneric, VertexLitGeneric_DX9_Vars_t &info );

View File

@ -28,6 +28,8 @@ enum RenderParamVector_t
VECTOR_RENDERPARM_HMDWARP_ASPECT, VECTOR_RENDERPARM_HMDWARP_ASPECT,
INT_RENDERPARM_DISTORTION_TYPE, INT_RENDERPARM_DISTORTION_TYPE,
VECTOR_RENDERPARM_WIND_DIRECTION,
MAX_VECTOR_RENDER_PARMS = 20 MAX_VECTOR_RENDER_PARMS = 20
}; };