aboutsummaryrefslogtreecommitdiff
path: root/src_testbed
diff options
context:
space:
mode:
authorSébastien Crozet <sebcrozet@dimforge.com>2024-01-24 21:57:54 +0100
committerSébastien Crozet <sebcrozet@dimforge.com>2024-01-24 21:57:54 +0100
commitd1fc90c150ff7ddd077f5770d4ac30108b5e6de5 (patch)
tree67e2a9666504c87fe993ee59b76df3fb1b70760d /src_testbed
parentaef85ec2554476485dbf3de5f01257ced22bfe2f (diff)
downloadrapier-d1fc90c150ff7ddd077f5770d4ac30108b5e6de5.tar.gz
rapier-d1fc90c150ff7ddd077f5770d4ac30108b5e6de5.tar.bz2
rapier-d1fc90c150ff7ddd077f5770d4ac30108b5e6de5.zip
feat: rework solver parameters to make it easy to recover the old behaviors
Diffstat (limited to 'src_testbed')
-rw-r--r--src_testbed/testbed.rs16
-rw-r--r--src_testbed/ui.rs43
2 files changed, 55 insertions, 4 deletions
diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs
index aac73e8..50e6c7a 100644
--- a/src_testbed/testbed.rs
+++ b/src_testbed/testbed.rs
@@ -101,6 +101,12 @@ bitflags! {
}
}
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum RapierSolverType {
+ SmallStepsPgs,
+ StandardPgs,
+}
+
#[derive(Resource)]
pub struct TestbedState {
pub running: RunMode,
@@ -121,6 +127,7 @@ pub struct TestbedState {
pub example_names: Vec<&'static str>,
pub selected_example: usize,
pub selected_backend: usize,
+ pub solver_type: RapierSolverType,
pub physx_use_two_friction_directions: bool,
pub snapshot: Option<PhysicsSnapshot>,
nsteps: usize,
@@ -204,6 +211,7 @@ impl TestbedApp {
example_names: Vec::new(),
selected_example: 0,
selected_backend: RAPIER_BACKEND,
+ solver_type: RapierSolverType::SmallStepsPgs,
physx_use_two_friction_directions: true,
nsteps: 1,
camera_locked: false,
@@ -1189,6 +1197,14 @@ fn update_testbed(
if state.selected_example != prev_example {
harness.physics.integration_parameters = IntegrationParameters::default();
+
+ match state.solver_type {
+ RapierSolverType::SmallStepsPgs => {} // It’s already the default.
+ RapierSolverType::StandardPgs => harness
+ .physics
+ .integration_parameters
+ .switch_to_standard_pgs_solver(),
+ }
}
let selected_example = state.selected_example;
diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs
index 3a51b32..f81ae6d 100644
--- a/src_testbed/ui.rs
+++ b/src_testbed/ui.rs
@@ -5,8 +5,8 @@ use std::num::NonZeroUsize;
use crate::debug_render::DebugRenderPipelineResource;
use crate::harness::Harness;
use crate::testbed::{
- RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags, PHYSX_BACKEND_PATCH_FRICTION,
- PHYSX_BACKEND_TWO_FRICTION_DIR,
+ RapierSolverType, RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags,
+ PHYSX_BACKEND_PATCH_FRICTION, PHYSX_BACKEND_TWO_FRICTION_DIR,
};
use crate::PhysicsState;
@@ -107,6 +107,34 @@ pub fn update_ui(
integration_parameters.num_solver_iterations =
NonZeroUsize::new(num_iterations).unwrap();
} else {
+ let mut changed = false;
+ egui::ComboBox::from_label("solver type")
+ .width(150.0)
+ .selected_text(format!("{:?}", state.solver_type))
+ .show_ui(ui, |ui| {
+ let solver_types = [
+ RapierSolverType::SmallStepsPgs,
+ RapierSolverType::StandardPgs,
+ ];
+ for sty in solver_types {
+ changed = ui
+ .selectable_value(&mut state.solver_type, sty, format!("{sty:?}"))
+ .changed()
+ || changed;
+ }
+ });
+
+ if changed {
+ match state.solver_type {
+ RapierSolverType::SmallStepsPgs => {
+ integration_parameters.switch_to_small_steps_pgs_solver()
+ }
+ RapierSolverType::StandardPgs => {
+ integration_parameters.switch_to_standard_pgs_solver()
+ }
+ }
+ }
+
let mut num_iterations = integration_parameters.num_solver_iterations.get();
ui.add(Slider::new(&mut num_iterations, 1..=40).text("num solver iters."));
integration_parameters.num_solver_iterations =
@@ -114,10 +142,17 @@ pub fn update_ui(
ui.add(
Slider::new(
- &mut integration_parameters.num_friction_iteration_per_solver_iteration,
+ &mut integration_parameters.num_internal_pgs_iterations,
+ 1..=40,
+ )
+ .text("num internal PGS iters."),
+ );
+ ui.add(
+ Slider::new(
+ &mut integration_parameters.num_additional_friction_iterations,
1..=40,
)
- .text("frict. iters. per solver iters."),
+ .text("num additional frict. iters."),
);
}