#ifndef XNA_CONTENT_MANAGER_HPP #define XNA_CONTENT_MANAGER_HPP #include "../csharp/stream.hpp" #include "../default.hpp" #include "reader.hpp" #include #include #include #include "../game/servicecontainer.hpp" namespace xna { class ContentManager { public: friend class ContentReader; ContentManager(String const& rootDirectory, sptr const& services) : _rootDirectory(rootDirectory), _services(services), _path(rootDirectory){}; virtual ~ContentManager(){ Unload(); } sptr Services() { return _services; } 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 T Load(String const& assetName) { if (assetName.empty()) return nullptr; if (_loadedAssets.contains(assetName)) { auto& ptr = _loadedAssets[assetName]; auto obj1 = reinterpret_pointer_cast(ptr); return *obj1; } auto obj2 = ReadAsset(assetName); //auto obj3 = reinterpret_pointer_cast(obj2); return obj2; } protected: template T 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"; std::vector byteBuffer; sptr _services = nullptr; }; } #endif