From 62e727cdeaf482eaa0bdc36b378baa6bd3d3b34c Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 6 Mar 2024 22:04:39 -0500 Subject: [PATCH] imgui work --- imgui.ini | 7 ++- .../java/electrosphere/engine/Globals.java | 3 ++ src/main/java/electrosphere/engine/Main.java | 10 ++-- .../renderer/RenderingEngine.java | 3 +- .../renderer/ui/imgui/ImGuiWindow.java | 26 ++++++++++ .../renderer/ui/imgui/ImGuiWindowMacros.java | 52 +++++++++++++++++-- 6 files changed, 89 insertions(+), 12 deletions(-) diff --git a/imgui.ini b/imgui.ini index d7bef56a..01aa08ea 100644 --- a/imgui.ini +++ b/imgui.ini @@ -14,7 +14,12 @@ Size=775,335 Collapsed=0 [Window][Frametime Graph] -Pos=1345,20 +Pos=1308,4 Size=566,324 Collapsed=0 +[Window][Debug] +Pos=10,9 +Size=178,77 +Collapsed=0 + diff --git a/src/main/java/electrosphere/engine/Globals.java b/src/main/java/electrosphere/engine/Globals.java index fb6db3bf..5b27b009 100644 --- a/src/main/java/electrosphere/engine/Globals.java +++ b/src/main/java/electrosphere/engine/Globals.java @@ -96,6 +96,9 @@ public class Globals { //Core Engine signals // public static boolean ENGINE_SHUTDOWN_FLAG = false; + //main debug flag + //current enables imgui debug menu or not + public static boolean ENGINE_DEBUG = true; // diff --git a/src/main/java/electrosphere/engine/Main.java b/src/main/java/electrosphere/engine/Main.java index 22d9998a..22d19735 100644 --- a/src/main/java/electrosphere/engine/Main.java +++ b/src/main/java/electrosphere/engine/Main.java @@ -181,7 +181,7 @@ public class Main { //init imgui debug windows if(Globals.RUN_CLIENT && !Globals.HEADLESS){ - ImGuiWindowMacros.createFramerateGraph(); + ImGuiWindowMacros.initImGuiWindows(); } //fire off a loading thread for the title menus/screen @@ -244,7 +244,7 @@ public class Main { // track total frametiime in debug graph // if(captureFramerate){ - ImGuiWindowMacros.addFramerateDatapoint("totalframerate",deltaTime); + ImGuiWindowMacros.addFramerateDatapoint("totalframerate",deltaTime * 1000); } @@ -303,7 +303,7 @@ public class Main { ClientFunctions.runClientFunctions(); } if(!Globals.HEADLESS && captureFramerate){ - ImGuiWindowMacros.addFramerateDatapoint("clientsim",glfwGetTime()-functionTrackTimeStart); + ImGuiWindowMacros.addFramerateDatapoint("clientsim",(glfwGetTime()-functionTrackTimeStart)*1000); } @@ -333,7 +333,7 @@ public class Main { Globals.macroSimulation.simulate(); } if(!Globals.HEADLESS && captureFramerate){ - ImGuiWindowMacros.addFramerateDatapoint("serversim",glfwGetTime()-functionTrackTimeStart); + ImGuiWindowMacros.addFramerateDatapoint("serversim",(glfwGetTime()-functionTrackTimeStart)*1000); } @@ -349,7 +349,7 @@ public class Main { Globals.renderingEngine.drawScreen(); } if(!Globals.HEADLESS && captureFramerate){ - ImGuiWindowMacros.addFramerateDatapoint("render",glfwGetTime()-functionTrackTimeStart); + ImGuiWindowMacros.addFramerateDatapoint("render",(glfwGetTime()-functionTrackTimeStart)*1000); } diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java index 630d8e1c..8d22314c 100644 --- a/src/main/java/electrosphere/renderer/RenderingEngine.java +++ b/src/main/java/electrosphere/renderer/RenderingEngine.java @@ -62,6 +62,7 @@ import static org.lwjgl.system.MemoryUtil.NULL; import java.nio.IntBuffer; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import org.joml.Matrix4d; import org.joml.Matrix4f; @@ -143,7 +144,7 @@ public class RenderingEngine { //if set to true, will render imgui windows private static boolean imGuiShouldRender = true; //All imgui windows that should be displayed - private static List imGuiWindows = new LinkedList(); + private static List imGuiWindows = new CopyOnWriteArrayList(); diff --git a/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindow.java b/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindow.java index 90e2eabb..970467f9 100644 --- a/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindow.java +++ b/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindow.java @@ -15,6 +15,9 @@ public class ImGuiWindow { //The elements housed within this window List elements = new LinkedList(); + + //Optional callback for the window + ImGuiWindowCallback callback = null; /** * Creates the window @@ -38,6 +41,14 @@ public class ImGuiWindow { this.elements.remove(element); } + /** + * Sets the callback for the window + * @param callback The callback + */ + public void setCallback(ImGuiWindowCallback callback){ + this.callback = callback; + } + /** * Draws this window */ @@ -48,7 +59,22 @@ public class ImGuiWindow { element.draw(); } + if(callback != null){ + callback.exec(); + } + ImGui.end(); } + + /** + * An optional callback for the window that lets you directly call imgui functions + */ + public static interface ImGuiWindowCallback { + /** + * The actual callback function + */ + public void exec(); + } + } diff --git a/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindowMacros.java b/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindowMacros.java index dfb62b08..62f998be 100644 --- a/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindowMacros.java +++ b/src/main/java/electrosphere/renderer/ui/imgui/ImGuiWindowMacros.java @@ -5,6 +5,8 @@ import java.util.Map; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.ui.imgui.ImGuiLinePlot.ImGuiLinePlotDataset; +import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; +import imgui.ImGui; /** * Various methods for creating specific imgui windows in engine @@ -12,23 +14,41 @@ import electrosphere.renderer.ui.imgui.ImGuiLinePlot.ImGuiLinePlotDataset; public class ImGuiWindowMacros { //Framerate graph - private static ImGuiWindow imGuiWindow; + private static ImGuiWindow framerateWindow; private static ImGuiLinePlot plot; private static Map dataSetMap; + //main debug menu + private static ImGuiWindow mainDebugWindow; + + /** + * Initializes imgui windows + */ + public static void initImGuiWindows(){ + createMainDebugMenu(); + createFramerateGraph(); + } + /** * Creates a framerate graph */ - public static void createFramerateGraph(){ - imGuiWindow = new ImGuiWindow("Frametime Graph"); + private static void createFramerateGraph(){ + framerateWindow = new ImGuiWindow("Frametime Graph"); plot = new ImGuiLinePlot("Frametime plot"); dataSetMap = new HashMap(); initFramerateGraphSeries("totalframerate"); initFramerateGraphSeries("serversim"); initFramerateGraphSeries("clientsim"); initFramerateGraphSeries("render"); - imGuiWindow.addElement(plot); - RenderingEngine.addImGuiWindow(imGuiWindow); + framerateWindow.addElement(plot); + framerateWindow.setCallback(new ImGuiWindowCallback() { + @Override + public void exec() { + if(ImGui.button("Close")){ + RenderingEngine.removeImGuiWindow(framerateWindow); + } + } + }); } /** @@ -55,4 +75,26 @@ public class ImGuiWindowMacros { } } + + /** + * Inits the main debug menu + */ + private static void createMainDebugMenu(){ + mainDebugWindow = new ImGuiWindow("Debug"); + mainDebugWindow.callback = new ImGuiWindowCallback() { + @Override + public void exec() { + //show framerate graph + if(ImGui.button("Show Overall Frametime")){ + RenderingEngine.addImGuiWindow(framerateWindow); + } + //close button + if(ImGui.button("Close")){ + RenderingEngine.removeImGuiWindow(mainDebugWindow); + } + } + }; + RenderingEngine.addImGuiWindow(mainDebugWindow); + } + }