bevy/src/render/camera.rs

48 lines
1.1 KiB
Rust
Raw Normal View History

2019-12-04 08:11:14 +00:00
use crate::math::Mat4;
2019-12-02 04:03:04 +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,
pub camera_type: CameraType,
}
2019-12-02 04:03:04 +00:00
impl Camera {
pub fn new(camera_type: CameraType) -> Self {
Camera {
2019-12-04 08:11:14 +00:00
view_matrix: Mat4::identity(),
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-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
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
}