2022-04-04 02:11:38 +00:00
|
|
|
//! Cyborg is a high-performance, modern, experimental rendering engine written
|
|
|
|
//! in Rust.
|
|
|
|
|
2022-04-04 03:56:28 +00:00
|
|
|
use rayon::prelude::*;
|
2022-04-05 04:21:14 +00:00
|
|
|
use std::sync::{Arc, RwLock};
|
2022-04-04 02:11:38 +00:00
|
|
|
use strum::IntoEnumIterator;
|
|
|
|
|
2022-04-15 23:32:06 +00:00
|
|
|
pub mod mesh;
|
2022-04-04 03:15:05 +00:00
|
|
|
pub mod pass;
|
2022-04-04 03:56:28 +00:00
|
|
|
pub mod phase;
|
2022-04-18 03:56:16 +00:00
|
|
|
pub mod staging;
|
2022-04-04 02:11:38 +00:00
|
|
|
|
2022-04-04 03:15:05 +00:00
|
|
|
use pass::*;
|
2022-04-04 02:31:20 +00:00
|
|
|
use phase::*;
|
2022-04-04 02:11:38 +00:00
|
|
|
|
|
|
|
pub struct Renderer {
|
2022-04-18 07:59:26 +00:00
|
|
|
device: Arc<wgpu::Device>,
|
|
|
|
queue: wgpu::Queue,
|
|
|
|
frames_in_flight: usize,
|
|
|
|
render_passes: Vec<Box<dyn RenderPassBoxTrait>>,
|
2022-04-04 02:11:38 +00:00
|
|
|
}
|
|
|
|
|
2022-04-18 07:59:26 +00:00
|
|
|
impl Renderer {
|
|
|
|
pub fn new(device: wgpu::Device, queue: wgpu::Queue) -> Self {
|
2022-04-05 04:21:14 +00:00
|
|
|
Self {
|
2022-04-18 07:59:26 +00:00
|
|
|
device: Arc::new(device),
|
|
|
|
queue,
|
2022-04-05 04:21:14 +00:00
|
|
|
frames_in_flight: 2,
|
|
|
|
render_passes: Vec::new(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-18 07:59:26 +00:00
|
|
|
pub fn get_device(&self) -> &Arc<wgpu::Device> {
|
|
|
|
&self.device
|
|
|
|
}
|
|
|
|
|
2022-04-05 04:21:14 +00:00
|
|
|
pub fn add_pass<T: 'static + RenderPass>(&mut self, pass: T) {
|
|
|
|
let pass = Arc::new(RwLock::new(pass));
|
|
|
|
self.add_pass_arc(pass);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn add_pass_arc<T: 'static + RenderPass>(&mut self, pass: Arc<RwLock<T>>) {
|
|
|
|
let pass = RenderPassBox::new(pass, self.frames_in_flight);
|
|
|
|
self.add_pass_box(pass);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn add_pass_box(&mut self, pass: Box<dyn RenderPassBoxTrait>) {
|
|
|
|
self.render_passes.push(pass);
|
|
|
|
}
|
|
|
|
|
2022-04-04 02:11:38 +00:00
|
|
|
pub fn render(&mut self) {
|
|
|
|
let frame_index = 0;
|
|
|
|
|
2022-04-18 09:54:29 +00:00
|
|
|
let phase_passes = multimap::MultiMap::<Phase, usize>::new();
|
2022-04-04 03:56:28 +00:00
|
|
|
let phase_passes = std::sync::Mutex::new(phase_passes);
|
2022-04-04 02:11:38 +00:00
|
|
|
|
2022-04-04 03:56:28 +00:00
|
|
|
self.render_passes
|
|
|
|
.par_iter_mut()
|
|
|
|
.enumerate()
|
|
|
|
.for_each(|(pass_index, rp)| {
|
2022-04-18 09:54:29 +00:00
|
|
|
let mut phases_buf = Vec::new();
|
2022-04-04 03:56:28 +00:00
|
|
|
phases_buf.clear();
|
|
|
|
rp.begin_frame(frame_index, &mut phases_buf);
|
2022-04-18 09:54:29 +00:00
|
|
|
|
|
|
|
let mut passes = phase_passes.lock().unwrap();
|
|
|
|
for phase in phases_buf.into_iter() {
|
|
|
|
passes.insert(phase, pass_index);
|
|
|
|
}
|
2022-04-04 03:56:28 +00:00
|
|
|
});
|
2022-04-04 02:11:38 +00:00
|
|
|
|
2022-04-04 03:56:28 +00:00
|
|
|
let phase_passes = phase_passes.into_inner().unwrap();
|
2022-04-04 02:11:38 +00:00
|
|
|
let viewport = ViewportData;
|
|
|
|
|
2022-04-18 09:54:29 +00:00
|
|
|
// Up next is actual rendering to a surface!
|
2022-04-04 02:11:38 +00:00
|
|
|
}
|
|
|
|
}
|