mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-11 11:33:01 +08:00
169 lines
4.5 KiB
C
169 lines
4.5 KiB
C
|
#ifndef IMDLCACHE_H
|
||
|
#define IMDLCACHE_H
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "IAppSystem.h"
|
||
|
|
||
|
struct studiohdr_t;
|
||
|
struct studiohwdata_t;
|
||
|
struct vcollide_t;
|
||
|
struct virtualmodel_t;
|
||
|
struct vertexFileHeader_t;
|
||
|
|
||
|
namespace OptimizedModel
|
||
|
{
|
||
|
struct FileHeader_t;
|
||
|
}
|
||
|
|
||
|
|
||
|
typedef unsigned short MDLHandle_t;
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
MDLHANDLE_INVALID = (MDLHandle_t)~0
|
||
|
};
|
||
|
|
||
|
|
||
|
enum MDLCacheDataType_t
|
||
|
{
|
||
|
MDLCACHE_STUDIOHDR = 0,
|
||
|
MDLCACHE_STUDIOHWDATA,
|
||
|
MDLCACHE_VCOLLIDE,
|
||
|
|
||
|
MDLCACHE_ANIMBLOCK,
|
||
|
MDLCACHE_VIRTUALMODEL,
|
||
|
MDLCACHE_VERTEXES,
|
||
|
MDLCACHE_DECODEDANIMBLOCK,
|
||
|
};
|
||
|
|
||
|
abstract_class IMDLCacheNotify
|
||
|
{
|
||
|
public:
|
||
|
virtual void OnDataLoaded(MDLCacheDataType_t type, MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void OnDataUnloaded(MDLCacheDataType_t type, MDLHandle_t handle) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
enum MDLCacheFlush_t
|
||
|
{
|
||
|
MDLCACHE_FLUSH_STUDIOHDR = 0x01,
|
||
|
MDLCACHE_FLUSH_STUDIOHWDATA = 0x02,
|
||
|
MDLCACHE_FLUSH_VCOLLIDE = 0x04,
|
||
|
MDLCACHE_FLUSH_ANIMBLOCK = 0x08,
|
||
|
MDLCACHE_FLUSH_VIRTUALMODEL = 0x10,
|
||
|
MDLCACHE_FLUSH_AUTOPLAY = 0x20,
|
||
|
MDLCACHE_FLUSH_VERTEXES = 0x40,
|
||
|
|
||
|
MDLCACHE_FLUSH_IGNORELOCK = 0x80000000,
|
||
|
MDLCACHE_FLUSH_ALL = 0xFFFFFFFF
|
||
|
};
|
||
|
|
||
|
#define MDLCACHE_INTERFACE_VERSION "MDLCache004"
|
||
|
|
||
|
abstract_class IMDLCache : public IAppSystem
|
||
|
{
|
||
|
public:
|
||
|
virtual void SetCacheNotify(IMDLCacheNotify * pNotify) = 0;
|
||
|
|
||
|
virtual MDLHandle_t FindMDL(const char* pMDLRelativePath) = 0;
|
||
|
|
||
|
virtual int AddRef(MDLHandle_t handle) = 0;
|
||
|
virtual int Release(MDLHandle_t handle) = 0;
|
||
|
virtual int GetRef(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual studiohdr_t* GetStudioHdr(MDLHandle_t handle) = 0;
|
||
|
virtual studiohwdata_t* GetHardwareData(MDLHandle_t handle) = 0;
|
||
|
virtual vcollide_t* GetVCollide(MDLHandle_t handle) = 0;
|
||
|
virtual unsigned char* GetAnimBlock(MDLHandle_t handle, int nBlock) = 0;
|
||
|
virtual virtualmodel_t* GetVirtualModel(MDLHandle_t handle) = 0;
|
||
|
virtual int GetAutoplayList(MDLHandle_t handle, unsigned short** pOut) = 0;
|
||
|
virtual vertexFileHeader_t* GetVertexData(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void TouchAllData(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void SetUserData(MDLHandle_t handle, void* pData) = 0;
|
||
|
virtual void* GetUserData(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual bool IsErrorModel(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void Flush(MDLCacheFlush_t nFlushFlags = MDLCACHE_FLUSH_ALL) = 0;
|
||
|
|
||
|
virtual void Flush(MDLHandle_t handle, int nFlushFlags = MDLCACHE_FLUSH_ALL) = 0;
|
||
|
|
||
|
virtual const char* GetModelName(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual virtualmodel_t* GetVirtualModelFast(const studiohdr_t* pStudioHdr, MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void BeginLock() = 0;
|
||
|
|
||
|
virtual void EndLock() = 0;
|
||
|
|
||
|
virtual int* GetFrameUnlockCounterPtrOLD() = 0;
|
||
|
|
||
|
virtual void FinishPendingLoads() = 0;
|
||
|
|
||
|
virtual vcollide_t* GetVCollideEx(MDLHandle_t handle, bool synchronousLoad = true) = 0;
|
||
|
virtual bool GetVCollideSize(MDLHandle_t handle, int* pVCollideSize) = 0;
|
||
|
|
||
|
virtual bool GetAsyncLoad(MDLCacheDataType_t type) = 0;
|
||
|
virtual bool SetAsyncLoad(MDLCacheDataType_t type, bool bAsync) = 0;
|
||
|
|
||
|
virtual void BeginMapLoad() = 0;
|
||
|
virtual void EndMapLoad() = 0;
|
||
|
virtual void MarkAsLoaded(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void InitPreloadData(bool rebuild) = 0;
|
||
|
virtual void ShutdownPreloadData() = 0;
|
||
|
|
||
|
virtual bool IsDataLoaded(MDLHandle_t handle, MDLCacheDataType_t type) = 0;
|
||
|
|
||
|
virtual int* GetFrameUnlockCounterPtr(MDLCacheDataType_t type) = 0;
|
||
|
|
||
|
virtual studiohdr_t* LockStudioHdr(MDLHandle_t handle) = 0;
|
||
|
virtual void UnlockStudioHdr(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual bool PreloadModel(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void ResetErrorModelStatus(MDLHandle_t handle) = 0;
|
||
|
|
||
|
virtual void MarkFrame() = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
class CMDLCacheCriticalSection
|
||
|
{
|
||
|
public:
|
||
|
CMDLCacheCriticalSection(IMDLCache* pCache) : m_pCache(pCache)
|
||
|
{
|
||
|
m_pCache->BeginLock();
|
||
|
}
|
||
|
|
||
|
~CMDLCacheCriticalSection()
|
||
|
{
|
||
|
m_pCache->EndLock();
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
IMDLCache* m_pCache;
|
||
|
};
|
||
|
|
||
|
#define MDCACHE_FINE_GRAINED 1
|
||
|
|
||
|
#if defined(MDCACHE_FINE_GRAINED)
|
||
|
#define MDLCACHE_CRITICAL_SECTION_( pCache ) CMDLCacheCriticalSection cacheCriticalSection(pCache)
|
||
|
#define MDLCACHE_COARSE_LOCK_( pCache ) ((void)(0))
|
||
|
#elif defined(MDLCACHE_LEVEL_LOCKED)
|
||
|
#define MDLCACHE_CRITICAL_SECTION_( pCache ) ((void)(0))
|
||
|
#define MDLCACHE_COARSE_LOCK_( pCache ) ((void)(0))
|
||
|
#else
|
||
|
#define MDLCACHE_CRITICAL_SECTION_( pCache ) ((void)(0))
|
||
|
#define MDLCACHE_COARSE_LOCK_( pCache ) CMDLCacheCriticalSection cacheCriticalSection(pCache)
|
||
|
#endif
|
||
|
#define MDLCACHE_CRITICAL_SECTION() MDLCACHE_CRITICAL_SECTION_(mdlcache)
|
||
|
#define MDLCACHE_COARSE_LOCK() MDLCACHE_COARSE_LOCK_(mdlcache)
|
||
|
|
||
|
#endif
|