Skip to main content

deuxfleurs/
settings.rs

1use crate::data::Colors;
2use egui::DragValue;
3#[cfg(feature = "saves")]
4use serde::{Deserialize, Serialize};
5use std::num::NonZeroU8;
6use wgpu::Color;
7pub use wgpu::PowerPreference;
8
9/// Global rendering settings
10#[derive(Clone)]
11#[cfg_attr(feature = "saves", derive(Serialize, Deserialize))]
12#[cfg_attr(feature = "saves", serde(default))]
13pub struct Settings {
14    //vsync: bool,
15    //show_fps: bool,
16    /// Only redraw scene when window asks for it
17    pub lazy_draw: bool,
18    /// Disable storing last redraw in buffer
19    pub rerender: bool,
20    /// Number of frame used in temporal anti aliasing, `None` disables taa
21    ///
22    /// TAA is only crudely applied for a number of fixed frames when the scene stops changing.
23    /// Defaults to 16 frames.
24    pub taa: Option<NonZeroU8>,
25    /// Ground shadow
26    pub shadow: bool,
27    /// Background color
28    pub background_color: Color,
29    pub mouse_sensitivity: f32,
30    pub zoom_sensitivity: f32,
31    pub default_color_map: Colors,
32    pub fit_camera_on_start: bool,
33    pub ssao_enabled: bool,
34    /// When rendering headless, or when the scene was just updated,
35    /// render n frames instead of only one to leverage temporal
36    /// accumulation for AA (roundabout way to supersample screenshots).
37    pub minimum_frame_per_screenshot: NonZeroU8,
38    /// Preference for which rendering device will be obtained. Defaults to None, taking the
39    /// first device presented.
40    ///
41    /// Only read when `run` is called, changing the value has no effect after.
42    pub power_preference: PowerPreference,
43}
44
45impl Default for Settings {
46    fn default() -> Settings {
47        Settings {
48            lazy_draw: true,
49            rerender: false,
50            taa: NonZeroU8::new(16),
51            shadow: true,
52            background_color: Color {
53                r: 1.0,
54                g: 1.0,
55                b: 1.0,
56                a: 1.0,
57            },
58            mouse_sensitivity: 0.1,
59            zoom_sensitivity: 0.1,
60            default_color_map: Colors::Viridis,
61            fit_camera_on_start: true,
62            ssao_enabled: true,
63            minimum_frame_per_screenshot: NonZeroU8::new(16).unwrap(),
64            power_preference: PowerPreference::None,
65        }
66    }
67}
68
69impl Settings {
70    pub fn draw_ui(&mut self, ui: &mut egui::Ui, refresh_screen: &mut bool) {
71        ui.collapsing("Settings", |ui| {
72            ui.horizontal(|ui| {
73                let mut value = self.taa.map(|v| v.get()).unwrap_or(0) as f32;
74                ui.add(
75                    DragValue::new(&mut value)
76                        .range(0..=64)
77                        .prefix("TAA frames: "),
78                );
79                let value = NonZeroU8::new(value as u8);
80                if self.taa != value {
81                    self.taa = value;
82                    *refresh_screen = true;
83                }
84            });
85            *refresh_screen |= ui.checkbox(&mut self.shadow, "Ground shadow").clicked();
86            ui.horizontal(|ui| {
87                ui.add(
88                    DragValue::new(&mut self.mouse_sensitivity)
89                        .range(0. ..=100.)
90                        .speed(0.01)
91                        .prefix("Mouse sensitivity: "),
92                );
93            });
94            ui.horizontal(|ui| {
95                ui.add(
96                    DragValue::new(&mut self.zoom_sensitivity)
97                        .range(0. ..=100.)
98                        .speed(0.01)
99                        .prefix("Zoom sensitivity: "),
100                );
101            });
102            if ui.checkbox(&mut self.ssao_enabled, "SSAO").changed() {
103                *refresh_screen = true;
104            }
105        });
106    }
107}