Skip to main content

voxj_codec/
encode_voxj_file.rs

1use crate::{
2    PositionEncoding, Result, SampleEncoding, encode_voxj_object, voxj_palette_cell_counts,
3};
4use voxj::{VoxjCodecFile, VoxjSerdeFile, VoxjSerdeMain};
5
6/// Encodes a [`VoxjCodecFile`] (decoded geometry) into a [`VoxjSerdeFile`]
7/// (encoded `.voxj` blocks) with fixed position and sample encodings, ready to
8/// serialize with [`to_voxj_file_bytes`](crate::to_voxj_file_bytes). Each
9/// object's palette cell counts come from the palettes it references; the
10/// palettes, hierarchy, roots, and `ext` carry over unchanged. Errors if an
11/// object references a palette outside the document's `palettes`.
12pub fn encode_voxj_file(
13    file: &VoxjCodecFile,
14    position: PositionEncoding,
15    sample: SampleEncoding,
16) -> Result<VoxjSerdeFile> {
17    let palettes = &file.main.palettes;
18    let objects = file
19        .main
20        .objects
21        .iter()
22        .map(|object| {
23            let cell_counts = voxj_palette_cell_counts(&object.palette_refs, palettes)?;
24            encode_voxj_object(object, &cell_counts, position, sample)
25        })
26        .collect::<Result<Vec<_>>>()?;
27    Ok(VoxjSerdeFile {
28        version: file.version,
29        main: VoxjSerdeMain {
30            objects,
31            palettes: palettes.clone(),
32            hierarchy_nodes: file.main.hierarchy_nodes.clone(),
33            root_hierarchy_nodes: file.main.root_hierarchy_nodes.clone(),
34            ext: file.main.ext.clone(),
35        },
36    })
37}