blob: 0be98446082457af651a23a3b3dbfb4c574c53c3 (
plain)
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
|
#include "drone_controller.hh"
#include "opengl_widget.hh"
#include <QJsonArray>
#include <QDebug>
#include <QOpenGLShaderProgram>
DroneController::DroneController(const QJsonObject &json)
:framerate(json["framerate"].toInt()) {
QJsonArray ja = json["drones"].toArray();
drones.reserve(ja.size());
for (const QJsonValue &o : ja) {
drones.append(Drone(o.toObject()));
}
for (const Drone &d : drones) {
for (const Waypoint &wp : d.getWaypoints()) {
if (wp.frame > duration) duration = wp.frame;
}
}
connect(&timer, &QTimer::timeout, this, &DroneController::step);
}
void DroneController::draw(QOpenGLExtraFunctions *f) const {
for (const Drone &d : drones) {
QMatrix4x4 mat;
mat.translate(d.getPos());
d.getMesh()->draw(f, mat);
}
}
int DroneController::getDuration() const {
return duration;
}
void DroneController::step() {
for (Drone &d : drones) {
d.setTo(frame);
}
OpenGLWidget::instance->update();
emit frameChanged(frame);
if (frame == duration) {
pause();
} else {
frame++;
}
}
void DroneController::play() {
if (!paused) return;
paused = false;
timer.start(1000. / framerate);
emit playing();
}
void DroneController::pause() {
if (paused) return;
paused = true;
timer.stop();
emit pausing();
}
void DroneController::suspend() {
if (!paused) {
pause();
paused = false;
}
}
void DroneController::resume() {
if (!paused) {
paused = true;
play();
}
}
void DroneController::seek(int frame) {
if (this->frame == frame) return;
this->frame = frame;
step();
}
void DroneController::computeCollisions(double sphere_radius) {
double sqDist = sphere_radius * sphere_radius * 2;
for (int i = 0; i < duration; i++) {
for (Drone &a : drones) {
a.setTo(i);
for (Drone &b : drones) {
b.setTo(i);
if (&a == &b) continue;
if (collides(a, b, sqDist)) {
emit collision(a.getId(), b.getId(), i);
}
}
}
}
for (Drone &d : drones) {
d.setTo(frame);
}
}
bool DroneController::collides(const Drone &a, const Drone &b, double sqDist) {
return (b.getPos() - a.getPos()).lengthSquared() < sqDist;
}
|