diff options
Diffstat (limited to 'src/drone.cc')
-rw-r--r-- | src/drone.cc | 73 |
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 = ℘ + } else { + next = wp.frame; + next_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; +} |