Skip to main content

ursus_ecs/components/
camera.rs

1use glam::camera::rh::proj::vulkan::perspective;
2use glam::camera::rh::view::look_at_mat4;
3use glam::{Mat4, Vec3};
4
5#[derive(Debug, Clone, Copy)]
6pub struct ActiveCamera; // todo components cannot be added or removed at runtime, move as a field CameraComponent
7
8impl Default for ActiveCamera {
9    fn default() -> Self {
10        ActiveCamera
11    }
12}
13
14#[derive(Debug, Clone)]
15pub struct CameraComponent {
16    pub eye: Vec3,
17    pub target: Vec3,
18    pub up: Vec3,
19    pub fov_y: f32,
20    pub z_near: f32,
21    pub z_far: f32,
22}
23
24impl CameraComponent {
25    pub fn view_proj(&self, aspect: f32) -> Mat4 {
26        let view = look_at_mat4(self.eye, self.target, self.up);
27        let proj = perspective(self.fov_y, aspect, self.z_near, self.z_far);
28        proj * view
29    }
30}
31
32impl Default for CameraComponent {
33    fn default() -> Self {
34        Self {
35            eye: Vec3::new(2.0, 2.0, 3.0),
36            target: Vec3::ZERO,
37            up: Vec3::Y,
38            fov_y: 60_f32.to_radians(),
39            z_near: 0.1,
40            z_far: 100.0,
41        }
42    }
43}