#pragma once #include "EditorAttachment.hpp" #include "RcPtr.hpp" #include "Uid.hpp" #include "Utils.hpp" #include #include #include #include #include // Forward declarations class EditorInstance; class IresManager; class IresObject : public RefCounted { friend class IresManager; public: enum Kind { KD_Texture, KD_Material, KD_SpriteFiles, KD_Spritesheet, KD_COUNT, }; private: std::string mName; // Serialized as filename Uid mUid; // Serialized in full mode std::unique_ptr mEditorAttachment; // Transient IresManager* mMan = nullptr; // Transient Kind mKind; // Serialized in full mode public: IresObject(Kind kind); virtual ~IresObject() = default; static std::string_view ToString(Kind kind); static Kind FromString(std::string_view name); static std::unique_ptr Create(Kind kind); Kind GetKind() const { return mKind; } IresManager* GetAssociatedManager() const { return mMan; } bool IsAnnoymous() const; const std::string& GetName() const { return mName; } void SetName(std::string name); const Uid& GetUid() const { return mUid; } void ShowName() const; void ShowFullName() const; virtual void ShowReference(EditorInstance& editor); virtual void ShowEditor(EditorInstance& editor); EditorAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); } void SetEditorAttachment(EditorAttachment* attachment) { mEditorAttachment.reset(attachment); } static void WriteFull(IresObject* ires, rapidjson::Value& value, rapidjson::Document& root); static std::unique_ptr ReadFull(const rapidjson::Value& value); static bool ReadPartial(IresObject* ires, const rapidjson::Value& value); virtual void Write(rapidjson::Value& value, rapidjson::Document& root) const; virtual void Read(const rapidjson::Value& value); }; class IresManager { public: static inline IresManager* instance = nullptr; private: robin_hood::unordered_map> mObjByUid; public: void DiscoverFilesDesignatedLocation(); void DiscoverFiles(const std::filesystem::path& dir); std::pair Add(IresObject* mat); IresObject* Load(const std::filesystem::path& filePath); void Delete(IresObject* ires); bool Rename(IresObject* ires, std::string newName); void Reload(IresObject* ires); void Save(IresObject* ires); void Save(IresObject* ires, const std::filesystem::path& filePath); const auto& GetObjects() const { return mObjByUid; } IresObject* FindIres(const Uid& uid); };