diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-31 14:00:32 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-06 17:19:09 -0400 |
| commit | 6a5c90864dcddd924488c4b5ded34ab6bd7863dd (patch) | |
| tree | b2c70330bcfa3631cd41730f52ff82229e596841 | |
| parent | 9372b51357e6179935339691f36e811b84934e8b (diff) | |
first pass add ImGui console
| -rw-r--r-- | src/game.cpp | 51 | ||||
| -rw-r--r-- | src/game.hpp | 4 | ||||
| -rw-r--r-- | src/main.cpp | 1 | ||||
| -rw-r--r-- | src/window.cpp | 1 | ||||
| -rw-r--r-- | src/window.hpp | 9 |
5 files changed, 62 insertions, 4 deletions
diff --git a/src/game.cpp b/src/game.cpp index cfb6d7c..a48cbfe 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,8 +1,15 @@ #include "game.hpp" +#include "imgui.h" GameSettings pkeSettings{}; +const uint64_t consoleBufferCount = 30; +const uint64_t consoleLineLength = 128; + +char consoleBuffer[consoleBufferCount][consoleLineLength]; +long consoleBufferIndex = 0; + void GameTick(double delta) { /* * ECS_Tick() gets called first because it updates the public @@ -10,3 +17,47 @@ void GameTick(double delta) { */ ECS_Tick(delta); } + +void RecordImGuiConsole(bool *pOpen) { + static bool scrollToBottom = true; + if (!ImGui::Begin("Console", pOpen)) { + ImGui::End(); + return; + } + ImVec2 region = ImGui::GetContentRegionAvail(); + region.y -= 27; + if (ImGui::BeginListBox("##ConsoleHistory", region)) { + for (long i = consoleBufferIndex + 1; i < consoleBufferCount; ++i) { + ImGui::Text("%s", consoleBuffer[i]); + } + for (long i = 0; i < consoleBufferIndex; ++i) { + ImGui::Text("%s", consoleBuffer[i]); + } + if (scrollToBottom) ImGui::SetScrollHereY(1); + scrollToBottom = false; + ImGui::EndListBox(); + } + ImGui::Separator(); + if (ImGui::InputText("##ConsoleInput", consoleBuffer[consoleBufferIndex], consoleLineLength, ImGuiInputTextFlags_EnterReturnsTrue)) { + // TODO parse and execute. + scrollToBottom = true; + consoleBufferIndex = (consoleBufferIndex + 1) % consoleBufferCount; + memset(consoleBuffer[consoleBufferIndex], '\0', consoleLineLength); + } + auto flags = (ImGuiFocusedFlags_ChildWindows); + if (ImGui::IsWindowFocused(flags) && !ImGui::IsAnyItemFocused() && !ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !ImGui::IsMouseClicked(ImGuiMouseButton_Left, true)) { + ImGui::SetKeyboardFocusHere(-1); + } + ImGui::End(); +} + +void RecordImGuiEditor() { + RecordImGuiConsole(&pkeSettings.isShowingEditor); +} + +void GameInit() { + for (long i = 0; i < consoleBufferCount; ++i) { + memset(consoleBuffer[i], '\0', consoleLineLength); + } + RegisterCallback("RenderImGui", RecordImGuiEditor); +} diff --git a/src/game.hpp b/src/game.hpp index fad551b..7159e0c 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -4,6 +4,8 @@ #include <chrono> #include <cstdint> +#include "event.hpp" +#include "imgui.h" #include "ecs.hpp" using GameTimeDuration = std::chrono::duration<int64_t, std::nano>; @@ -15,6 +17,7 @@ struct GameSettings { bool isGameRunning = true; bool isGamePaused = false; bool isFramerateUnlocked = true; + bool isShowingEditor = true; int64_t targetFPS = 144; int64_t minFPS = 20; double deltaPerFrame = 1 / double(targetFPS); @@ -23,6 +26,7 @@ struct GameSettings { extern GameSettings pkeSettings; +void GameInit(); void GameTick(double delta); #endif /* PKE_GAME_HPP */ diff --git a/src/main.cpp b/src/main.cpp index b5a0697..b99aca2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ int main() { printf("PKE ENTERING\n"); try { AssetManagerInit(); + GameInit(); ECS_Init(); CreateWindow(&windowProps); diff --git a/src/window.cpp b/src/window.cpp index c1bca38..63b18be 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1009,6 +1009,7 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { ImGui::DockSpaceOverViewport(nullptr, ImGuiDockNodeFlags_PassthruCentralNode); ImGui::ShowDemoWindow(); + DispatchCabllack("RenderImGui"); ImGui::Render(); auto drawData = ImGui::GetDrawData(); diff --git a/src/window.hpp b/src/window.hpp index a3cebf4..d9fc23f 100644 --- a/src/window.hpp +++ b/src/window.hpp @@ -1,8 +1,12 @@ #ifndef PKE_WINDOW_HPP #define PKE_WINDOW_HPP -#include "memory.hpp" #include "asset-manager.hpp" +#include "backends/imgui_impl_glfw.h" +#include "backends/imgui_impl_vulkan.h" +#include "event.hpp" +#include "imgui.h" +#include "memory.hpp" #include <cstring> #include <cstdio> @@ -10,9 +14,6 @@ #include <cassert> #include <GLFW/glfw3.h> #include <vulkan/vulkan.h> -#include "backends/imgui_impl_glfw.h" -#include "backends/imgui_impl_vulkan.h" -#include "imgui.h" const unsigned int MAX_FRAMES_IN_FLIGHT = 2; |
