#include "World.hpp" #include "GameObject.hpp" #include "PodVector.hpp" #include namespace ProjectBrussel_UNITY_ID { template void CallGameObjectRecursive(GameObject* start, TFunction&& func) { PodVector stack; stack.push_back(start); while (!stack.empty()) { auto obj = stack.back(); stack.pop_back(); for (auto child : obj->GetChildren()) { stack.push_back(child); } func(obj); } } struct DrawCall { GLuint vao; GLuint vbo; }; } // namespace ProjectBrussel_UNITY_ID struct GameWorld::RenderData { void SubmitDrawCalls() { // TODO } }; GameWorld::GameWorld() : mRender{ new RenderData() } , mRoot{ new GameObject(this) } { } GameWorld::~GameWorld() { if (mAwakened) { Resleep(); } delete mRender; delete mRoot; } const GameObject& GameWorld::GetRoot() const { return *mRoot; }; void GameWorld::Awaken() { if (mAwakened) return; ProjectBrussel_UNITY_ID::CallGameObjectRecursive(mRoot, [](GameObject* obj) { obj->Awaken(); }); mAwakened = true; } void GameWorld::Resleep() { if (!mAwakened) return; ProjectBrussel_UNITY_ID::CallGameObjectRecursive(mRoot, [](GameObject* obj) { obj->Resleep(); }); mAwakened = false; } void GameWorld::Update() { ProjectBrussel_UNITY_ID::CallGameObjectRecursive(mRoot, [this](GameObject* obj) { obj->Update(); }); } void GameWorld::Draw() { } GameObject& GameWorld::GetRoot() { return *mRoot; } bool GameWorld::IsAwake() const { return mAwakened; }