#pragma once #include #include #include #include #include "tsr.hpp" namespace TSR { template using AssetPtr = std::shared_ptr; class Asset { public: virtual ~Asset() {} }; class AssetMap { static std::map> s_assets; public: //AssetMap(Game& game_ref) : m_game_ref(game_ref) {} template static AssetPtr Get(const std::string& name) { try { AssetPtr asset_ptr; auto asset_it = s_assets.find(name); if (asset_it == s_assets.end() || asset_it->second.expired()) { asset_ptr = AssetPtr(new T(name)); //std::make_shared(m_fs_ref, name); s_assets[name] = asset_ptr; } else { asset_ptr = asset_it->second.lock(); } auto t_ptr = std::dynamic_pointer_cast(asset_ptr); if (!t_ptr) Throw("(AM) Asset type mismatch"); return t_ptr; } catch (std::exception ex) { Throw(std::string("(AM) Error loading \"") + name + std::string("\":\n") + std::string(ex.what())); } } }; }