use std::hash::BuildHasher;
use bevy::{
asset::{Assets, Handle},
ecs::{change_detection::ResMut, resource::Resource},
log::{debug, trace},
platform::collections::HashMap,
shader::Shader,
};
#[derive(Default, Resource)]
pub struct ShaderCache {
cache: HashMap<String, Handle<Shader>>,
}
impl ShaderCache {
pub fn get_or_insert(
&mut self,
filename: &str,
suffix: &str,
source: &str,
shaders: &mut ResMut<Assets<Shader>>,
) -> Handle<Shader> {
if let Some(handle) = self.cache.get(source) {
handle.clone()
} else {
let hash = bevy::platform::hash::FixedHasher.hash_one(source);
let shader = Shader::from_wgsl(
source.to_string(),
format!("hanabi/{}_{}_{}.wgsl", filename, suffix, hash),
);
trace!(
"Shader path={} import_path={:?} imports={:?}",
shader.path,
shader.import_path,
shader.imports
);
let shader_path = shader.path.clone();
let handle = shaders.add(shader);
debug!(
"Inserted new configured shader {}: {:?}\n{}",
shader_path, handle, source
);
self.cache.insert(source.to_string(), handle.clone());
handle
}
}
}