minigltf/gltf_json/
texture.rs

1pub const NEAREST: u32 = 9728;
2pub const LINEAR: u32 = 9729;
3pub const NEAREST_MIPMAP_NEAREST: u32 = 9984;
4pub const LINEAR_MIPMAP_NEAREST: u32 = 9985;
5pub const NEAREST_MIPMAP_LINEAR: u32 = 9986;
6pub const LINEAR_MIPMAP_LINEAR: u32 = 9987;
7
8pub const VALID_MIN_FILTERS: &[u32] = &[
9    NEAREST,
10    LINEAR,
11    NEAREST_MIPMAP_NEAREST,
12    LINEAR_MIPMAP_NEAREST,
13    NEAREST_MIPMAP_LINEAR,
14    LINEAR_MIPMAP_LINEAR,
15];
16
17pub const VALID_MAG_FILTERS: &[u32] = &[NEAREST, LINEAR];
18
19#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
20pub enum MinFilter {
21    Nearest,
22    Linear,
23    NearestMipmapNearest,
24    LinearMipmapNearest,
25    NearestMipmapLinear,
26    LinearMipmapLinear,
27}
28
29impl<'de> serde::de::Deserialize<'de> for MinFilter {
30    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31    where
32        D: serde::de::Deserializer<'de>,
33    {
34        struct Visitor;
35        impl<'de> serde::de::Visitor<'de> for Visitor {
36            type Value = MinFilter;
37
38            fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
39                write!(f, "any of: {:?}", VALID_MIN_FILTERS)
40            }
41
42            fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
43            where
44                E: serde::de::Error,
45            {
46                use MinFilter::*;
47                match value as u32 {
48                    NEAREST => Ok(Nearest),
49                    LINEAR => Ok(Linear),
50                    NEAREST_MIPMAP_NEAREST => Ok(NearestMipmapNearest),
51                    LINEAR_MIPMAP_NEAREST => Ok(LinearMipmapNearest),
52                    NEAREST_MIPMAP_LINEAR => Ok(NearestMipmapLinear),
53                    LINEAR_MIPMAP_LINEAR => Ok(LinearMipmapLinear),
54
55                    _ => Err(serde::de::Error::custom("A valid MinFilter")),
56                }
57            }
58        }
59
60        deserializer.deserialize_u64(Visitor)
61    }
62}
63
64#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
65pub enum MagFilter {
66    Nearest,
67    Linear,
68}
69
70impl<'de> serde::de::Deserialize<'de> for MagFilter {
71    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
72    where
73        D: serde::de::Deserializer<'de>,
74    {
75        struct Visitor;
76        impl<'de> serde::de::Visitor<'de> for Visitor {
77            type Value = MagFilter;
78
79            fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
80                write!(f, "any of: {:?}", VALID_MAG_FILTERS)
81            }
82
83            fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
84            where
85                E: serde::de::Error,
86            {
87                use MagFilter::*;
88                match value as u32 {
89                    NEAREST => Ok(Nearest),
90                    LINEAR => Ok(Linear),
91
92                    _ => Err(serde::de::Error::custom("A valid MagFilter")),
93                }
94            }
95        }
96
97        deserializer.deserialize_u64(Visitor)
98    }
99}
100
101pub const CLAMP_TO_EDGE: u32 = 33_071;
102pub const MIRRORED_REPEAT: u32 = 33_648;
103pub const REPEAT: u32 = 10_497;
104
105pub const VALID_WRAPPING_MODES: &[u32] = &[CLAMP_TO_EDGE, MIRRORED_REPEAT, REPEAT];
106
107#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
108pub enum WrappingMode {
109    ClampToEdge,
110    MirroredRepeat,
111    Repeat,
112}
113
114impl<'de> serde::de::Deserialize<'de> for WrappingMode {
115    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
116    where
117        D: serde::de::Deserializer<'de>,
118    {
119        struct Visitor;
120        impl<'de> serde::de::Visitor<'de> for Visitor {
121            type Value = WrappingMode;
122
123            fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
124                write!(f, "any of: {:?}", VALID_MAG_FILTERS)
125            }
126
127            fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
128            where
129                E: serde::de::Error,
130            {
131                use WrappingMode::*;
132                match value as u32 {
133                    CLAMP_TO_EDGE => Ok(ClampToEdge),
134                    MIRRORED_REPEAT => Ok(MirroredRepeat),
135                    REPEAT => Ok(Repeat),
136
137                    _ => Err(serde::de::Error::custom("A valid WrappingMode")),
138                }
139            }
140        }
141
142        deserializer.deserialize_u64(Visitor)
143    }
144}
145
146impl Default for WrappingMode {
147    #[inline]
148    fn default() -> Self {
149        Self::Repeat
150    }
151}
152
153#[derive(Clone, Debug, Default, serde::Deserialize)]
154#[serde(default)]
155pub struct Sampler {
156    #[serde(rename = "magFilter")]
157    pub mag_filter: Option<MagFilter>,
158    #[serde(rename = "minFilter")]
159    pub min_filter: Option<MinFilter>,
160    pub name: Option<String>,
161    #[serde(default)]
162    #[serde(rename = "wrapS")]
163    pub wrap_s: WrappingMode,
164    #[serde(default)]
165    #[serde(rename = "wrapT")]
166    pub wrap_t: WrappingMode,
167    #[serde(default)]
168    pub extensions: Option<extensions::SamplerExtensions>,
169}
170
171#[derive(Clone, Debug, serde::Deserialize)]
172pub struct Texture {
173    pub name: Option<String>,
174    pub sampler: Option<usize>,
175    pub source: Option<usize>,
176    #[serde(default)]
177    pub extensions: Option<extensions::TextureExtensions>,
178}
179
180#[derive(Clone, Debug, serde::Deserialize)]
181pub struct Info {
182    pub index: usize,
183
184    #[serde(default)]
185    #[serde(rename = "texCoord")]
186    pub tex_coord: usize,
187
188    #[serde(default)]
189    pub extensions: Option<extensions::InfoExtensions>,
190}
191
192pub mod extensions {
193    #[derive(Default, Clone, Debug, serde::Deserialize)]
194    pub struct InfoExtensions {}
195
196    #[derive(Default, Clone, Debug, serde::Deserialize)]
197    pub struct TextureExtensions {}
198
199    #[derive(Default, Clone, Debug, serde::Deserialize)]
200    pub struct SamplerExtensions {}
201}