#pragma once #include #include #include #include #include #include "Window.h" #include "Resource.h" #include "Archive.h" #include "File.h" namespace Ship { class Window; // 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 Context, const std::string& MainPath, const std::string& PatchesPath); ~ResourceMgr(); bool IsRunning(); bool DidLoadSuccessfully(); std::shared_ptr GetArchive() { return OTR; } std::shared_ptr GetContext() { return Context; } const std::string* HashToString(uint64_t Hash) const; void InvalidateResourceCache(); uint32_t GetGameVersion(); void SetGameVersion(uint32_t newGameVersion); std::shared_ptr LoadFileAsync(const std::string& FilePath); std::shared_ptr LoadFile(const std::string& FilePath); std::shared_ptr GetCachedFile(const char* FilePath) const; std::shared_ptr LoadResource(const char* FilePath); std::shared_ptr LoadResource(const std::string& FilePath) { return LoadResource(FilePath.c_str()); } std::variant, std::shared_ptr> LoadResourceAsync(const char* FilePath); std::shared_ptr>> CacheDirectory(const std::string& SearchMask); std::shared_ptr>> CacheDirectoryAsync(const std::string& SearchMask); std::shared_ptr>> DirtyDirectory(const std::string& SearchMask); std::shared_ptr> ListFiles(std::string SearchMask); protected: void Start(); void Stop(); void LoadFileThread(); void LoadResourceThread(); private: std::shared_ptr Context; volatile bool bIsRunning; std::unordered_map> FileCache; std::unordered_map> ResourceCache; std::queue> FileLoadQueue; std::queue> ResourceLoadQueue; std::shared_ptr OTR; std::shared_ptr FileLoadThread; std::shared_ptr ResourceLoadThread; std::mutex FileLoadMutex; std::mutex ResourceLoadMutex; std::condition_variable FileLoadNotifier; std::condition_variable ResourceLoadNotifier; uint32_t gameVersion; }; }