diff --git a/OSBindings/Qt/ClockSignal.pro b/OSBindings/Qt/ClockSignal.pro index 61ded61de..d71b1dc3d 100644 --- a/OSBindings/Qt/ClockSignal.pro +++ b/OSBindings/Qt/ClockSignal.pro @@ -123,6 +123,7 @@ SOURCES += \ \ main.cpp \ mainwindow.cpp \ + scantargetwidget.cpp \ timer.cpp HEADERS += \ @@ -247,6 +248,7 @@ HEADERS += \ ../../Storage/Tape/Parsers/*.hpp \ \ mainwindow.h \ + scantargetwidget.h \ timer.h FORMS += \ diff --git a/OSBindings/Qt/main.cpp b/OSBindings/Qt/main.cpp index 1cd93da31..2b1771628 100644 --- a/OSBindings/Qt/main.cpp +++ b/OSBindings/Qt/main.cpp @@ -4,6 +4,16 @@ int main(int argc, char *argv[]) { + // "Calling QSurfaceFormat::setDefaultFormat() before constructing the + // QApplication instance is mandatory on some platforms ... when an + // OpenGL core profile context is requested." + QSurfaceFormat format; + format.setVersion(3, 2); + format.setProfile(QSurfaceFormat::CoreProfile); + format.setDepthBufferSize(0); + format.setStencilBufferSize(0); + QSurfaceFormat::setDefaultFormat(format); + QApplication a(argc, argv); MainWindow w; w.show(); diff --git a/OSBindings/Qt/mainwindow.cpp b/OSBindings/Qt/mainwindow.cpp index ad9e13d4d..e32cbc2c1 100644 --- a/OSBindings/Qt/mainwindow.cpp +++ b/OSBindings/Qt/mainwindow.cpp @@ -137,19 +137,19 @@ void MainWindow::launchMachine() { return results; }; Machine::Error error; - std::unique_ptr machine(Machine::MachineForTargets(targets, rom_fetcher, error)); + machine.reset(Machine::MachineForTargets(targets, rom_fetcher, error)); switch(error) { default: { ui->missingROMsBox->setVisible(false); uiPhase = UIPhase::RunningMachine; - // TODO: Install the OpenGL scan target. - // This is subject to having created an OpenGL context. -// const auto scan_producer = machine->scan_producer(); -// if(scan_producer) { -// scan_producer->set_scan_target(&scanTarget); -// } + // Supply the scan target. + // TODO: in the future, hypothetically, deal with non-scan producers. + const auto scan_producer = machine->scan_producer(); + if(scan_producer) { + scan_producer->set_scan_target(ui->openGLWidget->getScanTarget()); + } // If this is a timed machine, start up the timer. const auto timedMachine = machine->timed_machine(); diff --git a/OSBindings/Qt/mainwindow.h b/OSBindings/Qt/mainwindow.h index e3fa28c79..66d600154 100644 --- a/OSBindings/Qt/mainwindow.h +++ b/OSBindings/Qt/mainwindow.h @@ -8,7 +8,6 @@ #include "../../Analyser/Static/StaticAnalyser.hpp" #include "../../Machines/Utility/MachineForTarget.hpp" -#include "../../Outputs/OpenGL/ScanTarget.hpp" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -43,8 +42,8 @@ class MainWindow : public QMainWindow { void dragEnterEvent(QDragEnterEvent* event) override; void dropEvent(QDropEvent* event) override; - // Output. - Outputs::Display::OpenGL::ScanTarget scanTarget; + // Ongoing state. + std::unique_ptr machine; private slots: void open(); diff --git a/OSBindings/Qt/mainwindow.ui b/OSBindings/Qt/mainwindow.ui index daf8834a0..a269f4302 100644 --- a/OSBindings/Qt/mainwindow.ui +++ b/OSBindings/Qt/mainwindow.ui @@ -22,7 +22,7 @@ MainWindow - + @@ -60,6 +60,13 @@ Please drag and drop the following over this window: + + + ScanTargetWidget + QOpenGLWidget +
scantargetwidget.h
+
+
diff --git a/OSBindings/Qt/scantargetwidget.cpp b/OSBindings/Qt/scantargetwidget.cpp new file mode 100644 index 000000000..dde232f2c --- /dev/null +++ b/OSBindings/Qt/scantargetwidget.cpp @@ -0,0 +1,21 @@ +#include "scantargetwidget.h" + +ScanTargetWidget::ScanTargetWidget(QWidget *parent) : QOpenGLWidget(parent) {} +ScanTargetWidget::~ScanTargetWidget() {} + +void ScanTargetWidget::initializeGL() { + scanTarget = std::make_unique(defaultFramebufferObject()); + glClearColor(0.5, 0.5, 1.0, 1.0); +} + +void ScanTargetWidget::paintGL() { + glClear(GL_COLOR_BUFFER_BIT); +} + +void ScanTargetWidget::resizeGL(int w, int h) { + glViewport(0,0,w,h); +} + +Outputs::Display::OpenGL::ScanTarget *ScanTargetWidget::getScanTarget() { + return scanTarget.get(); +} diff --git a/OSBindings/Qt/scantargetwidget.h b/OSBindings/Qt/scantargetwidget.h new file mode 100644 index 000000000..dbf2f049e --- /dev/null +++ b/OSBindings/Qt/scantargetwidget.h @@ -0,0 +1,27 @@ +#ifndef SCANTARGETWIDGET_H +#define SCANTARGETWIDGET_H + +#include + +#include "../../Outputs/OpenGL/ScanTarget.hpp" + +class ScanTargetWidget : public QOpenGLWidget +{ + public: + ScanTargetWidget(QWidget *parent = nullptr); + ~ScanTargetWidget(); + + Outputs::Display::OpenGL::ScanTarget *getScanTarget(); + + protected: + void initializeGL() override; + void resizeGL(int w, int h) override; + void paintGL() override; + + private: + // This should be created only once there's an OpenGL context. So it + // can't be done at creation time.4 + std::unique_ptr scanTarget; +}; + +#endif // SCANTARGETWIDGET_H