diff --git a/src/game/mod.rs b/src/game/mod.rs index 7af77ec..47162a1 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -145,8 +145,7 @@ impl TestGame { mesh_handles.push(mesh_handle); } - for doc_image in document.images() - { + for doc_image in document.images() { let texture_start_time = SystemTime::now(); vulkan::dds::upload_texture_from_file(&format!("models/textures/{}.dds", doc_image.name().unwrap()), renderer).unwrap(); diff --git a/src/game/player.rs b/src/game/player.rs index 9fd3856..27a47a7 100644 --- a/src/game/player.rs +++ b/src/game/player.rs @@ -1,9 +1,8 @@ -use cgmath::{Deg, InnerSpace, Matrix4, One, Quaternion, Rad, Rotation, Rotation3, SquareMatrix, vec3, Vector3, Transform}; +use cgmath::{Deg, InnerSpace, Matrix4, One, Quaternion, Rad, Rotation, Rotation3, SquareMatrix, Vector3, vec3, vec4}; use crate::game::player::PlayerMovementMode::{FirstPerson, Flying}; use crate::input::InputState; -use crate::MeshHandle; use crate::vulkan::{ gameobject::Updatable, VulkanRenderer @@ -30,7 +29,9 @@ impl Camera { pub fn update(&mut self, renderer: &mut VulkanRenderer) { // Camera stuff - self.view = Matrix4::from(self.rotation) * Matrix4::from_translation(self.position); + let mut pos = self.position.clone(); + pos.y *= -1.0; + self.view = Matrix4::from(self.rotation) * Matrix4::from_translation(pos); self.proj = cgmath::perspective( Rad::from(Deg(self.fov_y)), @@ -49,12 +50,29 @@ impl Camera { } pub fn viewport_pos_to_ray(&self, viewport_pos: [f64; 2], viewport_dimensions: [u32; 2]) -> Option> { - let normalized_x = (2. * viewport_pos[0]) / viewport_dimensions[0] as f64 - 1.; - let normalized_y = (2. * viewport_pos[1]) / viewport_dimensions[1] as f64 - 1.; + let normalized_x = (2. * viewport_pos[0]) as f32 / viewport_dimensions[0] as f32 - 1.; + let normalized_y = (2. * viewport_pos[1]) as f32 / viewport_dimensions[1] as f32 - 1.; - let camera_ray = self.proj.inverse_transform_vector(vec3(normalized_x as f32, normalized_y as f32, -1.))?; - let world_ray = self.view.inverse_transform_vector(camera_ray)?.normalize(); - Some(world_ray) + let click_start_screen = vec4(normalized_x, normalized_y, -1.0, 1.0); + let click_end_screen = vec4(normalized_x, normalized_y, 0.0, 1.0); + + let proj_inverse = self.proj.invert()?; + let view_inverse = self.view.invert()?; + + let mut ray_start_camera = proj_inverse * click_start_screen; + ray_start_camera /= ray_start_camera.w; + + let mut ray_end_camera = proj_inverse * click_end_screen; + ray_end_camera /= ray_end_camera.w; + + let mut ray_start_world = view_inverse * ray_start_camera; + ray_start_world /= ray_start_world.w; + + let mut ray_end_world = view_inverse * ray_end_camera; + ray_end_world /= ray_end_world.w; + + let ray_dir_world = (ray_end_world - ray_start_world).normalize(); + Some(ray_dir_world.truncate()) } } @@ -69,8 +87,7 @@ pub struct Player { pub movement_mode: PlayerMovementMode, pub movement_speed: f32, pub look_sensitivity: f32, - pub height: f32, - cube_mesh: Option + pub height: f32 } impl Player { @@ -80,8 +97,7 @@ impl Player { movement_mode: FirstPerson, movement_speed: 3.0, look_sensitivity: 30.0, - height: -1.0, - cube_mesh: None + height: 1.0 } } } @@ -97,7 +113,7 @@ impl Updatable for Player { } } - if self.movement_mode == Flying && input.button_just_pressed("select") { + if input.button_just_pressed("select") { let ray_direction = self.camera.viewport_pos_to_ray(input.mouse_position, renderer.game_data.dimensions).unwrap(); let ray_origin: [f32; 3] = self.camera.position.into(); let ray = mgf::Ray::new(ray_origin.into(), ray_direction); @@ -131,13 +147,6 @@ impl Updatable for Player { input.get_axis("move_forward") * self.movement_speed)) * delta_time; } - // Spawn cube - if input.button_just_released("test") { - if self.cube_mesh.is_none() { - // self.cube_mesh = Some() - } - } - // Update self.camera.update(renderer); } diff --git a/src/main.rs b/src/main.rs index 2938716..fde8a9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use vulkan::gameobject::GameObject; use crate::config::{LogConfig, RenderConfig}; use crate::game::TestGame; -use crate::vulkan::{LinePoint, MeshHandle, VulkanRenderer}; +use crate::vulkan::{LinePoint, VulkanRenderer}; mod vulkan; mod input; diff --git a/src/vulkan/dds.rs b/src/vulkan/dds.rs index 696338f..3f745a9 100644 --- a/src/vulkan/dds.rs +++ b/src/vulkan/dds.rs @@ -31,7 +31,7 @@ pub fn upload_texture_from_file(path: &str, renderer: &mut VulkanRenderer) -> Re if is_dx10 { let dxgi_type = u32::from_ne_bytes(tex_bytes[128..132].try_into()?); - assert!(dxgi_type == 83); + assert!(dxgi_type == 83); // BC5 Unorm Typeless renderer.upload_texture(&tex_bytes[128+20..], tex_width, tex_height, Format::BC5UnormBlock, renderer.device.clone()); }