aboutsummaryrefslogtreecommitdiff
path: root/ProjectBrussel/Game/World.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-06-03 23:30:01 -0700
committerrtk0c <[email protected]>2022-06-03 23:30:01 -0700
commit791b3f354b378769bffe623b05f1305c91b77101 (patch)
tree5409b311e6232eb4a6d3f8259b780d76b8ee1c59 /ProjectBrussel/Game/World.cpp
parent60ccc62f4934e44ad5b905fdbcf458302b8d8a09 (diff)
Changeset: 64 [WIP] Rename directoriesmaster-switch-to-build2
Diffstat (limited to 'ProjectBrussel/Game/World.cpp')
-rw-r--r--ProjectBrussel/Game/World.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/ProjectBrussel/Game/World.cpp b/ProjectBrussel/Game/World.cpp
new file mode 100644
index 0000000..d4a8344
--- /dev/null
+++ b/ProjectBrussel/Game/World.cpp
@@ -0,0 +1,74 @@
+#include "World.hpp"
+
+#include "GameObject.hpp"
+#include "PodVector.hpp"
+
+#include <glad/glad.h>
+
+namespace ProjectBrussel_UNITY_ID {
+template <class 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);
+ }
+}
+
+struct DrawCall {
+ GLuint vao;
+ GLuint vbo;
+};
+} // 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() {
+ 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();
+ });
+}
+
+GameObject& GameWorld::GetRoot() {
+ return *mRoot;
+}
+
+bool GameWorld::IsAwake() const {
+ return mAwakened;
+}