#pragma once #include #include #include #include #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 Context, std::string MainPath, std::string PatchesPath); ~ResourceMgr(); bool IsRunning(); bool DidLoadSuccessfully(); std::shared_ptr GetArchive() { return OTR; } std::shared_ptr GetContext() { return Context.lock(); } std::string HashToString(uint64_t Hash); void InvalidateResourceCache(); uint32_t GetGameVersion(); void SetGameVersion(uint32_t newGameVersion); std::shared_ptr LoadFileAsync(std::string FilePath); std::shared_ptr LoadFile(std::string FilePath); std::shared_ptr GetCachedFile(std::string FilePath); std::shared_ptr LoadResource(std::string FilePath); std::shared_ptr LoadResourceAsync(std::string FilePath); std::shared_ptr>> CacheDirectory(std::string SearchMask); std::shared_ptr>> CacheDirectoryAsync(std::string SearchMask); std::shared_ptr>> DirtyDirectory(std::string SearchMask); protected: void Start(); void Stop(); void LoadFileThread(); void LoadResourceThread(); private: std::weak_ptr Context; std::map> FileCache; std::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; volatile bool bIsRunning; uint32_t gameVersion; }; }