-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfpscameracontroller.cpp
119 lines (95 loc) · 2.53 KB
/
fpscameracontroller.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
#include "fpscameracontroller.h"
#include <QKeyEvent>
#include <QMouseEvent>
#include <QWheelEvent>
#include "camera.h"
static const float rotate_factor = 0.3;
FPSCameraController::FPSCameraController(Camera *camera) : CameraController(camera)
{
}
void FPSCameraController::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
rbuttonDown_ = true;
oldMousePos_ = event->pos();
}
}
void FPSCameraController::mouseMoveEvent(QMouseEvent *event)
{
if (rbuttonDown_) {
QPoint mousePos = event->pos();
QPoint delta = mousePos - oldMousePos_;
mat4& transform = camera_->transform();
mat4 mat;
vec3 position = camera_->position();
mat.setToIdentity();
mat.translate(-position);
transform = mat * transform;
mat.setToIdentity();
mat.rotate(-delta.x() * rotate_factor, {0, 1, 0});
transform = mat * transform;
mat.setToIdentity();
mat.rotate(-delta.y() * rotate_factor, camera_->right());
transform = mat * transform;
mat.setToIdentity();
mat.translate(position);
transform = mat * transform;
oldMousePos_ = mousePos;
}
}
void FPSCameraController::mouseReleaseEvent(QMouseEvent *event)
{
rbuttonDown_ = false;
}
void FPSCameraController::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_W) {
wPressed_ = true;
}
if (event->key() == Qt::Key_A) {
aPressed_ = true;
}
if (event->key() == Qt::Key_S) {
sPressed_ = true;
}
if (event->key() == Qt::Key_D) {
dPressed_ = true;
}
}
void FPSCameraController::keyReleaseEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_W) {
wPressed_ = false;
}
if (event->key() == Qt::Key_A) {
aPressed_ = false;
}
if (event->key() == Qt::Key_S) {
sPressed_ = false;
}
if (event->key() == Qt::Key_D) {
dPressed_ = false;
}
}
void FPSCameraController::update(float dt)
{
float speedX = 0;
float speedZ = 0;
if (wPressed_) {
speedZ = speed_;
}
if (sPressed_) {
speedZ = -speed_;
}
if (dPressed_) {
speedX = speed_;
}
if (aPressed_) {
speedX = -speed_;
}
vec3 translation = speedX * camera_->right() + speedZ * camera_->front();
translation *= dt;
mat4 matrix;
matrix.translate(translation);
camera_->setTransform(matrix * camera_->transform());
}