kittycad_modeling_cmds/
coord.rs1use parse_display::{Display, FromStr};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, JsonSchema, Display, FromStr)]
11#[serde(rename_all = "snake_case")]
12#[display(style = "snake_case")]
13#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
14#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
15pub enum Axis {
16    Y = 1,
18    Z = 2,
20}
21
22#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, JsonSchema, Display, FromStr)]
24#[serde(rename_all = "snake_case")]
25#[display(style = "snake_case")]
26#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
27#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
28pub enum Direction {
29    Positive = 1,
31    Negative = -1,
33}
34
35impl std::ops::Mul for Direction {
36    type Output = Self;
37    fn mul(self, rhs: Self) -> Self::Output {
38        match self as i32 * rhs as i32 {
39            1 => Direction::Positive,
40            -1 => Direction::Negative,
41            _ => unreachable!(),
42        }
43    }
44}
45
46#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, JsonSchema, Display, FromStr)]
48#[display("({axis}, {direction})")]
49#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
50#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
51pub struct AxisDirectionPair {
52    pub axis: Axis,
54
55    pub direction: Direction,
57}
58
59#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize, JsonSchema, Display, FromStr)]
67#[display("forward: {forward}, up: {up}")]
68#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
69#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
70pub struct System {
71    pub forward: AxisDirectionPair,
73    pub up: AxisDirectionPair,
75}
76
77pub const KITTYCAD: &System = &System {
83    forward: AxisDirectionPair {
85        axis: Axis::Y,
86        direction: Direction::Negative,
87    },
88    up: AxisDirectionPair {
90        axis: Axis::Z,
91        direction: Direction::Positive,
92    },
93};
94
95pub const OPENGL: &System = &System {
101    forward: AxisDirectionPair {
103        axis: Axis::Z,
104        direction: Direction::Positive,
105    },
106    up: AxisDirectionPair {
108        axis: Axis::Y,
109        direction: Direction::Positive,
110    },
111};
112
113pub const VULKAN: &System = &System {
119    forward: AxisDirectionPair {
121        axis: Axis::Z,
122        direction: Direction::Positive,
123    },
124    up: AxisDirectionPair {
126        axis: Axis::Y,
127        direction: Direction::Negative,
128    },
129};
130
131#[inline]
171pub fn transform(a: [f32; 3], from: &System, to: &System) -> [f32; 3] {
172    let mut b = a;
173    b[to.forward.axis as usize] =
174        (from.forward.direction * to.forward.direction) as i32 as f32 * a[from.forward.axis as usize];
175    b[to.up.axis as usize] = (from.up.direction * to.up.direction) as i32 as f32 * a[from.up.axis as usize];
176    b
177}