From a21b4f99045f8cc466ebe7be645f3ab251510349 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Fri, 17 Apr 2026 17:38:07 -0500 Subject: [PATCH] fix: joint damping now applies specifically parallel to the joint --- crates/unified/assets/config/world.wc.toml | 6 +- crates/unified/src/config/world.rs | 5 +- crates/unified/src/server/damping.rs | 76 ++++++++++++++++++++++ crates/unified/src/server/mod.rs | 7 +- crates/unified/src/server/player.rs | 16 +++-- 5 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 crates/unified/src/server/damping.rs diff --git a/crates/unified/assets/config/world.wc.toml b/crates/unified/assets/config/world.wc.toml index b2af455d041fdf631e1dfee293c8e654a023e2d9..de0ba2e46a820c8a53d193237f6f97eee885f96e 100644 --- a/crates/unified/assets/config/world.wc.toml +++ b/crates/unified/assets/config/world.wc.toml @@ -8,10 +8,10 @@ spawn_parts_interval_secs = 1 default_height = 50 default_width = 50 default_mass = 100 -joint_align_compliance = 0.00002 +joint_point_compliance = 0.00002 joint_angle_compliance = 0.000000002 -joint_limit_compliance = 0.0006 -joint_linear_damping = 4.0 +joint_distance_damping = 360.0 +#joint_linear_damping = 0.0 joint_angular_damping = 2.0 [hearty] diff --git a/crates/unified/src/config/world.rs b/crates/unified/src/config/world.rs index a534e90d7549066b08dab88e3f368ca5d3aa6a0e..e890089832df793d47639d443c18e4f5865f9ba5 100644 --- a/crates/unified/src/config/world.rs +++ b/crates/unified/src/config/world.rs @@ -22,10 +22,9 @@ pub struct WPartConfig { pub default_width: f32, pub default_height: f32, pub default_mass: f32, - pub joint_align_compliance: f32, + pub joint_point_compliance: f32, pub joint_angle_compliance: f32, - pub joint_limit_compliance: f32, - pub joint_linear_damping: f32, + pub joint_distance_damping: f32, pub joint_angular_damping: f32, } diff --git a/crates/unified/src/server/damping.rs b/crates/unified/src/server/damping.rs new file mode 100644 index 0000000000000000000000000000000000000000..d94f12314d7153bef5f1cfcb276448f0c288420d --- /dev/null +++ b/crates/unified/src/server/damping.rs @@ -0,0 +1,76 @@ +use avian2d::{dynamics::{joints::EntityConstraint, solver::{joint_damping, schedule::SubstepSolverSystems, solver_body::{SolverBody, SolverBodyInertia}}}, math::RecipOrZero}; + +use crate::prelude::*; + +pub fn damping_plugin(app: &mut App) { + let substeps = app.get_schedule_mut(SubstepSchedule).expect("Add SubstepSchedule first"); + substeps.add_systems( + module_joint_damping:: + .after(joint_damping::) // DistanceJoint is the last damping in vanilla avian + .in_set(SubstepSolverSystems::Damping) + ); +} + +#[derive(Component, Debug, Clone, Copy)] +pub struct ModuleJointDamping { + pub distance: f32, + pub angular: f32, +} +fn module_joint_damping>( + bodies: Query<(&mut SolverBody, &SolverBodyInertia, &Transform)>, + joints: Query<(&T, &ModuleJointDamping)>, + time: Res