use oxideav_mesh3d::{Mesh3DEncoder, Result, Scene3D};
use crate::{mtl, obj};
#[derive(Debug, Default)]
pub struct ObjEncoder {
mtl_basename: Option<String>,
negative_indices: bool,
}
impl ObjEncoder {
pub fn new() -> Self {
Self::default()
}
pub fn with_mtl_basename(mut self, basename: impl Into<String>) -> Self {
self.mtl_basename = Some(basename.into());
self
}
pub fn with_negative_indices(mut self, on: bool) -> Self {
self.negative_indices = on;
self
}
}
impl Mesh3DEncoder for ObjEncoder {
fn encode(&mut self, scene: &Scene3D) -> Result<Vec<u8>> {
obj::serialize_obj_with_options(
scene,
&obj::SerializeOptions {
mtl_basename: self.mtl_basename.as_deref(),
negative_indices: self.negative_indices,
},
)
}
}
#[derive(Debug, Default)]
pub struct MtlEncoder {
_private: (),
}
impl MtlEncoder {
pub fn new() -> Self {
Self::default()
}
}
impl Mesh3DEncoder for MtlEncoder {
fn encode(&mut self, scene: &Scene3D) -> Result<Vec<u8>> {
mtl::serialize_mtl(&scene.materials, &scene.textures)
}
}