1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use crate::math::{Real, Vect};
use rapier::parry::shape::Segment;

/// Read-only access to the properties of a segment.
pub struct SegmentView<'a> {
    /// The raw shape from Rapier.
    pub raw: &'a Segment,
}

macro_rules! impl_ref_methods(
    ($View: ident) => {
        impl<'a> $View<'a> {
            /// The segment first point.
            pub fn a(&self) -> Vect {
                self.raw.a.into()
            }

            /// The segment second point.
            pub fn b(&self) -> Vect {
                self.raw.b.into()
            }

            /// The direction of this segment scaled by its length.
            ///
            /// Points from `self.a` toward `self.b`.
            pub fn scaled_direction(&self) -> Vect {
                self.raw.scaled_direction().into()
            }

            /// The length of this segment.
            pub fn length(&self) -> Real {
                self.raw.length()
            }

            /// The unit direction of this segment.
            ///
            /// Points from `self.a()` toward `self.b()`.
            /// Returns `None` is both points are equal.
            pub fn direction(&self) -> Option<Vect> {
                self.raw.direction().map(|dir| (*dir).into())
            }

            /// In 2D, the not-normalized counterclockwise normal of this segment.
            #[cfg(feature = "dim2")]
            pub fn scaled_normal(&self) -> Vect {
                self.raw.scaled_normal().into()
            }

            /// The not-normalized counterclockwise normal of this segment, assuming it lies on the plane
            /// with the normal collinear to the given axis (0 = X, 1 = Y, 2 = Z).
            #[cfg(feature = "dim3")]
            pub fn scaled_planar_normal(&self, plane_axis: u8) -> Vect {
                self.raw.scaled_planar_normal(plane_axis).into()
            }

            /// In 2D, the normalized counterclockwise normal of this segment.
            #[cfg(feature = "dim2")]
            pub fn normal(&self) -> Option<Vect> {
                self.raw.normal().map(|n| (*n).into())
            }

            /// Returns `None`. Exists only for API similarity with the 2D parry.
            #[cfg(feature = "dim3")]
            pub fn normal(&self) -> Option<Vect> {
                self.raw.normal().map(|n| (*n).into())
            }

            /// The normalized counterclockwise normal of this segment, assuming it lies on the plane
            /// with the normal collinear to the given axis (0 = X, 1 = Y, 2 = Z).
            #[cfg(feature = "dim3")]
            pub fn planar_normal(&self, plane_axis: u8) -> Option<Vect> {
                self.raw.planar_normal(plane_axis).map(|n| (*n).into())
            }
        }
    }
);

impl_ref_methods!(SegmentView);

/// Read-write access to the properties of a segment.
pub struct SegmentViewMut<'a> {
    /// The raw shape from Rapier.
    pub raw: &'a mut Segment,
}

impl_ref_methods!(SegmentViewMut);

impl<'a> SegmentViewMut<'a> {
    /// Set the first point of the segment.
    pub fn set_a(&mut self, a: Vect) {
        self.raw.a = a.into();
    }

    /// Set the second point of the segment.
    pub fn set_b(&mut self, b: Vect) {
        self.raw.b = b.into();
    }
}