#pragma once #include "GameObjectTypeTag.hpp" #include "Material.hpp" #include "Mesh.hpp" #include "PodVector.hpp" #include #include #include class GameWorld; class GameObject { private: GameWorld* mWorld; GameObject* mParent; 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(); GameWorld* GetWorld() const; GameObject* GetParent() const; const PodVector& GetChildren() const; void AddChild(GameObject* child); GameObject* RemoveChild(int index); GameObject* RemoveChild(GameObject* child); PodVector RemoveAllChildren(); // Tag virtual Tags::GameObjectMemoryManagement GetMemoryManagement() const; virtual Tags::GameObjectType GetTypeTag() const; // Visuals virtual const Material* GetMeshMaterial() const; virtual const Mesh* GetMesh() const; // Lifetime hooks virtual void Awaken(); virtual void Resleep(); virtual void Update(); protected: void SetParent(GameObject* parent); };