You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
357 lines
8.9 KiB
357 lines
8.9 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//===========================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "toolframework_client.h"
|
||
|
#include "igamesystem.h"
|
||
|
#include "tier1/KeyValues.h"
|
||
|
#include "toolframework/iclientenginetools.h"
|
||
|
#include "client_factorylist.h"
|
||
|
#include "iviewrender.h"
|
||
|
#include "materialsystem/imaterialvar.h"
|
||
|
|
||
|
extern IViewRender *view;
|
||
|
|
||
|
class CToolFrameworkClient : public CBaseGameSystemPerFrame
|
||
|
{
|
||
|
public:
|
||
|
// Methods of IGameSystem
|
||
|
virtual bool Init();
|
||
|
virtual void LevelInitPreEntity();
|
||
|
virtual void LevelInitPostEntity();
|
||
|
virtual void LevelShutdownPreEntity();
|
||
|
virtual void LevelShutdownPostEntity();
|
||
|
virtual void PreRender();
|
||
|
virtual void PostRender();
|
||
|
|
||
|
public:
|
||
|
// Other public methods
|
||
|
void PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg );
|
||
|
void AdjustEngineViewport( int& x, int& y, int& width, int& height );
|
||
|
bool SetupEngineView( Vector &origin, QAngle &angles, float &fov );
|
||
|
bool SetupAudioState( AudioState_t &audioState );
|
||
|
bool IsThirdPersonCamera();
|
||
|
|
||
|
IClientEngineTools *m_pTools;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Singleton
|
||
|
//-----------------------------------------------------------------------------
|
||
|
static CToolFrameworkClient g_ToolFrameworkClient;
|
||
|
|
||
|
#ifndef NO_TOOLFRAMEWORK
|
||
|
|
||
|
bool ToolsEnabled()
|
||
|
{
|
||
|
return g_ToolFrameworkClient.m_pTools && g_ToolFrameworkClient.m_pTools->InToolMode();
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
IGameSystem *ToolFrameworkClientSystem()
|
||
|
{
|
||
|
return &g_ToolFrameworkClient;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CToolFrameworkClient::Init()
|
||
|
{
|
||
|
factorylist_t list;
|
||
|
FactoryList_Retrieve( list );
|
||
|
|
||
|
m_pTools = ( IClientEngineTools * )list.appSystemFactory( VCLIENTENGINETOOLS_INTERFACE_VERSION, NULL );
|
||
|
return ( m_pTools != NULL );
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::LevelInitPreEntity()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->LevelInitPreEntityAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::LevelInitPostEntity()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->LevelInitPostEntityAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::LevelShutdownPreEntity()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->LevelShutdownPreEntityAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::LevelShutdownPostEntity()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->LevelShutdownPostEntityAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::PreRender()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->PreRenderAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CToolFrameworkClient::PostRender()
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->PostRenderAllTools();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Should we render with a 3rd person camera?
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CToolFrameworkClient::IsThirdPersonCamera()
|
||
|
{
|
||
|
if ( !m_pTools )
|
||
|
return false;
|
||
|
return m_pTools->IsThirdPersonCamera( );
|
||
|
}
|
||
|
|
||
|
bool ToolFramework_IsThirdPersonCamera( )
|
||
|
{
|
||
|
return g_ToolFrameworkClient.IsThirdPersonCamera( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Posts a message to all tools
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CToolFrameworkClient::PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg )
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->PostToolMessage( hEntity, msg );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ToolFramework_PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg )
|
||
|
{
|
||
|
g_ToolFrameworkClient.PostToolMessage( hEntity, msg );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// View manipulation
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CToolFrameworkClient::AdjustEngineViewport( int& x, int& y, int& width, int& height )
|
||
|
{
|
||
|
if ( m_pTools )
|
||
|
{
|
||
|
m_pTools->AdjustEngineViewport( x, y, width, height );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ToolFramework_AdjustEngineViewport( int& x, int& y, int& width, int& height )
|
||
|
{
|
||
|
g_ToolFrameworkClient.AdjustEngineViewport( x, y, width, height );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// View manipulation
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CToolFrameworkClient::SetupEngineView( Vector &origin, QAngle &angles, float &fov )
|
||
|
{
|
||
|
if ( !m_pTools )
|
||
|
return false;
|
||
|
|
||
|
return m_pTools->SetupEngineView( origin, angles, fov );
|
||
|
}
|
||
|
|
||
|
bool ToolFramework_SetupEngineView( Vector &origin, QAngle &angles, float &fov )
|
||
|
{
|
||
|
return g_ToolFrameworkClient.SetupEngineView( origin, angles, fov );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// microphone manipulation
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CToolFrameworkClient::SetupAudioState( AudioState_t &audioState )
|
||
|
{
|
||
|
if ( !m_pTools )
|
||
|
return false;
|
||
|
|
||
|
return m_pTools->SetupAudioState( audioState );
|
||
|
}
|
||
|
|
||
|
bool ToolFramework_SetupAudioState( AudioState_t &audioState )
|
||
|
{
|
||
|
return g_ToolFrameworkClient.SetupAudioState( audioState );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Helper class to indicate ownership of effects
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CRecordEffectOwner::CRecordEffectOwner( C_BaseEntity *pEntity, bool bIsViewModel )
|
||
|
{
|
||
|
m_bToolsEnabled = ToolsEnabled() && clienttools->IsInRecordingMode();
|
||
|
if ( m_bToolsEnabled )
|
||
|
{
|
||
|
KeyValues *msg = new KeyValues( "EffectsOwner" );
|
||
|
msg->SetInt( "viewModel", bIsViewModel );
|
||
|
ToolFramework_PostToolMessage( pEntity ? pEntity->GetToolHandle() : HTOOLHANDLE_INVALID, msg );
|
||
|
msg->deleteThis();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CRecordEffectOwner::~CRecordEffectOwner()
|
||
|
{
|
||
|
if ( m_bToolsEnabled )
|
||
|
{
|
||
|
KeyValues *msg = new KeyValues( "EffectsOwner" );
|
||
|
ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg );
|
||
|
msg->deleteThis();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// material recording - primarily for proxy materials
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
void WriteFloat( char *&buf, float f)
|
||
|
{
|
||
|
*( float* )buf = f;
|
||
|
buf += sizeof( float );
|
||
|
}
|
||
|
|
||
|
void WriteInt( char *&buf, int i )
|
||
|
{
|
||
|
*( int* )buf = i;
|
||
|
buf += sizeof( int );
|
||
|
}
|
||
|
|
||
|
void WritePtr( char *&buf, void *p )
|
||
|
{
|
||
|
*( void** )buf = p;
|
||
|
buf += sizeof( void* );
|
||
|
}
|
||
|
|
||
|
void ToolFramework_RecordMaterialParams( IMaterial *pMaterial )
|
||
|
{
|
||
|
Assert( pMaterial );
|
||
|
if ( !pMaterial )
|
||
|
return;
|
||
|
|
||
|
if ( !clienttools->IsInRecordingMode() )
|
||
|
return;
|
||
|
|
||
|
C_BaseEntity *pEnt = view->GetCurrentlyDrawingEntity();
|
||
|
if ( !pEnt || !pEnt->IsToolRecording() )
|
||
|
return;
|
||
|
|
||
|
KeyValues *msg = new KeyValues( "material_proxy_state" );
|
||
|
msg->SetString( "mtlName", pMaterial->GetName() );
|
||
|
msg->SetString( "groupName", pMaterial->GetTextureGroupName() );
|
||
|
|
||
|
int nParams = pMaterial->ShaderParamCount();
|
||
|
IMaterialVar **pParams = pMaterial->GetShaderParams();
|
||
|
|
||
|
char str[ 256 ];
|
||
|
|
||
|
for ( int i = 0; i < nParams; ++i )
|
||
|
{
|
||
|
IMaterialVar *pVar = pParams[ i ];
|
||
|
const char *pVarName = pVar->GetName();
|
||
|
MaterialVarType_t vartype = pVar->GetType();
|
||
|
switch ( vartype )
|
||
|
{
|
||
|
case MATERIAL_VAR_TYPE_FLOAT:
|
||
|
msg->SetFloat( pVarName, pVar->GetFloatValue() );
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_INT:
|
||
|
msg->SetInt( pVarName, pVar->GetIntValue() );
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_STRING:
|
||
|
msg->SetString( pVarName, pVar->GetStringValue() );
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_FOURCC:
|
||
|
Assert( 0 ); // JDTODO
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_VECTOR:
|
||
|
{
|
||
|
const float *pVal = pVar->GetVecValue();
|
||
|
int dim = pVar->VectorSize();
|
||
|
switch ( dim )
|
||
|
{
|
||
|
case 2:
|
||
|
V_snprintf( str, sizeof( str ), "vector2d: %f %f", pVal[ 0 ], pVal[ 1 ] );
|
||
|
break;
|
||
|
case 3:
|
||
|
V_snprintf( str, sizeof( str ), "vector3d: %f %f %f", pVal[ 0 ], pVal[ 1 ], pVal[ 2 ] );
|
||
|
break;
|
||
|
case 4:
|
||
|
V_snprintf( str, sizeof( str ), "vector4d: %f %f %f %f", pVal[ 0 ], pVal[ 1 ], pVal[ 2 ], pVal[ 3 ] );
|
||
|
break;
|
||
|
default:
|
||
|
Assert( 0 );
|
||
|
*str = 0;
|
||
|
}
|
||
|
msg->SetString( pVarName, str );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_MATRIX:
|
||
|
{
|
||
|
const VMatrix &matrix = pVar->GetMatrixValue();
|
||
|
const float *pVal = matrix.Base();
|
||
|
V_snprintf( str, sizeof( str ),
|
||
|
"matrix: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
|
||
|
pVal[ 0 ], pVal[ 1 ], pVal[ 2 ], pVal[ 3 ],
|
||
|
pVal[ 4 ], pVal[ 5 ], pVal[ 6 ], pVal[ 7 ],
|
||
|
pVal[ 8 ], pVal[ 9 ], pVal[ 10 ], pVal[ 11 ],
|
||
|
pVal[ 12 ], pVal[ 13 ], pVal[ 14 ], pVal[ 15 ] );
|
||
|
msg->SetString( pVarName, str );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_TEXTURE:
|
||
|
// V_snprintf( str, sizeof( str ), "texture: %x", pVar->GetTextureValue() );
|
||
|
// msg->SetString( pVarName, str );
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_MATERIAL:
|
||
|
// V_snprintf( str, sizeof( str ), "material: %x", pVar->GetMaterialValue() );
|
||
|
// msg->SetString( pVarName, str );
|
||
|
break;
|
||
|
|
||
|
case MATERIAL_VAR_TYPE_UNDEFINED:
|
||
|
// Assert( 0 ); // these appear to be (mostly? all?) textures, although I don't know why they're not caught by the texture case above...
|
||
|
break; // JDTODO
|
||
|
|
||
|
default:
|
||
|
Assert( 0 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Assert( pEnt->GetToolHandle() );
|
||
|
ToolFramework_PostToolMessage( pEnt->GetToolHandle(), msg );
|
||
|
|
||
|
msg->deleteThis();
|
||
|
}
|