//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #ifndef ITOOLSYSTEM_H #define ITOOLSYSTEM_H #ifdef _WIN32 #pragma once #endif #include "itoolentity.h" #include "interface.h" #include "materialsystem/imaterialproxy.h" #include "inputsystem/iinputsystem.h" class KeyValues; struct SpatializationInfo_t; struct AudioState_t; //----------------------------------------------------------------------------- // Purpose: All tools expose this interface, which includes both client and server // related hooks //----------------------------------------------------------------------------- class IToolSystem { public: // Name describing the tool virtual char const *GetToolName() = 0; // Called at the end of engine startup (after client .dll and server .dll have been loaded) virtual bool Init() = 0; // Called during RemoveTool or when engine is shutting down virtual void Shutdown() = 0; // Called after server.dll is loaded virtual bool ServerInit( CreateInterfaceFn serverFactory ) = 0; // Called after client.dll is loaded virtual bool ClientInit( CreateInterfaceFn clientFactory ) = 0; virtual void ServerShutdown() = 0; virtual void ClientShutdown() = 0; // Allow tool to override quitting, called before Shutdown(), return no to abort quitting virtual bool CanQuit() = 0; // Called when another system wiches to post a message to the tool and/or a specific entity // FIXME: Are KeyValues too inefficient here? virtual void PostMessage( HTOOLHANDLE hEntity, KeyValues *message ) = 0; // Called oncer per frame even when no level is loaded... (call ProcessMessages()) virtual void Think( bool finalTick ) = 0; // Server calls: // Level init, shutdown virtual void ServerLevelInitPreEntity() = 0; // entities are created / spawned / precached here virtual void ServerLevelInitPostEntity() = 0; virtual void ServerLevelShutdownPreEntity() = 0; // Entities are deleted / released here... virtual void ServerLevelShutdownPostEntity() = 0; // end of level shutdown // Called each frame before entities think virtual void ServerFrameUpdatePreEntityThink() = 0; // called after entities think virtual void ServerFrameUpdatePostEntityThink() = 0; virtual void ServerPreClientUpdate() = 0; virtual void ServerPreSetupVisibility() = 0; // Used to allow the tool to spawn different entities when it's active virtual const char* GetEntityData( const char *pActualEntityData ) = 0; // Client calls: // Level init, shutdown virtual void ClientLevelInitPreEntity() = 0; // entities are created / spawned / precached here virtual void ClientLevelInitPostEntity() = 0; virtual void ClientLevelShutdownPreEntity() = 0; // Entities are deleted / released here... virtual void ClientLevelShutdownPostEntity() = 0; // end of level shutdown // Called before rendering virtual void ClientPreRender() = 0; virtual void ClientPostRender() = 0; // Let tool override viewport for engine virtual void AdjustEngineViewport( int& x, int& y, int& width, int& height ) = 0; // let tool override view/camera virtual bool SetupEngineView( Vector &origin, QAngle &angles, float &fov ) = 0; // let tool override microphone virtual bool SetupAudioState( AudioState_t &audioState ) = 0; // Should the client be allowed to render the view normally? virtual bool ShouldGameRenderView() = 0; virtual bool IsThirdPersonCamera() = 0; // is the current tool recording? virtual bool IsToolRecording() = 0; virtual IMaterialProxy *LookupProxy( const char *proxyName ) = 0; // Possible hooks for rendering // virtual void Think( float curtime, float frametime ) = 0; // virtual void Prerender() = 0; // virtual void Render3D() = 0; // virtual void Render2D() = 0; // Tool activation/deactivation // This tool is being activated virtual void OnToolActivate() = 0; // Another tool is being activated virtual void OnToolDeactivate() = 0; virtual bool TrapKey( ButtonCode_t key, bool down ) = 0; virtual bool GetSoundSpatialization( int iUserData, int guid, SpatializationInfo_t& info ) = 0; // Unlike the client .dll pre/post render stuff, these get called no matter whether a map is loaded and they only get called once per frame!!! virtual void RenderFrameBegin() = 0; virtual void RenderFrameEnd() = 0; // wraps the entire frame - surrounding all other begin/end and pre/post calls virtual void HostRunFrameBegin() = 0; virtual void HostRunFrameEnd() = 0; // See enginevgui.h for paintmode_t enum definitions virtual void VGui_PreRender( int paintMode ) = 0; virtual void VGui_PostRender( int paintMode ) = 0; virtual void VGui_PreSimulate() = 0; virtual void VGui_PostSimulate() = 0; }; // Pointer to a member method of IGameSystem typedef void (IToolSystem::*ToolSystemFunc_t)(); typedef void (IToolSystem::*ToolSystemFunc_Int_t)( int arg ); #endif // ITOOLSYSTEM_H