1use crate::validation::Validate;
2use crate::{camera, extensions, mesh, scene, skin, Extras, Index};
3use gltf_derive::Validate;
4use serde_derive::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
17pub struct Node {
18 #[serde(skip_serializing_if = "Option::is_none")]
20 pub camera: Option<Index<camera::Camera>>,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub children: Option<Vec<Index<scene::Node>>>,
25
26 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub extensions: Option<extensions::scene::Node>,
29
30 #[serde(default)]
32 #[cfg_attr(feature = "extras", serde(skip_serializing_if = "Option::is_none"))]
33 #[cfg_attr(not(feature = "extras"), serde(skip_serializing))]
34 pub extras: Extras,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
47 pub matrix: Option<[f32; 16]>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub mesh: Option<Index<mesh::Mesh>>,
52
53 #[cfg(feature = "names")]
55 #[cfg_attr(feature = "names", serde(skip_serializing_if = "Option::is_none"))]
56 pub name: Option<String>,
57
58 #[serde(skip_serializing_if = "Option::is_none")]
61 pub rotation: Option<UnitQuaternion>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub scale: Option<[f32; 3]>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub translation: Option<[f32; 3]>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub skin: Option<Index<skin::Skin>>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
78 pub weights: Option<Vec<f32>>,
79}
80
81#[derive(Clone, Debug, Deserialize, Serialize, Validate)]
83pub struct Scene {
84 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub extensions: Option<extensions::scene::Scene>,
87
88 #[serde(default)]
90 #[cfg_attr(feature = "extras", serde(skip_serializing_if = "Option::is_none"))]
91 #[cfg_attr(not(feature = "extras"), serde(skip_serializing))]
92 pub extras: Extras,
93
94 #[cfg(feature = "names")]
96 #[cfg_attr(feature = "names", serde(skip_serializing_if = "Option::is_none"))]
97 pub name: Option<String>,
98
99 #[serde(skip_serializing_if = "Vec::is_empty")]
101 pub nodes: Vec<Index<Node>>,
102}
103
104#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
106pub struct UnitQuaternion(pub [f32; 4]);
107
108impl Default for UnitQuaternion {
109 fn default() -> Self {
110 UnitQuaternion([0.0, 0.0, 0.0, 1.0])
111 }
112}
113
114impl Validate for UnitQuaternion {}