Skip to main content

gltforge_unity_export/
export_context.rs

1use crate::{mesh_data::MeshData, node_data::NodeData, submesh_data::SubmeshData};
2
3/// Accumulates Unity-shaped scene data pushed by C# before the build step writes the glTF files.
4pub struct ExportContext {
5    pub nodes: Vec<NodeData>,
6    pub meshes: Vec<MeshData>,
7}
8
9impl Default for ExportContext {
10    fn default() -> Self {
11        Self::new()
12    }
13}
14
15impl ExportContext {
16    pub fn new() -> Self {
17        Self {
18            nodes: Vec::new(),
19            meshes: Vec::new(),
20        }
21    }
22
23    pub fn add_node(
24        &mut self,
25        name: Option<String>,
26        parent: Option<u32>,
27        translation: Option<[f32; 3]>,
28        rotation: Option<[f32; 4]>,
29        scale: Option<[f32; 3]>,
30    ) -> u32 {
31        let idx = self.nodes.len() as u32;
32        self.nodes.push(NodeData {
33            name,
34            parent,
35            mesh_index: None,
36            translation,
37            rotation,
38            scale,
39        });
40        idx
41    }
42
43    pub fn add_mesh(&mut self, name: Option<String>) -> u32 {
44        let idx = self.meshes.len() as u32;
45        self.meshes.push(MeshData {
46            name,
47            positions: Vec::new(),
48            normals: Vec::new(),
49            uvs: Vec::new(),
50            submeshes: Vec::new(),
51        });
52        idx
53    }
54
55    pub fn set_positions(&mut self, mesh_idx: u32, positions: Vec<[f32; 3]>) {
56        if let Some(mesh) = self.meshes.get_mut(mesh_idx as usize) {
57            mesh.positions = positions;
58        }
59    }
60
61    pub fn set_normals(&mut self, mesh_idx: u32, normals: Vec<[f32; 3]>) {
62        if let Some(mesh) = self.meshes.get_mut(mesh_idx as usize) {
63            mesh.normals = normals;
64        }
65    }
66
67    pub fn set_uvs(&mut self, mesh_idx: u32, channel: u32, uvs: Vec<[f32; 2]>) {
68        if let Some(mesh) = self.meshes.get_mut(mesh_idx as usize) {
69            let ch = channel as usize;
70            if mesh.uvs.len() <= ch {
71                mesh.uvs.resize(ch + 1, Vec::new());
72            }
73            mesh.uvs[ch] = uvs;
74        }
75    }
76
77    pub fn add_submesh(&mut self, mesh_idx: u32, indices: Vec<u32>) {
78        if let Some(mesh) = self.meshes.get_mut(mesh_idx as usize) {
79            mesh.submeshes.push(SubmeshData { indices });
80        }
81    }
82
83    pub fn set_node_mesh(&mut self, node_idx: u32, mesh_idx: u32) {
84        if let Some(node) = self.nodes.get_mut(node_idx as usize) {
85            node.mesh_index = Some(mesh_idx);
86        }
87    }
88}