//========= Copyright © 1996-2009, Valve Corporation, All rights reserved. ============// // // Purpose: Implements the PaintPowerInfo structure for storing information about // the paint powers used. // //=============================================================================// #include "cbase.h" #include "debugoverlay_shared.h" #include "paint_power_info.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //BEGIN_SEND_TABLE_NOBASE( PaintPowerInfo_t, DT_PaintPowerInfo_t ) // SendPropEHandle( SENDINFO( m_HandleToOther ) ), // SendPropVector( SENDINFO( m_SurfaceNormal ) ), //END_SEND_TABLE() #if defined( CLIENT_DLL ) BEGIN_PREDICTION_DATA_NO_BASE( PaintPowerInfo_t ) DEFINE_PRED_FIELD( m_HandleToOther, FIELD_EHANDLE, 0 ), DEFINE_PRED_FIELD( m_SurfaceNormal, FIELD_VECTOR, 0 ), DEFINE_PRED_FIELD( m_ContactPoint, FIELD_VECTOR, 0 ), DEFINE_PRED_FIELD( m_State, FIELD_INTEGER, 0 ), DEFINE_PRED_FIELD( m_PaintPowerType, FIELD_INTEGER, 0 ), DEFINE_PRED_FIELD( m_IsOnThinSurface, FIELD_BOOLEAN, 0 ) END_PREDICTION_DATA() #endif IMPLEMENT_NULL_SIMPLE_DATADESC( PaintPowerInfo_t ); const Vector DEFAULT_PAINT_SURFACE_NORMAL = Vector(0.0f, 0.0f, 1.0f); // Flat ground PaintPowerInfo_t::PaintPowerInfo_t() : m_SurfaceNormal( DEFAULT_PAINT_SURFACE_NORMAL ), m_ContactPoint( 0.0f, 0.0f, 0.0f ), m_PaintPowerType( NO_POWER ), m_HandleToOther( 0 ), m_State( INACTIVE_PAINT_POWER ), m_IsOnThinSurface( false ) {} PaintPowerInfo_t::PaintPowerInfo_t( const Vector &normal, const Vector &contactPt, CBaseEntity* pOther, PaintPowerType power, bool isOnThinSurface ) : m_SurfaceNormal( normal ), m_ContactPoint( contactPt ), m_PaintPowerType( power ), m_State( INACTIVE_PAINT_POWER ), m_IsOnThinSurface( isOnThinSurface ) { m_HandleToOther.Set( pOther ); } #define PAINT_POWER_CPP_INLINE PAINT_POWER_CPP_INLINE bool AreSamePower( const PaintPowerInfo_t& powerA, const PaintPowerInfo_t& powerB ) { return powerA.m_PaintPowerType == powerB.m_PaintPowerType && powerA.m_HandleToOther == powerB.m_HandleToOther && AlmostEqual( DotProduct( powerA.m_SurfaceNormal, powerB.m_SurfaceNormal ), 1.f ); } PAINT_POWER_CPP_INLINE bool AreDifferentPowers( const PaintPowerInfo_t& powerA, const PaintPowerInfo_t& powerB ) { return !AreSamePower( powerA, powerB ); } PAINT_POWER_CPP_INLINE bool IsSpeedPower( const PaintPowerInfo_t& power ) { return power.m_PaintPowerType == SPEED_POWER; } PAINT_POWER_CPP_INLINE bool IsBouncePower( const PaintPowerInfo_t& power ) { return power.m_PaintPowerType == BOUNCE_POWER; } PAINT_POWER_CPP_INLINE bool IsReflectPower( const PaintPowerInfo_t& power ) { return power.m_PaintPowerType == REFLECT_POWER; } PAINT_POWER_CPP_INLINE bool IsPortalPower( const PaintPowerInfo_t& power ) { return power.m_PaintPowerType == PORTAL_POWER; } PAINT_POWER_CPP_INLINE bool IsNoPower( const PaintPowerInfo_t& power ) { return power.m_PaintPowerType == NO_POWER; } PAINT_POWER_CPP_INLINE bool IsActivatingPower( const PaintPowerInfo_t& power ) { return power.m_State == ACTIVATING_PAINT_POWER; } PAINT_POWER_CPP_INLINE bool IsActivePower( const PaintPowerInfo_t& power ) { return power.m_State == ACTIVE_PAINT_POWER; } PAINT_POWER_CPP_INLINE bool IsDeactivatingPower( const PaintPowerInfo_t& power ) { return power.m_State == DEACTIVATING_PAINT_POWER; } PAINT_POWER_CPP_INLINE bool IsInactivePower( const PaintPowerInfo_t& power ) { return power.m_State == INACTIVE_PAINT_POWER; } char const *const PowerTypeToString( const PaintPowerInfo_t& powerInfo ) { return PowerTypeToString( powerInfo.m_PaintPowerType ); } char const *const PowerTypeToString( PaintPowerType type ) { switch( type ) { case BOUNCE_POWER: return "Bounce"; case SPEED_POWER: return "Speed"; case REFLECT_POWER: return "Speed";// FIXME: Bring this back for DLC2 "Reflect"; case PORTAL_POWER: return "Portal"; case NO_POWER: return "No"; // Yes default: return "Invalid power or hasn't been added to PowerTypeToString() in paint_power_info.cpp"; } } char const *const PowerStateToString( const PaintPowerInfo_t& powerInfo ) { return PowerStateToString( powerInfo.m_State ); } char const *const PowerStateToString( PaintPowerState state ) { switch( state ) { case ACTIVATING_PAINT_POWER: return "Activating"; case ACTIVE_PAINT_POWER: return "Active"; case DEACTIVATING_PAINT_POWER: return "Deactivating"; case INACTIVE_PAINT_POWER: return "Inactive"; default: return "Invalid state or hasn't been added to PowerStateToString() in paint_power_info.cpp"; } } void PrintPowerInfoDebugMsg( const PaintPowerInfo_t& powerInfo ) { DevMsg( "Contact Point:\t(%f, %f, %f)\n", XYZ(powerInfo.m_ContactPoint) ); DevMsg( "Surface Normal:\t(%f, %f, %f)\n", XYZ(powerInfo.m_SurfaceNormal) ); DevMsg( "Paint Power: %s Power\n", PowerTypeToString(powerInfo.m_PaintPowerType) ); // Non-const because CBaseEntity::GetClassname() is non-const because someone is lame. // Rebuilding every project in main to fix a const-correctness mistake is incredibly annoying. CBaseEntity* pOther; pOther = powerInfo.m_HandleToOther.Get() != NULL ? EntityFromEntityHandle( powerInfo.m_HandleToOther.Get() ) : NULL; DevMsg( "Other Class: %s\n", pOther != NULL ? pOther->GetClassname() : "Null" ); DevMsg( "State: %s\n", PowerStateToString( powerInfo.m_State ) ); } void DrawPaintPowerContactInfo( const PaintPowerInfo_t& powerInfo, const Color& color, float duration, bool noDepthTest ) { NDebugOverlay::Sphere( powerInfo.m_ContactPoint, 5.0f, color.r(), color.g(), color.b(), noDepthTest, duration ); NDebugOverlay::Line( powerInfo.m_ContactPoint, powerInfo.m_ContactPoint + 20.0f * powerInfo.m_SurfaceNormal, color.r(), color.g(), color.b(), noDepthTest, duration ); } int DescendingPaintPriorityCompare( const PaintPowerInfo_t* a, const PaintPowerInfo_t* b ) { return a->m_PaintPowerType - b->m_PaintPowerType; } int AscendingPaintPriorityCompare( const PaintPowerInfo_t* a, const PaintPowerInfo_t* b ) { return b->m_PaintPowerType - a->m_PaintPowerType; }