#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum CornerRule {
#[default]
OpenSubdivDeRose,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CreaseComputationMethod {
#[default]
Uniform,
Chaikin,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TriangleSubdivisionRule {
#[default]
CatmullClark,
SmoothTriangles,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BoundaryInterpolation {
Natural,
#[default]
EdgesOnly,
EdgesAndCorners,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FaceVaryingInterpolation {
Linear,
SmoothWithLinearCorners,
#[default]
SmoothWithLinearBoundaries,
Smooth,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Scheme {
CatmullClark,
Loop,
Sqrt3,
DooSabin,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SchemeOptions {
pub corner_rule: CornerRule,
pub crease_computation: CreaseComputationMethod,
pub boundary_interpolation: BoundaryInterpolation,
pub triangle_subdivision_rule: TriangleSubdivisionRule,
pub auto_corner: bool,
pub crease_normalize: bool,
pub corner_normalize: bool,
}
impl Default for SchemeOptions {
fn default() -> Self {
Self {
corner_rule: CornerRule::default(),
crease_computation: CreaseComputationMethod::default(),
boundary_interpolation: BoundaryInterpolation::default(),
triangle_subdivision_rule: TriangleSubdivisionRule::default(),
auto_corner: false,
crease_normalize: false,
corner_normalize: false,
}
}
}
use core::num::NonZeroU8;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UniformRefine {
pub levels: NonZeroU8,
pub selected_faces: Option<Vec<bool>>,
pub selection_boundary_crease: f32,
pub edge_polylines: bool,
}
impl Default for UniformRefine {
fn default() -> Self {
Self {
levels: NonZeroU8::new(1).unwrap(),
selected_faces: None,
selection_boundary_crease: 0.0,
edge_polylines: false,
}
}
}
impl From<NonZeroU8> for UniformRefine {
fn from(levels: NonZeroU8) -> Self {
Self {
levels,
..Self::default()
}
}
}