use awsm_materials::{MaterialAlphaMode, MaterialShaderId};
use awsm_renderer_core::pipeline::primitive::CullMode;
use slotmap::new_key_type;
use crate::{
anti_alias::AntiAliasing, dynamic_materials::MaterialRegistration, error::AwsmError,
render_passes::material_opaque::shader::template::MipmapMode,
};
new_key_type! {
pub struct MaterialId;
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum PipelineGroupId {
Material(MaterialId),
Pass(PassKind),
}
#[derive(Debug)]
pub enum PipelineGroupStatus {
Pending,
Ready,
Failed {
error: AwsmError,
},
}
impl PipelineGroupStatus {
pub fn is_ready(&self) -> bool {
matches!(self, Self::Ready)
}
pub fn is_pending(&self) -> bool {
matches!(self, Self::Pending)
}
pub fn is_failed(&self) -> bool {
matches!(self, Self::Failed { .. })
}
}
pub enum PipelineGroupDef {
Material(MaterialDef),
Pass(PassDef),
}
pub struct MaterialDef {
pub shader_id: MaterialShaderId,
pub alpha_mode: MaterialAlphaMode,
pub double_sided: bool,
pub kind: MaterialDefKind,
pub config_snapshot: PipelineConfigSnapshot,
}
pub enum MaterialDefKind {
FirstParty,
Dynamic(Box<MaterialRegistration>),
}
#[derive(Clone, Debug)]
pub enum PassDef {
ClassifyMsaa {
samples: u8,
snapshot: PipelineConfigSnapshot,
},
GeometryMsaa {
samples: u8,
snapshot: PipelineConfigSnapshot,
},
Display,
ScenePassClear,
HzbSeed {
samples: u8,
},
Evsm,
Line {
snapshot: PipelineConfigSnapshot,
},
ShadowGen,
Picker {
snapshot: PipelineConfigSnapshot,
},
Bloom {
resolution: (u32, u32),
},
Smaa {
resolution: (u32, u32),
},
Dof,
EdgeResolveBlend {
snapshot: PipelineConfigSnapshot,
},
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum PassKind {
ClassifyMsaa {
samples: u8,
},
GeometryMsaa {
samples: u8,
},
Display,
ScenePassClear,
HzbSeed {
samples: u8,
},
Evsm,
Line,
ShadowGen,
Picker,
Bloom,
Smaa,
Dof,
EdgeResolveBlend,
MaterialEdgeResolve,
}
impl PassDef {
pub fn kind(&self) -> PassKind {
match self {
Self::ClassifyMsaa { samples, .. } => PassKind::ClassifyMsaa { samples: *samples },
Self::GeometryMsaa { samples, .. } => PassKind::GeometryMsaa { samples: *samples },
Self::Display => PassKind::Display,
Self::ScenePassClear => PassKind::ScenePassClear,
Self::HzbSeed { samples } => PassKind::HzbSeed { samples: *samples },
Self::Evsm => PassKind::Evsm,
Self::Line { .. } => PassKind::Line,
Self::ShadowGen => PassKind::ShadowGen,
Self::Picker { .. } => PassKind::Picker,
Self::Bloom { .. } => PassKind::Bloom,
Self::Smaa { .. } => PassKind::Smaa,
Self::Dof => PassKind::Dof,
Self::EdgeResolveBlend { .. } => PassKind::EdgeResolveBlend,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PipelineConfigSnapshot {
pub msaa: AntiAliasing,
pub mipmap: MipmapMode,
pub gpu_culling: bool,
pub coverage_lod: bool,
pub debug_bitmask: u32,
pub default_cull_mode: CullMode,
}
impl Default for PipelineConfigSnapshot {
fn default() -> Self {
Self {
msaa: AntiAliasing::default(),
mipmap: MipmapMode::Gradient,
gpu_culling: false,
coverage_lod: false,
debug_bitmask: 0,
default_cull_mode: CullMode::Back,
}
}
}