encode_decode/
encode_decode.rs1use draco_rs::prelude::*;
2use std::io;
3
4use draco_rs::pointcloud::{PointCloud, PointCloudBuilder};
5
6fn gen_points() -> Vec<[f64; 3]> {
7 vec![
10 [0.0, 0.1, 0.2],
11 [0.1, 0.2, 0.3],
12 [0.2, 0.3, 0.4],
13 [0.3, 0.4, 0.5],
14 [0.4, 0.5, 0.6],
15 [0.5, 0.6, 0.7],
16 [0.6, 0.7, 0.8],
17 [0.7, 0.8, 0.9],
18 [0.8, 0.9, 1.0],
19 [0.9, 1.0, 1.1],
20 ]
21}
22
23fn print_pc(pc: &mut PointCloud, attr_id: AttrId) {
24 let mut container: [f64; 3] = [0.0; 3];
25 for i in 0..pc.len() {
26 pc.get_point(attr_id, i, &mut container);
27 println!("Point {}: {:?}", i, container);
28 }
29}
30
31fn main() -> io::Result<()> {
32 let points = gen_points();
33
34 let mut builder = PointCloudBuilder::new(points.len() as u32);
36
37 let attr_id = builder.add_attribute(
38 ffi::draco::GeometryAttribute_Type::POSITION,
39 3,
40 ffi::draco::DataType::DT_FLOAT64,
41 );
42
43 for (i, point) in points.iter().enumerate() {
44 builder.add_point(attr_id, i, point);
45 }
46 let mut pc = builder.build(false);
47
48 println!("after building");
49 print_pc(&mut pc, attr_id);
50
51 let mut encoder = Encoder::new()
53 .set_speed_options(5, 5)
54 .set_attribute_quantization(ffi::draco::GeometryAttribute_Type::POSITION, 14);
55
56 if let Ok(mut buffer) = pc.to_buffer(&mut encoder) {
57 let mut buf = DecoderBuffer::from_encoder_buffer(&mut buffer);
59 let pc_decoded = PointCloud::from_buffer(&mut Decoder::new(), &mut buf);
60
61 if let Ok(mut pc_decoded) = pc_decoded {
62 println!("after decoding");
63 print_pc(&mut pc_decoded, attr_id);
64 } else {
65 println!("Failed to decode point cloud");
66 }
67 }
68 Ok(())
69}