Add Settings with fullscreen and windowed options, a config file
(settings.toml) to persist settings, fix a bug in platform code where innner window size wasn't updated on resize, various other tweaks
This commit is contained in:
parent
b17a7636d8
commit
f5a16213fa
10 changed files with 277 additions and 19 deletions
|
|
@ -7,7 +7,9 @@ use rapier3d::prelude::ColliderBuilder;
|
|||
use winit::event::{Event, WindowEvent};
|
||||
use systems::debug_camera::FPSDebugCameraSystem;
|
||||
use crate::systems::common::should_draw_menu;
|
||||
use crate::systems::{KeybindsSystem, KinematicCharacterController, MenuSystem, PhysicsSystem};
|
||||
use crate::systems::{
|
||||
DisplaySettings, KeybindsSystem, KinematicCharacterController, MenuSystem, PhysicsSystem
|
||||
};
|
||||
|
||||
const TEST_GLTF: &str = "sphere.glb";
|
||||
const PLANE_GLTF: &str = "plane.glb";
|
||||
|
|
@ -97,23 +99,21 @@ impl System for MainSystem {
|
|||
InputState,
|
||||
)>().unwrap();
|
||||
|
||||
if should_draw_menu(scene) {
|
||||
let mut egui_queue = pctx.egui_queue.borrow_mut();
|
||||
let time_ctx = pctx.time_ctx.clone();
|
||||
let mut character_pos = Vec3::ZERO;
|
||||
for (_ent, (tr, ch_component)) in scene.world.query::<(&Transform, &CharacterBodyComponent)>().iter() {
|
||||
character_pos = tr.translation;
|
||||
}
|
||||
egui_queue.queue(move |egui_ctx| {
|
||||
egui::Window::new("Debug").show(egui_ctx, |ui| {
|
||||
ui.label("Hello World!");
|
||||
ui.label(format!("Frame Delta: {}", time_ctx.frame_dt));
|
||||
ui.label(format!("Fixed Delta: {}", time_ctx.fixed_dt));
|
||||
ui.label(format!("FPS: {}", 1.0 / time_ctx.frame_dt));
|
||||
ui.label(format!("Character POS: {}", character_pos));
|
||||
});
|
||||
});
|
||||
let mut egui_queue = pctx.egui_queue.borrow_mut();
|
||||
let time_ctx = pctx.time_ctx.clone();
|
||||
let mut character_pos = Vec3::ZERO;
|
||||
for (_ent, (tr, ch_component)) in scene.world.query::<(&Transform, &CharacterBodyComponent)>().iter() {
|
||||
character_pos = tr.translation;
|
||||
}
|
||||
egui_queue.queue(move |egui_ctx| {
|
||||
egui::Window::new("Debug").show(egui_ctx, |ui| {
|
||||
ui.label("Hello World!");
|
||||
ui.label(format!("Frame Delta: {:.3}", time_ctx.frame_dt));
|
||||
ui.label(format!("Fixed Delta: {:.3}", time_ctx.fixed_dt));
|
||||
ui.label(format!("FPS: {:.3}", 1.0 / time_ctx.frame_dt));
|
||||
ui.label(format!("Character POS: {character_pos:.3}"));
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -124,6 +124,7 @@ fn main() {
|
|||
.add_system::<KinematicCharacterController>()
|
||||
.add_system::<FPSDebugCameraSystem>()
|
||||
.add_system::<MenuSystem>()
|
||||
.add_system::<DisplaySettings>()
|
||||
.add_system::<MainSystem>()
|
||||
.add_system::<UpdateAspectRatioSystem>()
|
||||
.add_scene(MAIN_SCENE_ID, Scene::new(MAIN_SCENE_ID.to_owned(), None))
|
||||
|
|
|
|||
92
game/src/systems/display_settings.rs
Normal file
92
game/src/systems/display_settings.rs
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
use std::sync::{Arc, Mutex};
|
||||
use raidillon_app::prelude::*;
|
||||
use crate::systems::common::should_draw_menu;
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
enum SettingsTab {
|
||||
Display,
|
||||
}
|
||||
|
||||
impl Default for SettingsTab {
|
||||
fn default() -> Self {
|
||||
SettingsTab::Display
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
struct DisplaySettingsUiState {
|
||||
selected_fullscreen_mode: WindowMode,
|
||||
active_tab: SettingsTab,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct DisplaySettings {
|
||||
ui_state: Arc<Mutex<DisplaySettingsUiState>>,
|
||||
}
|
||||
|
||||
impl System for DisplaySettings {
|
||||
fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) {
|
||||
let pctx = res.get_mut::<PlatformContext>().unwrap();
|
||||
|
||||
// sync the settings with UI state once
|
||||
if let (Ok(settings_handle), Ok(mut state)) = (pctx.settings.read(), self.ui_state.lock()) {
|
||||
state.selected_fullscreen_mode = settings_handle.display_settings.fullscreen_mode;
|
||||
}
|
||||
}
|
||||
|
||||
fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) {
|
||||
if should_draw_menu(scene) {
|
||||
let pctx = res.get_mut::<PlatformContext>().unwrap();
|
||||
let settings = pctx.settings.clone();
|
||||
let ui_state = self.ui_state.clone();
|
||||
|
||||
pctx.egui_queue.borrow_mut().queue(move |egui_ctx| {
|
||||
egui::Window::new("Settings").default_open(false).show(egui_ctx, |ui| {
|
||||
let mut state = ui_state.lock().unwrap();
|
||||
|
||||
ui.horizontal(|ui| {
|
||||
ui.selectable_value(&mut state.active_tab, SettingsTab::Display, "Display Settings");
|
||||
});
|
||||
ui.separator();
|
||||
|
||||
match state.active_tab {
|
||||
SettingsTab::Display => {
|
||||
ui.label("Window Mode");
|
||||
egui::ComboBox::from_id_salt("window_mode")
|
||||
.selected_text(window_mode_label(state.selected_fullscreen_mode))
|
||||
.show_ui(ui, |ui| {
|
||||
for mode in [
|
||||
WindowMode::Windowed,
|
||||
WindowMode::BorderlessFullscreen,
|
||||
] {
|
||||
ui.selectable_value(
|
||||
&mut state.selected_fullscreen_mode,
|
||||
mode,
|
||||
window_mode_label(mode),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
if ui.button("Apply").clicked() {
|
||||
if let Ok(mut settings_handle) = settings.write() {
|
||||
settings_handle.display_settings.fullscreen_mode = state.selected_fullscreen_mode;
|
||||
settings_handle.display_settings.dirty = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn window_mode_label(mode: WindowMode) -> &'static str {
|
||||
match mode {
|
||||
WindowMode::Windowed => "Windowed",
|
||||
WindowMode::BorderlessFullscreen => "Borderless Fullscreen",
|
||||
}
|
||||
}
|
||||
|
|
@ -4,8 +4,10 @@ mod keybinds;
|
|||
mod menu;
|
||||
pub mod debug_camera;
|
||||
pub mod common;
|
||||
mod display_settings;
|
||||
|
||||
pub use physics::PhysicsSystem;
|
||||
pub use kinematic_character_controller::KinematicCharacterController;
|
||||
pub use keybinds::KeybindsSystem;
|
||||
pub use menu::MenuSystem;
|
||||
pub use display_settings::DisplaySettings;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue