summaryrefslogtreecommitdiff
path: root/game/shared/choreoevent.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/choreoevent.h')
-rw-r--r--game/shared/choreoevent.h708
1 files changed, 708 insertions, 0 deletions
diff --git a/game/shared/choreoevent.h b/game/shared/choreoevent.h
new file mode 100644
index 0000000..ad4828d
--- /dev/null
+++ b/game/shared/choreoevent.h
@@ -0,0 +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