Hit detection
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user