gltf_json/extensions/
root.rs

1use gltf_derive::Validate;
2use serde_derive::{Deserialize, Serialize};
3#[cfg(feature = "extensions")]
4use serde_json::{Map, Value};
5
6/// The root object of a glTF 2.0 asset.
7#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
8pub struct Root {
9    #[cfg(feature = "KHR_lights_punctual")]
10    #[serde(
11        default,
12        rename = "KHR_lights_punctual",
13        skip_serializing_if = "Option::is_none"
14    )]
15    pub khr_lights_punctual: Option<KhrLightsPunctual>,
16
17    #[cfg(feature = "KHR_materials_variants")]
18    #[serde(
19        default,
20        rename = "KHR_materials_variants",
21        skip_serializing_if = "Option::is_none"
22    )]
23    pub khr_materials_variants: Option<KhrMaterialsVariants>,
24
25    #[cfg(feature = "extensions")]
26    #[serde(default, flatten)]
27    pub others: Map<String, Value>,
28}
29
30#[cfg(feature = "KHR_lights_punctual")]
31#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
32pub struct KhrLightsPunctual {
33    /// Lights at this node.
34    pub lights: Vec<crate::extensions::scene::khr_lights_punctual::Light>,
35}
36
37#[cfg(feature = "KHR_lights_punctual")]
38impl crate::root::Get<crate::extensions::scene::khr_lights_punctual::Light> for crate::Root {
39    fn get(
40        &self,
41        id: crate::Index<crate::extensions::scene::khr_lights_punctual::Light>,
42    ) -> Option<&crate::extensions::scene::khr_lights_punctual::Light> {
43        if let Some(extensions) = self.extensions.as_ref() {
44            if let Some(khr_lights_punctual) = extensions.khr_lights_punctual.as_ref() {
45                khr_lights_punctual.lights.get(id.value())
46            } else {
47                None
48            }
49        } else {
50            None
51        }
52    }
53}
54
55#[cfg(feature = "KHR_lights_punctual")]
56impl AsRef<[crate::extensions::scene::khr_lights_punctual::Light]> for crate::Root {
57    fn as_ref(&self) -> &[crate::extensions::scene::khr_lights_punctual::Light] {
58        self.extensions
59            .as_ref()
60            .and_then(|extensions| extensions.khr_lights_punctual.as_ref())
61            .map(|khr_lights_punctual| khr_lights_punctual.lights.as_slice())
62            .unwrap_or(&[])
63    }
64}
65#[cfg(feature = "KHR_lights_punctual")]
66impl AsMut<Vec<crate::extensions::scene::khr_lights_punctual::Light>> for crate::Root {
67    fn as_mut(&mut self) -> &mut Vec<crate::extensions::scene::khr_lights_punctual::Light> {
68        &mut self
69            .extensions
70            .get_or_insert_with(Default::default)
71            .khr_lights_punctual
72            .get_or_insert_with(Default::default)
73            .lights
74    }
75}
76
77#[cfg(feature = "KHR_materials_variants")]
78#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
79pub struct KhrMaterialsVariants {
80    pub variants: Vec<crate::extensions::scene::khr_materials_variants::Variant>,
81}
82
83#[cfg(feature = "KHR_materials_variants")]
84impl crate::root::Get<crate::extensions::scene::khr_materials_variants::Variant> for crate::Root {
85    fn get(
86        &self,
87        id: crate::Index<crate::extensions::scene::khr_materials_variants::Variant>,
88    ) -> Option<&crate::extensions::scene::khr_materials_variants::Variant> {
89        self.extensions
90            .as_ref()?
91            .khr_materials_variants
92            .as_ref()?
93            .variants
94            .get(id.value())
95    }
96}
97
98#[cfg(feature = "KHR_materials_variants")]
99impl AsRef<[crate::extensions::scene::khr_materials_variants::Variant]> for crate::Root {
100    fn as_ref(&self) -> &[crate::extensions::scene::khr_materials_variants::Variant] {
101        self.extensions
102            .as_ref()
103            .and_then(|extensions| extensions.khr_materials_variants.as_ref())
104            .map(|khr_materials_variants| khr_materials_variants.variants.as_slice())
105            .unwrap_or(&[])
106    }
107}
108#[cfg(feature = "KHR_materials_variants")]
109impl AsMut<Vec<crate::extensions::scene::khr_materials_variants::Variant>> for crate::Root {
110    fn as_mut(&mut self) -> &mut Vec<crate::extensions::scene::khr_materials_variants::Variant> {
111        &mut self
112            .extensions
113            .get_or_insert_with(Default::default)
114            .khr_materials_variants
115            .get_or_insert_with(Default::default)
116            .variants
117    }
118}