diff options
author | rtk0c <[email protected]> | 2022-05-30 17:03:20 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-05-30 17:03:20 -0700 |
commit | e66286ebe30afc9acc4531fc2bea29b7fb924f93 (patch) | |
tree | fa6b76554c3eb88bc8f088fbab68e20c40118ca7 /source/30-game/App.cpp | |
parent | 366ef5a5450c6e0e680c924c3454943a9ae9814d (diff) |
Changeset: 56 Buildsystem cleanup: change to layered structure for different targets
Diffstat (limited to 'source/30-game/App.cpp')
-rw-r--r-- | source/30-game/App.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/source/30-game/App.cpp b/source/30-game/App.cpp new file mode 100644 index 0000000..45a7545 --- /dev/null +++ b/source/30-game/App.cpp @@ -0,0 +1,149 @@ +#include "App.hpp" + +#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); +} + +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)); +} |