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#[derive(Clone)]
11#[cfg_attr(feature = "saves", derive(Serialize, Deserialize))]
12#[cfg_attr(feature = "saves", serde(default))]
13pub struct Settings {
14 pub lazy_draw: bool,
18 pub rerender: bool,
20 pub taa: Option<NonZeroU8>,
25 pub shadow: bool,
27 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 pub minimum_frame_per_screenshot: NonZeroU8,
38 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}