use askama::Template;
use crate::{
render_passes::geometry::shader::{
cache_key::ShaderCacheKeyGeometry,
custom_vertex_cache_key::ShaderCacheKeyGeometryCustomVertex,
template::{ShaderTemplateGeometryFragment, ShaderTemplateGeometryVertex},
},
shaders::{AwsmShaderError, Result},
};
#[derive(Template, Debug)]
#[template(path = "custom_vertex_wgsl/bind_groups.wgsl", whitespace = "minimize")]
pub struct ShaderTemplateGeometryCustomVertexBindGroups {
texture_pool_arrays_len: u32,
texture_pool_samplers_len: u32,
}
#[derive(Debug)]
pub struct ShaderTemplateGeometryCustomVertex {
pub bind_groups: ShaderTemplateGeometryCustomVertexBindGroups,
pub vertex: ShaderTemplateGeometryVertex,
pub fragment: ShaderTemplateGeometryFragment,
}
impl TryFrom<&ShaderCacheKeyGeometryCustomVertex> for ShaderTemplateGeometryCustomVertex {
type Error = AwsmShaderError;
fn try_from(value: &ShaderCacheKeyGeometryCustomVertex) -> Result<Self> {
let vertex_key = ShaderCacheKeyGeometry {
instancing_transforms: value.instancing_transforms,
meta_storage_array: value.meta_storage_array,
msaa_samples: value.msaa_samples,
dynamic_vertex_shader: Some(value.dynamic_vertex.clone()),
};
let fragment_key = ShaderCacheKeyGeometry {
instancing_transforms: value.instancing_transforms,
meta_storage_array: value.meta_storage_array,
msaa_samples: value.msaa_samples,
dynamic_vertex_shader: None,
};
Ok(Self {
bind_groups: ShaderTemplateGeometryCustomVertexBindGroups {
texture_pool_arrays_len: value.texture_pool_arrays_len,
texture_pool_samplers_len: value.texture_pool_samplers_len,
},
vertex: ShaderTemplateGeometryVertex::new(&vertex_key),
fragment: ShaderTemplateGeometryFragment::new(&fragment_key),
})
}
}
impl ShaderTemplateGeometryCustomVertex {
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 Custom Vertex")
}
}