diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-05 13:07:57 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-05 13:07:57 -0500 |
| commit | c349359e71170c2fa78ac0fa22df07932ab47210 (patch) | |
| tree | 74795fee5b64fe94683c6078d3b50ec5112a4707 | |
| parent | 6e498a3781f5ccbbaa6cf5e407cf67722624760f (diff) | |
minor refactor for plugins
| -rw-r--r-- | CMakeLists.txt | 3 | ||||
| -rw-r--r-- | editor/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | editor/main.cpp | 9 | ||||
| -rw-r--r-- | src/game-settings.cpp | 1 | ||||
| -rw-r--r-- | src/game-settings.hpp | 9 | ||||
| -rw-r--r-- | src/game.cpp | 17 | ||||
| -rw-r--r-- | src/plugins.cpp | 51 | ||||
| -rw-r--r-- | src/plugins.hpp | 16 | ||||
| -rw-r--r-- | src/window.cpp | 9 |
9 files changed, 91 insertions, 28 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b7aa5d..aaa1314 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,8 @@ set(PKE_SOURCE_FILES src/physics.cpp src/player-input.hpp src/player-input.cpp + src/plugins.hpp + src/plugins.cpp src/static/cube.hpp src/static/cube.cpp src/thread_pool.hpp @@ -181,4 +183,5 @@ target_link_libraries(pke PUBLIC imguidocked) add_dependencies(pke shaders) add_subdirectory(editor) +add_subdirectory(runtime) add_subdirectory(test) diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index bd176c4..eaa72f8 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -8,5 +8,5 @@ set(PKE_EDITOR_SOURCE_FILES add_executable(pke_editor ${PKE_EDITOR_SOURCE_FILES} ) -target_link_libraries(pke_editor PRIVATE pke imguidocked) -target_include_directories(pke_editor PRIVATE pke imguidocked) +target_link_libraries(pke_editor PRIVATE pke) +target_include_directories(pke_editor PRIVATE pke) diff --git a/editor/main.cpp b/editor/main.cpp index 54c7607..c0cc7c0 100644 --- a/editor/main.cpp +++ b/editor/main.cpp @@ -1,5 +1,6 @@ #include <csignal> +#include "plugins.hpp" #include "editor.hpp" #include "event.hpp" #include "game.hpp" @@ -17,10 +18,10 @@ int main() { // setup { pkeSettings.isShowingEditor = true; - pkeGameCallbacks.OnInit = PkeEditor_Init; - pkeGameCallbacks.OnTick = PkeEditor_Tick; - pkeGameCallbacks.OnTeardown = PkeEditor_Teardown; - pkeGameCallbacks.OnImGuiRender = PkeEditor_RecordImGui; + pkePlugin.OnInit = PkeEditor_Init; + pkePlugin.OnTick = PkeEditor_Tick; + pkePlugin.OnTeardown = PkeEditor_Teardown; + pkePlugin.OnImGuiRender = PkeEditor_RecordImGui; } // run Game_Main({}); diff --git a/src/game-settings.cpp b/src/game-settings.cpp index 54699dd..6f09432 100644 --- a/src/game-settings.cpp +++ b/src/game-settings.cpp @@ -1,4 +1,3 @@ #include "game-settings.hpp" GameSettings pkeSettings{}; -PKEGameCallbacks pkeGameCallbacks{}; diff --git a/src/game-settings.hpp b/src/game-settings.hpp index 480ae8e..3456725 100644 --- a/src/game-settings.hpp +++ b/src/game-settings.hpp @@ -33,15 +33,6 @@ struct GameSettings { } mem; }; -struct PKEGameCallbacks { - void (*OnInit)() = nullptr; - void (*OnTick)(double delta) = nullptr; - void (*OnTeardown)() = nullptr; - void (*OnImGuiRender)() = nullptr; -}; - extern GameSettings pkeSettings; -extern PKEGameCallbacks pkeGameCallbacks; - #endif /* PKE_GAME_SETTINGS_HPP */ diff --git a/src/game.cpp b/src/game.cpp index 72228bf..5d39d1b 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -11,6 +11,7 @@ #include "math-helpers.hpp" #include "physics.hpp" #include "player-input.hpp" +#include "plugins.hpp" #include "vendor/glm_include.hpp" #include "window.hpp" @@ -484,8 +485,8 @@ void Game_Tick(double delta) { PkeInput_Tick(delta); // TODO invoke external ticks here - if (pkeGameCallbacks.OnTick) { - pkeGameCallbacks.OnTick(delta); + if (pkePlugin.OnTick) { + pkePlugin.OnTick(delta); } EntityType_Tick_Late(delta); @@ -502,8 +503,8 @@ void Game_Main(PKEWindowProperties windowProps) { CreateWindow(windowProps); PkeInput_Init(); EntityType_Init(); - if (pkeGameCallbacks.OnInit) { - pkeGameCallbacks.OnInit(); + if (pkePlugin.OnInit) { + pkePlugin.OnInit(); } GameTimePoint lastTimePoint = pkeSettings.steadyClock.now(); @@ -593,8 +594,8 @@ void Game_Main(PKEWindowProperties windowProps) { #ifndef NDEBUG Pke_DebugPrint(); #endif - if (pkeGameCallbacks.OnTeardown) { - pkeGameCallbacks.OnTeardown(); + if (pkePlugin.OnTeardown) { + pkePlugin.OnTeardown(); } Game_Teardown(); Event_Teardown(); @@ -615,8 +616,8 @@ void Game_Init() { for (long i = 0; i < consoleBufferCount; ++i) { memset(consoleBuffer[i], '\0', consoleLineLength); } - if (!pkeGameCallbacks.OnImGuiRender) { - pkeGameCallbacks.OnImGuiRender = Game_RecordImGui; + if (!pkePlugin.OnImGuiRender) { + pkePlugin.OnImGuiRender = Game_RecordImGui; } } diff --git a/src/plugins.cpp b/src/plugins.cpp new file mode 100644 index 0000000..aa7efd5 --- /dev/null +++ b/src/plugins.cpp @@ -0,0 +1,51 @@ + +#include "macros.hpp" +#include "plugins.hpp" + +#include <cstdio> +#include <dlfcn.h> + +PKEPluginInterface pkePlugin{}; + +void *loadedPlugin = nullptr; + +void Pke_UpdatePlugin(const PKEPluginInterface &plugin) { + pkePlugin.OnInit = plugin.OnInit; + pkePlugin.OnTick = plugin.OnTick; + pkePlugin.OnTeardown = plugin.OnTeardown; + pkePlugin.OnImGuiRender = plugin.OnImGuiRender; +} + +void Pke_LoadPlugin(const char *path) { + if (loadedPlugin != nullptr || loadedPlugin != CAFE_BABE(void)) { + return; + } + void *extension = dlopen(path, RTLD_NOW); + char *err = dlerror(); + if (!extension) { + fprintf(stderr, "Given plugin library (%s) failed to load: %s\n", path, err); + return; + } + PKEPluginInterface *interface = reinterpret_cast<PKEPluginInterface *>(dlsym(extension, "pkePluginInterface")); + err = dlerror(); + if (err != NULL) { + fprintf(stderr, "Given plugin library (%s) did not contain 'pkePluginInterface': %s\n", path, err); + dlclose(extension); + return; + } + Pke_UpdatePlugin(*interface); + loadedPlugin = interface; +} + +void Pke_UnloadPlugin() { + pkePlugin = { + .OnInit = nullptr, + .OnTick= nullptr, + .OnTeardown= nullptr, + .OnImGuiRender= nullptr, + }; + if (loadedPlugin != nullptr && loadedPlugin != CAFE_BABE(void)) { + dlclose(loadedPlugin); + loadedPlugin = CAFE_BABE(void); + } +} diff --git a/src/plugins.hpp b/src/plugins.hpp new file mode 100644 index 0000000..2f34c12 --- /dev/null +++ b/src/plugins.hpp @@ -0,0 +1,16 @@ +#ifndef PKE_PLUGINS_HPP +#define PKE_PLUGINS_HPP + +struct PKEPluginInterface { + void (*OnInit)() = nullptr; + void (*OnTick)(double delta) = nullptr; + void (*OnTeardown)() = nullptr; + void (*OnImGuiRender)() = nullptr; +}; + +extern PKEPluginInterface pkePlugin; + +void Pke_LoadPlugin(const char *path); +void Pke_UnloadPlugin(); + +#endif /* PKE_PLUGINS_HPP */ diff --git a/src/window.cpp b/src/window.cpp index 8d40221..f9b6ff2 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1,6 +1,8 @@ #define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_VULKAN +#include "window.hpp" + #include "asset-manager.hpp" #include "camera.hpp" #include "ecs.hpp" @@ -9,8 +11,8 @@ #include "game-settings.hpp" #include "helpers.hpp" #include "memory.hpp" +#include "plugins.hpp" #include "static/cube.hpp" -#include "window.hpp" #include "window-types.hpp" #include "glm/ext/matrix_transform.hpp" @@ -111,7 +113,6 @@ ImplementedPipelines pkePipelines{}; /* * ImGui */ -bool isImGuiRenderActive = true; VkDescriptorPool imGuiDescriptorPool; const std::vector<const char *> REQUIRED_EXTENSIONS = std::vector<const char *> { @@ -2427,12 +2428,12 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { vkCmdDraw(commandBuffer, 3, 1, 0, 0); // ImGui - if (isImGuiRenderActive && pkeGameCallbacks.OnImGuiRender) { + if (pkePlugin.OnImGuiRender) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - pkeGameCallbacks.OnImGuiRender(); + pkePlugin.OnImGuiRender(); ImGui::Render(); auto drawData = ImGui::GetDrawData(); |
