From 829c7b5c524f10dcc069a038c1bdcadabec8b89a Mon Sep 17 00:00:00 2001 From: Jimmy Tremblay-Bernier Date: Fri, 22 Nov 2024 18:54:08 -0500 Subject: [PATCH] CONGE-2 Reworked the API for the application to move more of the logic and initialization to the Engine and just have the application specifics in Demo1 --- .../src/ConjureEngine/Application.cpp | 45 ++++++++++++++++++- ConjureEngine/src/ConjureEngine/Application.h | 24 +++++++++- .../src/ConjureEngine/VulkanContext.cpp | 8 +++- .../src/ConjureEngine/VulkanContext.h | 4 +- Demo1/src/Demo1.cpp | 41 +++++++---------- Demo1/src/Demo1.h | 6 ++- Demo1/src/main.cpp | 4 +- 7 files changed, 98 insertions(+), 34 deletions(-) diff --git a/ConjureEngine/src/ConjureEngine/Application.cpp b/ConjureEngine/src/ConjureEngine/Application.cpp index 1530cb9..a56d7df 100644 --- a/ConjureEngine/src/ConjureEngine/Application.cpp +++ b/ConjureEngine/src/ConjureEngine/Application.cpp @@ -3,6 +3,7 @@ // #include "Application.h" +#include "VulkanContext.h" namespace ConjureEngine { Application::Application(const ApplicationInfo &applicationInfo): m_applicationInfo(applicationInfo) { @@ -15,7 +16,47 @@ namespace ConjureEngine { m_vkAppInfo.apiVersion = VK_API_VERSION_1_0; } - int Application::Run() const { return 0; } - void Application::Tick(double deltaTime) const {} + int Application::Run() + { + // CREATE SDL WINDOW + Window window(this->m_applicationInfo.title.c_str(), m_applicationInfo.window); + // INIT VULKAN + VulkanContext vulkanContext; + vulkanContext.AttachTo(window.GetWindow(), this->m_vkAppInfo); + + // INITIALIZATION OF THE WORLD + this->Awake(); + this->Start(); + + // MAIN LOOP + bool running = true; + + static uint64_t lastTick = SDL_GetTicks64(); // TIME IS IN MS + while (running) { + + + // HANDLE INPUTS HERE (CODE BELOW IS FROM A TUTORIAL) + SDL_Event windowEvent; + while (SDL_PollEvent(&windowEvent)) { + if (windowEvent.type == SDL_QUIT) { + running = false; + break; + } + } + + // TICK SCENE HERE + const uint64_t currentTick = SDL_GetTicks64(); // TIME IS IN MS + const uint64_t deltaTime = currentTick - lastTick; // TIME IS IN MS + this->Tick(static_cast(deltaTime)/1000.f); + + // HANDLE PHYSICS HERE + lastTick = currentTick; + } + + // CLEANUP HERE + this->Destroy(); + + return 0; + } } // ConjureEngine diff --git a/ConjureEngine/src/ConjureEngine/Application.h b/ConjureEngine/src/ConjureEngine/Application.h index eedec4f..67a5d87 100644 --- a/ConjureEngine/src/ConjureEngine/Application.h +++ b/ConjureEngine/src/ConjureEngine/Application.h @@ -23,9 +23,29 @@ namespace ConjureEngine { explicit Application(const ApplicationInfo &applicationInfo); virtual ~Application() = default; - virtual int Run() const; + int Run(); + + /** + * First function call right after SDL and VULKAN are init + */ + virtual inline void Awake() {}; + + /** + * Called after awake is done + */ + virtual inline void Start() {}; + + /** + * Called every frame after Start + * @param deltaTime Time in seconds since last call to Tick + */ + virtual inline void Tick(double deltaTime) {} + + /** + * Call when the application is being closed + */ + virtual inline void Destroy() {}; - virtual void Tick(double deltaTime) const; protected: public: diff --git a/ConjureEngine/src/ConjureEngine/VulkanContext.cpp b/ConjureEngine/src/ConjureEngine/VulkanContext.cpp index f27cce7..35599e2 100644 --- a/ConjureEngine/src/ConjureEngine/VulkanContext.cpp +++ b/ConjureEngine/src/ConjureEngine/VulkanContext.cpp @@ -4,14 +4,18 @@ #include "VulkanContext.h" +#include "Window.h" + #ifdef __APPLE__ #include "vulkan/vulkan_metal.h" #endif namespace ConjureEngine { - VulkanContext::VulkanContext(SDL_Window* window, const VkApplicationInfo& appInfo) + VulkanContext::VulkanContext()= default; + + void VulkanContext::AttachTo(SDL_Window* window, const VkApplicationInfo& appInfo) { - // LOAD THE EXTENSIONS + // LOAD THE EXTENSIONS SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, nullptr); m_extensionNames.reserve(m_extensionCount); SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, m_extensionNames.data()); diff --git a/ConjureEngine/src/ConjureEngine/VulkanContext.h b/ConjureEngine/src/ConjureEngine/VulkanContext.h index f667312..a0e7aa8 100644 --- a/ConjureEngine/src/ConjureEngine/VulkanContext.h +++ b/ConjureEngine/src/ConjureEngine/VulkanContext.h @@ -9,8 +9,10 @@ namespace ConjureEngine { class VulkanContext { public: - explicit VulkanContext(SDL_Window* window, const VkApplicationInfo& appInfo); + explicit VulkanContext(); ~VulkanContext(); + void AttachTo(SDL_Window* window, const VkApplicationInfo& appInfo); + private: void EnableGlobalExtentions(SDL_Window* window, VkInstanceCreateInfo &vulkanInfos); private: diff --git a/Demo1/src/Demo1.cpp b/Demo1/src/Demo1.cpp index 2fdcca5..da119e8 100644 --- a/Demo1/src/Demo1.cpp +++ b/Demo1/src/Demo1.cpp @@ -19,31 +19,24 @@ static ConjureEngine::ApplicationInfo appInfo = ConjureEngine::ApplicationInfo namespace Demo1 { Demo1::Demo1(): ConjureEngine::Application(appInfo) {} - - int Demo1::Run() const { - ConjureEngine::Window window(appInfo.title.c_str(), m_applicationInfo.window); - - // INIT VULKAN - ConjureEngine::VulkanContext vulkanContext(window.GetWindow(), this->m_vkAppInfo); - - bool running = true; - while (running) { - SDL_Event windowEvent; - uint64_t timeSinceStart = SDL_GetTicks64(); - - while (SDL_PollEvent(&windowEvent)) { - if (windowEvent.type == SDL_QUIT) { - running = false; - break; - } - } - - this->Tick((double)timeSinceStart/1000.0f); - } - - return 0; + void Demo1::Awake() + { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - AWAKING"); } - void Demo1::Tick(double deltaTime) const {} + void Demo1::Start() + { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - STARTING"); + } + + void Demo1::Tick(double deltaTime) + { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[DEMO1 - TRACE] - TICKING %f", deltaTime); + } + + void Demo1::Destroy() + { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - DESTROYING"); + } } // Demo1 diff --git a/Demo1/src/Demo1.h b/Demo1/src/Demo1.h index a6e8846..73a5e7b 100644 --- a/Demo1/src/Demo1.h +++ b/Demo1/src/Demo1.h @@ -10,8 +10,10 @@ namespace Demo1 { class Demo1: public ConjureEngine::Application { public: Demo1(); - int Run() const override; - void Tick(double deltaTime) const override; + void Awake() override; + void Start() override; + void Tick(double deltaTime) override; + void Destroy() override; }; } // Demo1 \ No newline at end of file diff --git a/Demo1/src/main.cpp b/Demo1/src/main.cpp index 33d1642..9ad6781 100644 --- a/Demo1/src/main.cpp +++ b/Demo1/src/main.cpp @@ -6,7 +6,9 @@ int main ( int argc, char* argv[] ) { SDL_SetMainReady(); - const Demo1::Demo1 app; + // I WANT TO CREATE AN APP + Demo1::Demo1 app; + // AND THEN START IT return app.Run(); } \ No newline at end of file