Skip to main content

draco_core/
keyframe_animation_encoder.rs

1//! Encoder for [`KeyframeAnimation`].
2//!
3//! Mirrors C++ Draco's `KeyframeAnimationEncoder`, a thin wrapper around the
4//! sequential point-cloud encoder so animation encoding stays separate from
5//! general geometry compression.
6
7use crate::encoder_buffer::EncoderBuffer;
8use crate::encoder_options::EncoderOptions;
9use crate::keyframe_animation::KeyframeAnimation;
10use crate::point_cloud_encoder::PointCloudEncoder;
11use crate::status::Status;
12
13/// Encodes [`KeyframeAnimation`] data into a Draco bitstream.
14#[derive(Debug, Default)]
15pub struct KeyframeAnimationEncoder;
16
17impl KeyframeAnimationEncoder {
18    /// Creates a new keyframe animation encoder.
19    pub fn new() -> Self {
20        Self
21    }
22
23    /// Encodes `animation` into `out_buffer` using the sequential point-cloud
24    /// path. Mirrors C++ `KeyframeAnimationEncoder::EncodeKeyframeAnimation`.
25    pub fn encode_keyframe_animation(
26        &mut self,
27        animation: &KeyframeAnimation,
28        options: &EncoderOptions,
29        out_buffer: &mut EncoderBuffer,
30    ) -> Status {
31        // Force the sequential encoding method (C++ wraps
32        // PointCloudSequentialEncoder directly).
33        let mut options = options.clone();
34        options.set_encoding_method(0);
35
36        let mut encoder = PointCloudEncoder::new();
37        encoder.set_point_cloud(animation.point_cloud().clone());
38        encoder.encode(&options, out_buffer)
39    }
40}