use super::graphics::StencilValue;
use super::State;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Comparison {
Never = 0,
Less = 1,
Equal = 2,
LessEqual = 3,
Greater = 4,
NotEqual = 5,
GreaterEqual = 6,
Always = 7,
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ColorMask: u8 {
const RED = 0x1;
const GREEN = 0x2;
const BLUE = 0x4;
const ALPHA = 0x8;
const COLOR = 0x7;
const ALL = 0xF;
const NONE = 0x0;
}
);
impl Default for ColorMask {
fn default() -> Self {
Self::ALL
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Factor {
Zero = 0,
One = 1,
SrcColor = 2,
OneMinusSrcColor = 3,
DstColor = 4,
OneMinusDstColor = 5,
SrcAlpha = 6,
OneMinusSrcAlpha = 7,
DstAlpha = 8,
OneMinusDstAlpha = 9,
ConstColor = 10,
OneMinusConstColor = 11,
ConstAlpha = 12,
OneMinusConstAlpha = 13,
SrcAlphaSaturate = 14,
Src1Color = 15,
OneMinusSrc1Color = 16,
Src1Alpha = 17,
OneMinusSrc1Alpha = 18,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum BlendOp {
Add { src: Factor, dst: Factor },
Sub { src: Factor, dst: Factor },
RevSub { src: Factor, dst: Factor },
Min,
Max,
}
impl BlendOp {
pub const REPLACE: Self = BlendOp::Add {
src: Factor::One,
dst: Factor::Zero,
};
pub const ADD: Self = BlendOp::Add {
src: Factor::One,
dst: Factor::One,
};
pub const ALPHA: Self = BlendOp::Add {
src: Factor::SrcAlpha,
dst: Factor::OneMinusSrcAlpha,
};
pub const PREMULTIPLIED_ALPHA: Self = BlendOp::Add {
src: Factor::One,
dst: Factor::OneMinusSrcAlpha,
};
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum BlendState {
On {
color: BlendOp,
alpha: BlendOp,
},
Off,
}
impl BlendState {
pub const ADD: Self = BlendState::On {
color: BlendOp::ADD,
alpha: BlendOp::ADD,
};
pub const MULTIPLY: Self = BlendState::On {
color: BlendOp::Add {
src: Factor::Zero,
dst: Factor::SrcColor,
},
alpha: BlendOp::Add {
src: Factor::Zero,
dst: Factor::SrcAlpha,
},
};
pub const ALPHA: Self = BlendState::On {
color: BlendOp::ALPHA,
alpha: BlendOp::PREMULTIPLIED_ALPHA,
};
pub const PREMULTIPLIED_ALPHA: Self = BlendState::On {
color: BlendOp::PREMULTIPLIED_ALPHA,
alpha: BlendOp::PREMULTIPLIED_ALPHA,
};
}
impl Default for BlendState {
fn default() -> Self {
BlendState::Off
}
}
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ColorBlendDesc(pub ColorMask, pub BlendState);
impl ColorBlendDesc {
pub const EMPTY: Self = ColorBlendDesc(ColorMask::ALL, BlendState::Off);
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum DepthTest {
On {
fun: Comparison,
write: bool,
},
Off,
}
impl Default for DepthTest {
fn default() -> Self {
DepthTest::Off
}
}
impl DepthTest {
pub const FAIL: Self = DepthTest::On {
fun: Comparison::Never,
write: false,
};
pub const PASS_TEST: Self = DepthTest::On {
fun: Comparison::Always,
write: false,
};
pub const PASS_WRITE: Self = DepthTest::On {
fun: Comparison::Always,
write: true,
};
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum StencilOp {
Keep = 0,
Zero = 1,
Replace = 2,
IncrementClamp = 3,
DecrementClamp = 4,
Invert = 5,
IncrementWrap = 6,
DecrementWrap = 7,
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct StencilFace {
pub fun: Comparison,
pub mask_read: State<StencilValue>,
pub mask_write: State<StencilValue>,
pub op_fail: StencilOp,
pub op_depth_fail: StencilOp,
pub op_pass: StencilOp,
pub reference: State<StencilValue>,
}
impl Default for StencilFace {
fn default() -> StencilFace {
StencilFace {
fun: Comparison::Never,
mask_read: State::Static(!0),
mask_write: State::Static(!0),
op_fail: StencilOp::Keep,
op_depth_fail: StencilOp::Keep,
op_pass: StencilOp::Keep,
reference: State::Static(0),
}
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum StencilTest {
On {
front: StencilFace,
back: StencilFace,
},
Off,
}
impl Default for StencilTest {
fn default() -> Self {
StencilTest::Off
}
}
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct DepthStencilDesc {
pub depth: DepthTest,
pub depth_bounds: bool,
pub stencil: StencilTest,
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Face: u32 {
const NONE = 0x0;
const FRONT = 0x1;
const BACK = 0x2;
}
);