-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcamera.cpp
125 lines (103 loc) · 2.13 KB
/
camera.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "camera.h"
#include "drawcontext.h"
#include "shader.h"
Camera::Camera()
{
near_ = 0.1;
far_ = 1000;
aspectRatio_ = 1;
heightAngle_ = 60;
updateProjection();
lookAt({0, 10, 10}, {0, 0, 0}, {0, 1, 0});
}
void Camera::apply(DrawContext &context)
{
context.shader->setUniformValue("view", viewMatrix());
context.shader->setUniformValue("projection", projectionMatrix());
context.shader->setUniformValue("eyePositionW", position());
context.shader->setUniformValue("near", near());
context.shader->setUniformValue("far", far());
}
const mat4& Camera::projectionMatrix() const
{
return projection_;
}
mat4 Camera::viewMatrix() const
{
return transform_.inverted();
}
void Camera::lookAt(const vec3 &eye, const vec3 ¢er, const vec3 &up)
{
transform_.setToIdentity();
transform_.lookAt(eye, center, up);
transform_ = transform_.inverted();
}
void Camera::updateProjection()
{
projection_.setToIdentity();
projection_.perspective(heightAngle_, aspectRatio_, near_, far_);
}
const mat4 &Camera::transform() const
{
return transform_;
}
void Camera::setTransform(const mat4 &transform)
{
transform_ = transform;
}
float Camera::heightAngle() const
{
return heightAngle_;
}
void Camera::setHeightAngle(float heightAngle)
{
heightAngle_ = heightAngle;
updateProjection();
}
vec3 Camera::front() const
{
return -(transform_.column(2).toVector3D());
}
vec3 Camera::right() const
{
return transform_.column(0).toVector3D();
}
vec3 Camera::up() const
{
return transform_.column(1).toVector3D();
}
vec3 Camera::position() const
{
return transform_.column(3).toVector3D();
}
mat4 &Camera::transform()
{
return transform_;
}
float Camera::aspectRatio() const
{
return aspectRatio_;
}
void Camera::setAspectRatio(float aspectRatio)
{
aspectRatio_ = aspectRatio;
updateProjection();
}
float Camera::far() const
{
return far_;
}
void Camera::setFar(float far)
{
far_ = far;
updateProjection();
}
float Camera::near() const
{
return near_;
}
void Camera::setNear(float near)
{
near_ = near;
updateProjection();
}