use super::BooleanClippingProcessor;
use crate::csg::ClippingProcessor;
use crate::Mesh;
pub(super) enum SingleCutterSubtract {
Clipped(Mesh),
KeepUncut,
FallThrough,
}
impl BooleanClippingProcessor {
pub(super) fn resolve_single_cutter_subtract(
&self,
mesh: &Mesh,
bound_mesh: &Mesh,
solo_step: bool,
) -> SingleCutterSubtract {
let clipper = ClippingProcessor::new();
let mark = clipper.failure_count();
let checked = Self::subtract_checked(&clipper, mesh, bound_mesh);
let gate_rejected = checked.is_none() && clipper.has_accept_gate_rejection_since(mark);
self.absorb_failures(clipper.take_failures());
if let Some(clipped) = checked {
return SingleCutterSubtract::Clipped(clipped);
}
if gate_rejected && !solo_step {
return SingleCutterSubtract::KeepUncut;
}
SingleCutterSubtract::FallThrough
}
}