aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.engine/World.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/brussel.engine/World.cpp')
-rw-r--r--src/brussel.engine/World.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/brussel.engine/World.cpp b/src/brussel.engine/World.cpp
new file mode 100644
index 0000000..83b9a10
--- /dev/null
+++ b/src/brussel.engine/World.cpp
@@ -0,0 +1,79 @@
+#include "World.hpp"
+
+#include "GameObject.hpp"
+#include "PodVector.hpp"
+
+#include <glad/glad.h>
+
+namespace ProjectBrussel_UNITY_ID {
+template <typename TFunction>
+void CallGameObjectRecursive(GameObject* start, TFunction&& func) {
+ PodVector<GameObject*> 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);
+ }
+}
+} // namespace ProjectBrussel_UNITY_ID
+
+GameWorld::GameWorld()
+ : mRoot{ new GameObject(this) } {
+}
+
+GameWorld::~GameWorld() {
+ if (mAwakened) {
+ Resleep();
+ }
+
+ delete mRoot;
+}
+
+const GameObject& GameWorld::GetRoot() const {
+ return *mRoot;
+};
+
+void GameWorld::Awaken() {
+ using namespace ProjectBrussel_UNITY_ID;
+
+ if (mAwakened) {
+ return;
+ }
+
+ CallGameObjectRecursive(mRoot, [](GameObject* obj) { obj->Awaken(); });
+ mAwakened = true;
+}
+
+void GameWorld::Resleep() {
+ using namespace ProjectBrussel_UNITY_ID;
+
+ if (!mAwakened) {
+ return;
+ }
+
+ CallGameObjectRecursive(mRoot, [](GameObject* obj) { obj->Resleep(); });
+ mAwakened = false;
+}
+
+void GameWorld::Update() {
+ using namespace ProjectBrussel_UNITY_ID;
+
+ CallGameObjectRecursive(mRoot, [this](GameObject* obj) {
+ obj->Update();
+ });
+}
+
+GameObject& GameWorld::GetRoot() {
+ return *mRoot;
+}
+
+bool GameWorld::IsAwake() const {
+ return mAwakened;
+}