#pragma once #include #include #include #include #include #include #include #include #include "CCallbackHandler.h" #define LINK_RESOURCE_TO_CLASS(_class, name) std::string _class::GetType() const { return #name; }; CFactoryInitter<_class, CResource> __resource_initter_ ## name = CFactoryInitter<_class, CResource>(#name, std::function*)>([](CFactoryInitter<_class, CResource>* tter) -> void { tter->m_factory = &CEngine::GetInstance()->ResourcesFactory; })); #define DEFINE_RESOURCE() std::string GetType() const override class CResource; class CLoadingContext { public: CLoadingContext(CResource* _current_resource = nullptr, const std::filesystem::path& _path = {}); virtual ~CLoadingContext() = default; CResource* CurrentResource = nullptr; std::filesystem::path LoadPath; void LoadRequired(); std::vector> RequiredResources; std::shared_future CurrentAsyncFuture; }; using CPipelineFunction = std::function)>; class CPipelineNode { public: CPipelineFunction Function; bool RunAsync = false; }; using CLoadPipeline = std::vector; using CLoadCallback = CCallbackHandler; class CLoadPipelinesCache { public: std::unordered_map Cache; std::unordered_map CacheCallbacks; }; class CResource : public std::enable_shared_from_this { public: enum class CLoadingStatus { None, Waiting, Sync, WaitingAsync, StartedAsync, CompletedAsync, WaitingForRequired, Done }; CResource(); virtual ~CResource(); virtual std::string GetType() const = 0; void SetupLoadPipeline(CLoadPipeline& pipeline); void V_BaseSetupLoadPipeline(CLoadPipeline& pipeline); virtual void V_SetupLoadPipeline(CLoadPipeline& pipeline); void StartPipeline(const std::filesystem::path& path); void ProcessPipeline(); void PipelineWaitForRequired(); void PipelineCheckRequired(); void Wait(); bool IsReady() const; virtual std::shared_ptr CreatePipelineContext(const std::filesystem::path& path); CLoadPipeline& GetLoadPipeline(); CLoadCallback& GetLoadPipelineSetupCallback(); bool Load(const std::filesystem::path& path); virtual bool V_Load(const std::filesystem::path& path); virtual bool V_SynchronisedLoad(); CLoadingStatus LoadingStatus = CLoadingStatus::None; std::string Name; std::vector LoadPipeline; std::shared_ptr LoadingContext; int LoadingFunctionIndex = -1; CCallbackHandler OnDoneLoading; std::shared_future WaitingFuture; };