pub use self::lens::{ChromaticAberrationFactors, Lens};
mod lens;
use crate::core::math;
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct Properties {
pub visuals: Visuals,
pub display_info: DisplayInfo,
}
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub enum Visuals {
LensBased {
lens_separation: Distance,
lens_to_eye_distance: Distance,
screen_to_lens_distance: Distance,
left: Lens,
right: Lens,
},
}
#[derive(Clone, Debug, PartialOrd)]
pub struct DisplayInfo {
pub monitor_name: String,
pub physical_size_millimeters: Option<(u32, u32)>,
pub supported_resolutions: Vec<(u32, u32)>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Distance { pub(crate) micrometers: u64 }
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct FieldOfView {
pub horizontal: FieldOfViewAxis,
pub vertical: FieldOfViewAxis,
}
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct FieldOfViewAxis {
pub minimum_degrees: math::Scalar,
pub maximum_degrees: math::Scalar,
pub recommended_degrees: math::Scalar,
}
impl DisplayInfo {
pub fn find_physical_monitor<P,I,F>(&self,
monitors: I,
f: F)
-> Option<P>
where P: Sized,
I: IntoIterator<Item=P>,
F: Fn(&P) -> DisplayInfo {
monitors.into_iter().find(|monitor| f(monitor) == *self)
}
}
impl Distance {
pub fn from_micrometers(micrometers: u64) -> Self {
Distance { micrometers }
}
pub fn from_millimeters(millimeters: u64) -> Self {
Distance::from_micrometers(millimeters * 1_000)
}
pub fn micrometers(&self) -> u64 { self.micrometers }
pub fn millimeters(&self) -> u64 { self.micrometers() / 1_000 }
}
impl PartialEq for DisplayInfo {
fn eq(&self, other: &Self) -> bool {
{
match (self.physical_size_millimeters, other.physical_size_millimeters) {
(Some(a), Some(b)) => if a != b { return false },
_ => (),
}
if !is_subset(&self.supported_resolutions, &other.supported_resolutions) &&
!is_subset(&other.supported_resolutions, &self.supported_resolutions) {
return false;
}
}
true
}
}
fn is_subset(a: &[(u32, u32)], subset_of: &[(u32, u32)]) -> bool {
a.iter().all(|t| subset_of.contains(t))
}
impl Eq for DisplayInfo { }