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}