2020-06-04 03:39:16 +00:00
|
|
|
#include "scantargetwidget.h"
|
|
|
|
|
2020-06-05 02:39:32 +00:00
|
|
|
#include <QDebug>
|
|
|
|
#include <QOpenGLContext>
|
2020-06-05 02:58:02 +00:00
|
|
|
#include <QTimer>
|
2020-06-05 02:39:32 +00:00
|
|
|
|
2020-06-06 23:47:35 +00:00
|
|
|
#include "../../ClockReceiver/TimeTypes.hpp"
|
|
|
|
|
2020-06-04 03:39:16 +00:00
|
|
|
ScanTargetWidget::ScanTargetWidget(QWidget *parent) : QOpenGLWidget(parent) {}
|
|
|
|
ScanTargetWidget::~ScanTargetWidget() {}
|
|
|
|
|
|
|
|
void ScanTargetWidget::initializeGL() {
|
2020-06-18 03:16:29 +00:00
|
|
|
// Retain the default background colour.
|
|
|
|
const QColor backgroundColour = palette().color(QWidget::backgroundRole());
|
|
|
|
glClearColor(backgroundColour.redF(), backgroundColour.greenF(), backgroundColour.blueF(), 1.0);
|
2020-06-05 02:39:32 +00:00
|
|
|
|
2020-06-06 23:47:35 +00:00
|
|
|
// Follow each swapped frame with an additional update.
|
2020-06-14 23:26:56 +00:00
|
|
|
connect(this, &QOpenGLWidget::frameSwapped, this, &ScanTargetWidget::vsync);
|
2020-06-04 03:39:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScanTargetWidget::paintGL() {
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
2020-06-21 21:20:44 +00:00
|
|
|
if(isConnected) {
|
2020-06-21 21:25:21 +00:00
|
|
|
// Qt reserves the right to change the framebuffer object due to window resizes or if setParent is called;
|
|
|
|
// therefore check whether it has changed.
|
|
|
|
const auto newFramebuffer = defaultFramebufferObject();
|
|
|
|
if(framebuffer != newFramebuffer) {
|
|
|
|
framebuffer = newFramebuffer;
|
|
|
|
scanTarget->set_target_framebuffer(framebuffer);
|
|
|
|
}
|
|
|
|
|
2020-06-21 21:16:11 +00:00
|
|
|
vsyncPredictor.begin_redraw();
|
2020-06-05 02:39:32 +00:00
|
|
|
scanTarget->update(width(), height());
|
|
|
|
scanTarget->draw(width(), height());
|
2020-06-21 21:16:11 +00:00
|
|
|
vsyncPredictor.end_redraw();
|
2020-06-05 02:39:32 +00:00
|
|
|
}
|
2020-06-04 03:39:16 +00:00
|
|
|
}
|
|
|
|
|
2020-06-14 23:26:56 +00:00
|
|
|
void ScanTargetWidget::vsync() {
|
2020-06-21 21:16:11 +00:00
|
|
|
vsyncPredictor.announce_vsync();
|
2020-06-14 23:26:56 +00:00
|
|
|
|
|
|
|
const auto time_now = Time::nanos_now();
|
2020-06-21 21:16:11 +00:00
|
|
|
const auto delay_time = ((vsyncPredictor.suggested_draw_time() - time_now) / 1'000'000) - 5; // TODO: the extra 5 is a random guess.
|
2020-06-14 23:26:56 +00:00
|
|
|
if(delay_time > 0) {
|
|
|
|
QTimer::singleShot(delay_time, this, SLOT(repaint()));
|
|
|
|
} else {
|
|
|
|
repaint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-04 03:39:16 +00:00
|
|
|
void ScanTargetWidget::resizeGL(int w, int h) {
|
2020-06-21 21:25:21 +00:00
|
|
|
glViewport(0, 0, w, h);
|
2020-06-04 03:39:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Outputs::Display::OpenGL::ScanTarget *ScanTargetWidget::getScanTarget() {
|
2020-06-05 02:39:32 +00:00
|
|
|
makeCurrent();
|
|
|
|
if(!scanTarget) {
|
2020-06-21 21:20:44 +00:00
|
|
|
isConnected = true;
|
2020-06-21 21:25:21 +00:00
|
|
|
framebuffer = defaultFramebufferObject();
|
|
|
|
scanTarget = std::make_unique<Outputs::Display::OpenGL::ScanTarget>(framebuffer);
|
2020-06-05 02:39:32 +00:00
|
|
|
}
|
2020-06-04 03:39:16 +00:00
|
|
|
return scanTarget.get();
|
|
|
|
}
|