1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
//! Face culling is the operation of removing triangles if they’re facing the screen in a specific
//! direction with a specific mode.
/// Face culling setup.
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct FaceCulling {
/// Face culling order.
pub order: FaceCullingOrder,
/// Face culling mode.
pub mode: FaceCullingMode,
}
impl FaceCulling {
/// Create a new [`FaceCulling`].
pub fn new(order: FaceCullingOrder, mode: FaceCullingMode) -> Self {
FaceCulling { order, mode }
}
}
/// Default implementation of [`FaceCulling`].
///
/// - Order is [`FaceCullingOrder::CCW`].
/// - Mode is [`FaceCullingMode::Back`].
impl Default for FaceCulling {
fn default() -> Self {
FaceCulling::new(FaceCullingOrder::CCW, FaceCullingMode::Back)
}
}
/// Face culling order.
///
/// The order determines how a triangle is determined to be discarded. If the triangle’s vertices
/// wind up in the same direction as the `FaceCullingOrder`, it’s assigned the front side,
/// otherwise, it’s the back side.
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum FaceCullingOrder {
/// Clockwise order.
CW,
/// Counter-clockwise order.
CCW,
}
/// Side to show and side to cull.
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum FaceCullingMode {
/// Cull the front side only.
Front,
/// Cull the back side only.
Back,
/// Always cull any triangle.
Both,
}