#pragma once #include "EditorAttachment.hpp" #include "Material.hpp" #include "PodVector.hpp" #include "Renderer.hpp" #include "VertexIndex.hpp" #include #include #include #include #include class GameWorld; class GameObject { public: enum Kind { KD_Generic, KD_Player, KD_SimpleGeometry, KD_Building, KD_LevelWrapper, KD_COUNT, }; private: std::unique_ptr mEditorAttachment; GameWorld* mWorld; GameObject* mParent; PodVector mChildren; glm::quat mRot; glm::vec3 mPos; glm::vec3 mScale; Kind mKind; protected: bool mStopFreePropagation : 1 = false; public: static void FreeRecursive(GameObject* object); // TODO allow moving between worlds GameObject(GameWorld* world); GameObject(Kind kind, GameWorld* world); virtual ~GameObject(); GameObject(const GameObject&) = delete; GameObject& operator=(const GameObject&) = delete; GameObject(GameObject&&) = default; GameObject& operator=(GameObject&&) = default; static std::string_view ToString(Kind kind); static Kind FromString(std::string_view name); Kind GetKind() const; GameWorld* GetWorld() const; GameObject* GetParent() const; const PodVector& GetChildren() const; void AddChild(GameObject* child); GameObject* RemoveChild(int index); GameObject* RemoveChild(GameObject* child); void RemoveSelfFromParent(); PodVector RemoveAllChildren(); EditorAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); } void SetEditorAttachment(EditorAttachment* attachment) { mEditorAttachment.reset(attachment); } const glm::vec3& GetPos() const; void SetPos(const glm::vec3& pos); const glm::quat& GetRotation() const; void SetRotation(const glm::quat& rotation); const glm::vec3& GetScale() const; void SetScale(const glm::vec3& scale); // Visuals virtual std::span GetRenderObjects() const; // Lifetime hooks virtual void OnInitialized(); virtual void Awaken(); virtual void Resleep(); virtual void Update(); static rapidjson::Value Serialize(GameObject* obj, rapidjson::Document& root); static std::unique_ptr Deserialize(const rapidjson::Value& value, GameWorld* world); virtual void ReadSaveFormat(const rapidjson::Value& value); virtual void WriteSaveFormat(rapidjson::Value& value, rapidjson::Document& root); protected: void SetParent(GameObject* parent); };