From d1fc90c150ff7ddd077f5770d4ac30108b5e6de5 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Wed, 24 Jan 2024 21:57:54 +0100 Subject: feat: rework solver parameters to make it easy to recover the old behaviors --- src_testbed/testbed.rs | 16 ++++++++++++++++ src_testbed/ui.rs | 43 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 4 deletions(-) (limited to 'src_testbed') 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, 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."), ); } -- cgit