Skip to main content

voxj_codec/
encode_voxj_file_smallest.rs

1use crate::{Result, encode_voxj_object_smallest, voxj_palette_cell_counts};
2use voxj::{VoxjCodecFile, VoxjSerdeFile, VoxjSerdeMain};
3
4/// Encodes a [`VoxjCodecFile`] (decoded geometry) into a [`VoxjSerdeFile`]
5/// (encoded `.voxj` blocks), choosing each object's block encodings by the
6/// smallest-deflated search
7/// ([`encode_voxj_object_smallest`](crate::encode_voxj_object_smallest)). The
8/// canonical shipping form. Each object's palette cell counts come from the
9/// palettes it references; the palettes, hierarchy, roots, and `ext` carry over
10/// unchanged. Errors if an object references a palette outside the document's
11/// `palettes`.
12pub fn encode_voxj_file_smallest(file: &VoxjCodecFile) -> Result<VoxjSerdeFile> {
13    let palettes = &file.main.palettes;
14    let objects = file
15        .main
16        .objects
17        .iter()
18        .map(|object| {
19            let cell_counts = voxj_palette_cell_counts(&object.palette_refs, palettes)?;
20            encode_voxj_object_smallest(object, &cell_counts)
21        })
22        .collect::<Result<Vec<_>>>()?;
23    Ok(VoxjSerdeFile {
24        version: file.version,
25        main: VoxjSerdeMain {
26            objects,
27            palettes: palettes.clone(),
28            hierarchy_nodes: file.main.hierarchy_nodes.clone(),
29            root_hierarchy_nodes: file.main.root_hierarchy_nodes.clone(),
30            ext: file.main.ext.clone(),
31        },
32    })
33}