fere_common/
camera.rs

1use super::*;
2
3#[derive(Clone, Debug)]
4pub struct SetCamera {
5    pub pos: Vec3,
6    pub look: Vec3,
7    pub up: Vec3,
8
9    pub perspective: f32,
10    pub ratio: f32,
11    pub near: f32,
12    pub far: f32,
13
14    projection: Option<Mat4>,
15    view: Option<Mat4>,
16}
17
18impl SetCamera {
19    pub fn new(
20        pos: Vec3,
21        look: Vec3,
22        up: Vec3,
23        perspective: f32,
24        ratio: f32,
25        near: f32,
26        far: f32,
27    ) -> Self {
28        SetCamera {
29            pos,
30            look,
31            up,
32            perspective,
33            ratio,
34            near,
35            far,
36            projection: None,
37            view: None,
38        }
39    }
40
41    pub fn projection_get(&self) -> &Mat4 {
42        self.projection.as_ref().unwrap()
43    }
44
45    pub fn view_get(&self) -> &Mat4 {
46        self.view.as_ref().unwrap()
47    }
48
49    pub fn trans(&mut self) {
50        let mut up_temp = self.up.normalize();
51        let look_vec = (self.look - self.pos).normalize();
52        if dot(&up_temp, &look_vec) > 0.9999 {
53            up_temp = Vec3::new(up_temp.x, up_temp.y, up_temp.z + 0.1).normalize();
54        }
55
56        let proj = Mat4::new_perspective(self.ratio, self.perspective, self.near, self.far);
57        let view = glm::look_at(&self.pos, &self.look, &up_temp);
58
59        self.view = Some(view);
60        self.projection = Some(proj);
61    }
62}