1#pragma once
2
3#include "taichi/ui/utils/utils.h"
4
5namespace taichi::ui {
6
7enum class ProjectionMode : int { Perspective = 0, Orthogonal = 1 };
8
9struct 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