diff --git a/sp/src/game/client/c_effects.cpp b/sp/src/game/client/c_effects.cpp index 447b6494..056c2b78 100644 --- a/sp/src/game/client/c_effects.cpp +++ b/sp/src/game/client/c_effects.cpp @@ -1210,6 +1210,7 @@ BEGIN_RECV_TABLE_NOBASE(CEnvWindShared, DT_EnvWindShared) RecvPropFloat (RECVINFO(m_windRadius)), RecvPropFloat (RECVINFO(m_windRadiusInner)), RecvPropVector (RECVINFO(m_location)), + RecvPropFloat (RECVINFO(m_flTreeSwayScale)), #endif END_RECV_TABLE() diff --git a/sp/src/game/server/TemplateEntities.cpp b/sp/src/game/server/TemplateEntities.cpp index a5092904..86398a48 100644 --- a/sp/src/game/server/TemplateEntities.cpp +++ b/sp/src/game/server/TemplateEntities.cpp @@ -159,6 +159,70 @@ string_t Templates_FindByTargetName(const char *pszName) 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 // 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) ) continue; +#ifdef MAPBASE + if ( pGroup->NameFixupExpanded() ) + { + Templates_NewNameFixup( GroupTemplates, i, iCount, mapData, KeyInstanceCount, keyName, value ); + continue; + } +#endif + do { // Ignore targetnames diff --git a/sp/src/game/server/ai_basenpc.cpp b/sp/src/game/server/ai_basenpc.cpp index 74e14f87..53ef8fd8 100644 --- a/sp/src/game/server/ai_basenpc.cpp +++ b/sp/src/game/server/ai_basenpc.cpp @@ -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 //--------------------------------------------------------- diff --git a/sp/src/game/server/ai_basenpc.h b/sp/src/game/server/ai_basenpc.h index 07a06acd..2b86cca5 100644 --- a/sp/src/game/server/ai_basenpc.h +++ b/sp/src/game/server/ai_basenpc.h @@ -1117,6 +1117,9 @@ public: CBaseEntity *GetEnemyOccluder(void); virtual void StartTargetHandling( CBaseEntity *pTargetEnt ); +#ifdef MAPBASE + void InputSetTarget( inputdata_t &inputdata ); +#endif //--------------------------------- diff --git a/sp/src/game/server/ai_behavior_rappel.cpp b/sp/src/game/server/ai_behavior_rappel.cpp index 7dfe4e14..afa99a86 100644 --- a/sp/src/game/server/ai_behavior_rappel.cpp +++ b/sp/src/game/server/ai_behavior_rappel.cpp @@ -125,6 +125,9 @@ bool CAI_RappelBehavior::KeyValue( const char *szKeyName, const char *szValue ) void CAI_RappelBehavior::Precache() { +#ifdef MAPBASE + CBaseEntity::PrecacheModel( "cable/cable_rappel.vmt" ); +#endif CBaseEntity::PrecacheModel( "cable/cable.vmt" ); } @@ -386,7 +389,11 @@ void CAI_RappelBehavior::CreateZipline() if( attachment > 0 ) { CBeam *pBeam; +#ifdef MAPBASE + pBeam = CBeam::BeamCreate( "cable/cable_rappel.vmt", 1 ); +#else pBeam = CBeam::BeamCreate( "cable/cable.vmt", 1 ); +#endif pBeam->SetColor( 150, 150, 150 ); pBeam->SetWidth( 0.3 ); pBeam->SetEndWidth( 0.3 ); diff --git a/sp/src/game/server/basecombatcharacter.cpp b/sp/src/game/server/basecombatcharacter.cpp index c5fb9e56..4d297c21 100644 --- a/sp/src/game/server/basecombatcharacter.cpp +++ b/sp/src/game/server/basecombatcharacter.cpp @@ -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_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( GetScriptAllWeapons, "GetAllWeapons", "Get the character's weapon inventory." ) 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." ) @@ -4377,6 +4378,19 @@ HSCRIPT CBaseCombatCharacter::GetScriptWeaponByType( const char *pszWeapon, int return ToHScript( Weapon_OwnsThisType( pszWeapon, iSubType ) ); } +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CBaseCombatCharacter::GetScriptAllWeapons( HSCRIPT hTable ) +{ + for (int i=0;iSetValue( hTable, m_hMyWeapons[i]->GetClassname(), ToHScript( m_hMyWeapons[i] ) ); + } + } +} + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CBaseCombatCharacter::ScriptEquipWeapon( HSCRIPT hWeapon ) diff --git a/sp/src/game/server/basecombatcharacter.h b/sp/src/game/server/basecombatcharacter.h index 5d5c30df..201dcfc8 100644 --- a/sp/src/game/server/basecombatcharacter.h +++ b/sp/src/game/server/basecombatcharacter.h @@ -414,6 +414,7 @@ public: HSCRIPT GetScriptActiveWeapon(); HSCRIPT GetScriptWeaponIndex( int i ); HSCRIPT GetScriptWeaponByType( const char *pszWeapon, int iSubType = 0 ); + void GetScriptAllWeapons( HSCRIPT hTable ); void ScriptEquipWeapon( HSCRIPT hWeapon ); diff --git a/sp/src/game/server/baseentity.cpp b/sp/src/game/server/baseentity.cpp index 8eac2034..62994363 100644 --- a/sp/src/game/server/baseentity.cpp +++ b/sp/src/game/server/baseentity.cpp @@ -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( 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( ScriptAddContext, "AddContext", "Add a response context value" ) 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( GetSpawnFlags, "Get spawnflags" ) @@ -9605,6 +9609,14 @@ int CBaseEntity::ScriptClassify( void ) 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 ) diff --git a/sp/src/game/server/baseentity.h b/sp/src/game/server/baseentity.h index c8e571c6..f75713d1 100644 --- a/sp/src/game/server/baseentity.h +++ b/sp/src/game/server/baseentity.h @@ -2018,6 +2018,7 @@ public: 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 ); #endif diff --git a/sp/src/game/server/effects.cpp b/sp/src/game/server/effects.cpp index c181254a..070d7987 100644 --- a/sp/src/game/server/effects.cpp +++ b/sp/src/game/server/effects.cpp @@ -1594,6 +1594,7 @@ BEGIN_DATADESC( CEnvWind ) #ifdef MAPBASE DEFINE_KEYFIELD( m_EnvWindShared.m_windRadius, FIELD_FLOAT, "windradius" ), DEFINE_KEYFIELD( m_EnvWindShared.m_windRadiusInner, FIELD_FLOAT, "windradiusinner" ), + DEFINE_KEYFIELD( m_EnvWindShared.m_flTreeSwayScale, FIELD_FLOAT, "treeswayscale" ), #endif // 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_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_OnGustEnd, "OnGustEnd" ), @@ -1634,6 +1649,7 @@ BEGIN_SEND_TABLE_NOBASE(CEnvWindShared, DT_EnvWindShared) SendPropFloat (SENDINFO(m_windRadius), 0, SPROP_NOSCALE), SendPropFloat (SENDINFO(m_windRadiusInner), 0, SPROP_NOSCALE), SendPropVector (SENDINFO(m_location), -1, SPROP_COORD), + SendPropFloat (SENDINFO(m_flTreeSwayScale), 0, SPROP_NOSCALE), #endif END_SEND_TABLE() diff --git a/sp/src/game/server/hl2/npc_metropolice.cpp b/sp/src/game/server/hl2/npc_metropolice.cpp index 03a170f6..0812f7c5 100644 --- a/sp/src/game/server/hl2/npc_metropolice.cpp +++ b/sp/src/game/server/hl2/npc_metropolice.cpp @@ -1055,7 +1055,12 @@ void CNPC_MetroPolice::SpeakSentence( int nSentenceType ) { 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); +#endif } } } diff --git a/sp/src/game/server/hl2/vehicle_prisoner_pod.cpp b/sp/src/game/server/hl2/vehicle_prisoner_pod.cpp index 3b44f4a8..1288e082 100644 --- a/sp/src/game/server/hl2/vehicle_prisoner_pod.cpp +++ b/sp/src/game/server/hl2/vehicle_prisoner_pod.cpp @@ -115,10 +115,8 @@ public: void HandleAnimEvent( animevent_t *pEvent ); // Inputs -#ifndef MAPBASE void InputEnterVehicleImmediate( inputdata_t &inputdata ); void InputEnterVehicle( inputdata_t &inputdata ); -#endif void InputExitVehicle( inputdata_t &inputdata ); void InputLock( inputdata_t &inputdata ); void InputUnlock( inputdata_t &inputdata ); @@ -190,10 +188,8 @@ BEGIN_DATADESC( CPropVehiclePrisonerPod ) // Inputs DEFINE_INPUTFUNC( FIELD_VOID, "Lock", InputLock ), DEFINE_INPUTFUNC( FIELD_VOID, "Unlock", InputUnlock ), -#ifndef MAPBASE DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicle", InputEnterVehicle ), DEFINE_INPUTFUNC( FIELD_VOID, "EnterVehicleImmediate", InputEnterVehicleImmediate ), -#endif DEFINE_INPUTFUNC( FIELD_VOID, "ExitVehicle", InputExitVehicle ), DEFINE_INPUTFUNC( FIELD_VOID, "Open", InputOpen ), 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. //----------------------------------------------------------------------------- @@ -650,7 +645,6 @@ void CPropVehiclePrisonerPod::InputEnterVehicleImmediate( inputdata_t &inputdata Assert( 0 ); } } -#endif //----------------------------------------------------------------------------- // Purpose: Force the player to exit the vehicle. diff --git a/sp/src/game/server/player.cpp b/sp/src/game/server/player.cpp index fcc7488e..a89ff7db 100644 --- a/sp/src/game/server/player.cpp +++ b/sp/src/game/server/player.cpp @@ -980,7 +980,7 @@ void CBasePlayer::TraceAttack( const CTakeDamageInfo &inputInfo, const Vector &v // -------------------------------------------------- CAI_BaseNPC *pNPC = info.GetAttacker()->MyNPCPointer(); #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 if ( pNPC && (pNPC->CapabilitiesGet() & bits_CAP_NO_HIT_PLAYER) && pNPC->IRelationType( this ) != D_HT ) #endif diff --git a/sp/src/game/server/point_template.cpp b/sp/src/game/server/point_template.cpp index c6a09ea6..4f6463a4 100644 --- a/sp/src/game/server/point_template.cpp +++ b/sp/src/game/server/point_template.cpp @@ -55,6 +55,9 @@ BEGIN_DATADESC( CPointTemplate ) DEFINE_KEYFIELD( m_iszTemplateEntityNames[14], FIELD_STRING, "Template15"), DEFINE_KEYFIELD( m_iszTemplateEntityNames[15], FIELD_STRING, "Template16"), DEFINE_UTLVECTOR( m_hTemplateEntities, FIELD_CLASSPTR ), +#ifdef MAPBASE + DEFINE_KEYFIELD( m_bFixupExpanded, FIELD_BOOLEAN, "FixupMode" ), +#endif DEFINE_UTLVECTOR( m_hTemplates, FIELD_EMBEDDED ), diff --git a/sp/src/game/server/point_template.h b/sp/src/game/server/point_template.h index b5c34d47..283a4b62 100644 --- a/sp/src/game/server/point_template.h +++ b/sp/src/game/server/point_template.h @@ -46,6 +46,9 @@ public: void AddTemplate( CBaseEntity *pEntity, const char *pszMapData, int nLen ); bool ShouldRemoveTemplateEntities( void ); bool AllowNameFixup(); +#ifdef MAPBASE + bool NameFixupExpanded() { return m_bFixupExpanded; } +#endif // Templates accessors int GetNumTemplates( void ); @@ -74,6 +77,12 @@ private: // code removes all the entities in it once it finishes turning them into templates. 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. CUtlVector< template_t > m_hTemplates; diff --git a/sp/src/game/shared/ammodef.cpp b/sp/src/game/shared/ammodef.cpp index 257e8569..8cd95e27 100644 --- a/sp/src/game/shared/ammodef.cpp +++ b/sp/src/game/shared/ammodef.cpp @@ -24,6 +24,21 @@ Ammo_t *CAmmoDef::GetAmmoOfIndex(int 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: // 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 + diff --git a/sp/src/game/shared/ammodef.h b/sp/src/game/shared/ammodef.h index 71c1707f..79a86ed2 100644 --- a/sp/src/game/shared/ammodef.h +++ b/sp/src/game/shared/ammodef.h @@ -72,6 +72,9 @@ public: Ammo_t m_AmmoType[MAX_AMMO_TYPES]; Ammo_t *GetAmmoOfIndex(int nAmmoIndex); +#ifdef MAPBASE + const char* Name(int nAmmoIndex); +#endif int Index(const char *psz); int PlrDamage(int nAmmoIndex); int NPCDamage(int nAmmoIndex); diff --git a/sp/src/game/shared/basecombatweapon_shared.cpp b/sp/src/game/shared/basecombatweapon_shared.cpp index a5e4c4d6..2fbcd49f 100644 --- a/sp/src/game/shared/basecombatweapon_shared.cpp +++ b/sp/src/game/shared/basecombatweapon_shared.cpp @@ -1801,22 +1801,6 @@ void CBaseCombatWeapon::InputHideWeapon( inputdata_t &inputdata ) 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 //----------------------------------------------------------------------------- @@ -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." ) #ifndef CLIENT_DLL - DEFINE_SCRIPTFUNC_NAMED( ScriptGetPrimaryAmmoType, "GetPrimaryAmmoType", "Get the weapon's primary ammo type." ) - DEFINE_SCRIPTFUNC_NAMED( ScriptGetSecondaryAmmoType, "GetSecondaryAmmoType", "Get the weapon's secondary ammo type." ) + DEFINE_SCRIPTFUNC( GetPrimaryAmmoType, "Get the weapon's primary ammo type." ) + DEFINE_SCRIPTFUNC( GetSecondaryAmmoType, "Get the weapon's secondary ammo type." ) #endif DEFINE_SCRIPTFUNC( GetSubType, "Get the weapon's subtype." ) diff --git a/sp/src/game/shared/basecombatweapon_shared.h b/sp/src/game/shared/basecombatweapon_shared.h index c5f4e863..69ee6bcf 100644 --- a/sp/src/game/shared/basecombatweapon_shared.h +++ b/sp/src/game/shared/basecombatweapon_shared.h @@ -519,11 +519,6 @@ public: virtual CDmgAccumulator *GetDmgAccumulator( void ) { return NULL; } -#ifdef MAPBASE_VSCRIPT - const char* ScriptGetPrimaryAmmoType(); - const char* ScriptGetSecondaryAmmoType(); -#endif - // Client only methods #else diff --git a/sp/src/game/shared/env_wind_shared.cpp b/sp/src/game/shared/env_wind_shared.cpp index a9267f90..02df324a 100644 --- a/sp/src/game/shared/env_wind_shared.cpp +++ b/sp/src/game/shared/env_wind_shared.cpp @@ -70,6 +70,9 @@ #include "IEffects.h" #include "engine/IEngineSound.h" #include "sharedInterface.h" +#ifdef CLIENT_DLL +#include "renderparm.h" +#endif // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" @@ -89,6 +92,7 @@ CEnvWindShared::CEnvWindShared() : m_WindAveQueue(10), m_WindVariationQueue(10) #ifdef MAPBASE s_windControllers.AddToTail( this ); m_windRadius = -1.0f; + m_flTreeSwayScale = 1.0f; #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 //----------------------------------------------------------------------------- @@ -196,6 +225,14 @@ float CEnvWindShared::WindThink( float flTime ) ComputeWindVariation( flTime ); +#if defined(MAPBASE) && defined(CLIENT_DLL) + if (m_flTreeSwayScale != 0.0f) + { + // Update Tree Sway + UpdateTreeSway( flTime ); + } +#endif + while (true) { // First, simulate up to the next switch time... diff --git a/sp/src/game/shared/env_wind_shared.h b/sp/src/game/shared/env_wind_shared.h index c7e23e12..bea9ea62 100644 --- a/sp/src/game/shared/env_wind_shared.h +++ b/sp/src/game/shared/env_wind_shared.h @@ -183,6 +183,10 @@ public: #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_CurrentSwayVector; + Vector m_PrevSwayVector; + + CNetworkVar( float, m_flTreeSwayScale ); #endif CNetworkVar( int, m_iInitialWindDir ); @@ -211,7 +215,12 @@ private: // Updates the wind sound void UpdateWindSound( float flTotalWindSpeed ); +#ifdef MAPBASE + void UpdateTreeSway( float flTime ); +#endif + float m_flVariationTime; + float m_flSwayTime; 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_flAveWindSpeed; // the average wind speed diff --git a/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp b/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp index c16b3eb7..5dc68aba 100644 --- a/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp +++ b/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp @@ -12,6 +12,7 @@ #include "cbase.h" #include "matchers.h" #include "takedamageinfo.h" +#include "ammodef.h" #ifndef CLIENT_DLL #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 ) { 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(hTrace); + UTIL_DecalTrace( &traceInfo->GetTrace(), decalName ); +} + //============================================================================= //============================================================================= @@ -813,6 +835,8 @@ void RegisterSharedScriptFunctions() ScriptRegisterFunction( g_pScriptVM, SpawnEntityFromTable, "Native function for entity spawning." ); #endif + g_pScriptVM->RegisterInstance( GetAmmoDef(), "AmmoDef" ); + g_pScriptVM->RegisterInstance( &g_ScriptConvarLookup, "Convars" ); 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, 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, 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, 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." ); 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." ); diff --git a/sp/src/materialsystem/stdshaders/SDK_depthwrite_vs20.fxc b/sp/src/materialsystem/stdshaders/SDK_depthwrite_vs20.fxc index f98e40e2..306a8846 100644 --- a/sp/src/materialsystem/stdshaders/SDK_depthwrite_vs20.fxc +++ b/sp/src/materialsystem/stdshaders/SDK_depthwrite_vs20.fxc @@ -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 ); diff --git a/sp/src/materialsystem/stdshaders/SDK_vertexlit_and_unlit_generic_vs20.fxc b/sp/src/materialsystem/stdshaders/SDK_vertexlit_and_unlit_generic_vs20.fxc index e42d254e..32550ccb 100644 --- a/sp/src/materialsystem/stdshaders/SDK_vertexlit_and_unlit_generic_vs20.fxc +++ b/sp/src/materialsystem/stdshaders/SDK_vertexlit_and_unlit_generic_vs20.fxc @@ -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 diff --git a/sp/src/materialsystem/stdshaders/depthwrite.cpp b/sp/src/materialsystem/stdshaders/depthwrite.cpp index fecaf42b..f55cdca6 100644 --- a/sp/src/materialsystem/stdshaders/depthwrite.cpp +++ b/sp/src/materialsystem/stdshaders/depthwrite.cpp @@ -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 ) diff --git a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs20.inc b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs20.inc index 25256cd7..09a93ed2 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs20.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs20.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs30.inc b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs30.inc index b009bec2..d208700a 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs30.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_depthwrite_vs30.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs20.inc b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs20.inc index bfbdd4c7..d63378dc 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs20.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs20.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs30.inc b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs30.inc index d0e8ef40..f2bc6c63 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs30.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9/SDK_vertexlit_and_unlit_generic_vs30.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs20.inc b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs20.inc index 25256cd7..09a93ed2 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs20.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs20.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs30.inc b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs30.inc index b009bec2..d208700a 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs30.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_depthwrite_vs30.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs20.inc b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs20.inc index bfbdd4c7..d63378dc 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs20.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs20.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs30.inc b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs30.inc index d0e8ef40..f2bc6c63 100644 --- a/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs30.inc +++ b/sp/src/materialsystem/stdshaders/fxctmp9_tmp/SDK_vertexlit_and_unlit_generic_vs30.inc @@ -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: diff --git a/sp/src/materialsystem/stdshaders/tree_sway.h b/sp/src/materialsystem/stdshaders/tree_sway.h new file mode 100644 index 00000000..2bc998ad --- /dev/null +++ b/sp/src/materialsystem/stdshaders/tree_sway.h @@ -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 \ No newline at end of file diff --git a/sp/src/materialsystem/stdshaders/unlitgeneric_dx9.cpp b/sp/src/materialsystem/stdshaders/unlitgeneric_dx9.cpp index f6c7fd73..f0c30116 100644 --- a/sp/src/materialsystem/stdshaders/unlitgeneric_dx9.cpp +++ b/sp/src/materialsystem/stdshaders/unlitgeneric_dx9.cpp @@ -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() diff --git a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9.cpp b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9.cpp index b732beba..73918971 100644 --- a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9.cpp +++ b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9.cpp @@ -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 diff --git a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.cpp b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.cpp index fec69122..6a317f78 100644 --- a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.cpp +++ b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.cpp @@ -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() ); } diff --git a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.h b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.h index 592e4367..94a16ebc 100644 --- a/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.h +++ b/sp/src/materialsystem/stdshaders/vertexlitgeneric_dx9_helper.h @@ -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 ); diff --git a/sp/src/public/renderparm.h b/sp/src/public/renderparm.h index 51d11c6b..d56e258b 100644 --- a/sp/src/public/renderparm.h +++ b/sp/src/public/renderparm.h @@ -28,6 +28,8 @@ enum RenderParamVector_t VECTOR_RENDERPARM_HMDWARP_ASPECT, INT_RENDERPARM_DISTORTION_TYPE, + VECTOR_RENDERPARM_WIND_DIRECTION, + MAX_VECTOR_RENDER_PARMS = 20 };