Skip to main content

steamengine_renderer_util/camera/
prespective.rs

1use super::Camera;
2use glam::*;
3
4/// Implementation of camera for Prespective Camera
5/// ## Example
6/// ```rust
7/// use cgmath::point3;
8/// use steamengine_renderer_util::camera::create_bindings;
9/// use steamengine_renderer_util::camera::CameraBuffer;
10///
11/// let camera = PrespectiveCamera::default();
12/// // set the aspect ratio with window properties
13/// *camera.aspect_ratio() = width / height;
14/// // sets the camera location
15/// *camera.eye() = point3(0.0, 0.0, -2.0);
16///
17/// // upload the camera to the shader
18/// let buffer = CameraBuffer::new(&renderer, 1);
19/// let binding = create_bindings(&renderer, buffer.as_entrie());
20///
21/// buffer.set(0, camera);
22///
23/// ```
24
25#[derive(Clone, Debug)]
26pub struct PrespectiveCamera {
27    // view matrix
28    eye: Vec3,
29    target: Vec3,
30    up: Vec3,
31
32    // projection
33    fov: f32,
34    aspect_ratio: f32,
35    near: f32,
36    far: f32,
37}
38impl PrespectiveCamera {
39    pub fn fov(&mut self) -> &mut f32 {
40        &mut self.fov
41    }
42    pub fn aspect_ratio(&mut self) -> &mut f32 {
43        &mut self.aspect_ratio
44    }
45    pub fn near(&mut self) -> &mut f32 {
46        &mut self.near
47    }
48    pub fn far(&mut self) -> &mut f32 {
49        &mut self.far
50    }
51}
52impl Default for PrespectiveCamera {
53    fn default() -> Self {
54        let eye = vec3(0.0, 1.0, 2.0);
55        let target = vec3(0.0, 0.0, 0.0);
56        let up = vec3(0.0, 1.0, 0.0);
57
58        let fov = 45.0;
59        let aspect_ratio = 16.0 / 9.0;
60        let near = 0.1;
61        let far = 100.0;
62
63        Self {
64            eye,
65            target,
66            up,
67            fov,
68            aspect_ratio,
69            near,
70            far,
71        }
72    }
73}
74
75impl Camera for PrespectiveCamera {
76    fn up(&mut self) -> &mut Vec3 {
77        &mut self.up
78    }
79    fn eye(&mut self) -> &mut Vec3 {
80        &mut self.eye
81    }
82    fn target(&mut self) -> &mut Vec3 {
83        &mut self.target
84    }
85    fn view(&self) -> Mat4 {
86        Mat4::look_at_rh(self.eye, self.target, self.up)
87    }
88    fn projection(&self) -> Mat4 {
89        Mat4::perspective_lh(self.fov, self.aspect_ratio, self.near, self.far)
90    }
91}