feo_oop_engine/graphics/
pass_builder.rs1
2use std::sync::Arc;
3
4use vulkano::{command_buffer::{AutoCommandBufferBuilder, SubpassContents, pool::standard::StandardCommandPoolBuilder}, framebuffer::FramebufferAbstract, sync::GpuFuture};
5use feo_math::{linear_algebra::matrix4::Matrix4, utils::space::Space};
6use super::frame_system::FrameSystem;
7
8pub struct PassBuilder<'p> {
12 pub(crate) system: &'p mut FrameSystem,
13
14 pub(crate) before_main_cb_future: Option<Box<dyn GpuFuture>>,
16 pub(crate) framebuffer: Arc<dyn FramebufferAbstract + Send + Sync>,
18 pub(crate) command_buffer_builder: Option<AutoCommandBufferBuilder<StandardCommandPoolBuilder>>,
20 pub(crate) screen_to_camera: Matrix4<f32>,
22 pub(crate) to_camera_space: Space,
24}
25
26impl<'p> PassBuilder<'p>{
27 pub fn build(&mut self) -> Box<dyn GpuFuture> {
29 let command_buffer = self.system.draw_pass_manager.draw();
38 self.command_buffer_builder.as_mut().unwrap()
39 .execute_commands(command_buffer).unwrap();
40 self.command_buffer_builder.as_mut().unwrap()
45 .next_subpass(SubpassContents::SecondaryCommandBuffers).unwrap();
46
47 let lighting_pass_manager = self.system.lighting_pass_manager.clone();
48 lighting_pass_manager.draw(self);
49 self.command_buffer_builder
54 .as_mut()
55 .unwrap()
56 .end_render_pass()
57 .unwrap();
58 let command_buffer = self.command_buffer_builder.take().unwrap().build().unwrap();
59
60 let after_main_cb = self
62 .before_main_cb_future.take().unwrap()
63 .then_execute(self.system.gfx_queue.clone(), command_buffer).unwrap();
64 Box::new(after_main_cb)
66 }
67}