Team Fortress 2 Source Code as on 22/4/2020
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.

708 lines
20 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #ifndef CHOREOEVENT_H
  8. #define CHOREOEVENT_H
  9. #ifdef _WIN32
  10. #pragma once
  11. #endif
  12. class CChoreoActor;
  13. class CChoreoChannel;
  14. class CChoreoEvent;
  15. class CChoreoScene;
  16. class IChoreoEventCallback;
  17. class CAudioMixer;
  18. class CUtlBuffer;
  19. class IChoreoStringPool;
  20. #include "tier1/utlstring.h"
  21. #include "tier1/utlvector.h"
  22. #include "expressionsample.h"
  23. #include "networkvar.h"
  24. #include "localflexcontroller.h"
  25. typedef CUtlString ChoreoStr_t;
  26. //-----------------------------------------------------------------------------
  27. // Purpose: SPEAK events can have "relative tags" that other objects can reference
  28. // to specify their start times off of
  29. //-----------------------------------------------------------------------------
  30. class CEventRelativeTag
  31. {
  32. public:
  33. DECLARE_CLASS_NOBASE( CEventRelativeTag );
  34. enum
  35. {
  36. MAX_EVENTTAG_LENGTH = 128,
  37. };
  38. CEventRelativeTag( CChoreoEvent *owner, const char *name, float percentage );
  39. CEventRelativeTag( const CEventRelativeTag& src );
  40. const char *GetName( void );
  41. float GetPercentage( void );
  42. void SetPercentage( float percentage );
  43. // Returns the corrected time based on the owner's length and start time
  44. float GetStartTime( void );
  45. CChoreoEvent *GetOwner( void );
  46. void SetOwner( CChoreoEvent *event );
  47. protected:
  48. ChoreoStr_t m_Name;
  49. float m_flPercentage;
  50. CChoreoEvent *m_pOwner;
  51. };
  52. //-----------------------------------------------------------------------------
  53. // Purpose: GESTURE events can have "absolute tags" (where the value is not a
  54. // percentage, but an actual timestamp from the start of the event)
  55. //-----------------------------------------------------------------------------
  56. class CEventAbsoluteTag
  57. {
  58. public:
  59. enum
  60. {
  61. MAX_EVENTTAG_LENGTH = 128,
  62. };
  63. CEventAbsoluteTag( CChoreoEvent *owner, const char *name, float percentage );
  64. CEventAbsoluteTag( const CEventAbsoluteTag& src );
  65. const char *GetName( void );
  66. float GetPercentage( void );
  67. void SetPercentage( float percentage );
  68. float GetEventTime( void );
  69. void SetEventTime( float t );
  70. float GetAbsoluteTime( void );
  71. void SetAbsoluteTime( float t );
  72. CChoreoEvent *GetOwner( void );
  73. void SetOwner( CChoreoEvent *event );
  74. void SetLocked( bool bLocked );
  75. bool GetLocked( void );
  76. void SetLinear( bool bLinear );
  77. bool GetLinear( void );
  78. void SetEntry( bool bEntry );
  79. bool GetEntry( void );
  80. void SetExit( bool bExit );
  81. bool GetExit( void );
  82. protected:
  83. ChoreoStr_t m_Name;
  84. float m_flPercentage;
  85. bool m_bLocked:1;
  86. bool m_bLinear:1;
  87. bool m_bEntry:1;
  88. bool m_bExit:1;
  89. CChoreoEvent *m_pOwner;
  90. };
  91. //-----------------------------------------------------------------------------
  92. // Purpose: FLEXANIMATION events can have "timing tags" that are used to align and
  93. // manipulate flex animation curves
  94. //-----------------------------------------------------------------------------
  95. class CFlexTimingTag : public CEventRelativeTag
  96. {
  97. DECLARE_CLASS( CFlexTimingTag, CEventRelativeTag );
  98. public:
  99. CFlexTimingTag( CChoreoEvent *owner, const char *name, float percentage, bool locked );
  100. CFlexTimingTag( const CFlexTimingTag& src );
  101. bool GetLocked( void );
  102. void SetLocked( bool locked );
  103. protected:
  104. bool m_bLocked;
  105. };
  106. //-----------------------------------------------------------------------------
  107. // Purpose: A flex controller position can be animated over a period of time
  108. //-----------------------------------------------------------------------------
  109. class CFlexAnimationTrack
  110. {
  111. public:
  112. enum
  113. {
  114. MAX_CONTROLLER_NAME = 128,
  115. };
  116. CFlexAnimationTrack( CChoreoEvent *event );
  117. CFlexAnimationTrack( const CFlexAnimationTrack* src );
  118. virtual ~CFlexAnimationTrack( void );
  119. void SetEvent( CChoreoEvent *event );
  120. CChoreoEvent *GetEvent( void );
  121. void SetFlexControllerName( const char *name );
  122. char const *GetFlexControllerName( void );
  123. void SetComboType( bool combo );
  124. bool IsComboType( void );
  125. void SetMin( float value );
  126. void SetMax( float value );
  127. float GetMin( int type = 0 );
  128. float GetMax( int type = 0 );
  129. bool IsInverted( void );
  130. void SetInverted( bool isInverted );
  131. int GetNumSamples( int type = 0 );
  132. CExpressionSample *GetSample( int index, int type = 0 );
  133. bool IsTrackActive( void );
  134. void SetTrackActive( bool active );
  135. // returns scaled value for absolute time per left/right side
  136. float GetIntensity( float time, int side = 0 );
  137. CExpressionSample *AddSample( float time, float value, int type = 0 );
  138. void RemoveSample( int index, int type = 0 );
  139. void Clear( void );
  140. void Resort( int type = 0 );
  141. // Puts in dummy start/end samples to spline to zero ( or 0.5 for
  142. // left/right data) at the origins
  143. CExpressionSample *GetBoundedSample( int number, bool& bClamped, int type = 0 );
  144. int GetFlexControllerIndex( int side = 0 );
  145. LocalFlexController_t GetRawFlexControllerIndex( int side = 0 );
  146. void SetFlexControllerIndex( LocalFlexController_t raw, int index, int side = 0 );
  147. // returns 0..1 value for 0..1 time fraction per mag/balance
  148. float GetFracIntensity( float time, int type );
  149. // retrieves raw intensity values (for mag vs. left/right slider setting)
  150. float GetSampleIntensity( float time );
  151. float GetBalanceIntensity( float time );
  152. void SetEdgeInfo( bool leftEdge, int curveType, float zero );
  153. void GetEdgeInfo( bool leftEdge, int& curveType, float& zero ) const;
  154. void SetEdgeActive( bool leftEdge, bool state );
  155. bool IsEdgeActive( bool leftEdge ) const;
  156. int GetEdgeCurveType( bool leftEdge ) const;
  157. float GetEdgeZeroValue( bool leftEdge ) const;
  158. float GetDefaultEdgeZeroPos() const;
  159. void SetServerSide( bool state );
  160. bool IsServerSide() const;
  161. private:
  162. // remove any samples after endtime
  163. void RemoveOutOfRangeSamples( int type );
  164. // returns scaled value for absolute time per mag/balance
  165. float GetIntensityInternal( float time, int type );
  166. public:
  167. // returns the fractional (0..1) value for "zero" based on Min/Max ranges
  168. float GetZeroValue( int type, bool leftSide );
  169. private:
  170. char *m_pControllerName;
  171. // base track has range, combo is always 0..1
  172. float m_flMin;
  173. float m_flMax;
  174. // 0 == magnitude
  175. // 1 == left/right
  176. CUtlVector< CExpressionSample > m_Samples[ 2 ];
  177. int m_nFlexControllerIndex[ 2 ];
  178. LocalFlexController_t m_nFlexControllerIndexRaw[ 2 ];
  179. // For left and right edge of type 0 flex data ( magnitude track )
  180. EdgeInfo_t m_EdgeInfo[ 2 ];
  181. CChoreoEvent *m_pEvent;
  182. // Is track active
  183. bool m_bActive:1;
  184. // Is this a combo (magnitude + stereo) track
  185. bool m_bCombo:1;
  186. bool m_bServerSide:1;
  187. bool m_bInverted; // track is displayed 1..0 instead of 0..1
  188. };
  189. //-----------------------------------------------------------------------------
  190. // Purpose: The generic scene event type
  191. //-----------------------------------------------------------------------------
  192. class CChoreoEvent : public ICurveDataAccessor
  193. {
  194. public:
  195. // Type of event this object represents
  196. typedef enum
  197. {
  198. // Don't know yet
  199. UNSPECIFIED = 0,
  200. // Section start/end
  201. SECTION,
  202. // Play an expression
  203. EXPRESSION,
  204. // Look at another actor
  205. LOOKAT,
  206. // Move to a location
  207. MOVETO,
  208. // Speak/visemes a wave file
  209. SPEAK,
  210. // Play a gesture
  211. GESTURE,
  212. // Play a sequence
  213. SEQUENCE,
  214. // Face another actor
  215. FACE,
  216. // Fire a trigger
  217. FIRETRIGGER,
  218. // One or more flex sliders animated over the course of the event time period
  219. FLEXANIMATION,
  220. // A contained .vcd file
  221. SUBSCENE,
  222. // Loop back to previous time (forever or up to N times)
  223. LOOP,
  224. // A time span during which the scene may be temporarily interrupted
  225. INTERRUPT,
  226. // A dummy event that is used to mark the .vcd end time
  227. STOPPOINT,
  228. // A time span during which this actor can respond to events happening in the world, etc.
  229. PERMIT_RESPONSES,
  230. // A string passed to the game code for interpretation
  231. GENERIC,
  232. // THIS MUST BE LAST!!!
  233. NUM_TYPES,
  234. } EVENTTYPE;
  235. enum
  236. {
  237. MAX_TAGNAME_STRING = 128,
  238. MAX_CCTOKEN_STRING = 64,
  239. };
  240. typedef enum
  241. {
  242. DEFAULT = 0,
  243. SIMULATION,
  244. DISPLAY,
  245. } TIMETYPE;
  246. typedef enum
  247. {
  248. CC_MASTER = 0, // default, implied
  249. CC_SLAVE,
  250. CC_DISABLED,
  251. NUM_CC_TYPES,
  252. } CLOSECAPTION;
  253. static int s_nGlobalID;
  254. // Construction
  255. CChoreoEvent( CChoreoScene *scene );
  256. CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name );
  257. CChoreoEvent( CChoreoScene *scene, EVENTTYPE type, const char *name, const char *param );
  258. // Assignment
  259. CChoreoEvent& operator=(const CChoreoEvent& src );
  260. ~CChoreoEvent( void );
  261. // ICurveDataAccessor methods
  262. virtual bool CurveHasEndTime();
  263. virtual int GetDefaultCurveType();
  264. // Binary serialization
  265. void SaveToBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool );
  266. bool RestoreFromBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool );
  267. // Accessors
  268. EVENTTYPE GetType( void );
  269. void SetType( EVENTTYPE type );
  270. void SetName( const char *name );
  271. const char *GetName( void );
  272. void SetParameters( const char *target );
  273. const char *GetParameters( void );
  274. void SetParameters2( const char *target );
  275. const char *GetParameters2( void );
  276. void SetParameters3( const char *target );
  277. const char *GetParameters3( void );
  278. void SetStartTime( float starttime );
  279. float GetStartTime( void );
  280. void SetEndTime( float endtime );
  281. float GetEndTime( void );
  282. float GetDuration( void );
  283. void SetResumeCondition( bool resumecondition );
  284. bool IsResumeCondition( void );
  285. void SetLockBodyFacing( bool lockbodyfacing );
  286. bool IsLockBodyFacing( void );
  287. void SetDistanceToTarget( float distancetotarget );
  288. float GetDistanceToTarget( void );
  289. void SetForceShortMovement( bool bForceShortMovement );
  290. bool GetForceShortMovement( void );
  291. void SetSyncToFollowingGesture( bool bSyncToFollowingGesture );
  292. bool GetSyncToFollowingGesture( void );
  293. void SetPlayOverScript( bool bPlayOverScript );
  294. bool GetPlayOverScript( void );
  295. int GetRampCount( void ) { return m_Ramp.GetCount(); };
  296. CExpressionSample *GetRamp( int index ) { return m_Ramp.Get( index ); };
  297. CExpressionSample *AddRamp( float time, float value, bool selected ) { return m_Ramp.Add( time, value, selected ); };
  298. void DeleteRamp( int index ) { m_Ramp.Delete( index ); };
  299. void ClearRamp( void ) { m_Ramp.Clear(); };
  300. void ResortRamp( void ) { m_Ramp.Resort( this ); };
  301. CCurveData *GetRamp( void ) { return &m_Ramp; };
  302. float GetRampIntensity( float time ) { return m_Ramp.GetIntensity( this, time ); };
  303. // Calculates weighting for a given time
  304. float GetIntensity( float scenetime );
  305. float GetIntensityArea( float scenetime );
  306. // Calculates 0..1 completion for a given time
  307. float GetCompletion( float time );
  308. // An end time of -1.0f means that the events is just triggered at the leading edge
  309. bool HasEndTime( void );
  310. // Is the event something that can be sized ( a wave file, e.g. )
  311. bool IsFixedLength( void );
  312. void SetFixedLength( bool isfixedlength );
  313. // Move the start/end/both times by the specified dt (fixes up -1.0f endtimes)
  314. void OffsetStartTime( float dt );
  315. void OffsetEndTime( float dt );
  316. void OffsetTime( float dt );
  317. // Snap to scene framerate
  318. void SnapTimes( void );
  319. float SnapTime( float t );
  320. CChoreoScene *GetScene( void );
  321. void SetScene( CChoreoScene *scene );
  322. // The actor the event is associated with
  323. void SetActor( CChoreoActor *actor );
  324. CChoreoActor *GetActor( void );
  325. // The channel the event is associated with
  326. void SetChannel( CChoreoChannel *channel );
  327. CChoreoChannel *GetChannel( void );
  328. // Get a more involved description of the event
  329. const char *GetDescription( void );
  330. void ClearAllRelativeTags( void );
  331. int GetNumRelativeTags( void );
  332. CEventRelativeTag *GetRelativeTag( int tagnum );
  333. CEventRelativeTag *FindRelativeTag( const char *tagname );
  334. void AddRelativeTag( const char *tagname, float percentage );
  335. void RemoveRelativeTag( const char *tagname );
  336. bool IsUsingRelativeTag( void );
  337. void SetUsingRelativeTag( bool usetag, const char *tagname = 0, const char *wavname = 0);
  338. const char *GetRelativeTagName( void );
  339. const char *GetRelativeWavName( void );
  340. // Absolute tags
  341. typedef enum
  342. {
  343. PLAYBACK = 0, // new timeline - FIXME: should be stored as an absolute time
  344. ORIGINAL, // original timeline - FIXME: should be stored at a fixed percentage of event
  345. NUM_ABS_TAG_TYPES,
  346. } AbsTagType;
  347. void SetGestureSequenceDuration( float duration );
  348. bool GetGestureSequenceDuration( float& duration );
  349. void ClearAllAbsoluteTags( AbsTagType type );
  350. int GetNumAbsoluteTags( AbsTagType type );
  351. CEventAbsoluteTag *GetAbsoluteTag( AbsTagType type, int tagnum );
  352. CEventAbsoluteTag *FindAbsoluteTag( AbsTagType type, const char *tagname );
  353. void AddAbsoluteTag( AbsTagType type, const char *tagname, float t );
  354. void RemoveAbsoluteTag( AbsTagType type, const char *tagname );
  355. bool VerifyTagOrder( void );
  356. float GetOriginalPercentageFromPlaybackPercentage( float t );
  357. float GetPlaybackPercentageFromOriginalPercentage( float t );
  358. static const char *NameForAbsoluteTagType( AbsTagType t );
  359. static AbsTagType TypeForAbsoluteTagName( const char *name );
  360. void RescaleGestureTimes( float newstart, float newend, bool bMaintainAbsoluteTagPositions );
  361. bool PreventTagOverlap( void );
  362. CEventAbsoluteTag *FindEntryTag( AbsTagType type );
  363. CEventAbsoluteTag *FindExitTag( AbsTagType type );
  364. // Flex animation type
  365. int GetNumFlexAnimationTracks( void );
  366. CFlexAnimationTrack *GetFlexAnimationTrack( int index );
  367. CFlexAnimationTrack *AddTrack( const char *controllername );
  368. CFlexAnimationTrack *FindTrack( const char *controllername );
  369. void RemoveTrack( int index );
  370. void RemoveAllTracks( void );
  371. void OnEndTimeChanged( void );
  372. bool GetTrackLookupSet( void );
  373. void SetTrackLookupSet( bool set );
  374. // Flex Timing Tags (used by editor only)
  375. void ClearAllTimingTags( void );
  376. int GetNumTimingTags( void );
  377. CFlexTimingTag *GetTimingTag( int tagnum );
  378. CFlexTimingTag *FindTimingTag( const char *tagname );
  379. void AddTimingTag( const char *tagname, float percentage, bool locked );
  380. void RemoveTimingTag( const char *tagname );
  381. // Subscene ( embedded .vcd ) support
  382. void SetSubScene( CChoreoScene *scene );
  383. CChoreoScene *GetSubScene( void );
  384. bool IsProcessing( void ) const;
  385. void StartProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
  386. void ContinueProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
  387. void StopProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
  388. bool CheckProcessing( IChoreoEventCallback *cb, CChoreoScene *scene, float t );
  389. void ResetProcessing( void );
  390. void SetMixer( CAudioMixer *mixer );
  391. CAudioMixer *GetMixer( void ) const;
  392. // Hack for LOOKAT in editor
  393. int GetPitch( void ) const;
  394. void SetPitch( int pitch );
  395. int GetYaw( void ) const;
  396. void SetYaw( int yaw );
  397. // For LOOP events
  398. void SetLoopCount( int numloops );
  399. int GetLoopCount( void );
  400. int GetNumLoopsRemaining( void );
  401. void SetNumLoopsRemaining( int loops );
  402. bool IsMarkedForSave() const { return m_bMarkedForSave; }
  403. void SetMarkedForSave( bool mark ) { m_bMarkedForSave = mark; }
  404. void GetMovementStyle( char *style, int maxlen );
  405. void GetDistanceStyle( char *style, int maxlen );
  406. int GetGlobalID() const { return m_nGlobalID; }
  407. // Localization/CC support (close captioning and multiple wave file recombination)
  408. void SetCloseCaptionType( CLOSECAPTION type );
  409. CLOSECAPTION GetCloseCaptionType() const;
  410. void SetCloseCaptionToken( char const *token );
  411. char const *GetCloseCaptionToken() const;
  412. void SetUsingCombinedFile( bool isusing );
  413. bool IsUsingCombinedFile() const;
  414. void SetRequiredCombinedChecksum( unsigned int checksum );
  415. unsigned int GetRequiredCombinedChecksum();
  416. void SetNumSlaves( int num );
  417. int GetNumSlaves() const;
  418. void SetLastSlaveEndTime( float t );
  419. float GetLastSlaveEndTime() const;
  420. void SetCloseCaptionTokenValid( bool valid );
  421. bool GetCloseCaptionTokenValid() const;
  422. bool ComputeCombinedBaseFileName( char *dest, int destlen, bool creategenderwildcard );
  423. bool IsCombinedUsingGenderToken() const;
  424. void SetCombinedUsingGenderToken( bool using_gender );
  425. bool IsSuppressingCaptionAttenuation() const;
  426. void SetSuppressingCaptionAttenuation( bool suppress );
  427. int ValidateCombinedFile();
  428. // This returns false if the wave is CC_DISABLED or is a CC_SLAVE,
  429. // otherwise it returns the actual m_szCCToken value, or if that's
  430. // blank it'll return the sounds.txt entry name (m_szParameters)
  431. bool GetPlaybackCloseCaptionToken( char *dest, int destlen );
  432. void ClearEventDependencies();
  433. void AddEventDependency( CChoreoEvent *other );
  434. void GetEventDependencies( CUtlVector< CChoreoEvent * >& list );
  435. void SetActive( bool state );
  436. bool GetActive() const;
  437. void SetDefaultCurveType( int nCurveType );
  438. // Turn enum into string and vice versa
  439. static EVENTTYPE TypeForName( const char *name );
  440. static const char *NameForType( EVENTTYPE type );
  441. // Turn enum into string and vice versa
  442. static CLOSECAPTION CCTypeForName( const char *name );
  443. static const char *NameForCCType( CLOSECAPTION type );
  444. private:
  445. // Declare copy constructor private to prevent accidental usage...
  446. CChoreoEvent(const CChoreoEvent& src );
  447. void SaveFlexAnimationsToBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool );
  448. bool RestoreFlexAnimationsFromBuffer( CUtlBuffer& buf, IChoreoStringPool *pStringPool );
  449. float GetBoundedAbsoluteTagPercentage( AbsTagType type, int tagnum );
  450. float _GetIntensity( float time );
  451. // String bounds
  452. enum
  453. {
  454. MAX_CHOREOEVENT_NAME = 128,
  455. MAX_PARAMETERS_STRING = 128,
  456. };
  457. // Base initialization
  458. void Init( CChoreoScene *scene );
  459. // Type of event
  460. byte m_fType;
  461. // Close caption type
  462. byte m_ccType;
  463. // Name of event
  464. ChoreoStr_t m_Name;
  465. // Event parameters
  466. ChoreoStr_t m_Parameters;
  467. ChoreoStr_t m_Parameters2;
  468. ChoreoStr_t m_Parameters3;
  469. // Event start time
  470. float m_flStartTime;
  471. // Event end time ( -1.0f means no ending, just leading edge triggered )
  472. float m_flEndTime;
  473. // Duration of underlying gesture sequence
  474. float m_flGestureSequenceDuration;
  475. // For CChoreoEvent::LOOP
  476. int m_nNumLoops; // -1 == no limit
  477. int m_nLoopsRemaining;
  478. // Overall intensity curve
  479. CCurveData m_Ramp;
  480. // Start time is computed based on length of item referenced by tagged name
  481. ChoreoStr_t m_TagName;
  482. ChoreoStr_t m_TagWavName;
  483. // Associated actor
  484. CChoreoActor *m_pActor;
  485. // Associated channel
  486. CChoreoChannel *m_pChannel;
  487. CUtlVector < CEventRelativeTag > m_RelativeTags;
  488. CUtlVector < CFlexTimingTag > m_TimingTags;
  489. CUtlVector < CEventAbsoluteTag > m_AbsoluteTags[ NUM_ABS_TAG_TYPES ];
  490. CUtlVector < CFlexAnimationTrack * > m_FlexAnimationTracks;
  491. CChoreoScene *m_pSubScene;
  492. CAudioMixer *m_pMixer;
  493. // Scene which owns this event
  494. CChoreoScene *m_pScene;
  495. int m_nPitch;
  496. int m_nYaw;
  497. float m_flDistanceToTarget;
  498. int m_nGlobalID;
  499. ChoreoStr_t m_CCToken;
  500. unsigned int m_uRequiredCombinedChecksum;
  501. // on master only, the combined file must have the same checksum to be useable
  502. int m_nNumSlaves;
  503. // Only set on master, helps UI draw underbar
  504. float m_flLastSlaveEndTime;
  505. // true if the cc token was found in the cc manager's database
  506. CUtlVector< CChoreoEvent * > m_Dependencies;
  507. int m_nDefaultCurveType;
  508. public:
  509. // used only during scrubbing of looping sequences
  510. float m_flPrevCycle;
  511. float m_flPrevTime;
  512. // Flags
  513. bool m_bFixedLength:1;
  514. // True if this event must be "finished" before the next section can be started
  515. // after playback is paused from a globalevent
  516. bool m_bResumeCondition:1;
  517. bool m_bUsesTag:1;
  518. bool m_bTrackLookupSet:1;
  519. bool m_bProcessing:1;
  520. bool m_bLockBodyFacing:1;
  521. // Purely for save/load
  522. bool m_bMarkedForSave:1;
  523. bool m_bUsingCombinedSoundFile:1;
  524. bool m_bCCTokenValid:1;
  525. bool m_bCombinedUsingGenderToken:1;
  526. bool m_bSuppressCaptionAttenuation:1;
  527. bool m_bForceShortMovement:1;
  528. bool m_bSyncToFollowingGesture:1;
  529. bool m_bActive:1;
  530. bool m_bPlayOverScript:1;
  531. };
  532. #endif // CHOREOEVENT_H