1use crate::{image, Document};
2
3pub use json::texture::{MagFilter, MinFilter, WrappingMode};
4#[cfg(feature = "extensions")]
5use serde_json::{Map, Value};
6
7lazy_static! {
8 static ref DEFAULT_SAMPLER: json::texture::Sampler = Default::default();
9}
10
11#[derive(Clone, Debug)]
13pub struct Info<'a> {
14 texture: Texture<'a>,
16
17 json: &'a json::texture::Info,
19}
20
21#[derive(Clone, Debug)]
23pub struct Sampler<'a> {
24 #[allow(dead_code)]
26 document: &'a Document,
27
28 index: Option<usize>,
30
31 json: &'a json::texture::Sampler,
33}
34
35#[derive(Clone, Debug)]
37pub struct Texture<'a> {
38 document: &'a Document,
40
41 index: usize,
43
44 json: &'a json::texture::Texture,
46}
47
48impl<'a> Sampler<'a> {
49 pub(crate) fn new(
51 document: &'a Document,
52 index: usize,
53 json: &'a json::texture::Sampler,
54 ) -> Self {
55 Self {
56 document,
57 index: Some(index),
58 json,
59 }
60 }
61
62 pub(crate) fn default(document: &'a Document) -> Self {
64 Self {
65 document,
66 index: None,
67 json: &DEFAULT_SAMPLER,
68 }
69 }
70
71 pub fn index(&self) -> Option<usize> {
75 self.index
76 }
77
78 pub fn mag_filter(&self) -> Option<MagFilter> {
80 self.json.mag_filter.map(|filter| filter.unwrap())
81 }
82
83 pub fn min_filter(&self) -> Option<MinFilter> {
85 self.json.min_filter.map(|filter| filter.unwrap())
86 }
87
88 #[cfg(feature = "names")]
90 pub fn name(&self) -> Option<&str> {
91 self.json.name.as_deref()
92 }
93
94 pub fn wrap_s(&self) -> WrappingMode {
96 self.json.wrap_s.unwrap()
97 }
98
99 pub fn wrap_t(&self) -> WrappingMode {
101 self.json.wrap_t.unwrap()
102 }
103
104 #[cfg(feature = "extensions")]
106 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
107 pub fn extensions(&self) -> Option<&Map<String, Value>> {
108 let ext = self.json.extensions.as_ref()?;
109 Some(&ext.others)
110 }
111
112 #[cfg(feature = "extensions")]
114 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
115 pub fn extension_value(&self, ext_name: &str) -> Option<&Value> {
116 let ext = self.json.extensions.as_ref()?;
117 ext.others.get(ext_name)
118 }
119
120 pub fn extras(&self) -> &json::Extras {
122 &self.json.extras
123 }
124}
125
126impl<'a> Texture<'a> {
127 pub(crate) fn new(
129 document: &'a Document,
130 index: usize,
131 json: &'a json::texture::Texture,
132 ) -> Self {
133 Self {
134 document,
135 index,
136 json,
137 }
138 }
139
140 pub fn index(&self) -> usize {
142 self.index
143 }
144
145 #[cfg(feature = "names")]
147 pub fn name(&self) -> Option<&str> {
148 self.json.name.as_deref()
149 }
150
151 pub fn sampler(&self) -> Sampler<'a> {
153 self.json
154 .sampler
155 .as_ref()
156 .map(|index| self.document.samplers().nth(index.value()).unwrap())
157 .unwrap_or_else(|| Sampler::default(self.document))
158 }
159
160 #[cfg(feature = "allow_empty_texture")]
162 pub fn source(&self) -> Option<image::Image<'a>> {
163 let index = self.json.source.value();
164 if index == u32::MAX as usize {
165 None
166 } else {
167 Some(self.document.images().nth(index).unwrap())
168 }
169 }
170
171 #[cfg(not(feature = "allow_empty_texture"))]
173 pub fn source(&self) -> image::Image<'a> {
174 self.document
175 .images()
176 .nth(self.json.source.value())
177 .unwrap()
178 }
179
180 #[cfg(feature = "extensions")]
182 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
183 pub fn extensions(&self) -> Option<&Map<String, Value>> {
184 let ext = self.json.extensions.as_ref()?;
185 Some(&ext.others)
186 }
187
188 #[cfg(feature = "extensions")]
190 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
191 pub fn extension_value(&self, ext_name: &str) -> Option<&Value> {
192 let ext = self.json.extensions.as_ref()?;
193 ext.others.get(ext_name)
194 }
195
196 pub fn extras(&self) -> &json::Extras {
198 &self.json.extras
199 }
200}
201
202impl<'a> Info<'a> {
203 pub(crate) fn new(texture: Texture<'a>, json: &'a json::texture::Info) -> Self {
205 Self { texture, json }
206 }
207
208 pub fn tex_coord(&self) -> u32 {
210 self.json.tex_coord
211 }
212
213 pub fn texture(&self) -> Texture<'a> {
215 self.texture.clone()
216 }
217
218 #[cfg(feature = "KHR_texture_transform")]
220 #[cfg_attr(docsrs, doc(cfg(feature = "KHR_texture_transform")))]
221 pub fn texture_transform(&self) -> Option<TextureTransform<'a>> {
222 self.json
223 .extensions
224 .as_ref()?
225 .texture_transform
226 .as_ref()
227 .map(TextureTransform::new)
228 }
229
230 #[cfg(feature = "extensions")]
232 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
233 pub fn extensions(&self) -> Option<&Map<String, Value>> {
234 let ext = self.json.extensions.as_ref()?;
235 Some(&ext.others)
236 }
237
238 #[cfg(feature = "extensions")]
240 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
241 pub fn extension_value(&self, ext_name: &str) -> Option<&Value> {
242 let ext = self.json.extensions.as_ref()?;
243 ext.others.get(ext_name)
244 }
245
246 pub fn extras(&self) -> &json::Extras {
248 &self.json.extras
249 }
250}
251
252impl<'a> AsRef<Texture<'a>> for Info<'a> {
253 fn as_ref(&self) -> &Texture<'a> {
254 &self.texture
255 }
256}
257
258#[cfg(feature = "KHR_texture_transform")]
267pub struct TextureTransform<'a> {
268 json: &'a json::extensions::texture::TextureTransform,
270}
271
272#[cfg(feature = "KHR_texture_transform")]
273impl<'a> TextureTransform<'a> {
274 pub(crate) fn new(json: &'a json::extensions::texture::TextureTransform) -> Self {
276 Self { json }
277 }
278
279 pub fn offset(&self) -> [f32; 2] {
281 self.json.offset.0
282 }
283
284 pub fn rotation(&self) -> f32 {
287 self.json.rotation.0
288 }
289
290 pub fn scale(&self) -> [f32; 2] {
292 self.json.scale.0
293 }
294
295 pub fn tex_coord(&self) -> Option<u32> {
297 self.json.tex_coord
298 }
299
300 pub fn extras(&self) -> &json::Extras {
302 &self.json.extras
303 }
304}