#ifndef XNA_CONTENT_MANAGER_HPP #define XNA_CONTENT_MANAGER_HPP #include "../default.hpp" #include #include #include #include "../csharp/stream.hpp" namespace xna { class ContentManager { public: ContentManager(String const& rootDirectory) : _rootDirectory(rootDirectory), _path(rootDirectory){}; virtual ~ContentManager(){ Unload(); } constexpr String RootDirectory() const { return _rootDirectory; } void RootDirectory(String const& value) { _rootDirectory = value; _path = value; } virtual void Unload() { if (_loadedAssets.empty()) return; _loadedAssets.clear(); } template sptr Load(String const& assetName) { if (assetName.empty()) return nullptr; if (_loadedAssets.contains(assetName)) { const auto& ptr = _loadedAssets[assetName]; const auto obj1 = reinterpret_pointer_cast(ptr); return obj1; } const auto obj2 = ReadAsset(assetName); return obj2; } protected: template sptr ReadAsset(String const& assetName) { auto input = OpenStream(assetName); auto contentReader = ContentReader::Create(this, input, assetName); return contentReader->ReadAsset(); } sptr OpenStream(String const& assetName) { String filePath = _rootDirectory + "\\" + assetName + contentExtension; const auto stream = New(filePath); return reinterpret_pointer_cast(stream); } private: String _rootDirectory; std::filesystem::path _path; std::map> _loadedAssets; inline const static String contentExtension = ".xnb"; }; } #endif