ursus_core/render/
world.rs1use 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}