summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2023-01-25 18:46:10 -0500
committerpommicket <pommicket@gmail.com>2023-01-25 18:46:10 -0500
commit162f782d81e780f384054cf481b657e9ceab3c18 (patch)
tree988ab024a74eb9f278564bfa454f78f510a51219
parent71dc7b8671449f936a2875e6f8a9649131234fc4 (diff)
reload settings when settings file is changed
-rw-r--r--src/fshader_post.glsl2
-rw-r--r--src/main.rs56
2 files changed, 49 insertions, 9 deletions
diff --git a/src/fshader_post.glsl b/src/fshader_post.glsl
index 41b442f..2c26d95 100644
--- a/src/fshader_post.glsl
+++ b/src/fshader_post.glsl
@@ -8,7 +8,7 @@ IN vec2 uv;
void main() {
// amount to darken screen by when paused
- float pause_darkening = 0.75;
+ float pause_darkening = 0.5;
vec4 color = texture(u_main_texture, uv) * (1.0 - pause_darkening * u_paused);
vec2 menu_uv = (uv * 2.0 - 1.0) * vec2(1.0, -1.0);
menu_uv *= 1.0 / u_menu_scale;
diff --git a/src/main.rs b/src/main.rs
index b8f8329..c13574a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
/*
@TODO:
-- reload settings.txt when changed
+- redraw SDF even when paused if settings or window resolution is changed
- flash error on bad string (see @TODO(error handling))
- RnToRn functions (& add back in RToR)
- also add PerComponent(Box<RToR>,Box<RToR>,Box<RToR>) in R3ToR3
@@ -29,9 +29,9 @@ use nalgebra::{Matrix3, Matrix4, Rotation3, Vector3};
use sdf::ImportExport;
use std::{
collections::HashMap,
- fs::File,
+ fs::{self, File},
io::{prelude::*, BufReader, BufWriter},
- time::Instant,
+ time::{Instant, SystemTime}
};
use win::{ColorF32, ColorGrayscaleF32, ColorU8};
@@ -190,13 +190,34 @@ const TEST_WIDTH: u16 = 100;
#[derive(Default)]
struct Settings {
data: HashMap<String, f64>,
+ filename: String,
+ file_last_modified: Option<SystemTime>,
}
impl Settings {
- fn load(filename: &str) -> Result<Self, String> {
- let file = File::open(filename).map_err(|e| format!("{e}"))?;
+ fn get_modified_time(&self) -> Option<SystemTime> {
+ fs::metadata(&self.filename).ok()
+ .map(|m| m.modified().ok())
+ .flatten()
+ }
+
+ pub fn load(filename: &str) -> Result<Self, String> {
+ let mut settings = Self {
+ filename: filename.to_string(),
+ file_last_modified: None,
+ data: HashMap::new(),
+ };
+ settings.reload()?;
+ Ok(settings)
+ }
+
+ /// Reload settings from file. On failure, the settings are left unchanged.
+ fn reload(&mut self) -> Result<(), String> {
+ self.file_last_modified = self.get_modified_time();
+
+ let mut new_data = HashMap::new();
+ let file = File::open(&self.filename).map_err(|e| format!("{e}"))?;
let reader = BufReader::new(file);
- let mut data = HashMap::new();
for line in reader.lines() {
let full_line = line.map_err(|e| format!("{e}"))?;
let line = full_line.trim();
@@ -210,10 +231,27 @@ impl Settings {
let key = parts[0].trim();
let value = parts[1].trim();
let value: f64 = value.parse().map_err(|_| format!("bad number: {value}"))?;
- data.insert(key.to_string(), value);
+ new_data.insert(key.to_string(), value);
}
}
- Ok(Self { data })
+
+ self.data = new_data;
+ Ok(())
+ }
+
+ /// reload settings if the settings file was changed.
+ /// returns true if the settings were changed.
+ pub fn reload_if_modified(&mut self) -> bool {
+ if self.get_modified_time() != self.file_last_modified {
+ if self.reload().is_err() {
+ // we'll just keep the old settings.
+ false
+ } else {
+ true
+ }
+ } else {
+ false
+ }
}
fn get_f64(&self, key: &str) -> Option<f64> {
@@ -601,6 +639,8 @@ impl State {
// returns false if we should quit
fn frame(&mut self) -> bool {
+ self.settings.reload_if_modified();
+
if let Some(max_framerate) = self.settings.get_f32("max-framerate") {
if max_framerate > 0.0 {
let dt = self.frame_time.elapsed().as_secs_f32();