pub(crate) mod attribute;
pub(crate) mod connectivity;
pub(crate) mod entropy;
pub(crate) mod header;
pub(crate) mod metadata;
use crate::core::bit_coder::ByteWriter;
use crate::core::mesh::Mesh;
use crate::core::shared::ConfigType;
use crate::{debug_write, shared};
use thiserror::Error;
#[cfg(feature = "evaluation")]
use crate::eval;
pub trait EncoderConfig {
type Encoder;
fn get_encoder(&self) -> Self::Encoder;
}
#[derive(Debug, Clone)]
pub struct Config {
#[allow(unused)]
connectivity_encoder_cfg: connectivity::Config,
#[allow(unused)]
attribute_encoder_cfg: attribute::Config,
geometry_type: header::EncodedGeometryType,
encoder_method: shared::header::EncoderMethod,
metdata: bool,
}
impl ConfigType for Config {
fn default() -> Self {
Self {
connectivity_encoder_cfg: connectivity::Config::default(),
attribute_encoder_cfg: attribute::Config::default(),
geometry_type: header::EncodedGeometryType::TrianglarMesh,
encoder_method: shared::header::EncoderMethod::Edgebreaker,
metdata: false,
}
}
}
#[remain::sorted]
#[derive(Error, Debug)]
pub enum Err {
#[error("Attribute encoding error: {0}")]
AttributeError(#[from] attribute::Err),
#[error("Connectivity encoding error: {0}")]
ConnectivityError(#[from] connectivity::Err),
#[error("Header encoding error: {0}")]
HeaderError(#[from] header::Err),
#[error("Metadata encoding error: {0}")]
MetadataError(#[from] metadata::Err),
}
pub fn encode<W>(mesh: Mesh, writer: &mut W, cfg: Config) -> Result<(), Err>
where
W: ByteWriter,
{
#[cfg(feature = "evaluation")]
eval::scope_begin("compression info", writer);
header::encode_header(writer, &cfg)?;
debug_write!("Header done, now starting metadata.", writer);
if cfg.metdata {
#[cfg(feature = "evaluation")]
eval::scope_begin("metadata", writer);
metadata::encode_metadata(&mesh, writer)?;
#[cfg(feature = "evaluation")]
eval::scope_end(writer);
}
debug_write!("Metadata done, now starting connectivity.", writer);
let Mesh {
mut attributes,
faces,
..
} = mesh;
let conn_out = connectivity::encode_connectivity(&faces, &mut attributes, writer, &cfg)?;
debug_write!("Connectivity done, now starting attributes.", writer);
attribute::encode_attributes(attributes, writer, conn_out, &cfg)?;
debug_write!("All done", writer);
#[cfg(feature = "evaluation")]
eval::scope_end(writer);
Ok(())
}