use concinnity_core::components::ShaderPrograms;
use concinnity_core::ecs::asset_id::AssetId;
use concinnity_core::render::volumetric_fog::FogSettings;
use std::collections::HashMap;
use std::sync::{Arc, Mutex, PoisonError};
#[derive(Debug, Default)]
pub struct TextureNameSlots(pub HashMap<AssetId, usize>);
#[derive(Debug, Default)]
pub struct PushedFogSettings(pub Option<FogSettings>);
#[derive(Debug, Clone, Default)]
pub struct ShaderOverrides(Arc<Mutex<HashMap<u32, Arc<ShaderPrograms>>>>);
impl ShaderOverrides {
pub fn set(&self, bucket: u32, programs: Arc<ShaderPrograms>) {
self.0
.lock()
.unwrap_or_else(PoisonError::into_inner)
.insert(bucket, programs);
}
pub fn get(&self, bucket: u32) -> Option<Arc<ShaderPrograms>> {
self.0
.lock()
.unwrap_or_else(PoisonError::into_inner)
.get(&bucket)
.cloned()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn programs(name: &str) -> Arc<ShaderPrograms> {
Arc::new(ShaderPrograms {
name: name.to_string(),
..Default::default()
})
}
#[test]
fn clones_share_one_set_and_a_newer_edit_replaces_an_older_one() {
let overrides = ShaderOverrides::default();
let reader = overrides.clone();
assert!(reader.get(1).is_none());
overrides.set(1, programs("first"));
overrides.set(2, programs("other"));
overrides.set(1, programs("second"));
assert_eq!(reader.get(1).unwrap().name, "second");
assert_eq!(reader.get(2).unwrap().name, "other");
}
#[test]
fn a_fresh_set_is_empty() {
let old = ShaderOverrides::default();
old.set(1, programs("edit"));
assert!(ShaderOverrides::default().get(1).is_none());
}
}