diff --git a/src/plugin/context/mod.rs b/src/plugin/context/mod.rs index 74ff5d0c..a8ab71d0 100644 --- a/src/plugin/context/mod.rs +++ b/src/plugin/context/mod.rs @@ -808,8 +808,7 @@ impl RapierContextSimulation { &EventWriter, )>, hooks: &dyn PhysicsHooks, - time: &Time, - sim_to_render_time: &mut SimulationToRenderTime, + time: &Time, mut interpolation_query: Option< &mut Query<(&RapierRigidBodyHandle, &mut TransformInterpolation)>, >, @@ -837,50 +836,36 @@ impl RapierContextSimulation { time_scale, substeps, } => { - self.integration_parameters.dt = dt; + let mut substep_integration_parameters = self.integration_parameters; + substep_integration_parameters.dt = dt / (substeps as Real) * time_scale; - sim_to_render_time.diff += time.delta_secs(); - - while sim_to_render_time.diff > 0.0 { - // NOTE: in this comparison we do the same computations we - // will do for the next `while` iteration test, to make sure we - // don't get bit by potential float inaccuracy. - if sim_to_render_time.diff - dt <= 0.0 { - if let Some(interpolation_query) = interpolation_query.as_mut() { - // This is the last simulation step to be executed in the loop - // Update the previous state transforms - for (handle, mut interpolation) in interpolation_query.iter_mut() { - if let Some(body) = rigidbody_set.bodies.get(handle.0) { - interpolation.start = Some(*body.position()); - interpolation.end = None; - } - } - } - } + for _ in 0..substeps { + self.pipeline.step( + &gravity.into(), + &substep_integration_parameters, + &mut self.islands, + &mut self.broad_phase, + &mut self.narrow_phase, + &mut rigidbody_set.bodies, + &mut colliders.colliders, + &mut joints.impulse_joints, + &mut joints.multibody_joints, + &mut self.ccd_solver, + None, + hooks, + event_handler, + ); + executed_steps += 1; + } - let mut substep_integration_parameters = self.integration_parameters; - substep_integration_parameters.dt = dt / (substeps as Real) * time_scale; - - for _ in 0..substeps { - self.pipeline.step( - &gravity.into(), - &substep_integration_parameters, - &mut self.islands, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut rigidbody_set.bodies, - &mut colliders.colliders, - &mut joints.impulse_joints, - &mut joints.multibody_joints, - &mut self.ccd_solver, - None, - hooks, - event_handler, - ); - executed_steps += 1; + if let Some(interpolation_query) = interpolation_query.as_mut() { + // Update the previous state transforms + for (handle, mut interpolation) in interpolation_query.iter_mut() { + if let Some(body) = rigidbody_set.bodies.get(handle.0) { + interpolation.start = interpolation.end; + interpolation.end = Some(*body.position()); + } } - - sim_to_render_time.diff -= dt; } } TimestepMode::Variable { diff --git a/src/plugin/context/systemparams/rapier_context_systemparam.rs b/src/plugin/context/systemparams/rapier_context_systemparam.rs index 04477535..05258307 100644 --- a/src/plugin/context/systemparams/rapier_context_systemparam.rs +++ b/src/plugin/context/systemparams/rapier_context_systemparam.rs @@ -148,7 +148,6 @@ mod simulation { use crate::control::CharacterCollision; use crate::control::MoveShapeOptions; use crate::control::MoveShapeOutput; - use crate::plugin::context::SimulationToRenderTime; use crate::plugin::ContactPairView; use crate::plugin::TimestepMode; use crate::prelude::Collider; @@ -210,8 +209,7 @@ mod simulation { &EventWriter, )>, hooks: &dyn PhysicsHooks, - time: &Time, - sim_to_render_time: &mut SimulationToRenderTime, + time: &Time, interpolation_query: Option< &mut Query<(&RapierRigidBodyHandle, &mut TransformInterpolation)>, >, @@ -225,7 +223,6 @@ mod simulation { events, hooks, time, - sim_to_render_time, interpolation_query, ) } diff --git a/src/plugin/plugin.rs b/src/plugin/plugin.rs index c955d270..4fcca4c1 100644 --- a/src/plugin/plugin.rs +++ b/src/plugin/plugin.rs @@ -298,14 +298,26 @@ where if self.default_system_setup { app.configure_sets( self.schedule, + (PhysicsSet::SyncBackend, PhysicsSet::StepSimulation) + .chain() + .before(TransformSystem::TransformPropagate), + ); + app.add_systems( + PostUpdate, ( - PhysicsSet::SyncBackend, - PhysicsSet::StepSimulation, - PhysicsSet::Writeback, + systems::update_colliding_entities, + systems::writeback_rigid_bodies, + systems::writeback_mass_properties + .ambiguous_with(systems::writeback_rigid_bodies), ) .chain() .before(TransformSystem::TransformPropagate), ); + // app.configure_sets( + // PostUpdate, + // (PhysicsSet::Writeback).before(TransformSystem::TransformPropagate), + // ); + app.add_systems(FixedPreUpdate, systems::update_rigid_bodies); app.configure_sets( self.schedule, RapierTransformPropagateSet.in_set(PhysicsSet::SyncBackend), @@ -320,7 +332,7 @@ where } }; add_systems_if_enabled(PhysicsSet::SyncBackend); - add_systems_if_enabled(PhysicsSet::Writeback); + // add_systems_if_enabled(PhysicsSet::Writeback); add_systems_if_enabled(PhysicsSet::StepSimulation); app.init_resource::(); @@ -329,7 +341,7 @@ where if self.schedule.as_dyn_eq().dyn_eq(FixedUpdate.as_dyn_eq()) { let config = app.world_mut().resource::(); match config { - TimestepMode::Fixed { .. } => {} + TimestepMode::Fixed { .. } | TimestepMode::Interpolated { .. } => {} mode => { warn!("TimestepMode is set to `{:?}`, it is recommended to use `TimestepMode::Fixed` if you have the physics in `FixedUpdate`", mode); } diff --git a/src/plugin/systems/mod.rs b/src/plugin/systems/mod.rs index ef2d03bf..bacd5c12 100644 --- a/src/plugin/systems/mod.rs +++ b/src/plugin/systems/mod.rs @@ -18,7 +18,6 @@ pub use writeback::*; use crate::dynamics::{RapierRigidBodyHandle, TransformInterpolation}; use crate::pipeline::{CollisionEvent, ContactForceEvent}; -use crate::plugin::context::SimulationToRenderTime; use crate::plugin::{RapierConfiguration, TimestepMode}; use crate::prelude::{BevyPhysicsHooks, BevyPhysicsHooksAdapter}; use bevy::ecs::system::{StaticSystemParam, SystemParamItem}; @@ -39,11 +38,10 @@ pub fn step_simulation( &mut RapierContextJoints, &mut RapierRigidBodySet, &RapierConfiguration, - &mut SimulationToRenderTime, )>, timestep_mode: Res, hooks: StaticSystemParam, - time: Res