aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.engine/App.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2023-10-19 22:50:07 -0700
committerrtk0c <[email protected]>2025-08-16 11:31:16 -0700
commit297232d21594b138bb368a42b5b0d085ff9ed6aa (patch)
tree075d5407e1e12a9d35cbee6e4c20ad34e0765c42 /src/brussel.engine/App.cpp
parentd5cd34ff69f7fd134d5450696f298af1a864afbc (diff)
The great renaming: switch to "module style"
Diffstat (limited to 'src/brussel.engine/App.cpp')
-rw-r--r--src/brussel.engine/App.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/brussel.engine/App.cpp b/src/brussel.engine/App.cpp
new file mode 100644
index 0000000..8328589
--- /dev/null
+++ b/src/brussel.engine/App.cpp
@@ -0,0 +1,168 @@
+#include "App.hpp"
+
+#include "ScopeGuard.hpp"
+#include "Utils.hpp"
+
+#include <rapidjson/document.h>
+#include <rapidjson/filereadstream.h>
+#include <string>
+#include <utility>
+
+using namespace std::literals;
+
+App::App()
+ : mActiveCamera{ &mMainCamera } {
+ auto& worldRoot = mWorld.GetRoot();
+
+ constexpr int kPlayerCount = 2;
+ for (int i = 0; i < kPlayerCount; ++i) {
+ auto player = new Player(&mWorld, i);
+ worldRoot.AddChild(player);
+ mPlayers.push_back(player);
+ };
+
+#if defined(BRUSSEL_DEV_ENV)
+ SetGameRunning(false);
+ SetEditorVisible(true);
+#else
+ SetGameRunning(true);
+#endif
+
+ mMainCamera.name = "Main Camera"s;
+ mMainCamera.SetEyePos(glm::vec3(0, 0, 1));
+ mMainCamera.SetTargetDirection(glm::vec3(0, 0, -1));
+ mMainCamera.SetHasPerspective(false);
+
+ do {
+ auto file = Utils::OpenCstdioFile("assets/GameRendererBindings.json", Utils::Read);
+ if (!file) break;
+ DEFER { fclose(file); };
+
+ char readerBuffer[65536];
+ rapidjson::FileReadStream stream(file, readerBuffer, sizeof(readerBuffer));
+
+ rapidjson::Document root;
+ root.ParseStream(stream);
+
+ mWorldRenderer.LoadBindings(root);
+ } while (false);
+}
+
+App::~App() {
+}
+
+Camera* App::GetActiveCamera() const {
+ return mActiveCamera;
+}
+
+void App::BindActiveCamera(Camera* camera) {
+ mActiveCamera = camera;
+}
+
+void App::UnbindActiveCamera() {
+ mActiveCamera = &mMainCamera;
+}
+
+bool App::IsGameRunning() const {
+ return mGameRunning;
+}
+
+void App::SetGameRunning(bool running) {
+ if (mGameRunning != running) {
+ mGameRunning = running;
+ if (running) {
+ mWorld.Awaken();
+ } else {
+ mWorld.Resleep();
+ }
+ }
+}
+
+bool App::IsEditorVisible() const {
+ return mEditorVisible;
+}
+
+void App::SetEditorVisible(bool visible) {
+ if (mEditorVisible != visible) {
+ if (visible) {
+#if BRUSSEL_ENABLE_EDITOR
+ mEditorVisible = true;
+ if (mEditor == nullptr) {
+ mEditor = IEditor::CreateInstance(this);
+ }
+#endif
+ } else {
+ mEditorVisible = false;
+ }
+ }
+}
+
+void App::Show() {
+ if (mEditorVisible) {
+ mEditor->Show();
+ }
+}
+
+void App::Update() {
+ if (IsGameRunning()) {
+ mWorld.Update();
+ }
+}
+
+void App::Draw(float currentTime, float deltaTime) {
+ mWorldRenderer.BeginFrame(*mActiveCamera, currentTime, deltaTime);
+
+ PodVector<GameObject*> stack;
+ stack.push_back(&mWorld.GetRoot());
+
+ while (!stack.empty()) {
+ auto obj = stack.back();
+ stack.pop_back();
+
+ for (auto child : obj->GetChildren()) {
+ stack.push_back(child);
+ }
+
+ auto renderObjects = obj->GetRenderObjects();
+ mWorldRenderer.Draw(renderObjects.data(), obj, renderObjects.size());
+ }
+
+ mWorldRenderer.EndFrame();
+}
+
+void App::HandleMouse(int button, int action) {
+}
+
+void App::HandleMouseMotion(double xOff, double yOff) {
+}
+
+void App::HandleKey(GLFWkeyboard* keyboard, int key, int action) {
+ if (!mKeyCaptureCallbacks.empty()) {
+ auto& callback = mKeyCaptureCallbacks.front();
+ bool remove = callback(key, action);
+ if (remove) {
+ mKeyCaptureCallbacks.pop_front();
+ }
+ }
+
+ switch (key) {
+ case GLFW_KEY_F3: {
+ if (action == GLFW_PRESS) {
+ SetEditorVisible(!IsEditorVisible());
+ }
+ return;
+ }
+ }
+
+ for (auto& player : mPlayers) {
+ for (auto playerKeyboard : player->boundKeyboards) {
+ if (playerKeyboard == keyboard) {
+ player->HandleKeyInput(key, action);
+ }
+ }
+ }
+}
+
+void App::PushKeyCaptureCallback(KeyCaptureCallback callback) {
+ mKeyCaptureCallbacks.push_back(std::move(callback));
+}