Add scene and renderer selection to egui

This commit is contained in:
hal8174 2024-11-28 17:59:46 +01:00
parent d4bf1845cb
commit 1bfef16afa
6 changed files with 200 additions and 100 deletions

View file

@ -4,8 +4,11 @@ use std::sync::{
};
use rand::{rngs::SmallRng, SeedableRng};
use ray_tracing_core::{camera::BasicCamera, renderer::ClassicalRenderer};
use ray_tracing_renderer::path_tracer_importance::PathTracerImportance;
use ray_tracing_core::{camera::BasicCamera, renderer::ClassicalRenderer, scene::Scene};
use ray_tracing_renderer::{
depth_renderer::DepthRenderer, next_event_estimation::NextEventEstimation,
path_tracer::PathTracer, path_tracer_importance::PathTracerImportance,
};
use ray_tracing_scene::examples::{self, example_scenes, ExampleScene};
use rayon::{
iter::{IndexedParallelIterator, ParallelIterator},
@ -19,10 +22,29 @@ use vulkano::{
},
};
type DynRenderer =
dyn ClassicalRenderer<SmallRng, Box<dyn Scene<SmallRng> + Sync>, BasicCamera> + Sync;
pub const RENDERER: [(&str, fn(u32, u32) -> Box<DynRenderer>); 4] = [
("Depth", |w, h| {
Box::new(DepthRenderer::new(w, h)) as Box<DynRenderer>
}),
("Path tracer", |w, h| {
Box::new(PathTracer::new(w, h)) as Box<DynRenderer>
}),
("Path tracer importance", |w, h| {
Box::new(PathTracerImportance::new(w, h)) as Box<DynRenderer>
}),
("Next event estimation", |w, h| {
Box::new(NextEventEstimation::new(w, h)) as Box<DynRenderer>
}),
];
#[derive(Debug, Clone)]
pub struct RenderSettings {
pub width: u32,
pub height: u32,
pub scene: &'static str,
pub renderer_id: usize,
}
pub enum ControlMessages {
@ -46,9 +68,10 @@ pub fn render_thread(
let mut buffer = vec![0.0; settings.width as usize * settings.height as usize * 3];
let e = examples::cornell2();
let example_scenes = examples::example_scenes::<SmallRng>();
let scene = e.scene;
let e = example_scenes[settings.scene]();
let mut scene = (e.scene)();
let mut camera = BasicCamera::new(
settings.width,
@ -59,12 +82,15 @@ pub fn render_thread(
e.horizontal_fov,
);
let mut renderer = PathTracerImportance::new(settings.width, settings.height);
let mut renderer = (RENDERER[settings.renderer_id].1)(settings.width, settings.height);
let mut samples = 0;
loop {
while let Ok(s) = rx.try_recv() {
println!("Settings changed.");
settings = s;
let e = example_scenes[settings.scene]();
scene = (e.scene)();
camera = BasicCamera::new(
settings.width,
settings.height,
@ -74,7 +100,7 @@ pub fn render_thread(
e.horizontal_fov,
);
buffer = vec![0.0; settings.width as usize * settings.height as usize * 3];
renderer = PathTracerImportance::new(settings.width, settings.height);
renderer = (RENDERER[settings.renderer_id].1)(settings.width, settings.height);
samples = 0;
}