generic_octree/
orientation.rs

1use crate::LocCode;
2use std::ops::BitOr;
3
4// TODO: Make u8 not rely on enum position
5#[derive(Debug, Clone, Copy)]
6pub enum Orientation {
7    LBU,
8    LFU,
9    LFD,
10    LBD,
11    RBD,
12    RFD,
13    RFU,
14    RBU,
15    N,
16    L,
17    R,
18    F,
19    B,
20    U,
21    D,
22    LF,
23    LB,
24    RF,
25    RB,
26    FU,
27    FD,
28    BU,
29    BD,
30    LU,
31    LD,
32    RU,
33    RD,
34}
35
36type Center = (f64, f64, f64);
37
38impl Orientation {
39    pub fn make_new_center<L>(self, loc_code: L, center: Center) -> Center
40    where
41        L: LocCode,
42    {
43        let offset: f64 = 1.0 / ((2 as u32).pow(loc_code.get_level()) as f64);
44        match self {
45            Self::LBU => (center.0 - offset, center.1 + offset, center.2 - offset),
46            Self::LFU => (center.0 - offset, center.1 + offset, center.2 + offset),
47            Self::LFD => (center.0 - offset, center.1 - offset, center.2 + offset),
48            Self::LBD => (center.0 - offset, center.1 - offset, center.2 - offset),
49            Self::RBD => (center.0 + offset, center.1 - offset, center.2 - offset),
50            Self::RFD => (center.0 + offset, center.1 - offset, center.2 + offset),
51            Self::RFU => (center.0 + offset, center.1 + offset, center.2 + offset),
52            Self::RBU => (center.0 + offset, center.1 + offset, center.2 - offset),
53            _ => center,
54        }
55    }
56}
57
58/// TODO: Make this TryInto
59impl Into<u8> for Orientation {
60    fn into(self) -> u8 {
61        match self {
62            Self::LBU => 0,
63            Self::LFU => 1,
64            Self::LFD => 2,
65            Self::LBD => 3,
66            Self::RBD => 4,
67            Self::RFD => 5,
68            Self::RFU => 6,
69            Self::RBU => 7,
70            _ => 8,
71        }
72    }
73}
74
75impl BitOr for Orientation {
76    type Output = Self;
77
78    fn bitor(self, rh: Self) -> Self {
79        match (&self, &rh) {
80            // X | Z
81            (Self::L, Self::F) => Self::LF,
82            (Self::L, Self::B) => Self::LB,
83            (Self::R, Self::F) => Self::RF,
84            (Self::R, Self::B) => Self::RB,
85            (Self::F, Self::L) => Self::LF,
86            (Self::F, Self::R) => Self::RF,
87            (Self::B, Self::L) => Self::LB,
88            (Self::B, Self::R) => Self::RB,
89
90            // Z | Y
91            (Self::F, Self::U) => Self::FU,
92            (Self::F, Self::D) => Self::FD,
93            (Self::B, Self::U) => Self::BU,
94            (Self::B, Self::D) => Self::BD,
95            (Self::U, Self::F) => Self::FU,
96            (Self::U, Self::B) => Self::BU,
97            (Self::D, Self::F) => Self::FD,
98            (Self::D, Self::B) => Self::BD,
99
100            // Y | X
101            (Self::L, Self::U) => Self::LU,
102            (Self::L, Self::D) => Self::LD,
103            (Self::R, Self::U) => Self::RU,
104            (Self::R, Self::D) => Self::RD,
105            (Self::U, Self::L) => Self::LU,
106            (Self::U, Self::R) => Self::RU,
107            (Self::D, Self::L) => Self::LD,
108            (Self::D, Self::R) => Self::RD,
109
110            // XZ | Y
111            (Self::LF, Self::U) => Self::LFU,
112            (Self::LF, Self::D) => Self::LFD,
113            (Self::LB, Self::U) => Self::LBU,
114            (Self::LB, Self::D) => Self::LBD,
115            (Self::RF, Self::U) => Self::RFU,
116            (Self::RF, Self::D) => Self::RFD,
117            (Self::RB, Self::U) => Self::RBU,
118            (Self::RB, Self::D) => Self::RBD,
119            (Self::U, Self::LF) => Self::LFU,
120            (Self::U, Self::LB) => Self::LBU,
121            (Self::U, Self::RF) => Self::RFU,
122            (Self::U, Self::RB) => Self::RBU,
123            (Self::D, Self::LF) => Self::LFD,
124            (Self::D, Self::LB) => Self::LBD,
125            (Self::D, Self::RF) => Self::RFD,
126            (Self::D, Self::RB) => Self::RBD,
127
128            // YZ | X
129            (Self::FU, Self::L) => Self::LFU,
130            (Self::FU, Self::R) => Self::RFU,
131            (Self::FD, Self::L) => Self::LFD,
132            (Self::FD, Self::R) => Self::RFD,
133            (Self::BU, Self::L) => Self::LBU,
134            (Self::BU, Self::R) => Self::RBU,
135            (Self::BD, Self::L) => Self::LBD,
136            (Self::BD, Self::R) => Self::RBD,
137            (Self::L, Self::FU) => Self::LFU,
138            (Self::L, Self::FD) => Self::LFD,
139            (Self::L, Self::BU) => Self::LBU,
140            (Self::L, Self::BD) => Self::LBD,
141            (Self::R, Self::FU) => Self::RFU,
142            (Self::R, Self::FD) => Self::RFD,
143            (Self::R, Self::BU) => Self::RBU,
144            (Self::R, Self::BD) => Self::RBD,
145
146            // XY | Z
147            (Self::LU, Self::F) => Self::LFU,
148            (Self::LU, Self::B) => Self::LBU,
149            (Self::LD, Self::F) => Self::LFD,
150            (Self::LD, Self::B) => Self::LBD,
151            (Self::RU, Self::F) => Self::RFU,
152            (Self::RU, Self::B) => Self::RBU,
153            (Self::RD, Self::F) => Self::RFD,
154            (Self::RD, Self::B) => Self::RBD,
155            (Self::F, Self::LU) => Self::LFU,
156            (Self::F, Self::LD) => Self::LFD,
157            (Self::F, Self::RU) => Self::RFU,
158            (Self::F, Self::RD) => Self::RFD,
159            (Self::B, Self::LU) => Self::LBU,
160            (Self::B, Self::LD) => Self::LBD,
161            (Self::B, Self::RU) => Self::RBU,
162            (Self::B, Self::RD) => Self::RBD,
163
164            // Otherwise
165            (Self::N, _) => rh,
166            _ => self,
167        }
168    }
169}