sqwarmed/sdk_src/game/client/replay_ragdoll.h

153 lines
4.5 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef REPLAY_RAGDOLL_H
#define REPLAY_RAGDOLL_H
#ifdef _WIN32
#pragma once
#endif
//--------------------------------------------------------------------------------
class C_BaseAnimating;
//--------------------------------------------------------------------------------
struct RagdollSimulationFrame_t
{
RagdollSimulationFrame_t() : pPositions(NULL), pAngles(NULL), nTick(-1) {}
static RagdollSimulationFrame_t* Alloc( int nNumBones );
int nTick;
Vector* pPositions;
QAngle* pAngles;
Vector vRootPosition;
QAngle angRootAngles;
};
//--------------------------------------------------------------------------------
struct RagdollSimulationData_t
{
RagdollSimulationData_t( C_BaseAnimating* pEntity = NULL, int nStartTick = 0, int nNumBones = 0 );
void Record();
int m_nEntityIndex;
int m_nStartTick;
int m_nDuration;
int m_nNumBones;
typedef unsigned short Iterator_t;
CUtlLinkedList< RagdollSimulationFrame_t*, Iterator_t > m_lstFrames;
C_BaseAnimating* m_pEntity;
};
//--------------------------------------------------------------------------------
// TODO: Refactor this into an interface and hide implementation in cpp file
class CReplayRagdollRecorder
{
private:
CReplayRagdollRecorder();
~CReplayRagdollRecorder();
public:
static CReplayRagdollRecorder& Instance();
void Init();
void Shutdown();
void Think();
void AddEntry( C_BaseAnimating* pEntity, int nStartTick, int nNumBones );
void StopRecordingRagdoll( C_BaseAnimating* pEntity );
void CleanupStartupTicksAndDurations( int nStartTick );
bool DumpRagdollsToDisk( char const* pszFilename ) const;
bool IsRecording() const { return m_bIsRecording; }
private:
typedef unsigned short Iterator_t;
void StopRecordingRagdollAtIndex( Iterator_t nIndex );
void StopRecordingSleepingRagdolls();
void RemoveExpiredRagdollEntries();
void Record();
bool FindEntryInRecordingList( C_BaseAnimating* pEntity, Iterator_t& nOutIndex );
CUtlLinkedList< RagdollSimulationData_t*, Iterator_t > m_lstRagdolls;
CUtlLinkedList< RagdollSimulationData_t*, Iterator_t > m_lstRagdollsToRecord; // Contains some of the elements from m_lstRagdolls -
// the ones which are still recording
bool m_bIsRecording;
};
//--------------------------------------------------------------------------------
class CReplayRagdollCache
{
private:
CReplayRagdollCache();
public:
static CReplayRagdollCache& Instance();
bool Init( char const* pszFilename );
void Shutdown();
void Think();
bool IsInitialized() const { return m_bInit; }
//
// Returns false is no frame exists for the given entity at the given tick.
// Otherwise, returns a
//
bool GetFrame( C_BaseAnimating* pEntity, int nTick, bool* pBoneSimulated, CBoneAccessor* pBoneAccessor ) const;
private:
RagdollSimulationData_t* FindRagdollEntry( C_BaseAnimating* pEntity, int nTick );
const RagdollSimulationData_t* FindRagdollEntry( C_BaseAnimating* pEntity, int nTick ) const;
bool FindFrame( RagdollSimulationFrame_t*& pFrameOut, RagdollSimulationFrame_t*& pNextFrameOut,
const RagdollSimulationData_t* pRagdollEntry, int nTick );
bool FindFrame( RagdollSimulationFrame_t*& pFrameOut, RagdollSimulationFrame_t*& pNextFrameOut,
const RagdollSimulationData_t* pRagdollEntry, int nTick ) const;
typedef unsigned short Iterator_t;
bool m_bInit;
CUtlLinkedList< RagdollSimulationData_t*, Iterator_t > m_lstRagdolls;
};
//--------------------------------------------------------------------------------
bool Replay_CacheRagdolls( const char* pFilename, int nStartTick );
//--------------------------------------------------------------------------------
inline const RagdollSimulationData_t* CReplayRagdollCache::FindRagdollEntry( C_BaseAnimating* pEntity, int nTick ) const
{
return const_cast< CReplayRagdollCache* >( this )->FindRagdollEntry( pEntity, nTick );
}
inline bool CReplayRagdollCache::FindFrame( RagdollSimulationFrame_t*& pFrameOut, RagdollSimulationFrame_t*& pNextFrameOut,
const RagdollSimulationData_t* pRagdollEntry, int nTick ) const
{
return const_cast< CReplayRagdollCache* >( this )->FindFrame( pFrameOut, pNextFrameOut, pRagdollEntry, nTick );
}
//--------------------------------------------------------------------------------
#endif // REPLAY_RAGDOLL_H