Skip to main content

ursus_core/render/
world.rs

1use std::any::{Any, TypeId};
2use std::collections::HashMap;
3
4use crate::assets::mesh::Aabb;
5use glam::{Mat4, Vec3};
6use ursus_ecs::components::mesh::MeshHandle;
7use ursus_materials::MaterialHandle;
8
9pub struct RWorld {
10    resources: HashMap<TypeId, Box<dyn Any + Send>>,
11}
12
13impl RWorld {
14    pub fn new() -> Self {
15        Self { resources: HashMap::new() }
16    }
17
18    pub fn insert<T: Send + 'static>(&mut self, val: T) {
19        self.resources.insert(TypeId::of::<T>(), Box::new(val));
20    }
21
22    pub fn get<T: Send + 'static>(&self) -> Option<&T> {
23        self.resources.get(&TypeId::of::<T>()).and_then(|b| b.downcast_ref::<T>())
24    }
25
26    pub fn get_mut<T: Send + 'static>(&mut self) -> Option<&mut T> {
27        self.resources.get_mut(&TypeId::of::<T>()).and_then(|b| b.downcast_mut::<T>())
28    }
29
30    pub fn clear(&mut self) {
31        self.resources.clear();
32    }
33}
34
35impl Default for RWorld {
36    fn default() -> Self {
37        Self::new()
38    }
39}
40
41#[derive(Clone)]
42pub struct ExtractedInstance {
43    pub mesh: MeshHandle,
44    pub material: Option<MaterialHandle>,
45    pub technique: Option<String>,
46    pub model: Mat4,
47    pub aabb: Option<Aabb>,
48}
49
50#[derive(Default, Clone)]
51pub struct ExtractedMeshes {
52    pub instances: Vec<ExtractedInstance>,
53}
54
55#[derive(Clone)]
56pub struct ExtractedCamera {
57    pub eye: Vec3,
58    pub view: Mat4,
59    pub proj: Mat4,
60    pub view_proj: Mat4,
61}
62
63impl Default for ExtractedCamera {
64    fn default() -> Self {
65        Self { eye: Vec3::ZERO, view: Mat4::IDENTITY, proj: Mat4::IDENTITY, view_proj: Mat4::IDENTITY }
66    }
67}
68
69#[derive(Clone)]
70pub struct ExtractedRenderSettings {
71    pub clear_color: [f32; 4],
72    pub output_size: (f32, f32),
73    pub exposure: f32,
74    pub fsr_sharpness: f32,
75    pub interpolation_alpha: f32,
76}
77
78impl Default for ExtractedRenderSettings {
79    fn default() -> Self {
80        Self {
81            clear_color: [0.0, 0.0, 0.0, 1.0],
82            output_size: (1280.0, 720.0),
83            exposure: 0.5,
84            fsr_sharpness: 0.2,
85            interpolation_alpha: 1.0,
86        }
87    }
88}
89
90#[cfg(test)]
91mod tests {
92    use super::*;
93
94    #[test]
95    fn insert_and_get() {
96        let mut rw = RWorld::new();
97        rw.insert(ExtractedMeshes { instances: vec![] });
98        assert!(rw.get::<ExtractedMeshes>().is_some());
99        assert!(rw.get::<ExtractedCamera>().is_none());
100    }
101
102    #[test]
103    fn clear_removes_resources() {
104        let mut rw = RWorld::new();
105        rw.insert(42u32);
106        rw.clear();
107        assert!(rw.get::<u32>().is_none());
108    }
109
110    #[test]
111    fn insert_replaces() {
112        let mut rw = RWorld::new();
113        rw.insert(1u32);
114        rw.insert(2u32);
115        assert_eq!(*rw.get::<u32>().unwrap(), 2);
116    }
117}