gltforge_unity/
unity_node.rs1use crate::{unity_gltf::UnityGltf, unity_node_transform::UnityNodeTransform, write_name};
2
3pub struct UnityNode {
6 pub name: String,
8
9 pub children: Vec<u32>,
11
12 pub mesh_indices: Vec<u32>,
16
17 pub transform: UnityNodeTransform,
19}
20
21#[unsafe(no_mangle)]
26pub unsafe extern "C" fn gltforge_node_count(ptr: *const UnityGltf) -> u32 {
27 unsafe { &*ptr }.nodes.len() as u32
28}
29
30#[unsafe(no_mangle)]
35pub unsafe extern "C" fn gltforge_node_name(
36 ptr: *const UnityGltf,
37 node_idx: u32,
38 out_len: *mut u32,
39) -> *const u8 {
40 let gltf = unsafe { &*ptr };
41 let name = gltf.nodes.get(&node_idx).map(|n| &n.name);
42 unsafe { write_name(name, out_len) }
43}
44
45#[unsafe(no_mangle)]
50pub unsafe extern "C" fn gltforge_node_child_count(ptr: *const UnityGltf, node_idx: u32) -> u32 {
51 unsafe { &*ptr }
52 .nodes
53 .get(&node_idx)
54 .map(|n| n.children.len() as u32)
55 .unwrap_or(0)
56}
57
58#[unsafe(no_mangle)]
64pub unsafe extern "C" fn gltforge_node_child(
65 ptr: *const UnityGltf,
66 node_idx: u32,
67 slot: u32,
68) -> u32 {
69 unsafe { &*ptr }
70 .nodes
71 .get(&node_idx)
72 .and_then(|n| n.children.get(slot as usize))
73 .copied()
74 .unwrap_or(u32::MAX)
75}
76
77#[unsafe(no_mangle)]
82pub unsafe extern "C" fn gltforge_node_mesh_count(ptr: *const UnityGltf, node_idx: u32) -> u32 {
83 unsafe { &*ptr }
84 .nodes
85 .get(&node_idx)
86 .map(|n| n.mesh_indices.len() as u32)
87 .unwrap_or(0)
88}
89
90#[unsafe(no_mangle)]
96pub unsafe extern "C" fn gltforge_node_mesh_index(
97 ptr: *const UnityGltf,
98 node_idx: u32,
99 slot: u32,
100) -> u32 {
101 unsafe { &*ptr }
102 .nodes
103 .get(&node_idx)
104 .and_then(|n| n.mesh_indices.get(slot as usize))
105 .copied()
106 .unwrap_or(u32::MAX)
107}
108
109#[unsafe(no_mangle)]
118pub unsafe extern "C" fn gltforge_node_transform(
119 ptr: *const UnityGltf,
120 node_idx: u32,
121 out: *mut f32,
122) {
123 use crate::unity_node_transform::IDENTITY;
124 let gltf = unsafe { &*ptr };
125 let t = gltf
126 .nodes
127 .get(&node_idx)
128 .map(|n| &n.transform)
129 .unwrap_or(&IDENTITY);
130 let out = unsafe { std::slice::from_raw_parts_mut(out, 10) };
131 out[0] = t.position[0];
132 out[1] = t.position[1];
133 out[2] = t.position[2];
134 out[3] = t.rotation[0];
135 out[4] = t.rotation[1];
136 out[5] = t.rotation[2];
137 out[6] = t.rotation[3];
138 out[7] = t.scale[0];
139 out[8] = t.scale[1];
140 out[9] = t.scale[2];
141}