Skip to main content

modelio/
types.rs

1use serde::Deserialize;
2
3#[derive(Debug, Clone, Copy, PartialEq, Deserialize)]
4pub struct BoundingBox {
5    pub min: [f32; 3],
6    pub max: [f32; 3],
7}
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10#[repr(i32)]
11pub enum GeometryType {
12    Points = 0,
13    Lines = 1,
14    Triangles = 2,
15    TriangleStrips = 3,
16    Quads = 4,
17    VariableTopology = 5,
18}
19
20impl GeometryType {
21    #[must_use]
22    pub const fn as_raw(self) -> i32 {
23        self as i32
24    }
25
26    #[must_use]
27    pub const fn from_raw(raw: i32) -> Option<Self> {
28        match raw {
29            0 => Some(Self::Points),
30            1 => Some(Self::Lines),
31            2 => Some(Self::Triangles),
32            3 => Some(Self::TriangleStrips),
33            4 => Some(Self::Quads),
34            5 => Some(Self::VariableTopology),
35            _ => None,
36        }
37    }
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41#[repr(i32)]
42pub enum ProbePlacement {
43    UniformGrid = 0,
44    IrradianceDistribution = 1,
45}
46
47impl ProbePlacement {
48    #[must_use]
49    pub const fn as_raw(self) -> i32 {
50        self as i32
51    }
52
53    #[must_use]
54    pub const fn from_raw(raw: i32) -> Option<Self> {
55        match raw {
56            0 => Some(Self::UniformGrid),
57            1 => Some(Self::IrradianceDistribution),
58            _ => None,
59        }
60    }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
64#[repr(u32)]
65pub enum IndexBitDepth {
66    UInt8 = 8,
67    UInt16 = 16,
68    UInt32 = 32,
69}
70
71impl IndexBitDepth {
72    #[must_use]
73    pub const fn as_raw(self) -> u32 {
74        self as u32
75    }
76
77    #[must_use]
78    pub const fn from_raw(raw: u32) -> Option<Self> {
79        match raw {
80            8 => Some(Self::UInt8),
81            16 => Some(Self::UInt16),
82            32 => Some(Self::UInt32),
83            _ => None,
84        }
85    }
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89#[repr(u32)]
90pub enum MeshBufferType {
91    Vertex = 1,
92    Index = 2,
93    Custom = 3,
94}
95
96impl MeshBufferType {
97    #[must_use]
98    pub const fn as_raw(self) -> u32 {
99        self as u32
100    }
101
102    #[must_use]
103    pub const fn from_raw(raw: u32) -> Option<Self> {
104        match raw {
105            1 => Some(Self::Vertex),
106            2 => Some(Self::Index),
107            3 => Some(Self::Custom),
108            _ => None,
109        }
110    }
111}
112
113#[derive(Debug, Clone, Copy, PartialEq, Eq)]
114#[repr(u32)]
115pub enum MaterialSemantic {
116    BaseColor = 0,
117    Subsurface = 1,
118    Metallic = 2,
119    Specular = 3,
120    SpecularExponent = 4,
121    SpecularTint = 5,
122    Roughness = 6,
123    Anisotropic = 7,
124    AnisotropicRotation = 8,
125    Sheen = 9,
126    SheenTint = 10,
127    Clearcoat = 11,
128    ClearcoatGloss = 12,
129    Emission = 13,
130    Bump = 14,
131    Opacity = 15,
132    InterfaceIndexOfRefraction = 16,
133    MaterialIndexOfRefraction = 17,
134    ObjectSpaceNormal = 18,
135    TangentSpaceNormal = 19,
136    Displacement = 20,
137    DisplacementScale = 21,
138    AmbientOcclusion = 22,
139    AmbientOcclusionScale = 23,
140    None = 0x8000,
141    UserDefined = 0x8001,
142}
143
144impl MaterialSemantic {
145    #[must_use]
146    pub const fn from_raw(raw: u32) -> Option<Self> {
147        match raw {
148            0 => Some(Self::BaseColor),
149            1 => Some(Self::Subsurface),
150            2 => Some(Self::Metallic),
151            3 => Some(Self::Specular),
152            4 => Some(Self::SpecularExponent),
153            5 => Some(Self::SpecularTint),
154            6 => Some(Self::Roughness),
155            7 => Some(Self::Anisotropic),
156            8 => Some(Self::AnisotropicRotation),
157            9 => Some(Self::Sheen),
158            10 => Some(Self::SheenTint),
159            11 => Some(Self::Clearcoat),
160            12 => Some(Self::ClearcoatGloss),
161            13 => Some(Self::Emission),
162            14 => Some(Self::Bump),
163            15 => Some(Self::Opacity),
164            16 => Some(Self::InterfaceIndexOfRefraction),
165            17 => Some(Self::MaterialIndexOfRefraction),
166            18 => Some(Self::ObjectSpaceNormal),
167            19 => Some(Self::TangentSpaceNormal),
168            20 => Some(Self::Displacement),
169            21 => Some(Self::DisplacementScale),
170            22 => Some(Self::AmbientOcclusion),
171            23 => Some(Self::AmbientOcclusionScale),
172            0x8000 => Some(Self::None),
173            0x8001 => Some(Self::UserDefined),
174            _ => None,
175        }
176    }
177}
178
179#[derive(Debug, Clone, Copy, PartialEq, Eq)]
180#[repr(u32)]
181pub enum MaterialPropertyType {
182    None = 0,
183    String = 1,
184    Url = 2,
185    Texture = 3,
186    Color = 4,
187    Float = 5,
188    Float2 = 6,
189    Float3 = 7,
190    Float4 = 8,
191    Matrix44 = 9,
192    Buffer = 10,
193}
194
195impl MaterialPropertyType {
196    #[must_use]
197    pub const fn from_raw(raw: u32) -> Option<Self> {
198        match raw {
199            0 => Some(Self::None),
200            1 => Some(Self::String),
201            2 => Some(Self::Url),
202            3 => Some(Self::Texture),
203            4 => Some(Self::Color),
204            5 => Some(Self::Float),
205            6 => Some(Self::Float2),
206            7 => Some(Self::Float3),
207            8 => Some(Self::Float4),
208            9 => Some(Self::Matrix44),
209            10 => Some(Self::Buffer),
210            _ => None,
211        }
212    }
213}
214
215#[derive(Debug, Clone, Copy, PartialEq, Eq)]
216#[repr(u32)]
217pub enum MaterialFace {
218    Front = 0,
219    Back = 1,
220    DoubleSided = 2,
221}
222
223impl MaterialFace {
224    #[must_use]
225    pub const fn as_raw(self) -> u32 {
226        self as u32
227    }
228
229    #[must_use]
230    pub const fn from_raw(raw: u32) -> Option<Self> {
231        match raw {
232            0 => Some(Self::Front),
233            1 => Some(Self::Back),
234            2 => Some(Self::DoubleSided),
235            _ => None,
236        }
237    }
238}
239
240#[derive(Debug, Clone, Copy, PartialEq, Eq)]
241#[repr(u32)]
242pub enum LightType {
243    Unknown = 0,
244    Ambient = 1,
245    Directional = 2,
246    Spot = 3,
247    Point = 4,
248    Linear = 5,
249    DiscArea = 6,
250    RectangularArea = 7,
251    SuperElliptical = 8,
252    Photometric = 9,
253    Probe = 10,
254    Environment = 11,
255}
256
257impl LightType {
258    #[must_use]
259    pub const fn as_raw(self) -> u32 {
260        self as u32
261    }
262
263    #[must_use]
264    pub const fn from_raw(raw: u32) -> Option<Self> {
265        match raw {
266            0 => Some(Self::Unknown),
267            1 => Some(Self::Ambient),
268            2 => Some(Self::Directional),
269            3 => Some(Self::Spot),
270            4 => Some(Self::Point),
271            5 => Some(Self::Linear),
272            6 => Some(Self::DiscArea),
273            7 => Some(Self::RectangularArea),
274            8 => Some(Self::SuperElliptical),
275            9 => Some(Self::Photometric),
276            10 => Some(Self::Probe),
277            11 => Some(Self::Environment),
278            _ => None,
279        }
280    }
281}
282
283#[derive(Debug, Clone, Copy, PartialEq, Eq)]
284#[repr(u32)]
285pub enum CameraProjection {
286    Perspective = 0,
287    Orthographic = 1,
288}
289
290impl CameraProjection {
291    #[must_use]
292    pub const fn as_raw(self) -> u32 {
293        self as u32
294    }
295
296    #[must_use]
297    pub const fn from_raw(raw: u32) -> Option<Self> {
298        match raw {
299            0 => Some(Self::Perspective),
300            1 => Some(Self::Orthographic),
301            _ => None,
302        }
303    }
304}
305
306#[derive(Debug, Clone, Copy, PartialEq, Eq)]
307#[repr(u32)]
308pub enum DataPrecision {
309    Undefined = 0,
310    Float = 1,
311    Double = 2,
312}
313
314impl DataPrecision {
315    #[must_use]
316    pub const fn from_raw(raw: u32) -> Option<Self> {
317        match raw {
318            0 => Some(Self::Undefined),
319            1 => Some(Self::Float),
320            2 => Some(Self::Double),
321            _ => None,
322        }
323    }
324}
325
326#[derive(Debug, Clone, Copy, PartialEq, Eq)]
327#[repr(u32)]
328pub enum AnimatedValueInterpolation {
329    Constant = 0,
330    Linear = 1,
331}
332
333impl AnimatedValueInterpolation {
334    #[must_use]
335    pub const fn as_raw(self) -> u32 {
336        self as u32
337    }
338
339    #[must_use]
340    pub const fn from_raw(raw: u32) -> Option<Self> {
341        match raw {
342            0 => Some(Self::Constant),
343            1 => Some(Self::Linear),
344            _ => None,
345        }
346    }
347}
348
349#[derive(Debug, Clone, Copy, PartialEq, Eq)]
350#[repr(u64)]
351pub enum TransformOpRotationOrder {
352    Xyz = 1,
353    Xzy = 2,
354    Yxz = 3,
355    Yzx = 4,
356    Zxy = 5,
357    Zyx = 6,
358}
359
360impl TransformOpRotationOrder {
361    #[must_use]
362    pub const fn as_raw(self) -> u64 {
363        self as u64
364    }
365
366    #[must_use]
367    pub const fn from_raw(raw: u64) -> Option<Self> {
368        match raw {
369            1 => Some(Self::Xyz),
370            2 => Some(Self::Xzy),
371            3 => Some(Self::Yxz),
372            4 => Some(Self::Yzx),
373            5 => Some(Self::Zxy),
374            6 => Some(Self::Zyx),
375            _ => None,
376        }
377    }
378}
379
380#[derive(Debug, Clone, Copy, PartialEq, Eq)]
381#[repr(i32)]
382pub enum ObjectKind {
383    Unknown = 0,
384    Object = 1,
385    Mesh = 2,
386    Light = 3,
387    PhysicallyPlausibleLight = 4,
388    Camera = 5,
389    VoxelArray = 6,
390    Skeleton = 7,
391    PackedJointAnimation = 8,
392}
393
394impl ObjectKind {
395    #[must_use]
396    pub const fn from_raw(raw: i32) -> Option<Self> {
397        match raw {
398            0 => Some(Self::Unknown),
399            1 => Some(Self::Object),
400            2 => Some(Self::Mesh),
401            3 => Some(Self::Light),
402            4 => Some(Self::PhysicallyPlausibleLight),
403            5 => Some(Self::Camera),
404            6 => Some(Self::VoxelArray),
405            7 => Some(Self::Skeleton),
406            8 => Some(Self::PackedJointAnimation),
407            _ => None,
408        }
409    }
410}
411
412#[derive(Debug, Clone, Copy, PartialEq, Eq)]
413#[repr(i32)]
414pub enum TextureChannelEncoding {
415    UInt8 = 1,
416    UInt16 = 2,
417    UInt24 = 3,
418    UInt32 = 4,
419    Float16 = 0x102,
420    Float16Sr = 0x302,
421    Float32 = 0x104,
422}
423
424impl TextureChannelEncoding {
425    #[must_use]
426    pub const fn as_raw(self) -> i32 {
427        self as i32
428    }
429
430    #[must_use]
431    pub const fn from_raw(raw: i32) -> Option<Self> {
432        match raw {
433            1 => Some(Self::UInt8),
434            2 => Some(Self::UInt16),
435            3 => Some(Self::UInt24),
436            4 => Some(Self::UInt32),
437            0x102 => Some(Self::Float16),
438            0x302 => Some(Self::Float16Sr),
439            0x104 => Some(Self::Float32),
440            _ => None,
441        }
442    }
443}
444
445#[derive(Debug, Clone, Deserialize)]
446pub struct MeshBufferInfo {
447    pub length: usize,
448    pub buffer_type: u32,
449}
450
451impl MeshBufferInfo {
452    #[must_use]
453    pub fn buffer_type_enum(&self) -> Option<MeshBufferType> {
454        MeshBufferType::from_raw(self.buffer_type)
455    }
456}
457
458#[derive(Debug, Clone, Deserialize)]
459pub struct VertexAttributeInfo {
460    pub stride: usize,
461    pub format: u32,
462    pub buffer_size: usize,
463}
464
465#[derive(Debug, Clone, Deserialize)]
466pub struct TextureInfo {
467    pub name: Option<String>,
468    pub dimensions: [i32; 2],
469    pub row_stride: isize,
470    pub channel_count: usize,
471    pub mip_level_count: usize,
472    pub channel_encoding: i32,
473    pub is_cube: bool,
474    pub has_alpha_values: bool,
475    pub url: Option<String>,
476}
477
478impl TextureInfo {
479    #[must_use]
480    pub fn channel_encoding_enum(&self) -> Option<TextureChannelEncoding> {
481        TextureChannelEncoding::from_raw(self.channel_encoding)
482    }
483}
484
485#[derive(Debug, Clone, Deserialize)]
486pub struct MaterialPropertyInfo {
487    pub name: String,
488    pub semantic: u32,
489    pub property_type: u32,
490    pub string_value: Option<String>,
491    pub url_value: Option<String>,
492    pub float_value: Option<f32>,
493    pub float2_value: Option<[f32; 2]>,
494    pub float3_value: Option<[f32; 3]>,
495    pub float4_value: Option<[f32; 4]>,
496    pub matrix4x4: Option<[f32; 16]>,
497    pub color: Option<[f32; 4]>,
498    pub luminance: Option<f32>,
499    pub texture: Option<TextureInfo>,
500}
501
502impl MaterialPropertyInfo {
503    #[must_use]
504    pub fn semantic_enum(&self) -> Option<MaterialSemantic> {
505        MaterialSemantic::from_raw(self.semantic)
506    }
507
508    #[must_use]
509    pub fn property_type_enum(&self) -> Option<MaterialPropertyType> {
510        MaterialPropertyType::from_raw(self.property_type)
511    }
512}
513
514#[derive(Debug, Clone, Deserialize)]
515pub struct MaterialInfo {
516    pub name: String,
517    pub count: usize,
518    pub material_face: u32,
519}
520
521impl MaterialInfo {
522    #[must_use]
523    pub fn material_face_enum(&self) -> Option<MaterialFace> {
524        MaterialFace::from_raw(self.material_face)
525    }
526}
527
528#[derive(Debug, Clone, Deserialize)]
529pub struct AssetInfo {
530    pub count: usize,
531    pub frame_interval: f64,
532    pub start_time: f64,
533    pub end_time: f64,
534    pub bounding_box: BoundingBox,
535    pub up_axis: [f32; 3],
536    pub url: Option<String>,
537}
538
539#[derive(Debug, Clone, Deserialize)]
540pub struct ObjectInfo {
541    pub kind: i32,
542    pub name: String,
543    pub path: String,
544    pub hidden: bool,
545    pub component_count: usize,
546    pub child_count: usize,
547    pub has_parent: bool,
548    pub has_instance: bool,
549    pub bounding_box: BoundingBox,
550}
551
552impl ObjectInfo {
553    #[must_use]
554    pub fn kind_enum(&self) -> Option<ObjectKind> {
555        ObjectKind::from_raw(self.kind)
556    }
557}
558
559#[derive(Debug, Clone, Deserialize)]
560pub struct LightInfo {
561    pub light_type: u32,
562    pub color_space: String,
563}
564
565impl LightInfo {
566    #[must_use]
567    pub fn light_type_enum(&self) -> Option<LightType> {
568        LightType::from_raw(self.light_type)
569    }
570}
571
572#[derive(Debug, Clone, Deserialize)]
573pub struct PhysicallyPlausibleLightInfo {
574    pub light_type: u32,
575    pub color_space: String,
576    pub color: Option<[f32; 4]>,
577    pub lumens: f32,
578    pub inner_cone_angle: f32,
579    pub outer_cone_angle: f32,
580    pub attenuation_start_distance: f32,
581    pub attenuation_end_distance: f32,
582}
583
584impl PhysicallyPlausibleLightInfo {
585    #[must_use]
586    pub fn light_type_enum(&self) -> Option<LightType> {
587        LightType::from_raw(self.light_type)
588    }
589}
590
591#[derive(Debug, Clone, Deserialize)]
592pub struct CameraInfo {
593    pub projection: u32,
594    pub projection_matrix: [f32; 16],
595    pub near_visibility_distance: f32,
596    pub far_visibility_distance: f32,
597    pub world_to_meters_conversion_scale: f32,
598    pub barrel_distortion: f32,
599    pub fisheye_distortion: f32,
600    pub optical_vignetting: f32,
601    pub chromatic_aberration: f32,
602    pub focal_length: f32,
603    pub focus_distance: f32,
604    pub field_of_view: f32,
605    pub f_stop: f32,
606    pub aperture_blade_count: usize,
607    pub maximum_circle_of_confusion: f32,
608    pub shutter_open_interval: f64,
609    pub sensor_vertical_aperture: f32,
610    pub sensor_aspect: f32,
611    pub sensor_enlargement: [f32; 2],
612    pub sensor_shift: [f32; 2],
613    pub flash: [f32; 3],
614    pub exposure_compression: [f32; 2],
615    pub exposure: [f32; 3],
616}
617
618impl CameraInfo {
619    #[must_use]
620    pub fn projection_enum(&self) -> Option<CameraProjection> {
621        CameraProjection::from_raw(self.projection)
622    }
623}
624
625#[derive(Debug, Clone, Deserialize)]
626pub struct VoxelIndexExtent {
627    pub minimum_extent: [i32; 4],
628    pub maximum_extent: [i32; 4],
629}
630
631#[derive(Debug, Clone, Deserialize)]
632pub struct VoxelArrayInfo {
633    pub count: usize,
634    pub bounding_box: BoundingBox,
635    pub voxel_index_extent: VoxelIndexExtent,
636    pub is_valid_signed_shell_field: bool,
637    pub shell_field_interior_thickness: f32,
638    pub shell_field_exterior_thickness: f32,
639}
640
641#[derive(Debug, Clone, Deserialize)]
642pub struct AnimatedValueInfo {
643    pub is_animated: bool,
644    pub precision: u32,
645    pub time_sample_count: usize,
646    pub minimum_time: f64,
647    pub maximum_time: f64,
648    pub interpolation: u32,
649    pub key_times: Vec<f64>,
650    pub element_count: Option<usize>,
651}
652
653impl AnimatedValueInfo {
654    #[must_use]
655    pub fn precision_enum(&self) -> Option<DataPrecision> {
656        DataPrecision::from_raw(self.precision)
657    }
658
659    #[must_use]
660    pub fn interpolation_enum(&self) -> Option<AnimatedValueInterpolation> {
661        AnimatedValueInterpolation::from_raw(self.interpolation)
662    }
663}
664
665#[derive(Debug, Clone, Deserialize)]
666pub struct PackedJointAnimationInfo {
667    pub name: String,
668    pub path: String,
669    pub joint_paths: Vec<String>,
670    pub joint_count: usize,
671}
672
673#[derive(Debug, Clone, Deserialize)]
674pub struct AnimationBindComponentInfo {
675    pub has_skeleton: bool,
676    pub has_joint_animation: bool,
677    pub joint_paths: Option<Vec<String>>,
678    pub geometry_bind_transform: [f32; 16],
679}
680
681#[derive(Debug, Clone, Deserialize)]
682pub struct SkeletonInfo {
683    pub name: String,
684    pub path: String,
685    pub joint_paths: Vec<String>,
686    pub joint_count: usize,
687    pub joint_bind_transform_count: usize,
688    pub joint_rest_transform_count: usize,
689}
690
691#[derive(Debug, Clone, Deserialize)]
692pub struct VertexAttributeDescriptorInfo {
693    pub name: String,
694    pub format: u32,
695    pub offset: usize,
696    pub buffer_index: usize,
697    pub time: f64,
698    pub initialization_value: [f32; 4],
699}
700
701#[derive(Debug, Clone, Deserialize)]
702pub struct VertexDescriptorInfo {
703    pub attribute_count: usize,
704    pub attributes: Vec<VertexAttributeDescriptorInfo>,
705    pub layout_strides: Vec<usize>,
706}
707
708pub mod vertex_format {
709    pub const INVALID: u32 = 0;
710    pub const PACKED_BIT: u32 = 0x1000;
711
712    pub const UCHAR_BITS: u32 = 0x10000;
713    pub const CHAR_BITS: u32 = 0x20000;
714    pub const UCHAR_NORMALIZED_BITS: u32 = 0x30000;
715    pub const CHAR_NORMALIZED_BITS: u32 = 0x40000;
716    pub const USHORT_BITS: u32 = 0x50000;
717    pub const SHORT_BITS: u32 = 0x60000;
718    pub const USHORT_NORMALIZED_BITS: u32 = 0x70000;
719    pub const SHORT_NORMALIZED_BITS: u32 = 0x80000;
720    pub const UINT_BITS: u32 = 0x90000;
721    pub const INT_BITS: u32 = 0xA0000;
722    pub const HALF_BITS: u32 = 0xB0000;
723    pub const FLOAT_BITS: u32 = 0xC0000;
724
725    pub const UCHAR: u32 = UCHAR_BITS | 1;
726    pub const UCHAR2: u32 = UCHAR_BITS | 2;
727    pub const UCHAR3: u32 = UCHAR_BITS | 3;
728    pub const UCHAR4: u32 = UCHAR_BITS | 4;
729
730    pub const CHAR: u32 = CHAR_BITS | 1;
731    pub const CHAR2: u32 = CHAR_BITS | 2;
732    pub const CHAR3: u32 = CHAR_BITS | 3;
733    pub const CHAR4: u32 = CHAR_BITS | 4;
734
735    pub const UCHAR_NORMALIZED: u32 = UCHAR_NORMALIZED_BITS | 1;
736    pub const UCHAR2_NORMALIZED: u32 = UCHAR_NORMALIZED_BITS | 2;
737    pub const UCHAR3_NORMALIZED: u32 = UCHAR_NORMALIZED_BITS | 3;
738    pub const UCHAR4_NORMALIZED: u32 = UCHAR_NORMALIZED_BITS | 4;
739
740    pub const CHAR_NORMALIZED: u32 = CHAR_NORMALIZED_BITS | 1;
741    pub const CHAR2_NORMALIZED: u32 = CHAR_NORMALIZED_BITS | 2;
742    pub const CHAR3_NORMALIZED: u32 = CHAR_NORMALIZED_BITS | 3;
743    pub const CHAR4_NORMALIZED: u32 = CHAR_NORMALIZED_BITS | 4;
744
745    pub const USHORT: u32 = USHORT_BITS | 1;
746    pub const USHORT2: u32 = USHORT_BITS | 2;
747    pub const USHORT3: u32 = USHORT_BITS | 3;
748    pub const USHORT4: u32 = USHORT_BITS | 4;
749
750    pub const SHORT: u32 = SHORT_BITS | 1;
751    pub const SHORT2: u32 = SHORT_BITS | 2;
752    pub const SHORT3: u32 = SHORT_BITS | 3;
753    pub const SHORT4: u32 = SHORT_BITS | 4;
754
755    pub const USHORT_NORMALIZED: u32 = USHORT_NORMALIZED_BITS | 1;
756    pub const USHORT2_NORMALIZED: u32 = USHORT_NORMALIZED_BITS | 2;
757    pub const USHORT3_NORMALIZED: u32 = USHORT_NORMALIZED_BITS | 3;
758    pub const USHORT4_NORMALIZED: u32 = USHORT_NORMALIZED_BITS | 4;
759
760    pub const SHORT_NORMALIZED: u32 = SHORT_NORMALIZED_BITS | 1;
761    pub const SHORT2_NORMALIZED: u32 = SHORT_NORMALIZED_BITS | 2;
762    pub const SHORT3_NORMALIZED: u32 = SHORT_NORMALIZED_BITS | 3;
763    pub const SHORT4_NORMALIZED: u32 = SHORT_NORMALIZED_BITS | 4;
764
765    pub const UINT: u32 = UINT_BITS | 1;
766    pub const UINT2: u32 = UINT_BITS | 2;
767    pub const UINT3: u32 = UINT_BITS | 3;
768    pub const UINT4: u32 = UINT_BITS | 4;
769
770    pub const INT: u32 = INT_BITS | 1;
771    pub const INT2: u32 = INT_BITS | 2;
772    pub const INT3: u32 = INT_BITS | 3;
773    pub const INT4: u32 = INT_BITS | 4;
774
775    pub const HALF: u32 = HALF_BITS | 1;
776    pub const HALF2: u32 = HALF_BITS | 2;
777    pub const HALF3: u32 = HALF_BITS | 3;
778    pub const HALF4: u32 = HALF_BITS | 4;
779
780    pub const FLOAT: u32 = FLOAT_BITS | 1;
781    pub const FLOAT2: u32 = FLOAT_BITS | 2;
782    pub const FLOAT3: u32 = FLOAT_BITS | 3;
783    pub const FLOAT4: u32 = FLOAT_BITS | 4;
784
785    pub const INT1010102_NORMALIZED: u32 = INT_BITS | PACKED_BIT | 4;
786    pub const UINT1010102_NORMALIZED: u32 = UINT_BITS | PACKED_BIT | 4;
787}