#pragma once #include "EditorCoreAPI.hpp" #include "GameObjectTypeTag.hpp" #include "Material.hpp" #include "Mesh.hpp" #include "PodVector.hpp" #include #include #include class GameWorld; class GameObject { public: // NOTE: public for editors std::unique_ptr mEditorAttachment = nullptr; GameWorld* mWorld = nullptr; GameObject* mParent = nullptr; PodVector mChildren; glm::quat mRot{}; glm::vec3 mPos{}; public: static void FreeRecursive(GameObject* object); // TODO allow moving between worlds explicit GameObject(GameWorld* world); virtual ~GameObject(); GameObject(const GameObject&) = delete; GameObject& operator=(const GameObject&) = delete; GameObject(GameObject&&) = default; GameObject& operator=(GameObject&&) = default; GameWorld* GetWorld() const; GameObject* GetParent() const; const PodVector& GetChildren() const; void AddChild(GameObject* child); GameObject* RemoveChild(int index); GameObject* RemoveChild(GameObject* child); PodVector RemoveAllChildren(); EditorGameObjectAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); } void SetEditorAttachment(EditorGameObjectAttachment* attachment) { mEditorAttachment.reset(attachment); } // Tag virtual Tags::GameObjectMemoryManagement GetMemoryManagement() const; virtual Tags::GameObjectType GetTypeTag() const; // Visuals virtual const Material* GetMeshMaterial() const; virtual const GpuMesh* GetMesh() const; // Lifetime hooks virtual void Awaken(); virtual void Resleep(); virtual void Update(); protected: void SetParent(GameObject* parent); };