From 983175d3986c9192c655981002d4c730dd433fc9 Mon Sep 17 00:00:00 2001 From: Duncan Calvert Date: Mon, 22 Sep 2025 22:00:50 -0500 Subject: [PATCH 1/2] Fix pause at end of buffer. --- .../us/ihmc/rdx/simulation/scs2/RDXSCS2SimulationSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2SimulationSession.java b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2SimulationSession.java index 0eeae0784929..f16299e3e2c9 100644 --- a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2SimulationSession.java +++ b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2SimulationSession.java @@ -51,7 +51,7 @@ public void startSession(SimulationSession simulationSession) bulletPhysicsDebugger.drawBulletDebugDrawings(); // This technically belongs in RDXSCS2Session, but there's no after tick callback for a regular session - if (pauseAtEndOfBuffer.get() && yoManager.getCurrentIndex() == yoManager.getBufferSize() - 2) + if (pauseAtEndOfBuffer.get() && session.getBufferProperties().getCurrentIndex() == session.getBufferProperties().getSize() - 1) { session.setSessionMode(SessionMode.PAUSE); } From d1c3e67f88ab6a018968ce3642f99aea1eca18cf Mon Sep 17 00:00:00 2001 From: Duncan Calvert Date: Mon, 22 Sep 2025 22:51:42 -0500 Subject: [PATCH 2/2] Mess with SCS 2 plots in RDX. --- .../rdx/simulation/scs2/RDXSCS2Session.java | 7 +- .../scs2/RDXSCS2YoImPlotManager.java | 9 +++ .../ui/yo/ImPlotModifiableYoPlotPanel.java | 67 +++++++++++++++---- .../us/ihmc/rdx/ui/yo/ImPlotYoPlotPanel.java | 45 ------------- .../ui/plotting/RDXSCS2StyleChartDemo.java | 38 ++++++++--- .../RDXSCS2StyleChartDemo/ImGuiPanels.json | 9 +++ .../RDXSCS2StyleChartDemo/ImGuiSettings.ini | 35 ++++++++++ .../RDXSCS2YoImPlotManager.json | 6 ++ 8 files changed, 145 insertions(+), 71 deletions(-) delete mode 100644 ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotYoPlotPanel.java create mode 100644 ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiPanels.json create mode 100644 ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiSettings.ini create mode 100644 ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/RDXSCS2YoImPlotManager.json diff --git a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2Session.java b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2Session.java index ea6c05029511..199eff7240c9 100644 --- a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2Session.java +++ b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2Session.java @@ -68,16 +68,11 @@ public class RDXSCS2Session private final StatelessNotification sessionStoppedNotification = new StatelessNotification(); public RDXSCS2Session(RDXBaseUI baseUI) - { - this(baseUI, null); - } - - public RDXSCS2Session(RDXBaseUI baseUI, RDXPanel plotManagerParentPanel) { baseUI.getImGuiPanelManager().addPanel(controlPanel); baseUI.getPrimaryScene().addRenderableAdapter(renderables); - plotManager.create(baseUI.getLayoutManager(), plotManagerParentPanel == null ? controlPanel : plotManagerParentPanel); + plotManager.create(baseUI.getLayoutManager(), controlPanel); } /** diff --git a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2YoImPlotManager.java b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2YoImPlotManager.java index d82484863703..7ddc0bb2ec65 100644 --- a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2YoImPlotManager.java +++ b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/simulation/scs2/RDXSCS2YoImPlotManager.java @@ -208,4 +208,13 @@ public void addVariableWidget(String variableName) { variableWidgets.add(new RDXLinkedYoBooleanWidget(yoManager, variableName)); } + + public ImPlotModifiableYoPlotPanel getPlotPanel(String name) + { + for (ImPlotModifiableYoPlotPanel plotPanel : plotPanels) + if (plotPanel.getPanelName().equals(name)) + return plotPanel; + + return null; + } } diff --git a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotModifiableYoPlotPanel.java b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotModifiableYoPlotPanel.java index 1855df6c2701..a07a7688700d 100644 --- a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotModifiableYoPlotPanel.java +++ b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotModifiableYoPlotPanel.java @@ -1,19 +1,22 @@ package us.ihmc.rdx.ui.yo; import imgui.internal.ImGui; +import imgui.type.ImInt; import us.ihmc.rdx.imgui.RDXPanel; import us.ihmc.rdx.imgui.ImGuiUniqueLabelMap; import us.ihmc.rdx.simulation.scs2.RDXYoManager; -import us.ihmc.rdx.imgui.ImPlotPlotPanelLayout; import java.util.ArrayList; import java.util.function.Consumer; public class ImPlotModifiableYoPlotPanel extends RDXPanel { - private final ArrayList yoPlots = new ArrayList<>(); - private final ImPlotPlotPanelLayout layout = new ImPlotPlotPanelLayout(); private final ImGuiUniqueLabelMap labels = new ImGuiUniqueLabelMap(getClass()); + private final ArrayList yoPlots = new ArrayList<>(); + private final ImInt numberOfRows = new ImInt(1); + private final ImInt numberOfColumns = new ImInt(1); + private final ImInt plotHeight = new ImInt(60); + private float plotWidth; private final ImGuiYoVariableSearchPanel yoVariableSearchPanel; private final RDXYoManager yoManager; private final Consumer removeSelf; @@ -28,21 +31,35 @@ public ImPlotModifiableYoPlotPanel(String panelName, this.yoManager = yoManager; this.removeSelf = removeSelf; setRenderMethod(this::render); - layout.setPlotRenderer(this::renderPlot, yoPlots::size); - } - - private void renderPlot(int i) - { - yoPlots.get(i).render(layout.getPlotWidth(), layout.getPlotHeight()); } public void render() { ImGui.beginMenuBar(); - layout.renderLayoutMenu(); + if (ImGui.beginMenu(labels.get("Layout"))) + { + ImGui.pushItemWidth(100); + if (ImGui.inputInt(labels.get("Number of rows"), numberOfRows)) + { + if (numberOfRows.get() < 1) + numberOfRows.set(1); + } + if (ImGui.inputInt(labels.get("Number of columns"), numberOfColumns)) + { + if (numberOfColumns.get() < 1) + numberOfColumns.set(1); + } + if (ImGui.inputInt(labels.get("Plot height"), plotHeight)) + { + if (plotHeight.get() < 10) + plotHeight.set(10); + } + ImGui.popItemWidth(); + ImGui.endMenu(); + } if (ImGui.beginMenu(labels.get("Plots"))) { - if (ImGui.menuItem("Add Plot")) + if (ImGui.button(labels.get("Add Plot"))) { addPlot(); } @@ -55,7 +72,23 @@ public void render() ImGui.endMenuBar(); - layout.renderPlots(); + plotWidth = ImGui.getColumnWidth() / numberOfColumns.get(); + + for (int i = 0; i < yoPlots.size(); i++) + { + yoPlots.get(i).render(plotWidth, plotHeight.get()); + + if (i % numberOfColumns.get() != numberOfColumns.get() - 1) + ImGui.sameLine(); + } + } + + public ImPlotModifiableYoPlot addPlot(String... variables) + { + ImPlotModifiableYoPlot plot = addPlot(); + for (String variable : variables) + plot.addVariable(yoManager.getRootRegistry().findVariable(variable), false); + return plot; } public ImPlotModifiableYoPlot addPlot() @@ -74,4 +107,14 @@ public ArrayList getYoPlots() { return yoPlots; } + + public void setNumberOfRows(int numberOfRows) + { + this.numberOfRows.set(numberOfRows); + } + + public void setNumberOfColumns(int numberOfColumns) + { + this.numberOfColumns.set(numberOfColumns); + } } diff --git a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotYoPlotPanel.java b/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotYoPlotPanel.java deleted file mode 100644 index 9451a4e67301..000000000000 --- a/ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/ui/yo/ImPlotYoPlotPanel.java +++ /dev/null @@ -1,45 +0,0 @@ -package us.ihmc.rdx.ui.yo; - -import imgui.internal.ImGui; -import us.ihmc.rdx.imgui.RDXPanel; -import us.ihmc.rdx.imgui.ImPlotPlotPanelLayout; - -import java.util.ArrayList; - -public class ImPlotYoPlotPanel extends RDXPanel -{ - private final ArrayList yoPlots = new ArrayList<>(); - private final ImPlotPlotPanelLayout layout = new ImPlotPlotPanelLayout(); - private boolean update = false; - - public ImPlotYoPlotPanel(String panelName) - { - super(panelName, null, false, true); - setRenderMethod(this::render); - layout.setPlotRenderer(this::renderPlot, yoPlots::size); - } - - private void renderPlot(int i) - { - yoPlots.get(i).render(layout.getPlotWidth(), layout.getPlotHeight(), update); - } - - public void render() - { - ImGui.beginMenuBar(); - layout.renderLayoutMenu(); - ImGui.endMenuBar(); - - layout.renderPlots(); - } - - public void setUpdate(boolean update) - { - this.update = update; - } - - public ArrayList getYoPlots() - { - return yoPlots; - } -} diff --git a/ihmc-high-level-behaviors/src/test/java/us/ihmc/rdx/ui/plotting/RDXSCS2StyleChartDemo.java b/ihmc-high-level-behaviors/src/test/java/us/ihmc/rdx/ui/plotting/RDXSCS2StyleChartDemo.java index 9b69ca571e29..7ffa3bded1f8 100644 --- a/ihmc-high-level-behaviors/src/test/java/us/ihmc/rdx/ui/plotting/RDXSCS2StyleChartDemo.java +++ b/ihmc-high-level-behaviors/src/test/java/us/ihmc/rdx/ui/plotting/RDXSCS2StyleChartDemo.java @@ -1,11 +1,17 @@ package us.ihmc.rdx.ui.plotting; import us.ihmc.rdx.Lwjgl3ApplicationAdapter; +import us.ihmc.rdx.sceneManager.RDXSceneLevel; +import us.ihmc.rdx.simulation.scs2.RDXSCS2SimulationSession; import us.ihmc.rdx.ui.RDXBaseUI; +import us.ihmc.rdx.ui.yo.ImPlotModifiableYoPlotPanel; +import us.ihmc.scs2.examples.simulations.bullet.StackOfBoxesExperimentalBulletSimulation; +import us.ihmc.scs2.session.SessionMode; public class RDXSCS2StyleChartDemo { private final RDXBaseUI baseUI; + private RDXSCS2SimulationSession session; public RDXSCS2StyleChartDemo() { @@ -16,21 +22,36 @@ public RDXSCS2StyleChartDemo() @Override public void create() { - baseUI.create(); + baseUI.create(RDXSceneLevel.values()); - baseUI.getImGuiPanelManager().addPanel("Plot", this::renderImGuiWidgets); - } - - private void renderImGuiWidgets() - { + session = new RDXSCS2SimulationSession(baseUI); + session.startSession(StackOfBoxesExperimentalBulletSimulation.createSession()); + session.changeBufferDuration(1.0); + session.getSession().setSessionMode(SessionMode.RUNNING); + ImPlotModifiableYoPlotPanel plotPanel = session.getPlotManager().getPlotPanel("Poses"); + plotPanel.setNumberOfRows(7); + plotPanel.setNumberOfColumns(5); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_x".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_y".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_z".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_qx".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_qy".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_qz".formatted(i, i)); + for (int i = 0; i < 5; i++) + plotPanel.addPlot("root.Block%d.q_Block%d_qs".formatted(i, i)); } @Override public void render() { - - + session.update(); baseUI.renderBeforeOnScreenUI(); baseUI.renderEnd(); @@ -39,6 +60,7 @@ public void render() @Override public void dispose() { + session.destroy(baseUI); baseUI.dispose(); } }); diff --git a/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiPanels.json b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiPanels.json new file mode 100644 index 000000000000..2625770b57dd --- /dev/null +++ b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiPanels.json @@ -0,0 +1,9 @@ +{ + "dockspacePanels" : { }, + "windows" : { + "3D View" : true, + "SCS 2 Session" : true, + "Poses" : true, + "YoVariable Search" : false + } +} \ No newline at end of file diff --git a/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiSettings.ini b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiSettings.ini new file mode 100644 index 000000000000..792ce5eed288 --- /dev/null +++ b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/ImGuiSettings.ini @@ -0,0 +1,35 @@ +[Window][DockSpaceViewport_11111111] +Pos=0,22 +Size=1735,1021 +Collapsed=0 + +[Window][SCS 2 Session] +Pos=0,22 +Size=343,1021 +Collapsed=0 +DockId=0x00000001,0 + +[Window][3D View] +Pos=345,22 +Size=1390,462 +Collapsed=0 +DockId=0x00000003,0 + +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + +[Window][Poses] +Pos=345,486 +Size=1390,557 +Collapsed=0 +DockId=0x00000004,0 + +[Docking][Data] +DockSpace ID=0x8B93E3BD Window=0xA787BDB4 Pos=445,193 Size=1735,1021 Split=X Selected=0x2E64DC63 + DockNode ID=0x00000001 Parent=0x8B93E3BD SizeRef=343,1031 Selected=0x29EC79FC + DockNode ID=0x00000002 Parent=0x8B93E3BD SizeRef=1390,1031 Split=Y Selected=0x2E64DC63 + DockNode ID=0x00000003 Parent=0x00000002 SizeRef=1390,462 CentralNode=1 Selected=0x2E64DC63 + DockNode ID=0x00000004 Parent=0x00000002 SizeRef=1390,557 Selected=0x1A45B6EE + diff --git a/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/RDXSCS2YoImPlotManager.json b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/RDXSCS2YoImPlotManager.json new file mode 100644 index 000000000000..67b9f2e255e4 --- /dev/null +++ b/ihmc-high-level-behaviors/src/test/resources/configurations/RDXSCS2StyleChartDemo/RDXSCS2YoImPlotManager.json @@ -0,0 +1,6 @@ +{ + "panels" : [ { + "name" : "Poses", + "plots" : [ ] + } ] +} \ No newline at end of file