use crate::{macros::vulkan_enum, pipeline::StateMode};
#[derive(Clone, Debug)]
pub struct RasterizationState {
pub depth_clamp_enable: bool,
pub rasterizer_discard_enable: StateMode<bool>,
pub polygon_mode: PolygonMode,
pub cull_mode: StateMode<CullMode>,
pub front_face: StateMode<FrontFace>,
pub depth_bias: Option<DepthBiasState>,
pub line_width: StateMode<f32>,
pub line_rasterization_mode: LineRasterizationMode,
pub line_stipple: Option<StateMode<LineStipple>>,
}
impl RasterizationState {
#[inline]
pub fn new() -> Self {
Self {
depth_clamp_enable: false,
rasterizer_discard_enable: StateMode::Fixed(false),
polygon_mode: Default::default(),
cull_mode: StateMode::Fixed(Default::default()),
front_face: StateMode::Fixed(Default::default()),
depth_bias: None,
line_width: StateMode::Fixed(1.0),
line_rasterization_mode: Default::default(),
line_stipple: None,
}
}
#[inline]
pub fn polygon_mode(mut self, polygon_mode: PolygonMode) -> Self {
self.polygon_mode = polygon_mode;
self
}
#[inline]
pub fn cull_mode(mut self, cull_mode: CullMode) -> Self {
self.cull_mode = StateMode::Fixed(cull_mode);
self
}
#[inline]
pub fn cull_mode_dynamic(mut self) -> Self {
self.cull_mode = StateMode::Dynamic;
self
}
#[inline]
pub fn front_face(mut self, front_face: FrontFace) -> Self {
self.front_face = StateMode::Fixed(front_face);
self
}
#[inline]
pub fn front_face_dynamic(mut self) -> Self {
self.front_face = StateMode::Dynamic;
self
}
}
impl Default for RasterizationState {
#[inline]
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug)]
pub struct DepthBiasState {
pub enable_dynamic: bool,
pub bias: StateMode<DepthBias>,
}
#[derive(Clone, Copy, Debug)]
pub struct DepthBias {
pub constant_factor: f32,
pub clamp: f32,
pub slope_factor: f32,
}
vulkan_enum! {
#[non_exhaustive]
CullMode = CullModeFlags(u32);
None = NONE,
Front = FRONT,
Back = BACK,
FrontAndBack = FRONT_AND_BACK,
}
impl Default for CullMode {
#[inline]
fn default() -> CullMode {
CullMode::None
}
}
vulkan_enum! {
#[non_exhaustive]
FrontFace = FrontFace(i32);
CounterClockwise = COUNTER_CLOCKWISE,
Clockwise = CLOCKWISE,
}
impl Default for FrontFace {
#[inline]
fn default() -> FrontFace {
FrontFace::CounterClockwise
}
}
vulkan_enum! {
#[non_exhaustive]
PolygonMode = PolygonMode(i32);
Fill = FILL,
Line = LINE,
Point = POINT,
}
impl Default for PolygonMode {
#[inline]
fn default() -> PolygonMode {
PolygonMode::Fill
}
}
vulkan_enum! {
#[non_exhaustive]
LineRasterizationMode = LineRasterizationModeEXT(i32);
Default = DEFAULT,
Rectangular = RECTANGULAR,
Bresenham = BRESENHAM,
RectangularSmooth = RECTANGULAR_SMOOTH,
}
impl Default for LineRasterizationMode {
#[inline]
fn default() -> Self {
Self::Default
}
}
#[derive(Clone, Copy, Debug)]
pub struct LineStipple {
pub factor: u32,
pub pattern: u16,
}