1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::HashMap;
use resource::Material;
use builtin::{ObjectMaterial, NormalsMaterial, UvsMaterial};
thread_local!(static KEY_MATERIAL_MANAGER: RefCell<MaterialManager> = RefCell::new(MaterialManager::new()));
pub struct MaterialManager {
default_material: Rc<RefCell<Box<Material + 'static>>>,
materials: HashMap<String, Rc<RefCell<Box<Material + 'static>>>>
}
impl MaterialManager {
pub fn new() -> MaterialManager {
let mut materials = HashMap::new();
let om = Rc::new(RefCell::new(Box::new(ObjectMaterial::new()) as Box<Material + 'static>));
let _ = materials.insert("object".to_string(), om.clone());
let nm = Rc::new(RefCell::new(Box::new(NormalsMaterial::new()) as Box<Material + 'static>));
let _ = materials.insert("normals".to_string(), nm.clone());
let um = Rc::new(RefCell::new(Box::new(UvsMaterial::new()) as Box<Material + 'static>));
let _ = materials.insert("uvs".to_string(), um.clone());
MaterialManager {
default_material: om,
materials: materials
}
}
pub fn get_global_manager<T, F: FnMut(&mut MaterialManager) -> T>(mut f: F) -> T {
KEY_MATERIAL_MANAGER.with(|manager| f(&mut *manager.borrow_mut()))
}
pub fn get_default(&self) -> Rc<RefCell<Box<Material + 'static>>> {
self.default_material.clone()
}
pub fn get(&mut self, name: &str) -> Option<Rc<RefCell<Box<Material + 'static>>>> {
self.materials.get(&name.to_string()).map(|t| t.clone())
}
pub fn add(&mut self, material: Rc<RefCell<Box<Material + 'static>>>, name: &str) {
let _ = self.materials.insert(name.to_string(), material);
}
pub fn remove(&mut self, name: &str) {
let _ = self.materials.remove(&name.to_string());
}
}