gltf_v1_json/
node.rs

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}