From 45a4db4dcfdb98c609ff49290619853f53d2fd10 Mon Sep 17 00:00:00 2001 From: bailwillharr Date: Tue, 4 Oct 2022 11:54:23 +0100 Subject: [PATCH] Move game loop into engine lib --- CMakeLists.txt | 3 +- include/engine.hpp | 26 +++++++++++++---- include/engine_api.h | 2 ++ include/gfx_device.hpp | 4 +-- include/util.hpp | 18 ++++++++++++ src/engine.cpp | 59 ++++++++++++++++++++++++++++++++------- src/gfx_device_vulkan.cpp | 16 ++++++----- 7 files changed, 101 insertions(+), 27 deletions(-) create mode 100644 include/util.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ec08e0..afce8dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,8 @@ add_library(${PROJECT_NAME} STATIC "include/engine.hpp" + "include/util.hpp" + "include/log.hpp" "include/window.hpp" @@ -67,7 +69,6 @@ add_library(${PROJECT_NAME} STATIC "include/gfx.hpp" "include/gfx_device.hpp" - ) # compiling options: diff --git a/include/engine.hpp b/include/engine.hpp index 6e77afc..56b3db5 100644 --- a/include/engine.hpp +++ b/include/engine.hpp @@ -1,13 +1,27 @@ #pragma once +#include + namespace engine { - struct AppInfo { - const char* name; - const char* version; + class Window; + class GFXDevice; + + class Application { + + public: + Application(const char* appName, const char* appVersion); + + Application(const Application&) = delete; + Application& operator=(const Application&) = delete; + + ~Application(); + + void gameLoop(); + + private: + std::unique_ptr m_win; + std::unique_ptr m_gfx; }; - - bool versionFromCharArray(const char* version, int* major, int* minor, int* patch); - } diff --git a/include/engine_api.h b/include/engine_api.h index 1e2719d..3c0015b 100644 --- a/include/engine_api.h +++ b/include/engine_api.h @@ -1,5 +1,6 @@ #pragma once +/* #ifndef ENGINE_API # ifdef _MSC_VER # ifdef ENGINE_EXPORTS @@ -11,5 +12,6 @@ # define ENGINE_API # endif #endif +*/ #define ENGINE_API \ No newline at end of file diff --git a/include/gfx_device.hpp b/include/gfx_device.hpp index a4d896f..e54bf41 100644 --- a/include/gfx_device.hpp +++ b/include/gfx_device.hpp @@ -2,8 +2,6 @@ #include "engine_api.h" -#include "engine.hpp" - #include struct SDL_Window; @@ -13,7 +11,7 @@ namespace engine { class ENGINE_API GFXDevice { public: - GFXDevice(AppInfo appInfo, SDL_Window* window); + GFXDevice(const char* appName, const char* appVersion, SDL_Window* window); GFXDevice(const GFXDevice&) = delete; GFXDevice& operator=(const GFXDevice&) = delete; diff --git a/include/util.hpp b/include/util.hpp new file mode 100644 index 0000000..6de177d --- /dev/null +++ b/include/util.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace engine { + + inline bool versionFromCharArray(const char* version, int* major, int* minor, int* patch) + { + if (sscanf(version, "%d.%d.%d", major, minor, patch) != 3) { + *major = 0; + *minor = 0; + *patch = 0; + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/src/engine.cpp b/src/engine.cpp index c13c74e..e2bc81b 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1,18 +1,57 @@ #include "engine.hpp" -#include +#include "window.hpp" +#include "gfx_device.hpp" namespace engine { -bool versionFromCharArray(const char* version, int* major, int* minor, int* patch) -{ - if (sscanf(version, "%d.%d.%d", major, minor, patch) != 3) { - *major = 0; - *minor = 0; - *patch = 0; - return false; + Application::Application(const char* appName, const char* appVersion) + { + m_win = std::make_unique(appName); + m_gfx = std::make_unique(appName, appVersion, m_win->m_handle); + } + + Application::~Application() + { + + } + + void Application::gameLoop() + { + uint64_t lastTick = m_win->getNanos(); + constexpr int TICKFREQ = 20; // in hz + + // single-threaded game loop + while (m_win->isRunning()) { + + /* logic */ + + if (m_win->getLastFrameStamp() >= lastTick + (BILLION / TICKFREQ)) { + lastTick = m_win->getLastFrameStamp(); + + // do tick stuff here + + } + + if (m_win->getKeyPress(inputs::Key::F11)) { + if (m_win->isFullscreen()) { + m_win->setFullscreen(false); + } + else { + m_win->setFullscreen(true, false); // borderless window + } + } + if (m_win->getKeyPress(inputs::Key::ESCAPE)) { + m_win->setCloseFlag(); + } + + /* draw */ + m_gfx->draw(); + + /* poll events */ + m_win->getInputAndEvents(); + + } } - return true; -} } diff --git a/src/gfx_device_vulkan.cpp b/src/gfx_device_vulkan.cpp index 5f5330a..9256d45 100644 --- a/src/gfx_device_vulkan.cpp +++ b/src/gfx_device_vulkan.cpp @@ -4,6 +4,8 @@ #include "gfx_device.hpp" +#include "util.hpp" + #include "config.h" #include "log.hpp" @@ -49,7 +51,7 @@ namespace engine { class GFXDevice::Impl { public: - Impl(AppInfo appInfo, SDL_Window* window) + Impl(const char* appName, const char* appVersion, SDL_Window* window) { #ifdef NDEBUG // release mode: don't use validation layer @@ -58,7 +60,7 @@ namespace engine { // debug mode: use validation layer LayerInfo layerInfo(true); #endif - auto instance = std::make_shared(appInfo, layerInfo, getRequiredVulkanExtensions(window)); + auto instance = std::make_shared(appName, appVersion, layerInfo, getRequiredVulkanExtensions(window)); volkLoadInstanceOnly(instance->getHandle()); @@ -110,19 +112,19 @@ namespace engine { class Instance { public: - Instance(AppInfo appInfo, const LayerInfo& layerInfo, const std::vector& windowExtensions) + Instance(const char* appName, const char* appVersion, const LayerInfo& layerInfo, const std::vector& windowExtensions) { VkResult res; int appVersionMajor = 0, appVersionMinor = 0, appVersionPatch = 0; - assert(versionFromCharArray(appInfo.version, &appVersionMajor, &appVersionMinor, &appVersionPatch)); + assert(versionFromCharArray(appVersion, &appVersionMajor, &appVersionMinor, &appVersionPatch)); int engineVersionMajor = 0, engineVersionMinor = 0, engineVersionPatch = 0; assert(versionFromCharArray(ENGINE_VERSION, &engineVersionMajor, &engineVersionMinor, &engineVersionPatch)); VkApplicationInfo applicationInfo{ .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = nullptr, - .pApplicationName = appInfo.name, + .pApplicationName = appName, .applicationVersion = VK_MAKE_VERSION(appVersionMajor, appVersionMinor, appVersionPatch), .pEngineName = "engine", .engineVersion = VK_MAKE_VERSION(engineVersionMajor, engineVersionMinor, engineVersionPatch), @@ -797,7 +799,7 @@ namespace engine { }; - GFXDevice::GFXDevice(AppInfo appInfo, SDL_Window* window) + GFXDevice::GFXDevice(const char* appName, const char* appVersion, SDL_Window* window) { VkResult res; res = volkInitialize(); @@ -811,7 +813,7 @@ namespace engine { throw std::runtime_error("The loaded Vulkan version must be at least 1.3"); } - m_pimpl = std::make_unique(appInfo, window); + m_pimpl = std::make_unique(appName, appVersion, window); }