Hit detection

This commit is contained in:
2021-03-16 23:15:17 +01:00
parent a0bfdab902
commit 02f39453ac
4 changed files with 32 additions and 24 deletions

View File

@@ -145,8 +145,7 @@ impl TestGame {
mesh_handles.push(mesh_handle); mesh_handles.push(mesh_handle);
} }
for doc_image in document.images() for doc_image in document.images() {
{
let texture_start_time = SystemTime::now(); let texture_start_time = SystemTime::now();
vulkan::dds::upload_texture_from_file(&format!("models/textures/{}.dds", doc_image.name().unwrap()), renderer).unwrap(); vulkan::dds::upload_texture_from_file(&format!("models/textures/{}.dds", doc_image.name().unwrap()), renderer).unwrap();

View File

@@ -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::game::player::PlayerMovementMode::{FirstPerson, Flying};
use crate::input::InputState; use crate::input::InputState;
use crate::MeshHandle;
use crate::vulkan::{ use crate::vulkan::{
gameobject::Updatable, gameobject::Updatable,
VulkanRenderer VulkanRenderer
@@ -30,7 +29,9 @@ impl Camera {
pub fn update(&mut self, renderer: &mut VulkanRenderer) { pub fn update(&mut self, renderer: &mut VulkanRenderer) {
// Camera stuff // 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( self.proj = cgmath::perspective(
Rad::from(Deg(self.fov_y)), 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<Vector3<f32>> { pub fn viewport_pos_to_ray(&self, viewport_pos: [f64; 2], viewport_dimensions: [u32; 2]) -> Option<Vector3<f32>> {
let normalized_x = (2. * viewport_pos[0]) / viewport_dimensions[0] 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]) / viewport_dimensions[1] as f64 - 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 click_start_screen = vec4(normalized_x, normalized_y, -1.0, 1.0);
let world_ray = self.view.inverse_transform_vector(camera_ray)?.normalize(); let click_end_screen = vec4(normalized_x, normalized_y, 0.0, 1.0);
Some(world_ray)
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_mode: PlayerMovementMode,
pub movement_speed: f32, pub movement_speed: f32,
pub look_sensitivity: f32, pub look_sensitivity: f32,
pub height: f32, pub height: f32
cube_mesh: Option<MeshHandle>
} }
impl Player { impl Player {
@@ -80,8 +97,7 @@ impl Player {
movement_mode: FirstPerson, movement_mode: FirstPerson,
movement_speed: 3.0, movement_speed: 3.0,
look_sensitivity: 30.0, look_sensitivity: 30.0,
height: -1.0, height: 1.0
cube_mesh: None
} }
} }
} }
@@ -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_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_origin: [f32; 3] = self.camera.position.into();
let ray = mgf::Ray::new(ray_origin.into(), ray_direction); 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; 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 // Update
self.camera.update(renderer); self.camera.update(renderer);
} }

View File

@@ -8,7 +8,7 @@ use vulkan::gameobject::GameObject;
use crate::config::{LogConfig, RenderConfig}; use crate::config::{LogConfig, RenderConfig};
use crate::game::TestGame; use crate::game::TestGame;
use crate::vulkan::{LinePoint, MeshHandle, VulkanRenderer}; use crate::vulkan::{LinePoint, VulkanRenderer};
mod vulkan; mod vulkan;
mod input; mod input;

View File

@@ -31,7 +31,7 @@ pub fn upload_texture_from_file(path: &str, renderer: &mut VulkanRenderer) -> Re
if is_dx10 if is_dx10
{ {
let dxgi_type = u32::from_ne_bytes(tex_bytes[128..132].try_into()?); 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()); renderer.upload_texture(&tex_bytes[128+20..], tex_width, tex_height, Format::BC5UnormBlock, renderer.device.clone());
} }