use super::{CompareFunction, StencilOperation}; use serde::{Deserialize, Serialize}; /// State of the stencil operation (fixed-pipeline stage). #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] pub struct StencilFaceState { /// Comparison function that determines if the fail_op or pass_op is used on the stencil buffer. pub compare: CompareFunction, /// Operation that is preformed when stencil test fails. pub fail_op: StencilOperation, /// Operation that is performed when depth test fails but stencil test succeeds. pub depth_fail_op: StencilOperation, /// Operation that is performed when stencil test success. pub pass_op: StencilOperation, } impl StencilFaceState { /// Ignore the stencil state for the face. pub const IGNORE: Self = StencilFaceState { compare: CompareFunction::Always, fail_op: StencilOperation::Keep, depth_fail_op: StencilOperation::Keep, pass_op: StencilOperation::Keep, }; /// Returns true if the face state uses the reference value for testing or operation. pub fn NeedsReferenceValue(&self) -> bool { self.compare.NeedsReferenceValue() || self.fail_op == StencilOperation::Replace || self.depth_fail_op == StencilOperation::Replace || self.pass_op == StencilOperation::Replace } } impl Default for StencilFaceState { fn default() -> Self { Self::IGNORE } }