|
|
|
|
@@ -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<Vector3<f32>> {
|
|
|
|
|
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<MeshHandle>
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|