csgo-2018-source/game/client/c_info_overlay_accessor.cpp
2021-07-24 21:11:47 -07:00

133 lines
3.9 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "materialsystem/imesh.h"
#include "toolframework_client.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// -------------------------------------------------------------------------------- //
// An entity used to access overlays (and change their texture)
// -------------------------------------------------------------------------------- //
class C_InfoOverlayAccessor : public C_BaseEntity
{
public:
DECLARE_CLASS( C_InfoOverlayAccessor, C_BaseEntity );
DECLARE_CLIENTCLASS();
C_InfoOverlayAccessor();
virtual void OnDataChanged( DataUpdateType_t updateType );
virtual void GetToolRecordingState( KeyValues *msg );
void RestoreToToolRecordedState( KeyValues *pKV );
void DestroyToolRecording( void );
private:
int m_iOverlayID;
};
// Expose it to the engine.
IMPLEMENT_CLIENTCLASS(C_InfoOverlayAccessor, DT_InfoOverlayAccessor, CInfoOverlayAccessor);
BEGIN_RECV_TABLE_NOBASE(C_InfoOverlayAccessor, DT_InfoOverlayAccessor)
RecvPropInt(RECVINFO(m_iTextureFrameIndex)),
RecvPropInt(RECVINFO(m_iOverlayID)),
END_RECV_TABLE()
// -------------------------------------------------------------------------------- //
// Functions.
// -------------------------------------------------------------------------------- //
C_InfoOverlayAccessor::C_InfoOverlayAccessor()
{
}
void C_InfoOverlayAccessor::OnDataChanged( DataUpdateType_t updateType )
{
if ( updateType == DATA_UPDATE_CREATED )
{
// Update overlay's bind proxy
engine->SetOverlayBindProxy( m_iOverlayID, GetClientRenderable() );
}
}
void C_InfoOverlayAccessor::GetToolRecordingState( KeyValues *msg )
{
BaseClass::GetToolRecordingState( msg );
KeyValues *pKV = CIFM_EntityKeyValuesHandler_AutoRegister::FindOrCreateNonConformantKeyValues( msg );
pKV->SetString( CIFM_EntityKeyValuesHandler_AutoRegister::GetHandlerIDKeyString(), "C_InfoOverlayAccessor" );
pKV->SetInt( "entIndex", index );
pKV->SetInt( "overlayID", m_iOverlayID );
pKV->SetInt( "textureFrame", GetTextureFrameIndex() );
//mark entity as visible so we'll get playback (even though we're invisible, the overlay we talk to isn't)
{
BaseEntityRecordingState_t dummyState;
BaseEntityRecordingState_t *pState = (BaseEntityRecordingState_t *)msg->GetPtr( "baseentity", &dummyState );
pState->m_bVisible = true;
}
}
void C_InfoOverlayAccessor::RestoreToToolRecordedState( KeyValues *pKV )
{
m_iOverlayID = pKV->GetInt( "overlayID" );
SetTextureFrameIndex( pKV->GetInt( "textureFrame" ) );
engine->SetOverlayBindProxy( m_iOverlayID, GetClientRenderable() );
}
void C_InfoOverlayAccessor::DestroyToolRecording( void )
{
engine->SetOverlayBindProxy( m_iOverlayID, NULL );
}
class C_InfoOverlayAccessor_NonConformantDataHandler : public CIFM_EntityKeyValuesHandler_RecreateEntities
{
public:
C_InfoOverlayAccessor_NonConformantDataHandler( void )
: CIFM_EntityKeyValuesHandler_RecreateEntities( "C_InfoOverlayAccessor" )
{ }
virtual void *CreateInstance( void )
{
return new C_InfoOverlayAccessor;
}
virtual void DestroyInstance( void *pEntity )
{
C_InfoOverlayAccessor *pCastEntity = (C_InfoOverlayAccessor *)pEntity;
//clienttools->RemoveClientRenderable( pCastEntity );
pCastEntity->DestroyToolRecording();
delete pCastEntity;
}
virtual void HandleInstance( void *pEntity, KeyValues *pKeyValues )
{
C_InfoOverlayAccessor *pCastEntity = (C_InfoOverlayAccessor *)pEntity;
pCastEntity->RestoreToToolRecordedState( pKeyValues );
//if( pCastEntity->RenderHandle() == INVALID_CLIENT_RENDER_HANDLE )
//{
// clienttools->AddClientRenderable( pCastEntity, false, RENDERABLE_IS_TRANSLUCENT );
//}
//clienttools->MarkClientRenderableDirty( pCastEntity );
}
};
static C_InfoOverlayAccessor_NonConformantDataHandler s_InfoOverlayAccessorEntityIFMHandler;