2022-03-21 21:52:44 -04:00
# pragma once
# include <map>
# include <string>
# include <thread>
# include <queue>
2022-05-15 15:32:05 -04:00
# include <variant>
2022-03-21 21:52:44 -04:00
# include "Resource.h"
# include "GlobalCtx2.h"
namespace Ship
{
class Archive ;
class File ;
// Resource manager caches any and all files it comes across into memory. This will be unoptimal in the future when modifications have gigabytes of assets.
// It works with the original game's assets because the entire ROM is 64MB and fits into RAM of any semi-modern PC.
class ResourceMgr {
public :
ResourceMgr ( std : : shared_ptr < GlobalCtx2 > Context , std : : string MainPath , std : : string PatchesPath ) ;
~ ResourceMgr ( ) ;
bool IsRunning ( ) ;
bool DidLoadSuccessfully ( ) ;
std : : shared_ptr < Archive > GetArchive ( ) { return OTR ; }
std : : shared_ptr < GlobalCtx2 > GetContext ( ) { return Context . lock ( ) ; }
2022-05-15 15:32:05 -04:00
const std : : string * HashToString ( uint64_t Hash ) const ;
2022-03-21 21:52:44 -04:00
void InvalidateResourceCache ( ) ;
2022-05-11 13:18:24 -04:00
2022-03-31 19:42:44 -04:00
uint32_t GetGameVersion ( ) ;
void SetGameVersion ( uint32_t newGameVersion ) ;
2022-03-21 21:52:44 -04:00
std : : shared_ptr < File > LoadFileAsync ( std : : string FilePath ) ;
std : : shared_ptr < File > LoadFile ( std : : string FilePath ) ;
2022-05-15 15:32:05 -04:00
std : : shared_ptr < Ship : : Resource > GetCachedFile ( const char * FilePath ) const ;
std : : shared_ptr < Resource > LoadResource ( const char * FilePath ) ;
std : : shared_ptr < Resource > LoadResource ( const std : : string & FilePath ) { return LoadResource ( FilePath . c_str ( ) ) ; }
std : : variant < std : : shared_ptr < Resource > , std : : shared_ptr < ResourcePromise > > LoadResourceAsync ( const char * FilePath ) ;
2022-03-21 21:52:44 -04:00
std : : shared_ptr < std : : vector < std : : shared_ptr < Resource > > > CacheDirectory ( std : : string SearchMask ) ;
std : : shared_ptr < std : : vector < std : : shared_ptr < ResourcePromise > > > CacheDirectoryAsync ( std : : string SearchMask ) ;
std : : shared_ptr < std : : vector < std : : shared_ptr < Resource > > > DirtyDirectory ( std : : string SearchMask ) ;
protected :
void Start ( ) ;
void Stop ( ) ;
void LoadFileThread ( ) ;
void LoadResourceThread ( ) ;
private :
std : : weak_ptr < GlobalCtx2 > Context ;
2022-05-11 13:18:24 -04:00
volatile bool bIsRunning ;
2022-03-21 21:52:44 -04:00
std : : map < std : : string , std : : shared_ptr < File > > FileCache ;
2022-05-15 15:32:05 -04:00
std : : map < std : : string , std : : shared_ptr < Resource > , std : : less < > > ResourceCache ;
2022-03-21 21:52:44 -04:00
std : : queue < std : : shared_ptr < File > > FileLoadQueue ;
std : : queue < std : : shared_ptr < ResourcePromise > > ResourceLoadQueue ;
std : : shared_ptr < Archive > OTR ;
std : : shared_ptr < std : : thread > FileLoadThread ;
std : : shared_ptr < std : : thread > ResourceLoadThread ;
std : : mutex FileLoadMutex ;
std : : mutex ResourceLoadMutex ;
std : : condition_variable FileLoadNotifier ;
std : : condition_variable ResourceLoadNotifier ;
2022-03-31 19:42:44 -04:00
uint32_t gameVersion ;
2022-03-21 21:52:44 -04:00
} ;
}