dear_imguizmo/
types.rs

1use dear_imguizmo_sys as sys;
2
3bitflags::bitflags! {
4    #[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
5    pub struct Operation: u32 {
6        const TRANSLATE_X     = sys::TRANSLATE_X as u32;
7        const TRANSLATE_Y     = sys::TRANSLATE_Y as u32;
8        const TRANSLATE_Z     = sys::TRANSLATE_Z as u32;
9        const ROTATE_X        = sys::ROTATE_X as u32;
10        const ROTATE_Y        = sys::ROTATE_Y as u32;
11        const ROTATE_Z        = sys::ROTATE_Z as u32;
12        const ROTATE_SCREEN   = sys::ROTATE_SCREEN as u32;
13        const SCALE_X         = sys::SCALE_X as u32;
14        const SCALE_Y         = sys::SCALE_Y as u32;
15        const SCALE_Z         = sys::SCALE_Z as u32;
16        const BOUNDS          = sys::BOUNDS as u32;
17        const SCALE_UNIFORM_X = sys::SCALE_XU as u32;
18        const SCALE_UNIFORM_Y = sys::SCALE_YU as u32;
19        const SCALE_UNIFORM_Z = sys::SCALE_ZU as u32;
20
21        const TRANSLATE    = sys::TRANSLATE as u32;
22        const ROTATE       = sys::ROTATE as u32;
23        const SCALE        = sys::SCALE as u32;
24        const SCALE_UNIFORM= sys::SCALEU as u32;
25        const UNIVERSAL    = sys::UNIVERSAL as u32;
26    }
27}
28
29impl From<Operation> for sys::OPERATION {
30    fn from(value: Operation) -> Self {
31        value.bits() as sys::OPERATION
32    }
33}
34
35bitflags::bitflags! {
36    #[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
37    pub struct AxisMask: u8 {
38        const X = 1 << 0;
39        const Y = 1 << 1;
40        const Z = 1 << 2;
41    }
42}
43
44#[derive(Copy, Clone, Debug, PartialEq, Eq)]
45#[repr(u32)]
46pub enum Mode {
47    Local = sys::LOCAL as u32,
48    World = sys::WORLD as u32,
49}
50
51impl From<Mode> for sys::MODE {
52    fn from(value: Mode) -> Self {
53        value as sys::MODE
54    }
55}
56
57/// Color slots used by ImGuizmo style
58#[derive(Copy, Clone, Debug, PartialEq, Eq)]
59#[repr(u32)]
60pub enum Color {
61    DirectionX = sys::DIRECTION_X as u32,
62    DirectionY = sys::DIRECTION_Y as u32,
63    DirectionZ = sys::DIRECTION_Z as u32,
64    PlaneX = sys::PLANE_X as u32,
65    PlaneY = sys::PLANE_Y as u32,
66    PlaneZ = sys::PLANE_Z as u32,
67    Selection = sys::SELECTION as u32,
68    Inactive = sys::INACTIVE as u32,
69    TranslationLine = sys::TRANSLATION_LINE as u32,
70    ScaleLine = sys::SCALE_LINE as u32,
71    RotationUsingBorder = sys::ROTATION_USING_BORDER as u32,
72    RotationUsingFill = sys::ROTATION_USING_FILL as u32,
73    HatchedAxisLines = sys::HATCHED_AXIS_LINES as u32,
74    Text = sys::TEXT as u32,
75    TextShadow = sys::TEXT_SHADOW as u32,
76    Count = sys::COUNT as u32,
77}
78
79/// Draw list destination for ImGuizmo rendering
80#[derive(Copy, Clone, Debug, PartialEq, Eq)]
81pub enum DrawListTarget {
82    Window,
83    Background,
84    Foreground,
85}
86
87/// Identifier accepted by ImGuizmo's ID stack
88#[derive(Copy, Clone, Debug)]
89pub enum GuizmoId<'a> {
90    Int(i32),
91    Str(&'a str),
92    /// A non-NUL-terminated byte slice, passed via the `str_begin/str_end` C API.
93    ///
94    /// This allows IDs containing interior NUL bytes and avoids `CString` allocation.
95    Bytes(&'a [u8]),
96    Ptr(*const std::ffi::c_void),
97}
98impl From<i32> for GuizmoId<'_> {
99    fn from(v: i32) -> Self {
100        GuizmoId::Int(v)
101    }
102}
103impl<'a> From<&'a str> for GuizmoId<'a> {
104    fn from(s: &'a str) -> Self {
105        GuizmoId::Str(s)
106    }
107}
108impl<'a> From<&'a [u8]> for GuizmoId<'a> {
109    fn from(bytes: &'a [u8]) -> Self {
110        GuizmoId::Bytes(bytes)
111    }
112}
113impl<T> From<*const T> for GuizmoId<'_> {
114    fn from(p: *const T) -> Self {
115        GuizmoId::Ptr(p as _)
116    }
117}
118impl<T> From<*mut T> for GuizmoId<'_> {
119    fn from(p: *mut T) -> Self {
120        GuizmoId::Ptr(p as _)
121    }
122}
123
124/// Bounds type for typed bounds passing
125#[derive(Copy, Clone, Debug, PartialEq)]
126pub struct Bounds {
127    pub min: [f32; 3],
128    pub max: [f32; 3],
129}
130
131/// Simple 3D vector adaptor for glam/mint/[f32;3]/tuples
132pub trait Vec3Like {
133    fn to_array(self) -> [f32; 3];
134}
135impl Vec3Like for [f32; 3] {
136    fn to_array(self) -> [f32; 3] {
137        self
138    }
139}
140impl Vec3Like for (f32, f32, f32) {
141    fn to_array(self) -> [f32; 3] {
142        [self.0, self.1, self.2]
143    }
144}
145#[cfg(feature = "glam")]
146impl Vec3Like for glam::Vec3 {
147    fn to_array(self) -> [f32; 3] {
148        [self.x, self.y, self.z]
149    }
150}
151#[cfg(feature = "mint")]
152impl Vec3Like for mint::Vector3<f32> {
153    fn to_array(self) -> [f32; 3] {
154        [self.x, self.y, self.z]
155    }
156}