Add render scale setting

This commit is contained in:
Sofia 2026-07-28 21:01:28 +03:00
parent 7752a009fe
commit b0a4048360
3 changed files with 48 additions and 6 deletions

View File

@ -27,6 +27,7 @@ pub struct GameSettings {
pub default_name: String, pub default_name: String,
pub replay_fps: u8, pub replay_fps: u8,
pub window_mode: WindowModeSetting, pub window_mode: WindowModeSetting,
pub render_scale: f32,
pub recent_servers: Vec<RecentServer>, pub recent_servers: Vec<RecentServer>,
pub volume: VolumeSettings, pub volume: VolumeSettings,
pub keybinds: KeybindSettings, pub keybinds: KeybindSettings,
@ -146,6 +147,7 @@ impl Default for GameSettings {
fov: 90., fov: 90.,
default_name: "Default McGee".to_owned(), default_name: "Default McGee".to_owned(),
replay_fps: 60, replay_fps: 60,
render_scale: 1.,
window_mode: WindowModeSetting::Windowed, window_mode: WindowModeSetting::Windowed,
recent_servers: Vec::new(), recent_servers: Vec::new(),
volume: VolumeSettings { volume: VolumeSettings {
@ -188,6 +190,10 @@ impl INode for GameSettingsManager {
} }
GameSettingsManager { settings, base } GameSettingsManager { settings, base }
} }
fn ready(&mut self) {
self.update_window_mode(&self.settings.window_mode);
}
} }
#[godot_api] #[godot_api]
@ -216,12 +222,13 @@ impl GameSettingsManager {
set_keybind("jump", settings.keybinds.jump); set_keybind("jump", settings.keybinds.jump);
set_keybind("throw_telegrenade", settings.keybinds.telegrenade); set_keybind("throw_telegrenade", settings.keybinds.telegrenade);
let window_mode = match settings.window_mode { if settings.window_mode != self.settings.window_mode {
WindowModeSetting::Fullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, self.update_window_mode(&settings.window_mode);
WindowModeSetting::BorderlessFullscreen => WindowMode::EXCLUSIVE_FULLSCREEN, }
WindowModeSetting::Windowed => WindowMode::WINDOWED,
}; if let Some(mut viewport) = self.base().get_viewport() {
DisplayServer::singleton().window_set_mode(window_mode); viewport.set_scaling_3d_scale(settings.render_scale);
}
self.settings = settings; self.settings = settings;
if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) { if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) {
@ -266,6 +273,15 @@ impl GameSettingsManager {
}; };
self.update_settings(settings); 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) { fn set_bus_volume(bus: &str, volume: f32) {

View File

@ -21,6 +21,7 @@ pub enum Setting {
DefaultName, DefaultName,
ReplayFPS, ReplayFPS,
WindowMode, WindowMode,
RenderScale,
// Volume settings // Volume settings
MasterVolume, MasterVolume,
@ -54,6 +55,7 @@ impl ToString for Setting {
Setting::DefaultName => "Default Name", Setting::DefaultName => "Default Name",
Setting::ReplayFPS => "Replay FPS", Setting::ReplayFPS => "Replay FPS",
Setting::WindowMode => "Window Mode", Setting::WindowMode => "Window Mode",
Setting::RenderScale => "Render Scale",
Setting::MasterVolume => "Master volume", Setting::MasterVolume => "Master volume",
Setting::SfxVolume => "Sfx Volume", Setting::SfxVolume => "Sfx Volume",
@ -82,6 +84,7 @@ impl Setting {
Setting::DefaultName => SettingsTab::General, Setting::DefaultName => SettingsTab::General,
Setting::ReplayFPS => SettingsTab::General, Setting::ReplayFPS => SettingsTab::General,
Setting::WindowMode => SettingsTab::General, Setting::WindowMode => SettingsTab::General,
Setting::RenderScale => SettingsTab::General,
Setting::MasterVolume => SettingsTab::Volume, Setting::MasterVolume => SettingsTab::Volume,
Setting::SfxVolume => SettingsTab::Volume, Setting::SfxVolume => SettingsTab::Volume,
@ -111,6 +114,7 @@ pub struct OptionSetting {
pub struct SliderValue { pub struct SliderValue {
min: f64, min: f64,
max: f64, max: f64,
step: f64,
value: f64, value: f64,
} }
@ -189,6 +193,7 @@ impl IPanelContainer for SettingsPanel {
slider.bind_mut().min = slider_value.min; slider.bind_mut().min = slider_value.min;
slider.bind_mut().max = slider_value.max; slider.bind_mut().max = slider_value.max;
slider.bind_mut().value = slider_value.value; slider.bind_mut().value = slider_value.value;
slider.bind_mut().step = slider_value.step;
let setting_clone = setting.clone(); let setting_clone = setting.clone();
let value_clone = slider_value.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)) => { (Setting::MasterVolume, SettingValue::SliderNumber(value)) => {
new_settings.volume.master_volume = value.value; new_settings.volume.master_volume = value.value;
@ -423,6 +431,7 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 60., min: 60.,
max: 120., max: 120.,
step: 1.,
value: settings.fov, value: settings.fov,
}), }),
); );
@ -435,6 +444,7 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 1., min: 1.,
max: 240., max: 240.,
step: 1.,
value: settings.replay_fps as f64, value: settings.replay_fps as f64,
}), }),
); );
@ -458,11 +468,21 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, 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( map.insert(
Setting::MasterVolume, Setting::MasterVolume,
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 0., min: 0.,
max: 100., max: 100.,
step: 1.,
value: settings.volume.master_volume, value: settings.volume.master_volume,
}), }),
); );
@ -471,6 +491,7 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 0., min: 0.,
max: 100., max: 100.,
step: 1.,
value: settings.volume.sfx_volume, value: settings.volume.sfx_volume,
}), }),
); );
@ -479,6 +500,7 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 0., min: 0.,
max: 100., max: 100.,
step: 1.,
value: settings.volume.music_volume, value: settings.volume.music_volume,
}), }),
); );
@ -487,6 +509,7 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {
min: 0., min: 0.,
max: 100., max: 100.,
step: 1.,
value: settings.volume.announcer_volume, value: settings.volume.announcer_volume,
}), }),
); );

View File

@ -16,6 +16,8 @@ pub struct SliderContainer {
pub min: f64, pub min: f64,
#[export] #[export]
pub max: f64, pub max: f64,
#[export]
pub step: f64,
last_value: f64, last_value: f64,
@ -30,6 +32,7 @@ impl IHBoxContainer for SliderContainer {
if let Some(slider) = &mut self.slider { if let Some(slider) = &mut self.slider {
slider.set_min(self.min); slider.set_min(self.min);
slider.set_max(self.max); slider.set_max(self.max);
slider.set_step(self.step);
if self.last_value != self.value { if self.last_value != self.value {
slider.set_value(self.value); slider.set_value(self.value);
} }