summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp45
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() {