summaryrefslogtreecommitdiff
path: root/game/server/baseflex.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/baseflex.h')
-rw-r--r--game/server/baseflex.h302
1 files changed, 302 insertions, 0 deletions
diff --git a/game/server/baseflex.h b/game/server/baseflex.h
new file mode 100644
index 0000000..1f0009e
--- /dev/null
+++ b/game/server/baseflex.h
@@ -0,0 +1,302 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef BASEFLEX_H
+#define BASEFLEX_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "BaseAnimatingOverlay.h"
+#include "utlvector.h"
+#include "utlrbtree.h"
+#include "sceneentity_shared.h"
+
+struct flexsettinghdr_t;
+struct flexsetting_t;
+class AI_Response;
+
+//-----------------------------------------------------------------------------
+// Purpose: A .vfe referenced by a scene during .vcd playback
+//-----------------------------------------------------------------------------
+class CFlexSceneFile
+{
+public:
+ enum
+ {
+ MAX_FLEX_FILENAME = 128,
+ };
+
+ char filename[ MAX_FLEX_FILENAME ];
+ void *buffer;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Animated characters who have vertex flex capability (e.g., facial expressions)
+//-----------------------------------------------------------------------------
+class CBaseFlex : public CBaseAnimatingOverlay
+{
+ DECLARE_CLASS( CBaseFlex, CBaseAnimatingOverlay );
+public:
+ DECLARE_SERVERCLASS();
+ DECLARE_DATADESC();
+ DECLARE_PREDICTABLE();
+
+ // Construction
+ CBaseFlex( void );
+ ~CBaseFlex( void );
+
+ virtual void SetModel( const char *szModelName );
+
+ void Blink( );
+
+ virtual void SetViewtarget( const Vector &viewtarget );
+ const Vector &GetViewtarget( void ) const;
+
+ void SetFlexWeight( char *szName, float value );
+ void SetFlexWeight( LocalFlexController_t index, float value );
+ float GetFlexWeight( char *szName );
+ float GetFlexWeight( LocalFlexController_t index );
+
+ // Look up flex controller index by global name
+ LocalFlexController_t FindFlexController( const char *szName );
+ void EnsureTranslations( const flexsettinghdr_t *pSettinghdr );
+
+ // Keep track of what scenes are being played
+ void StartChoreoScene( CChoreoScene *scene );
+ void RemoveChoreoScene( CChoreoScene *scene, bool canceled = false );
+
+ // Start the specifics of an scene event
+ virtual bool StartSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget );
+
+ // Manipulation of events for the object
+ // Should be called by think function to process all scene events
+ // The default implementation resets m_flexWeight array and calls
+ // AddSceneEvents
+ virtual void ProcessSceneEvents( void );
+
+ // Assumes m_flexWeight array has been set up, this adds the actual currently playing
+ // expressions to the flex weights and adds other scene events as needed
+ virtual bool ProcessSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+
+ // Remove all playing events
+ void ClearSceneEvents( CChoreoScene *scene, bool canceled );
+
+ // Stop specifics of event
+ virtual bool ClearSceneEvent( CSceneEventInfo *info, bool fastKill, bool canceled );
+
+ // Add the event to the queue for this actor
+ void AddSceneEvent( CChoreoScene *scene, CChoreoEvent *event, CBaseEntity *pTarget = NULL );
+
+ // Remove the event from the queue for this actor
+ void RemoveSceneEvent( CChoreoScene *scene, CChoreoEvent *event, bool fastKill );
+
+ // Checks to see if the event should be considered "completed"
+ bool CheckSceneEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
+
+ // Checks to see if a event should be considered "completed"
+ virtual bool CheckSceneEventCompletion( CSceneEventInfo *info, float currenttime, CChoreoScene *scene, CChoreoEvent *event );
+
+ // Finds the layer priority of the current scene
+ int GetScenePriority( CChoreoScene *scene );
+
+ // Returns true if the actor is not currently in a scene OR if the actor
+ // is in a scene, but a PERMIT_RESPONSES event is active and the permit time
+ // period has enough time remaining to handle the response in full.
+ bool PermitResponse( float response_length );
+
+ // Set response end time (0 to clear response blocking)
+ void SetPermitResponse( float endtime );
+
+ void SentenceStop( void ) { EmitSound( "AI_BaseNPC.SentenceStop" ); }
+
+ virtual float PlayScene( const char *pszScene, float flDelay = 0.0f, AI_Response *response = NULL, IRecipientFilter *filter = NULL );
+ virtual float PlayAutoGeneratedSoundScene( const char *soundname );
+
+ virtual int GetSpecialDSP( void ) { return 0; }
+
+protected:
+ // For handling .vfe files
+ // Search list, or add if not in list
+ const void *FindSceneFile( const char *filename );
+
+ // Find setting by name
+ const flexsetting_t *FindNamedSetting( const flexsettinghdr_t *pSettinghdr, const char *expr );
+
+ // Called at the lowest level to actually apply an expression
+ void AddFlexSetting( const char *expr, float scale, const flexsettinghdr_t *pSettinghdr, bool newexpression );
+
+ // Called at the lowest level to actually apply a flex animation
+ void AddFlexAnimation( CSceneEventInfo *info );
+
+ bool HasSceneEvents() const;
+ bool IsRunningSceneMoveToEvent();
+
+ LocalFlexController_t FlexControllerLocalToGlobal( const flexsettinghdr_t *pSettinghdr, int key );
+
+private:
+ // Starting various expression types
+
+ bool RequestStartSequenceSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget );
+ bool RequestStartGestureSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget );
+
+ bool HandleStartSequenceSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor );
+ bool HandleStartGestureSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor );
+ bool StartFacingSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget );
+ bool StartMoveToSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget );
+
+ // Processing various expression types
+ bool ProcessFlexAnimationSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessFlexSettingSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessSequenceSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessGestureSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessFacingSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessMoveToSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+ bool ProcessLookAtSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event );
+
+ // Set playing the scene sequence
+public:
+ bool EnterSceneSequence( CChoreoScene *scene, CChoreoEvent *event, bool bRestart = false );
+private:
+ bool ExitSceneSequence( void );
+
+private:
+ CNetworkArray( float, m_flexWeight, MAXSTUDIOFLEXCTRL ); // indexed by model local flexcontroller
+
+ // Vector from actor to eye target
+ CNetworkVector( m_viewtarget );
+
+ // Blink state
+ CNetworkVar( int, m_blinktoggle );
+
+ // Array of active SceneEvents, in order oldest to newest
+ CUtlVector < CSceneEventInfo > m_SceneEvents;
+
+ // Mapping for each loaded scene file used by this actor
+ struct FS_LocalToGlobal_t
+ {
+ explicit FS_LocalToGlobal_t() :
+ m_Key( 0 ),
+ m_nCount( 0 ),
+ m_Mapping( 0 )
+ {
+ }
+
+ explicit FS_LocalToGlobal_t( const flexsettinghdr_t *key ) :
+ m_Key( key ),
+ m_nCount( 0 ),
+ m_Mapping( 0 )
+ {
+ }
+
+ void SetCount( int count )
+ {
+ Assert( !m_Mapping );
+ Assert( count > 0 );
+ m_nCount = count;
+ m_Mapping = new LocalFlexController_t[ m_nCount ];
+ Q_memset( m_Mapping, 0, m_nCount * sizeof( int ) );
+ }
+
+ FS_LocalToGlobal_t( const FS_LocalToGlobal_t& src )
+ {
+ m_Key = src.m_Key;
+ delete m_Mapping;
+ m_Mapping = new LocalFlexController_t[ src.m_nCount ];
+ Q_memcpy( m_Mapping, src.m_Mapping, src.m_nCount * sizeof( int ) );
+
+ m_nCount = src.m_nCount;
+ }
+
+ ~FS_LocalToGlobal_t()
+ {
+ delete m_Mapping;
+ m_nCount = 0;
+ m_Mapping = 0;
+ }
+
+ const flexsettinghdr_t *m_Key;
+ int m_nCount;
+ LocalFlexController_t *m_Mapping;
+ };
+
+ static bool FlexSettingLessFunc( const FS_LocalToGlobal_t& lhs, const FS_LocalToGlobal_t& rhs );
+
+ CUtlRBTree< FS_LocalToGlobal_t, unsigned short > m_LocalToGlobal;
+
+ // The NPC is in a scene, but another .vcd (such as a short wave to say in response to the player doing something )
+ // can be layered on top of this actor (assuming duration matches, etc.
+ float m_flAllowResponsesEndTime;
+
+ // List of actively playing scenes
+ CUtlVector < CChoreoScene * > m_ActiveChoreoScenes;
+ bool m_bUpdateLayerPriorities;
+
+public:
+ bool IsSuppressedFlexAnimation( CSceneEventInfo *info );
+
+private:
+ // last time a foreground flex animation was played
+ float m_flLastFlexAnimationTime;
+
+
+public:
+ void DoBodyLean( void );
+
+ virtual void Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );
+
+
+#ifdef HL2_DLL
+ Vector m_vecPrevOrigin;
+ Vector m_vecPrevVelocity;
+ CNetworkVector( m_vecLean );
+ CNetworkVector( m_vecShift );
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// For toggling blinking
+//-----------------------------------------------------------------------------
+inline void CBaseFlex::Blink()
+{
+ m_blinktoggle = !m_blinktoggle;
+}
+
+//-----------------------------------------------------------------------------
+// Do we have active expressions?
+//-----------------------------------------------------------------------------
+inline bool CBaseFlex::HasSceneEvents() const
+{
+ return m_SceneEvents.Count() != 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Other inlines
+//-----------------------------------------------------------------------------
+inline const Vector &CBaseFlex::GetViewtarget( ) const
+{
+ return m_viewtarget.Get(); // bah
+}
+
+inline void CBaseFlex::SetFlexWeight( char *szName, float value )
+{
+ SetFlexWeight( FindFlexController( szName ), value );
+}
+
+inline float CBaseFlex::GetFlexWeight( char *szName )
+{
+ return GetFlexWeight( FindFlexController( szName ) );
+}
+
+
+EXTERN_SEND_TABLE(DT_BaseFlex);
+
+
+#endif // BASEFLEX_H