use askama::Template;
use crate::{
dynamic_materials::ShadingBase,
render_passes::geometry::shader::{
cache_key::ShaderCacheKeyGeometry,
masked_custom_vertex_cache_key::ShaderCacheKeyGeometryMaskedCustomVertex,
masked_template::{
ShaderTemplateGeometryMaskedBindGroups, ShaderTemplateGeometryMaskedFragment,
},
template::ShaderTemplateGeometryVertex,
},
shaders::{AwsmShaderError, Result},
};
#[derive(Debug)]
pub struct ShaderTemplateGeometryMaskedCustomVertex {
pub bind_groups: ShaderTemplateGeometryMaskedBindGroups,
pub vertex: ShaderTemplateGeometryVertex,
pub fragment: ShaderTemplateGeometryMaskedFragment,
}
impl TryFrom<&ShaderCacheKeyGeometryMaskedCustomVertex>
for ShaderTemplateGeometryMaskedCustomVertex
{
type Error = AwsmShaderError;
fn try_from(value: &ShaderCacheKeyGeometryMaskedCustomVertex) -> Result<Self> {
let vertex_key = ShaderCacheKeyGeometry {
instancing_transforms: false,
meta_storage_array: false,
msaa_samples: value.msaa_samples,
dynamic_vertex_shader: Some(value.dynamic_vertex.clone()),
};
let (struct_decl, loader_decl, texture_helpers, alpha_wgsl) = match &value.dynamic_alpha {
Some(info) => (
String::new(),
String::new(),
info.texture_helpers.clone(),
info.alpha_wgsl.clone(),
),
None => (String::new(), String::new(), String::new(), String::new()),
};
Ok(Self {
bind_groups: ShaderTemplateGeometryMaskedBindGroups::new(
value.texture_pool_arrays_len,
value.texture_pool_samplers_len,
),
vertex: ShaderTemplateGeometryVertex::new(&vertex_key),
fragment: ShaderTemplateGeometryMaskedFragment::new(
value.texture_pool_arrays_len,
value.texture_pool_samplers_len,
value.msaa_samples.unwrap_or(0),
value.base,
struct_decl,
loader_decl,
texture_helpers,
alpha_wgsl,
if value.base == ShadingBase::Flipbook {
awsm_renderer_materials::flipbook::FLIPBOOK_CELL_WGSL.to_string()
} else {
String::new()
},
),
})
}
}
impl ShaderTemplateGeometryMaskedCustomVertex {
pub fn into_source(self) -> Result<String> {
let bind_groups_source = self.bind_groups.render()?;
let vertex_source = self.vertex.render()?;
let fragment_source = self.fragment.render()?;
Ok(format!(
"{}\n{}\n{}",
bind_groups_source, vertex_source, fragment_source
))
}
pub fn debug_label(&self) -> Option<&str> {
Some("Geometry Masked Custom Vertex")
}
}