#ifndef _H_RESOURCEMANAGER_H #define _H_RESOURCEMANAGER_H #include #include #include #include "graphics/background.h" #include "graphics/shader.h" #include "graphics/sprite.h" #include "sound/soundeffect.h" #include "utility/script.h" #include "utility/xmlloader.h" #include class Weapon; class AnimationSet; class SpriteComponent; class ResourceManager { public: ResourceManager() : xmlLoader(std::make_shared()) { xmlLoader->loadWeapons("weapons"); xmlLoader->loadAnimations("animations"); xmlLoader->loadMonsters("monsters"); xmlLoader->loadTileSets("maps/tilesets"); xmlLoader->loadMaps("maps"); xmlLoader->loadScripts("scripts", loadLuaString); xmlLoader->loadScenes("scenes"); xmlLoader->loadSoundEffects("sounds"); shaders["__fallback__"] = std::make_unique(); }; // Returns a NON-OWNING pointer to a sprite atlas SpriteAtlas *loadSpriteAtlas(const std::string &path, float frameSize, bool isDirectional = false); // Returns a NON-OWNING pointer to a static sprite Sprite *loadSpriteStatic(const std::string &path); // Returns a NON-OWNING pointer to a background Background *loadBackground(const std::string &path); const unsigned loadSoundEffect(const std::string &id); template std::unique_ptr loadScript(const std::string &id); std::unique_ptr loadWeapon(const std::string &name, const unsigned weaponShaderID, const unsigned bulletShaderID); const unsigned loadShader(const std::string &name, const std::string &vertexPath, const std::string &fragPath); const SceneData *loadScene(const std::string &id); const TileSetData *loadTileSet(const std::string &name); const std::vectorloadAnimationSet(const std::string &id); // Returns a NON-OWNING pointer to a shader by ID Shader *getShaderByID(unsigned int ID); void clearResources(); ~ResourceManager(); private: std::unordered_map> shaders; std::unordered_map shaderIDs; std::unordered_map> sounds; std::unordered_map> sprites; std::unordered_map> backgrounds; std::unordered_map> tileSets; std::shared_ptr xmlLoader; static bool loadLuaString(ScriptData *script); }; template std::unique_ptr ResourceManager::loadScript(const std::string &id) { const ScriptData *data = xmlLoader->getScriptData(id); if (data == nullptr) return nullptr; try { std::unique_ptr script = std::make_unique(data->script); return std::move(script); } catch (std::exception &e) { LOG(ERROR, "Failed to load script '{}'", data->fileName); return nullptr; } } #endif // _H_RESOURCEMANAGER_H