From ae8bb46a7d780ab2eaf277f637c1fb495f849909 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Mon, 26 Sep 2022 13:07:05 +0200 Subject: [PATCH] Engine+Example: Improve entrypoint via manual singleton --- example/src/game.cpp | 27 ++++++++++++++++++--------- example/src/game.h | 19 +++++++++++++++++++ src/inferno/application.cpp | 14 +++++++++++++- src/inferno/application.h | 15 ++++++++++++--- src/inferno/entrypoint.h | 10 +++------- 5 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 example/src/game.h diff --git a/example/src/game.cpp b/example/src/game.cpp index ad3e81c..abbe691 100644 --- a/example/src/game.cpp +++ b/example/src/game.cpp @@ -4,17 +4,26 @@ * SPDX-License-Identifier: MIT */ -#include "inferno.h" -#include "inferno/entrypoint.h" +#include "game.h" -class Game : public Inferno::Application +Game::Game() + : Application() { -public: - Game() : Application({}) {} - ~Game() {} -}; +} + +Game::~Game() +{ +} + +void Game::update() +{ +} + +void Game::render() +{ +} -Inferno::Application& Inferno::createApplication() +Inferno::Application* Inferno::createApplication(int argc, char* argv[]) { - return Game::the(); + return new Game; } diff --git a/example/src/game.h b/example/src/game.h new file mode 100644 index 0000000..f38b55c --- /dev/null +++ b/example/src/game.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 Riyyi + * + * SPDX-License-Identifier: MIT + */ + +#include "inferno.h" +#include "inferno/entrypoint.h" + +class Game final : public Inferno::Application { +public: + Game(); + ~Game(); + + void update() override; + void render() override; +}; + +Inferno::Application* Inferno::createApplication(int argc, char* argv[]); diff --git a/src/inferno/application.cpp b/src/inferno/application.cpp index 8a41a30..511c23f 100644 --- a/src/inferno/application.cpp +++ b/src/inferno/application.cpp @@ -31,8 +31,14 @@ namespace Inferno { -Application::Application(s) +Application* Application::s_instance = nullptr; + +Application::Application() { + // Set singleton instance + VERIFY(!s_instance, "reinstantiation of Application"); + s_instance = this; + // Initialize Settings::initialize(); @@ -78,6 +84,8 @@ Application::~Application() // Input::destroy(); Settings::destroy(); + + s_instance = nullptr; } int Application::run() @@ -143,12 +151,16 @@ int Application::run() // Update + update(); + Input::update(); m_window->update(); m_scene->update(deltaTime); // Render + render(); + RenderCommand::clearColor({ 0.2f, 0.3f, 0.3f, 1.0f }); RenderCommand::clear(); diff --git a/src/inferno/application.h b/src/inferno/application.h index be58818..f00504b 100644 --- a/src/inferno/application.h +++ b/src/inferno/application.h @@ -21,11 +21,13 @@ class Window; class WindowCloseEvent; class WindowResizeEvent; -class Application : public ruc::Singleton { +class Application { public: - explicit Application(s); virtual ~Application(); + virtual void update() = 0; + virtual void render() = 0; + int run(); void onEvent(Event& e); @@ -38,6 +40,11 @@ public: inline Window& getWindow() const { return *m_window; } + static Application& the() { return *s_instance; } + +protected: + Application(); + private: int m_status { 0 }; float m_lastFrameTime { 0.0f }; @@ -48,10 +55,12 @@ private: // std::shared_ptr m_font; // + + static Application* s_instance; }; // To be defined in the game -extern Application& createApplication(); +extern Application* createApplication(int argc, char* argv[]); } // namespace Inferno diff --git a/src/inferno/entrypoint.h b/src/inferno/entrypoint.h index 6fcc17d..7f8b644 100644 --- a/src/inferno/entrypoint.h +++ b/src/inferno/entrypoint.h @@ -16,15 +16,11 @@ int main(int argc, char* argv[]) // NOLINT(misc-definitions-in-headers) { - // Suppress unused warning - (void)argc; - (void)argv; + auto* app = Inferno::createApplication(argc, argv); - auto& app = Inferno::createApplication(); + int status = app->run(); - int status = app.run(); - - app.destroy(); + delete app; return status; }