diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /sp/src/game/shared/choreoevent.h | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'sp/src/game/shared/choreoevent.h')
| -rw-r--r-- | sp/src/game/shared/choreoevent.h | 1416 |
1 files changed, 708 insertions, 708 deletions
diff --git a/sp/src/game/shared/choreoevent.h b/sp/src/game/shared/choreoevent.h index 6af7810d..ad4828d3 100644 --- a/sp/src/game/shared/choreoevent.h +++ b/sp/src/game/shared/choreoevent.h @@ -1,708 +1,708 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#ifndef CHOREOEVENT_H
-#define CHOREOEVENT_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-class CChoreoActor;
-class CChoreoChannel;
-class CChoreoEvent;
-class CChoreoScene;
-class IChoreoEventCallback;
-class CAudioMixer;
-class CUtlBuffer;
-class IChoreoStringPool;
-
-
-#include "tier1/utlstring.h"
-#include "tier1/utlvector.h"
-#include "expressionsample.h"
-#include "networkvar.h"
-#include "localflexcontroller.h"
-
-typedef CUtlString ChoreoStr_t;
-
-//-----------------------------------------------------------------------------
-// Purpose: SPEAK events can have "relative tags" that other objects can reference
-// to specify their start times off of
-//-----------------------------------------------------------------------------
-class CEventRelativeTag
-{
-public:
- DECLARE_CLASS_NOBASE( CEventRelativeTag );
-
- enum
- {
- MAX_EVENTTAG_LENGTH = 128,
- };
-
- CEventRelativeTag( CChoreoEvent *owner, const char *name, float percentage );
- CEventRelativeTag( const CEventRelativeTag& src );
-
- const char *GetName( void );
- float GetPercentage( void );
- void SetPercentage( float percentage );
-
- // Returns the corrected time based on the owner's length and start time
- float GetStartTime( void );
- CChoreoEvent *GetOwner( void );
- void SetOwner( CChoreoEvent *event );
-
-protected:
-
- ChoreoStr_t m_Name;
- float m_flPercentage;
- CChoreoEvent *m_pOwner;
-};
-
-//-----------------------------------------------------------------------------
-// Purpose: GESTURE events can have "absolute tags" (where the value is not a
-// percentage, but an actual timestamp from the start of the event)
-//-----------------------------------------------------------------------------
-class CEventAbsoluteTag
-{
-public:
- enum
- {
- MAX_EVENTTAG_LENGTH = 128,
- };
-
- CEventAbsoluteTag( CChoreoEvent *owner, const char *name, float percentage );
- CEventAbsoluteTag( const CEventAbsoluteTag& src );
-
- const char *GetName( void );
-
- float GetPercentage( void );
- void SetPercentage( float percentage );
-
- float GetEventTime( void );
- void SetEventTime( float t );
-
- float GetAbsoluteTime( void );
- void SetAbsoluteTime( float t );
-
- CChoreoEvent *GetOwner( void );
- void SetOwner( CChoreoEvent *event );
-
- void SetLocked( bool bLocked );
- bool GetLocked( void );
-
- void SetLinear( bool bLinear );
- bool GetLinear( void );
-
- void SetEntry( bool bEntry );
- bool GetEntry( void );
-
- void SetExit( bool bExit );
- bool GetExit( void );
-
-protected:
-
- ChoreoStr_t m_Name;
- float m_flPercentage;
- bool m_bLocked:1;
- bool m_bLinear:1;
- bool m_bEntry:1;
- bool m_bExit:1;
- CChoreoEvent *m_pOwner;
-};
-
-//-----------------------------------------------------------------------------
-// Purpose: FLEXANIMATION events can have "timing tags" that are used to align and
-// manipulate flex animation curves
-//-----------------------------------------------------------------------------
-class CFlexTimingTag : public CEventRelativeTag
-{
- DECLARE_CLASS( CFlexTimingTag, CEventRelativeTag );
-
-public:
- CFlexTimingTag( CChoreoEvent *owner, const char *name, float percentage, bool locked );
- CFlexTimingTag( const CFlexTimingTag& src );
-
- bool GetLocked( void );
- void SetLocked( bool locked );
-
-protected:
- bool m_bLocked;
-};
-
-//-----------------------------------------------------------------------------
-// Purpose: A flex controller position can be animated over a period of time
-//-----------------------------------------------------------------------------
-class CFlexAnimationTrack
-{
-public:
- enum
- {
- MAX_CONTROLLER_NAME = 128,
- };
-
- CFlexAnimationTrack( CChoreoEvent *event );
- CFlexAnimationTrack( const CFlexAnimationTrack* src );
- virtual ~CFlexAnimationTrack( void );
-
- void SetEvent( CChoreoEvent *event );
- CChoreoEvent *GetEvent( void );
-
- void SetFlexControllerName( const char *name );
- char const *GetFlexControllerName( void );
-
- void SetComboType( bool combo );
- bool IsComboType( void );
-
- void SetMin( float value );
- void SetMax( float value );
- float GetMin( int type = 0 );
- float GetMax( int type = 0 );
-
- bool IsInverted( void );
- void SetInverted( bool isInverted );
-
- int GetNumSamples( int type = 0 );
- CExpressionSample *GetSample( int index, int type = 0 );
-
- bool IsTrackActive( void );
- void SetTrackActive( bool active );
-
- // returns scaled value for absolute time per left/right side
- float GetIntensity( float time, int side = 0 );
-
- CExpressionSample *AddSample( float time, float value, int type = 0 );
- void RemoveSample( int index, int type = 0 );
- void Clear( void );
-
- void Resort( int type = 0 );
-
- // Puts in dummy start/end samples to spline to zero ( or 0.5 for
- // left/right data) at the origins
- CExpressionSample *GetBoundedSample( int number, bool& bClamped, int type = 0 );
-
- int GetFlexControllerIndex( int side = 0 );
- LocalFlexController_t GetRawFlexControllerIndex( int side = 0 );
- void SetFlexControllerIndex( LocalFlexController_t raw, int index, int side = 0 );
-
- // returns 0..1 value for 0..1 time fraction per mag/balance
- float GetFracIntensity( float time, int type );
-
- // retrieves raw intensity values (for mag vs. left/right slider setting)
- float GetSampleIntensity( float time );
- float GetBalanceIntensity( float time );
-
- void SetEdgeInfo( bool leftEdge, int curveType, float zero );
- void GetEdgeInfo( bool leftEdge, int& curveType, float& zero ) const;
- void SetEdgeActive( bool leftEdge, bool state );
- bool IsEdgeActive( bool leftEdge ) const;
- int GetEdgeCurveType( bool leftEdge ) const;
- float GetEdgeZeroValue( bool leftEdge ) const;
-
- float GetDefaultEdgeZeroPos() const;
-
- void SetServerSide( bool state );
- bool IsServerSide() const;
-private:
- // remove any samples after endtime
- void RemoveOutOfRangeSamples( int type );
-
- // returns scaled value for absolute time per mag/balance
- float GetIntensityInternal( float time, int type );
-
-public:
- // returns the fractional (0..1) value for "zero" based on Min/Max ranges
- float GetZeroValue( int type, bool leftSide );
-
-
-private:
- char *m_pControllerName;
-
- // base track has range, combo is always 0..1
- float m_flMin;
- float m_flMax;
-
- // 0 == magnitude
- // 1 == left/right
- CUtlVector< CExpressionSample > m_Samples[ 2 ];
- int m_nFlexControllerIndex[ 2 ];
- LocalFlexController_t m_nFlexControllerIndexRaw[ 2 ];
-
- // For left and right edge of type 0 flex data ( magnitude track )
- EdgeInfo_t m_EdgeInfo[ 2 ];
-
- CChoreoEvent *m_pEvent;
-
- // Is track active
- bool m_bActive:1;
-
- // Is this a combo (magnitude + stereo) track
- bool m_bCombo:1;
- bool m_bServerSide:1;
-
- bool m_bInverted; // track is displayed 1..0 instead of 0..1
-};
-
-
-//-----------------------------------------------------------------------------
-// Purpose: The generic scene event type
-//-----------------------------------------------------------------------------
-class CChoreoEvent : public ICurveDataAccessor
-{
-public:
- // Type of event this object represents
- typedef enum
- {
- // Don't know yet
- UNSPECIFIED = 0,
-
- // Section start/end
- SECTION,
-
- // Play an expression
- EXPRESSION,
-
- // Look at another actor
- LOOKAT,
-
- // Move to a location
- MOVETO,
-
- // Speak/visemes a wave file
- SPEAK,
-
- // Play a gesture
- GESTURE,
-
- // Play a sequence
- SEQUENCE,
-
- // Face another actor
- FACE,
-
- // Fire a trigger
- FIRETRIGGER,
-
- // One or more flex sliders animated over the course of the event time period
- FLEXANIMATION,
-
- // A contained .vcd file
- SUBSCENE,
-
- // Loop back to previous time (forever or up to N times)
- LOOP,
-
- // A time span during which the scene may be temporarily interrupted
- INTERRUPT,
-
- // A dummy event that is used to mark the .vcd end time
- STOPPOINT,
-
- // A time span during which this actor can respond to events happening in the world, etc.
- PERMIT_RESPONSES,
-
- // A string passed to the game code for interpretation
- GENERIC,
-
- // THIS MUST BE LAST!!!
- NUM_TYPES,
- } EVENTTYPE;
-
- enum
- {
- MAX_TAGNAME_STRING = 128,
- MAX_CCTOKEN_STRING = 64,
- };
-
- typedef enum
- {
- DEFAULT = 0,
- SIMULATION,
- DISPLAY,
- } TIMETYPE;
-
- typedef enum
- {
- CC_MASTER = 0, // default, implied
- CC_SLAVE,
- CC_DISABLED,
-
- NUM_CC_TYPES,
- } CLOSECAPTION;
-
- static int s_nGlobalID;
-
- // Construction
- CChoreoEvent( CChoreoScene *scene );
- CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name );
- CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name, const char *param );
-
- // Assignment
- CChoreoEvent& operator=(const CChoreoEvent& src );
-
- ~CChoreoEvent( void );
-
- // ICurveDataAccessor methods
- virtual bool CurveHasEndTime();
- virtual int GetDefaultCurveType();
-
- // Binary serialization
- void SaveToBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool );
- bool RestoreFromBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool );
-
- // Accessors
- EVENTTYPE GetType( void );
- void SetType( EVENTTYPE type );
-
- void SetName( const char *name );
- const char *GetName( void );
-
- void SetParameters( const char *target );
- const char *GetParameters( void );
- void SetParameters2( const char *target );
- const char *GetParameters2( void );
- void SetParameters3( const char *target );
- const char *GetParameters3( void );
-
- void SetStartTime( float starttime );
- float GetStartTime( void );
-
- void SetEndTime( float endtime );
- float GetEndTime( void );
-
- float GetDuration( void );
-
- void SetResumeCondition( bool resumecondition );
- bool IsResumeCondition( void );
-
- void SetLockBodyFacing( bool lockbodyfacing );
- bool IsLockBodyFacing( void );
-
- void SetDistanceToTarget( float distancetotarget );
- float GetDistanceToTarget( void );
-
- void SetForceShortMovement( bool bForceShortMovement );
- bool GetForceShortMovement( void );
-
- void SetSyncToFollowingGesture( bool bSyncToFollowingGesture );
- bool GetSyncToFollowingGesture( void );
-
- void SetPlayOverScript( bool bPlayOverScript );
- bool GetPlayOverScript( void );
-
- int GetRampCount( void ) { return m_Ramp.GetCount(); };
- CExpressionSample *GetRamp( int index ) { return m_Ramp.Get( index ); };
- CExpressionSample *AddRamp( float time, float value, bool selected ) { return m_Ramp.Add( time, value, selected ); };
- void DeleteRamp( int index ) { m_Ramp.Delete( index ); };
- void ClearRamp( void ) { m_Ramp.Clear(); };
- void ResortRamp( void ) { m_Ramp.Resort( this ); };
- CCurveData *GetRamp( void ) { return &m_Ramp; };
-
- float GetRampIntensity( float time ) { return m_Ramp.GetIntensity( this, time ); };
-
- // Calculates weighting for a given time
- float GetIntensity( float scenetime );
- float GetIntensityArea( float scenetime );
-
- // Calculates 0..1 completion for a given time
- float GetCompletion( float time );
-
- // An end time of -1.0f means that the events is just triggered at the leading edge
- bool HasEndTime( void );
-
- // Is the event something that can be sized ( a wave file, e.g. )
- bool IsFixedLength( void );
- void SetFixedLength( bool isfixedlength );
-
- // Move the start/end/both times by the specified dt (fixes up -1.0f endtimes)
- void OffsetStartTime( float dt );
- void OffsetEndTime( float dt );
- void OffsetTime( float dt );
-
- // Snap to scene framerate
- void SnapTimes( void );
- float SnapTime( float t );
-
- CChoreoScene *GetScene( void );
- void SetScene( CChoreoScene *scene );
-
- // The actor the event is associated with
- void SetActor( CChoreoActor *actor );
- CChoreoActor *GetActor( void );
-
- // The channel the event is associated with
- void SetChannel( CChoreoChannel *channel );
- CChoreoChannel *GetChannel( void );
-
- // Get a more involved description of the event
- const char *GetDescription( void );
-
- void ClearAllRelativeTags( void );
- int GetNumRelativeTags( void );
- CEventRelativeTag *GetRelativeTag( int tagnum );
- CEventRelativeTag *FindRelativeTag( const char *tagname );
- void AddRelativeTag( const char *tagname, float percentage );
- void RemoveRelativeTag( const char *tagname );
-
- bool IsUsingRelativeTag( void );
- void SetUsingRelativeTag( bool usetag, const char *tagname = 0, const char *wavname = 0);
- const char *GetRelativeTagName( void );
- const char *GetRelativeWavName( void );
-
- // Absolute tags
- typedef enum
- {
- PLAYBACK = 0, // new timeline - FIXME: should be stored as an absolute time
- ORIGINAL, // original timeline - FIXME: should be stored at a fixed percentage of event
-
- NUM_ABS_TAG_TYPES,
- } AbsTagType;
-
- void SetGestureSequenceDuration( float duration );
- bool GetGestureSequenceDuration( float& duration );
-
- void ClearAllAbsoluteTags( AbsTagType type );
- int GetNumAbsoluteTags( AbsTagType type );
- CEventAbsoluteTag *GetAbsoluteTag( AbsTagType type, int tagnum );
- CEventAbsoluteTag *FindAbsoluteTag( AbsTagType type, const char *tagname );
- void AddAbsoluteTag( AbsTagType type, const char *tagname, float t );
- void RemoveAbsoluteTag( AbsTagType type, const char *tagname );
- bool VerifyTagOrder( void );
- float GetOriginalPercentageFromPlaybackPercentage( float t );
- float GetPlaybackPercentageFromOriginalPercentage( float t );
-
- static const char *NameForAbsoluteTagType( AbsTagType t );
- static AbsTagType TypeForAbsoluteTagName( const char *name );
-
- void RescaleGestureTimes( float newstart, float newend, bool bMaintainAbsoluteTagPositions );
- bool PreventTagOverlap( void );
-
- CEventAbsoluteTag *FindEntryTag( AbsTagType type );
- CEventAbsoluteTag *FindExitTag( AbsTagType type );
-
- // Flex animation type
- int GetNumFlexAnimationTracks( void );
- CFlexAnimationTrack *GetFlexAnimationTrack( int index );
- CFlexAnimationTrack *AddTrack( const char *controllername );
- CFlexAnimationTrack *FindTrack( const char *controllername );
- void RemoveTrack( int index );
- void RemoveAllTracks( void );
- void OnEndTimeChanged( void );
-
- bool GetTrackLookupSet( void );
- void SetTrackLookupSet( bool set );
-
- // Flex Timing Tags (used by editor only)
- void ClearAllTimingTags( void );
- int GetNumTimingTags( void );
- CFlexTimingTag *GetTimingTag( int tagnum );
- CFlexTimingTag *FindTimingTag( const char *tagname );
- void AddTimingTag( const char *tagname, float percentage, bool locked );
- void RemoveTimingTag( const char *tagname );
-
- // Subscene ( embedded .vcd ) support
- void SetSubScene( CChoreoScene *scene );
- CChoreoScene *GetSubScene( void );
-
- bool IsProcessing( void ) const;
- void StartProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
- void ContinueProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
- void StopProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
- bool CheckProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
- void ResetProcessing( void );
-
- void SetMixer( CAudioMixer *mixer );
- CAudioMixer *GetMixer( void ) const;
-
- // Hack for LOOKAT in editor
- int GetPitch( void ) const;
- void SetPitch( int pitch );
- int GetYaw( void ) const;
- void SetYaw( int yaw );
-
- // For LOOP events
- void SetLoopCount( int numloops );
- int GetLoopCount( void );
- int GetNumLoopsRemaining( void );
- void SetNumLoopsRemaining( int loops );
-
- bool IsMarkedForSave() const { return m_bMarkedForSave; }
- void SetMarkedForSave( bool mark ) { m_bMarkedForSave = mark; }
-
- void GetMovementStyle( char *style, int maxlen );
- void GetDistanceStyle( char *style, int maxlen );
-
- int GetGlobalID() const { return m_nGlobalID; }
-
- // Localization/CC support (close captioning and multiple wave file recombination)
- void SetCloseCaptionType( CLOSECAPTION type );
- CLOSECAPTION GetCloseCaptionType() const;
- void SetCloseCaptionToken( char const *token );
- char const *GetCloseCaptionToken() const;
- void SetUsingCombinedFile( bool isusing );
- bool IsUsingCombinedFile() const;
- void SetRequiredCombinedChecksum( unsigned int checksum );
- unsigned int GetRequiredCombinedChecksum();
- void SetNumSlaves( int num );
- int GetNumSlaves() const;
- void SetLastSlaveEndTime( float t );
- float GetLastSlaveEndTime() const;
- void SetCloseCaptionTokenValid( bool valid );
- bool GetCloseCaptionTokenValid() const;
-
- bool ComputeCombinedBaseFileName( char *dest, int destlen, bool creategenderwildcard );
- bool IsCombinedUsingGenderToken() const;
- void SetCombinedUsingGenderToken( bool using_gender );
-
- bool IsSuppressingCaptionAttenuation() const;
- void SetSuppressingCaptionAttenuation( bool suppress );
-
- int ValidateCombinedFile();
-
- // This returns false if the wave is CC_DISABLED or is a CC_SLAVE,
- // otherwise it returns the actual m_szCCToken value, or if that's
- // blank it'll return the sounds.txt entry name (m_szParameters)
- bool GetPlaybackCloseCaptionToken( char *dest, int destlen );
-
- void ClearEventDependencies();
- void AddEventDependency( CChoreoEvent *other );
- void GetEventDependencies( CUtlVector< CChoreoEvent * >& list );
-
- void SetActive( bool state );
- bool GetActive() const;
-
- void SetDefaultCurveType( int nCurveType );
-
- // Turn enum into string and vice versa
- static EVENTTYPE TypeForName( const char *name );
- static const char *NameForType( EVENTTYPE type );
-
- // Turn enum into string and vice versa
- static CLOSECAPTION CCTypeForName( const char *name );
- static const char *NameForCCType( CLOSECAPTION type );
-
-private:
-
- // Declare copy constructor private to prevent accidental usage...
- CChoreoEvent(const CChoreoEvent& src );
-
- void SaveFlexAnimationsToBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool );
- bool RestoreFlexAnimationsFromBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool );
-
- float GetBoundedAbsoluteTagPercentage( AbsTagType type, int tagnum );
-
- float _GetIntensity( float time );
-
- // String bounds
- enum
- {
- MAX_CHOREOEVENT_NAME = 128,
- MAX_PARAMETERS_STRING = 128,
- };
-
- // Base initialization
- void Init( CChoreoScene *scene );
-
- // Type of event
- byte m_fType;
-
- // Close caption type
- byte m_ccType;
-
- // Name of event
- ChoreoStr_t m_Name;
-
- // Event parameters
- ChoreoStr_t m_Parameters;
- ChoreoStr_t m_Parameters2;
- ChoreoStr_t m_Parameters3;
-
- // Event start time
- float m_flStartTime;
-
- // Event end time ( -1.0f means no ending, just leading edge triggered )
- float m_flEndTime;
-
- // Duration of underlying gesture sequence
- float m_flGestureSequenceDuration;
-
- // For CChoreoEvent::LOOP
- int m_nNumLoops; // -1 == no limit
- int m_nLoopsRemaining;
-
- // Overall intensity curve
- CCurveData m_Ramp;
-
- // Start time is computed based on length of item referenced by tagged name
- ChoreoStr_t m_TagName;
- ChoreoStr_t m_TagWavName;
-
- // Associated actor
- CChoreoActor *m_pActor;
- // Associated channel
- CChoreoChannel *m_pChannel;
-
- CUtlVector < CEventRelativeTag > m_RelativeTags;
- CUtlVector < CFlexTimingTag > m_TimingTags;
- CUtlVector < CEventAbsoluteTag > m_AbsoluteTags[ NUM_ABS_TAG_TYPES ];
-
- CUtlVector < CFlexAnimationTrack * > m_FlexAnimationTracks;
-
- CChoreoScene *m_pSubScene;
- CAudioMixer *m_pMixer;
-
- // Scene which owns this event
- CChoreoScene *m_pScene;
-
- int m_nPitch;
- int m_nYaw;
-
- float m_flDistanceToTarget;
-
- int m_nGlobalID;
-
- ChoreoStr_t m_CCToken;
- unsigned int m_uRequiredCombinedChecksum;
- // on master only, the combined file must have the same checksum to be useable
- int m_nNumSlaves;
- // Only set on master, helps UI draw underbar
- float m_flLastSlaveEndTime;
- // true if the cc token was found in the cc manager's database
-
- CUtlVector< CChoreoEvent * > m_Dependencies;
-
- int m_nDefaultCurveType;
-
-public:
- // used only during scrubbing of looping sequences
- float m_flPrevCycle;
- float m_flPrevTime;
-
- // Flags
-
- bool m_bFixedLength:1;
- // True if this event must be "finished" before the next section can be started
- // after playback is paused from a globalevent
- bool m_bResumeCondition:1;
- bool m_bUsesTag:1;
- bool m_bTrackLookupSet:1;
- bool m_bProcessing:1;
- bool m_bLockBodyFacing:1;
- // Purely for save/load
- bool m_bMarkedForSave:1;
- bool m_bUsingCombinedSoundFile:1;
- bool m_bCCTokenValid:1;
- bool m_bCombinedUsingGenderToken:1;
-
- bool m_bSuppressCaptionAttenuation:1;
-
- bool m_bForceShortMovement:1;
- bool m_bSyncToFollowingGesture:1;
- bool m_bActive:1;
- bool m_bPlayOverScript:1;
-};
-
-#endif // CHOREOEVENT_H
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef CHOREOEVENT_H +#define CHOREOEVENT_H +#ifdef _WIN32 +#pragma once +#endif + +class CChoreoActor; +class CChoreoChannel; +class CChoreoEvent; +class CChoreoScene; +class IChoreoEventCallback; +class CAudioMixer; +class CUtlBuffer; +class IChoreoStringPool; + + +#include "tier1/utlstring.h" +#include "tier1/utlvector.h" +#include "expressionsample.h" +#include "networkvar.h" +#include "localflexcontroller.h" + +typedef CUtlString ChoreoStr_t; + +//----------------------------------------------------------------------------- +// Purpose: SPEAK events can have "relative tags" that other objects can reference +// to specify their start times off of +//----------------------------------------------------------------------------- +class CEventRelativeTag +{ +public: + DECLARE_CLASS_NOBASE( CEventRelativeTag ); + + enum + { + MAX_EVENTTAG_LENGTH = 128, + }; + + CEventRelativeTag( CChoreoEvent *owner, const char *name, float percentage ); + CEventRelativeTag( const CEventRelativeTag& src ); + + const char *GetName( void ); + float GetPercentage( void ); + void SetPercentage( float percentage ); + + // Returns the corrected time based on the owner's length and start time + float GetStartTime( void ); + CChoreoEvent *GetOwner( void ); + void SetOwner( CChoreoEvent *event ); + +protected: + + ChoreoStr_t m_Name; + float m_flPercentage; + CChoreoEvent *m_pOwner; +}; + +//----------------------------------------------------------------------------- +// Purpose: GESTURE events can have "absolute tags" (where the value is not a +// percentage, but an actual timestamp from the start of the event) +//----------------------------------------------------------------------------- +class CEventAbsoluteTag +{ +public: + enum + { + MAX_EVENTTAG_LENGTH = 128, + }; + + CEventAbsoluteTag( CChoreoEvent *owner, const char *name, float percentage ); + CEventAbsoluteTag( const CEventAbsoluteTag& src ); + + const char *GetName( void ); + + float GetPercentage( void ); + void SetPercentage( float percentage ); + + float GetEventTime( void ); + void SetEventTime( float t ); + + float GetAbsoluteTime( void ); + void SetAbsoluteTime( float t ); + + CChoreoEvent *GetOwner( void ); + void SetOwner( CChoreoEvent *event ); + + void SetLocked( bool bLocked ); + bool GetLocked( void ); + + void SetLinear( bool bLinear ); + bool GetLinear( void ); + + void SetEntry( bool bEntry ); + bool GetEntry( void ); + + void SetExit( bool bExit ); + bool GetExit( void ); + +protected: + + ChoreoStr_t m_Name; + float m_flPercentage; + bool m_bLocked:1; + bool m_bLinear:1; + bool m_bEntry:1; + bool m_bExit:1; + CChoreoEvent *m_pOwner; +}; + +//----------------------------------------------------------------------------- +// Purpose: FLEXANIMATION events can have "timing tags" that are used to align and +// manipulate flex animation curves +//----------------------------------------------------------------------------- +class CFlexTimingTag : public CEventRelativeTag +{ + DECLARE_CLASS( CFlexTimingTag, CEventRelativeTag ); + +public: + CFlexTimingTag( CChoreoEvent *owner, const char *name, float percentage, bool locked ); + CFlexTimingTag( const CFlexTimingTag& src ); + + bool GetLocked( void ); + void SetLocked( bool locked ); + +protected: + bool m_bLocked; +}; + +//----------------------------------------------------------------------------- +// Purpose: A flex controller position can be animated over a period of time +//----------------------------------------------------------------------------- +class CFlexAnimationTrack +{ +public: + enum + { + MAX_CONTROLLER_NAME = 128, + }; + + CFlexAnimationTrack( CChoreoEvent *event ); + CFlexAnimationTrack( const CFlexAnimationTrack* src ); + virtual ~CFlexAnimationTrack( void ); + + void SetEvent( CChoreoEvent *event ); + CChoreoEvent *GetEvent( void ); + + void SetFlexControllerName( const char *name ); + char const *GetFlexControllerName( void ); + + void SetComboType( bool combo ); + bool IsComboType( void ); + + void SetMin( float value ); + void SetMax( float value ); + float GetMin( int type = 0 ); + float GetMax( int type = 0 ); + + bool IsInverted( void ); + void SetInverted( bool isInverted ); + + int GetNumSamples( int type = 0 ); + CExpressionSample *GetSample( int index, int type = 0 ); + + bool IsTrackActive( void ); + void SetTrackActive( bool active ); + + // returns scaled value for absolute time per left/right side + float GetIntensity( float time, int side = 0 ); + + CExpressionSample *AddSample( float time, float value, int type = 0 ); + void RemoveSample( int index, int type = 0 ); + void Clear( void ); + + void Resort( int type = 0 ); + + // Puts in dummy start/end samples to spline to zero ( or 0.5 for + // left/right data) at the origins + CExpressionSample *GetBoundedSample( int number, bool& bClamped, int type = 0 ); + + int GetFlexControllerIndex( int side = 0 ); + LocalFlexController_t GetRawFlexControllerIndex( int side = 0 ); + void SetFlexControllerIndex( LocalFlexController_t raw, int index, int side = 0 ); + + // returns 0..1 value for 0..1 time fraction per mag/balance + float GetFracIntensity( float time, int type ); + + // retrieves raw intensity values (for mag vs. left/right slider setting) + float GetSampleIntensity( float time ); + float GetBalanceIntensity( float time ); + + void SetEdgeInfo( bool leftEdge, int curveType, float zero ); + void GetEdgeInfo( bool leftEdge, int& curveType, float& zero ) const; + void SetEdgeActive( bool leftEdge, bool state ); + bool IsEdgeActive( bool leftEdge ) const; + int GetEdgeCurveType( bool leftEdge ) const; + float GetEdgeZeroValue( bool leftEdge ) const; + + float GetDefaultEdgeZeroPos() const; + + void SetServerSide( bool state ); + bool IsServerSide() const; +private: + // remove any samples after endtime + void RemoveOutOfRangeSamples( int type ); + + // returns scaled value for absolute time per mag/balance + float GetIntensityInternal( float time, int type ); + +public: + // returns the fractional (0..1) value for "zero" based on Min/Max ranges + float GetZeroValue( int type, bool leftSide ); + + +private: + char *m_pControllerName; + + // base track has range, combo is always 0..1 + float m_flMin; + float m_flMax; + + // 0 == magnitude + // 1 == left/right + CUtlVector< CExpressionSample > m_Samples[ 2 ]; + int m_nFlexControllerIndex[ 2 ]; + LocalFlexController_t m_nFlexControllerIndexRaw[ 2 ]; + + // For left and right edge of type 0 flex data ( magnitude track ) + EdgeInfo_t m_EdgeInfo[ 2 ]; + + CChoreoEvent *m_pEvent; + + // Is track active + bool m_bActive:1; + + // Is this a combo (magnitude + stereo) track + bool m_bCombo:1; + bool m_bServerSide:1; + + bool m_bInverted; // track is displayed 1..0 instead of 0..1 +}; + + +//----------------------------------------------------------------------------- +// Purpose: The generic scene event type +//----------------------------------------------------------------------------- +class CChoreoEvent : public ICurveDataAccessor +{ +public: + // Type of event this object represents + typedef enum + { + // Don't know yet + UNSPECIFIED = 0, + + // Section start/end + SECTION, + + // Play an expression + EXPRESSION, + + // Look at another actor + LOOKAT, + + // Move to a location + MOVETO, + + // Speak/visemes a wave file + SPEAK, + + // Play a gesture + GESTURE, + + // Play a sequence + SEQUENCE, + + // Face another actor + FACE, + + // Fire a trigger + FIRETRIGGER, + + // One or more flex sliders animated over the course of the event time period + FLEXANIMATION, + + // A contained .vcd file + SUBSCENE, + + // Loop back to previous time (forever or up to N times) + LOOP, + + // A time span during which the scene may be temporarily interrupted + INTERRUPT, + + // A dummy event that is used to mark the .vcd end time + STOPPOINT, + + // A time span during which this actor can respond to events happening in the world, etc. + PERMIT_RESPONSES, + + // A string passed to the game code for interpretation + GENERIC, + + // THIS MUST BE LAST!!! + NUM_TYPES, + } EVENTTYPE; + + enum + { + MAX_TAGNAME_STRING = 128, + MAX_CCTOKEN_STRING = 64, + }; + + typedef enum + { + DEFAULT = 0, + SIMULATION, + DISPLAY, + } TIMETYPE; + + typedef enum + { + CC_MASTER = 0, // default, implied + CC_SLAVE, + CC_DISABLED, + + NUM_CC_TYPES, + } CLOSECAPTION; + + static int s_nGlobalID; + + // Construction + CChoreoEvent( CChoreoScene *scene ); + CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name ); + CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name, const char *param ); + + // Assignment + CChoreoEvent& operator=(const CChoreoEvent& src ); + + ~CChoreoEvent( void ); + + // ICurveDataAccessor methods + virtual bool CurveHasEndTime(); + virtual int GetDefaultCurveType(); + + // Binary serialization + void SaveToBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool ); + bool RestoreFromBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool ); + + // Accessors + EVENTTYPE GetType( void ); + void SetType( EVENTTYPE type ); + + void SetName( const char *name ); + const char *GetName( void ); + + void SetParameters( const char *target ); + const char *GetParameters( void ); + void SetParameters2( const char *target ); + const char *GetParameters2( void ); + void SetParameters3( const char *target ); + const char *GetParameters3( void ); + + void SetStartTime( float starttime ); + float GetStartTime( void ); + + void SetEndTime( float endtime ); + float GetEndTime( void ); + + float GetDuration( void ); + + void SetResumeCondition( bool resumecondition ); + bool IsResumeCondition( void ); + + void SetLockBodyFacing( bool lockbodyfacing ); + bool IsLockBodyFacing( void ); + + void SetDistanceToTarget( float distancetotarget ); + float GetDistanceToTarget( void ); + + void SetForceShortMovement( bool bForceShortMovement ); + bool GetForceShortMovement( void ); + + void SetSyncToFollowingGesture( bool bSyncToFollowingGesture ); + bool GetSyncToFollowingGesture( void ); + + void SetPlayOverScript( bool bPlayOverScript ); + bool GetPlayOverScript( void ); + + int GetRampCount( void ) { return m_Ramp.GetCount(); }; + CExpressionSample *GetRamp( int index ) { return m_Ramp.Get( index ); }; + CExpressionSample *AddRamp( float time, float value, bool selected ) { return m_Ramp.Add( time, value, selected ); }; + void DeleteRamp( int index ) { m_Ramp.Delete( index ); }; + void ClearRamp( void ) { m_Ramp.Clear(); }; + void ResortRamp( void ) { m_Ramp.Resort( this ); }; + CCurveData *GetRamp( void ) { return &m_Ramp; }; + + float GetRampIntensity( float time ) { return m_Ramp.GetIntensity( this, time ); }; + + // Calculates weighting for a given time + float GetIntensity( float scenetime ); + float GetIntensityArea( float scenetime ); + + // Calculates 0..1 completion for a given time + float GetCompletion( float time ); + + // An end time of -1.0f means that the events is just triggered at the leading edge + bool HasEndTime( void ); + + // Is the event something that can be sized ( a wave file, e.g. ) + bool IsFixedLength( void ); + void SetFixedLength( bool isfixedlength ); + + // Move the start/end/both times by the specified dt (fixes up -1.0f endtimes) + void OffsetStartTime( float dt ); + void OffsetEndTime( float dt ); + void OffsetTime( float dt ); + + // Snap to scene framerate + void SnapTimes( void ); + float SnapTime( float t ); + + CChoreoScene *GetScene( void ); + void SetScene( CChoreoScene *scene ); + + // The actor the event is associated with + void SetActor( CChoreoActor *actor ); + CChoreoActor *GetActor( void ); + + // The channel the event is associated with + void SetChannel( CChoreoChannel *channel ); + CChoreoChannel *GetChannel( void ); + + // Get a more involved description of the event + const char *GetDescription( void ); + + void ClearAllRelativeTags( void ); + int GetNumRelativeTags( void ); + CEventRelativeTag *GetRelativeTag( int tagnum ); + CEventRelativeTag *FindRelativeTag( const char *tagname ); + void AddRelativeTag( const char *tagname, float percentage ); + void RemoveRelativeTag( const char *tagname ); + + bool IsUsingRelativeTag( void ); + void SetUsingRelativeTag( bool usetag, const char *tagname = 0, const char *wavname = 0); + const char *GetRelativeTagName( void ); + const char *GetRelativeWavName( void ); + + // Absolute tags + typedef enum + { + PLAYBACK = 0, // new timeline - FIXME: should be stored as an absolute time + ORIGINAL, // original timeline - FIXME: should be stored at a fixed percentage of event + + NUM_ABS_TAG_TYPES, + } AbsTagType; + + void SetGestureSequenceDuration( float duration ); + bool GetGestureSequenceDuration( float& duration ); + + void ClearAllAbsoluteTags( AbsTagType type ); + int GetNumAbsoluteTags( AbsTagType type ); + CEventAbsoluteTag *GetAbsoluteTag( AbsTagType type, int tagnum ); + CEventAbsoluteTag *FindAbsoluteTag( AbsTagType type, const char *tagname ); + void AddAbsoluteTag( AbsTagType type, const char *tagname, float t ); + void RemoveAbsoluteTag( AbsTagType type, const char *tagname ); + bool VerifyTagOrder( void ); + float GetOriginalPercentageFromPlaybackPercentage( float t ); + float GetPlaybackPercentageFromOriginalPercentage( float t ); + + static const char *NameForAbsoluteTagType( AbsTagType t ); + static AbsTagType TypeForAbsoluteTagName( const char *name ); + + void RescaleGestureTimes( float newstart, float newend, bool bMaintainAbsoluteTagPositions ); + bool PreventTagOverlap( void ); + + CEventAbsoluteTag *FindEntryTag( AbsTagType type ); + CEventAbsoluteTag *FindExitTag( AbsTagType type ); + + // Flex animation type + int GetNumFlexAnimationTracks( void ); + CFlexAnimationTrack *GetFlexAnimationTrack( int index ); + CFlexAnimationTrack *AddTrack( const char *controllername ); + CFlexAnimationTrack *FindTrack( const char *controllername ); + void RemoveTrack( int index ); + void RemoveAllTracks( void ); + void OnEndTimeChanged( void ); + + bool GetTrackLookupSet( void ); + void SetTrackLookupSet( bool set ); + + // Flex Timing Tags (used by editor only) + void ClearAllTimingTags( void ); + int GetNumTimingTags( void ); + CFlexTimingTag *GetTimingTag( int tagnum ); + CFlexTimingTag *FindTimingTag( const char *tagname ); + void AddTimingTag( const char *tagname, float percentage, bool locked ); + void RemoveTimingTag( const char *tagname ); + + // Subscene ( embedded .vcd ) support + void SetSubScene( CChoreoScene *scene ); + CChoreoScene *GetSubScene( void ); + + bool IsProcessing( void ) const; + void StartProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t ); + void ContinueProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t ); + void StopProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t ); + bool CheckProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t ); + void ResetProcessing( void ); + + void SetMixer( CAudioMixer *mixer ); + CAudioMixer *GetMixer( void ) const; + + // Hack for LOOKAT in editor + int GetPitch( void ) const; + void SetPitch( int pitch ); + int GetYaw( void ) const; + void SetYaw( int yaw ); + + // For LOOP events + void SetLoopCount( int numloops ); + int GetLoopCount( void ); + int GetNumLoopsRemaining( void ); + void SetNumLoopsRemaining( int loops ); + + bool IsMarkedForSave() const { return m_bMarkedForSave; } + void SetMarkedForSave( bool mark ) { m_bMarkedForSave = mark; } + + void GetMovementStyle( char *style, int maxlen ); + void GetDistanceStyle( char *style, int maxlen ); + + int GetGlobalID() const { return m_nGlobalID; } + + // Localization/CC support (close captioning and multiple wave file recombination) + void SetCloseCaptionType( CLOSECAPTION type ); + CLOSECAPTION GetCloseCaptionType() const; + void SetCloseCaptionToken( char const *token ); + char const *GetCloseCaptionToken() const; + void SetUsingCombinedFile( bool isusing ); + bool IsUsingCombinedFile() const; + void SetRequiredCombinedChecksum( unsigned int checksum ); + unsigned int GetRequiredCombinedChecksum(); + void SetNumSlaves( int num ); + int GetNumSlaves() const; + void SetLastSlaveEndTime( float t ); + float GetLastSlaveEndTime() const; + void SetCloseCaptionTokenValid( bool valid ); + bool GetCloseCaptionTokenValid() const; + + bool ComputeCombinedBaseFileName( char *dest, int destlen, bool creategenderwildcard ); + bool IsCombinedUsingGenderToken() const; + void SetCombinedUsingGenderToken( bool using_gender ); + + bool IsSuppressingCaptionAttenuation() const; + void SetSuppressingCaptionAttenuation( bool suppress ); + + int ValidateCombinedFile(); + + // This returns false if the wave is CC_DISABLED or is a CC_SLAVE, + // otherwise it returns the actual m_szCCToken value, or if that's + // blank it'll return the sounds.txt entry name (m_szParameters) + bool GetPlaybackCloseCaptionToken( char *dest, int destlen ); + + void ClearEventDependencies(); + void AddEventDependency( CChoreoEvent *other ); + void GetEventDependencies( CUtlVector< CChoreoEvent * >& list ); + + void SetActive( bool state ); + bool GetActive() const; + + void SetDefaultCurveType( int nCurveType ); + + // Turn enum into string and vice versa + static EVENTTYPE TypeForName( const char *name ); + static const char *NameForType( EVENTTYPE type ); + + // Turn enum into string and vice versa + static CLOSECAPTION CCTypeForName( const char *name ); + static const char *NameForCCType( CLOSECAPTION type ); + +private: + + // Declare copy constructor private to prevent accidental usage... + CChoreoEvent(const CChoreoEvent& src ); + + void SaveFlexAnimationsToBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool ); + bool RestoreFlexAnimationsFromBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool ); + + float GetBoundedAbsoluteTagPercentage( AbsTagType type, int tagnum ); + + float _GetIntensity( float time ); + + // String bounds + enum + { + MAX_CHOREOEVENT_NAME = 128, + MAX_PARAMETERS_STRING = 128, + }; + + // Base initialization + void Init( CChoreoScene *scene ); + + // Type of event + byte m_fType; + + // Close caption type + byte m_ccType; + + // Name of event + ChoreoStr_t m_Name; + + // Event parameters + ChoreoStr_t m_Parameters; + ChoreoStr_t m_Parameters2; + ChoreoStr_t m_Parameters3; + + // Event start time + float m_flStartTime; + + // Event end time ( -1.0f means no ending, just leading edge triggered ) + float m_flEndTime; + + // Duration of underlying gesture sequence + float m_flGestureSequenceDuration; + + // For CChoreoEvent::LOOP + int m_nNumLoops; // -1 == no limit + int m_nLoopsRemaining; + + // Overall intensity curve + CCurveData m_Ramp; + + // Start time is computed based on length of item referenced by tagged name + ChoreoStr_t m_TagName; + ChoreoStr_t m_TagWavName; + + // Associated actor + CChoreoActor *m_pActor; + // Associated channel + CChoreoChannel *m_pChannel; + + CUtlVector < CEventRelativeTag > m_RelativeTags; + CUtlVector < CFlexTimingTag > m_TimingTags; + CUtlVector < CEventAbsoluteTag > m_AbsoluteTags[ NUM_ABS_TAG_TYPES ]; + + CUtlVector < CFlexAnimationTrack * > m_FlexAnimationTracks; + + CChoreoScene *m_pSubScene; + CAudioMixer *m_pMixer; + + // Scene which owns this event + CChoreoScene *m_pScene; + + int m_nPitch; + int m_nYaw; + + float m_flDistanceToTarget; + + int m_nGlobalID; + + ChoreoStr_t m_CCToken; + unsigned int m_uRequiredCombinedChecksum; + // on master only, the combined file must have the same checksum to be useable + int m_nNumSlaves; + // Only set on master, helps UI draw underbar + float m_flLastSlaveEndTime; + // true if the cc token was found in the cc manager's database + + CUtlVector< CChoreoEvent * > m_Dependencies; + + int m_nDefaultCurveType; + +public: + // used only during scrubbing of looping sequences + float m_flPrevCycle; + float m_flPrevTime; + + // Flags + + bool m_bFixedLength:1; + // True if this event must be "finished" before the next section can be started + // after playback is paused from a globalevent + bool m_bResumeCondition:1; + bool m_bUsesTag:1; + bool m_bTrackLookupSet:1; + bool m_bProcessing:1; + bool m_bLockBodyFacing:1; + // Purely for save/load + bool m_bMarkedForSave:1; + bool m_bUsingCombinedSoundFile:1; + bool m_bCCTokenValid:1; + bool m_bCombinedUsingGenderToken:1; + + bool m_bSuppressCaptionAttenuation:1; + + bool m_bForceShortMovement:1; + bool m_bSyncToFollowingGesture:1; + bool m_bActive:1; + bool m_bPlayOverScript:1; +}; + +#endif // CHOREOEVENT_H |