use std::f32::consts::PI; #[cfg(feature = "inspector")] use std::time::Instant; use bevy::prelude::{ Commands, Entity, Quat, Query, Res, ResMut, Time, Transform, Vec3, With, Without, }; use bevy_rapier3d::{ prelude::{ CollisionGroups, ExternalForce, Group, MultibodyJoint, QueryFilter, RapierConfiguration, RapierContext, ReadMassProperties, Velocity, }, rapier::prelude::JointAxis, }; #[cfg(feature = "inspector")] use super::ActionDebugInstant; use super::{CatControllerSettings, CatControllerState, MovementSettings, Tunneling}; use crate::{ bike::{CyberBikeBody, CyberSteering, CyberWheel, BIKE_WHEEL_COLLISION_GROUP}, input::InputState, }; /// Disable gravity in Rapier. pub(super) fn zero_gravity(mut config: ResMut) { config.gravity = Vec3::ZERO; } /// The gravity vector points from the cyberbike to the center of the planet. pub(super) fn gravity( mut query: Query<(&Transform, &mut ExternalForce, &ReadMassProperties), With>, settings: Res, ) { let (xform, mut forces, mprops) = query.single_mut(); let grav = xform.translation.normalize() * -settings.gravity * mprops.0.mass; forces.force = grav; forces.torque = Vec3::ZERO; } /// PID-based controller for stabilizing attitude; keeps the cyberbike upright. pub(super) fn falling_cat( mut bike_query: Query<(&Transform, &mut ExternalForce, &mut CatControllerState)>, time: Res