Merged dev changes 10/24/2019

- Applied the nexttoken security fix (suggested by ficool2, important for MP port, no #ifdef MAPBASE because of volume of changes and irrelevance to readers)
- Fixed a crash with the follower wait point start/stop using handlers
- Fixed game_ui activator crash
- Changed vphysics triggers to accept more entities
- Fixed player squadmates not obeying hint node facing (e.g. wait points)
- Fixed npc_snipers
- prop_vehicle_jeep_old no longer changes classname
- Restored and added the other CTakeDamageInfo fields for point_damageinfo
- Fixed game_metadata not saving correctly
- Fixed logic_measure_movement not functioning while possessing spawnflags
- Added scripts/mapbase_rpc.txt script with choosable app ID and game image
- Fixed some casing that broke Linux support
- Added proper WorldVertexTransition blending to translucency and selfillum (translucency may need the translucent texture to be $basetexture, not $basetexture2)
- Added modified parallax corrected cubemaps to shader code (although currently unusable)
- Fixed Variant_ParseInput
- Added/restored custom scanner speed (experimental, needs more work)
- Several miscellaneous code changes/fixes and comment adjustments
This commit is contained in:
Blixibon 2019-10-24 21:47:12 +00:00
parent 756caa92e4
commit 27b026c5d9
49 changed files with 622 additions and 248 deletions

1
README
View File

@ -7,6 +7,7 @@ The original code for phong reflections on LightmappedGeneric-derived shaders ar
The Alien Swarm-based radial fog and rope code as well as the multiple skybox support are from Half-Life 2: Downfall. (https://github.com/DownFall-Team/DownFall) The Alien Swarm-based radial fog and rope code as well as the multiple skybox support are from Half-Life 2: Downfall. (https://github.com/DownFall-Team/DownFall)
The dynamic RTT shadow angles code is from Saul Rennison on the VDC. (https://developer.valvesoftware.com/wiki/Dynamic_RTT_shadow_angles_in_Source_2007) The dynamic RTT shadow angles code is from Saul Rennison on the VDC. (https://developer.valvesoftware.com/wiki/Dynamic_RTT_shadow_angles_in_Source_2007)
The vortigaunt LOS fix is from Half-Life 2: Community Edition (dky.tehkingd.u in particular). (https://gitlab.com/RaraCerberus/HL2CE) The vortigaunt LOS fix is from Half-Life 2: Community Edition (dky.tehkingd.u in particular). (https://gitlab.com/RaraCerberus/HL2CE)
The parallax corrected cubemap code (which is partly in Mapbase's code, but not yet usable) was originally created by Brian Charles. (https://developer.valvesoftware.com/wiki/Parallax_Corrected_Cubemaps)
Various other code and contributions were based off of pull requests in the Source 2013 SDK (https://github.com/ValveSoftware/source-sdk-2013/pulls) and snippets on the Valve Developer Community (http://developer.valvesoftware.com/). Various other code and contributions were based off of pull requests in the Source 2013 SDK (https://github.com/ValveSoftware/source-sdk-2013/pulls) and snippets on the Valve Developer Community (http://developer.valvesoftware.com/).
All of the work mentioned above was open source when it was borrowed. All of the work mentioned above was open source when it was borrowed.

View File

@ -3542,7 +3542,7 @@ bool C_BaseAnimating::DispatchMuzzleEffect( const char *options, bool isFirstPer
int weaponType = 0; int weaponType = 0;
// Get the first parameter // Get the first parameter
p = nexttoken( token, p, ' ' ); p = nexttoken( token, p, ' ' , sizeof(token) );
// Find the weapon type // Find the weapon type
if ( token ) if ( token )
@ -3586,7 +3586,7 @@ bool C_BaseAnimating::DispatchMuzzleEffect( const char *options, bool isFirstPer
} }
// Get the second parameter // Get the second parameter
p = nexttoken( token, p, ' ' ); p = nexttoken( token, p, ' ' , sizeof(token) );
int attachmentIndex = -1; int attachmentIndex = -1;
@ -3697,7 +3697,7 @@ void C_BaseAnimating::FireEvent( const Vector& origin, const QAngle& angles, int
// Get the particle effect name // Get the particle effect name
const char *p = options; const char *p = options;
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if ( token ) if ( token )
{ {
const char* mtoken = ModifyEventParticles( token ); const char* mtoken = ModifyEventParticles( token );
@ -3707,7 +3707,7 @@ void C_BaseAnimating::FireEvent( const Vector& origin, const QAngle& angles, int
} }
// Get the attachment type // Get the attachment type
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if ( token ) if ( token )
{ {
iAttachType = GetAttachTypeFromString( token ); iAttachType = GetAttachTypeFromString( token );
@ -3719,7 +3719,7 @@ void C_BaseAnimating::FireEvent( const Vector& origin, const QAngle& angles, int
} }
// Get the attachment point index // Get the attachment point index
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if ( token ) if ( token )
{ {
iAttachment = atoi(token); iAttachment = atoi(token);
@ -3924,14 +3924,14 @@ void C_BaseAnimating::FireEvent( const Vector& origin, const QAngle& angles, int
const char *p = options; const char *p = options;
// Bodygroup Name // Bodygroup Name
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if ( token ) if ( token )
{ {
Q_strncpy( szBodygroupName, token, sizeof(szBodygroupName) ); Q_strncpy( szBodygroupName, token, sizeof(szBodygroupName) );
} }
// Get the desired value // Get the desired value
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if ( token ) if ( token )
{ {
value = atoi( token ); value = atoi( token );
@ -3971,21 +3971,21 @@ void C_BaseAnimating::FireObsoleteEvent( const Vector& origin, const QAngle& ang
const char *p = options; const char *p = options;
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if( token ) if( token )
{ {
Q_strncpy( effectFunc, token, sizeof(effectFunc) ); Q_strncpy( effectFunc, token, sizeof(effectFunc) );
} }
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if( token ) if( token )
{ {
iAttachment = atoi(token); iAttachment = atoi(token);
} }
p = nexttoken(token, p, ' '); p = nexttoken(token, p, ' ', sizeof(token));
if( token ) if( token )
{ {

View File

@ -747,11 +747,14 @@ CBaseEntity *CEntitySphereQuery::GetCurrentEntity()
// sep - Character to use as separator. UNDONE: allow multiple separator chars // sep - Character to use as separator. UNDONE: allow multiple separator chars
// Output : Returns a pointer to the next token to be parsed. // Output : Returns a pointer to the next token to be parsed.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char *nexttoken(char *token, const char *str, char sep) const char *nexttoken(char *token, const char *str, char sep, size_t tokenLen)
{ {
if ((str == NULL) || (*str == '\0')) if ((str == NULL) || (*str == '\0'))
{ {
*token = '\0'; if(tokenLen)
{
*token = '\0';
}
return(NULL); return(NULL);
} }
@ -759,11 +762,25 @@ const char *nexttoken(char *token, const char *str, char sep)
// Copy everything up to the first separator into the return buffer. // Copy everything up to the first separator into the return buffer.
// Do not include separators in the return buffer. // Do not include separators in the return buffer.
// //
while ((*str != sep) && (*str != '\0')) while ((*str != sep) && (*str != '\0') && (tokenLen > 1))
{ {
*token++ = *str++; *token++ = *str++;
tokenLen--;
}
//
// If token is to big for return buffer, skip rest of token.
//
while ((*str != sep) && (*str != '\0'))
{
str++;
}
if(tokenLen)
{
*token = '\0';
tokenLen--;
} }
*token = '\0';
// //
// Advance the pointer unless we hit the end of the input string. // Advance the pointer unless we hit the end of the input string.

View File

@ -89,7 +89,7 @@ void NormalizeAngles( QAngle& angles );
void InterpolateAngles( const QAngle& start, const QAngle& end, QAngle& output, float frac ); void InterpolateAngles( const QAngle& start, const QAngle& end, QAngle& output, float frac );
void InterpolateVector( float frac, const Vector& src, const Vector& dest, Vector& output ); void InterpolateVector( float frac, const Vector& src, const Vector& dest, Vector& output );
const char *nexttoken(char *token, const char *str, char sep); const char *nexttoken(char *token, const char *str, char sep, size_t tokenLen);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Base light indices to avoid index collision // Base light indices to avoid index collision

View File

@ -1259,15 +1259,11 @@ CClientShadowMgr::CClientShadowMgr() :
m_nPrevFrameCount( -1 ), m_nPrevFrameCount( -1 ),
#endif #endif
m_RenderToTextureActive( false ), m_RenderToTextureActive( false ),
#ifdef ASW_PROJECTED_TEXTURES
m_bDepthTextureActive( false ),
#else
m_bDepthTextureActive( false )
#endif
#ifdef DYNAMIC_RTT_SHADOWS #ifdef DYNAMIC_RTT_SHADOWS
m_bShadowFromWorldLights( false ), m_bShadowFromWorldLights( false ),
m_bSuppressShadowFromWorldLights( false ) m_bSuppressShadowFromWorldLights( false ),
#endif #endif
m_bDepthTextureActive( false )
{ {
m_nDepthTextureResolution = r_flashlightdepthres.GetInt(); m_nDepthTextureResolution = r_flashlightdepthres.GetInt();
m_bThreaded = false; m_bThreaded = false;

View File

@ -2364,11 +2364,11 @@ bool CHudCloseCaption::AddAsyncWork( const char *tokenstream, bool bIsStream, fl
char tokenname[ 512 ]; char tokenname[ 512 ];
tokenname[ 0 ] = 0; tokenname[ 0 ] = 0;
const char *p = tokenstream; const char *p = tokenstream;
p = nexttoken( tokenname, p, ' ' ); p = nexttoken( tokenname, p, ' ' , sizeof(tokenname) );
// p points to reset of sentence tokens, build up a unicode string from them... // p points to reset of sentence tokens, build up a unicode string from them...
while ( p && Q_strlen( tokenname ) > 0 ) while ( p && Q_strlen( tokenname ) > 0 )
{ {
p = nexttoken( tokenname, p, ' ' ); p = nexttoken( tokenname, p, ' ' , sizeof(tokenname) );
if ( Q_strlen( tokenname ) == 0 ) if ( Q_strlen( tokenname ) == 0 )
break; break;
@ -2403,7 +2403,7 @@ void CHudCloseCaption::ProcessSentenceCaptionStream( const char *tokenstream )
const char *p = tokenstream; const char *p = tokenstream;
p = nexttoken( tokenname, p, ' ' ); p = nexttoken( tokenname, p, ' ' , sizeof(tokenname) );
if ( Q_strlen( tokenname ) > 0 ) if ( Q_strlen( tokenname ) > 0 )
{ {

View File

@ -132,7 +132,7 @@ Vector CRagdollMagnet::GetForceVector( CBaseEntity *pNPC )
if (pBone) if (pBone)
{ {
CBaseAnimating *pAnimating = pNPC->GetBaseAnimating(); CBaseAnimating *pAnimating = pNPC->GetBaseAnimating();
Assert( pAniamting != NULL ); Assert( pAnimating != NULL );
const char *szBoneTarget = BoneTarget(); const char *szBoneTarget = BoneTarget();
Assert( szBoneTarget != NULL ); Assert( szBoneTarget != NULL );

View File

@ -921,7 +921,7 @@ void CAI_FollowBehavior::ClearFollowPoint()
{ {
#ifdef MAPBASE #ifdef MAPBASE
// If we were in range, we were probably already using it // If we were in range, we were probably already using it
if ((GetHintNode()->GetAbsOrigin() - GetFollowTarget()->GetAbsOrigin()).LengthSqr() < Square(MAX(m_FollowNavGoal.followPointTolerance, GetGoalRange()))) if (GetFollowTarget() && (GetHintNode()->GetAbsOrigin() - GetFollowTarget()->GetAbsOrigin()).LengthSqr() < Square(MAX(m_FollowNavGoal.followPointTolerance, GetGoalRange())))
GetHintNode()->NPCStoppedUsing(GetOuter()); GetHintNode()->NPCStoppedUsing(GetOuter());
#endif #endif
GetHintNode()->Unlock(); GetHintNode()->Unlock();

View File

@ -70,7 +70,7 @@ CON_COMMAND( ai_debug_node_connect, "Debug the attempted connection between two
ConVar g_ai_norebuildgraph( "ai_norebuildgraph", "0" ); ConVar g_ai_norebuildgraph( "ai_norebuildgraph", "0" );
#ifdef MAPBASE #ifdef MAPBASE
ConVar g_ai_nographrebuildmessage( "ai_nographrebuildmessage", "0", FCVAR_ARCHIVE, "Stops the \"Node graph out of date\" message from appearing when rbeuilding node graph" ); ConVar g_ai_nographrebuildmessage( "ai_nographrebuildmessage", "0", FCVAR_ARCHIVE, "Stops the \"Node graph out of date\" message from appearing when rebuilding node graph" );
#endif #endif

View File

@ -1736,6 +1736,12 @@ void CAI_PlayerAlly::ModifyOrAppendCriteria( AI_CriteriaSet& set )
{ {
BaseClass::ModifyOrAppendCriteria( set ); BaseClass::ModifyOrAppendCriteria( set );
#ifdef MAPBASE
// For the below speechtarget criteria
if (GetSpeechTarget() && !m_hPotentialSpeechTarget)
m_hPotentialSpeechTarget = GetSpeechTarget();
#endif
if ( m_hPotentialSpeechTarget ) if ( m_hPotentialSpeechTarget )
{ {
set.AppendCriteria( "speechtarget", m_hPotentialSpeechTarget->GetClassname() ); set.AppendCriteria( "speechtarget", m_hPotentialSpeechTarget->GetClassname() );

View File

@ -5070,7 +5070,7 @@ void CBaseEntity::PrecacheModelComponents( int nModelIndex )
{ {
char token[256]; char token[256];
const char *pOptions = pEvent->pszOptions(); const char *pOptions = pEvent->pszOptions();
nexttoken( token, pOptions, ' ' ); nexttoken( token, pOptions, ' ', sizeof( token ) );
if ( token ) if ( token )
{ {
PrecacheParticleSystem( token ); PrecacheParticleSystem( token );

View File

@ -136,7 +136,7 @@ CEventAction::CEventAction( const char *ActionData )
// //
// Parse the target name. // Parse the target name.
// //
const char *psz = nexttoken(szToken, ActionData, ','); const char *psz = nexttoken(szToken, ActionData, ',', sizeof(szToken));
if (szToken[0] != '\0') if (szToken[0] != '\0')
{ {
m_iTarget = AllocPooledString(szToken); m_iTarget = AllocPooledString(szToken);
@ -145,7 +145,7 @@ CEventAction::CEventAction( const char *ActionData )
// //
// Parse the input name. // Parse the input name.
// //
psz = nexttoken(szToken, psz, ','); psz = nexttoken(szToken, psz, ',', sizeof(szToken));
if (szToken[0] != '\0') if (szToken[0] != '\0')
{ {
m_iTargetInput = AllocPooledString(szToken); m_iTargetInput = AllocPooledString(szToken);
@ -158,7 +158,7 @@ CEventAction::CEventAction( const char *ActionData )
// //
// Parse the parameter override. // Parse the parameter override.
// //
psz = nexttoken(szToken, psz, ','); psz = nexttoken(szToken, psz, ',', sizeof(szToken));
if (szToken[0] != '\0') if (szToken[0] != '\0')
{ {
m_iParameter = AllocPooledString(szToken); m_iParameter = AllocPooledString(szToken);
@ -167,7 +167,7 @@ CEventAction::CEventAction( const char *ActionData )
// //
// Parse the delay. // Parse the delay.
// //
psz = nexttoken(szToken, psz, ','); psz = nexttoken(szToken, psz, ',', sizeof(szToken));
if (szToken[0] != '\0') if (szToken[0] != '\0')
{ {
m_flDelay = atof(szToken); m_flDelay = atof(szToken);
@ -176,7 +176,7 @@ CEventAction::CEventAction( const char *ActionData )
// //
// Parse the number of times to fire. // Parse the number of times to fire.
// //
nexttoken(szToken, psz, ','); nexttoken(szToken, psz, ',', sizeof(szToken));
if (szToken[0] != '\0') if (szToken[0] != '\0')
{ {
m_nTimesToFire = atoi(szToken); m_nTimesToFire = atoi(szToken);

View File

@ -214,7 +214,11 @@ void CGameUI::Deactivate( CBaseEntity *pActivator )
} }
else else
{ {
#ifdef MAPBASE
Warning("%s Deactivate(): I have no player when called by %s!\n", GetEntityName().ToCStr(), pActivator ? pActivator->GetEntityName().ToCStr() : "(null)");
#else
Warning("%s Deactivate(): I have no player when called by %s!\n", GetEntityName().ToCStr(), pActivator->GetEntityName().ToCStr()); Warning("%s Deactivate(): I have no player when called by %s!\n", GetEntityName().ToCStr(), pActivator->GetEntityName().ToCStr());
#endif
} }
// Stop thinking // Stop thinking

View File

@ -1655,7 +1655,7 @@ void CNPC_BaseZombie::HandleAnimEvent( animevent_t *pEvent )
const char *pString = pEvent->options; const char *pString = pEvent->options;
char token[128]; char token[128];
pString = nexttoken( token, pString, ' ' ); pString = nexttoken( token, pString, ' ', sizeof(token) );
int boneIndex = GetInteractionPartner()->LookupBone( token ); int boneIndex = GetInteractionPartner()->LookupBone( token );
@ -1665,7 +1665,7 @@ void CNPC_BaseZombie::HandleAnimEvent( animevent_t *pEvent )
return; return;
} }
pString = nexttoken( token, pString, ' ' ); pString = nexttoken( token, pString, ' ', sizeof( token ) );
if ( !token ) if ( !token )
{ {

View File

@ -41,6 +41,10 @@ BEGIN_DATADESC( CNPC_BaseScanner )
DEFINE_FIELD( m_flAttackFarDist, FIELD_FLOAT ), DEFINE_FIELD( m_flAttackFarDist, FIELD_FLOAT ),
DEFINE_FIELD( m_flAttackRange, FIELD_FLOAT ), DEFINE_FIELD( m_flAttackRange, FIELD_FLOAT ),
#ifdef MAPBASE
DEFINE_KEYFIELD( m_flCustomMaxSpeed, FIELD_FLOAT, "CustomFlightSpeed" ),
#endif
DEFINE_FIELD( m_nPoseTail, FIELD_INTEGER ), DEFINE_FIELD( m_nPoseTail, FIELD_INTEGER ),
DEFINE_FIELD( m_nPoseDynamo, FIELD_INTEGER ), DEFINE_FIELD( m_nPoseDynamo, FIELD_INTEGER ),
DEFINE_FIELD( m_nPoseFlare, FIELD_INTEGER ), DEFINE_FIELD( m_nPoseFlare, FIELD_INTEGER ),
@ -52,7 +56,11 @@ BEGIN_DATADESC( CNPC_BaseScanner )
DEFINE_FIELD( m_pSmokeTrail, FIELD_CLASSPTR ), DEFINE_FIELD( m_pSmokeTrail, FIELD_CLASSPTR ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDistanceOverride", InputSetDistanceOverride ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDistanceOverride", InputSetDistanceOverride ),
#ifdef MAPBASE
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetFlightSpeed", InputSetFlightSpeed ),
#else
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetFlightSpeed", InputSetFlightSpeed ), DEFINE_INPUTFUNC( FIELD_INTEGER, "SetFlightSpeed", InputSetFlightSpeed ),
#endif
DEFINE_THINKFUNC( DiveBombSoundThink ), DEFINE_THINKFUNC( DiveBombSoundThink ),
END_DATADESC() END_DATADESC()
@ -861,12 +869,16 @@ void CNPC_BaseScanner::SpeakSentence( int sentenceType )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void CNPC_BaseScanner::InputSetFlightSpeed(inputdata_t &inputdata) void CNPC_BaseScanner::InputSetFlightSpeed(inputdata_t &inputdata)
{ {
#ifdef MAPBASE
m_flCustomMaxSpeed = inputdata.value.Float();
#else
//FIXME: Currently unsupported //FIXME: Currently unsupported
/* /*
m_flFlightSpeed = inputdata.value.Int(); m_flFlightSpeed = inputdata.value.Int();
m_bFlightSpeedOverridden = (m_flFlightSpeed > 0); m_bFlightSpeedOverridden = (m_flFlightSpeed > 0);
*/ */
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1655,6 +1667,11 @@ void CNPC_BaseScanner::PainSound( const CTakeDamageInfo &info )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
float CNPC_BaseScanner::GetMaxSpeed() float CNPC_BaseScanner::GetMaxSpeed()
{ {
#ifdef MAPBASE
if (m_flCustomMaxSpeed > 0.0f)
return m_flCustomMaxSpeed;
#endif
return SCANNER_MAX_SPEED; return SCANNER_MAX_SPEED;
} }

View File

@ -200,6 +200,11 @@ protected:
float m_flAttackFarDist; float m_flAttackFarDist;
float m_flAttackRange; float m_flAttackRange;
#ifdef MAPBASE
// Custom max speed for mappers to control
float m_flCustomMaxSpeed;
#endif
private: private:
CSoundPatch *m_pEngineSound; CSoundPatch *m_pEngineSound;

View File

@ -1556,14 +1556,14 @@ Activity CNPC_Combine::NPC_TranslateActivity( Activity eNewActivity )
} }
} }
#ifdef MAPBASE #ifdef MAPBASE
else if (!GetActiveWeapon() && npc_combine_unarmed_anims.GetBool()) else if (!GetActiveWeapon() && npc_combine_unarmed_anims.GetBool() && HaveSequenceForActivity(ACT_IDLE_UNARMED))
{ {
if (eNewActivity == ACT_IDLE || eNewActivity == ACT_IDLE_ANGRY) if (eNewActivity == ACT_IDLE || eNewActivity == ACT_IDLE_ANGRY)
eNewActivity = ACT_IDLE_UNARMED; eNewActivity = ACT_IDLE_UNARMED;
else if (eNewActivity == ACT_WALK) else if (eNewActivity == ACT_WALK)
eNewActivity = ACT_WALK_UNARMED; eNewActivity = ACT_WALK_UNARMED;
} }
else if (eNewActivity == ACT_WALK && m_NPCState == NPC_STATE_IDLE && npc_combine_idle_walk_easy.GetBool()) else if (eNewActivity == ACT_WALK && m_NPCState == NPC_STATE_IDLE && npc_combine_idle_walk_easy.GetBool() && HaveSequenceForActivity(ACT_WALK_EASY))
{ {
eNewActivity = ACT_WALK_EASY; eNewActivity = ACT_WALK_EASY;
} }
@ -3528,11 +3528,7 @@ Vector CNPC_Combine::EyePosition( void )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Vector CNPC_Combine::GetAltFireTarget() Vector CNPC_Combine::GetAltFireTarget()
{ {
#ifdef MAPBASE
Assert( IsAltFireCapable() );
#else
Assert( IsElite() ); Assert( IsElite() );
#endif
return m_vecAltFireTarget; return m_vecAltFireTarget;
} }

View File

@ -1531,7 +1531,7 @@ void CNPC_Manhack::Slice( CBaseEntity *pHitEntity, float flInterval, trace_t &tr
// Spawn some extra blood where we hit // Spawn some extra blood where we hit
#ifdef MAPBASE #ifdef MAPBASE
if ( pHitEntity->BloodColor() == DONT_BLEED || (m_bHackedByAlyx && !pHitEntity->PassesDamageFilter(info)) ) if ( pHitEntity->BloodColor() == DONT_BLEED || (IRelationType(pHitEntity) > D_FR && !pHitEntity->PassesDamageFilter(info)) )
#else #else
if ( pHitEntity->BloodColor() == DONT_BLEED ) if ( pHitEntity->BloodColor() == DONT_BLEED )
#endif #endif

View File

@ -1093,6 +1093,12 @@ bool CNPC_PlayerCompanion::IsValidReasonableFacing( const Vector &vecSightDir, f
if( ai_new_aiming.GetBool() ) if( ai_new_aiming.GetBool() )
{ {
#ifdef MAPBASE
// Hint node facing should still be obeyed
if (GetHintNode() && GetHintNode()->GetIgnoreFacing() != HIF_YES)
return true;
#endif
Vector vecEyePositionCentered = GetAbsOrigin(); Vector vecEyePositionCentered = GetAbsOrigin();
vecEyePositionCentered.z = EyePosition().z; vecEyePositionCentered.z = EyePosition().z;
@ -1928,11 +1934,10 @@ bool CNPC_PlayerCompanion::IsReadinessCapable()
pWeapon->ActivityOverride( ACT_IDLE_AGITATED, NULL ) == ACT_IDLE_AGITATED ) pWeapon->ActivityOverride( ACT_IDLE_AGITATED, NULL ) == ACT_IDLE_AGITATED )
return false; return false;
#ifdef MAPBASE if (LookupActivity( "ACT_IDLE_AIM_RIFLE_STIMULATED" ) == ACT_INVALID)
return false;
if (EntIsClass(GetActiveWeapon(), gm_isz_class_RPG)) if (EntIsClass(GetActiveWeapon(), gm_isz_class_RPG))
#else
if (FClassnameIs( GetActiveWeapon(), "weapon_rpg" ))
#endif
return false; return false;
} }
#else #else

View File

@ -990,7 +990,12 @@ void CNPC_CScanner::DeployMine()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
float CNPC_CScanner::GetMaxSpeed() float CNPC_CScanner::GetMaxSpeed()
{ {
#ifdef MAPBASE
// Don't stomp custom max speed in base class
if( IsStriderScout() && m_flCustomMaxSpeed <= 0.0f )
#else
if( IsStriderScout() ) if( IsStriderScout() )
#endif
{ {
return SCANNER_SCOUT_MAX_SPEED; return SCANNER_SCOUT_MAX_SPEED;
} }

View File

@ -602,7 +602,7 @@ bool CProtoSniper::QuerySeeEntity( CBaseEntity *pEntity, bool bOnlyHateOrFearIfN
{ {
Disposition_t disp = IRelationType(pEntity); Disposition_t disp = IRelationType(pEntity);
#ifdef MAPBASE #ifdef MAPBASE
if( disp <= D_FR ) if( disp > D_FR )
#else #else
if( disp != D_HT ) if( disp != D_HT )
#endif #endif

View File

@ -177,12 +177,6 @@ CPropJeep::CPropJeep( void )
m_bUnableToFire = true; m_bUnableToFire = true;
m_flAmmoCrateCloseTime = 0; m_flAmmoCrateCloseTime = 0;
#ifdef MAPBASE
// Turn prop_vehicle_jeep_olds into prop_vehicle_jeeps
if (FStrEq(GetClassname(), "prop_vehicle_jeep_old"))
SetClassname("prop_vehicle_jeep");
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -1163,7 +1163,11 @@ void CPlayerPickupController::Use( CBaseEntity *pActivator, CBaseEntity *pCaller
Vector vecLaunch; Vector vecLaunch;
m_pPlayer->EyeVectors( &vecLaunch ); m_pPlayer->EyeVectors( &vecLaunch );
// JAY: Scale this with mass because some small objects really go flying // JAY: Scale this with mass because some small objects really go flying
#ifdef MAPBASE
float massFactor = pPhys ? clamp( pPhys->GetMass(), 0.5, 15 ) : 7.5;
#else
float massFactor = clamp( pPhys->GetMass(), 0.5, 15 ); float massFactor = clamp( pPhys->GetMass(), 0.5, 15 );
#endif
massFactor = RemapVal( massFactor, 0.5, 15, 0.5, 4 ); massFactor = RemapVal( massFactor, 0.5, 15, 0.5, 4 );
vecLaunch *= player_throwforce.GetFloat() * massFactor; vecLaunch *= player_throwforce.GetFloat() * massFactor;

View File

@ -276,7 +276,7 @@ void CLogicMeasureMovement::MeasureThink( )
if (m_bOutputPosition) if (m_bOutputPosition)
{ {
m_OutPosition.Set(vecNewOrigin, m_hTarget.Get(), this); m_OutPosition.Set(vecNewOrigin, m_hTarget.Get(), this);
m_OutAngles.Set(Vector(vecNewAngles.x, vecNewAngles.y, vecNewAngles.z), m_hTarget.Get(), this); m_OutAngles.Set(*(reinterpret_cast<Vector*>(vecNewAngles.Base())), m_hTarget.Get(), this);
} }
if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_TELEPORT )) if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_TELEPORT ))
@ -369,31 +369,6 @@ void CLogicMeasureMovement::DoMeasure( Vector &vecOrigin, QAngle &angAngles )
} }
ConcatTransforms( matWorldToMeasure, m_hMeasureReference->EntityToWorldTransform(), matRefToMeasure ); ConcatTransforms( matWorldToMeasure, m_hMeasureReference->EntityToWorldTransform(), matRefToMeasure );
// If we have spawn flags, we might be supposed to ignore something
if (GetSpawnFlags() > 0)
{
if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN ))
{
// Get the position from the matrix's column directly and re-assign it
Vector vecPosition;
MatrixGetColumn( matRefToMeasure, 3, vecPosition );
HandleIgnoreFlags( vecPosition.Base() );
MatrixSetColumn( vecPosition, 3, matRefToMeasure );
}
else
{
// Get the angles from the matrix and re-assign it
QAngle angMod;
MatrixAngles( matWorldToMeasure, angMod );
HandleIgnoreFlags( angMod.Base() );
AngleMatrix( angMod, matWorldToMeasure );
}
}
// Apply the scale factor // Apply the scale factor
if ( ( m_flScale != 0.0f ) && ( m_flScale != 1.0f ) ) if ( ( m_flScale != 0.0f ) && ( m_flScale != 1.0f ) )
@ -408,9 +383,27 @@ void CLogicMeasureMovement::DoMeasure( Vector &vecOrigin, QAngle &angAngles )
matrix3x4_t matMeasureToRef, matNewTargetToWorld; matrix3x4_t matMeasureToRef, matNewTargetToWorld;
MatrixInvert( matRefToMeasure, matMeasureToRef ); MatrixInvert( matRefToMeasure, matMeasureToRef );
// Handle origin ignorance
if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN ))
{
// Get the position from the matrix's column directly and re-assign it
Vector vecPosition;
MatrixGetColumn( matRefToMeasure, 3, vecPosition );
HandleIgnoreFlags( vecPosition.Base() );
MatrixSetColumn( vecPosition, 3, matRefToMeasure );
}
ConcatTransforms( m_hTargetReference->EntityToWorldTransform(), matMeasureToRef, matNewTargetToWorld ); ConcatTransforms( m_hTargetReference->EntityToWorldTransform(), matMeasureToRef, matNewTargetToWorld );
MatrixAngles( matNewTargetToWorld, angAngles, vecOrigin ); MatrixAngles( matNewTargetToWorld, angAngles, vecOrigin );
// If our spawnflags are greater than 0 (and don't just contain our default "TELEPORT" flag), we might need to ignore one of our angles.
if (GetSpawnFlags() && GetSpawnFlags() != SF_LOGIC_MEASURE_MOVEMENT_TELEPORT && !HasSpawnFlags(SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN))
{
HandleIgnoreFlags( angAngles.Base() );
}
} }
@ -765,31 +758,6 @@ void CLogicMirrorMovement::DoMeasure( Vector &vecOrigin, QAngle &angAngles )
} }
ConcatTransforms( matWorldToMeasure, m_hMeasureReference->EntityToWorldTransform(), matRefToMeasure ); ConcatTransforms( matWorldToMeasure, m_hMeasureReference->EntityToWorldTransform(), matRefToMeasure );
// If we have spawn flags, we might be supposed to ignore something
if (GetSpawnFlags() > 0)
{
if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN ))
{
// Get the position from the matrix's column directly and re-assign it
Vector vecPosition;
MatrixGetColumn( matRefToMeasure, 3, vecPosition );
HandleIgnoreFlags( vecPosition.Base() );
MatrixSetColumn( vecPosition, 3, matRefToMeasure );
}
else
{
// Get the angles from the matrix and re-assign it
QAngle angMod;
MatrixAngles( matWorldToMeasure, angMod );
HandleIgnoreFlags( angMod.Base() );
AngleMatrix( angMod, matWorldToMeasure );
}
}
// Apply the scale factor // Apply the scale factor
if ( ( m_flScale != 0.0f ) && ( m_flScale != 1.0f ) ) if ( ( m_flScale != 0.0f ) && ( m_flScale != 1.0f ) )
@ -814,10 +782,28 @@ void CLogicMirrorMovement::DoMeasure( Vector &vecOrigin, QAngle &angAngles )
matrix3x4_t matMeasureToRef, matNewTargetToWorld; matrix3x4_t matMeasureToRef, matNewTargetToWorld;
MatrixInvert( matRefToMeasure, matMeasureToRef ); MatrixInvert( matRefToMeasure, matMeasureToRef );
// Handle origin ignorance
if (HasSpawnFlags( SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN ))
{
// Get the position from the matrix's column directly and re-assign it
Vector vecPosition;
MatrixGetColumn( matRefToMeasure, 3, vecPosition );
HandleIgnoreFlags( vecPosition.Base() );
MatrixSetColumn( vecPosition, 3, matRefToMeasure );
}
ConcatTransforms( m_hTargetReference->EntityToWorldTransform(), matMeasureToRef, matNewTargetToWorld ); ConcatTransforms( m_hTargetReference->EntityToWorldTransform(), matMeasureToRef, matNewTargetToWorld );
MatrixAngles( matNewTargetToWorld, angAngles, vecOrigin ); MatrixAngles( matNewTargetToWorld, angAngles, vecOrigin );
// If our spawnflags are greater than 0 (and don't just contain our default "TELEPORT" flag), we might need to ignore one of our angles.
if (GetSpawnFlags() && GetSpawnFlags() != SF_LOGIC_MEASURE_MOVEMENT_TELEPORT && !HasSpawnFlags(SF_LOGIC_MEASURE_MOVEMENT_USE_IGNORE_FLAGS_FOR_ORIGIN))
{
HandleIgnoreFlags( angAngles.Base() );
}
/* /*
VMatrix matPortal1ToWorldInv, matPortal2ToWorld; VMatrix matPortal1ToWorldInv, matPortal2ToWorld;
MatrixInverseGeneral( m_hMeasureReference->EntityToWorldTransform(), matPortal1ToWorldInv ); MatrixInverseGeneral( m_hMeasureReference->EntityToWorldTransform(), matPortal1ToWorldInv );

View File

@ -54,7 +54,8 @@
// Mask used for Combine ball hull traces. // Mask used for Combine ball hull traces.
// This used MASK_SHOT before, but this has been changed to MASK_SHOT_HULL. // This used MASK_SHOT before, but this has been changed to MASK_SHOT_HULL.
// Hopefully this doesn't have any major consequences... // This fixes the existing problem of soldiers trying to fire energy balls through grates,
// but it's also important to prevent soldiers from blowing themselves up with their newfound SMG grenades.
#define MASK_COMBINE_BALL_LOS MASK_SHOT_HULL #define MASK_COMBINE_BALL_LOS MASK_SHOT_HULL
extern int COMBINE_AE_BEGIN_ALTFIRE; extern int COMBINE_AE_BEGIN_ALTFIRE;

View File

@ -45,15 +45,18 @@ public:
void InputSetDamage( inputdata_t &inputdata ) { m_info.SetDamage(inputdata.value.Float()); } void InputSetDamage( inputdata_t &inputdata ) { m_info.SetDamage(inputdata.value.Float()); }
void InputSetMaxDamage( inputdata_t &inputdata ) { m_info.SetMaxDamage(inputdata.value.Float()); } void InputSetMaxDamage( inputdata_t &inputdata ) { m_info.SetMaxDamage(inputdata.value.Float()); }
//void InputSetDamageBonus( inputdata_t &inputdata ) { m_info.SetDamageBonus(inputdata.value.Float()); } void InputSetDamageBonus( inputdata_t &inputdata ) { m_info.SetDamageBonus(inputdata.value.Float()); }
void InputSetDamageType( inputdata_t &inputdata ) { m_info.SetDamageType(inputdata.value.Int()); } void InputSetDamageType( inputdata_t &inputdata ) { m_info.SetDamageType(inputdata.value.Int()); }
void InputSetDamageCustom( inputdata_t &inputdata ) { m_info.SetDamageCustom(inputdata.value.Int()); } void InputSetDamageCustom( inputdata_t &inputdata ) { m_info.SetDamageCustom(inputdata.value.Int()); }
//void InputSetDamageStats( inputdata_t &inputdata ) { m_info.SetDamageStats(inputdata.value.Int()); } void InputSetDamageStats( inputdata_t &inputdata ) { m_info.SetDamageStats(inputdata.value.Int()); }
void InputSetForceFriendlyFire( inputdata_t &inputdata ) { m_info.SetForceFriendlyFire(inputdata.value.Bool()); } void InputSetForceFriendlyFire( inputdata_t &inputdata ) { m_info.SetForceFriendlyFire(inputdata.value.Bool()); }
void InputSetAmmoType( inputdata_t &inputdata ) { m_info.SetAmmoType(inputdata.value.Int()); } void InputSetAmmoType( inputdata_t &inputdata ) { m_info.SetAmmoType(inputdata.value.Int()); }
void InputSetPlayerPenetrationCount( inputdata_t &inputdata ) { m_info.SetPlayerPenetrationCount( inputdata.value.Int() ); }
void InputSetDamagedOtherPlayers( inputdata_t &inputdata ) { m_info.SetDamagedOtherPlayers( inputdata.value.Int() ); }
void InputSetDamageForce( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetDamageForce(vec); } void InputSetDamageForce( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetDamageForce(vec); }
void InputSetDamagePosition( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetDamagePosition(vec); } void InputSetDamagePosition( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetDamagePosition(vec); }
void InputSetReportedPosition( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetReportedPosition(vec); } void InputSetReportedPosition( inputdata_t &inputdata ) { Vector vec; inputdata.value.Vector3D(vec); m_info.SetReportedPosition(vec); }
@ -92,12 +95,14 @@ BEGIN_DATADESC( CPointDamageInfo )
DEFINE_INPUTFUNC( FIELD_STRING, "SetWeapon", InputSetWeapon ), DEFINE_INPUTFUNC( FIELD_STRING, "SetWeapon", InputSetWeapon ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDamage", InputSetDamage ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDamage", InputSetDamage ),
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetMaxDamage", InputSetMaxDamage ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetMaxDamage", InputSetMaxDamage ),
//DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDamageBonus", InputSetDamageBonus ), DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDamageBonus", InputSetDamageBonus ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageType", InputSetDamageType ), DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageType", InputSetDamageType ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageCustom", InputSetDamageCustom ), DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageCustom", InputSetDamageCustom ),
//DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageStats", InputSetDamageStats ), DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamageStats", InputSetDamageStats ),
DEFINE_INPUTFUNC( FIELD_BOOLEAN, "SetForceFriendlyFire", InputSetForceFriendlyFire ), DEFINE_INPUTFUNC( FIELD_BOOLEAN, "SetForceFriendlyFire", InputSetForceFriendlyFire ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetAmmoType", InputSetAmmoType ), DEFINE_INPUTFUNC( FIELD_INTEGER, "SetAmmoType", InputSetAmmoType ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetPlayerPenetrationCount", InputSetPlayerPenetrationCount ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetDamagedOtherPlayers", InputSetDamagedOtherPlayers ),
DEFINE_INPUTFUNC( FIELD_VECTOR, "SetDamageForce", InputSetDamageForce ), DEFINE_INPUTFUNC( FIELD_VECTOR, "SetDamageForce", InputSetDamageForce ),
DEFINE_INPUTFUNC( FIELD_VECTOR, "SetDamagePosition", InputSetDamagePosition ), DEFINE_INPUTFUNC( FIELD_VECTOR, "SetDamagePosition", InputSetDamagePosition ),
DEFINE_INPUTFUNC( FIELD_VECTOR, "SetReportedPosition", InputSetReportedPosition ), DEFINE_INPUTFUNC( FIELD_VECTOR, "SetReportedPosition", InputSetReportedPosition ),
@ -139,29 +144,27 @@ bool CPointDamageInfo::KeyValue( const char *szKeyName, const char *szValue )
m_info.SetDamage(atof(szValue)); m_info.SetDamage(atof(szValue));
else if (FStrEq(szKeyName, "MaxDamage")) else if (FStrEq(szKeyName, "MaxDamage"))
m_info.SetMaxDamage(atof(szValue)); m_info.SetMaxDamage(atof(szValue));
//else if (FStrEq(szKeyName, "DamageBonus")) else if (FStrEq(szKeyName, "DamageBonus"))
// m_info.SetDamageBonus(atof(szValue)); m_info.SetDamageBonus(atof(szValue));
else if (FStrEq(szKeyName, "DamageType")) else if (FStrEq(szKeyName, "DamageType") || FStrEq(szKeyName, "DamagePresets"))
m_info.AddDamageType(atoi(szValue)); m_info.AddDamageType(atoi(szValue));
else if (FStrEq(szKeyName, "DamageOr")) else if (FStrEq(szKeyName, "DamageOr"))
m_info.AddDamageType(atoi(szValue)); m_info.AddDamageType(atoi(szValue));
else if (FStrEq(szKeyName, "DamageCustom")) else if (FStrEq(szKeyName, "DamageCustom"))
m_info.SetDamageCustom(atoi(szValue)); m_info.SetDamageCustom(atoi(szValue));
//else if (FStrEq(szKeyName, "DamageStats")) else if (FStrEq(szKeyName, "DamageStats"))
// m_info.SetDamageStats(atoi(szValue)); m_info.SetDamageStats(atoi(szValue));
else if (FStrEq(szKeyName, "ForceFriendlyFire")) else if (FStrEq(szKeyName, "ForceFriendlyFire"))
m_info.SetForceFriendlyFire(FStrEq(szValue, "1")); m_info.SetForceFriendlyFire(FStrEq(szValue, "1"));
else if (FStrEq(szKeyName, "AmmoType")) else if (FStrEq(szKeyName, "AmmoType"))
m_info.SetAmmoType(atoi(szValue)); m_info.SetAmmoType(atoi(szValue));
/*
else if (FStrEq(szKeyName, "PlayerPenetrationCount")) else if (FStrEq(szKeyName, "PlayerPenetrationCount"))
m_info.SetPlayerPenetrationCount(atoi(szValue)); m_info.SetPlayerPenetrationCount(atoi(szValue));
else if (FStrEq(szKeyName, "DamagedOtherPlayers")) else if (FStrEq(szKeyName, "DamagedOtherPlayers"))
m_info.SetDamagedOtherPlayers(atoi(szValue)); m_info.SetDamagedOtherPlayers(atoi(szValue));
*/
else else
{ {
@ -214,27 +217,25 @@ bool CPointDamageInfo::GetKeyValue( const char *szKeyName, char *szValue, int iM
Q_snprintf(szValue, iMaxLen, "%f", m_info.GetDamage()); Q_snprintf(szValue, iMaxLen, "%f", m_info.GetDamage());
else if (FStrEq(szKeyName, "MaxDamage")) else if (FStrEq(szKeyName, "MaxDamage"))
Q_snprintf(szValue, iMaxLen, "%f", m_info.GetMaxDamage()); Q_snprintf(szValue, iMaxLen, "%f", m_info.GetMaxDamage());
//else if (FStrEq(szKeyName, "DamageBonus")) else if (FStrEq(szKeyName, "DamageBonus"))
// Q_snprintf(szValue, iMaxLen, "%f", m_info.GetDamageBonus()); Q_snprintf(szValue, iMaxLen, "%f", m_info.GetDamageBonus());
else if (FStrEq(szKeyName, "DamageType")) else if (FStrEq(szKeyName, "DamageType"))
Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageType()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageType());
else if (FStrEq(szKeyName, "DamageCustom")) else if (FStrEq(szKeyName, "DamageCustom"))
Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageCustom()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageCustom());
//else if (FStrEq(szKeyName, "DamageStats")) else if (FStrEq(szKeyName, "DamageStats"))
// Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageStats()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamageStats());
else if (FStrEq(szKeyName, "ForceFriendlyFire")) else if (FStrEq(szKeyName, "ForceFriendlyFire"))
Q_snprintf(szValue, iMaxLen, "%s", m_info.IsForceFriendlyFire() ? "1" : "0"); Q_snprintf(szValue, iMaxLen, "%s", m_info.IsForceFriendlyFire() ? "1" : "0");
else if (FStrEq(szKeyName, "AmmoType")) else if (FStrEq(szKeyName, "AmmoType"))
Q_snprintf(szValue, iMaxLen, "%i", m_info.GetAmmoType()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetAmmoType());
/*
else if (FStrEq(szKeyName, "PlayerPenetrationCount")) else if (FStrEq(szKeyName, "PlayerPenetrationCount"))
Q_snprintf(szValue, iMaxLen, "%i", m_info.GetPlayerPenetrationCount()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetPlayerPenetrationCount());
else if (FStrEq(szKeyName, "DamagedOtherPlayers")) else if (FStrEq(szKeyName, "DamagedOtherPlayers"))
Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamagedOtherPlayers()); Q_snprintf(szValue, iMaxLen, "%i", m_info.GetDamagedOtherPlayers());
*/
else if (FStrEq(szKeyName, "DamageForce")) else if (FStrEq(szKeyName, "DamageForce"))
Q_snprintf(szValue, iMaxLen, "%f %f %f", m_info.GetDamageForce().x, m_info.GetDamageForce().y, m_info.GetDamageForce().z); Q_snprintf(szValue, iMaxLen, "%f %f %f", m_info.GetDamageForce().x, m_info.GetDamageForce().y, m_info.GetDamageForce().z);
@ -272,8 +273,6 @@ void CPointDamageInfo::ApplyDamage( const char *target, inputdata_t &inputdata )
{ {
if (m_iszAttacker != NULL_STRING) if (m_iszAttacker != NULL_STRING)
m_info.SetAttacker( gEntList.FindEntityByName(NULL, STRING(m_iszAttacker), this, inputdata.pActivator, inputdata.pCaller) ); m_info.SetAttacker( gEntList.FindEntityByName(NULL, STRING(m_iszAttacker), this, inputdata.pActivator, inputdata.pCaller) );
else
m_info.SetAttacker( this );
if (m_iszInflictor != NULL_STRING) if (m_iszInflictor != NULL_STRING)
m_info.SetInflictor( gEntList.FindEntityByName(NULL, STRING(m_iszInflictor), this, inputdata.pActivator, inputdata.pCaller) ); m_info.SetInflictor( gEntList.FindEntityByName(NULL, STRING(m_iszInflictor), this, inputdata.pActivator, inputdata.pCaller) );
@ -284,8 +283,6 @@ void CPointDamageInfo::ApplyDamage( const char *target, inputdata_t &inputdata )
{ {
m_info.SetInflictor(pBCC->GetActiveWeapon()); m_info.SetInflictor(pBCC->GetActiveWeapon());
} }
else
m_info.SetInflictor(this);
} }
if (m_iszWeapon != NULL_STRING) if (m_iszWeapon != NULL_STRING)
@ -297,10 +294,17 @@ void CPointDamageInfo::ApplyDamage( const char *target, inputdata_t &inputdata )
{ {
m_info.SetWeapon(pBCC->GetActiveWeapon()); m_info.SetWeapon(pBCC->GetActiveWeapon());
} }
else
m_info.SetWeapon(this);
} }
if (!m_info.GetAttacker())
m_info.SetAttacker( this );
if (!m_info.GetInflictor())
m_info.SetInflictor( this );
if (!m_info.GetWeapon())
m_info.SetWeapon( this );
CBaseEntity *pTarget = NULL; CBaseEntity *pTarget = NULL;
if (m_iMaxEnts > 0) if (m_iMaxEnts > 0)
{ {
@ -309,10 +313,7 @@ void CPointDamageInfo::ApplyDamage( const char *target, inputdata_t &inputdata )
pTarget = gEntList.FindEntityGeneric(pTarget, target, this, inputdata.pActivator, inputdata.pCaller); pTarget = gEntList.FindEntityGeneric(pTarget, target, this, inputdata.pActivator, inputdata.pCaller);
if (pTarget) if (pTarget)
{ {
pTarget->TakeDamage(m_info); HandleDamage( pTarget );
m_OnApplyDamage.FireOutput(pTarget, this);
if (pTarget->m_lifeState == LIFE_DYING)
m_OnApplyDeath.FireOutput(pTarget, this);
} }
} }
} }
@ -321,10 +322,7 @@ void CPointDamageInfo::ApplyDamage( const char *target, inputdata_t &inputdata )
pTarget = gEntList.FindEntityGeneric(NULL, target, this, inputdata.pActivator, inputdata.pCaller); pTarget = gEntList.FindEntityGeneric(NULL, target, this, inputdata.pActivator, inputdata.pCaller);
while (pTarget) while (pTarget)
{ {
pTarget->TakeDamage(m_info); HandleDamage( pTarget );
m_OnApplyDamage.FireOutput(pTarget, this);
if (pTarget->m_lifeState == LIFE_DYING)
m_OnApplyDeath.FireOutput(pTarget, this);
pTarget = gEntList.FindEntityGeneric(pTarget, target, this, inputdata.pActivator, inputdata.pCaller); pTarget = gEntList.FindEntityGeneric(pTarget, target, this, inputdata.pActivator, inputdata.pCaller);
} }
} }

View File

@ -86,7 +86,7 @@ string_t ExtractParentName(string_t parentName)
return parentName; return parentName;
char szToken[256]; char szToken[256];
nexttoken(szToken, STRING(parentName), ','); nexttoken(szToken, STRING(parentName), ',', sizeof(szToken));
return AllocPooledString(szToken); return AllocPooledString(szToken);
} }
@ -208,7 +208,7 @@ void SetupParentsForSpawnList( int nEntities, HierarchicalSpawn_t *pSpawnList )
if ( strchr(STRING(pEntity->m_iParent), ',') ) if ( strchr(STRING(pEntity->m_iParent), ',') )
{ {
char szToken[256]; char szToken[256];
const char *pAttachmentName = nexttoken(szToken, STRING(pEntity->m_iParent), ','); const char *pAttachmentName = nexttoken(szToken, STRING(pEntity->m_iParent), ',', sizeof(szToken));
pEntity->m_iParent = AllocPooledString(szToken); pEntity->m_iParent = AllocPooledString(szToken);
CBaseEntity *pParent = gEntList.FindEntityByName( NULL, pEntity->m_iParent ); CBaseEntity *pParent = gEntList.FindEntityByName( NULL, pEntity->m_iParent );

View File

@ -1148,13 +1148,13 @@ void PhysSolidOverride( solid_t &solid, string_t overrideScript )
// suck out the comma delimited tokens and turn them into quoted key/values // suck out the comma delimited tokens and turn them into quoted key/values
char szToken[256]; char szToken[256];
const char *pStr = nexttoken(szToken, STRING(overrideScript), ','); const char *pStr = nexttoken(szToken, STRING(overrideScript), ',', sizeof(szToken));
while ( szToken[0] != 0 ) while ( szToken[0] != 0 )
{ {
Q_strncat( pTmpString, "\"", sizeof(pTmpString), COPY_ALL_CHARACTERS ); Q_strncat( pTmpString, "\"", sizeof(pTmpString), COPY_ALL_CHARACTERS );
Q_strncat( pTmpString, szToken, sizeof(pTmpString), COPY_ALL_CHARACTERS ); Q_strncat( pTmpString, szToken, sizeof(pTmpString), COPY_ALL_CHARACTERS );
Q_strncat( pTmpString, "\" ", sizeof(pTmpString), COPY_ALL_CHARACTERS ); Q_strncat( pTmpString, "\" ", sizeof(pTmpString), COPY_ALL_CHARACTERS );
pStr = nexttoken(szToken, pStr, ','); pStr = nexttoken(szToken, pStr, ',', sizeof(szToken));
} }
// terminate the script // terminate the script
Q_strncat( pTmpString, "}", sizeof(pTmpString), COPY_ALL_CHARACTERS ); Q_strncat( pTmpString, "}", sizeof(pTmpString), COPY_ALL_CHARACTERS );

View File

@ -751,14 +751,14 @@ void CRagdollProp::InitRagdoll( const Vector &forceVector, int forceBone, const
if ( m_anglesOverrideString != NULL_STRING && Q_strlen(m_anglesOverrideString.ToCStr()) > 0 ) if ( m_anglesOverrideString != NULL_STRING && Q_strlen(m_anglesOverrideString.ToCStr()) > 0 )
{ {
char szToken[2048]; char szToken[2048];
const char *pStr = nexttoken(szToken, STRING(m_anglesOverrideString), ','); const char *pStr = nexttoken(szToken, STRING(m_anglesOverrideString), ',', sizeof(szToken));
// anglesOverride is index,angles,index,angles (e.g. "1, 22.5 123.0 0.0, 2, 0 0 0, 3, 0 0 180.0") // anglesOverride is index,angles,index,angles (e.g. "1, 22.5 123.0 0.0, 2, 0 0 0, 3, 0 0 180.0")
while ( szToken[0] != 0 ) while ( szToken[0] != 0 )
{ {
int objectIndex = atoi(szToken); int objectIndex = atoi(szToken);
// sanity check to make sure this token is an integer // sanity check to make sure this token is an integer
Assert( atof(szToken) == ((float)objectIndex) ); Assert( atof(szToken) == ((float)objectIndex) );
pStr = nexttoken(szToken, pStr, ','); pStr = nexttoken(szToken, pStr, ',', sizeof(szToken));
Assert( szToken[0] ); Assert( szToken[0] );
if ( objectIndex >= m_ragdoll.listCount ) if ( objectIndex >= m_ragdoll.listCount )
{ {
@ -785,7 +785,7 @@ void CRagdollProp::InitRagdoll( const Vector &forceVector, int forceBone, const
MatrixSetColumn( out, 3, pBoneToWorld[boneIndex] ); MatrixSetColumn( out, 3, pBoneToWorld[boneIndex] );
element.pObject->SetPositionMatrix( pBoneToWorld[boneIndex], true ); element.pObject->SetPositionMatrix( pBoneToWorld[boneIndex], true );
} }
pStr = nexttoken(szToken, pStr, ','); pStr = nexttoken(szToken, pStr, ',', sizeof(szToken));
} }
} }

View File

@ -4701,7 +4701,11 @@ void CBaseVPhysicsTrigger::EndTouch( CBaseEntity *pOther )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CBaseVPhysicsTrigger::PassesTriggerFilters( CBaseEntity *pOther ) bool CBaseVPhysicsTrigger::PassesTriggerFilters( CBaseEntity *pOther )
{ {
#ifdef MAPBASE
if ( !pOther->VPhysicsGetObject() )
#else
if ( pOther->GetMoveType() != MOVETYPE_VPHYSICS && !pOther->IsPlayer() ) if ( pOther->GetMoveType() != MOVETYPE_VPHYSICS && !pOther->IsPlayer() )
#endif
return false; return false;
#ifdef MAPBASE #ifdef MAPBASE

View File

@ -2095,11 +2095,14 @@ void UTIL_ValidateSoundName( string_t &name, const char *defaultStr )
// sep - Character to use as separator. UNDONE: allow multiple separator chars // sep - Character to use as separator. UNDONE: allow multiple separator chars
// Output : Returns a pointer to the next token to be parsed. // Output : Returns a pointer to the next token to be parsed.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const char *nexttoken(char *token, const char *str, char sep) const char *nexttoken(char *token, const char *str, char sep, size_t tokenLen)
{ {
if ((str == NULL) || (*str == '\0')) if ((str == NULL) || (*str == '\0'))
{ {
*token = '\0'; if(tokenLen)
{
*token = '\0';
}
return(NULL); return(NULL);
} }
@ -2107,11 +2110,25 @@ const char *nexttoken(char *token, const char *str, char sep)
// Copy everything up to the first separator into the return buffer. // Copy everything up to the first separator into the return buffer.
// Do not include separators in the return buffer. // Do not include separators in the return buffer.
// //
while ((*str != sep) && (*str != '\0') && (tokenLen > 1))
{
*token++ = *str++;
tokenLen--;
}
//
// If token is to big for return buffer, skip rest of token.
//
while ((*str != sep) && (*str != '\0')) while ((*str != sep) && (*str != '\0'))
{ {
*token++ = *str++; str++;
} }
*token = '\0';
if(tokenLen)
{
*token = '\0';
tokenLen--;
}
// //
// Advance the pointer unless we hit the end of the input string. // Advance the pointer unless we hit the end of the input string.

View File

@ -206,7 +206,7 @@ inline bool FStrEq( string_t str1, string_t str2 )
} }
#endif #endif
const char *nexttoken(char *token, const char *str, char sep); const char *nexttoken(char *token, const char *str, char sep, size_t tokenLen);
// Misc. Prototypes // Misc. Prototypes
void UTIL_SetSize (CBaseEntity *pEnt, const Vector &vecMin, const Vector &vecMax); void UTIL_SetSize (CBaseEntity *pEnt, const Vector &vecMin, const Vector &vecMax);

View File

@ -141,15 +141,15 @@ variant_t Variant_Parse(const char *szValue)
// Passes strings to Variant_Parse, uses the other input data for finding procedural entities. // Passes strings to Variant_Parse, uses the other input data for finding procedural entities.
variant_t Variant_ParseInput(inputdata_t inputdata) variant_t Variant_ParseInput(inputdata_t inputdata)
{ {
if (inputdata.value.FieldType() != FIELD_STRING) if (inputdata.value.FieldType() == FIELD_STRING)
return inputdata.value;
if (inputdata.value.String()[0] == '!')
{ {
variant_t var = variant_t(); if (inputdata.value.String()[0] == '!')
var.SetEntity(gEntList.FindEntityProcedural(inputdata.value.String(), inputdata.pCaller, inputdata.pActivator, inputdata.pCaller)); {
if (var.Entity()) variant_t var = variant_t();
return var; var.SetEntity(gEntList.FindEntityProcedural(inputdata.value.String(), inputdata.pCaller, inputdata.pActivator, inputdata.pCaller));
if (var.Entity())
return var;
}
} }
return Variant_Parse(inputdata.value.String()); return Variant_Parse(inputdata.value.String());

View File

@ -19,6 +19,7 @@
#include <time.h> #include <time.h>
#endif #endif
#include "filesystem.h"
#include "c_playerresource.h" #include "c_playerresource.h"
#endif #endif
@ -91,7 +92,9 @@ static EHANDLE g_Metadata[NUM_RPCS];
class CMapbaseMetadata : public CBaseEntity class CMapbaseMetadata : public CBaseEntity
{ {
public: public:
#ifndef CLIENT_DLL
DECLARE_DATADESC(); DECLARE_DATADESC();
#endif
DECLARE_NETWORKCLASS(); DECLARE_NETWORKCLASS();
DECLARE_CLASS( CMapbaseMetadata, CBaseEntity ); DECLARE_CLASS( CMapbaseMetadata, CBaseEntity );
@ -204,6 +207,7 @@ BEGIN_NETWORK_TABLE_NOBASE(CMapbaseMetadata, DT_MapbaseMetadata)
END_NETWORK_TABLE() END_NETWORK_TABLE()
#ifndef CLIENT_DLL
BEGIN_DATADESC( CMapbaseMetadata ) BEGIN_DATADESC( CMapbaseMetadata )
// Inputs // Inputs
@ -211,26 +215,31 @@ BEGIN_DATADESC( CMapbaseMetadata )
DEFINE_INPUT( m_iszRPCDetails, FIELD_STRING, "SetRPCDetails" ), DEFINE_INPUT( m_iszRPCDetails, FIELD_STRING, "SetRPCDetails" ),
END_DATADESC() END_DATADESC()
#endif
#ifdef MAPBASE_RPC #ifdef MAPBASE_RPC
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: Mapbase's special integration with rich presence clients, most notably Discord. // Purpose: Mapbase's special integration with rich presence clients, most notably Discord.
// //
// This only has Discord as of writing, but similar/derived implementaton could expand to // This only has Discord and crude groundwork for Steam as of writing,
// other clients in the future, maybe even Steam.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------- //-----------------------------------------
// !!! FOR MODS !!! // !!! FOR MODS !!!
// //
// Create your own Discord "application" if you want to change what info/images show up, etc. // Create your own Discord "application" if you want to change what info/images show up, etc.
// You can find the convar that controls this in cdll_client_int.cpp. // You can change the app ID in "scripts/mapbase_rpc.txt". It's located in the shared content VPK and the mod templates.
// You could override that file in your mod to change it to your own app ID.
// //
// This code automatically shows the mod's title in the details, but it's easy to change if you want things to be chapter-specific, etc. // This code automatically shows the mod's title in the details, but it's easy to change this code if you want things to be chapter-specific, etc.
// //
//----------------------------------------- //-----------------------------------------
static ConVar cl_discord_appid("cl_discord_appid", "582595088719413250", FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); // Changing the default value of the convars below will not work.
// Use "scripts/mapbase_rpc.txt" instead.
static ConVar cl_discord_appid("cl_discord_appid", "582595088719413250", FCVAR_NONE);
static ConVar cl_discord_largeimage("cl_discord_largeimage", "mb_logo_episodic", FCVAR_NONE);
static ConVar cl_discord_largeimage_text("cl_discord_largeimage_text", "Half-Life 2", FCVAR_NONE);
static int64_t startTimestamp = time(0); static int64_t startTimestamp = time(0);
// //
@ -289,6 +298,22 @@ static void HandleDiscordJoinRequest(const DiscordUser* request)
void MapbaseRPC_Init() void MapbaseRPC_Init()
{ {
// First, load the config
// (we need its values immediately)
KeyValues *pKV = new KeyValues( "MapbaseRPC" );
if (pKV->LoadFromFile( filesystem, "scripts/mapbase_rpc.txt" ))
{
const char *szAppID = pKV->GetString("discord_appid", cl_discord_appid.GetString());
cl_discord_appid.SetValue(szAppID);
const char *szLargeImage = pKV->GetString("discord_largeimage", cl_discord_largeimage.GetString());
cl_discord_largeimage.SetValue(szLargeImage);
const char *szLargeImageText = pKV->GetString("discord_largeimage_text", cl_discord_largeimage_text.GetString());
cl_discord_largeimage_text.SetValue( szLargeImageText );
}
pKV->deleteThis();
// Steam RPC // Steam RPC
if (steamapicontext->SteamFriends()) if (steamapicontext->SteamFriends())
steamapicontext->SteamFriends()->ClearRichPresence(); steamapicontext->SteamFriends()->ClearRichPresence();
@ -423,19 +448,6 @@ void MapbaseRPC_UpdateSteam( int iType, const char *pMapName )
#endif #endif
#ifdef DISCORD_RPC #ifdef DISCORD_RPC
// Game-Specfic Image
// These are specific to the Mapbase Discord application, so you'll want to modify this for your own mod.
#if HL2_EPISODIC
#define DISCORD_GAME_IMAGE "mb_logo_episodic"
#define DISCORD_GAME_IMAGE_TEXT "Half-Life 2 Episodic"
#elif HL2_CLIENT_DLL
#define DISCORD_GAME_IMAGE "mb_logo_hl2"
#define DISCORD_GAME_IMAGE_TEXT "Half-Life 2"
#else
#define DISCORD_GAME_IMAGE "mb_logo_general"
#define DISCORD_GAME_IMAGE_TEXT "Mapbase"
#endif
void MapbaseRPC_GetDiscordParameters( DiscordRichPresence &discordPresence, int iType, const char *pMapName ) void MapbaseRPC_GetDiscordParameters( DiscordRichPresence &discordPresence, int iType, const char *pMapName )
{ {
static char details[128]; static char details[128];
@ -504,10 +516,8 @@ void MapbaseRPC_GetDiscordParameters( DiscordRichPresence &discordPresence, int
discordPresence.smallImageKey = "mb_logo_general"; discordPresence.smallImageKey = "mb_logo_general";
discordPresence.smallImageText = "Mapbase"; discordPresence.smallImageText = "Mapbase";
#ifdef DISCORD_GAME_IMAGE discordPresence.largeImageKey = cl_discord_largeimage.GetString();
discordPresence.largeImageKey = DISCORD_GAME_IMAGE; discordPresence.largeImageText = cl_discord_largeimage_text.GetString();
discordPresence.largeImageText = DISCORD_GAME_IMAGE_TEXT;
#endif
} }
void MapbaseRPC_UpdateDiscord( int iType, const char *pMapName ) void MapbaseRPC_UpdateDiscord( int iType, const char *pMapName )

View File

@ -90,9 +90,9 @@ public:
if ( m_bSelfCollisions ) if ( m_bSelfCollisions )
{ {
char szToken[256]; char szToken[256];
const char *pStr = nexttoken(szToken, pValue, ','); const char *pStr = nexttoken(szToken, pValue, ',', sizeof(szToken));
int index0 = atoi(szToken); int index0 = atoi(szToken);
nexttoken( szToken, pStr, ',' ); nexttoken( szToken, pStr, ',' , sizeof(szToken) );
int index1 = atoi(szToken); int index1 = atoi(szToken);
m_pSet->EnableCollisions( index0, index1 ); m_pSet->EnableCollisions( index0, index1 );

View File

@ -1290,14 +1290,14 @@ void CTeamRoundTimer::InputAddTeamTime( inputdata_t &input )
int nSeconds = 0; int nSeconds = 0;
// get the team // get the team
p = nexttoken( token, p, ' ' ); p = nexttoken( token, p, ' ', sizeof(token) );
if ( token ) if ( token )
{ {
nTeam = Q_atoi( token ); nTeam = Q_atoi( token );
} }
// get the time // get the time
p = nexttoken( token, p, ' ' ); p = nexttoken( token, p, ' ', sizeof(token) );
if ( token ) if ( token )
{ {
nSeconds = Q_atoi( token ); nSeconds = Q_atoi( token );

View File

@ -12,7 +12,7 @@
// STATIC: "BASETEXTURENOENVMAP" "0..1" // STATIC: "BASETEXTURENOENVMAP" "0..1"
// STATIC: "BASETEXTURE2NOENVMAP" "0..1" // STATIC: "BASETEXTURE2NOENVMAP" "0..1"
// STATIC: "WARPLIGHTING" "0..1" // STATIC: "WARPLIGHTING" "0..1"
// STATIC: "FANCY_BLENDING" "0..2" // STATIC: "FANCY_BLENDING" "0..1"
// STATIC: "RELIEF_MAPPING" "0..0" [ps20b] // STATIC: "RELIEF_MAPPING" "0..0" [ps20b]
// STATIC: "SEAMLESS" "0..1" // STATIC: "SEAMLESS" "0..1"
// STATIC: "NORMAL_DECODE_MODE" "0..0" [XBOX] // STATIC: "NORMAL_DECODE_MODE" "0..0" [XBOX]
@ -22,6 +22,8 @@
// STATIC: "DETAIL_BLEND_MODE" "0..11" // STATIC: "DETAIL_BLEND_MODE" "0..11"
// STATIC: "FLASHLIGHT" "0..1" [ps20b] [XBOX] // STATIC: "FLASHLIGHT" "0..1" [ps20b] [XBOX]
// STATIC: "BASETEXTURETRANSFORM2" "0..1" // STATIC: "BASETEXTURETRANSFORM2" "0..1"
// STATIC: "SWAP_VERTEX_BLEND" "0..1"
// STATIC: "PARALLAXCORRECT" "0..1"
// DYNAMIC: "FASTPATHENVMAPCONTRAST" "0..1" // DYNAMIC: "FASTPATHENVMAPCONTRAST" "0..1"
// DYNAMIC: "FASTPATH" "0..1" // DYNAMIC: "FASTPATH" "0..1"
@ -43,5 +45,7 @@
// SKIP ($DETAIL_BLEND_MODE == 10 ) // SKIP ($DETAIL_BLEND_MODE == 10 )
// SKIP ($DETAIL_BLEND_MODE == 11 ) // SKIP ($DETAIL_BLEND_MODE == 11 )
// SKIP: $PARALLAXCORRECT && !$CUBEMAP
#include "lightmappedgeneric_ps2_3_x.h" #include "lightmappedgeneric_ps2_3_x.h"

View File

@ -303,7 +303,7 @@ private:
public: public:
void SetFANCY_BLENDING( int i ) void SetFANCY_BLENDING( int i )
{ {
Assert( i >= 0 && i <= 2 ); Assert( i >= 0 && i <= 1 );
m_nFANCY_BLENDING = i; m_nFANCY_BLENDING = i;
#ifdef _DEBUG #ifdef _DEBUG
m_bFANCY_BLENDING = true; m_bFANCY_BLENDING = true;
@ -442,6 +442,48 @@ public:
m_bBASETEXTURETRANSFORM2 = true; m_bBASETEXTURETRANSFORM2 = true;
#endif #endif
} }
private:
int m_nSWAP_VERTEX_BLEND;
#ifdef _DEBUG
bool m_bSWAP_VERTEX_BLEND;
#endif
public:
void SetSWAP_VERTEX_BLEND( int i )
{
Assert( i >= 0 && i <= 1 );
m_nSWAP_VERTEX_BLEND = i;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
void SetSWAP_VERTEX_BLEND( bool i )
{
m_nSWAP_VERTEX_BLEND = i ? 1 : 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
private:
int m_nPARALLAXCORRECT;
#ifdef _DEBUG
bool m_bPARALLAXCORRECT;
#endif
public:
void SetPARALLAXCORRECT( int i )
{
Assert( i >= 0 && i <= 1 );
m_nPARALLAXCORRECT = i;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
void SetPARALLAXCORRECT( bool i )
{
m_nPARALLAXCORRECT = i ? 1 : 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
public: public:
sdk_lightmappedgeneric_ps20b_Static_Index( ) sdk_lightmappedgeneric_ps20b_Static_Index( )
{ {
@ -529,19 +571,27 @@ public:
m_bBASETEXTURETRANSFORM2 = false; m_bBASETEXTURETRANSFORM2 = false;
#endif // _DEBUG #endif // _DEBUG
m_nBASETEXTURETRANSFORM2 = 0; m_nBASETEXTURETRANSFORM2 = 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = false;
#endif // _DEBUG
m_nSWAP_VERTEX_BLEND = 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = false;
#endif // _DEBUG
m_nPARALLAXCORRECT = 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_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bRELIEF_MAPPING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2; bool bAllStaticVarsDefined = m_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bRELIEF_MAPPING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2 && m_bSWAP_VERTEX_BLEND && m_bPARALLAXCORRECT;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #endif // _DEBUG
return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 7077888 * m_nRELIEF_MAPPING ) + ( 7077888 * m_nSEAMLESS ) + ( 14155776 * m_nNORMAL_DECODE_MODE ) + ( 14155776 * m_nNORMALMASK_DECODE_MODE ) + ( 14155776 * m_nDETAIL_BLEND_MODE ) + ( 169869312 * m_nBASETEXTURETRANSFORM2 ) + 0; return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 4718592 * m_nRELIEF_MAPPING ) + ( 4718592 * m_nSEAMLESS ) + ( 9437184 * m_nNORMAL_DECODE_MODE ) + ( 9437184 * m_nNORMALMASK_DECODE_MODE ) + ( 9437184 * m_nDETAIL_BLEND_MODE ) + ( 113246208 * m_nBASETEXTURETRANSFORM2 ) + ( 226492416 * m_nSWAP_VERTEX_BLEND ) + ( 452984832 * m_nPARALLAXCORRECT ) + 0;
} }
}; };
#define shaderStaticTest_sdk_lightmappedgeneric_ps20b psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_RELIEF_MAPPING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + 0 #define shaderStaticTest_sdk_lightmappedgeneric_ps20b psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_RELIEF_MAPPING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + psh_forgot_to_set_static_SWAP_VERTEX_BLEND + psh_forgot_to_set_static_PARALLAXCORRECT + 0
class sdk_lightmappedgeneric_ps20b_Dynamic_Index class sdk_lightmappedgeneric_ps20b_Dynamic_Index
{ {
private: private:

View File

@ -303,7 +303,7 @@ private:
public: public:
void SetFANCY_BLENDING( int i ) void SetFANCY_BLENDING( int i )
{ {
Assert( i >= 0 && i <= 2 ); Assert( i >= 0 && i <= 1 );
m_nFANCY_BLENDING = i; m_nFANCY_BLENDING = i;
#ifdef _DEBUG #ifdef _DEBUG
m_bFANCY_BLENDING = true; m_bFANCY_BLENDING = true;
@ -421,6 +421,48 @@ public:
m_bBASETEXTURETRANSFORM2 = true; m_bBASETEXTURETRANSFORM2 = true;
#endif #endif
} }
private:
int m_nSWAP_VERTEX_BLEND;
#ifdef _DEBUG
bool m_bSWAP_VERTEX_BLEND;
#endif
public:
void SetSWAP_VERTEX_BLEND( int i )
{
Assert( i >= 0 && i <= 1 );
m_nSWAP_VERTEX_BLEND = i;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
void SetSWAP_VERTEX_BLEND( bool i )
{
m_nSWAP_VERTEX_BLEND = i ? 1 : 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
private:
int m_nPARALLAXCORRECT;
#ifdef _DEBUG
bool m_bPARALLAXCORRECT;
#endif
public:
void SetPARALLAXCORRECT( int i )
{
Assert( i >= 0 && i <= 1 );
m_nPARALLAXCORRECT = i;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
void SetPARALLAXCORRECT( bool i )
{
m_nPARALLAXCORRECT = i ? 1 : 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
public: public:
sdk_lightmappedgeneric_ps30_Static_Index( ) sdk_lightmappedgeneric_ps30_Static_Index( )
{ {
@ -504,19 +546,27 @@ public:
m_bBASETEXTURETRANSFORM2 = false; m_bBASETEXTURETRANSFORM2 = false;
#endif // _DEBUG #endif // _DEBUG
m_nBASETEXTURETRANSFORM2 = 0; m_nBASETEXTURETRANSFORM2 = 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = false;
#endif // _DEBUG
m_nSWAP_VERTEX_BLEND = 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = false;
#endif // _DEBUG
m_nPARALLAXCORRECT = 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_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2; bool bAllStaticVarsDefined = m_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2 && m_bSWAP_VERTEX_BLEND && m_bPARALLAXCORRECT;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #endif // _DEBUG
return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 7077888 * m_nSEAMLESS ) + ( 14155776 * m_nNORMAL_DECODE_MODE ) + ( 14155776 * m_nNORMALMASK_DECODE_MODE ) + ( 14155776 * m_nDETAIL_BLEND_MODE ) + ( 169869312 * m_nBASETEXTURETRANSFORM2 ) + 0; return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 4718592 * m_nSEAMLESS ) + ( 9437184 * m_nNORMAL_DECODE_MODE ) + ( 9437184 * m_nNORMALMASK_DECODE_MODE ) + ( 9437184 * m_nDETAIL_BLEND_MODE ) + ( 113246208 * m_nBASETEXTURETRANSFORM2 ) + ( 226492416 * m_nSWAP_VERTEX_BLEND ) + ( 452984832 * m_nPARALLAXCORRECT ) + 0;
} }
}; };
#define shaderStaticTest_sdk_lightmappedgeneric_ps30 psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + 0 #define shaderStaticTest_sdk_lightmappedgeneric_ps30 psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + psh_forgot_to_set_static_SWAP_VERTEX_BLEND + psh_forgot_to_set_static_PARALLAXCORRECT + 0
class sdk_lightmappedgeneric_ps30_Dynamic_Index class sdk_lightmappedgeneric_ps30_Dynamic_Index
{ {
private: private:

View File

@ -303,7 +303,7 @@ private:
public: public:
void SetFANCY_BLENDING( int i ) void SetFANCY_BLENDING( int i )
{ {
Assert( i >= 0 && i <= 2 ); Assert( i >= 0 && i <= 1 );
m_nFANCY_BLENDING = i; m_nFANCY_BLENDING = i;
#ifdef _DEBUG #ifdef _DEBUG
m_bFANCY_BLENDING = true; m_bFANCY_BLENDING = true;
@ -442,6 +442,48 @@ public:
m_bBASETEXTURETRANSFORM2 = true; m_bBASETEXTURETRANSFORM2 = true;
#endif #endif
} }
private:
int m_nSWAP_VERTEX_BLEND;
#ifdef _DEBUG
bool m_bSWAP_VERTEX_BLEND;
#endif
public:
void SetSWAP_VERTEX_BLEND( int i )
{
Assert( i >= 0 && i <= 1 );
m_nSWAP_VERTEX_BLEND = i;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
void SetSWAP_VERTEX_BLEND( bool i )
{
m_nSWAP_VERTEX_BLEND = i ? 1 : 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
private:
int m_nPARALLAXCORRECT;
#ifdef _DEBUG
bool m_bPARALLAXCORRECT;
#endif
public:
void SetPARALLAXCORRECT( int i )
{
Assert( i >= 0 && i <= 1 );
m_nPARALLAXCORRECT = i;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
void SetPARALLAXCORRECT( bool i )
{
m_nPARALLAXCORRECT = i ? 1 : 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
public: public:
sdk_lightmappedgeneric_ps20b_Static_Index( ) sdk_lightmappedgeneric_ps20b_Static_Index( )
{ {
@ -529,19 +571,27 @@ public:
m_bBASETEXTURETRANSFORM2 = false; m_bBASETEXTURETRANSFORM2 = false;
#endif // _DEBUG #endif // _DEBUG
m_nBASETEXTURETRANSFORM2 = 0; m_nBASETEXTURETRANSFORM2 = 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = false;
#endif // _DEBUG
m_nSWAP_VERTEX_BLEND = 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = false;
#endif // _DEBUG
m_nPARALLAXCORRECT = 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_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bRELIEF_MAPPING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2; bool bAllStaticVarsDefined = m_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bRELIEF_MAPPING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2 && m_bSWAP_VERTEX_BLEND && m_bPARALLAXCORRECT;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #endif // _DEBUG
return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 7077888 * m_nRELIEF_MAPPING ) + ( 7077888 * m_nSEAMLESS ) + ( 14155776 * m_nNORMAL_DECODE_MODE ) + ( 14155776 * m_nNORMALMASK_DECODE_MODE ) + ( 14155776 * m_nDETAIL_BLEND_MODE ) + ( 169869312 * m_nBASETEXTURETRANSFORM2 ) + 0; return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 4718592 * m_nRELIEF_MAPPING ) + ( 4718592 * m_nSEAMLESS ) + ( 9437184 * m_nNORMAL_DECODE_MODE ) + ( 9437184 * m_nNORMALMASK_DECODE_MODE ) + ( 9437184 * m_nDETAIL_BLEND_MODE ) + ( 113246208 * m_nBASETEXTURETRANSFORM2 ) + ( 226492416 * m_nSWAP_VERTEX_BLEND ) + ( 452984832 * m_nPARALLAXCORRECT ) + 0;
} }
}; };
#define shaderStaticTest_sdk_lightmappedgeneric_ps20b psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_RELIEF_MAPPING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + 0 #define shaderStaticTest_sdk_lightmappedgeneric_ps20b psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_RELIEF_MAPPING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + psh_forgot_to_set_static_SWAP_VERTEX_BLEND + psh_forgot_to_set_static_PARALLAXCORRECT + 0
class sdk_lightmappedgeneric_ps20b_Dynamic_Index class sdk_lightmappedgeneric_ps20b_Dynamic_Index
{ {
private: private:

View File

@ -303,7 +303,7 @@ private:
public: public:
void SetFANCY_BLENDING( int i ) void SetFANCY_BLENDING( int i )
{ {
Assert( i >= 0 && i <= 2 ); Assert( i >= 0 && i <= 1 );
m_nFANCY_BLENDING = i; m_nFANCY_BLENDING = i;
#ifdef _DEBUG #ifdef _DEBUG
m_bFANCY_BLENDING = true; m_bFANCY_BLENDING = true;
@ -421,6 +421,48 @@ public:
m_bBASETEXTURETRANSFORM2 = true; m_bBASETEXTURETRANSFORM2 = true;
#endif #endif
} }
private:
int m_nSWAP_VERTEX_BLEND;
#ifdef _DEBUG
bool m_bSWAP_VERTEX_BLEND;
#endif
public:
void SetSWAP_VERTEX_BLEND( int i )
{
Assert( i >= 0 && i <= 1 );
m_nSWAP_VERTEX_BLEND = i;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
void SetSWAP_VERTEX_BLEND( bool i )
{
m_nSWAP_VERTEX_BLEND = i ? 1 : 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = true;
#endif
}
private:
int m_nPARALLAXCORRECT;
#ifdef _DEBUG
bool m_bPARALLAXCORRECT;
#endif
public:
void SetPARALLAXCORRECT( int i )
{
Assert( i >= 0 && i <= 1 );
m_nPARALLAXCORRECT = i;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
void SetPARALLAXCORRECT( bool i )
{
m_nPARALLAXCORRECT = i ? 1 : 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = true;
#endif
}
public: public:
sdk_lightmappedgeneric_ps30_Static_Index( ) sdk_lightmappedgeneric_ps30_Static_Index( )
{ {
@ -504,19 +546,27 @@ public:
m_bBASETEXTURETRANSFORM2 = false; m_bBASETEXTURETRANSFORM2 = false;
#endif // _DEBUG #endif // _DEBUG
m_nBASETEXTURETRANSFORM2 = 0; m_nBASETEXTURETRANSFORM2 = 0;
#ifdef _DEBUG
m_bSWAP_VERTEX_BLEND = false;
#endif // _DEBUG
m_nSWAP_VERTEX_BLEND = 0;
#ifdef _DEBUG
m_bPARALLAXCORRECT = false;
#endif // _DEBUG
m_nPARALLAXCORRECT = 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_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2; bool bAllStaticVarsDefined = m_bMASKEDBLENDING && m_bBASETEXTURE2 && m_bDETAILTEXTURE && m_bBUMPMAP && m_bBUMPMAP2 && m_bCUBEMAP && m_bENVMAPMASK && m_bBASEALPHAENVMAPMASK && m_bSELFILLUM && m_bNORMALMAPALPHAENVMAPMASK && m_bDIFFUSEBUMPMAP && m_bBASETEXTURENOENVMAP && m_bBASETEXTURE2NOENVMAP && m_bWARPLIGHTING && m_bFANCY_BLENDING && m_bSEAMLESS && m_bNORMAL_DECODE_MODE && m_bNORMALMASK_DECODE_MODE && m_bDETAIL_BLEND_MODE && m_bBASETEXTURETRANSFORM2 && m_bSWAP_VERTEX_BLEND && m_bPARALLAXCORRECT;
Assert( bAllStaticVarsDefined ); Assert( bAllStaticVarsDefined );
#endif // _DEBUG #endif // _DEBUG
return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 7077888 * m_nSEAMLESS ) + ( 14155776 * m_nNORMAL_DECODE_MODE ) + ( 14155776 * m_nNORMALMASK_DECODE_MODE ) + ( 14155776 * m_nDETAIL_BLEND_MODE ) + ( 169869312 * m_nBASETEXTURETRANSFORM2 ) + 0; return ( 96 * m_nMASKEDBLENDING ) + ( 192 * m_nBASETEXTURE2 ) + ( 384 * m_nDETAILTEXTURE ) + ( 768 * m_nBUMPMAP ) + ( 2304 * m_nBUMPMAP2 ) + ( 4608 * m_nCUBEMAP ) + ( 9216 * m_nENVMAPMASK ) + ( 18432 * m_nBASEALPHAENVMAPMASK ) + ( 36864 * m_nSELFILLUM ) + ( 73728 * m_nNORMALMAPALPHAENVMAPMASK ) + ( 147456 * m_nDIFFUSEBUMPMAP ) + ( 294912 * m_nBASETEXTURENOENVMAP ) + ( 589824 * m_nBASETEXTURE2NOENVMAP ) + ( 1179648 * m_nWARPLIGHTING ) + ( 2359296 * m_nFANCY_BLENDING ) + ( 4718592 * m_nSEAMLESS ) + ( 9437184 * m_nNORMAL_DECODE_MODE ) + ( 9437184 * m_nNORMALMASK_DECODE_MODE ) + ( 9437184 * m_nDETAIL_BLEND_MODE ) + ( 113246208 * m_nBASETEXTURETRANSFORM2 ) + ( 226492416 * m_nSWAP_VERTEX_BLEND ) + ( 452984832 * m_nPARALLAXCORRECT ) + 0;
} }
}; };
#define shaderStaticTest_sdk_lightmappedgeneric_ps30 psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + 0 #define shaderStaticTest_sdk_lightmappedgeneric_ps30 psh_forgot_to_set_static_MASKEDBLENDING + psh_forgot_to_set_static_BASETEXTURE2 + psh_forgot_to_set_static_DETAILTEXTURE + psh_forgot_to_set_static_BUMPMAP + psh_forgot_to_set_static_BUMPMAP2 + psh_forgot_to_set_static_CUBEMAP + psh_forgot_to_set_static_ENVMAPMASK + psh_forgot_to_set_static_BASEALPHAENVMAPMASK + psh_forgot_to_set_static_SELFILLUM + psh_forgot_to_set_static_NORMALMAPALPHAENVMAPMASK + psh_forgot_to_set_static_DIFFUSEBUMPMAP + psh_forgot_to_set_static_BASETEXTURENOENVMAP + psh_forgot_to_set_static_BASETEXTURE2NOENVMAP + psh_forgot_to_set_static_WARPLIGHTING + psh_forgot_to_set_static_FANCY_BLENDING + psh_forgot_to_set_static_SEAMLESS + psh_forgot_to_set_static_NORMAL_DECODE_MODE + psh_forgot_to_set_static_NORMALMASK_DECODE_MODE + psh_forgot_to_set_static_DETAIL_BLEND_MODE + psh_forgot_to_set_static_BASETEXTURETRANSFORM2 + psh_forgot_to_set_static_SWAP_VERTEX_BLEND + psh_forgot_to_set_static_PARALLAXCORRECT + 0
class sdk_lightmappedgeneric_ps30_Dynamic_Index class sdk_lightmappedgeneric_ps30_Dynamic_Index
{ {
private: private:

View File

@ -16,7 +16,7 @@ fxctmp9_tmp\SDK_lightmappedgeneric_vs30.inc
fxctmp9_tmp\SDK_depthwrite_ps30.inc fxctmp9_tmp\SDK_depthwrite_ps30.inc
fxctmp9_tmp\SDK_depthwrite_vs30.inc fxctmp9_tmp\SDK_depthwrite_vs30.inc
fxctmp9_tmp\SDK_eyes_ps30.inc fxctmp9_tmp\SDK_eyes_ps30.inc
fxctmp9_tmp\SDK_eyes_vs30.inc fxctmp9_tmp\SDK_Eyes_vs30.inc
fxctmp9_tmp\SDK_eye_refract_ps30.inc fxctmp9_tmp\SDK_eye_refract_ps30.inc
fxctmp9_tmp\SDK_eye_refract_vs30.inc fxctmp9_tmp\SDK_eye_refract_vs30.inc
fxctmp9_tmp\SDK_eyes_flashlight_ps30.inc fxctmp9_tmp\SDK_eyes_flashlight_ps30.inc

View File

@ -81,6 +81,15 @@ BEGIN_VS_SHADER( SDK_LightmappedGeneric,
SHADER_PARAM( PHONGBOOST, SHADER_PARAM_TYPE_FLOAT, "1.0", "Phong overbrightening factor (specular mask channel should be authored to account for this)" ) SHADER_PARAM( PHONGBOOST, SHADER_PARAM_TYPE_FLOAT, "1.0", "Phong overbrightening factor (specular mask channel should be authored to account for this)" )
SHADER_PARAM( PHONGFRESNELRANGES, SHADER_PARAM_TYPE_VEC3, "[0 0.5 1]", "Parameters for remapping fresnel output" ) SHADER_PARAM( PHONGFRESNELRANGES, SHADER_PARAM_TYPE_VEC3, "[0 0.5 1]", "Parameters for remapping fresnel output" )
SHADER_PARAM( PHONGEXPONENT, SHADER_PARAM_TYPE_FLOAT, "5.0", "Phong exponent for local specular lights" ) SHADER_PARAM( PHONGEXPONENT, SHADER_PARAM_TYPE_FLOAT, "5.0", "Phong exponent for local specular lights" )
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
SHADER_PARAM( ENVMAPPARALLAX, SHADER_PARAM_TYPE_BOOL, "0", "Enables parallax correction code for env_cubemaps" )
SHADER_PARAM( ENVMAPPARALLAXOBB1, SHADER_PARAM_TYPE_VEC4, "[1 0 0 0]", "The first line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPPARALLAXOBB2, SHADER_PARAM_TYPE_VEC4, "[0 1 0 0]", "The second line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPPARALLAXOBB3, SHADER_PARAM_TYPE_VEC4, "[0 0 1 0]", "The third line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPORIGIN, SHADER_PARAM_TYPE_VEC3, "[0 0 0]", "The world space position of the env_cubemap being corrected" )
#endif
END_SHADER_PARAMS END_SHADER_PARAMS
void SetupVars( LightmappedGeneric_DX9_Vars_t& info ) void SetupVars( LightmappedGeneric_DX9_Vars_t& info )
@ -148,6 +157,15 @@ END_SHADER_PARAMS
info.m_nPhongBoost = PHONGBOOST; info.m_nPhongBoost = PHONGBOOST;
info.m_nPhongFresnelRanges = PHONGFRESNELRANGES; info.m_nPhongFresnelRanges = PHONGFRESNELRANGES;
info.m_nPhongExponent = PHONGEXPONENT; info.m_nPhongExponent = PHONGEXPONENT;
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
info.m_nEnvmapParallax = ENVMAPPARALLAX;
info.m_nEnvmapParallaxObb1 = ENVMAPPARALLAXOBB1;
info.m_nEnvmapParallaxObb2 = ENVMAPPARALLAXOBB2;
info.m_nEnvmapParallaxObb3 = ENVMAPPARALLAXOBB3;
info.m_nEnvmapOrigin = ENVMAPORIGIN;
#endif
} }
SHADER_FALLBACK SHADER_FALLBACK

View File

@ -771,6 +771,10 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
(info.m_nBlendModulateTexture != -1) && (info.m_nBlendModulateTexture != -1) &&
(params[info.m_nBlendModulateTexture]->IsTexture() ); (params[info.m_nBlendModulateTexture]->IsTexture() );
bool hasNormalMapAlphaEnvmapMask = IS_FLAG_SET( MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK ); bool hasNormalMapAlphaEnvmapMask = IS_FLAG_SET( MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK );
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
bool hasParallaxCorrection = params[info.m_nEnvmapParallax]->GetIntValue() > 0;
#endif
if ( hasFlashlight && !IsX360() ) if ( hasFlashlight && !IsX360() )
{ {
@ -1114,17 +1118,7 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURENOENVMAP, params[info.m_nBaseTextureNoEnvmap]->GetIntValue() ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURENOENVMAP, params[info.m_nBaseTextureNoEnvmap]->GetIntValue() );
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURE2NOENVMAP, params[info.m_nBaseTexture2NoEnvmap]->GetIntValue() ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURE2NOENVMAP, params[info.m_nBaseTexture2NoEnvmap]->GetIntValue() );
SET_STATIC_PIXEL_SHADER_COMBO( WARPLIGHTING, hasLightWarpTexture ); SET_STATIC_PIXEL_SHADER_COMBO( WARPLIGHTING, hasLightWarpTexture );
#ifdef MAPBASE
// There's a bug in Hammer that causes $basetexture and $basetexture2 to be swapped.
// Downfall had a hack to swap them back in the editor, but I noticed $blendmodulatetexture showed up in the editor with the new shader.
// Unfortunately, it became inverted in the editor, so I had to clear $blendmodulatetexture in the editor too, but
// I became interested in the idea of seeing it there, as it would greatly assist with editing those kinds of textures.
// So interested, in fact, that I added a setting to FANCY_BLENDING that swaps $blendmodulatetexture, intended to be used with the Downfall hack.
// It only tests whether it's in the editor right now, but you could turn it into an actual shader parameter if you want.
SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture ? (pShader->UsingEditor( params ) ? 2 : 1) : 0 );
#else
SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture ); SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture );
#endif
SET_STATIC_PIXEL_SHADER_COMBO( MASKEDBLENDING, bMaskedBlending); SET_STATIC_PIXEL_SHADER_COMBO( MASKEDBLENDING, bMaskedBlending);
//SET_STATIC_PIXEL_SHADER_COMBO( RELIEF_MAPPING, bReliefMapping ); //SET_STATIC_PIXEL_SHADER_COMBO( RELIEF_MAPPING, bReliefMapping );
SET_STATIC_PIXEL_SHADER_COMBO( SEAMLESS, bSeamlessMapping ); SET_STATIC_PIXEL_SHADER_COMBO( SEAMLESS, bSeamlessMapping );
@ -1138,6 +1132,18 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
#endif #endif
#ifdef MAPBASE #ifdef MAPBASE
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURETRANSFORM2, hasBaseTextureTransform2 ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURETRANSFORM2, hasBaseTextureTransform2 );
// Hammer apparently has a bug that causes the vertex blend to get swapped.
// Hammer uses a special internal shader to nullify this, but it doesn't work with custom shaders.
// Downfall got around this by swapping around the base textures in the DLL code when drawn by the editor.
// Doing it here in the shader itself allows us to retain other properties, like FANCY_BLENDING.
// TODO: Could we do this here in the DLL and swap the alpha before it's passed to the shader?
SET_STATIC_PIXEL_SHADER_COMBO( SWAP_VERTEX_BLEND, hasBaseTexture2 && pShader->UsingEditor(params) );
#endif
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps enabled for 2_0b and onwards
SET_STATIC_PIXEL_SHADER_COMBO( PARALLAXCORRECT, hasParallaxCorrection );
#else
SET_STATIC_PIXEL_SHADER_COMBO( PARALLAXCORRECT, false );
#endif #endif
SET_STATIC_PIXEL_SHADER( sdk_lightmappedgeneric_ps30 ); SET_STATIC_PIXEL_SHADER( sdk_lightmappedgeneric_ps30 );
} }
@ -1158,12 +1164,7 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURENOENVMAP, params[info.m_nBaseTextureNoEnvmap]->GetIntValue() ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURENOENVMAP, params[info.m_nBaseTextureNoEnvmap]->GetIntValue() );
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURE2NOENVMAP, params[info.m_nBaseTexture2NoEnvmap]->GetIntValue() ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURE2NOENVMAP, params[info.m_nBaseTexture2NoEnvmap]->GetIntValue() );
SET_STATIC_PIXEL_SHADER_COMBO( WARPLIGHTING, hasLightWarpTexture ); SET_STATIC_PIXEL_SHADER_COMBO( WARPLIGHTING, hasLightWarpTexture );
#ifdef MAPBASE
// See the comment in the 3.0 shader block for more info on this.
SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture ? (pShader->UsingEditor( params ) ? 2 : 1) : 0 );
#else
SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture ); SET_STATIC_PIXEL_SHADER_COMBO( FANCY_BLENDING, bHasBlendModulateTexture );
#endif
SET_STATIC_PIXEL_SHADER_COMBO( MASKEDBLENDING, bMaskedBlending); SET_STATIC_PIXEL_SHADER_COMBO( MASKEDBLENDING, bMaskedBlending);
SET_STATIC_PIXEL_SHADER_COMBO( RELIEF_MAPPING, bReliefMapping ); SET_STATIC_PIXEL_SHADER_COMBO( RELIEF_MAPPING, bReliefMapping );
SET_STATIC_PIXEL_SHADER_COMBO( SEAMLESS, bSeamlessMapping ); SET_STATIC_PIXEL_SHADER_COMBO( SEAMLESS, bSeamlessMapping );
@ -1177,6 +1178,14 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
#endif #endif
#ifdef MAPBASE #ifdef MAPBASE
SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURETRANSFORM2, hasBaseTextureTransform2 ); SET_STATIC_PIXEL_SHADER_COMBO( BASETEXTURETRANSFORM2, hasBaseTextureTransform2 );
// See the comment in the 3.0 shader block for more info on this.
SET_STATIC_PIXEL_SHADER_COMBO( SWAP_VERTEX_BLEND, hasBaseTexture2 && pShader->UsingEditor(params) );
#endif
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps enabled for 2_0b and onwards
SET_STATIC_PIXEL_SHADER_COMBO( PARALLAXCORRECT, hasParallaxCorrection );
#else
SET_STATIC_PIXEL_SHADER_COMBO( PARALLAXCORRECT, false );
#endif #endif
SET_STATIC_PIXEL_SHADER( sdk_lightmappedgeneric_ps20b ); SET_STATIC_PIXEL_SHADER( sdk_lightmappedgeneric_ps20b );
} }
@ -1492,6 +1501,30 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
pContextData->m_SemiStaticCmdsOut.BindTexture( pShader, SHADER_SAMPLER3, info.m_nBlendModulateTexture, -1 ); pContextData->m_SemiStaticCmdsOut.BindTexture( pShader, SHADER_SAMPLER3, info.m_nBlendModulateTexture, -1 );
} }
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
if (hasParallaxCorrection)
{
pContextData->m_SemiStaticCmdsOut.SetPixelShaderConstant( 21, params[info.m_nEnvmapOrigin]->GetVecValue() );
float* vecs[3];
vecs[0] = const_cast<float*>(params[info.m_nEnvmapParallaxObb1]->GetVecValue());
vecs[1] = const_cast<float*>(params[info.m_nEnvmapParallaxObb2]->GetVecValue());
vecs[2] = const_cast<float*>(params[info.m_nEnvmapParallaxObb3]->GetVecValue());
float matrix[4][4];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
matrix[i][j] = vecs[i][j];
}
}
matrix[3][0] = matrix[3][1] = matrix[3][2] = 0;
matrix[3][3] = 1;
pContextData->m_SemiStaticCmdsOut.SetPixelShaderConstant( 22, &matrix[0][0], 4 );
}
#endif
pContextData->m_SemiStaticCmdsOut.End(); pContextData->m_SemiStaticCmdsOut.End();
} }
} }

View File

@ -11,6 +11,10 @@
#include <string.h> #include <string.h>
#include "BaseVSShader.h" #include "BaseVSShader.h"
#ifdef MAPBASE
// This requires custom compilers, but anyone ahead of us on that should be able to use this anyway
#define PARALLAX_CORRECTED_CUBEMAPS 1
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Forward declarations // Forward declarations
@ -94,6 +98,15 @@ struct LightmappedGeneric_DX9_Vars_t
int m_nPhongBoost; int m_nPhongBoost;
int m_nPhongFresnelRanges; int m_nPhongFresnelRanges;
int m_nPhongExponent; int m_nPhongExponent;
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
int m_nEnvmapParallax;
int m_nEnvmapParallaxObb1;
int m_nEnvmapParallaxObb2;
int m_nEnvmapParallaxObb3;
int m_nEnvmapOrigin;
#endif
}; };

View File

@ -33,6 +33,8 @@
// SKIP: $BASETEXTURETRANSFORM2 && !$BASETEXTURE2 // SKIP: $BASETEXTURETRANSFORM2 && !$BASETEXTURE2
// SKIP: $BASETEXTURETRANSFORM2 && $SEAMLESS // SKIP: $BASETEXTURETRANSFORM2 && $SEAMLESS
// SKIP: $SWAP_VERTEX_BLEND && !$BASETEXTURE2
// debug crap: // debug crap:
// NOSKIP: $DETAILTEXTURE // NOSKIP: $DETAILTEXTURE
// NOSKIP: $CUBEMAP // NOSKIP: $CUBEMAP
@ -110,6 +112,12 @@ const float3 g_FlashlightPos : register( c14 );
const float4x4 g_FlashlightWorldToTexture : register( c15 ); // through c18 const float4x4 g_FlashlightWorldToTexture : register( c15 ); // through c18
const float4 g_ShadowTweaks : register( c19 ); const float4 g_ShadowTweaks : register( c19 );
#if PARALLAXCORRECT
// Parallax cubemaps
const float3 cubemapPos : register(c21);
const float4x4 obbMatrix : register(c22); //through c25
#endif
sampler BaseTextureSampler : register( s0 ); sampler BaseTextureSampler : register( s0 );
sampler LightmapSampler : register( s1 ); sampler LightmapSampler : register( s1 );
@ -340,7 +348,17 @@ HALF4 main( PS_INPUT i ) : COLOR
#if MASKEDBLENDING #if MASKEDBLENDING
float blendfactor=0.5; float blendfactor=0.5;
#else #else
#if SWAP_VERTEX_BLEND
// Blixibon - Hammer apparently has a bug that causes the vertex blend to get swapped.
// Hammer uses a special internal shader to nullify this, but it doesn't work with custom shaders.
// Downfall got around this by swapping around the base textures in the DLL code when drawn by the editor.
// Doing it here in the shader itself allows us to retain other properties, like FANCY_BLENDING.
float blendfactor=1.0f-i.vertexBlendX_fogFactorW.r;
#else
float blendfactor=i.vertexBlendX_fogFactorW.r; float blendfactor=i.vertexBlendX_fogFactorW.r;
#endif
#endif #endif
if( bBaseTexture2 ) if( bBaseTexture2 )
@ -351,18 +369,8 @@ HALF4 main( PS_INPUT i ) : COLOR
float minb=modt.g-modt.r; float minb=modt.g-modt.r;
float maxb=modt.g+modt.r; float maxb=modt.g+modt.r;
#else #else
# if FANCY_BLENDING == 2
// Blixibon - Accompanies the Downfall hack that swaps textures in the editor,
// allows $blendmodulatetexture to be seen in Hammer
float modtg = 1.0f-modt.g;
float minb=max(0,modtg-modt.r);
float maxb=min(1,modtg+modt.r);
# else
float minb=max(0,modt.g-modt.r); float minb=max(0,modt.g-modt.r);
float maxb=min(1,modt.g+modt.r); float maxb=min(1,modt.g+modt.r);
# endif
#endif #endif
blendfactor=smoothstep(minb,maxb,blendfactor); blendfactor=smoothstep(minb,maxb,blendfactor);
#endif #endif
@ -450,7 +458,7 @@ HALF4 main( PS_INPUT i ) : COLOR
albedo *= baseColor; albedo *= baseColor;
if( !bBaseAlphaEnvmapMask && !bSelfIllum ) if( !bBaseAlphaEnvmapMask && !bSelfIllum )
{ {
alpha *= baseColor.a; alpha *= blendedAlpha; // Blixibon - Replaced baseColor.a with blendedAlpha
} }
if( bDetailTexture ) if( bDetailTexture )
@ -563,7 +571,7 @@ HALF4 main( PS_INPUT i ) : COLOR
if( bSelfIllum ) if( bSelfIllum )
{ {
float3 selfIllumComponent = g_SelfIllumTint.xyz * albedo.xyz; float3 selfIllumComponent = g_SelfIllumTint.xyz * albedo.xyz;
diffuseComponent = lerp( diffuseComponent, selfIllumComponent, baseColor.a ); diffuseComponent = lerp( diffuseComponent, selfIllumComponent, blendedAlpha ); // Blixibon - Replaced baseColor.a with blendedAlpha
} }
HALF3 specularLighting = HALF3( 0.0f, 0.0f, 0.0f ); HALF3 specularLighting = HALF3( 0.0f, 0.0f, 0.0f );
@ -579,6 +587,23 @@ HALF4 main( PS_INPUT i ) : COLOR
fresnel = pow( fresnel, 5.0 ); fresnel = pow( fresnel, 5.0 );
fresnel = fresnel * g_OneMinusFresnelReflection + g_FresnelReflection; fresnel = fresnel * g_OneMinusFresnelReflection + g_FresnelReflection;
#if PARALLAXCORRECT
//Parallax correction (2_0b and beyond)
//Adapted from http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
float3 worldPos = i.worldPos_projPosZ.xyz;
float3 positionLS = mul(float4(worldPos, 1), obbMatrix);
float3 rayLS = mul(reflectVect, (float3x3) obbMatrix);
float3 firstPlaneIntersect = (float3(1.0f, 1.0f, 1.0f) - positionLS) / rayLS;
float3 secondPlaneIntersect = (-positionLS) / rayLS;
float3 furthestPlane = max(firstPlaneIntersect, secondPlaneIntersect);
float distance = min(furthestPlane.x, min(furthestPlane.y, furthestPlane.z));
// Use distance in WS directly to recover intersection
float3 intersectPositionWS = worldPos + reflectVect * distance;
reflectVect = intersectPositionWS - cubemapPos;
#endif
specularLighting = ENV_MAP_SCALE * texCUBE( EnvmapSampler, reflectVect ); specularLighting = ENV_MAP_SCALE * texCUBE( EnvmapSampler, reflectVect );
specularLighting *= specularFactor; specularLighting *= specularFactor;

View File

@ -56,7 +56,7 @@ SDK_WorldVertexTransition_ps2x.fxc
SDK_WorldVertexTransition_vs20.fxc SDK_WorldVertexTransition_vs20.fxc
SDK_refract_ps2x.fxc SDK_refract_ps2x.fxc
SDK_Refract_vs20.fxc SDK_Refract_vs20.fxc
SDK_Water_ps2x.fxc SDK_water_ps2x.fxc
SDK_Water_vs20.fxc SDK_Water_vs20.fxc
SDK_WaterCheap_ps2x.fxc SDK_WaterCheap_ps2x.fxc
SDK_WaterCheap_vs20.fxc SDK_WaterCheap_vs20.fxc

View File

@ -29,7 +29,7 @@ SDK_depthwrite_ps2x.fxc
SDK_depthwrite_vs20.fxc SDK_depthwrite_vs20.fxc
SDK_eyes_ps2x.fxc SDK_eyes_ps2x.fxc
SDK_eyes_vs20.fxc SDK_Eyes_vs20.fxc
SDK_eye_refract_ps2x.fxc SDK_eye_refract_ps2x.fxc
SDK_eye_refract_vs20.fxc SDK_eye_refract_vs20.fxc
SDK_eyes_flashlight_ps2x.fxc SDK_eyes_flashlight_ps2x.fxc

View File

@ -14,7 +14,7 @@
static LightmappedGeneric_DX9_Vars_t s_info; static LightmappedGeneric_DX9_Vars_t s_info;
static LightmappedGeneric_DX9_Vars_t s_info_editor; //static LightmappedGeneric_DX9_Vars_t s_info_editor;
DEFINE_FALLBACK_SHADER( SDK_WorldVertexTransition, SDK_WorldVertexTransition_DX9 ) DEFINE_FALLBACK_SHADER( SDK_WorldVertexTransition, SDK_WorldVertexTransition_DX9 )
@ -72,6 +72,15 @@ BEGIN_VS_SHADER( SDK_WorldVertexTransition_DX9, "Help for SDK_WorldVertexTransit
SHADER_PARAM( PHONGBOOST, SHADER_PARAM_TYPE_FLOAT, "1.0", "Phong overbrightening factor (specular mask channel should be authored to account for this)" ) SHADER_PARAM( PHONGBOOST, SHADER_PARAM_TYPE_FLOAT, "1.0", "Phong overbrightening factor (specular mask channel should be authored to account for this)" )
SHADER_PARAM( PHONGFRESNELRANGES, SHADER_PARAM_TYPE_VEC3, "[0 0.5 1]", "Parameters for remapping fresnel output" ) SHADER_PARAM( PHONGFRESNELRANGES, SHADER_PARAM_TYPE_VEC3, "[0 0.5 1]", "Parameters for remapping fresnel output" )
SHADER_PARAM( PHONGEXPONENT, SHADER_PARAM_TYPE_FLOAT, "5.0", "Phong exponent for local specular lights" ) SHADER_PARAM( PHONGEXPONENT, SHADER_PARAM_TYPE_FLOAT, "5.0", "Phong exponent for local specular lights" )
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
SHADER_PARAM( ENVMAPPARALLAX, SHADER_PARAM_TYPE_BOOL, "0", "Enables parallax correction code for env_cubemaps" )
SHADER_PARAM( ENVMAPPARALLAXOBB1, SHADER_PARAM_TYPE_VEC4, "[1 0 0 0]", "The first line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPPARALLAXOBB2, SHADER_PARAM_TYPE_VEC4, "[0 1 0 0]", "The second line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPPARALLAXOBB3, SHADER_PARAM_TYPE_VEC4, "[0 0 1 0]", "The third line of the parallax correction OBB matrix" )
SHADER_PARAM( ENVMAPORIGIN, SHADER_PARAM_TYPE_VEC3, "[0 0 0]", "The world space position of the env_cubemap being corrected" )
#endif
END_SHADER_PARAMS END_SHADER_PARAMS
void SetupVars( LightmappedGeneric_DX9_Vars_t& info ) void SetupVars( LightmappedGeneric_DX9_Vars_t& info )
@ -128,6 +137,15 @@ BEGIN_VS_SHADER( SDK_WorldVertexTransition_DX9, "Help for SDK_WorldVertexTransit
info.m_nPhongBoost = PHONGBOOST; info.m_nPhongBoost = PHONGBOOST;
info.m_nPhongFresnelRanges = PHONGFRESNELRANGES; info.m_nPhongFresnelRanges = PHONGFRESNELRANGES;
info.m_nPhongExponent = PHONGEXPONENT; info.m_nPhongExponent = PHONGEXPONENT;
#ifdef PARALLAX_CORRECTED_CUBEMAPS
// Parallax cubemaps
info.m_nEnvmapParallax = ENVMAPPARALLAX;
info.m_nEnvmapParallaxObb1 = ENVMAPPARALLAXOBB1;
info.m_nEnvmapParallaxObb2 = ENVMAPPARALLAXOBB2;
info.m_nEnvmapParallaxObb3 = ENVMAPPARALLAXOBB3;
info.m_nEnvmapOrigin = ENVMAPORIGIN;
#endif
} }
SHADER_FALLBACK SHADER_FALLBACK
@ -142,8 +160,8 @@ BEGIN_VS_SHADER( SDK_WorldVertexTransition_DX9, "Help for SDK_WorldVertexTransit
{ {
SetupVars( s_info ); SetupVars( s_info );
InitParamsLightmappedGeneric_DX9( this, params, pMaterialName, s_info ); InitParamsLightmappedGeneric_DX9( this, params, pMaterialName, s_info );
SetupVars( s_info_editor ); //SetupVars( s_info_editor );
SwapLayers( s_info_editor ); //SwapLayers( s_info_editor );
} }
SHADER_INIT SHADER_INIT
@ -154,30 +172,27 @@ BEGIN_VS_SHADER( SDK_WorldVertexTransition_DX9, "Help for SDK_WorldVertexTransit
SHADER_DRAW SHADER_DRAW
{ {
if ( UsingEditor( params ) ) //if ( UsingEditor( params ) )
DrawLightmappedGeneric_DX9( this, params, pShaderAPI, pShaderShadow, s_info_editor, pContextDataPtr ); // DrawLightmappedGeneric_DX9( this, params, pShaderAPI, pShaderShadow, s_info_editor, pContextDataPtr );
else //else
DrawLightmappedGeneric_DX9( this, params, pShaderAPI, pShaderShadow, s_info, pContextDataPtr ); DrawLightmappedGeneric_DX9( this, params, pShaderAPI, pShaderShadow, s_info, pContextDataPtr );
} }
private: private:
// This hack is from Half-Life 2: Downfall in order to support WorldVertexTransition in Hammer. // This hack is from Half-Life 2: Downfall in order to support WorldVertexTransition in Hammer.
// We get around this through a different hack in the shader code itself now.
// Original comment: // Original comment:
// "Hack to make hammer display WVT in non-inverted way. // "Hack to make hammer display WVT in non-inverted way.
// It worked ok in standard WVT because of special editor-only shader. // It worked ok in standard WVT because of special editor-only shader.
// Why Valve just didn't inverted vertex alpha directly in hammer code? oO" // Why Valve just didn't inverted vertex alpha directly in hammer code? oO"
static FORCEINLINE void SwapLayers( LightmappedGeneric_DX9_Vars_t &info ) //static FORCEINLINE void SwapLayers( LightmappedGeneric_DX9_Vars_t &info )
{ //{
V_swap( info.m_nBaseTexture, info.m_nBaseTexture2 ); // V_swap( info.m_nBaseTexture, info.m_nBaseTexture2 );
V_swap( info.m_nBaseTextureFrame, info.m_nBaseTexture2Frame ); // V_swap( info.m_nBaseTextureFrame, info.m_nBaseTexture2Frame );
V_swap( info.m_nBaseTextureNoEnvmap, info.m_nBaseTexture2NoEnvmap ); // V_swap( info.m_nBaseTextureNoEnvmap, info.m_nBaseTexture2NoEnvmap );
V_swap( info.m_nBumpmap, info.m_nBumpmap2 ); // V_swap( info.m_nBumpmap, info.m_nBumpmap2 );
V_swap( info.m_nBumpFrame, info.m_nBumpFrame2 ); // V_swap( info.m_nBumpFrame, info.m_nBumpFrame2 );
V_swap( info.m_nBumpTransform, info.m_nBumpTransform2 ); // V_swap( info.m_nBumpTransform, info.m_nBumpTransform2 );
//}
// I added this part myself, but it's no longer needed now that I've extended the hack into the actual shader code.
//info.m_nBlendModulateTexture = 0;
//info.m_nBlendMaskTransform = 0;
}
END_SHADER END_SHADER