Add scene and renderer selection to egui
This commit is contained in:
parent
d4bf1845cb
commit
1bfef16afa
6 changed files with 200 additions and 100 deletions
|
|
@ -1,5 +1,6 @@
|
|||
use egui_winit_vulkano::{Gui, GuiConfig};
|
||||
use render::render_thread;
|
||||
use ray_tracing_scene::examples::example_scenes;
|
||||
use render::{render_thread, RENDERER};
|
||||
use setup::{get_compute_pipeline, get_framebuffers};
|
||||
use std::sync::Arc;
|
||||
use vulkano::{
|
||||
|
|
@ -87,9 +88,13 @@ fn main() {
|
|||
let (control_tx, control_rx) = std::sync::mpsc::channel();
|
||||
let (data_tx, data_rx) = std::sync::mpsc::channel();
|
||||
|
||||
let scenes = example_scenes::<rand::rngs::SmallRng>();
|
||||
|
||||
let mut settings = render::RenderSettings {
|
||||
width: window.inner_size().width,
|
||||
height: window.inner_size().height,
|
||||
scene: scenes.keys().next().unwrap(),
|
||||
renderer_id: 0,
|
||||
};
|
||||
|
||||
let send_settings = settings.clone();
|
||||
|
|
@ -163,10 +168,28 @@ fn main() {
|
|||
pipeline = get_compute_pipeline(device.clone(), cs.clone());
|
||||
}
|
||||
|
||||
let mut settings_changed = false;
|
||||
gui.immediate_ui(|gui| {
|
||||
let ctx = gui.context();
|
||||
egui::Window::new("panel").show(&ctx, |ui| {
|
||||
ui.heading("fdjkslf");
|
||||
ui.collapsing("Scene Settings:", |ui| {
|
||||
egui::ComboBox::from_label("Scene")
|
||||
.selected_text(settings.scene)
|
||||
.show_ui(ui, |ui| {
|
||||
for &label in scenes.keys() {
|
||||
settings_changed |= ui
|
||||
.selectable_value(&mut settings.scene, label, label)
|
||||
.changed();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
settings_changed |= egui::ComboBox::from_label("Renderer")
|
||||
.selected_text(RENDERER[settings.renderer_id].0)
|
||||
.show_index(ui, &mut settings.renderer_id, RENDERER.len(), |i| {
|
||||
RENDERER[i].0
|
||||
})
|
||||
.changed();
|
||||
|
||||
ui.collapsing("Render Settings:", |ui| {
|
||||
ui.label(format!("{:#?}", &settings));
|
||||
|
|
@ -174,6 +197,10 @@ fn main() {
|
|||
});
|
||||
});
|
||||
|
||||
if settings_changed {
|
||||
let _ = control_tx.send(settings.clone());
|
||||
}
|
||||
|
||||
let (image_i, suboptimal, acquire_future) =
|
||||
match swapchain::acquire_next_image(swapchain.clone(), None)
|
||||
.map_err(Validated::unwrap)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue