diff --git a/rust/src/game_settings.rs b/rust/src/game_settings.rs index 0595f03..46d12a3 100644 --- a/rust/src/game_settings.rs +++ b/rust/src/game_settings.rs @@ -27,6 +27,7 @@ pub struct GameSettings { pub default_name: String, pub replay_fps: u8, pub window_mode: WindowModeSetting, + pub render_scale: f32, pub recent_servers: Vec, pub volume: VolumeSettings, pub keybinds: KeybindSettings, @@ -146,6 +147,7 @@ impl Default for GameSettings { fov: 90., default_name: "Default McGee".to_owned(), replay_fps: 60, + render_scale: 1., window_mode: WindowModeSetting::Windowed, recent_servers: Vec::new(), volume: VolumeSettings { @@ -188,6 +190,10 @@ impl INode for GameSettingsManager { } GameSettingsManager { settings, base } } + + fn ready(&mut self) { + self.update_window_mode(&self.settings.window_mode); + } } #[godot_api] @@ -216,12 +222,13 @@ impl GameSettingsManager { set_keybind("jump", settings.keybinds.jump); set_keybind("throw_telegrenade", settings.keybinds.telegrenade); - let window_mode = match settings.window_mode { - WindowModeSetting::Fullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, - WindowModeSetting::BorderlessFullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, - WindowModeSetting::Windowed => WindowMode::WINDOWED, - }; - DisplayServer::singleton().window_set_mode(window_mode); + if settings.window_mode != self.settings.window_mode { + self.update_window_mode(&settings.window_mode); + } + + if let Some(mut viewport) = self.base().get_viewport() { + viewport.set_scaling_3d_scale(settings.render_scale); + } self.settings = settings; if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) { @@ -266,6 +273,15 @@ impl GameSettingsManager { }; self.update_settings(settings); } + + pub fn update_window_mode(&self, window_mode: &WindowModeSetting) { + let window_mode = match *window_mode { + WindowModeSetting::Fullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, + WindowModeSetting::BorderlessFullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, + WindowModeSetting::Windowed => WindowMode::WINDOWED, + }; + DisplayServer::singleton().window_set_mode(window_mode); + } } fn set_bus_volume(bus: &str, volume: f32) { diff --git a/rust/src/ui/settings.rs b/rust/src/ui/settings.rs index 5d14dbb..7f6058a 100644 --- a/rust/src/ui/settings.rs +++ b/rust/src/ui/settings.rs @@ -21,6 +21,7 @@ pub enum Setting { DefaultName, ReplayFPS, WindowMode, + RenderScale, // Volume settings MasterVolume, @@ -54,6 +55,7 @@ impl ToString for Setting { Setting::DefaultName => "Default Name", Setting::ReplayFPS => "Replay FPS", Setting::WindowMode => "Window Mode", + Setting::RenderScale => "Render Scale", Setting::MasterVolume => "Master volume", Setting::SfxVolume => "Sfx Volume", @@ -82,6 +84,7 @@ impl Setting { Setting::DefaultName => SettingsTab::General, Setting::ReplayFPS => SettingsTab::General, Setting::WindowMode => SettingsTab::General, + Setting::RenderScale => SettingsTab::General, Setting::MasterVolume => SettingsTab::Volume, Setting::SfxVolume => SettingsTab::Volume, @@ -111,6 +114,7 @@ pub struct OptionSetting { pub struct SliderValue { min: f64, max: f64, + step: f64, value: f64, } @@ -189,6 +193,7 @@ impl IPanelContainer for SettingsPanel { slider.bind_mut().min = slider_value.min; slider.bind_mut().max = slider_value.max; slider.bind_mut().value = slider_value.value; + slider.bind_mut().step = slider_value.step; let setting_clone = setting.clone(); let value_clone = slider_value.clone(); @@ -354,6 +359,9 @@ impl SettingsPanel { } } } + (Setting::RenderScale, SettingValue::SliderNumber(value)) => { + new_settings.render_scale = value.value as f32; + } (Setting::MasterVolume, SettingValue::SliderNumber(value)) => { new_settings.volume.master_volume = value.value; @@ -423,6 +431,7 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin SettingValue::SliderNumber(SliderValue { min: 60., max: 120., + step: 1., value: settings.fov, }), ); @@ -435,6 +444,7 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin SettingValue::SliderNumber(SliderValue { min: 1., max: 240., + step: 1., value: settings.replay_fps as f64, }), ); @@ -458,11 +468,21 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin ], ), ); + map.insert( + Setting::RenderScale, + SettingValue::SliderNumber(SliderValue { + min: 0.25, + max: 2., + step: 0.05, + value: settings.render_scale as f64, + }), + ); map.insert( Setting::MasterVolume, SettingValue::SliderNumber(SliderValue { min: 0., max: 100., + step: 1., value: settings.volume.master_volume, }), ); @@ -471,6 +491,7 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin SettingValue::SliderNumber(SliderValue { min: 0., max: 100., + step: 1., value: settings.volume.sfx_volume, }), ); @@ -479,6 +500,7 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin SettingValue::SliderNumber(SliderValue { min: 0., max: 100., + step: 1., value: settings.volume.music_volume, }), ); @@ -487,6 +509,7 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin SettingValue::SliderNumber(SliderValue { min: 0., max: 100., + step: 1., value: settings.volume.announcer_volume, }), ); diff --git a/rust/src/ui/slider.rs b/rust/src/ui/slider.rs index a2d6b02..6edfd4e 100644 --- a/rust/src/ui/slider.rs +++ b/rust/src/ui/slider.rs @@ -16,6 +16,8 @@ pub struct SliderContainer { pub min: f64, #[export] pub max: f64, + #[export] + pub step: f64, last_value: f64, @@ -30,6 +32,7 @@ impl IHBoxContainer for SliderContainer { if let Some(slider) = &mut self.slider { slider.set_min(self.min); slider.set_max(self.max); + slider.set_step(self.step); if self.last_value != self.value { slider.set_value(self.value); }