//========= Copyright © Valve Corporation, All rights reserved. ============// // // Purpose: // //==========================================================================// #ifndef PAINT_BLOBS_SHARED_H #define PAINT_BLOBS_SHARED_H #include "paint_color_manager.h" #include "trigger_tractorbeam_shared.h" enum BlobTraceResult { BLOB_TRACE_HIT_NOTHING = 0, BLOB_TRACE_HIT_PORTAL, BLOB_TRACE_HIT_WORLD, BLOB_TRACE_HIT_PAINT_CLEANSER, BLOB_TRACE_HIT_SOMETHING, BLOB_TRACE_HIT_PLAYER, BLOB_TRACE_HIT_TRACTORBEAM, BLOB_TRACE_HIT_PROP_PORTAL // this flag is for creating ghost blobs to make smooth blobs rendering when blobs go through portal }; struct BlobCollisionRecord { trace_t trace; Vector targetEndPos; BlobTraceResult traceResultType; }; enum PaintBlobMoveState { PAINT_BLOB_AIR_MOVE = 0, PAINT_BLOB_STREAK_MOVE, PAINT_BLOB_TRACTOR_BEAM_MOVE }; class CBasePaintBlob { public: CBasePaintBlob( void ); ~CBasePaintBlob( void ); void Init( const Vector &vecOrigin, const Vector &vecVelocity, int paintType, float flMaxStreakTime, float flStreakSpeedDampenRate, CBaseEntity* pOwner, bool bSilent, bool bDrawOnly ); bool IsStreaking( void ) const; void SetTractorBeam( CTrigger_TractorBeam* pBeam ); const Vector& GetTempEndPosition( void ) const; void SetTempEndPosition( const Vector &vecTempEndPosition ); const Vector& GetTempEndVelocity( void ) const; void SetTempEndVelocity( const Vector &vecTempEndVelocity ); const Vector& GetPosition( void ) const; void SetPosition( const Vector &vecPosition ); const Vector& GetPrevPosition() const; void SetPrevPosition( const Vector& vPrevPosition ); const Vector& GetVelocity( void ) const; void SetVelocity( const Vector &vecVelocity ); const Vector& GetStreakDir() const; PaintPowerType GetPaintPowerType( void ) const; PaintBlobMoveState GetMoveState( void ) const; void SetMoveState( PaintBlobMoveState moveState ); float GetAccumulatedTime() const { return m_flAccumulatedTime; } void SetAccumulatedTime( float flAccumulatedTime ) { m_flAccumulatedTime = flAccumulatedTime; } // kill this if we don't need fixed time step float GetLastUpdateTime() const { return m_flLastUpdateTime; } void SetLastUpdateTime( float flLastUpdateTime ) { m_flLastUpdateTime = flLastUpdateTime; } float GetVortexDirection() const; bool ShouldDeleteThis() const; void SetDeletionFlag( bool bDelete ); float GetLifeTime() const; void UpdateLifeTime( float flUpdateTime ); void UpdateBlobCollision( float flDeltaTime, const Vector& vecEndPos, Vector& vecEndVelocity ); void UpdateBlobPostCollision( float flDeltaTime ); const Vector& GetContactNormal() const; float GetStreakTime() const { return m_flStreakTimer; } float GetStreakSpeedDampenRate() const { return m_flStreakSpeedDampenRate; } void SetRadiusScale( float flRadiusScale ); float GetRadiusScale( void ) const; bool ShouldPlayEffect() const; bool IsSilent() const { return m_bSilent; } bool IsGhosting() const { return ( m_hPortal != NULL ); } void GetGhostMatrix( VMatrix& matGhostTransform ); void ResetGhostState() { m_hPortal = NULL; } CTrigger_TractorBeam* GetCurrentBeam() const; bool PaintBlobCheckShouldStreak( const trace_t &trace ); void PlayEffect( const Vector& vPosition, const Vector& vNormal ); bool PaintBlobStreakPaint( const Vector &vecBlobStartPos ); virtual void PaintBlobPaint( const trace_t &tr ) = 0; void SetShouldPlaySound( bool shouldPlaySound ); bool ShouldPlaySound() const; void SetBlobTeleportedThisFrame( bool bTeleported ) { m_bTeleportedThisFrame = bTeleported; } bool HasBlobTeleportedThisFrame() const { return m_bTeleportedThisFrame; } int GetTeleportationCount() const { return m_nTeleportationCount; } float m_flDestVortexRadius; float m_flCurrentVortexRadius; float m_flCurrentVortexSpeed; float m_flVortexDirection; // -1.f or 1.f protected: void PaintBlobMoveThroughPortal( float flDeltaTime, CPortal_Base2D *pInPortal, const Vector &vecStartPos, const Vector &vecTransformedEndPos ); BlobTraceResult BlobHitSolid( CBaseEntity* pHitEntity ); int CheckCollision( BlobCollisionRecord *pCollisions, int maxCollisions, const Vector &vecEndPos ); void CheckCollisionAgainstWorldAndStaticProps( BlobCollisionRecord& solidHitRecord, float& flHitFraction ); int CheckCollisionThroughPortal( BlobCollisionRecord *pCollisions, int maxCollisions, const Vector &vecEndPos ); void ResolveCollision( bool& bDeleted, const BlobCollisionRecord& collision, Vector& targetVelocity, float deltaTime ); void DecayVortexSpeed( float flDeltaTime ); Vector m_vecTempEndPosition; Vector m_vecTempEndVelocity; Vector m_vecPosition; Vector m_vecPrevPosition; Vector m_vecVelocity; // this is used for playing paint effect on client and painting surface on server Vector m_vContactNormal; PaintPowerType m_paintType; EHANDLE m_hOwner; PaintBlobMoveState m_MoveState; //Timers for the blob float m_flLifeTime; //Streaking Vector m_vecStreakDir; bool m_bStreakDirChanged; float m_flStreakTimer; float m_flStreakSpeedDampenRate; bool m_bDeleteFlag; float m_flAccumulatedTime; float m_flLastUpdateTime; //The radius scale of the blob for the isosurface rendering // this is shared so the listen server doesn't have to create blobs on the client dll float m_flRadiusScale; bool m_bShouldPlayEffect; // blob needs to know if hitting beam is the same as the current beam, so it doesn't need to init beam data again EntityBeamHistory_t m_beamHistory; bool m_bInTractorBeam; // HACK: remove this when awesome paint box/sphere feature is done (Bank) bool m_bSilent; // portal handle (for ghosting) EHANDLE m_hPortal; // optimize trace bool CheckCollisionBoxAgainstWorldAndStaticProps(); Vector m_vCollisionBoxCenter; bool m_bCollisionBoxHitSolid; bool m_bShouldPlaySound; // if this flag is true, blob won't do effect/sound/paint bool m_bDrawOnly; // teleportation counter bool m_bTeleportedThisFrame; int m_nTeleportationCount; }; #ifdef GAME_DLL class CPaintBlob; #else class C_PaintBlob; typedef C_PaintBlob CPaintBlob; #endif typedef CUtlVector PaintBlobVector_t; ////////////////////////////////////////////////////////////////////////// // Listen Server Shared Data ////////////////////////////////////////////////////////////////////////// struct BlobTeleportationHistory_t { BlobTeleportationHistory_t() : m_vEnterPosition( vec3_origin ), m_vExitPosition( vec3_origin ), m_flTeleportTime( 0.f ) { } BlobTeleportationHistory_t( const VMatrix& matSourceToLinked, const VMatrix& matLinkedToSource, const Vector& vEnter, const Vector& vExit, float flTeleportTime ) { m_matSourceToLinked = matSourceToLinked; m_matLinkedToSource = matLinkedToSource; m_vEnterPosition = vEnter; m_vExitPosition = vExit; m_flTeleportTime = flTeleportTime; } VMatrix m_matSourceToLinked; VMatrix m_matLinkedToSource; Vector m_vEnterPosition; Vector m_vExitPosition; float m_flTeleportTime; }; typedef CUtlVector< BlobTeleportationHistory_t > BlobTeleportationHistoryVector_t; struct BlobData_t { BlobData_t() { m_blobID = -1; m_vPosition = vec3_origin; m_flScale = 0.f; m_bTeleportedThisFrame = false; m_bGhosting = false; MatrixSetIdentity( m_matGhostTransform ); } BlobData_t( const BlobData_t& blobData ) { m_blobID = blobData.m_blobID; m_vPosition = blobData.m_vPosition; m_flScale = blobData.m_flScale; m_bTeleportedThisFrame = blobData.m_bTeleportedThisFrame; m_bGhosting = blobData.m_bGhosting; m_matGhostTransform = blobData.m_matGhostTransform; } ~BlobData_t() { m_teleportationHistory.Purge(); } int m_blobID; Vector m_vPosition; float m_flScale; // teleportation data bool m_bTeleportedThisFrame; BlobTeleportationHistoryVector_t m_teleportationHistory; // ghosting data bool m_bGhosting; VMatrix m_matGhostTransform; }; typedef CUtlVector< BlobData_t > BlobDataVector_t; struct BlobInterpolationData_t { BlobInterpolationData_t() { m_flUpdateTime = 0.f; } ~BlobInterpolationData_t() { m_blobData.Purge(); } float m_flUpdateTime; BlobDataVector_t m_blobData; }; typedef CUtlVector< BlobInterpolationData_t > BlobInterpolationDataVector_t; void PaintBlobUpdate( const PaintBlobVector_t& blobList ); #endif //PAINT_BLOBS_SHARED_H