Bevy 0.16 upgrade (#24)
This commit is contained in:
@@ -12,16 +12,11 @@ use super::controller_common::{CharacterController, MaxSlopeAngle};
|
||||
/// and predict collisions using speculative contacts.
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub fn kinematic_controller_collisions(
|
||||
collisions: Res<Collisions>,
|
||||
collisions: Collisions,
|
||||
bodies: Query<&RigidBody>,
|
||||
collider_parents: Query<&ColliderParent, Without<Sensor>>,
|
||||
collider_rbs: Query<&ColliderOf, Without<Sensor>>,
|
||||
mut character_controllers: Query<
|
||||
(
|
||||
&mut Position,
|
||||
&Rotation,
|
||||
&mut LinearVelocity,
|
||||
Option<&MaxSlopeAngle>,
|
||||
),
|
||||
(&mut Position, &mut LinearVelocity, Option<&MaxSlopeAngle>),
|
||||
(With<RigidBody>, With<CharacterController>),
|
||||
>,
|
||||
time: Res<Time>,
|
||||
@@ -29,8 +24,12 @@ pub fn kinematic_controller_collisions(
|
||||
// Iterate through collisions and move the kinematic body to resolve penetration
|
||||
for contacts in collisions.iter() {
|
||||
// Get the rigid body entities of the colliders (colliders could be children)
|
||||
let Ok([collider_parent1, collider_parent2]) =
|
||||
collider_parents.get_many([contacts.entity1, contacts.entity2])
|
||||
let Ok(
|
||||
[
|
||||
&ColliderOf { rigid_body: rb1 },
|
||||
&ColliderOf { rigid_body: rb2 },
|
||||
],
|
||||
) = collider_rbs.get_many([contacts.entity1, contacts.entity2])
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
@@ -42,20 +41,16 @@ pub fn kinematic_controller_collisions(
|
||||
let character_rb: RigidBody;
|
||||
let is_other_dynamic: bool;
|
||||
|
||||
let (mut position, rotation, mut linear_velocity, max_slope_angle) =
|
||||
if let Ok(character) = character_controllers.get_mut(collider_parent1.get()) {
|
||||
let (mut position, mut linear_velocity, max_slope_angle) =
|
||||
if let Ok(character) = character_controllers.get_mut(rb1) {
|
||||
is_first = true;
|
||||
character_rb = *bodies.get(collider_parent1.get()).unwrap();
|
||||
is_other_dynamic = bodies
|
||||
.get(collider_parent2.get())
|
||||
.is_ok_and(|rb| rb.is_dynamic());
|
||||
character_rb = *bodies.get(rb1).unwrap();
|
||||
is_other_dynamic = bodies.get(rb2).is_ok_and(|rb| rb.is_dynamic());
|
||||
character
|
||||
} else if let Ok(character) = character_controllers.get_mut(collider_parent2.get()) {
|
||||
} else if let Ok(character) = character_controllers.get_mut(rb2) {
|
||||
is_first = false;
|
||||
character_rb = *bodies.get(collider_parent2.get()).unwrap();
|
||||
is_other_dynamic = bodies
|
||||
.get(collider_parent1.get())
|
||||
.is_ok_and(|rb| rb.is_dynamic());
|
||||
character_rb = *bodies.get(rb2).unwrap();
|
||||
is_other_dynamic = bodies.get(rb1).is_ok_and(|rb| rb.is_dynamic());
|
||||
character
|
||||
} else {
|
||||
continue;
|
||||
@@ -70,15 +65,15 @@ pub fn kinematic_controller_collisions(
|
||||
// Each contact in a single manifold shares the same contact normal.
|
||||
for manifold in contacts.manifolds.iter() {
|
||||
let normal = if is_first {
|
||||
-manifold.global_normal1(rotation)
|
||||
-manifold.normal
|
||||
} else {
|
||||
-manifold.global_normal2(rotation)
|
||||
manifold.normal
|
||||
};
|
||||
|
||||
let mut deepest_penetration: Scalar = Scalar::MIN;
|
||||
|
||||
// Solve each penetrating contact in the manifold.
|
||||
for contact in manifold.contacts.iter() {
|
||||
for contact in manifold.points.iter() {
|
||||
if contact.penetration > 0.0 {
|
||||
position.0 += normal * contact.penetration;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user