1use gltf_v1_derive::Validate;
2use serde_derive::{Deserialize, Serialize};
3
4use crate::extensions;
5
6use super::{camera::Camera, common::StringIndex, mesh::Mesh, skin::Skin};
7
8#[derive(Clone, Debug, Deserialize, Serialize, Validate, Default)]
9pub struct Node {
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub camera: Option<StringIndex<Camera>>,
12 #[serde(default)]
13 #[serde(skip_serializing_if = "Vec::is_empty")]
14 pub children: Vec<StringIndex<Node>>,
15 #[serde(default)]
16 #[serde(skip_serializing_if = "Vec::is_empty")]
17 pub skeletons: Vec<StringIndex<Node>>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub skin: Option<StringIndex<Skin>>,
20 #[serde(rename = "jointName", skip_serializing_if = "Option::is_none")]
21 pub joint_name: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub matrix: Option<[f32; 16]>,
24 #[serde(default)]
25 #[serde(skip_serializing_if = "Vec::is_empty")]
26 pub meshes: Vec<StringIndex<Mesh>>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub rotation: Option<[f32; 4]>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub scale: Option<[f32; 3]>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub translation: Option<[f32; 3]>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub name: Option<String>,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 pub extensions: Option<extensions::node::Node>,
37}
38
39#[test]
40fn test_node_deserialize() {
41 let data = r#"{
42 "children": [],
43 "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ],
44 "meshes": [
45 "mesh_id"
46 ],
47 "name": "user-defined name of meshes node",
48 "extensions" : {
49 "extension_name" : {
50 "extension specific" : "value"
51 }
52 },
53 "extras" : {
54 "Application specific" : "The extra object can contain any properties."
55 }
56 }"#;
57 let node: Result<Node, _> = serde_json::from_str(data);
58 let node_unwrap = node.unwrap();
59 println!("{}", serde_json::to_string(&node_unwrap).unwrap());
60 assert_eq!(
61 Some("user-defined name of meshes node".to_string()),
62 node_unwrap.name
63 );
64}