#pragma once #include "EditorAttachment.hpp" #include "Material.hpp" #include "PodVector.hpp" #include "Renderer.hpp" #include "VertexIndex.hpp" #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 = nullptr; GameWorld* mWorld = nullptr; GameObject* mParent = nullptr; PodVector mChildren; glm::quat mRot{}; glm::vec3 mPos{}; Kind mKind; protected: bool mStopFreePropagation : 1 = true; 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); PodVector RemoveAllChildren(); EditorAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); } void SetEditorAttachment(EditorAttachment* attachment) { mEditorAttachment.reset(attachment); } const glm::vec3& GetPos(); void SetPos(const glm::vec3& pos); const glm::quat& GetRotation() const; void SetRotation(const glm::quat& rotation); // Visuals virtual std::span GetRenderObjects() const; // Lifetime hooks virtual void OnInitialized(); virtual void Awaken(); virtual void Resleep(); virtual void Update(); protected: void SetParent(GameObject* parent); };