collision sphere previsualization
This commit is contained in:
@ -1,14 +1,34 @@
|
||||
#include "drone_controller.hh"
|
||||
#include "opengl_widget.hh"
|
||||
#include "load_obj.hh"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QDebug>
|
||||
#include <QOpenGLShaderProgram>
|
||||
|
||||
|
||||
DroneController::DroneController(const QJsonObject &json)
|
||||
:framerate(json["framerate"].toInt()) {
|
||||
const unsigned char DroneController::sphere_neutral[] = {
|
||||
166, 166, 166
|
||||
};
|
||||
|
||||
OpenGLMesh *DroneController::sphere = nullptr;
|
||||
|
||||
|
||||
DroneController::DroneController(const QJsonObject &json)
|
||||
:framerate(json["framerate"].toInt()),
|
||||
sphere_timer(this) {
|
||||
sphere_timer.setSingleShot(true);
|
||||
connect(&sphere_timer, &QTimer::timeout, [&]() {
|
||||
draw_spheres = false;
|
||||
OpenGLWidget::instance->update();
|
||||
});
|
||||
if (sphere == nullptr) {
|
||||
OpenGLWidget::instance->makeCurrent();
|
||||
sphere = new OpenGLMesh(load_obj(":/mdl/sphere.obj", LOAD_OBJ_NORMALS | LOAD_OBJ_UVS),
|
||||
new QOpenGLTexture(QImage(sphere_neutral, 1, 1, QImage::Format_RGB888)),
|
||||
OpenGLWidget::instance->getMainProgram());
|
||||
OpenGLWidget::instance->makeCurrent();
|
||||
}
|
||||
QJsonArray ja = json["drones"].toArray();
|
||||
drones.reserve(ja.size());
|
||||
for (const QJsonValue &o : ja) {
|
||||
@ -29,6 +49,10 @@ void DroneController::draw(QOpenGLExtraFunctions *f) const {
|
||||
QMatrix4x4 mat;
|
||||
mat.translate(d.getPos());
|
||||
d.getMesh()->draw(f, mat);
|
||||
if (draw_spheres) {
|
||||
mat.scale(sphere_radius);
|
||||
sphere->draw(f, mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -111,6 +135,14 @@ void DroneController::computeCollisions(double sphere_radius) {
|
||||
}
|
||||
|
||||
|
||||
void DroneController::displaySpheres(double sphere_radius) {
|
||||
draw_spheres = true;
|
||||
this->sphere_radius = sphere_radius;
|
||||
sphere_timer.start(1000);
|
||||
OpenGLWidget::instance->update();
|
||||
}
|
||||
|
||||
|
||||
bool DroneController::collides(const Drone &a, const Drone &b, double sqDist) {
|
||||
return (b.getPos() - a.getPos()).lengthSquared() < sqDist;
|
||||
}
|
||||
|
Reference in New Issue
Block a user