From febc60aad3e647ee0138fcc43ba1b60b4bd3bbd3 Mon Sep 17 00:00:00 2001 From: Dan Royer Date: Tue, 14 May 2024 11:30:57 -0700 Subject: [PATCH] added physics settings panel --- .../com/marginallyclever/ro3/AllPanels.java | 4 +- .../com/marginallyclever/ro3/apps/App.java | 2 +- .../ro3/apps/dialogs/AppSettingsDialog.java | 5 +- .../apps/ode4j/ODEPhysicsSettingsPanel.java | 74 +++++++++++++++++++ .../apps/viewport/ViewportSettingsPanel.java | 4 +- .../ro3/physics/ODEPhysics.java | 48 ++++++++++-- .../ro3/physics/ODEPhysicsPanel.java | 11 --- 7 files changed, 126 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/marginallyclever/ro3/apps/ode4j/ODEPhysicsSettingsPanel.java delete mode 100644 src/main/java/com/marginallyclever/ro3/physics/ODEPhysicsPanel.java diff --git a/src/main/java/com/marginallyclever/ro3/AllPanels.java b/src/main/java/com/marginallyclever/ro3/AllPanels.java index 19b484be3..f052af7ee 100644 --- a/src/main/java/com/marginallyclever/ro3/AllPanels.java +++ b/src/main/java/com/marginallyclever/ro3/AllPanels.java @@ -2,7 +2,7 @@ import com.formdev.flatlaf.FlatLightLaf; import com.marginallyclever.ro3.node.nodes.pose.poses.*; -import com.marginallyclever.ro3.physics.ODEPhysicsPanel; +import com.marginallyclever.ro3.apps.ode4j.ODEPhysicsSettingsPanel; import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,7 +107,7 @@ private Collection> getHandmadeList() { com.marginallyclever.ro3.node.nodes.limbplanner.LimbPlannerPanel.class, com.marginallyclever.ro3.node.nodes.limbsolver.LimbSolverPanel.class, com.marginallyclever.ro3.node.nodes.marlinrobotarm.MarlinRobotArmPanel.class, - ODEPhysicsPanel.class, + ODEPhysicsSettingsPanel.class, com.marginallyclever.ro3.node.nodes.pose.PosePanel.class, AttachmentPointPanel.class, CameraPanel.class, diff --git a/src/main/java/com/marginallyclever/ro3/apps/App.java b/src/main/java/com/marginallyclever/ro3/apps/App.java index b6d63885e..2588a105a 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/App.java +++ b/src/main/java/com/marginallyclever/ro3/apps/App.java @@ -4,7 +4,7 @@ import java.awt.*; /** - * All apps extend from App for Reflection. + * All applications in the environment extend from {@link App} for Reflection. */ public abstract class App extends JPanel { public App() { diff --git a/src/main/java/com/marginallyclever/ro3/apps/dialogs/AppSettingsDialog.java b/src/main/java/com/marginallyclever/ro3/apps/dialogs/AppSettingsDialog.java index d7f132418..26597ca15 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/dialogs/AppSettingsDialog.java +++ b/src/main/java/com/marginallyclever/ro3/apps/dialogs/AppSettingsDialog.java @@ -40,7 +40,9 @@ public AppSettingsDialog(List apps) { ViewProvider viewProvider = (ViewProvider) clazz.getConstructor().newInstance(); viewProvider.setViewSubject(appInstance); JPanel viewPanel = (JPanel)viewProvider; - tabbedPane.addTab(appClass.getSimpleName(), viewPanel); + JPanel container = new JPanel(new BorderLayout()); + container.add(viewPanel, BorderLayout.NORTH); + tabbedPane.addTab(((JPanel) viewProvider).getName(), container); } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { logger.error("Error creating view for app: " + appInstance.getClass().getSimpleName(), e); } @@ -49,6 +51,7 @@ public AppSettingsDialog(List apps) { } public void run(Component parent) { + // show message dialog is the reason the dialog cannot be resized. JOptionPane.showMessageDialog(parent, this, "Settings", JOptionPane.PLAIN_MESSAGE); } } \ No newline at end of file diff --git a/src/main/java/com/marginallyclever/ro3/apps/ode4j/ODEPhysicsSettingsPanel.java b/src/main/java/com/marginallyclever/ro3/apps/ode4j/ODEPhysicsSettingsPanel.java new file mode 100644 index 000000000..44debf482 --- /dev/null +++ b/src/main/java/com/marginallyclever/ro3/apps/ode4j/ODEPhysicsSettingsPanel.java @@ -0,0 +1,74 @@ +package com.marginallyclever.ro3.apps.ode4j; + +import com.marginallyclever.convenience.swing.NumberFormatHelper; +import com.marginallyclever.ro3.PanelHelper; +import com.marginallyclever.ro3.Registry; +import com.marginallyclever.ro3.physics.ODEPhysics; +import com.marginallyclever.ro3.view.View; +import com.marginallyclever.ro3.view.ViewProvider; + +import javax.swing.*; +import javax.swing.text.NumberFormatter; +import java.awt.*; + +/** + * {@link ODEPhysicsSettingsPanel} is a {@link View} for {@link ODEPhysics}. + */ +@View(of= ODE4JPanel.class) +public class ODEPhysicsSettingsPanel extends JPanel implements ViewProvider { + private ODE4JPanel subject; + private final NumberFormatter formatter = NumberFormatHelper.getNumberFormatter(); + private final JFormattedTextField cfm = new JFormattedTextField(formatter); + private final JFormattedTextField erp = new JFormattedTextField(formatter); + private final JFormattedTextField gravity = new JFormattedTextField(formatter); + + public ODEPhysicsSettingsPanel() { + super(new GridBagLayout()); + setName("Physics"); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 1.0; + gbc.weighty = 1.0; + gbc.gridx=0; + gbc.gridy=0; + gbc.fill = GridBagConstraints.BOTH; + + var physics = Registry.getPhysics(); + // cfm + cfm.setValue(physics.getCFM()); + PanelHelper.addLabelAndComponent(this, "CFM",cfm,gbc); + cfm.addPropertyChangeListener("value", evt -> setCFM((Double) evt.getNewValue())); + + // erp + gbc.gridy++; + erp.setValue(physics.getERP()); + PanelHelper.addLabelAndComponent(this, "ERP",erp,gbc); + erp.addPropertyChangeListener("value", evt -> setERP((Double) evt.getNewValue())); + + // gravity + gbc.gridy++; + gravity.setValue(physics.getGravity()); + PanelHelper.addLabelAndComponent(this, "Gravity",gravity,gbc); + gravity.addPropertyChangeListener("value", evt ->setGravity((Double) evt.getNewValue())); + } + + public void setCFM(double cfm) { + var physics = Registry.getPhysics(); + physics.setCFM(cfm); + } + + public void setERP(double erp) { + var physics = Registry.getPhysics(); + physics.setERP(erp); + } + + public void setGravity(double gravity) { + var physics = Registry.getPhysics(); + physics.setGravity(gravity); + } + + @Override + public void setViewSubject(ODE4JPanel subject) { + this.subject = subject; + } +} diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/ViewportSettingsPanel.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/ViewportSettingsPanel.java index 5f8d39379..274e6dd94 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/ViewportSettingsPanel.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/ViewportSettingsPanel.java @@ -30,7 +30,7 @@ public class ViewportSettingsPanel extends JPanel implements ViewProvider OdeHelper.createHashSpace(null); + case 2 -> OdeHelper.createSapSpace(null, DSapSpace.AXES.XYZ); + //case 3 -> OdeHelper.createQuadTreeSpace(null, new DVector3(0, 0, 0), new DVector3(100, 100, 100), 0); + default -> OdeHelper.createSimpleSpace(); + }; } if(contacts == null) { @@ -174,4 +182,32 @@ public boolean isPaused() { public void setPaused(boolean state) { isPaused = state; } + + public double getCFM() { + return WORLD_CFM; + } + + public void setCFM(double WORLD_CFM) { + this.WORLD_CFM = WORLD_CFM; + if(world!=null) world.setCFM(WORLD_CFM); + } + + public double getERP() { + return WORLD_ERP; + } + + public void setERP(double WORLD_ERP) { + this.WORLD_ERP = WORLD_ERP; + if(world!=null) world.setERP(WORLD_ERP); + } + + public double getGravity() { + return WORLD_GRAVITY; + } + + public void setGravity(double WORLD_GRAVITY) { + this.WORLD_GRAVITY = WORLD_GRAVITY; + if(world!=null) world.setGravity(0, 0, WORLD_GRAVITY); + } + } diff --git a/src/main/java/com/marginallyclever/ro3/physics/ODEPhysicsPanel.java b/src/main/java/com/marginallyclever/ro3/physics/ODEPhysicsPanel.java deleted file mode 100644 index 70c94e340..000000000 --- a/src/main/java/com/marginallyclever/ro3/physics/ODEPhysicsPanel.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.marginallyclever.ro3.physics; - -import javax.swing.*; -import java.awt.*; - -public class ODEPhysicsPanel extends JPanel { - public ODEPhysicsPanel() { - super(); - // TODO add physics settings - } -}