use bevy_ecs::prelude::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct DisplayResolution {
pub width: u32,
pub height: u32,
}
impl DisplayResolution {
#[must_use]
pub const fn new(width: u32, height: u32) -> Self {
Self { width, height }
}
#[must_use]
pub fn aspect(self) -> f32 {
self.width as f32 / self.height as f32
}
}
pub static STANDARD_RESOLUTIONS: &[DisplayResolution] = &[
DisplayResolution::new(640, 480),
DisplayResolution::new(800, 600),
DisplayResolution::new(1024, 768),
DisplayResolution::new(1152, 864),
DisplayResolution::new(1280, 720),
DisplayResolution::new(1280, 800),
DisplayResolution::new(1280, 960),
DisplayResolution::new(1366, 768),
DisplayResolution::new(1400, 1050),
DisplayResolution::new(1440, 900),
DisplayResolution::new(1600, 900),
DisplayResolution::new(1600, 1200),
DisplayResolution::new(1680, 1050),
DisplayResolution::new(1920, 1080),
DisplayResolution::new(1920, 1200),
DisplayResolution::new(2560, 1080),
DisplayResolution::new(2560, 1440),
DisplayResolution::new(2560, 1600),
DisplayResolution::new(3440, 1440),
DisplayResolution::new(3840, 2160),
DisplayResolution::new(5120, 2160),
DisplayResolution::new(5120, 2880),
DisplayResolution::new(7680, 4320),
];
#[derive(Resource, Default)]
pub struct AvailableResolutions(pub Vec<DisplayResolution>);
impl AvailableResolutions {
pub fn iter(&self) -> impl Iterator<Item = &DisplayResolution> {
self.0.iter()
}
#[must_use]
pub fn for_aspect(&self, target_aspect: f32, tolerance: f32) -> Vec<DisplayResolution> {
self.0
.iter()
.filter(|r| (r.aspect() - target_aspect).abs() <= tolerance)
.copied()
.collect()
}
}
#[must_use]
pub fn resolutions_for_aspect(target_aspect: f32, tolerance: f32) -> Vec<DisplayResolution> {
STANDARD_RESOLUTIONS
.iter()
.filter(|r| (r.aspect() - target_aspect).abs() <= tolerance)
.copied()
.collect()
}
#[derive(Debug, Clone, Copy, PartialEq, Resource)]
pub struct WindowSettings {
pub width: u32,
pub height: u32,
pub is_fullscreen: bool,
pub vsync: bool,
pub cursor_locked: bool,
pub target_aspect: Option<f32>,
pub allow_resize: bool,
}
impl WindowSettings {
#[must_use]
pub const fn new(width: u32, height: u32, vsync: bool) -> Self {
Self {
width,
height,
is_fullscreen: false,
vsync,
cursor_locked: false,
target_aspect: None,
allow_resize: true,
}
}
}