Skip to main content

gltf_json/extensions/
buffer.rs

1#[cfg(feature = "EXT_meshopt_compression")]
2use crate::validation::USize64;
3use gltf_derive::Validate;
4use serde_derive::{Deserialize, Serialize};
5#[cfg(feature = "extensions")]
6use serde_json::{Map, Value};
7
8/// A buffer points to binary data representing geometry, animations, or skins.
9#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
10pub struct Buffer {
11    #[cfg(feature = "EXT_meshopt_compression")]
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub fallback: Option<bool>,
14
15    #[cfg(feature = "extensions")]
16    #[serde(default, flatten)]
17    pub others: Map<String, Value>,
18}
19
20#[cfg(feature = "EXT_meshopt_compression")]
21#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
22#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
23pub enum MeshoptCompressionMode {
24    Attributes,
25    Triangles,
26    Indices,
27}
28
29#[cfg(feature = "EXT_meshopt_compression")]
30impl crate::validation::Validate for MeshoptCompressionMode {
31    fn validate<P, R>(&self, _root: &crate::Root, _path: P, _report: &mut R)
32    where
33        P: Fn() -> crate::Path,
34        R: FnMut(&dyn Fn() -> crate::Path, crate::validation::Error),
35    {
36        // No validation needed for enum variants
37    }
38}
39
40#[cfg(feature = "EXT_meshopt_compression")]
41#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
42#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
43pub enum MeshoptCompressionFilter {
44    None,
45    Octahedral,
46    Quaternion,
47    Exponential,
48}
49
50#[cfg(feature = "EXT_meshopt_compression")]
51impl crate::validation::Validate for MeshoptCompressionFilter {
52    fn validate<P, R>(&self, _root: &crate::Root, _path: P, _report: &mut R)
53    where
54        P: Fn() -> crate::Path,
55        R: FnMut(&dyn Fn() -> crate::Path, crate::validation::Error),
56    {
57        // No validation needed for enum variants
58    }
59}
60
61#[cfg(feature = "EXT_meshopt_compression")]
62#[derive(Clone, Debug, Deserialize, Serialize, Validate)]
63#[serde(rename_all = "camelCase")]
64pub struct MeshoptCompression {
65    pub buffer: crate::Index<crate::buffer::Buffer>,
66    #[serde(default, skip_serializing_if = "Option::is_none")]
67    pub byte_offset: Option<USize64>,
68    pub byte_length: USize64,
69    pub byte_stride: u32,
70    pub count: u32,
71    pub mode: MeshoptCompressionMode,
72    #[serde(default)]
73    pub filter: Option<MeshoptCompressionFilter>,
74}
75
76/// A view into a buffer generally representing a subset of the buffer.
77#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
78pub struct View {
79    #[cfg(feature = "EXT_meshopt_compression")]
80    #[serde(
81        rename = "EXT_meshopt_compression",
82        skip_serializing_if = "Option::is_none"
83    )]
84    pub meshopt_compression: Option<MeshoptCompression>,
85
86    #[cfg(feature = "extensions")]
87    #[serde(default, flatten)]
88    pub others: Map<String, Value>,
89}