//========= Copyright © 1996-2007, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef C_SCENEENTITY_H #define C_SCENEENTITY_H #ifdef _WIN32 #pragma once #endif #include "ichoreoeventcallback.h" class C_SceneEntity : public C_BaseEntity, public IChoreoEventCallback { friend class CChoreoEventCallback; public: DECLARE_CLASS( C_SceneEntity, C_BaseEntity ); DECLARE_CLIENTCLASS(); C_SceneEntity( void ); ~C_SceneEntity( void ); // From IChoreoEventCallback virtual void StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual void EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual void ProcessEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual bool CheckEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual void PostDataUpdate( DataUpdateType_t updateType ); virtual void PreDataUpdate( DataUpdateType_t updateType ); virtual void StopClientOnlyScene(); virtual void SetupClientOnlyScene( const char *pszFilename, C_BaseFlex *pOwner = NULL , bool bMultiplayer = false ); virtual void ClientThink(); void OnResetClientTime(); CHandle< C_BaseFlex > GetActor( int i ){ return ( i < m_hActorList.Count() ) ? m_hActorList[i] : INVALID_EHANDLE; } virtual void DispatchStartSpeak( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event, soundlevel_t iSoundlevel ); virtual void DispatchEndSpeak( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); bool IsClientOnly( void ){ return m_bClientOnly; } bool IsMultiplayer() const { return m_bMultiplayer; } private: void ResetActorFlexesForScene(); // Scene load/unload CChoreoScene *LoadScene( const char *filename ); void LoadSceneFromFile( const char *filename ); void UnloadScene( void ); void PrefetchAnimBlocks( CChoreoScene *pScene ); C_BaseFlex *FindNamedActor( CChoreoActor *pChoreoActor ); virtual void DispatchStartFlexAnimation( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndFlexAnimation( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartExpression( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndExpression( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartGesture( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndGesture( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartSequence( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndSequence( CChoreoScene *scene, C_BaseFlex *actor, CChoreoEvent *event ); void DispatchProcessLoop( CChoreoScene *scene, CChoreoEvent *event ); char const *GetSceneFileName(); void DoThink( float frametime ); void ClearSceneEvents( CChoreoScene *scene, bool canceled ); void SetCurrentTime( float t, bool forceClientSync ); bool GetHWMorphSceneFileName( const char *pFilename, char *pHWMFilename ); private: void CheckQueuedEvents(); void WipeQueuedEvents(); void QueueStartEvent( float starttime, CChoreoScene *scene, CChoreoEvent *event ); bool m_bIsPlayingBack; bool m_bPaused; bool m_bMultiplayer; float m_flCurrentTime; float m_flForceClientTime; int m_nSceneStringIndex; bool m_bClientOnly; CHandle< C_BaseFlex > m_hOwner; // if set, this overrides the m_hActorList in FindNamedActor() CUtlVector< CHandle< C_BaseFlex > > m_hActorList; private: bool m_bWasPlaying; CChoreoScene *m_pScene; struct QueuedEvents_t { float starttime; CChoreoScene *scene; CChoreoEvent *event; }; CUtlVector< QueuedEvents_t > m_QueuedEvents; }; #endif // C_SCENEENTITY_H