1 | #pragma once |
2 | |
3 | #include "taichi/ui/utils/utils.h" |
4 | |
5 | namespace taichi::ui { |
6 | |
7 | enum class ProjectionMode : int { Perspective = 0, Orthogonal = 1 }; |
8 | |
9 | struct Camera { |
10 | glm::vec3 position; |
11 | glm::vec3 lookat; |
12 | glm::vec3 up; |
13 | ProjectionMode projection_mode = ProjectionMode::Perspective; |
14 | |
15 | float fov{45}; |
16 | |
17 | float left{-1}; |
18 | float right{1}; |
19 | float top{-1}; |
20 | float bottom{1}; |
21 | float z_near{0.1}; |
22 | float z_far{1000}; |
23 | |
24 | glm::mat4 get_view_matrix() { |
25 | return glm::lookAt(position, lookat, up); |
26 | } |
27 | glm::mat4 get_projection_matrix(float aspect_ratio) { |
28 | if (projection_mode == ProjectionMode::Perspective) { |
29 | return glm::perspective(glm::radians(fov), aspect_ratio, z_far, z_near); |
30 | } else if (projection_mode == ProjectionMode::Orthogonal) { |
31 | return glm::ortho(left, right, top, bottom, z_far, z_near); |
32 | } else { |
33 | throw std::runtime_error("invalid camera projection mode" ); |
34 | } |
35 | } |
36 | }; |
37 | |
38 | } // namespace taichi::ui |
39 | |