From e61964c513c4caad7eb550adb7cad69b789335ca Mon Sep 17 00:00:00 2001 From: hal8174 Date: Sun, 1 Dec 2024 21:32:56 +0100 Subject: [PATCH] Make camera dynamic --- ray-tracing-egui/src/main.rs | 39 ++++++++++++++++++++++++++++------ ray-tracing-egui/src/render.rs | 24 +++++++++++++-------- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/ray-tracing-egui/src/main.rs b/ray-tracing-egui/src/main.rs index e5b75f2..9fda1cf 100644 --- a/ray-tracing-egui/src/main.rs +++ b/ray-tracing-egui/src/main.rs @@ -1,4 +1,6 @@ +use egui::Widget; use egui_winit_vulkano::{Gui, GuiConfig}; +use ray_tracing_core::prelude::*; use ray_tracing_scene::examples::example_scenes; use render::{render_thread, RENDERER}; use setup::{get_compute_pipeline, get_framebuffers}; @@ -89,12 +91,19 @@ fn main() { let (data_tx, data_rx) = std::sync::mpsc::channel(); let scenes = example_scenes::(); - - let mut settings = render::RenderSettings { - width: window.inner_size().width, - height: window.inner_size().height, - scene: scenes.keys().next().unwrap(), - renderer_id: 0, + let mut settings = { + let scene = scenes.iter().next().unwrap(); + let e = (scene.1)(); + render::RenderSettings { + width: window.inner_size().width, + height: window.inner_size().height, + scene: scene.0, + renderer_id: 0, + camera_pos: e.camera_pos, + camera_dir: e.camera_dir, + camera_up: e.camera_up, + camera_horizontal_fov: e.horizontal_fov, + } }; let send_settings = settings.clone(); @@ -176,11 +185,20 @@ fn main() { egui::ComboBox::from_label("Scene") .selected_text(settings.scene) .show_ui(ui, |ui| { + let mut scene_changed = false; for &label in scenes.keys() { - settings_changed |= ui + scene_changed |= ui .selectable_value(&mut settings.scene, label, label) .changed(); } + if scene_changed { + settings_changed = true; + let e = scenes[settings.scene](); + settings.camera_pos = e.camera_pos; + settings.camera_dir = e.camera_dir; + settings.camera_up = e.camera_up; + settings.camera_horizontal_fov = e.horizontal_fov; + } }); }); @@ -191,6 +209,13 @@ fn main() { }) .changed(); + settings_changed |= egui::Slider::new( + &mut settings.camera_horizontal_fov, + 0.1..=FloatConsts::PI - 0.1, + ) + .ui(ui) + .changed(); + ui.collapsing("Render Settings:", |ui| { ui.label(format!("{:#?}", &settings)); }); diff --git a/ray-tracing-egui/src/render.rs b/ray-tracing-egui/src/render.rs index 8f73b28..a509744 100644 --- a/ray-tracing-egui/src/render.rs +++ b/ray-tracing-egui/src/render.rs @@ -4,7 +4,9 @@ use std::sync::{ }; use rand::{rngs::SmallRng, SeedableRng}; -use ray_tracing_core::{camera::BasicCamera, renderer::ClassicalRenderer, scene::Scene}; +use ray_tracing_core::{ + camera::BasicCamera, prelude::*, renderer::ClassicalRenderer, scene::Scene, +}; use ray_tracing_renderer::{ depth_renderer::DepthRenderer, next_event_estimation::NextEventEstimation, path_tracer::PathTracer, path_tracer_importance::PathTracerImportance, @@ -45,6 +47,10 @@ pub struct RenderSettings { pub height: u32, pub scene: &'static str, pub renderer_id: usize, + pub camera_pos: Pos3, + pub camera_dir: Dir3, + pub camera_up: Dir3, + pub camera_horizontal_fov: Float, } pub enum ControlMessages { @@ -76,10 +82,10 @@ pub fn render_thread( let mut camera = BasicCamera::new( settings.width, settings.height, - e.camera_pos, - e.camera_dir, - e.camera_up, - e.horizontal_fov, + settings.camera_pos, + settings.camera_dir, + settings.camera_up, + settings.camera_horizontal_fov, ); let mut renderer = (RENDERER[settings.renderer_id].1)(settings.width, settings.height); @@ -94,10 +100,10 @@ pub fn render_thread( camera = BasicCamera::new( settings.width, settings.height, - e.camera_pos, - e.camera_dir, - e.camera_up, - e.horizontal_fov, + settings.camera_pos, + settings.camera_dir, + settings.camera_up, + settings.camera_horizontal_fov, ); dbg!(&camera); buffer = vec![0.0; settings.width as usize * settings.height as usize * 3];