summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2023-01-25 19:05:23 -0500
committerpommicket <pommicket@gmail.com>2023-01-25 19:05:23 -0500
commit68cf8354fc0c0bcfe9584b84e9ecae21980f0042 (patch)
tree305891b3f8b3d49e89abc970d1d3050c657291a3
parent162f782d81e780f384054cf481b657e9ceab3c18 (diff)
new needs_redraw system
-rw-r--r--README.md3
-rw-r--r--settings.txt2
-rw-r--r--src/fshader_main.glsl35
-rw-r--r--src/fshader_post.glsl50
-rw-r--r--src/main.rs61
5 files changed, 92 insertions, 59 deletions
diff --git a/README.md b/README.md
index 2760c8f..4934f31 100644
--- a/README.md
+++ b/README.md
@@ -40,4 +40,7 @@ a263736466a167436f6d706f736583a1695472616e736c61746583a163463332fa3f4811e4a16346
a263736466a167436f6d706f736583a166526f7461746583a163463332fa3f76cab2a163463332fa3d81cad0a163463332fa3f76ebd4a1634d696e82a167436f6d706f736583675369676d6f6964a1634d696e82a1634d697883a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3e5a3e68684964656e74697479a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3f46ade4684964656e74697479a163463332fa3f551da4a1634d696e82a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3f306be8684964656e74697479a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3ca99ac0684964656e74697479684964656e74697479a167436f6d706f736583a16f496e66696e6974654d6972726f7273a163463332fa3e9febeca167436f6d706f736583a16f496e66696e6974654d6972726f7273a163463332fa3ee05424a167436f6d706f736583675369676d6f6964a1634d696e82a166537068657265a163463332fa3e16dcf0a166537068657265a163463332fa3f48f0dc684964656e74697479684964656e74697479684964656e74697479684964656e746974796e636f6c6f725f66756e6374696f6ea167436f6d706f736582a16353696ea163463332fa3f1c2a8e675369676d6f6964
a263736466a1634d696e82a1634d696e82a166537068657265a163463332fa3f2365aca1634d697883a167436f6d706f736583a16641726374616ea163463332fa3eb04a5ca167436f6d706f736583675369676d6f6964a169536d6f6f74684d696e82a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3eeb25b8684964656e74697479a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3f10d6a2684964656e74697479684964656e74697479684964656e74697479a165546f727573a266726164697573a163463332fa3d9099f069746869636b6e657373a163463332fa3e00b102a163463332fa3f06b5a2a1634d696e82a165546f727573a266726164697573a163463332fa40121b0169746869636b6e657373a163463332fa3e32f4faa1634d697883a16443756265a163463332fa3f7f9dc8a1634d697883a165546f727573a266726164697573a163463332fa3f9286e369746869636b6e657373a163463332fa3d8a3f27a167436f6d706f736583a167436f6d706f736582a167436f6d706f736582684964656e74697479684964656e74697479a16f496e66696e6974654d6972726f7273a163463332fa3ea62688a168426f784672616d65a26473697a65a163463332fa3fc0fb4969746869636b6e657373a163463332fa3e472462684964656e74697479a163463332fa3f69a73ea163463332fa3f5b9c9e6e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3ef4ea8c
a263736466a169536d6f6f74684d696e82a1634d696e82a167436f6d706f736583a167436f6d706f736582a16641726374616ea163463332fa3e6d7230a1695472616e736c61746583a163463332fa3e7262f8a163463332fa3eece0eca163463332fa3f49c42ca168426f784672616d65a26473697a65a163463332fa3ff3ee1169746869636b6e657373a163463332fa3df6dfed684964656e74697479a167436f6d706f736583a16f496e66696e6974654d6972726f7273a163463332fa3f2a2de8a165546f727573a266726164697573a163463332fa3fc93f1e69746869636b6e657373a163463332fa3e0fa700684964656e74697479a169536d6f6f74684d696e82a169536d6f6f74684d696e82a1634d696e82a169536d6f6f74684d696e82a167436f6d706f736583675369676d6f6964a1634d696e82a166537068657265a163463332fa3e0586b0a166537068657265a163463332fa3f4d6214684964656e74697479a167436f6d706f736583a167436f6d706f736582684964656e74697479684964656e74697479a1634d697883a166537068657265a163463332fa3f5c46e6a166537068657265a163463332fa3f3f4896a163463332fa3f10ba30684964656e74697479a166537068657265a163463332fa3ef3b604a167436f6d706f736583a165537153696ea163463332fa3ef1bfb8a1634d697883a1634d697883a168426f784672616d65a26473697a65a163463332fa3ee4801069746869636b6e657373a163463332fa3dc84d37a168426f784672616d65a26473697a65a163463332fa4019d5d269746869636b6e657373a163463332fa3d5d0307a163463332fa3eb7554ca167436f6d706f736583a165537153696ea163463332fa3f31c33ca167436f6d706f736583684964656e74697479a166537068657265a163463332fa3e7db3c0684964656e74697479684964656e74697479a163463332fa3f3176c0684964656e74697479a165546f727573a266726164697573a163463332fa3f253f0c69746869636b6e657373a163463332fa3c96c48d6e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3ea219f4
+a263736466a1634d696e82a1634d697883a1634d697883a16c564c696e655365676d656e74a16454696d6582fa3c8b2f18fa3f3678a6a168547269507269736d82a16454696d6582fabdb2b99afa3f656318a16454696d6582fabd37e33afa3f1b42c6a16454696d6582fabd3dfe1afa3e32b6b0a167436f6d706f736583a16f496e66696e6974654d6972726f7273a16454696d6582fa3d9f9eb1fa3ddac4e0a168547269507269736d82a16454696d6582fa3c1192e8fa3eca5188a16454696d6582fa3d2c25dafa3e9d72f4684964656e74697479a16454696d6582fa3d837b71fa3e73be30a167436f6d706f73658366576962626c79a167436f6d706f73658366576962626c79a16843796c696e64657282a16454696d6582fabd96901dfa3ed15cfca16454696d6582fa3d7cd81afa3dadb7d0684964656e74697479684964656e746974796e636f6c6f725f66756e6374696f6ea1634d697883a1634d697883a167436f6d706f736582a166526f7461746583a16454696d6582fa3db2bf97fa3ef7ee74a16454696d6582fa3c29fab0fa3e31fb78a16454696d6582fabc315b80fa3f0f75baa16353696ea16454696d6582fabc3cdc68fa3f2c1a1aa16353696ea16454696d6582fa3d947937fa3efcb818a16454696d6582fa3d8cd239fa3d6083e066576962626c79a16454696d6582fabd734040fa3f4e39e8
+a263736466a16653696e436f7382a16c564c696e655365676d656e74a16454696d6582fabd6f12dafa3f601600a167436f6d706f736583a167436f6d706f736582a1695472616e736c61746583a16454696d6582fabd1eb54dfa3e66a640a16454696d6582fabd8a51a4fa3f25632aa16454696d6582fabbadc0a0fa3f0f7794a1695472616e736c61746583a16454696d6582fa3da911fdfa3ea7fdd4a16454696d6582fa3d04bdf2fa3f6cae42a16454696d6582fa3ce2d374fa3f3716f6a1634d696e82a168547269507269736d82a16454696d6582fa3dab2981fa3f3b4b96a16454696d6582fabd7c9badfa3f7558faa165546f727573a266726164697573a16454696d6582fabdaad43efa3e84f9e469746869636b6e657373a16454696d6582fabc61bdcdfa3c4d3880684964656e746974796e636f6c6f725f66756e6374696f6ea1634d697883a166526f7461746583a16454696d6582fabdc72393fa3e34f9d8a16454696d6582fabc813218fa3f675278a16454696d6582fa3ca4e728fa3f59b236a167436f6d706f736582a16353696ea16454696d6582fabdbce95dfa3f374964a16f496e66696e6974654d6972726f7273a16454696d6582fa3c50ad30fa3e06c2e8a16454696d6582fabd549d60fa3f2584a8
+a263736466a16653696e436f7382a167436f6d706f736583a165537153696ea16454696d6582fa3be21a30fa3ef85110a169536d6f6f74684d696e82a16443756265a16454696d6582fabcbd91a8fa3ec68354a166537068657265a16454696d6582fabd8d45cafa3f45f8c8684964656e74697479a1634d696e82a169536d6f6f74684d696e82a166537068657265a16454696d6582fa3b6a4c00fa3f476626a168426f784672616d65a26473697a65a16454696d6582fa3e458346fa4007694a69746869636b6e657373a16454696d6582fa3c0dac9bfa3daf70a7a1634d697883a168426f784672616d65a26473697a65a16454696d6582fabd26ef4efa4017a0e269746869636b6e657373a16454696d6582fabc003f71fa3e4706d0a16443756265a16454696d6582fa3d8330c3fa3f43448aa16454696d6582fabd565d0dfa3f3b8da66e636f6c6f725f66756e6374696f6ea167436f6d706f736582a16641726374616ea16454696d6582fa3d17bdc2fa3f09ec7ca167436f6d706f736582a166526f7461746583a16454696d6582fabce58528fa3e8bdbf0a16454696d6582fa3d06c2a6fa3f05c282a16454696d6582fa3d13eaaefa3e411148a166526f7461746583a16454696d6582fa3cc0bdd8fa3efc278ca16454696d6582fa3cf95bc4fa3f7868faa16454696d6582fa3d3f2342fa3f585f32
```
diff --git a/settings.txt b/settings.txt
index e179772..5bd7732 100644
--- a/settings.txt
+++ b/settings.txt
@@ -12,7 +12,7 @@ sdf-length 600
color-length 300
# max raymarching iterations
# making this bigger will make boundaries less "blurry", but will require more gpu computation
-max-iterations 30
+max-iterations 50
# raymarching distance threshold
# (how close to distance 0 should the SDF get before we draw?)
distance-threshold 0.02
diff --git a/src/fshader_main.glsl b/src/fshader_main.glsl
index 2a6864a..9a4ce52 100644
--- a/src/fshader_main.glsl
+++ b/src/fshader_main.glsl
@@ -13,14 +13,6 @@ uniform ivec2 u_antialiasing;
uniform int u_iterations;
uniform float u_aspect_ratio;
uniform vec2 u_screen_size;
-uniform vec4 u_flash;
-uniform int u_flash_icon;
-
-#define ICON_COPY 1
-#define ICON_PLAY 2
-#define ICON_PAUSE 3
-#define ICON_REWIND 4
-#define ICON_SCREENSHOT 5
%COMMON%
%SDF%
@@ -71,13 +63,6 @@ vec3 normal(vec3 p)
return normalize(sdf_normal);
}
-bool play_icon(vec2 pos) {
- vec2 a = abs(pos);
- if (a.x >= 0.5 || a.y >= 0.5)
- return false;
- return a.y < 0.25 + 0.5 * pos.x;
-}
-
void main() {
float min_dist = 10.;
vec2 inv_screen_size = 1.0 / u_screen_size;
@@ -128,26 +113,6 @@ void main() {
}
}
final_color *= 1.0 / (AA_X * AA_Y);
- bool icon = false;
- switch (u_flash_icon) {
- case 0: break;
- case ICON_COPY:
- case ICON_SCREENSHOT:
- icon = abs(pos.x) > u_aspect_ratio - 0.1 || abs(pos.y) > 0.9;
- break;
- case ICON_PLAY:
- icon = play_icon(pos);
- break;
- case ICON_REWIND:
- icon = play_icon(vec2(-pos.x, pos.y));
- break;
- case ICON_PAUSE:
- vec2 p = abs(pos);
- icon = p.x >= 0.1 && p.x <= 0.4 && p.y <= 0.5;
- break;
- }
- if (icon)
- final_color = mix(final_color, u_flash.xyz, u_flash.w);
gl_FragColor = vec4(final_color, 1.0);
}
diff --git a/src/fshader_post.glsl b/src/fshader_post.glsl
index 2c26d95..c540f0d 100644
--- a/src/fshader_post.glsl
+++ b/src/fshader_post.glsl
@@ -5,20 +5,62 @@ uniform float u_aspect_ratio;
uniform float u_menu_scale;
uniform vec2 u_highlight_button;
IN vec2 uv;
+uniform vec4 u_flash;
+uniform int u_flash_icon;
+
+#define ICON_COPY 1
+#define ICON_PLAY 2
+#define ICON_PAUSE 3
+#define ICON_REWIND 4
+#define ICON_SCREENSHOT 5
+
+bool play_icon(vec2 pos) {
+ vec2 a = abs(pos);
+ if (a.x >= 0.5 || a.y >= 0.5)
+ return false;
+ return a.y < 0.25 + 0.5 * pos.x;
+}
+
+bool get_icon(vec2 pos) {
+ bool icon = false;
+ switch (u_flash_icon) {
+ case 0: break;
+ case ICON_COPY:
+ case ICON_SCREENSHOT:
+ icon = abs(pos.x) > u_aspect_ratio - 0.1 || abs(pos.y) > 0.9;
+ break;
+ case ICON_PLAY:
+ icon = play_icon(pos);
+ break;
+ case ICON_REWIND:
+ icon = play_icon(vec2(-pos.x, pos.y));
+ break;
+ case ICON_PAUSE:
+ vec2 p = abs(pos);
+ icon = p.x >= 0.1 && p.x <= 0.4 && p.y <= 0.5;
+ break;
+ }
+ return icon;
+}
void main() {
+ vec3 color = texture(u_main_texture, uv).xyz;
+
+ if (get_icon((uv * 2.0 - 1.0) * vec2(u_aspect_ratio, 1.0)))
+ color = mix(color, u_flash.xyz, u_flash.w);
+
// amount to darken screen by when paused
float pause_darkening = 0.5;
- vec4 color = texture(u_main_texture, uv) * (1.0 - pause_darkening * u_paused);
+ color *= 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;
menu_uv = menu_uv * vec2(u_aspect_ratio, 1.0);
menu_uv = 0.5 * menu_uv + 0.5;
float menu_pixel = u_paused * texture(u_menu_texture, menu_uv).x;
- vec4 menu_color = vec4(1.0);
+ vec3 menu_color = vec3(1.0);
if (uv.y >= u_highlight_button.x && uv.y <= u_highlight_button.y) {
- menu_color = vec4(1.0, 0.5, 0.0, 1.0); // highlight button
+ menu_color = vec3(1.0, 0.5, 0.0); // highlight button
}
color = mix(color, menu_color, menu_pixel);
- gl_FragColor = clamp(color, 0.0, 1.0);
+ gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);
}
diff --git a/src/main.rs b/src/main.rs
index c13574a..1a7c726 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,5 @@
/*
@TODO:
-- 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
@@ -104,9 +103,16 @@ impl View {
fn unpause(&mut self, rewind: bool) {
self.time_speed = if rewind { -1.0 } else { 1.0 };
}
-
- fn pass_time(&mut self, dt: f64) {
- self.time += self.time_speed * dt;
+
+ /// returns true if the current time is modified
+ fn pass_time(&mut self, dt: f64) -> bool {
+ let dt = self.time_speed * dt;
+ if dt == 0.0 {
+ false
+ } else {
+ self.time += dt;
+ true
+ }
}
fn yaw_by(&mut self, yaw: f32) {
@@ -280,6 +286,9 @@ struct State {
fullscreen: bool,
esc_menu: bool,
quit: bool,
+ /// set to true when the view/window size/settings/etc. is changed,
+ /// and we need to redraw the SDF
+ needs_redraw: bool,
frame_time: Instant,
programs: Programs,
config: sdf::SceneConfig,
@@ -408,6 +417,7 @@ impl State {
test_array,
esc_menu: false,
quit: false,
+ needs_redraw: true,
post_array,
scene_list,
settings,
@@ -470,9 +480,10 @@ impl State {
self.view = initial_view;
}
Err(e) => {
- eprintln!("Error: {e}")
+ eprintln!("Error: {e}");
}
- };
+ }
+ self.needs_redraw = true;
}
fn flash(&mut self, icon: Icon) {
@@ -539,8 +550,6 @@ impl State {
);
window.uniform3x3f("u_rotation", view.rotation().as_slice());
window.uniform3f_slice("u_translation", view.pos.as_slice());
- window.uniform4f_color("u_flash", self.flash);
- window.uniform1i("u_flash_icon", self.flash_icon as i32);
self.main_array.draw();
}
@@ -555,9 +564,11 @@ impl State {
window.use_program(&self.programs.post);
window.active_texture(0, &self.main_framebuffer_texture);
window.active_texture(1, &self.menu_texture);
- window.uniform1f("u_paused", if self.esc_menu { 1.0 } else { 0.0 });
window.uniform_texture("u_main_texture", 0);
window.uniform_texture("u_menu_texture", 1);
+ window.uniform1f("u_paused", if self.esc_menu { 1.0 } else { 0.0 });
+ window.uniform4f_color("u_flash", self.flash);
+ window.uniform1i("u_flash_icon", self.flash_icon as i32);
window.uniform1f(
"u_aspect_ratio",
render_resolution.0 as f32 / render_resolution.1 as f32,
@@ -639,7 +650,9 @@ impl State {
// returns false if we should quit
fn frame(&mut self) -> bool {
- self.settings.reload_if_modified();
+ if self.settings.reload_if_modified() {
+ self.needs_redraw = true;
+ }
if let Some(max_framerate) = self.settings.get_f32("max-framerate") {
if max_framerate > 0.0 {
@@ -743,6 +756,7 @@ impl State {
.yaw_by(-xrel as f32 * mouse_sensitivity * frame_dt);
self.view
.pitch_by(-yrel as f32 * mouse_sensitivity * frame_dt);
+ self.needs_redraw = true;
}
}
MouseButtonDown { button: MouseButton::Left, x, y, .. } => {
@@ -757,7 +771,9 @@ impl State {
}
if !self.esc_menu {
- self.view.pass_time(frame_dt.into());
+ if self.view.pass_time(frame_dt.into()) {
+ self.needs_redraw = true;
+ }
}
if !self.esc_menu {
@@ -809,6 +825,7 @@ impl State {
let dt = dt * speed_multiplier;
self.view.pause();
self.view.time += f64::from(dt);
+ self.needs_redraw = true;
}
let motion = Vec3::new(dx, dy, dz);
@@ -817,10 +834,14 @@ impl State {
let motion = motion * move_amount;
let motion = self.view.rotation() * motion;
self.view.pos += motion;
+ self.needs_redraw = true;
+ }
+
+ if dl != 0.0 {
+ let level_set_amount = 1.0 * speed_multiplier;
+ self.view.level_set += dl * level_set_amount;
+ self.needs_redraw = true;
}
-
- let level_set_amount = 1.0 * speed_multiplier;
- self.view.level_set += dl * level_set_amount;
}
let render_resolution = self.get_render_resolution();
@@ -842,13 +863,15 @@ impl State {
&self.main_framebuffer_texture,
);
self.main_framebuffer_size = render_resolution;
+ self.needs_redraw = true;
}
-
- // if the escape menu is open, stop rendering the SDF.
- // the framebuffer contents will stay the same.
- // this lowers GPU usage (and increases framerate).
- if !self.esc_menu {
+
+ // this needs_redraw check stops the SDF from being rendered when
+ // the escape menu is open for example (unless window dimensions/settings are changed)
+ // this reduces GPU usage and gives a higher framerate
+ if self.needs_redraw {
self.render_main();
+ self.needs_redraw = false;
}
self.flash.a = f32::max(self.flash.a - frame_dt * (2.0 - 1.0 * self.flash.a), 0.0);