building-blocks 0.7.1

Data types, collections, and algorithms for working with maps on 2D and 3D integer lattices. Commonly known as voxel data.
Documentation
use building_blocks::storage::{
    dot_vox::load, prelude::*, BytesCompression, FastArrayCompressionNx1, VoxColor,
};

fn main() {
    let args: Vec<_> = std::env::args().collect();
    let vox_path = &args[1];

    println!("Loading {}", vox_path);

    let vox_data = load(vox_path).unwrap();
    let vox_array = Array3x1::decode_vox(&vox_data, 0);

    println!("Compressing with Snappy: \n");
    measure_compression_rate(Snappy, &vox_array);

    println!("Compressing with LZ4: \n");
    measure_compression_rate(Lz4 { level: 10 }, &vox_array);
}

fn measure_compression_rate<B: BytesCompression>(
    bytes_compression: B,
    vox_array: &Array3x1<VoxColor>,
) {
    let source_size_bytes = vox_array.extent().num_points() * std::mem::size_of::<VoxColor>();

    let compression = FastArrayCompressionNx1::from_bytes_compression(bytes_compression);
    let compressed_array = compression.compress(vox_array);

    let compressed_size_bytes = compressed_array
        .compressed_data
        .compressed_channels()
        .compressed_bytes()
        .len();

    println!(
        "source = {} bytes, compressed = {} bytes; rate = {:.1}%\n",
        source_size_bytes,
        compressed_size_bytes,
        100.0 * (compressed_size_bytes as f32 / source_size_bytes as f32)
    );
}