|  |  |  | @ -6,7 +6,9 @@ use ash::Entry; | 
			
		
	
		
			
				
					|  |  |  |  | use ash::Instance; | 
			
		
	
		
			
				
					|  |  |  |  | use ash::khr::{surface, swapchain}; | 
			
		
	
		
			
				
					|  |  |  |  | use ash::vk; | 
			
		
	
		
			
				
					|  |  |  |  | use sdl2::mouse::MouseUtil; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | use std::cmp; | 
			
		
	
		
			
				
					|  |  |  |  | use std::ffi::CStr; | 
			
		
	
		
			
				
					|  |  |  |  | use std::ffi::CString; | 
			
		
	
		
			
				
					|  |  |  |  | use std::thread; | 
			
		
	
	
		
			
				
					|  |  |  | @ -23,6 +25,13 @@ use sdl2::video::Window; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const APP_NAME: &str = "MineClone"; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const MOV_STEP: f32 = 0.05; | 
			
		
	
		
			
				
					|  |  |  |  | const ROT_STEP: f32 = 0.05; | 
			
		
	
		
			
				
					|  |  |  |  | const ROT_MOUSE_SCALE: f32 = 0.001; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const MAX_WIDTH: u32 = 3440; | 
			
		
	
		
			
				
					|  |  |  |  | const MAX_HEIGHT: u32 = 1440; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const MESH_SIZE: u64 = 36 * 2 * 4 * 4; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const POSITIONS: [f32; 36 * 2 * 4] = [ | 
			
		
	
	
		
			
				
					|  |  |  | @ -571,8 +580,8 @@ fn setup_swapchain( | 
			
		
	
		
			
				
					|  |  |  |  |         .image_format(format.format) | 
			
		
	
		
			
				
					|  |  |  |  |         .image_color_space(format.color_space) | 
			
		
	
		
			
				
					|  |  |  |  |         .image_extent(vk::Extent2D { | 
			
		
	
		
			
				
					|  |  |  |  |             width: std::cmp::max(caps.current_extent.width, width), | 
			
		
	
		
			
				
					|  |  |  |  |             height: std::cmp::max(caps.current_extent.height, height), | 
			
		
	
		
			
				
					|  |  |  |  |             width: cmp::min(cmp::max(caps.current_extent.width, width), MAX_WIDTH), | 
			
		
	
		
			
				
					|  |  |  |  |             height: cmp::min(cmp::max(caps.current_extent.height, height), MAX_HEIGHT), | 
			
		
	
		
			
				
					|  |  |  |  |         }) | 
			
		
	
		
			
				
					|  |  |  |  |         .image_array_layers(1) | 
			
		
	
		
			
				
					|  |  |  |  |         .image_usage(vk::ImageUsageFlags::COLOR_ATTACHMENT) | 
			
		
	
	
		
			
				
					|  |  |  | @ -956,43 +965,29 @@ struct Camera { | 
			
		
	
		
			
				
					|  |  |  |  |     rotation: Vector3, | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | fn handle_key(keycode: Keycode, camera: &mut Camera) { | 
			
		
	
		
			
				
					|  |  |  |  |     let mov_scale = 0.05; | 
			
		
	
		
			
				
					|  |  |  |  |     let rot_scale = 0.05; | 
			
		
	
		
			
				
					|  |  |  |  | fn handle_cont_key(keycode: Keycode, camera: &mut Camera, mouse: &MouseUtil) { | 
			
		
	
		
			
				
					|  |  |  |  |     match keycode { | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::W => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x -= -camera.rotation.y.sin() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z -= camera.rotation.y.cos() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x -= -camera.rotation.y.sin() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z -= camera.rotation.y.cos() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::S => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x += -camera.rotation.y.sin() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z += camera.rotation.y.cos() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x += -camera.rotation.y.sin() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z += camera.rotation.y.cos() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::A => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x += camera.rotation.y.cos() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z += camera.rotation.y.sin() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x += camera.rotation.y.cos() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z += camera.rotation.y.sin() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::D => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z -= camera.rotation.y.sin() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x -= camera.rotation.y.cos() * mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::R => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.rotation.x += rot_scale; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::F => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.rotation.x -= rot_scale; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::Q => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.rotation.y += rot_scale; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::E => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.rotation.y -= rot_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.z -= camera.rotation.y.sin() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.x -= camera.rotation.y.cos() * MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::Space => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.y += mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.y += MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         Keycode::LShift => { | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.y -= mov_scale; | 
			
		
	
		
			
				
					|  |  |  |  |             camera.origin.y -= MOV_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         _ => {} | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  |  | @ -1001,20 +996,21 @@ fn handle_key(keycode: Keycode, camera: &mut Camera) { | 
			
		
	
		
			
				
					|  |  |  |  | fn main() { | 
			
		
	
		
			
				
					|  |  |  |  |     let sdl_context = sdl2::init().unwrap(); | 
			
		
	
		
			
				
					|  |  |  |  |     let video_subsystem = sdl_context.video().unwrap(); | 
			
		
	
		
			
				
					|  |  |  |  |     let mouse = sdl_context.mouse(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let mut width = 1024; | 
			
		
	
		
			
				
					|  |  |  |  |     let mut height = 768; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let max_width = 3440; | 
			
		
	
		
			
				
					|  |  |  |  |     let max_height = 1440; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let window = video_subsystem | 
			
		
	
		
			
				
					|  |  |  |  |     let mut window = video_subsystem | 
			
		
	
		
			
				
					|  |  |  |  |         .window(APP_NAME, width, height) | 
			
		
	
		
			
				
					|  |  |  |  |         .vulkan() | 
			
		
	
		
			
				
					|  |  |  |  |         .resizable() | 
			
		
	
		
			
				
					|  |  |  |  |         .build() | 
			
		
	
		
			
				
					|  |  |  |  |         .unwrap(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // We start in relative move
 | 
			
		
	
		
			
				
					|  |  |  |  |     mouse.set_relative_mouse_mode(true); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let entry = Entry::linked(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let instance = create_instance(&window, &entry); | 
			
		
	
	
		
			
				
					|  |  |  | @ -1046,7 +1042,11 @@ fn main() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let mesh_mem = mem_alloc(&dev, host_visible_inx, MESH_SIZE); | 
			
		
	
		
			
				
					|  |  |  |  |     // Max viewport size is 3440x1440
 | 
			
		
	
		
			
				
					|  |  |  |  |     let depth_mem = mem_alloc(&dev, host_invisible_inx, max_width * max_height * 8); | 
			
		
	
		
			
				
					|  |  |  |  |     let depth_mem = mem_alloc( | 
			
		
	
		
			
				
					|  |  |  |  |         &dev, | 
			
		
	
		
			
				
					|  |  |  |  |         host_invisible_inx, | 
			
		
	
		
			
				
					|  |  |  |  |         (MAX_WIDTH * MAX_HEIGHT * 8) as u64, | 
			
		
	
		
			
				
					|  |  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     let mut depth_img = make_depth_img( | 
			
		
	
		
			
				
					|  |  |  |  |         &dev, | 
			
		
	
	
		
			
				
					|  |  |  | @ -1188,6 +1188,28 @@ fn main() { | 
			
		
	
		
			
				
					|  |  |  |  |                     framebufs = | 
			
		
	
		
			
				
					|  |  |  |  |                         make_framebufs(&dev, &swap_views, &depth_view, &pass, width, height); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 // We do this key here and not in `handle_cont_key()` because we don't want key
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // repeat, just a single press
 | 
			
		
	
		
			
				
					|  |  |  |  |                 Event::KeyDown { | 
			
		
	
		
			
				
					|  |  |  |  |                     keycode: Some(Keycode::ESCAPE), | 
			
		
	
		
			
				
					|  |  |  |  |                     repeat: false, | 
			
		
	
		
			
				
					|  |  |  |  |                     .. | 
			
		
	
		
			
				
					|  |  |  |  |                 } => { | 
			
		
	
		
			
				
					|  |  |  |  |                     mouse.set_relative_mouse_mode(!mouse.relative_mouse_mode()); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 Event::MouseMotion { | 
			
		
	
		
			
				
					|  |  |  |  |                     window_id, | 
			
		
	
		
			
				
					|  |  |  |  |                     xrel, | 
			
		
	
		
			
				
					|  |  |  |  |                     yrel, | 
			
		
	
		
			
				
					|  |  |  |  |                     .. | 
			
		
	
		
			
				
					|  |  |  |  |                 } 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // We only wanna do movement if the mouse is in relative mode (ie. its pinned to
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // the center of the window and hidden)
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if mouse.relative_mouse_mode() => { | 
			
		
	
		
			
				
					|  |  |  |  |                     camera.rotation.y -= xrel as f32 * ROT_MOUSE_SCALE; | 
			
		
	
		
			
				
					|  |  |  |  |                     camera.rotation.x += yrel as f32 * ROT_MOUSE_SCALE; | 
			
		
	
		
			
				
					|  |  |  |  |                     mouse.warp_mouse_in_window(&window, width as i32 / 2, height as i32 / 2); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 _ => {} | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | @ -1196,7 +1218,7 @@ fn main() { | 
			
		
	
		
			
				
					|  |  |  |  |             .keyboard_state() | 
			
		
	
		
			
				
					|  |  |  |  |             .pressed_scancodes() | 
			
		
	
		
			
				
					|  |  |  |  |             .filter_map(Keycode::from_scancode) | 
			
		
	
		
			
				
					|  |  |  |  |             .for_each(|k| handle_key(k, &mut camera)); | 
			
		
	
		
			
				
					|  |  |  |  |             .for_each(|k| handle_cont_key(k, &mut camera, &mouse)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         wait_for_fence(&dev, &fence_flight); | 
			
		
	
		
			
				
					|  |  |  |  |         reset_fence(&dev, &fence_flight); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |