Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better render configuration HUD #140

Merged
merged 3 commits into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions blade-helpers/src/camera.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use super::ExposeHud;

pub struct ControlledCamera {
pub inner: blade_render::Camera,
pub fly_speed: f32,
Expand Down Expand Up @@ -38,28 +40,6 @@ impl ControlledCamera {
glam::Mat4::perspective_rh(self.inner.fov_y, aspect, 1.0, self.inner.depth)
}

pub fn populate_hud(&mut self, ui: &mut egui::Ui) {
ui.horizontal(|ui| {
ui.label("Position:");
ui.add(egui::DragValue::new(&mut self.inner.pos.x));
ui.add(egui::DragValue::new(&mut self.inner.pos.y));
ui.add(egui::DragValue::new(&mut self.inner.pos.z));
});
ui.horizontal(|ui| {
ui.label("Rotation:");
ui.add(egui::DragValue::new(&mut self.inner.rot.v.x));
ui.add(egui::DragValue::new(&mut self.inner.rot.v.y));
ui.add(egui::DragValue::new(&mut self.inner.rot.v.z));
ui.add(egui::DragValue::new(&mut self.inner.rot.s));
});
ui.add(egui::Slider::new(&mut self.inner.fov_y, 0.5f32..=2.0f32).text("FOV"));
ui.add(
egui::Slider::new(&mut self.fly_speed, 1f32..=100000f32)
.text("Fly speed")
.logarithmic(true),
);
}

pub fn move_by(&mut self, offset: glam::Vec3) {
let dir = glam::Quat::from(self.inner.rot) * offset;
self.inner.pos = (glam::Vec3::from(self.inner.pos) + dir).into();
Expand Down Expand Up @@ -107,3 +87,27 @@ impl ControlledCamera {
true
}
}

impl ExposeHud for ControlledCamera {
fn populate_hud(&mut self, ui: &mut egui::Ui) {
ui.horizontal(|ui| {
ui.label("Position:");
ui.add(egui::DragValue::new(&mut self.inner.pos.x));
ui.add(egui::DragValue::new(&mut self.inner.pos.y));
ui.add(egui::DragValue::new(&mut self.inner.pos.z));
});
ui.horizontal(|ui| {
ui.label("Rotation:");
ui.add(egui::DragValue::new(&mut self.inner.rot.v.x));
ui.add(egui::DragValue::new(&mut self.inner.rot.v.y));
ui.add(egui::DragValue::new(&mut self.inner.rot.v.z));
ui.add(egui::DragValue::new(&mut self.inner.rot.s));
});
ui.add(egui::Slider::new(&mut self.inner.fov_y, 0.5f32..=2.0f32).text("FOV"));
ui.add(
egui::Slider::new(&mut self.fly_speed, 1f32..=100000f32)
.text("Fly speed")
.logarithmic(true),
);
}
}
93 changes: 74 additions & 19 deletions blade-helpers/src/hud.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,80 @@
pub fn populate_debug_hud(debug: &mut blade_render::DebugConfig, ui: &mut egui::Ui) {
use strum::IntoEnumIterator as _;
pub trait ExposeHud {
fn populate_hud(&mut self, ui: &mut egui::Ui);
}

egui::ComboBox::from_label("View mode")
.selected_text(format!("{:?}", debug.view_mode))
.show_ui(ui, |ui| {
for value in blade_render::DebugMode::iter() {
ui.selectable_value(&mut debug.view_mode, value, format!("{value:?}"));
}
});
impl ExposeHud for blade_render::RayConfig {
fn populate_hud(&mut self, ui: &mut egui::Ui) {
ui.add(
egui::Slider::new(&mut self.num_environment_samples, 1..=100u32)
.text("Num env samples")
.logarithmic(true),
);
ui.checkbox(
&mut self.environment_importance_sampling,
"Env importance sampling",
);
ui.add(
egui::widgets::Slider::new(&mut self.temporal_history, 0..=50).text("Temporal history"),
);
ui.add(egui::widgets::Slider::new(&mut self.spatial_taps, 0..=10).text("Spatial taps"));
ui.add(
egui::widgets::Slider::new(&mut self.spatial_tap_history, 0..=50)
.text("Spatial tap history"),
);
ui.add(
egui::widgets::Slider::new(&mut self.spatial_radius, 1..=50)
.text("Spatial radius (px)"),
);
}
}

impl ExposeHud for blade_render::DenoiserConfig {
fn populate_hud(&mut self, ui: &mut egui::Ui) {
ui.add(egui::Slider::new(&mut self.temporal_weight, 0.0..=1.0f32).text("Temporal weight"));
ui.add(egui::Slider::new(&mut self.num_passes, 0..=5u32).text("A-trous passes"));
}
}

ui.label("Draw debug:");
for (name, bit) in blade_render::DebugDrawFlags::all().iter_names() {
let mut enabled = debug.draw_flags.contains(bit);
ui.checkbox(&mut enabled, name);
debug.draw_flags.set(bit, enabled);
impl ExposeHud for blade_render::PostProcConfig {
fn populate_hud(&mut self, ui: &mut egui::Ui) {
ui.add(
egui::Slider::new(&mut self.average_luminocity, 0.1f32..=1_000f32)
.text("Average luminocity")
.logarithmic(true),
);
ui.add(
egui::Slider::new(&mut self.exposure_key_value, 0.01f32..=10f32)
.text("Key value")
.logarithmic(true),
);
ui.add(egui::Slider::new(&mut self.white_level, 0.1f32..=2f32).text("White level"));
}
ui.label("Ignore textures:");
for (name, bit) in blade_render::DebugTextureFlags::all().iter_names() {
let mut enabled = debug.texture_flags.contains(bit);
ui.checkbox(&mut enabled, name);
debug.texture_flags.set(bit, enabled);
}

impl ExposeHud for blade_render::DebugConfig {
fn populate_hud(&mut self, ui: &mut egui::Ui) {
use strum::IntoEnumIterator as _;

egui::ComboBox::from_label("View mode")
.selected_text(format!("{:?}", self.view_mode))
.show_ui(ui, |ui| {
for value in blade_render::DebugMode::iter() {
ui.selectable_value(&mut self.view_mode, value, format!("{value:?}"));
}
});

ui.label("Draw debug:");
for (name, bit) in blade_render::DebugDrawFlags::all().iter_names() {
let mut enabled = self.draw_flags.contains(bit);
ui.checkbox(&mut enabled, name);
self.draw_flags.set(bit, enabled);
}
ui.label("Ignore textures:");
for (name, bit) in blade_render::DebugTextureFlags::all().iter_names() {
let mut enabled = self.texture_flags.contains(bit);
ui.checkbox(&mut enabled, name);
self.texture_flags.set(bit, enabled);
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion blade-helpers/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ mod hud;

pub use blade_render::Camera;
pub use camera::ControlledCamera;
pub use hud::{populate_debug_hud, populate_debug_selection};
pub use hud::{populate_debug_selection, ExposeHud};
4 changes: 2 additions & 2 deletions blade-render/code/ray-trace.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct MainParams {
spatial_taps: u32,
spatial_tap_history: u32,
spatial_radius: i32,
t_start: f32,
use_motion_vectors: u32,
};

Expand Down Expand Up @@ -222,11 +223,10 @@ fn evaluate_brdf(surface: Surface, dir: vec3<f32>) -> f32 {
}

fn check_ray_occluded(position: vec3<f32>, direction: vec3<f32>, debug_len: f32) -> bool {
let start_t = 0.5; // some offset required to avoid self-shadowing
var rq: ray_query;
let flags = RAY_FLAG_TERMINATE_ON_FIRST_HIT | RAY_FLAG_CULL_NO_OPAQUE;
rayQueryInitialize(&rq, acc_struct,
RayDesc(flags, 0xFFu, start_t, camera.depth, position, direction)
RayDesc(flags, 0xFFu, parameters.t_start, camera.depth, position, direction)
);
rayQueryProceed(&rq);
let intersection = rayQueryGetCommittedIntersection(&rq);
Expand Down
27 changes: 19 additions & 8 deletions blade-render/src/render/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ pub struct RayConfig {
pub spatial_taps: u32,
pub spatial_tap_history: u32,
pub spatial_radius: u32,
pub t_start: f32,
}

#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
Expand Down Expand Up @@ -358,6 +359,7 @@ struct MainParams {
spatial_taps: u32,
spatial_tap_history: u32,
spatial_radius: u32,
t_start: f32,
use_motion_vectors: u32,
}

Expand Down Expand Up @@ -616,6 +618,14 @@ impl ShaderPipelines {
}
}

#[derive(Clone, Copy, Default)]
pub struct FrameConfig {
pub frozen: bool,
pub debug_draw: bool,
pub reset_variance: bool,
pub reset_reservoirs: bool,
}

/// Temporary resources associated with a GPU frame.
#[derive(Default)]
pub struct FrameResources {
Expand Down Expand Up @@ -1039,28 +1049,26 @@ impl Renderer {
&mut self,
command_encoder: &mut blade_graphics::CommandEncoder,
camera: &crate::Camera,
enable_debug_draw: bool,
accumulate_variance: bool,
reset_reservoirs: bool,
config: FrameConfig,
) {
let mut transfer = command_encoder.transfer();

if enable_debug_draw {
if config.debug_draw {
self.debug.reset_lines(&mut transfer);
self.debug.enable_draw(&mut transfer, true);
} else {
self.debug.enable_draw(&mut transfer, false);
}

if reset_reservoirs || !accumulate_variance {
if config.reset_reservoirs || config.reset_variance {
self.debug.reset_variance(&mut transfer);
} else {
self.debug.update_variance(&mut transfer);
}
self.debug.update_entry(&mut transfer);

if reset_reservoirs {
if !enable_debug_draw {
if config.reset_reservoirs {
if !config.debug_draw {
self.debug.reset_lines(&mut transfer);
}
let total_reservoirs = self.surface_size.width as u64 * self.surface_size.height as u64;
Expand All @@ -1073,7 +1081,9 @@ impl Renderer {
}
}

self.frame_index += 1;
if !config.frozen {
self.frame_index += 1;
}
self.targets.camera_params[self.frame_index % 2] = self.make_camera_params(camera);
self.post_proc_input_index = self.frame_index % 2;
}
Expand Down Expand Up @@ -1136,6 +1146,7 @@ impl Renderer {
spatial_taps: ray_config.spatial_taps,
spatial_tap_history: ray_config.spatial_tap_history,
spatial_radius: ray_config.spatial_radius,
t_start: ray_config.t_start,
use_motion_vectors: (self.frame_scene_built == self.frame_index) as u32,
},
acc_struct: self.acceleration_structure,
Expand Down
15 changes: 12 additions & 3 deletions examples/move/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct Game {
last_event: time::Instant,
last_mouse_pos: [i32; 2],
is_point_selected: bool,
is_debug_active: bool,
}

#[derive(Debug)]
Expand Down Expand Up @@ -45,7 +46,7 @@ impl Game {
fov_y: 1.0,
depth: 0.0,
},
..Default::default()
fly_speed: 10.0,
};

let data_path = PathBuf::from("examples/move/data");
Expand Down Expand Up @@ -104,6 +105,7 @@ impl Game {
last_event: time::Instant::now(),
last_mouse_pos: [0; 2],
is_point_selected: false,
is_debug_active: false,
}
}

Expand Down Expand Up @@ -155,7 +157,9 @@ impl Game {
if key_code == winit::keyboard::KeyCode::Escape {
return Err(QuitEvent);
}
self.camera.on_key(key_code, delta);
if self.camera.on_key(key_code, delta) {
self.is_debug_active = false;
}
}
winit::event::WindowEvent::CloseRequested => {
return Err(QuitEvent);
Expand All @@ -181,6 +185,7 @@ impl Game {
winit::event::ElementState::Pressed => true,
winit::event::ElementState::Released => false,
};
self.is_debug_active |= self.is_point_selected;
}
winit::event::WindowEvent::CursorMoved { position, .. } => {
self.last_mouse_pos = [position.x as i32, position.y as i32];
Expand All @@ -192,6 +197,8 @@ impl Game {
}

fn populate_hud(&mut self, ui: &mut egui::Ui) {
use blade_helpers::ExposeHud as _;

egui::CollapsingHeader::new("Game")
.default_open(true)
.show(ui, |ui| {
Expand All @@ -208,7 +215,9 @@ impl Game {
fn on_draw(&mut self) -> time::Duration {
self.update_time();

self.engine.debug_mouse_pos(if self.is_point_selected {
self.engine.frame_config.frozen = self.is_paused;
self.engine.frame_config.debug_draw = self.is_point_selected;
self.engine.set_debug_pixel(if self.is_debug_active {
Some(self.last_mouse_pos)
} else {
None
Expand Down
Loading
Loading