68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#ifndef DRONE_CONTROLLER_HH
|
|
#define DRONE_CONTROLLER_HH
|
|
|
|
#include "drone.hh"
|
|
|
|
#include "opengl_widget.hh"
|
|
|
|
#include <QJsonObject>
|
|
#include <QTimer>
|
|
#include <QOpenGLExtraFunctions>
|
|
|
|
|
|
class DroneController : public QObject, public Painter {
|
|
Q_OBJECT
|
|
|
|
int framerate;
|
|
int frame = 0;
|
|
int duration = 0;
|
|
QVector<Drone> drones;
|
|
QTimer timer;
|
|
bool paused = true;
|
|
bool draw_spheres = false;
|
|
double sphere_radius = 0;
|
|
QTimer sphere_timer;
|
|
QMap<int, QVector<QPair<int, int>>> collisions;
|
|
bool draw_trajectories = false;
|
|
bool draw_guides = false;
|
|
double speed_limit = 0;
|
|
|
|
static OpenGLMesh *sphere;
|
|
static const unsigned char sphere_neutral[];
|
|
|
|
static bool collides(const Drone &a, const Drone &b, double radius);
|
|
|
|
void drawTrajectory(OpenGLWidget *glw, const Drone &d) const;
|
|
void drawGuide(OpenGLWidget *glw, const Drone &d) const;
|
|
|
|
public:
|
|
DroneController(const QJsonObject &json);
|
|
int getDuration() const;
|
|
void draw(OpenGLWidget *glw) const;
|
|
|
|
signals:
|
|
void frameChanged(int frame);
|
|
void playing();
|
|
void pausing();
|
|
void collision(int idA, int idB, int frame);
|
|
void speedViolation(int id, double speed, int frame);
|
|
|
|
private slots:
|
|
void step();
|
|
|
|
public slots:
|
|
void play();
|
|
void pause();
|
|
void suspend();
|
|
void resume();
|
|
void seek(int frame);
|
|
void computeCollisions(double sphere_radius);
|
|
void computeSpeedingViolations(double speed);
|
|
void displaySpheres(double sphere_radius);
|
|
void setDrawTrajectories(bool enable);
|
|
void setDrawGuides(bool enable);
|
|
};
|
|
|
|
|
|
#endif
|