diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | src/crepe/api/AssetManager.h | 45 | ||||
-rw-r--r-- | src/crepe/facade/SDLContext.cpp | 2 | ||||
-rw-r--r-- | src/example/rendering.cpp | 11 |
4 files changed, 53 insertions, 7 deletions
@@ -15,4 +15,4 @@ compile_commands.json CTestTestfile.cmake _deps CMakeUserPresets.json - +compile.sh diff --git a/src/crepe/api/AssetManager.h b/src/crepe/api/AssetManager.h index fefbed9..68235c3 100644 --- a/src/crepe/api/AssetManager.h +++ b/src/crepe/api/AssetManager.h @@ -7,24 +7,69 @@ namespace crepe { + +/** + * \brief The AssetManager is responsible for storing and managing assets over multiple scenes. + * + * The AssetManager ensures that assets are loaded once and can be accessed across different scenes. + * It caches assets to avoid reloading them every time a scene is loaded. Assets are retained in memory + * until the AssetManager is destroyed, at which point the cached assets are cleared. + */ class AssetManager { private: + //! A cache that holds all the assets, accessible by their file path, over multiple scenes. std::unordered_map<std::string, std::any> asset_cache; private: + /** + * \brief Private constructor for the AssetManager. + * + */ AssetManager(); + + /** + * \brief Private destructor for the AssetManager. + * + */ virtual ~AssetManager(); public: + + //! Deleted copy constructor to prevent copying of the AssetManager instance. AssetManager(const AssetManager &) = delete; + + //! Deleted move constructor to prevent moving of the AssetManager instance. AssetManager(AssetManager &&) = delete; + + //! Deleted copy assignment operator to prevent copying the AssetManager instance. AssetManager & operator=(const AssetManager &) = delete; + + //! Deleted move assignment operator to prevent moving the AssetManager instance. AssetManager & operator=(AssetManager &&) = delete; + /** + * \brief Retrieves the singleton instance of the AssetManager. + * + * \return A reference to the single instance of the AssetManager. + * + */ static AssetManager & get_instance(); public: + /** + * \brief Caches an asset by loading it from the given file path. + * + * \param[in] file_path The path to the asset file to load. + * \param[in] reload If true, the asset will be reloaded from the file, even if it is already cached. + * \tparam asset The type of asset to cache (e.g., texture, sound, etc.). + * + * \return A shared pointer to the cached asset. + * + * This template function caches the asset at the given file path. If the asset is already cached + * and `reload` is false, the existing cached version will be returned. Otherwise, the asset will + * be reloaded and added to the cache. + */ template <typename asset> std::shared_ptr<asset> cache(const std::string & file_path, bool reload = false); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 39d0d4d..46230b4 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -159,7 +159,7 @@ SDLContext::texture_from_path(const std::string & path) { SDL_Surface * tmp = IMG_Load(path.c_str()); if (tmp == nullptr) { - throw Exception("surface cannot be load from %s", path.c_str()); + tmp = IMG_Load("../asset/texture/ERROR.png"); } std::unique_ptr<SDL_Surface, std::function<void(SDL_Surface *)>> diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index d554a8a..e02f6a3 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -1,3 +1,4 @@ +#include "api/Camera.h" #include <crepe/ComponentManager.h> #include <crepe/api/GameObject.h> #include <crepe/system/RenderSystem.h> @@ -23,26 +24,26 @@ int main() { auto obj1 = GameObject(1, "name", "tag", Vector2{500, 0}, 1, 0.1); auto obj2 = GameObject(2, "name", "tag", Vector2{800, 0}, 1, 0.1); - auto & mgr = AssetManager::get_instance(); // Normal adding components { Color color(0, 0, 0, 0); obj.add_component<Sprite>( make_shared<Texture>("../asset/texture/img.png"), color, - FlipSettings{true, true}); + FlipSettings{false, false}); + obj.add_component<Camera>(Color::get_red()); } - { Color color(0, 0, 0, 0); - auto img = mgr.cache<Texture>("../asset/texture/second.png"); - obj1.add_component<Sprite>(img, color, FlipSettings{true, true}); + obj1.add_component<Sprite>(make_shared<Texture>("../asset/texture/second.png"), color, FlipSettings{true, true}); } + /* { Color color(0, 0, 0, 0); auto img = mgr.cache<Texture>("../asset/texture/second.png"); obj2.add_component<Sprite>(img, color, FlipSettings{true, true}); } + */ auto & sys = crepe::RenderSystem::get_instance(); auto start = std::chrono::steady_clock::now(); |