Add helper function for calculating closest points between GlobalTransform
and colliders.
This commit is contained in:
parent
5ba4b5272c
commit
4de359ffdb
30
src/core.rs
30
src/core.rs
|
@ -471,6 +471,14 @@ impl From<&dyn PointLike> for (i32, i32) {
|
||||||
|
|
||||||
pub trait GlobalTransformExt {
|
pub trait GlobalTransformExt {
|
||||||
fn yaw(&self) -> Angle;
|
fn yaw(&self) -> Angle;
|
||||||
|
|
||||||
|
fn closest_points(
|
||||||
|
&self,
|
||||||
|
collider: &Collider,
|
||||||
|
other: &GlobalTransform,
|
||||||
|
other_collider: &Collider,
|
||||||
|
) -> ClosestPoints;
|
||||||
|
|
||||||
fn collider_direction_and_distance(
|
fn collider_direction_and_distance(
|
||||||
&self,
|
&self,
|
||||||
collider: &Collider,
|
collider: &Collider,
|
||||||
|
@ -485,6 +493,25 @@ impl GlobalTransformExt for GlobalTransform {
|
||||||
Angle::Radians(forward.y.atan2(forward.x))
|
Angle::Radians(forward.y.atan2(forward.x))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn closest_points(
|
||||||
|
&self,
|
||||||
|
collider: &Collider,
|
||||||
|
other: &GlobalTransform,
|
||||||
|
other_collider: &Collider,
|
||||||
|
) -> ClosestPoints {
|
||||||
|
use bevy::math::Vec3Swizzles;
|
||||||
|
let scale = PHYSICS_SCALE.read().unwrap();
|
||||||
|
let pos1 = Isometry::new(
|
||||||
|
(self.translation() / *scale).xy().into(),
|
||||||
|
self.yaw().radians(),
|
||||||
|
);
|
||||||
|
let pos2 = Isometry::new(
|
||||||
|
(other.translation() / *scale).xy().into(),
|
||||||
|
other.yaw().radians(),
|
||||||
|
);
|
||||||
|
closest_points(&pos1, &*collider.raw, &pos2, &*other_collider.raw, f32::MAX).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
fn collider_direction_and_distance(
|
fn collider_direction_and_distance(
|
||||||
&self,
|
&self,
|
||||||
collider: &Collider,
|
collider: &Collider,
|
||||||
|
@ -501,8 +528,7 @@ impl GlobalTransformExt for GlobalTransform {
|
||||||
(other.translation() / *scale).xy().into(),
|
(other.translation() / *scale).xy().into(),
|
||||||
other.yaw().radians(),
|
other.yaw().radians(),
|
||||||
);
|
);
|
||||||
let closest =
|
let closest = self.closest_points(collider, other, other_collider);
|
||||||
closest_points(&pos1, &*collider.raw, &pos2, &*other_collider.raw, f32::MAX).unwrap();
|
|
||||||
let distance = distance(&pos1, &*collider.raw, &pos2, &*other_collider.raw).unwrap() as u32;
|
let distance = distance(&pos1, &*collider.raw, &pos2, &*other_collider.raw).unwrap() as u32;
|
||||||
let tile_or_tiles = if distance == 1 { "tile" } else { "tiles" };
|
let tile_or_tiles = if distance == 1 { "tile" } else { "tiles" };
|
||||||
if distance > 0 {
|
if distance > 0 {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user