diff options
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp index 7a627d5..b93d8ab 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -165,6 +165,12 @@ UniformBufferObject UBO{ VkDeviceMemory uniformBufferMemory; VkDeviceSize paddedUboBufferSize; +// console +const int64_t consoleBufferCount = 30; +const int64_t consoleLineLength = 128; +char consoleBuffer[consoleBufferCount][consoleLineLength]; +int64_t consoleBufferIndex = 0; + // public VkBuffer *UniformBuffers; DebugHitbox pkeDebugHitbox{}; @@ -3511,6 +3517,39 @@ void pkvk_transition_image_layout(VkCommandBuffer command_buffer, vkCmdPipelineBarrier(command_buffer, src_stage_mask, dst_stage_mask, 0, 0, VK_NULL_HANDLE, 0, VK_NULL_HANDLE, 1, &barrier); } +void RecordImGui() { + static bool scrollToBottom = true; + if (!ImGui::Begin("Console", &pkeSettings.editorSettings.isShowingConsole)) { + ImGui::End(); + return; + } + ImVec2 region = ImGui::GetContentRegionAvail(); + region.y -= 27; + if (ImGui::BeginListBox("##ConsoleHistory", region)) { + for (int64_t i = consoleBufferIndex + 1; i < consoleBufferCount; ++i) { + ImGui::Text("%s", consoleBuffer[i]); + } + for (int64_t 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 focusedFlags = (ImGuiFocusedFlags_ChildWindows); + if (ImGui::IsWindowFocused(focusedFlags) && !ImGui::IsAnyItemFocused() && !ImGui::IsAnyItemHovered() && !ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !ImGui::IsMouseClicked(ImGuiMouseButton_Left, true)) { + ImGui::SetKeyboardFocusHere(-1); + } + ImGui::End(); +} + void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { uint32_t i, counter; bool b; @@ -3933,10 +3972,12 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { } } // TODO move this 'any' check to happen on plugin load and store in global? + // Note that drawing imgui requires a plugin is intentional if (any) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); + RecordImGui(); for (uint32_t i = 0; i < LoadedPkePlugins.next; ++i) { if (LoadedPkePlugins[i].OnImGuiRender != nullptr) { LoadedPkePlugins[i].OnImGuiRender(); @@ -4214,6 +4255,10 @@ void CreateWindow(PKEWindowProperties wp) { CreateImGui(); DetermineMonitor(); + + for (uint64_t i = 0; i < consoleBufferCount; ++i) { + memset(consoleBuffer[i], '\0', consoleLineLength); + } } void DestroyWindow() { |
