2019-12-04 08:11:14 +00:00
|
|
|
use crate::math::Mat4;
|
2019-12-02 04:03:04 +00:00
|
|
|
|
2019-12-02 23:19:56 +00:00
|
|
|
pub enum CameraType {
|
|
|
|
Projection {
|
|
|
|
fov: f32,
|
|
|
|
aspect_ratio: f32,
|
|
|
|
near: f32,
|
|
|
|
far: f32
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct Camera {
|
2019-12-04 08:11:14 +00:00
|
|
|
pub view_matrix: Mat4,
|
2019-12-02 23:19:56 +00:00
|
|
|
pub camera_type: CameraType,
|
|
|
|
}
|
2019-12-02 04:03:04 +00:00
|
|
|
|
2019-12-02 23:19:56 +00:00
|
|
|
impl Camera {
|
|
|
|
pub fn new(camera_type: CameraType) -> Self {
|
|
|
|
Camera {
|
2019-12-04 08:11:14 +00:00
|
|
|
view_matrix: Mat4::identity(),
|
2019-12-02 23:19:56 +00:00
|
|
|
camera_type,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn update(&mut self, width: u32, height: u32) {
|
|
|
|
match &mut self.camera_type {
|
2019-12-02 23:51:24 +00:00
|
|
|
CameraType::Projection { aspect_ratio, fov, near, far } => {
|
|
|
|
*aspect_ratio = width as f32 / height as f32;
|
|
|
|
self.view_matrix = get_projection_matrix(*fov, *aspect_ratio, *near, *far)
|
2019-12-02 23:19:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-04 08:11:14 +00:00
|
|
|
pub fn get_projection_matrix(fov: f32, aspect_ratio: f32, near: f32, far: f32) -> Mat4 {
|
|
|
|
let projection = Mat4::perspective_rh_gl(fov, aspect_ratio, near, far);
|
2019-12-02 04:03:04 +00:00
|
|
|
|
2019-12-02 23:19:56 +00:00
|
|
|
opengl_to_wgpu_matrix() * projection
|
2019-12-02 04:03:04 +00:00
|
|
|
}
|
|
|
|
|
2019-12-04 08:11:14 +00:00
|
|
|
pub fn opengl_to_wgpu_matrix() -> Mat4 {
|
|
|
|
Mat4::from_cols_array(&[
|
2019-12-02 04:03:04 +00:00
|
|
|
1.0, 0.0, 0.0, 0.0,
|
|
|
|
0.0, -1.0, 0.0, 0.0,
|
|
|
|
0.0, 0.0, 0.5, 0.0,
|
|
|
|
0.0, 0.0, 0.5, 1.0,
|
2019-12-04 08:11:14 +00:00
|
|
|
])
|
2019-12-02 04:03:04 +00:00
|
|
|
}
|