|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
// #include "BaseAnimating.h"
#ifndef BASE_ANIMATING_OVERLAY_H
#define BASE_ANIMATING_OVERLAY_H
#ifdef _WIN32
#pragma once
#endif
class CBaseAnimatingOverlay;
class CAnimationLayer { public: DECLARE_CLASS_NOBASE( CAnimationLayer ); CAnimationLayer( void ); void Init( CBaseAnimatingOverlay *pOverlay );
// float SetBlending( int iBlender, float flValue, CBaseAnimating *pOwner );
void StudioFrameAdvance( float flInterval, CBaseAnimating *pOwner ); void DispatchAnimEvents( CBaseAnimating *eventHandler, CBaseAnimating *pOwner ); void SetOrder( int nOrder );
float GetFadeout( float flCurTime );
// For CNetworkVars.
void NetworkStateChanged(); void NetworkStateChanged( void *pVar );
public:
#define ANIM_LAYER_ACTIVE 0x0001
#define ANIM_LAYER_AUTOKILL 0x0002
#define ANIM_LAYER_KILLME 0x0004
#define ANIM_LAYER_DONTRESTORE 0x0008
#define ANIM_LAYER_CHECKACCESS 0x0010
#define ANIM_LAYER_DYING 0x0020
int m_fFlags;
bool m_bSequenceFinished; bool m_bLooping; CNetworkVar( int, m_nSequence ); CNetworkVar( float, m_flCycle ); CNetworkVar( float, m_flPrevCycle ); CNetworkVar( float, m_flWeight ); float m_flPlaybackRate;
float m_flBlendIn; // start and end blend frac (0.0 for now blend)
float m_flBlendOut;
float m_flKillRate; float m_flKillDelay;
float m_flLayerAnimtime; float m_flLayerFadeOuttime;
// For checking for duplicates
Activity m_nActivity;
// order of layering on client
int m_nPriority; CNetworkVar( int, m_nOrder );
bool IsActive( void ) { return ((m_fFlags & ANIM_LAYER_ACTIVE) != 0); } bool IsAutokill( void ) { return ((m_fFlags & ANIM_LAYER_AUTOKILL) != 0); } bool IsKillMe( void ) { return ((m_fFlags & ANIM_LAYER_KILLME) != 0); } bool IsAutoramp( void ) { return (m_flBlendIn != 0.0 || m_flBlendOut != 0.0); } void KillMe( void ) { m_fFlags |= ANIM_LAYER_KILLME; } void Dying( void ) { m_fFlags |= ANIM_LAYER_DYING; } bool IsDying( void ) { return ((m_fFlags & ANIM_LAYER_DYING) != 0); } void Dead( void ) { m_fFlags &= ~ANIM_LAYER_DYING; }
bool IsAbandoned( void ); void MarkActive( void );
float m_flLastEventCheck;
float m_flLastAccess;
// Network state changes get forwarded here.
CBaseAnimatingOverlay *m_pOwnerEntity; DECLARE_SIMPLE_DATADESC(); };
inline float CAnimationLayer::GetFadeout( float flCurTime ) { float s;
if (m_flLayerFadeOuttime <= 0.0f) { s = 0; } else { // blend in over 0.2 seconds
s = 1.0 - (flCurTime - m_flLayerAnimtime) / m_flLayerFadeOuttime; if (s > 0 && s <= 1.0) { // do a nice spline curve
s = 3 * s * s - 2 * s * s * s; } else if ( s > 1.0f ) { // Shouldn't happen, but maybe curtime is behind animtime?
s = 1.0f; } } return s; }
class CBaseAnimatingOverlay : public CBaseAnimating { DECLARE_CLASS( CBaseAnimatingOverlay, CBaseAnimating );
public: enum { MAX_OVERLAYS = 15, };
private: CUtlVector< CAnimationLayer > m_AnimOverlay; //int m_nActiveLayers;
//int m_nActiveBaseLayers;
public: virtual void OnRestore();
virtual void StudioFrameAdvance(); virtual void DispatchAnimEvents ( CBaseAnimating *eventHandler ); virtual void GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Quaternion q[], int boneMask );
int AddGestureSequence( int sequence, bool autokill = true ); int AddGestureSequence( int sequence, float flDuration, bool autokill = true ); int AddGesture( Activity activity, bool autokill = true ); int AddGesture( Activity activity, float flDuration, bool autokill = true ); bool IsPlayingGesture( Activity activity ); void RestartGesture( Activity activity, bool addifmissing = true, bool autokill = true ); void RemoveGesture( Activity activity ); void RemoveAllGestures( void );
int AddLayeredSequence( int sequence, int iPriority );
void SetLayerPriority( int iLayer, int iPriority );
bool IsValidLayer( int iLayer );
void SetLayerDuration( int iLayer, float flDuration ); float GetLayerDuration( int iLayer );
void SetLayerCycle( int iLayer, float flCycle ); void SetLayerCycle( int iLayer, float flCycle, float flPrevCycle ); void SetLayerCycle( int iLayer, float flCycle, float flPrevCycle, float flLastEventCheck ); float GetLayerCycle( int iLayer );
void SetLayerPlaybackRate( int iLayer, float flPlaybackRate ); void SetLayerWeight( int iLayer, float flWeight ); float GetLayerWeight( int iLayer ); void SetLayerBlendIn( int iLayer, float flBlendIn ); void SetLayerBlendOut( int iLayer, float flBlendOut ); void SetLayerAutokill( int iLayer, bool bAutokill ); void SetLayerLooping( int iLayer, bool bLooping ); void SetLayerNoRestore( int iLayer, bool bNoRestore );
Activity GetLayerActivity( int iLayer ); int GetLayerSequence( int iLayer );
int FindGestureLayer( Activity activity );
void RemoveLayer( int iLayer, float flKillRate = 0.2, float flKillDelay = 0.0 ); void FastRemoveLayer( int iLayer );
CAnimationLayer *GetAnimOverlay( int iIndex ); int GetNumAnimOverlays() const; void SetNumAnimOverlays( int num );
void VerifyOrder( void );
bool HasActiveLayer( void );
private: int AllocateLayer( int iPriority = 0 ); // lower priorities are processed first
DECLARE_SERVERCLASS(); DECLARE_DATADESC(); DECLARE_PREDICTABLE(); };
EXTERN_SEND_TABLE(DT_BaseAnimatingOverlay);
inline int CBaseAnimatingOverlay::GetNumAnimOverlays() const { return m_AnimOverlay.Count(); }
// ------------------------------------------------------------------------------------------ //
// CAnimationLayer inlines.
// ------------------------------------------------------------------------------------------ //
inline void CAnimationLayer::SetOrder( int nOrder ) { m_nOrder = nOrder; }
inline void CAnimationLayer::NetworkStateChanged() { if ( m_pOwnerEntity ) m_pOwnerEntity->NetworkStateChanged(); }
inline void CAnimationLayer::NetworkStateChanged( void *pVar ) { if ( m_pOwnerEntity ) m_pOwnerEntity->NetworkStateChanged(); }
#endif // BASE_ANIMATING_OVERLAY_H
|