2022-03-21 21:52:44 -04:00
# pragma once
2022-07-05 19:29:57 -04:00
# include <unordered_map>
2022-03-21 21:52:44 -04:00
# include <string>
# include <thread>
# include <queue>
2022-05-15 15:32:05 -04:00
# include <variant>
2022-08-21 21:08:01 -04:00
# include "Window.h"
2022-03-21 21:52:44 -04:00
# include "Resource.h"
2022-08-21 21:08:01 -04:00
# include "Archive.h"
# include "File.h"
2022-03-21 21:52:44 -04:00
2022-08-21 21:08:01 -04:00
namespace Ship {
class Window ;
2022-03-21 21:52:44 -04:00
// 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 :
2022-08-21 21:08:01 -04:00
ResourceMgr ( std : : shared_ptr < Window > Context , const std : : string & MainPath , const std : : string & PatchesPath ) ;
2022-03-21 21:52:44 -04:00
~ ResourceMgr ( ) ;
bool IsRunning ( ) ;
bool DidLoadSuccessfully ( ) ;
std : : shared_ptr < Archive > GetArchive ( ) { return OTR ; }
2022-08-21 21:08:01 -04:00
std : : shared_ptr < Window > GetContext ( ) { return Context ; }
2022-03-21 21:52:44 -04:00
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-06-04 22:10:55 -04:00
std : : shared_ptr < File > LoadFileAsync ( const std : : string & FilePath ) ;
std : : shared_ptr < File > LoadFile ( const std : : string & FilePath ) ;
2022-08-21 21:08:01 -04:00
std : : shared_ptr < Resource > GetCachedFile ( const char * FilePath ) const ;
2022-05-15 15:32:05 -04:00
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-06-04 22:10:55 -04:00
std : : shared_ptr < std : : vector < std : : shared_ptr < Resource > > > CacheDirectory ( const std : : string & SearchMask ) ;
std : : shared_ptr < std : : vector < std : : shared_ptr < ResourcePromise > > > CacheDirectoryAsync ( const std : : string & SearchMask ) ;
2022-03-21 21:52:44 -04:00
std : : shared_ptr < std : : vector < std : : shared_ptr < Resource > > > DirtyDirectory ( std : : string SearchMask ) ;
2022-06-10 13:37:50 -04:00
std : : shared_ptr < std : : vector < std : : string > > ListFiles ( std : : string SearchMask ) ;
2022-03-21 21:52:44 -04:00
protected :
void Start ( ) ;
void Stop ( ) ;
void LoadFileThread ( ) ;
void LoadResourceThread ( ) ;
private :
2022-08-21 21:08:01 -04:00
std : : shared_ptr < Window > Context ;
2022-05-11 13:18:24 -04:00
volatile bool bIsRunning ;
2022-07-05 19:29:57 -04:00
std : : unordered_map < std : : string , std : : shared_ptr < File > > FileCache ;
std : : unordered_map < std : : string , std : : shared_ptr < Resource > > 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
} ;
}