From a50b95de09a4de3ffc182741e5e412d3fa0f10de Mon Sep 17 00:00:00 2001 From: Avery Date: Tue, 1 Apr 2025 10:42:28 +0200 Subject: [PATCH] Fixed movement controller, nix flake --- flake.lock | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 33 +++++++++++++++++++++++++++++ src/main.rs | 22 ++++++++++++++----- 3 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f49fde0 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1743315132, + "narHash": "sha256-6hl6L/tRnwubHcA4pfUUtk542wn2Om+D4UnDhlDW9BE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "52faf482a3889b7619003c0daec593a1912fddc1", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..24242cb --- /dev/null +++ b/flake.nix @@ -0,0 +1,33 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + nixpkgs, + flake-utils, + } @ inputs: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs { + inherit system; + }; + lib = nixpkgs.lib; + in { + devShells.default = pkgs.mkShell { + VULKAN_SDK = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d"; + # LD_LIBRARY_PATH = "$LD_LIBRARY_PATH:${pkgs.SDL2}/lib/"; + LD_LIBRARY_PATH = lib.makeLibraryPath (with pkgs; [SDL2 vulkan-loader]); + buildInputs = with pkgs; [ + SDL2 + SDL2.dev + vulkan-headers + vulkan-loader + vulkan-validation-layers # maybe? + # glm and whatnot … + ]; + }; + }); +} diff --git a/src/main.rs b/src/main.rs index ee497da..1d7bcf5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,9 @@ use ash::vk; use std::ffi::CStr; use std::ffi::CString; +use std::thread; +use std::time::Duration; +use std::time::Instant; use raw_window_handle::HasDisplayHandle; use raw_window_handle::HasWindowHandle; @@ -1146,6 +1149,7 @@ fn main() { let mut running = true; while running { + let now = Instant::now(); for event in event_pump.poll_iter() { match event { Event::Quit { .. } => running = false, @@ -1156,7 +1160,8 @@ fn main() { width = w as u32; height = h as u32; unsafe { - dev.device_wait_idle().expect("Failed to wait for device idle"); + dev.device_wait_idle() + .expect("Failed to wait for device idle"); swapchain_loader.destroy_swapchain(swapchain, None); } (swapchain, extents) = setup_swapchain( @@ -1183,13 +1188,16 @@ fn main() { framebufs = make_framebufs(&dev, &swap_views, &depth_view, &pass, width, height); } - Event::KeyDown { - keycode: Some(keycode), - .. - } => handle_key(keycode, &mut camera), _ => {} } } + + event_pump + .keyboard_state() + .pressed_scancodes() + .filter_map(Keycode::from_scancode) + .for_each(|k| handle_key(k, &mut camera)); + wait_for_fence(&dev, &fence_flight); reset_fence(&dev, &fence_flight); @@ -1227,5 +1235,9 @@ fn main() { ); queue_present(&swapchain_loader, &queue, &swapchain, img_inx, &sem_finish); + + let elapsed = now.elapsed(); + let delay = (1000_0000u128 / 240).saturating_sub(elapsed.as_micros()); + thread::sleep(Duration::from_micros(delay as u64)); } }