From b908636868b6059ead42e549aa1f5203b43d3bef Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Mon, 31 Jul 2023 17:35:03 +0200 Subject: [PATCH] [#138]: Correcly handle Window focus --- editor/editor.cpp | 13 ++----------- editor/editor.hpp | 9 --------- engine/core/application.cpp | 7 +++++++ engine/core/application.hpp | 15 ++++++++++++--- engine/game/game.cpp | 18 +++++++++++------- engine/logger/logger.hpp | 1 - engine/logger/logger.impl.hpp | 1 + engine/renderer/window/window.cpp | 8 ++++++++ engine/renderer/window/window.hpp | 2 ++ 9 files changed, 43 insertions(+), 31 deletions(-) diff --git a/editor/editor.cpp b/editor/editor.cpp index 2b0ef504..1585beb8 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -89,12 +89,10 @@ Editor::KeyCallback(const KeyEvent& event) { if (m_gameObjectSelected && event.key_ == GLFW_KEY_C) { - Logger::Info("Copy object!"); m_copiedGameObject = m_currentSelectedGameObject; } if (m_copiedGameObject && event.key_ == GLFW_KEY_V) { - Logger::Info("Paste object!"); CopyGameObject(m_copiedGameObject); } } @@ -109,13 +107,6 @@ Editor::MouseScrollCallback(const MouseScrollEvent& event) } } -void -Editor::WindowFocusCallback(const WindowFocusEvent& event) -{ - renderer::VulkanRenderer::GetRenderData().windowFocus_ = event.focus_; - windowInFocus_ = event.focus_; -} - void Editor::MouseButtonCallback(const MouseButtonEvent& event) { @@ -813,8 +804,8 @@ Editor::LoadLevel(const std::string& levelPath) m_levelLoaded = true; gui_.LevelLoaded(m_currentLevel); - - workQueue_.PushWorkUnit([this] { return windowInFocus_; }, [this] { SetupRendererData(); }); + m_window->MakeFocus(); + SetupRendererData(); } void diff --git a/editor/editor.hpp b/editor/editor.hpp index 6698ce86..a5074bab 100644 --- a/editor/editor.hpp +++ b/editor/editor.hpp @@ -9,8 +9,6 @@ #include "object.hpp" #include "player.hpp" #include "utils/time/time_step.hpp" -#include "utils/time/timer.hpp" -#include "work_queue.hpp" #include #include @@ -58,9 +56,6 @@ class Editor : public Application void MouseScrollCallback(const MouseScrollEvent& event) override; - void - WindowFocusCallback(const WindowFocusEvent& event) override; - void Render(VkCommandBuffer cmdBuffer) override; @@ -209,8 +204,6 @@ class Editor : public Application bool m_mousePressedLastUpdate = false; bool m_mouseDrag = false; - bool windowInFocus_ = true; - glm::vec2 m_lastCursorPosition = {}; // Handling game objects (which are visible in game) @@ -241,8 +234,6 @@ class Editor : public Application bool m_playGame = false; time::TimeStep timeLastFrame_ = time::TimeStep{time::microseconds{}}; - - WorkQueue workQueue_ = {}; }; } // namespace looper diff --git a/engine/core/application.cpp b/engine/core/application.cpp index 562cb81e..7e80c6dc 100644 --- a/engine/core/application.cpp +++ b/engine/core/application.cpp @@ -83,4 +83,11 @@ Application::ScreenToGlobal(const glm::vec2& screenPos) const return globalPos; } +void +Application::WindowFocusCallback(const WindowFocusEvent& event) +{ + renderer::VulkanRenderer::GetRenderData().windowFocus_ = event.focus_; + windowInFocus_ = event.focus_; +} + } // namespace looper diff --git a/engine/core/application.hpp b/engine/core/application.hpp index f966a716..9e6b003c 100644 --- a/engine/core/application.hpp +++ b/engine/core/application.hpp @@ -1,10 +1,11 @@ #pragma once -#include "renderer/camera/camera.hpp" #include "input_listener.hpp" #include "level.hpp" -#include "logger.hpp" #include "utils/time/timer.hpp" +#include "logger.hpp" +#include "renderer/camera/camera.hpp" +#include "work_queue.hpp" #include #include @@ -47,7 +48,8 @@ class Application : public InputListener [[nodiscard]] time::milliseconds GetDeltaTime() const; - [[nodiscard]] int32_t GetFramesLastSecond() const + [[nodiscard]] int32_t + GetFramesLastSecond() const { return m_framesLastSecond; } @@ -84,11 +86,16 @@ class Application : public InputListener [[nodiscard]] virtual float GetZoomLevel() const = 0; + void + WindowFocusCallback(const WindowFocusEvent& event) override; + protected: [[nodiscard]] virtual bool IsRunning() const = 0; bool m_isGame = false; + bool windowInFocus_ = true; + std::shared_ptr< Player > m_player = nullptr; std::shared_ptr< Level > m_currentLevel = nullptr; @@ -100,6 +107,8 @@ class Application : public InputListener float m_frameTimer = 0.0f; int32_t m_framesLastSecond = 0; uint32_t numObjects_ = {}; + + WorkQueue workQueue_ = {}; }; diff --git a/engine/game/game.cpp b/engine/game/game.cpp index 7e4c137c..708ff7d7 100644 --- a/engine/game/game.cpp +++ b/engine/game/game.cpp @@ -26,12 +26,16 @@ Game::MainLoop() while (IsRunning() and (singleFrameTimer.count() >= TARGET_TIME_MICRO)) { - m_window->Clear(); const auto dt = time::milliseconds( TARGET_TIME_MS * static_cast< float >(time::Timer::AreTimersRunning())); ProcessInput(dt); - renderer::VulkanRenderer::Render(this); + workQueue_.RunWorkUnits(); + if (windowInFocus_) + { + renderer::VulkanRenderer::Render(this); + } + if (m_frameTimer > 1.0f) { m_framesLastSecond = m_frames; @@ -67,6 +71,7 @@ Game::Init(const std::string& configFile, bool loadLevel) } m_window = std::make_unique< renderer::Window >(USE_DEFAULT_SIZE, "WindowTitle"); + m_window->MakeFocus(); renderer::VulkanRenderer::Initialize(m_window->GetWindowHandle(), renderer::ApplicationType::GAME); @@ -297,7 +302,8 @@ Game::LoadLevel(const std::string& pathToLevel) m_camera.Create(glm::vec3(m_player->GetCenteredPosition(), 0.0f), m_window->GetSize()); m_camera.SetLevelSize(m_currentLevel->GetSize()); - renderer::VulkanRenderer::SetupData(); + workQueue_.PushWorkUnit([this] { return windowInFocus_; }, + [] { renderer::VulkanRenderer::SetupData(); }); } glm::vec2 @@ -389,7 +395,6 @@ Game::HandleReverseLogic() { ++m_frameCount; } - } } @@ -428,10 +433,9 @@ Game::Render(VkCommandBuffer cmdBuffer) // const auto numObjects = // renderer::VulkanRenderer::GetNumMeshes(renderer::ApplicationType::GAME); numObjects_ = // numObjects.second - numObjects.first; - vkCmdDrawIndexed(cmdBuffer, renderData.numMeshes.at(idx) * renderer::INDICES_PER_SPRITE, 1, - 0, 0, 0); + vkCmdDrawIndexed(cmdBuffer, renderData.numMeshes.at(idx) * renderer::INDICES_PER_SPRITE, 1, 0, + 0, 0); } - } } // namespace looper diff --git a/engine/logger/logger.hpp b/engine/logger/logger.hpp index eeed86e3..e2f968f9 100644 --- a/engine/logger/logger.hpp +++ b/engine/logger/logger.hpp @@ -1,7 +1,6 @@ #pragma once #include "formatter_types.hpp" -#include "utils/time/timer.hpp" #include diff --git a/engine/logger/logger.impl.hpp b/engine/logger/logger.impl.hpp index 79981a3e..587961cf 100644 --- a/engine/logger/logger.impl.hpp +++ b/engine/logger/logger.impl.hpp @@ -3,6 +3,7 @@ #undef GetCurrentTime #include "logger.hpp" +#include "time/timer.hpp" #include diff --git a/engine/renderer/window/window.cpp b/engine/renderer/window/window.cpp index 04107ed5..f315b5b1 100644 --- a/engine/renderer/window/window.cpp +++ b/engine/renderer/window/window.cpp @@ -69,6 +69,14 @@ Window::Resize(const glm::ivec2& newSize) size_ = newSize; } +void +Window::MakeFocus() +{ + glfwRestoreWindow(window_); + glfwShowWindow(window_); + glfwFocusWindow(window_); +} + void Window::Clear() { diff --git a/engine/renderer/window/window.hpp b/engine/renderer/window/window.hpp index 30d642df..a69afdb8 100644 --- a/engine/renderer/window/window.hpp +++ b/engine/renderer/window/window.hpp @@ -22,6 +22,8 @@ class Window void ShutDown(); + void MakeFocus(); + [[nodiscard]] glm::ivec2 GetSize() const {