diff options
author | pommicket <pommicket@gmail.com> | 2022-12-17 21:58:40 -0500 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2022-12-17 21:58:40 -0500 |
commit | 298f893666e5626bacb6fc242f1059a5d1664294 (patch) | |
tree | 64b376144abf1fa4e946152247c73fd54642a9cd /src/main.rs | |
parent | f5521615ad2e18b1ab96429bd749570fa01c23c8 (diff) |
time, fullscreen
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index 5be2399..5837f7e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,5 @@ /* @TODO: -- bring time back, w pause/rewind/adjust time speed (start out paused?) -- fullscreen key - options for: - max framerate - mouse sensitivity @@ -9,11 +7,13 @@ - AA quality - # iterations, distance cutoff ---release--- +- [ and ] to move through time - switch framebuffer texture to grayscale - show that θ = σ(z) / sqrt(x² + y²) (x,y,z) → (x cosθ + y sinθ, y cosθ - x sinθ, z) is lipschitz continuous, & add it - feedback for copy/paste (flash screen or something) +- feedback for pause/unpause/rewind - Params instead of depth for GenRandom - allow multiple endpoints (cube & sphere & ...) - save seeds to a file then let user go back&forth through past sdfs @@ -41,6 +41,7 @@ a263736466a167436f6d706f736583a166526f7461746583a163463332fa3f76cab2a163463332fa a263736466a167436f6d706f736583a165537153696ea163463332fa3e784c98a1634d697883a166537068657265a163463332fa3ea1ce4ca1634d696e82a166537068657265a163463332fa3f55f124a167436f6d706f736583675369676d6f6964a166537068657265a163463332fa3ef84fb0684964656e74697479a163463332fa3d2f72c0684964656e746974796e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3e9d85d0 a263736466a1634d696e82a1634d696e82a166537068657265a163463332fa3f2365aca1634d697883a167436f6d706f736583a16641726374616ea163463332fa3eb04a5ca167436f6d706f736583675369676d6f6964a169536d6f6f74684d696e82a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3eeb25b8684964656e74697479a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3f10d6a2684964656e74697479684964656e74697479684964656e74697479a165546f727573a266726164697573a163463332fa3d9099f069746869636b6e657373a163463332fa3e00b102a163463332fa3f06b5a2a1634d696e82a165546f727573a266726164697573a163463332fa40121b0169746869636b6e657373a163463332fa3e32f4faa1634d697883a16443756265a163463332fa3f7f9dc8a1634d697883a165546f727573a266726164697573a163463332fa3f9286e369746869636b6e657373a163463332fa3d8a3f27a167436f6d706f736583a167436f6d706f736582a167436f6d706f736582684964656e74697479684964656e74697479a16f496e66696e6974654d6972726f7273a163463332fa3ea62688a168426f784672616d65a26473697a65a163463332fa3fc0fb4969746869636b6e657373a163463332fa3e472462684964656e74697479a163463332fa3f69a73ea163463332fa3f5b9c9e6e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3ef4ea8c a263736466a169536d6f6f74684d696e82a1634d696e82a167436f6d706f736583a167436f6d706f736582a16641726374616ea163463332fa3e6d7230a1695472616e736c61746583a163463332fa3e7262f8a163463332fa3eece0eca163463332fa3f49c42ca168426f784672616d65a26473697a65a163463332fa3ff3ee1169746869636b6e657373a163463332fa3df6dfed684964656e74697479a167436f6d706f736583a16f496e66696e6974654d6972726f7273a163463332fa3f2a2de8a165546f727573a266726164697573a163463332fa3fc93f1e69746869636b6e657373a163463332fa3e0fa700684964656e74697479a169536d6f6f74684d696e82a169536d6f6f74684d696e82a1634d696e82a169536d6f6f74684d696e82a167436f6d706f736583675369676d6f6964a1634d696e82a166537068657265a163463332fa3e0586b0a166537068657265a163463332fa3f4d6214684964656e74697479a167436f6d706f736583a167436f6d706f736582684964656e74697479684964656e74697479a1634d697883a166537068657265a163463332fa3f5c46e6a166537068657265a163463332fa3f3f4896a163463332fa3f10ba30684964656e74697479a166537068657265a163463332fa3ef3b604a167436f6d706f736583a165537153696ea163463332fa3ef1bfb8a1634d697883a1634d697883a168426f784672616d65a26473697a65a163463332fa3ee4801069746869636b6e657373a163463332fa3dc84d37a168426f784672616d65a26473697a65a163463332fa4019d5d269746869636b6e657373a163463332fa3d5d0307a163463332fa3eb7554ca167436f6d706f736583a165537153696ea163463332fa3f31c33ca167436f6d706f736583684964656e74697479a166537068657265a163463332fa3e7db3c0684964656e74697479684964656e74697479a163463332fa3f3176c0684964656e74697479a165546f727573a266726164697573a163463332fa3f253f0c69746869636b6e657373a163463332fa3c96c48d6e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3ea219f4 +a263736466a169536d6f6f74684d696e82a1634d697883a167436f6d706f736583a16641726374616ea16454696d6582fa3da97b73fa3eddf3cca167436f6d706f736583a16f496e66696e6974654d6972726f7273a16454696d6582fabb6c5400fa3c230980a167436f6d706f736583675369676d6f6964a167436f6d706f736583a167436f6d706f736582684964656e74697479684964656e74697479a16443756265a163463332fa3edf6864684964656e74697479684964656e74697479684964656e74697479684964656e74697479a166537068657265a163463332fa3ee32af4a16454696d6582fa3db4b603fa3ea79394a1634d697883a167436f6d706f736583a16353696ea163463332fa3de4e160a167436f6d706f736583a16f496e66696e6974654d6972726f7273a163463332fa3f7493fea168426f784672616d65a26473697a65a16454696d6582fa3e92c08dfa3ee156b869746869636b6e657373a16454696d6582fa3c74f202fa3df09e1d684964656e74697479684964656e74697479a1634d697883a16443756265a163463332fa3f5f8194a1634d696e82a1634d697883a167436f6d706f736583675369676d6f6964a168426f784672616d65a26473697a65a163463332fa3fe3873769746869636b6e657373a163463332fa3e3524e7684964656e74697479a1634d696e82a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3f50ffb8684964656e74697479a167436f6d706f736583684964656e74697479a166537068657265a163463332fa3c693200684964656e74697479a163463332fa3e5d3250a168426f784672616d65a26473697a65a163463332fa3fb01f6669746869636b6e657373a16454696d6582fabc5d9d48fa3d1cc993a163463332fa3f394d40a16454696d6582fabda7629afa3eefd35c6e636f6c6f725f66756e6374696f6ea16f496e66696e6974654d6972726f7273a163463332fa3d8dc730 */ extern crate nalgebra; @@ -62,6 +63,8 @@ type Rot3 = Rotation3<f32>; struct View { pos: Vec3, rotation: Mat3, + time: f64, + time_speed: f64, level_set: f32, } @@ -73,6 +76,8 @@ impl Default for View { Self { pos, rotation, + time: 0.0, + time_speed: 0.0, level_set: 0.0, } } @@ -84,6 +89,23 @@ impl View { self.rotation } + fn pause(&mut self) { + self.time_speed = 0.0; + } + + fn paused(&self) -> bool { + self.time_speed == 0.0 + } + + 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; + } + + fn yaw_by(&mut self, yaw: f32) { self.rotation *= Rot3::from_euler_angles(0.0, yaw, 0.0); } @@ -182,7 +204,7 @@ struct State { view: View, initial_view: View, show_debug_info: bool, - total_time: f64, + fullscreen: bool, frame_time: Instant, programs: Programs, config: sdf::SceneConfig, @@ -195,7 +217,7 @@ struct State { impl State { fn new() -> Result<Self, String> { - let mut window = win::Window::new("AutoSDF", 1280, 720, true) + let mut window = win::Window::new("AutoSDF", 1280, 720, &Default::default()) .map_err(|e| format!("Error creating window: {e}"))?; let mut programs = Programs::new(&mut window); let config = sdf::SceneConfig { @@ -248,7 +270,7 @@ impl State { config, frame_time: Instant::now(), show_debug_info: false, - total_time: 0.0, + fullscreen: false, scene: sdf::Scene::default(), framebuffer_texture, framebuffer, @@ -308,7 +330,6 @@ impl State { fn frame(&mut self) -> bool { let frame_dt = self.frame_time.elapsed().as_secs_f32(); self.frame_time = Instant::now(); - self.total_time += f64::from(frame_dt); while let Some(event) = self.window.next_event() { use win::Event::*; @@ -332,6 +353,12 @@ impl State { } } KeyDown { + key: F, .. + } => { + self.fullscreen = !self.fullscreen; + self.window.set_fullscreen(self.fullscreen); + } + KeyDown { key: V, modifier, .. } if modifier.ctrl() => { // paste scene @@ -351,6 +378,15 @@ impl State { } } KeyDown { key: N0, .. } => self.view = self.initial_view.clone(), + KeyDown { key: Space, modifier } => { + if !self.view.paused() { + self.view.pause(); + } else if modifier.shift() { + self.view.unpause(true); + } else { + self.view.unpause(false); + } + } MouseMotion { xrel, yrel, .. } => { let mouse_sensitivity = 0.05; self.view @@ -361,7 +397,9 @@ impl State { _ => {} } } - + + self.view.pass_time(frame_dt.into()); + { // movement let mut dx = 0.0; @@ -370,6 +408,8 @@ impl State { let mut dl = 0.0; let window = &self.window; use win::Key::*; + + if window.any_key_down(&[W, Up]) { dz -= 1.0; } @@ -382,16 +422,16 @@ impl State { if window.any_key_down(&[D, Right]) { dx += 1.0; } - if window.is_key_down(Q) { + if window.any_key_down(&[PageUp, NumPad9, Q]) { dy += 1.0; } - if window.is_key_down(E) { + if window.any_key_down(&[PageDown, NumPad3, E]) { dy -= 1.0; } - if window.any_key_down(&[PageUp, NumPad9, Equals]) { + if window.any_key_down(&[Equals]) { dl += 1.0; } - if window.any_key_down(&[PageDown, NumPad3, Minus]) { + if window.any_key_down(&[Minus]) { dl -= 1.0; } let mut speed_multiplier = if window.is_shift_down() { 10.0 } else { 1.0 }; @@ -416,7 +456,7 @@ impl State { window.clear_screen(win::ColorF32::BLACK); window.use_program(&self.programs.main); window.uniform1f("u_aspect_ratio", window.aspect_ratio()); - window.uniform1f("u_time", self.total_time as f32); + window.uniform1f("u_time", view.time as f32); window.uniform1f("u_fov", std::f32::consts::PI * 0.25); window.uniform1f("u_focal_length", 1.0); window.uniform1f("u_level_set", view.level_set); |