153 lines
4.5 KiB
C++
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
|