aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/ui.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-01-02 14:47:40 +0100
committerSébastien Crozet <developer@crozet.re>2022-01-02 16:58:36 +0100
commitf74b8401ad9ef50b8cdbf1f43a2b21f6c42b0ebc (patch)
tree53ac492fea5942a7d466f58a0095f39505674ea4 /src_testbed/ui.rs
parentb45d4b5ac2b31856c15e802b31e288a58940cbf2 (diff)
downloadrapier-f74b8401ad9ef50b8cdbf1f43a2b21f6c42b0ebc.tar.gz
rapier-f74b8401ad9ef50b8cdbf1f43a2b21f6c42b0ebc.tar.bz2
rapier-f74b8401ad9ef50b8cdbf1f43a2b21f6c42b0ebc.zip
Implement multibody joints and the new solver
Diffstat (limited to 'src_testbed/ui.rs')
-rw-r--r--src_testbed/ui.rs84
1 files changed, 45 insertions, 39 deletions
diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs
index 4a21072..894b6a4 100644
--- a/src_testbed/ui.rs
+++ b/src_testbed/ui.rs
@@ -1,7 +1,10 @@
use rapier::counters::Counters;
use crate::harness::Harness;
-use crate::testbed::{RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags};
+use crate::testbed::{
+ RunMode, TestbedActionFlags, TestbedState, TestbedStateFlags, PHYSX_BACKEND_PATCH_FRICTION,
+ PHYSX_BACKEND_TWO_FRICTION_DIR,
+};
use crate::PhysicsState;
use bevy_egui::egui::Slider;
@@ -10,8 +13,6 @@ use bevy_egui::{egui, EguiContext};
pub fn update_ui(ui_context: &EguiContext, state: &mut TestbedState, harness: &mut Harness) {
egui::Window::new("Parameters").show(ui_context.ctx(), |ui| {
if state.backend_names.len() > 1 && !state.example_names.is_empty() {
- #[cfg(all(feature = "dim3", feature = "other-backends"))]
- let prev_selected_backend = state.selected_backend;
let mut changed = false;
egui::ComboBox::from_label("backend")
.width(150.0)
@@ -29,30 +30,6 @@ pub fn update_ui(ui_context: &EguiContext, state: &mut TestbedState, harness: &m
state
.action_flags
.set(TestbedActionFlags::BACKEND_CHANGED, true);
-
- #[cfg(all(feature = "dim3", feature = "other-backends"))]
- fn is_physx(id: usize) -> bool {
- id == crate::testbed::PHYSX_BACKEND_PATCH_FRICTION
- || id == crate::testbed::PHYSX_BACKEND_TWO_FRICTION_DIR
- }
-
- #[cfg(all(feature = "dim3", feature = "other-backends"))]
- if (is_physx(state.selected_backend) && !is_physx(prev_selected_backend))
- || (!is_physx(state.selected_backend) && is_physx(prev_selected_backend))
- {
- // PhysX defaults (4 position iterations, 1 velocity) are the
- // opposite of rapier's (4 velocity iterations, 1 position).
- std::mem::swap(
- &mut harness
- .physics
- .integration_parameters
- .max_position_iterations,
- &mut harness
- .physics
- .integration_parameters
- .max_velocity_iterations,
- );
- }
}
ui.separator();
@@ -113,14 +90,47 @@ pub fn update_ui(ui_context: &EguiContext, state: &mut TestbedState, harness: &m
});
let integration_parameters = &mut harness.physics.integration_parameters;
- ui.add(
- Slider::new(&mut integration_parameters.max_velocity_iterations, 0..=200)
- .text("vels. iters."),
- );
- ui.add(
- Slider::new(&mut integration_parameters.max_position_iterations, 0..=200)
- .text("pos. iters."),
+
+ ui.checkbox(
+ &mut integration_parameters.interleave_restitution_and_friction_resolution,
+ "interleave friction resolution",
);
+
+ if state.selected_backend == PHYSX_BACKEND_PATCH_FRICTION
+ || state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR
+ {
+ ui.add(
+ Slider::new(&mut integration_parameters.max_velocity_iterations, 0..=200)
+ .text("pos. iters."),
+ );
+ ui.add(
+ Slider::new(
+ &mut integration_parameters.max_stabilization_iterations,
+ 0..=200,
+ )
+ .text("vel. iters."),
+ );
+ } else {
+ ui.add(
+ Slider::new(&mut integration_parameters.max_velocity_iterations, 0..=200)
+ .text("vel. rest. iters."),
+ );
+ ui.add(
+ Slider::new(
+ &mut integration_parameters.max_velocity_friction_iterations,
+ 0..=200,
+ )
+ .text("vel. frict. iters."),
+ );
+ ui.add(
+ Slider::new(
+ &mut integration_parameters.max_stabilization_iterations,
+ 0..=200,
+ )
+ .text("vel. stab. iters."),
+ );
+ }
+
#[cfg(feature = "parallel")]
{
ui.add(
@@ -135,10 +145,6 @@ pub fn update_ui(ui_context: &EguiContext, state: &mut TestbedState, harness: &m
Slider::new(&mut integration_parameters.min_island_size, 1..=10_000)
.text("min island size"),
);
- ui.add(
- Slider::new(&mut integration_parameters.warmstart_coeff, 0.0..=1.0)
- .text("warmstart coeff"),
- );
let mut frequency = integration_parameters.inv_dt().round() as u32;
ui.add(Slider::new(&mut frequency, 0..=240).text("frequency (Hz)"));
integration_parameters.set_inv_dt(frequency as f32);
@@ -247,7 +253,7 @@ fn serialization_string(timestep_id: usize, physics: &PhysicsState) -> String {
let cs = bincode::serialize(&physics.colliders).unwrap();
// println!("cs: {}", instant::now() - t);
// let t = instant::now();
- let js = bincode::serialize(&physics.joints).unwrap();
+ let js = bincode::serialize(&physics.impulse_joints).unwrap();
// println!("js: {}", instant::now() - t);
let serialization_time = instant::now() - t;
let hash_bf = md5::compute(&bf);