jagua_rs/geometry/geo_traits.rs
1use crate::geometry::Transformation;
2use crate::geometry::geo_enums::GeoPosition;
3
4/// Trait for types that can detect collisions between `self` and `other` of type `T`.
5pub trait CollidesWith<T> {
6 fn collides_with(&self, other: &T) -> bool;
7}
8
9/// Trait for types that can detect 'almost-collisions' between `self` and `other` of type `T`.
10///
11/// Due to floating point arithmetic precision, two objects that are very close to each other may have unexpected behavior with
12/// the [CollidesWith] trait. This trait errors on the side of false positives, so that if two objects are very close to each other,
13/// they will be considered as colliding.
14pub trait AlmostCollidesWith<T> {
15 fn almost_collides_with(&self, other: &T) -> bool;
16}
17
18/// Trait for types that can compute the minimum distance between `self` and `other` of type `T`.
19pub trait DistanceTo<T> {
20 /// Minimum distance between two primitives. Will be 0 in case of a collision.
21 fn distance_to(&self, other: &T) -> f32;
22
23 /// Squared version of [DistanceTo::distance_to]
24 fn sq_distance_to(&self, other: &T) -> f32;
25}
26
27/// Trait for types that can compute the minimum distance to separate `self` from `other` of type `T`.
28pub trait SeparationDistance<T>: DistanceTo<T> {
29 /// In case of a collision between `self` and `other`, returns [GeoPosition::Interior] and the minimum distance to separate the two primitives.
30 /// Otherwise, returns [GeoPosition::Exterior] and the minimum distance between the two primitives. (similar to [DistanceTo::distance_to])
31 fn separation_distance(&self, other: &T) -> (GeoPosition, f32);
32
33 /// Squared version of [SeparationDistance::separation_distance]
34 fn sq_separation_distance(&self, other: &T) -> (GeoPosition, f32);
35}
36
37/// Trait for types that can modify themselves by a [`Transformation`].
38pub trait Transformable: Clone {
39 /// Applies a transformation to `self`.
40 fn transform(&mut self, t: &Transformation) -> &mut Self;
41
42 /// Applies a transformation to a clone.
43 fn transform_clone(&self, t: &Transformation) -> Self {
44 let mut clone = self.clone();
45 clone.transform(t);
46 clone
47 }
48}
49
50/// Trait for types that can modify themselves to a reference object with a [`Transformation`] applied.
51///
52/// Useful when repeatedly transforming a single object without having to reallocate new memory each time.
53pub trait TransformableFrom: Transformable {
54 /// Applies a transformation on the reference object and stores the result in `self`.
55 fn transform_from(&mut self, reference: &Self, t: &Transformation) -> &mut Self;
56}