lnmp_spatial/
types.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
4pub enum SpatialType {
5    Position2D = 0x01,
6    Position3D = 0x02,
7    Rotation = 0x03,
8    Velocity = 0x04,
9    Acceleration = 0x05,
10    BoundingBox = 0x06,
11    Quaternion = 0x07,
12    Path = 0x08,
13    Transform = 0x09,
14    SpatialState = 0x0A,
15    PositionDelta = 0x0B,
16    RotationDelta = 0x0C,
17    SpatialDelta = 0x0D,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
21pub struct Position2D {
22    pub x: f32,
23    pub y: f32,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
27pub struct Position3D {
28    pub x: f32,
29    pub y: f32,
30    pub z: f32,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
34pub struct Rotation {
35    pub pitch: f32,
36    pub yaw: f32,
37    pub roll: f32,
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
41pub struct Velocity {
42    pub vx: f32,
43    pub vy: f32,
44    pub vz: f32,
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
48pub struct Acceleration {
49    pub ax: f32,
50    pub ay: f32,
51    pub az: f32,
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
55pub struct BoundingBox {
56    pub min_x: f32,
57    pub min_y: f32,
58    pub min_z: f32,
59    pub max_x: f32,
60    pub max_y: f32,
61    pub max_z: f32,
62}
63
64#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
65pub struct Quaternion {
66    pub qx: f32,
67    pub qy: f32,
68    pub qz: f32,
69    pub qw: f32,
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73pub struct Path {
74    pub points: Vec<Position3D>,
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
78pub struct Transform {
79    pub position: Position3D,
80    pub rotation: Rotation,
81    pub scale: Position3D, // Using Position3D for scale x, y, z
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
85pub struct SpatialState {
86    pub position: Option<Position3D>,
87    pub rotation: Option<Rotation>,
88    pub velocity: Option<Velocity>,
89    pub acceleration: Option<Acceleration>,
90}
91
92#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
93pub struct PositionDelta {
94    pub dx: f32,
95    pub dy: f32,
96    pub dz: f32,
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
100pub struct RotationDelta {
101    pub d_pitch: f32,
102    pub d_yaw: f32,
103    pub d_roll: f32,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107pub enum SpatialDelta {
108    Position(PositionDelta),
109    Rotation(RotationDelta),
110    State {
111        position: Option<PositionDelta>,
112        rotation: Option<RotationDelta>,
113        velocity: Option<Velocity>, // Velocity is absolute, or should it be delta? Usually absolute update.
114        acceleration: Option<Acceleration>,
115    },
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
119pub struct PredictiveDelta {
120    pub delta: PositionDelta,
121    pub velocity: Velocity,
122    pub predicted_next: Position3D,
123}
124
125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
126pub enum SpatialValue {
127    S1(Position2D),
128    S2(Position3D),
129    S3(Rotation),
130    S4(Velocity),
131    S5(Acceleration),
132    S6(BoundingBox),
133    S7(Quaternion),
134    S8(Path),
135    S9(Transform),
136    S10(SpatialState),
137    S11(PositionDelta),
138    S12(RotationDelta),
139    S13(SpatialDelta),
140}