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}