aspen_renderer/render_system/
mod.rs

1use std::sync::Arc;
2
3use crate::{
4    renderpass::RenderPassCont, 
5    submit_system::SubmitSystemCont, 
6    GraphicsObjects
7};
8
9pub trait RenderSystem {
10    fn run(&mut self, graphics_objects: Arc<GraphicsObjects>);
11}
12
13pub struct DefaultRenderSystem<SST: SubmitSystemCont> {
14    submit_system: SST,
15    render_passes: Vec<Box<dyn RenderPassCont<SharedData = SST::SharedType> + Send>>
16}
17
18impl<SST: SubmitSystemCont> DefaultRenderSystem<SST> {
19    pub fn new(
20        submit_system: SST,
21        render_passes: Vec<Box<dyn RenderPassCont<SharedData = SST::SharedType> + Send>>
22    ) -> Self {
23        Self {
24            submit_system,
25            render_passes: render_passes.into_iter().collect()
26        }
27    }
28}
29
30impl<SST: SubmitSystemCont> RenderSystem for DefaultRenderSystem<SST> {
31    fn run(&mut self, graphics_objects: Arc<GraphicsObjects>) {
32        let (shared, mut cmd_buf) = match self.submit_system.setup(graphics_objects.clone()) {
33            Ok(val) => val,
34            Err(_) => return
35        };
36
37        let shared = Arc::new(shared);
38
39        for pass in self.render_passes.iter_mut() {
40            match pass.preprocess(graphics_objects.clone(), shared.clone()) {
41                Ok(_) => (),
42                Err(_) => return
43            }
44        }
45
46        for pass in self.render_passes.iter_mut() {
47            match pass.build_commands(graphics_objects.clone(), shared.clone(), &mut cmd_buf) {
48                Ok(_) => (),
49                Err(_) => return
50            }
51        }
52
53        for pass in self.render_passes.iter_mut() {
54            pass.postprocess(graphics_objects.clone(), shared.clone());
55        }
56
57        self.submit_system.submit(graphics_objects.clone(), cmd_buf)
58    }
59}