diff --git a/src/action/mod.rs b/src/action/mod.rs index 83fe8ba..abad0bc 100644 --- a/src/action/mod.rs +++ b/src/action/mod.rs @@ -29,15 +29,18 @@ impl Plugin for CyberActionPlugin { .register_type::() .register_type::() .add_plugins((PhysicsPlugins::default(), FrameTimeDiagnosticsPlugin)) - .insert_resource(SubstepCount(24)) + .insert_resource(SubstepCount(6)) .add_systems( Update, ( - gravity, - #[cfg(feature = "inspector")] + set_gravity, + clear_forces, + calculate_lean, + apply_lean, + //#[cfg(feature = "inspector")] debug_bodies, - (cyber_lean, suspension, falling_cat, input_forces).after(clear_forces), - ), + ) + .chain(), ); } } diff --git a/src/action/systems.rs b/src/action/systems.rs index b410b22..84cc282 100644 --- a/src/action/systems.rs +++ b/src/action/systems.rs @@ -1,15 +1,14 @@ use std::f32::consts::{FRAC_PI_3, FRAC_PI_4}; use avian3d::{ + collision::Collisions, dynamics::solver::xpbd::AngularConstraint, prelude::{ - ColliderMassProperties, ExternalForce, ExternalTorque, Gravity, LinearVelocity, + ColliderMassProperties, Collision, ExternalForce, ExternalTorque, Gravity, LinearVelocity, PrismaticJoint, RigidBodyQuery, }, }; -#[cfg(feature = "inspector")] -use bevy::prelude::Entity; -use bevy::prelude::{Quat, Query, Res, ResMut, Time, Transform, Vec3, With, Without}; +use bevy::prelude::{EventReader, Quat, Query, Res, ResMut, Time, Transform, Vec3, With, Without}; use super::{CatControllerSettings, CatControllerState, CyberLean, MovementSettings}; use crate::{ @@ -38,7 +37,7 @@ fn rotate_point(pt: &Vec3, rot: &Quat) -> Vec3 { } /// The gravity vector points from the cyberbike to the center of the planet. -pub(super) fn gravity( +pub(super) fn set_gravity( xform: Query<&Transform, With>, settings: Res, @@ -46,20 +45,25 @@ pub(super) fn gravity( ) { let xform = xform.single(); *gravity = Gravity(xform.translation.normalize() * -settings.gravity); - - // clear all external forces } -pub(super) fn clear_forces(mut forces: Query<(&mut ExternalForce, &mut ExternalTorque)>) { - for (mut force, mut torque) in forces.iter_mut() { - force.clear(); - torque.clear(); +pub(super) fn clear_forces( + mut forces: Query<(Option<&mut ExternalForce>, Option<&mut ExternalTorque>)>, +) { + for (force, torque) in forces.iter_mut() { + if let Some(mut force) = force { + force.clear(); + } + if let Some(mut torque) = torque { + torque.clear(); + } } } pub(super) fn suspension( movment_settings: Res, wheel_config: Res, + time: Res