aboutsummaryrefslogtreecommitdiff
path: root/src/drone.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/drone.cc')
-rw-r--r--src/drone.cc73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/drone.cc b/src/drone.cc
new file mode 100644
index 0000000..b7e4007
--- /dev/null
+++ b/src/drone.cc
@@ -0,0 +1,73 @@
+#include "drone.hh"
+
+#include "load_obj.hh"
+#include "opengl_widget.hh"
+
+#include <QJsonArray>
+
+
+bool Drone::mesh_initialized = false;
+OpenGLMesh *Drone::mesh = nullptr;
+
+Drone::Drone(int id)
+ :id(id) {
+ if (!mesh_initialized) {
+ QVector<GLfloat> verts = load_obj(":/mdl/dji600.obj", LOAD_OBJ_NORMALS | LOAD_OBJ_UVS);
+ QOpenGLTexture *texture = new QOpenGLTexture(QImage(":/img/dji600.jpg").mirrored());
+ mesh = new OpenGLMesh(verts, texture);
+ mesh_initialized = true;
+ }
+ OpenGLWidget::instance->meshes.append(*mesh);
+ mesh_id = OpenGLWidget::instance->meshes.size() - 1;
+}
+
+
+Drone::Drone(const QJsonObject &json)
+ :Drone(json["id"].toInt()) {
+ QJsonArray ja = json["waypoints"].toArray();
+ waypoints.reserve(ja.size());
+ for (const QJsonValue &o : ja) {
+ waypoints.append(Waypoint(o.toObject()));
+ }
+}
+
+
+const QVector<Waypoint> Drone::getWaypoints() const {
+ return waypoints;
+}
+
+
+void Drone::setTo(int frame) {
+ int prev = -1, next = -1;
+ const Waypoint *prev_wp, *next_wp;
+ for (const Waypoint &wp : waypoints) { // TODO: this can be optimized
+ if (wp.frame < frame) {
+ prev = wp.frame;
+ prev_wp = &wp;
+ } else {
+ next = wp.frame;
+ next_wp = &wp;
+ break;
+ }
+ }
+ OpenGLMesh &mesh = OpenGLWidget::instance->meshes[mesh_id];
+ mesh.mat = QMatrix4x4();
+ if (next > -1 && prev == -1) {
+ pos = next_wp->pos;
+ } else if (prev > -1 && next == -1) {
+ pos = prev_wp->pos;
+ } else {
+ pos = lerp(prev_wp->pos, next_wp->pos, (double) (frame-prev) / (next-prev));
+ }
+ mesh.mat.translate(pos);
+}
+
+
+QVector3D Drone::getPos() const {
+ return pos;
+}
+
+
+int Drone::getId() const {
+ return id;
+}