From 726a66d9553c77135dee49900fe3fb6eb0f5325a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 17:55:02 -0700 Subject: [PATCH] write it --- src/settings.rs | 96 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 82 insertions(+), 14 deletions(-) diff --git a/src/settings.rs b/src/settings.rs index 10d7391..ee5cfdc 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,33 +1,101 @@ +struct Ratio{ + ratio:f64, +} enum DerivedFov{ FromScreenAspect, - FromAspect{num:u32,den:u32}, + FromAspect(Ratio), } enum Fov{ - Exactly{x:f32,y:f32}, - DeriveX{x:DerivedFov,y:f32}, - DeriveY{x:f32,y:DerivedFov}, + Exactly{x:f64,y:f64}, + DeriveX{x:DerivedFov,y:f64}, + DeriveY{x:f64,y:DerivedFov}, +} +impl Default for Fov{ + fn default() -> Self { + Fov::DeriveX{x:DerivedFov::FromScreenAspect,y:1.0} + } } -struct DerivedSensitivity{ - ratio:f32, -} enum Sensitivity{ - Exactly{x:f32,y:f32}, - DeriveX{x:DerivedSensitivity,y:f32}, - DeriveY{x:f32,y:DerivedSensitivity}, + Exactly{x:f64,y:f64}, + DeriveX{x:Ratio,y:f64}, + DeriveY{x:f64,y:Ratio}, +} +impl Default for Sensitivity{ + fn default() -> Self { + Sensitivity::DeriveY{x:0.001,y:Ratio{ratio:1.0}} + } } +#[derive(Default)] pub struct UserSettings{ fov:Fov, sensitivity:Sensitivity, } -pub fn read_user_settings(){ - let mut sensitivity=1.0/1024.0; +/* +//sensitivity is raw input dots (i.e. dpi = dots per inch) to radians conversion factor +sensitivity_x=0.001 +sensitivity_mul_x_to_y=1 +Sensitivity::DeriveY{x:0.0.001,y:DerivedSensitivity{ratio:1.0}} +*/ + +pub fn read_user_settings()->UserSettings{ if let Ok(file)=std::fs::File::open("settings.conf"){ let cfg=configparser::ini::Ini::new(); - if let Ok(Some(sens))=cfg.getfloat("user","sensitivity_x"){ - sensitivity=sens; + let (cfg_fov_x,cfg_fov_y)=(cfg.getfloat("camera","fov_x"),cfg.getfloat("camera","fov_x")); + let fov=match(cfg_fov_x,cfg_fov_y){ + (Ok(Some(fov_x)),Ok(Some(fov_y)))=>Fov::Exactly { + x:fov_x, + y:fov_y + }, + (Ok(Some(fov_x)),Ok(None))=>Fov::DeriveY{ + x:fov_x, + y:if let Ok(Some(fov_mul_x_to_y))=cfg.getfloat("camera","fov_mul_x_to_y"){ + DerivedFov::FromAspect(Ratio{ratio:fov_mul_x_to_y}) + }else{ + DerivedFov::FromScreenAspect + } + }, + (Ok(None),Ok(Some(fov_y)))=>Fov::DeriveX{ + x:if let Ok(Some(fov_mul_y_to_x))=cfg.getfloat("camera","fov_mul_y_to_x"){ + DerivedFov::FromAspect(Ratio{ratio:fov_mul_y_to_x}) + }else{ + DerivedFov::FromScreenAspect + }, + y:fov_y, + }, + _=>{ + Fov::default() + }, + }; + let (cfg_sensitivity_x,cfg_sensitivity_y)=(cfg.getfloat("camera","sensitivity_x"),cfg.getfloat("camera","sensitivity_x")); + let sensitivity=match(cfg_sensitivity_x,cfg_sensitivity_y){ + (Ok(Some(sensitivity_x)),Ok(Some(sensitivity_y)))=>Sensitivity::Exactly { + x:sensitivity_x, + y:sensitivity_y + }, + (Ok(Some(sensitivity_x)),Ok(None))=>Sensitivity::DeriveY{ + x:sensitivity_x, + y:Ratio{ + ratio:if let Ok(Some(sensitivity_mul_x_to_y))=cfg.getfloat("camera","sensitivity_mul_x_to_y"){sensitivity_mul_x_to_y}else{1.0} + } + }, + (Ok(None),Ok(Some(sensitivity_y)))=>Sensitivity::DeriveX{ + x:Ratio{ + ratio:if let Ok(Some(sensitivity_mul_y_to_x))=cfg.getfloat("camera","sensitivity_mul_y_to_x"){sensitivity_mul_y_to_x}else{1.0} + }, + y:sensitivity_y, + }, + _=>{ + Sensitivity::default() + }, + }; + UserSettings{ + fov, + sensitivity, } + }else{ + UserSettings::default() } } \ No newline at end of file