use crate::builtin::{NormalsMaterial, ObjectMaterial, UvsMaterial};
use crate::resource::Material3d;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
pub struct MaterialManager3d {
default_material: Rc<RefCell<Box<dyn Material3d + 'static>>>,
materials: HashMap<String, Rc<RefCell<Box<dyn Material3d + 'static>>>>,
}
impl Default for MaterialManager3d {
fn default() -> Self {
Self::new()
}
}
impl MaterialManager3d {
pub fn new() -> MaterialManager3d {
let mut materials = HashMap::new();
let om = Rc::new(RefCell::new(
Box::new(ObjectMaterial::new()) as Box<dyn Material3d + 'static>
));
let _ = materials.insert("object".to_string(), om.clone());
let nm = Rc::new(RefCell::new(
Box::new(NormalsMaterial::new()) as Box<dyn Material3d + 'static>
));
let _ = materials.insert("normals".to_string(), nm.clone());
let um = Rc::new(RefCell::new(
Box::new(UvsMaterial::new()) as Box<dyn Material3d + 'static>
));
let _ = materials.insert("uvs".to_string(), um.clone());
MaterialManager3d {
default_material: om,
materials,
}
}
pub fn get_global_manager<T, F: FnMut(&mut MaterialManager3d) -> T>(mut f: F) -> T {
crate::window::WINDOW_CACHE
.with(|manager| f(&mut *manager.borrow_mut().material_manager.as_mut().unwrap()))
}
pub fn get_default(&self) -> Rc<RefCell<Box<dyn Material3d + 'static>>> {
self.default_material.clone()
}
pub fn get(&mut self, name: &str) -> Option<Rc<RefCell<Box<dyn Material3d + 'static>>>> {
self.materials.get(name).cloned()
}
pub fn add(&mut self, material: Rc<RefCell<Box<dyn Material3d + 'static>>>, name: &str) {
let _ = self.materials.insert(name.to_string(), material);
}
pub fn remove(&mut self, name: &str) {
let _ = self.materials.remove(name);
}
pub fn begin_frame(&mut self) {
for material in self.materials.values() {
material.borrow_mut().begin_frame();
}
}
pub fn flush(&mut self) {
for material in self.materials.values() {
material.borrow_mut().flush();
}
}
}