This commit is contained in:
Quaternions 2023-10-09 17:55:02 -07:00
parent 4864c12779
commit 726a66d955

View File

@ -1,33 +1,101 @@
struct Ratio{
ratio:f64,
}
enum DerivedFov{ enum DerivedFov{
FromScreenAspect, FromScreenAspect,
FromAspect{num:u32,den:u32}, FromAspect(Ratio),
} }
enum Fov{ enum Fov{
Exactly{x:f32,y:f32}, Exactly{x:f64,y:f64},
DeriveX{x:DerivedFov,y:f32}, DeriveX{x:DerivedFov,y:f64},
DeriveY{x:f32,y:DerivedFov}, 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{ enum Sensitivity{
Exactly{x:f32,y:f32}, Exactly{x:f64,y:f64},
DeriveX{x:DerivedSensitivity,y:f32}, DeriveX{x:Ratio,y:f64},
DeriveY{x:f32,y:DerivedSensitivity}, 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{ pub struct UserSettings{
fov:Fov, fov:Fov,
sensitivity:Sensitivity, 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"){ if let Ok(file)=std::fs::File::open("settings.conf"){
let cfg=configparser::ini::Ini::new(); let cfg=configparser::ini::Ini::new();
if let Ok(Some(sens))=cfg.getfloat("user","sensitivity_x"){ let (cfg_fov_x,cfg_fov_y)=(cfg.getfloat("camera","fov_x"),cfg.getfloat("camera","fov_x"));
sensitivity=sens; 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()
} }
} }