#pragma once #include #include #include #include #include #include namespace XCEngine { namespace Resources { struct LoadResult { IResource* resource = nullptr; bool success = false; Containers::String errorMessage; LoadResult() = default; explicit LoadResult(IResource* res) : resource(res), success(res != nullptr) {} explicit LoadResult(const Containers::String& error) : success(false), errorMessage(error) {} explicit LoadResult(bool inSuccess, const Containers::String& error = "") : success(inSuccess), errorMessage(error) {} operator bool() const { return success && resource != nullptr; } }; class IResourceLoader { public: virtual ~IResourceLoader() = default; virtual ResourceType GetResourceType() const = 0; virtual Containers::Array GetSupportedExtensions() const = 0; virtual bool CanLoad(const Containers::String& path) const = 0; virtual LoadResult Load(const Containers::String& path, const ImportSettings* settings = nullptr) = 0; virtual void LoadAsync(const Containers::String& path, const ImportSettings* settings, std::function callback) { LoadResult result = Load(path, settings); if (callback) { callback(result); } } virtual ImportSettings* GetDefaultSettings() const = 0; protected: static Containers::Array ReadFileData(const Containers::String& path); static Containers::String GetExtension(const Containers::String& path); }; #define REGISTER_RESOURCE_LOADER(loaderType) \ namespace { \ struct loaderType##Registrar { \ loaderType##Registrar() { \ ResourceManager::Get().RegisterLoader(new loaderType()); \ } \ } g_##loaderType##Registrar; \ } } // namespace Resources } // namespace XCEngine