diff --git a/src/main.rs b/src/main.rs index e5c3b57..4823996 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ mod model; mod zeroes; mod worker; mod physics; +mod settings; mod framework; mod primitives; mod instruction; diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..dca1763 --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,101 @@ +struct Ratio{ + ratio:f64, +} +enum DerivedFov{ + FromScreenAspect, + FromAspect(Ratio), +} +enum Fov{ + 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} + } +} + +enum Sensitivity{ + 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, +} + +/* +//sensitivity is raw input dots (i.e. dpi = dots per inch) to radians conversion factor +sensitivity_x=0.001 +sensitivity_y_from_x_ratio=1 +Sensitivity::DeriveY{x:0.0.001,y:DerivedSensitivity{ratio:1.0}} +*/ + +pub fn read_user_settings()->UserSettings{ + let mut cfg=configparser::ini::Ini::new(); + if let Ok(_)=cfg.load("settings.conf"){ + let (cfg_fov_x,cfg_fov_y)=(cfg.getfloat("camera","fov_x"),cfg.getfloat("camera","fov_y")); + 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_y_from_x_ratio))=cfg.getfloat("camera","fov_y_from_x_ratio"){ + DerivedFov::FromAspect(Ratio{ratio:fov_y_from_x_ratio}) + }else{ + DerivedFov::FromScreenAspect + } + }, + (Ok(None),Ok(Some(fov_y)))=>Fov::DeriveX{ + x:if let Ok(Some(fov_x_from_y_ratio))=cfg.getfloat("camera","fov_x_from_y_ratio"){ + DerivedFov::FromAspect(Ratio{ratio:fov_x_from_y_ratio}) + }else{ + DerivedFov::FromScreenAspect + }, + y:fov_y, + }, + _=>{ + Fov::default() + }, + }; + let (cfg_sensitivity_x,cfg_sensitivity_y)=(cfg.getfloat("camera","sensitivity_x"),cfg.getfloat("camera","sensitivity_y")); + 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_y_from_x_ratio))=cfg.getfloat("camera","sensitivity_y_from_x_ratio"){sensitivity_y_from_x_ratio}else{1.0} + } + }, + (Ok(None),Ok(Some(sensitivity_y)))=>Sensitivity::DeriveX{ + x:Ratio{ + ratio:if let Ok(Some(sensitivity_x_from_y_ratio))=cfg.getfloat("camera","sensitivity_x_from_y_ratio"){sensitivity_x_from_y_ratio}else{1.0} + }, + y:sensitivity_y, + }, + _=>{ + Sensitivity::default() + }, + }; + UserSettings{ + fov, + sensitivity, + } + }else{ + UserSettings::default() + } +} \ No newline at end of file