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}