/****************************************************************************** * File - content_manager.h * Author - Joey Pollack * Date - 2022/02/22 (y/m/d) * Mod Date - 2022/02/22 (y/m/d) * Description - Keeps track of all resource files in the project. * Reads/Writes meta-data to the contents_meta.xml file. * Also manages the physical location of each asset file. ******************************************************************************/ #ifndef CONTENT_MANAGER_H_ #define CONTENT_MANAGER_H_ #include "definitions.h" #include #include #include #include #include namespace pugi { class xml_node; } namespace lunarium { namespace editor { class Project; class EditorAsset; class ContentManager { public: static ContentManager& GetInstance(); static void FreeInstance(); [[nodiscard]] OpRes Load(Project* project); [[nodiscard]] OpRes Save(); void Unload(); void GetAllAssetIDs(std::vector& container) const; void GetAllAssetsByType(std::vector& container, AssetType type) const; EditorAsset* GetAsset(uint64_t id); /// Add an asset that was generated by the editor (like tile maps or scripts) [[nodiscard]] OpRes AddGeneratedAsset(EditorAsset* asset, uint64_t& id); /// Import a raw asset file from outside of the project (like image or sound files) /// file: the full path to the raw file /// to_location: the location inside the project's asset directory to import to (this MUST be a relative path starting in the Asset dir) [[nodiscard]] OpRes ImportFile(std::filesystem::path file, std::filesystem::path to_location, AssetType type, uint64_t& id); void RemoveAsset(uint64_t asset_id); private: static ContentManager* mpInstance; Project* mpProject; std::filesystem::path mContentFile; std::map mAssets; uint64_t mNextID; private: ContentManager(); ContentManager(ContentManager&) = delete; ContentManager& operator=(const ContentManager&) = delete; private: // Helpers [[nodiscard]] bool IsValidAsset(pugi::xml_node& node); [[nodiscord]] EditorAsset* CreateAsset(AssetType type); void FreeAssets(); }; }} #endif // CONTENT_MANAGER_H_