summaryrefslogtreecommitdiff
path: root/game/server/portal/physicsshadowclone.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/portal/physicsshadowclone.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/portal/physicsshadowclone.h')
-rw-r--r--game/server/portal/physicsshadowclone.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/game/server/portal/physicsshadowclone.h b/game/server/portal/physicsshadowclone.h
new file mode 100644
index 0000000..1932079
--- /dev/null
+++ b/game/server/portal/physicsshadowclone.h
@@ -0,0 +1,138 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Clones a physics object by use of shadows
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef PHYSICSSHADOWCLONE_H
+#define PHYSICSSHADOWCLONE_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "vphysics_interface.h"
+#include "baseentity.h"
+#include "baseanimating.h"
+
+class CPhysicsShadowClone;
+
+struct PhysicsObjectCloneLink_t
+{
+ IPhysicsObject *pSource;
+ IPhysicsShadowController *pShadowController;
+ IPhysicsObject *pClone;
+};
+
+struct CPhysicsShadowCloneLL
+{
+ CPhysicsShadowClone *pClone;
+ CPhysicsShadowCloneLL *pNext;
+};
+
+#define FVPHYSICS_IS_SHADOWCLONE 0x4000
+
+class CPhysicsShadowClone : public CBaseAnimating
+{
+ DECLARE_CLASS( CPhysicsShadowClone, CBaseAnimating );
+
+private:
+ EHANDLE m_hClonedEntity; //the entity we're supposed to be cloning the physics of
+ VMatrix m_matrixShadowTransform; //all cloned coordinates and angles will be run through this matrix before being applied
+ VMatrix m_matrixShadowTransform_Inverse;
+
+ CUtlVector<PhysicsObjectCloneLink_t> m_CloneLinks; //keeps track of which of our physics objects are linked to the source's objects
+ bool m_bShadowTransformIsIdentity; //the shadow transform doesn't update often, so we can cache this
+ bool m_bImmovable; //cloning a track train or door, something that doesn't really work on a force-based level
+ bool m_bInAssumedSyncState;
+
+ void FullSyncClonedPhysicsObjects( bool bTeleport );
+ void SyncEntity( bool bPullChanges );
+
+ IPhysicsEnvironment *m_pOwnerPhysEnvironment; //clones exist because of multi-environment situations
+
+
+public:
+ CPhysicsShadowClone( void );
+ virtual ~CPhysicsShadowClone( void );
+
+ bool m_bShouldUpSync;
+ DBG_CODE_NOSCOPE( const char *m_szDebugMarker; );
+
+ //do the thing with the stuff, you know, the one that goes WooooWooooWooooWooooWoooo
+ virtual void Spawn( void );
+
+ //crush, kill, DESTROY!!!!!
+ void Free( void );
+
+ //syncs to the source entity in every way possible, assumed sync does some rudimentary tests to see if the object is in sync, and if so, skips the update
+ void FullSync( bool bAllowAssumedSync = false );
+
+ //syncs just the physics objects, bPullChanges should be true when this clone should match it's source, false when it should force differences onto the source entity
+ void PartialSync( bool bPullChanges );
+
+ //virtual bool CreateVPhysics( void );
+ virtual void VPhysicsDestroyObject( void );
+ virtual int VPhysicsGetObjectList( IPhysicsObject **pList, int listMax );
+ virtual int ObjectCaps( void );
+ virtual void UpdateOnRemove( void );
+
+
+
+ //routing to the source entity for cloning goodness
+ virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const;
+
+ //avoid blocking traces that are supposed to hit our source entity
+ virtual bool TestCollision( const Ray_t &ray, unsigned int fContentsMask, trace_t& tr );
+
+
+
+
+ //is this clone occupying the exact same space as the object it's cloning?
+ inline bool IsUntransformedClone( void ) const { return m_bShadowTransformIsIdentity; };
+ void SetCloneTransformationMatrix( const matrix3x4_t &matTransform );
+
+ inline bool IsInAssumedSyncState( void ) const { return m_bInAssumedSyncState; }
+ inline IPhysicsEnvironment *GetOwnerEnvironment( void ) const { return m_pOwnerPhysEnvironment; }
+
+ //what entity are we cloning?
+ void SetClonedEntity( EHANDLE hEntToClone );
+ EHANDLE GetClonedEntity( void );
+
+
+ virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
+
+ //damage relays to source entity if anything ever hits the clone
+ virtual bool PassesDamageFilter( const CTakeDamageInfo &info );
+ virtual bool CanBeHitByMeleeAttack( CBaseEntity *pAttacker );
+ virtual int OnTakeDamage( const CTakeDamageInfo &info );
+ virtual int TakeHealth( float flHealth, int bitsDamageType );
+ virtual void Event_Killed( const CTakeDamageInfo &info );
+
+
+ static CPhysicsShadowClone *CreateShadowClone( IPhysicsEnvironment *pInPhysicsEnvironment, EHANDLE hEntToClone, const char *szDebugMarker, const matrix3x4_t *pTransformationMatrix = NULL );
+
+ //given a physics object that is part of this clone, tells you which physics object in the source
+ IPhysicsObject *TranslatePhysicsToClonedEnt( const IPhysicsObject *pPhysics );
+
+ static bool IsShadowClone( const CBaseEntity *pEntity );
+ static CPhysicsShadowCloneLL *GetClonesOfEntity( const CBaseEntity *pEntity );
+ static void FullSyncAllClones( void );
+
+ static CUtlVector<CPhysicsShadowClone *> const &g_ShadowCloneList;
+};
+
+
+
+class CTraceFilterTranslateClones : public CTraceFilter //give it another filter, and it'll translate shadow clones into their source entity for tests
+{
+ ITraceFilter *m_pActualFilter; //the filter that tests should be forwarded to after translating clones
+
+public:
+ CTraceFilterTranslateClones( ITraceFilter *pOtherFilter ) : m_pActualFilter(pOtherFilter) {};
+ virtual bool ShouldHitEntity( IHandleEntity *pEntity, int contentsMask );
+ virtual TraceType_t GetTraceType() const;
+};
+
+#endif //#ifndef PHYSICSSHADOWCLONE_H