This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/server/BaseAnimatingOverlay.h
2020-08-04 13:13:01 -04:00

222 lines
6.4 KiB
C++

//========= 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