1use crate::RenderTier;
8use std::collections::HashMap;
9use std::sync::{Arc, Mutex, OnceLock};
10
11#[derive(Debug, Clone)]
13pub struct Material {
14 pub name: String,
15 pub min_tier: RenderTier,
17 pub shader_id: String,
19 pub params: HashMap<String, f32>,
21}
22
23pub struct MaterialRegistry {
25 materials: HashMap<String, Material>,
26}
27
28static REGISTRY: OnceLock<Arc<Mutex<MaterialRegistry>>> = OnceLock::new();
29
30impl Default for MaterialRegistry {
31 fn default() -> Self {
32 Self::new()
33 }
34}
35
36impl MaterialRegistry {
37 pub fn new() -> Self {
38 let mut registry = Self {
39 materials: HashMap::new(),
40 };
41 registry.register_defaults();
42 registry
43 }
44
45 pub fn global() -> Arc<Mutex<Self>> {
47 REGISTRY
48 .get_or_init(|| Arc::new(Mutex::new(Self::new())))
49 .clone()
50 }
51
52 fn register_defaults(&mut self) {
53 self.register(Material {
54 name: "bifrost_standard".to_string(),
55 min_tier: RenderTier::Tier1GPU,
56 shader_id: "bifrost".to_string(),
57 params: [("blur".to_string(), 20.0)].into(),
58 });
59 self.register(Material {
60 name: "gungnir_neon".to_string(),
61 min_tier: RenderTier::Tier2GPU,
62 shader_id: "gungnir".to_string(),
63 params: [("glow".to_string(), 10.0)].into(),
64 });
65 }
66
67 pub fn register(&mut self, material: Material) {
68 self.materials.insert(material.name.clone(), material);
69 }
70
71 pub fn get(&self, name: &str) -> Option<&Material> {
72 self.materials.get(name)
73 }
74
75 pub fn register_draw_material_default(&mut self, name: &str, _draw_material: DrawMaterial) {
79 let _ = name;
82 }
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Default)]
87pub enum DrawMaterial {
88 #[default]
90 Opaque,
91 Glass { blur_radius: f32 },
93 TopUI,
95}