diff options
Diffstat (limited to 'examples/opengl')
29 files changed, 198 insertions, 891 deletions
diff --git a/examples/opengl/2dpainting/CMakeLists.txt b/examples/opengl/2dpainting/CMakeLists.txt index eeaa9cb726..b4ae3aa313 100644 --- a/examples/opengl/2dpainting/CMakeLists.txt +++ b/examples/opengl/2dpainting/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(2dpainting LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/2dpainting") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets) qt_standard_project_setup() @@ -36,7 +30,14 @@ target_link_libraries(2dpainting PRIVATE ) install(TARGETS 2dpainting - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET 2dpainting + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index eb7e2d2782..09e31defe5 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -1,10 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause qt_internal_add_example(openglwindow) qt_internal_add_example(hellogles3) if(TARGET Qt6::Widgets) - qt_internal_add_example(contextinfo) qt_internal_add_example(2dpainting) qt_internal_add_example(hellogl2) qt_internal_add_example(cube) diff --git a/examples/opengl/contextinfo/CMakeLists.txt b/examples/opengl/contextinfo/CMakeLists.txt deleted file mode 100644 index 8dfd412408..0000000000 --- a/examples/opengl/contextinfo/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(contextinfo LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/contextinfo") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL Widgets) - -qt_standard_project_setup() - -qt_add_executable(contextinfo - main.cpp - renderwindow.cpp renderwindow.h - widget.cpp widget.h -) - -set_target_properties(contextinfo PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(contextinfo PRIVATE - Qt6::Core - Qt6::Gui - Qt6::OpenGL - Qt6::Widgets -) - -install(TARGETS contextinfo - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/opengl/contextinfo/contextinfo.pro b/examples/opengl/contextinfo/contextinfo.pro deleted file mode 100644 index ae8f4067b6..0000000000 --- a/examples/opengl/contextinfo/contextinfo.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -QT += widgets opengl -requires(qtConfig(filedialog)) - -SOURCES += main.cpp \ - widget.cpp \ - renderwindow.cpp - -HEADERS += widget.h \ - renderwindow.h - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/opengl/contextinfo -INSTALLS += target diff --git a/examples/opengl/contextinfo/main.cpp b/examples/opengl/contextinfo/main.cpp deleted file mode 100644 index 253425ded9..0000000000 --- a/examples/opengl/contextinfo/main.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include <QApplication> -#include "widget.h" - -int main(int argc, char **argv) -{ - for (int i = 1; i < argc; ++i) { - if (!qstrcmp(argv[i], "-g")) - QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); - else if (!qstrcmp(argv[i], "-s")) - QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); - else if (!qstrcmp(argv[i], "-d")) - QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); - } - - QApplication app(argc, argv); - - Widget w; - w.resize(700, 800); - w.show(); - - return app.exec(); -} diff --git a/examples/opengl/contextinfo/renderwindow.cpp b/examples/opengl/contextinfo/renderwindow.cpp deleted file mode 100644 index 64c0f47db9..0000000000 --- a/examples/opengl/contextinfo/renderwindow.cpp +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "renderwindow.h" -#include <QTimer> -#include <QMatrix4x4> -#include <QOpenGLContext> -#include <QtOpenGL/QOpenGLShaderProgram> -#include <QOpenGLFunctions> - -RenderWindow::RenderWindow(const QSurfaceFormat &format) - : m_context(nullptr), - m_initialized(false), - m_forceGLSL110(false), - m_angle(0.0f) -{ - setSurfaceType(QWindow::OpenGLSurface); - setFormat(format); - m_context = new QOpenGLContext(this); - m_context->setFormat(requestedFormat()); - if (!m_context->create()) { - delete m_context; - m_context = nullptr; - } -} - -void RenderWindow::exposeEvent(QExposeEvent *) -{ - if (isExposed()) - render(); -} - -// ES needs the precision qualifiers. -// On desktop GL QOpenGLShaderProgram inserts dummy defines for highp/mediump/lowp. -static const char *vertexShaderSource110 = - "attribute highp vec4 posAttr;\n" - "attribute lowp vec4 colAttr;\n" - "varying lowp vec4 col;\n" - "uniform highp mat4 matrix;\n" - "void main() {\n" - " col = colAttr;\n" - " gl_Position = matrix * posAttr;\n" - "}\n"; - -static const char *fragmentShaderSource110 = - "varying lowp vec4 col;\n" - "void main() {\n" - " gl_FragColor = col;\n" - "}\n"; - -static const char *vertexShaderSource = - "#version 150\n" - "in vec4 posAttr;\n" - "in vec4 colAttr;\n" - "out vec4 col;\n" - "uniform mat4 matrix;\n" - "void main() {\n" - " col = colAttr;\n" - " gl_Position = matrix * posAttr;\n" - "}\n"; - -static const char *fragmentShaderSource = - "#version 150\n" - "in vec4 col;\n" - "out vec4 fragColor;\n" - "void main() {\n" - " fragColor = col;\n" - "}\n"; - -static GLfloat vertices[] = { - 0.0f, 0.707f, - -0.5f, -0.5f, - 0.5f, -0.5f -}; - -static GLfloat colors[] = { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f -}; - -void RenderWindow::init() -{ - m_program = new QOpenGLShaderProgram(this); - - QSurfaceFormat format = m_context->format(); - bool useNewStyleShader = format.profile() == QSurfaceFormat::CoreProfile; - // Try to handle 3.0 & 3.1 that do not have the core/compatibility profile concept 3.2+ has. - // This may still fail since version 150 (3.2) is specified in the sources but it's worth a try. - if (format.renderableType() == QSurfaceFormat::OpenGL && format.majorVersion() == 3 && format.minorVersion() <= 1) - useNewStyleShader = !format.testOption(QSurfaceFormat::DeprecatedFunctions); - if (m_forceGLSL110) - useNewStyleShader = false; - - const char *vsrc = useNewStyleShader ? vertexShaderSource : vertexShaderSource110; - const char *fsrc = useNewStyleShader ? fragmentShaderSource : fragmentShaderSource110; - qDebug("Using version %s shader", useNewStyleShader ? "150" : "110"); - - if (!m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vsrc)) { - emit error(m_program->log()); - return; - } - if (!m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fsrc)) { - emit error(m_program->log()); - return; - } - if (!m_program->link()) { - emit error(m_program->log()); - return; - } - - m_posAttr = m_program->attributeLocation("posAttr"); - m_colAttr = m_program->attributeLocation("colAttr"); - m_matrixUniform = m_program->uniformLocation("matrix"); - - m_vbo.create(); - m_vbo.bind(); - m_vbo.allocate(vertices, sizeof(vertices) + sizeof(colors)); - m_vbo.write(sizeof(vertices), colors, sizeof(colors)); - m_vbo.release(); - - QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); - if (m_vao.isCreated()) // have VAO support, use it - setupVertexAttribs(); -} - -void RenderWindow::setupVertexAttribs() -{ - m_vbo.bind(); - m_program->setAttributeBuffer(m_posAttr, GL_FLOAT, 0, 2); - m_program->setAttributeBuffer(m_colAttr, GL_FLOAT, sizeof(vertices), 3); - m_program->enableAttributeArray(m_posAttr); - m_program->enableAttributeArray(m_colAttr); - m_vbo.release(); -} - -bool RenderWindow::event(QEvent *ev) -{ - if (ev->type() == QEvent::UpdateRequest) - render(); - return QWindow::event(ev); -} - -void RenderWindow::render() -{ - if (!m_context->makeCurrent(this)) { - emit error(tr("makeCurrent() failed")); - return; - } - - QOpenGLFunctions *f = m_context->functions(); - if (!m_initialized) { - m_initialized = true; - f->glEnable(GL_DEPTH_TEST); - f->glClearColor(0, 0, 0, 1); - init(); - emit ready(); - } - - if (!m_vbo.isCreated()) // init() failed, don't bother with trying to render - return; - - const qreal retinaScale = devicePixelRatio(); - f->glViewport(0, 0, width() * retinaScale, height() * retinaScale); - f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - m_program->bind(); - QMatrix4x4 matrix; - matrix.perspective(60.0f, 4.0f / 3.0f, 0.1f, 100.0f); - matrix.translate(0.0f, 0.0f, -2.0f); - matrix.rotate(m_angle, 0.0f, 1.0f, 0.0f); - m_program->setUniformValue(m_matrixUniform, matrix); - - if (m_vao.isCreated()) - m_vao.bind(); - else // no VAO support, set the vertex attribute arrays now - setupVertexAttribs(); - - f->glDrawArrays(GL_TRIANGLES, 0, 3); - - m_vao.release(); - m_program->release(); - - // swapInterval is 1 by default which means that swapBuffers() will (hopefully) block - // and wait for vsync. - m_context->swapBuffers(this); - - m_angle += 1.0f; - - requestUpdate(); -} diff --git a/examples/opengl/contextinfo/renderwindow.h b/examples/opengl/contextinfo/renderwindow.h deleted file mode 100644 index 964dd601a6..0000000000 --- a/examples/opengl/contextinfo/renderwindow.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef RENDERWINDOW_H -#define RENDERWINDOW_H - -#include <QWindow> -#include <QOpenGLVertexArrayObject> -#include <QOpenGLBuffer> - -QT_FORWARD_DECLARE_CLASS(QOpenGLContext) -QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram) - -class RenderWindow : public QWindow -{ - Q_OBJECT - -public: - RenderWindow(const QSurfaceFormat &format); - QOpenGLContext *context() { return m_context; } - void exposeEvent(QExposeEvent *) override; - void setForceGLSL110(bool enable) { m_forceGLSL110 = enable; } - -signals: - void ready(); - void error(const QString &msg); - -protected: - bool event(QEvent *ev) override; - -private slots: - void render(); - -private: - void init(); - void setupVertexAttribs(); - - QOpenGLContext *m_context; - bool m_initialized; - bool m_forceGLSL110; - QOpenGLShaderProgram *m_program; - int m_posAttr, m_colAttr, m_matrixUniform; - QOpenGLVertexArrayObject m_vao; - QOpenGLBuffer m_vbo; - float m_angle; -}; - -#endif // RENDERWINDOW_H diff --git a/examples/opengl/contextinfo/widget.cpp b/examples/opengl/contextinfo/widget.cpp deleted file mode 100644 index bc31497039..0000000000 --- a/examples/opengl/contextinfo/widget.cpp +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "widget.h" -#include "renderwindow.h" -#include <QVBoxLayout> -#include <QComboBox> -#include <QGroupBox> -#include <QRadioButton> -#include <QCheckBox> -#include <QHBoxLayout> -#include <QLabel> -#include <QList> -#include <QByteArray> -#include <QPushButton> -#include <QTextEdit> -#include <QSplitter> -#include <QGuiApplication> -#include <QSurfaceFormat> -#include <QOpenGLContext> -#include <QOpenGLFunctions> -#include <QDebug> -#include <QTextStream> - -struct Version { - const char *str; - int major; - int minor; -}; - -static struct Version versions[] = { - { "1.0", 1, 0 }, - { "1.1", 1, 1 }, - { "1.2", 1, 2 }, - { "1.3", 1, 3 }, - { "1.4", 1, 4 }, - { "1.5", 1, 5 }, - { "2.0", 2, 0 }, - { "2.1", 2, 1 }, - { "3.0", 3, 0 }, - { "3.1", 3, 1 }, - { "3.2", 3, 2 }, - { "3.3", 3, 3 }, - { "4.0", 4, 0 }, - { "4.1", 4, 1 }, - { "4.2", 4, 2 }, - { "4.3", 4, 3 }, - { "4.4", 4, 4 }, - { "4.5", 4, 5 } -}; - -struct Profile { - const char *str; - QSurfaceFormat::OpenGLContextProfile profile; -}; - -static struct Profile profiles[] = { - { "none", QSurfaceFormat::NoProfile }, - { "core", QSurfaceFormat::CoreProfile }, - { "compatibility", QSurfaceFormat::CompatibilityProfile } -}; - -struct Option { - const char *str; - QSurfaceFormat::FormatOption option; -}; - -static struct Option options[] = { - { "deprecated functions (not forward compatible)", QSurfaceFormat::DeprecatedFunctions }, - { "debug context", QSurfaceFormat::DebugContext }, - { "stereo buffers", QSurfaceFormat::StereoBuffers }, - // This is not a QSurfaceFormat option but is helpful to determine if the driver - // allows compiling old-style shaders with core profile. - { "force version 110 shaders", QSurfaceFormat::FormatOption(0) } -}; - -struct Renderable { - const char *str; - QSurfaceFormat::RenderableType renderable; -}; - -static struct Renderable renderables[] = { - { "default", QSurfaceFormat::DefaultRenderableType }, -#ifndef Q_OS_ANDROID - { "OpenGL", QSurfaceFormat::OpenGL }, -#endif - { "OpenGL ES", QSurfaceFormat::OpenGLES } -}; - -void Widget::addVersions(QLayout *layout) -{ - QHBoxLayout *hbox = new QHBoxLayout; - hbox->setSpacing(20); - QLabel *label = new QLabel(tr("Context &version: ")); - hbox->addWidget(label); - m_version = new QComboBox; - m_version->setMinimumWidth(60); - label->setBuddy(m_version); - hbox->addWidget(m_version); - for (size_t i = 0; i < sizeof(versions) / sizeof(Version); ++i) { - m_version->addItem(QString::fromLatin1(versions[i].str)); - if (versions[i].major == 2 && versions[i].minor == 0) - m_version->setCurrentIndex(m_version->count() - 1); - } - - QPushButton *btn = new QPushButton(tr("Create context")); - connect(btn, &QPushButton::clicked, this, &Widget::start); - btn->setMinimumSize(120, 40); - hbox->addWidget(btn); - - layout->addItem(hbox); -} - -void Widget::addProfiles(QLayout *layout) -{ - QGroupBox *groupBox = new QGroupBox(tr("Profile")); - QVBoxLayout *vbox = new QVBoxLayout; - for (size_t i = 0; i < sizeof(profiles) / sizeof(Profile); ++i) - vbox->addWidget(new QRadioButton(QString::fromLatin1(profiles[i].str))); - static_cast<QRadioButton *>(vbox->itemAt(0)->widget())->setChecked(true); - groupBox->setLayout(vbox); - layout->addWidget(groupBox); - m_profiles = vbox; -} - -void Widget::addOptions(QLayout *layout) -{ - QGroupBox *groupBox = new QGroupBox(tr("Options")); - QVBoxLayout *vbox = new QVBoxLayout; - for (size_t i = 0; i < sizeof(options) / sizeof(Option); ++i) - vbox->addWidget(new QCheckBox(QString::fromLatin1(options[i].str))); - groupBox->setLayout(vbox); - layout->addWidget(groupBox); - m_options = vbox; -} - -void Widget::addRenderableTypes(QLayout *layout) -{ - QGroupBox *groupBox = new QGroupBox(tr("Renderable type")); - QVBoxLayout *vbox = new QVBoxLayout; - for (size_t i = 0; i < sizeof(renderables) / sizeof(Renderable); ++i) - vbox->addWidget(new QRadioButton(QString::fromLatin1(renderables[i].str))); - static_cast<QRadioButton *>(vbox->itemAt(0)->widget())->setChecked(true); - groupBox->setLayout(vbox); - layout->addWidget(groupBox); - m_renderables = vbox; -} - -void Widget::addRenderWindow() -{ - m_renderWindowLayout->addWidget(m_renderWindowContainer); -} - -static QWidget *widgetWithLayout(QLayout *layout) -{ - QWidget *w = new QWidget; - w->setLayout(layout); - return w; -} - -Widget::Widget(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *layout = new QVBoxLayout; - QSplitter *vsplit = new QSplitter(Qt::Vertical); - layout->addWidget(vsplit); - - QSplitter *hsplit = new QSplitter; - - QVBoxLayout *settingsLayout = new QVBoxLayout; - addVersions(settingsLayout); - addProfiles(settingsLayout); - addOptions(settingsLayout); - addRenderableTypes(settingsLayout); - hsplit->addWidget(widgetWithLayout(settingsLayout)); - - QVBoxLayout *outputLayout = new QVBoxLayout; - m_output = new QTextEdit; - m_output->setReadOnly(true); - outputLayout->addWidget(m_output); - m_extensions = new QTextEdit; - m_extensions->setReadOnly(true); - outputLayout->addWidget(m_extensions); - hsplit->addWidget(widgetWithLayout(outputLayout)); - - hsplit->setStretchFactor(0, 4); - hsplit->setStretchFactor(1, 6); - vsplit->addWidget(hsplit); - - m_renderWindowLayout = new QVBoxLayout; - vsplit->addWidget(widgetWithLayout(m_renderWindowLayout)); - vsplit->setStretchFactor(1, 5); - - m_renderWindowContainer = new QWidget; - addRenderWindow(); - - QString description; - QTextStream str(&description); - str << "Qt " << QT_VERSION_STR << ' ' << QGuiApplication::platformName(); - const char *openGlVariables[] = - {"QT_ANGLE_PLATFORM", "QT_OPENGL", "QT_OPENGL_BUGLIST", "QT_OPENGL_DLL"}; - const size_t variableCount = sizeof(openGlVariables) / sizeof(openGlVariables[0]); - for (size_t v = 0; v < variableCount; ++v) { - if (qEnvironmentVariableIsSet(openGlVariables[v])) - str << ' ' << openGlVariables[v] << '=' << qgetenv(openGlVariables[v]); - } - if (QCoreApplication::testAttribute(Qt::AA_UseOpenGLES)) - str << " Qt::AA_UseOpenGLES"; - if (QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL)) - str << " Qt::AA_UseSoftwareOpenGL"; - if (QCoreApplication::testAttribute(Qt::AA_UseDesktopOpenGL)) - str << " Qt::AA_UseDesktopOpenGL"; - layout->addWidget(new QLabel(description)); - - setLayout(layout); -} - -void Widget::start() -{ - QSurfaceFormat fmt; - - int idx = m_version->currentIndex(); - if (idx < 0) - return; - fmt.setVersion(versions[idx].major, versions[idx].minor); - - for (size_t i = 0; i < sizeof(profiles) / sizeof(Profile); ++i) - if (static_cast<QRadioButton *>(m_profiles->itemAt(int(i))->widget())->isChecked()) { - fmt.setProfile(profiles[i].profile); - break; - } - - bool forceGLSL110 = false; - for (size_t i = 0; i < sizeof(options) / sizeof(Option); ++i) - if (static_cast<QCheckBox *>(m_options->itemAt(int(i))->widget())->isChecked()) { - if (options[i].option) - fmt.setOption(options[i].option); - else if (i == 3) - forceGLSL110 = true; - } - - for (size_t i = 0; i < sizeof(renderables) / sizeof(Renderable); ++i) - if (static_cast<QRadioButton *>(m_renderables->itemAt(int(i))->widget())->isChecked()) { - fmt.setRenderableType(renderables[i].renderable); - break; - } - - // The example rendering will need a depth buffer. - fmt.setDepthBufferSize(16); - - m_output->clear(); - m_extensions->clear(); - qDebug() << "Requesting surface format" << fmt; - - m_renderWindowLayout->removeWidget(m_renderWindowContainer); - delete m_renderWindowContainer; - - RenderWindow *renderWindow = new RenderWindow(fmt); - if (!renderWindow->context()) { - m_output->append(tr("Failed to create context")); - delete renderWindow; - m_renderWindowContainer = new QWidget; - addRenderWindow(); - return; - } - m_surface = renderWindow; - - renderWindow->setForceGLSL110(forceGLSL110); - connect(renderWindow, &RenderWindow::ready, this, &Widget::renderWindowReady); - connect(renderWindow, &RenderWindow::error, this, &Widget::renderWindowError); - - m_renderWindowContainer = QWidget::createWindowContainer(renderWindow); - addRenderWindow(); -} - -void Widget::printFormat(const QSurfaceFormat &format) -{ - m_output->append(tr("OpenGL version: %1.%2").arg(format.majorVersion()).arg(format.minorVersion())); - - for (size_t i = 0; i < sizeof(profiles) / sizeof(Profile); ++i) - if (profiles[i].profile == format.profile()) { - m_output->append(tr("Profile: %1").arg(QString::fromLatin1(profiles[i].str))); - break; - } - - QString opts; - for (size_t i = 0; i < sizeof(options) / sizeof(Option); ++i) - if (format.testOption(options[i].option)) - opts += QString::fromLatin1(options[i].str) + QLatin1Char(' '); - m_output->append(tr("Options: %1").arg(opts)); - - for (size_t i = 0; i < sizeof(renderables) / sizeof(Renderable); ++i) - if (renderables[i].renderable == format.renderableType()) { - m_output->append(tr("Renderable type: %1").arg(QString::fromLatin1(renderables[i].str))); - break; - } - - m_output->append(tr("Depth buffer size: %1").arg(QString::number(format.depthBufferSize()))); - m_output->append(tr("Stencil buffer size: %1").arg(QString::number(format.stencilBufferSize()))); - m_output->append(tr("Samples: %1").arg(QString::number(format.samples()))); - m_output->append(tr("Red buffer size: %1").arg(QString::number(format.redBufferSize()))); - m_output->append(tr("Green buffer size: %1").arg(QString::number(format.greenBufferSize()))); - m_output->append(tr("Blue buffer size: %1").arg(QString::number(format.blueBufferSize()))); - m_output->append(tr("Alpha buffer size: %1").arg(QString::number(format.alphaBufferSize()))); - m_output->append(tr("Swap interval: %1").arg(QString::number(format.swapInterval()))); -} - -void Widget::renderWindowReady() -{ - QOpenGLContext *context = QOpenGLContext::currentContext(); - Q_ASSERT(context); - - QString vendor, renderer, version, glslVersion; - const GLubyte *p; - QOpenGLFunctions *f = context->functions(); - if ((p = f->glGetString(GL_VENDOR))) - vendor = QString::fromLatin1(reinterpret_cast<const char *>(p)); - if ((p = f->glGetString(GL_RENDERER))) - renderer = QString::fromLatin1(reinterpret_cast<const char *>(p)); - if ((p = f->glGetString(GL_VERSION))) - version = QString::fromLatin1(reinterpret_cast<const char *>(p)); - if ((p = f->glGetString(GL_SHADING_LANGUAGE_VERSION))) - glslVersion = QString::fromLatin1(reinterpret_cast<const char *>(p)); - - m_output->append(tr("*** Context information ***")); - m_output->append(tr("Vendor: %1").arg(vendor)); - m_output->append(tr("Renderer: %1").arg(renderer)); - m_output->append(tr("OpenGL version: %1").arg(version)); - m_output->append(tr("GLSL version: %1").arg(glslVersion)); - - m_output->append(tr("\n*** QSurfaceFormat from context ***")); - printFormat(context->format()); - - m_output->append(tr("\n*** QSurfaceFormat from window surface ***")); - printFormat(m_surface->format()); - - m_output->append(tr("\n*** Qt build information ***")); - const char *gltype[] = { "Desktop", "GLES 2", "GLES 1" }; - m_output->append(tr("Qt OpenGL configuration: %1") - .arg(QString::fromLatin1(gltype[QOpenGLContext::openGLModuleType()]))); -#if defined(Q_OS_WIN) - using namespace QNativeInterface; - m_output->append(tr("Qt OpenGL library handle: %1") - .arg(QString::number(qintptr(QWGLContext::openGLModuleHandle()), 16))); -#endif - - QList<QByteArray> extensionList = context->extensions().values(); - std::sort(extensionList.begin(), extensionList.end()); - m_extensions->append(tr("Found %1 extensions:").arg(extensionList.count())); - for (const QByteArray &ext : std::as_const(extensionList)) - m_extensions->append(QString::fromLatin1(ext)); - - m_output->moveCursor(QTextCursor::Start); - m_extensions->moveCursor(QTextCursor::Start); -} - -void Widget::renderWindowError(const QString &msg) -{ - m_output->append(tr("An error has occurred:\n%1").arg(msg)); -} diff --git a/examples/opengl/contextinfo/widget.h b/examples/opengl/contextinfo/widget.h deleted file mode 100644 index e5c31fcaa7..0000000000 --- a/examples/opengl/contextinfo/widget.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WIDGET_H -#define WIDGET_H - -#include <QWidget> - -QT_FORWARD_DECLARE_CLASS(QComboBox) -QT_FORWARD_DECLARE_CLASS(QTextEdit) -QT_FORWARD_DECLARE_CLASS(QVBoxLayout) -QT_FORWARD_DECLARE_CLASS(QSurfaceFormat) -QT_FORWARD_DECLARE_CLASS(QSurface) - -class Widget : public QWidget -{ - Q_OBJECT - -public: - explicit Widget(QWidget *parent = nullptr); - -private slots: - void start(); - void renderWindowReady(); - void renderWindowError(const QString &msg); - -private: - void addVersions(QLayout *layout); - void addProfiles(QLayout *layout); - void addOptions(QLayout *layout); - void addRenderableTypes(QLayout *layout); - void addRenderWindow(); - void printFormat(const QSurfaceFormat &format); - - QComboBox *m_version; - QLayout *m_profiles; - QLayout *m_options; - QLayout *m_renderables; - QTextEdit *m_output; - QTextEdit *m_extensions; - QVBoxLayout *m_renderWindowLayout; - QWidget *m_renderWindowContainer; - QSurface *m_surface; -}; - -#endif // WIDGET_H diff --git a/examples/opengl/cube/CMakeLists.txt b/examples/opengl/cube/CMakeLists.txt index 0446a5d52e..7486d058a4 100644 --- a/examples/opengl/cube/CMakeLists.txt +++ b/examples/opengl/cube/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(cube LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/cube") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets) qt_standard_project_setup() @@ -58,7 +52,14 @@ qt6_add_resources(cube "textures" ) install(TARGETS cube - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET cube + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/cube/fshader.glsl b/examples/opengl/cube/fshader.glsl index 18068cf0e6..0c056b6165 100644 --- a/examples/opengl/cube/fshader.glsl +++ b/examples/opengl/cube/fshader.glsl @@ -1,3 +1,5 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifdef GL_ES // Set default precision to medium precision mediump int; diff --git a/examples/opengl/cube/vshader.glsl b/examples/opengl/cube/vshader.glsl index cfdc061852..ac57d96285 100644 --- a/examples/opengl/cube/vshader.glsl +++ b/examples/opengl/cube/vshader.glsl @@ -1,3 +1,5 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifdef GL_ES // Set default precision to medium precision mediump int; diff --git a/examples/opengl/doc/src/2dpainting.qdoc b/examples/opengl/doc/src/2dpainting.qdoc index 934097f38e..5196c78937 100644 --- a/examples/opengl/doc/src/2dpainting.qdoc +++ b/examples/opengl/doc/src/2dpainting.qdoc @@ -5,6 +5,7 @@ \example 2dpainting \title 2D Painting Example \ingroup examples-widgets-opengl + \examplecategory {Graphics} \brief The 2D Painting example shows how QPainter and QOpenGLWidget can be used together to display accelerated 2D graphics on supported hardware. diff --git a/examples/opengl/doc/src/cube.qdoc b/examples/opengl/doc/src/cube.qdoc index 1a92985565..d01985701c 100644 --- a/examples/opengl/doc/src/cube.qdoc +++ b/examples/opengl/doc/src/cube.qdoc @@ -5,6 +5,7 @@ \example cube \ingroup examples-widgets-opengl \title Cube OpenGL ES 2.0 example + \examplecategory {3D} \brief Shows how to manually rotate a textured 3D cube with user input. diff --git a/examples/opengl/doc/src/hellogl2.qdoc b/examples/opengl/doc/src/hellogl2.qdoc index 3a81b0dfad..29e8ef85cd 100644 --- a/examples/opengl/doc/src/hellogl2.qdoc +++ b/examples/opengl/doc/src/hellogl2.qdoc @@ -5,6 +5,7 @@ \example hellogl2 \title Hello GL2 Example \ingroup examples-widgets-opengl + \examplecategory {3D} \brief The Hello GL2 example demonstrates the basic use of the OpenGL-related classes provided with Qt. diff --git a/examples/opengl/doc/src/hellogles3.qdoc b/examples/opengl/doc/src/hellogles3.qdoc index c83ecd50f7..d85f40a29f 100644 --- a/examples/opengl/doc/src/hellogles3.qdoc +++ b/examples/opengl/doc/src/hellogles3.qdoc @@ -5,6 +5,8 @@ \example hellogles3 \title Hello GLES3 Example \ingroup examples-widgets-opengl + \examplecategory {Graphics} + \examplecategory {Mobile} \brief Demonstrates OpenGL ES 3.0 functions via QOpenGLExtraFunctions. diff --git a/examples/opengl/doc/src/openglwindow.qdoc b/examples/opengl/doc/src/openglwindow.qdoc index 505ff20fbc..cade2f009a 100644 --- a/examples/opengl/doc/src/openglwindow.qdoc +++ b/examples/opengl/doc/src/openglwindow.qdoc @@ -4,6 +4,8 @@ /*! \example openglwindow \title OpenGL Window Example + \ingroup examples-widgets-opengl + \examplecategory {Graphics} \brief This example shows how to create a minimal QWindow based application for the purpose of using OpenGL. diff --git a/examples/opengl/doc/src/stereoqopenglwidget.qdoc b/examples/opengl/doc/src/stereoqopenglwidget.qdoc index c4e51f9cee..0cb45b9808 100644 --- a/examples/opengl/doc/src/stereoqopenglwidget.qdoc +++ b/examples/opengl/doc/src/stereoqopenglwidget.qdoc @@ -4,9 +4,17 @@ /*! \example stereoqopenglwidget \title QOpenGLWidget Stereoscopic Rendering Example + \examplecategory {Graphics} + \ingroup examples-widgets-opengl + \brief This example shows how to create a minimal QOpenGLWidget based + application with stereoscopic rendering support. - \brief This example shows how to create a minimal QOpenGLWidget based application - with stereoscopic rendering support. + \note Support for stereoscopic rendering has certain hardware requirements, + such as, a graphics card with stereo support, 3D glasses and specific + monitors. + + \note This example renders two images to two separate buffers. When you + view the images through 3D glasses, they give a 3D holographic effect. \image stereoexample-leftbuffer.png @@ -16,9 +24,6 @@ The above image is what will be rendered to the right buffer. - \note Support for stereoscopic rendering has certain hardware requirements, like - your graphics card needs stereo support. - \section1 Setting the correct surface flag To enable stereoscopic rendering you need to set the flag QSurfaceFormat::StereoBuffers globally. Just doing it on the widget is not enough diff --git a/examples/opengl/hellogl2/CMakeLists.txt b/examples/opengl/hellogl2/CMakeLists.txt index 8846fcc23e..74ef4a8c24 100644 --- a/examples/opengl/hellogl2/CMakeLists.txt +++ b/examples/opengl/hellogl2/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(hellogl2 LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/hellogl2") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets) qt_standard_project_setup() @@ -36,7 +30,14 @@ target_link_libraries(hellogl2 PRIVATE ) install(TARGETS hellogl2 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET hellogl2 + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/hellogl2/mainwindow.cpp b/examples/opengl/hellogl2/mainwindow.cpp index 2416fd6057..5ee2b738c2 100644 --- a/examples/opengl/hellogl2/mainwindow.cpp +++ b/examples/opengl/hellogl2/mainwindow.cpp @@ -3,19 +3,19 @@ #include "mainwindow.h" #include "window.h" +#include <QApplication> +#include <QKeySequence> #include <QMenuBar> #include <QMenu> #include <QMessageBox> MainWindow::MainWindow() { - QMenuBar *menuBar = new QMenuBar; - QMenu *menuWindow = menuBar->addMenu(tr("&Window")); - QAction *addNew = new QAction(menuWindow); - addNew->setText(tr("Add new")); - menuWindow->addAction(addNew); - connect(addNew, &QAction::triggered, this, &MainWindow::onAddNew); - setMenuBar(menuBar); + QMenu *menuWindow = menuBar()->addMenu(tr("&Window")); + menuWindow->addAction(tr("Add new"), QKeySequence(Qt::CTRL | Qt::Key_N), + this, &MainWindow::onAddNew); + menuWindow->addAction(tr("Quit"), QKeySequence(Qt::CTRL | Qt::Key_Q), + qApp, QApplication::closeAllWindows); onAddNew(); } @@ -23,8 +23,8 @@ MainWindow::MainWindow() void MainWindow::onAddNew() { if (!centralWidget()) - setCentralWidget(new Window(this)); + setCentralWidget(new Window); else - QMessageBox::information(nullptr, tr("Cannot add new window"), + QMessageBox::information(this, tr("Cannot Add New Window"), tr("Already occupied. Undock first.")); } diff --git a/examples/opengl/hellogl2/window.cpp b/examples/opengl/hellogl2/window.cpp index 055dd5b5e3..5a7ddf826f 100644 --- a/examples/opengl/hellogl2/window.cpp +++ b/examples/opengl/hellogl2/window.cpp @@ -1,9 +1,8 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include "glwidget.h" #include "window.h" -#include "mainwindow.h" +#include "glwidget.h" #include <QSlider> #include <QVBoxLayout> #include <QHBoxLayout> @@ -11,9 +10,18 @@ #include <QPushButton> #include <QApplication> #include <QMessageBox> +#include <QMainWindow> -Window::Window(MainWindow *mw) - : mainWindow(mw) +static QMainWindow *findMainWindow() +{ + for (auto *w : QApplication::topLevelWidgets()) { + if (auto *mw = qobject_cast<QMainWindow *>(w)) + return mw; + } + return nullptr; +} + +Window::Window() { glWidget = new GLWidget; @@ -28,22 +36,19 @@ Window::Window(MainWindow *mw) connect(zSlider, &QSlider::valueChanged, glWidget, &GLWidget::setZRotation); connect(glWidget, &GLWidget::zRotationChanged, zSlider, &QSlider::setValue); - QVBoxLayout *mainLayout = new QVBoxLayout; - QHBoxLayout *container = new QHBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout(this); + QWidget *w = new QWidget; + QHBoxLayout *container = new QHBoxLayout(w); container->addWidget(glWidget); container->addWidget(xSlider); container->addWidget(ySlider); container->addWidget(zSlider); - QWidget *w = new QWidget; - w->setLayout(container); mainLayout->addWidget(w); dockBtn = new QPushButton(tr("Undock"), this); connect(dockBtn, &QPushButton::clicked, this, &Window::dockUndock); mainLayout->addWidget(dockBtn); - setLayout(mainLayout); - xSlider->setValue(15 * 16); ySlider->setValue(345 * 16); zSlider->setValue(0 * 16); @@ -64,7 +69,7 @@ QSlider *Window::createSlider() void Window::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Escape) + if (isWindow() && e->key() == Qt::Key_Escape) close(); else QWidget::keyPressEvent(e); @@ -72,26 +77,37 @@ void Window::keyPressEvent(QKeyEvent *e) void Window::dockUndock() { - if (parent()) { - setParent(nullptr); - setAttribute(Qt::WA_DeleteOnClose); - move(QGuiApplication::primaryScreen()->size().width() / 2 - width() / 2, - QGuiApplication::primaryScreen()->size().height() / 2 - height() / 2); - dockBtn->setText(tr("Dock")); - show(); - } else { - if (!mainWindow->centralWidget()) { - if (mainWindow->isVisible()) { - setAttribute(Qt::WA_DeleteOnClose, false); - dockBtn->setText(tr("Undock")); - mainWindow->setCentralWidget(this); - } else { - QMessageBox::information(nullptr, tr("Cannot dock"), - tr("Main window already closed")); - } - } else { - QMessageBox::information(nullptr, tr("Cannot dock"), - tr("Main window already occupied")); - } + if (parent()) + undock(); + else + dock(); +} + +void Window::dock() +{ + auto *mainWindow = findMainWindow(); + if (mainWindow == nullptr || !mainWindow->isVisible()) { + QMessageBox::information(this, tr("Cannot Dock"), + tr("Main window already closed")); + return; } + if (mainWindow->centralWidget()) { + QMessageBox::information(this, tr("Cannot Dock"), + tr("Main window already occupied")); + return; + } + setAttribute(Qt::WA_DeleteOnClose, false); + dockBtn->setText(tr("Undock")); + mainWindow->setCentralWidget(this); +} + +void Window::undock() +{ + setParent(nullptr); + setAttribute(Qt::WA_DeleteOnClose); + const auto geometry = screen()->availableGeometry(); + move(geometry.x() + (geometry.width() - width()) / 2, + geometry.y() + (geometry.height() - height()) / 2); + dockBtn->setText(tr("Dock")); + show(); } diff --git a/examples/opengl/hellogl2/window.h b/examples/opengl/hellogl2/window.h index 2099bc119a..edbd643ae2 100644 --- a/examples/opengl/hellogl2/window.h +++ b/examples/opengl/hellogl2/window.h @@ -10,14 +10,13 @@ QT_FORWARD_DECLARE_CLASS(QSlider) QT_FORWARD_DECLARE_CLASS(QPushButton) class GLWidget; -class MainWindow; class Window : public QWidget { Q_OBJECT public: - Window(MainWindow *mw); + Window(); protected: void keyPressEvent(QKeyEvent *event) override; @@ -26,6 +25,8 @@ private slots: void dockUndock(); private: + void dock(); + void undock(); QSlider *createSlider(); GLWidget *glWidget; @@ -33,7 +34,6 @@ private: QSlider *ySlider; QSlider *zSlider; QPushButton *dockBtn; - MainWindow *mainWindow; }; #endif diff --git a/examples/opengl/hellogles3/CMakeLists.txt b/examples/opengl/hellogles3/CMakeLists.txt index 917f64568c..07df173a47 100644 --- a/examples/opengl/hellogles3/CMakeLists.txt +++ b/examples/opengl/hellogles3/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(hellogles3 LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/hellogles3") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL) qt_standard_project_setup() @@ -44,7 +38,14 @@ qt_add_resources(hellogles3 "hellogles3" ) install(TARGETS hellogles3 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET hellogles3 + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/opengl.pro b/examples/opengl/opengl.pro index f33921a79b..6ee57c7018 100644 --- a/examples/opengl/opengl.pro +++ b/examples/opengl/opengl.pro @@ -4,8 +4,7 @@ SUBDIRS = openglwindow \ hellogles3 qtHaveModule(widgets) { - SUBDIRS += contextinfo \ - 2dpainting \ + SUBDIRS += 2dpainting \ hellogl2 \ cube \ textures \ diff --git a/examples/opengl/openglwindow/CMakeLists.txt b/examples/opengl/openglwindow/CMakeLists.txt index 3558ce549d..0258a42822 100644 --- a/examples/opengl/openglwindow/CMakeLists.txt +++ b/examples/opengl/openglwindow/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(openglwindow LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/openglwindow") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL) qt_standard_project_setup() @@ -31,7 +25,14 @@ target_link_libraries(openglwindow PRIVATE ) install(TARGETS openglwindow - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET openglwindow + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/openglwindow/main.cpp b/examples/opengl/openglwindow/main.cpp index 6813dc9efd..89933fa379 100644 --- a/examples/opengl/openglwindow/main.cpp +++ b/examples/opengl/openglwindow/main.cpp @@ -6,10 +6,10 @@ #include <QGuiApplication> #include <QMatrix4x4> #include <QOpenGLShaderProgram> +#include <QOpenGLBuffer> #include <QScreen> #include <QtMath> - //! [1] class TriangleWindow : public OpenGLWindow { @@ -20,10 +20,8 @@ public: void render() override; private: - GLint m_posAttr = 0; - GLint m_colAttr = 0; GLint m_matrixUniform = 0; - + QOpenGLBuffer m_vbo; QOpenGLShaderProgram *m_program = nullptr; int m_frame = 0; }; @@ -48,36 +46,48 @@ int main(int argc, char **argv) } //! [2] - //! [3] -static const char *vertexShaderSource = - "attribute highp vec4 posAttr;\n" - "attribute lowp vec4 colAttr;\n" - "varying lowp vec4 col;\n" - "uniform highp mat4 matrix;\n" - "void main() {\n" - " col = colAttr;\n" - " gl_Position = matrix * posAttr;\n" - "}\n"; - -static const char *fragmentShaderSource = - "varying lowp vec4 col;\n" - "void main() {\n" - " gl_FragColor = col;\n" - "}\n"; +static const char *vertexShaderSource = "attribute highp vec4 posAttr;\n" + "attribute lowp vec4 colAttr;\n" + "varying lowp vec4 col;\n" + "uniform highp mat4 matrix;\n" + "void main() {\n" + " col = colAttr;\n" + " gl_Position = matrix * posAttr;\n" + "}\n"; + +static const char *fragmentShaderSource = "varying lowp vec4 col;\n" + "void main() {\n" + " gl_FragColor = col;\n" + "}\n"; //! [3] //! [4] void TriangleWindow::initialize() { + static const GLfloat vertices_colors[] = { +0.0f, +0.707f, 1.0f, 0.0f, 0.0f, + -0.5f, -0.500f, 0.0f, 1.0f, 0.0f, + +0.5f, -0.500f, 0.0f, 0.0f, 1.0f }; + + m_vbo.create(); + m_vbo.bind(); + m_vbo.allocate(vertices_colors, sizeof(vertices_colors)); + + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), nullptr); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), + reinterpret_cast<void *>(2 * sizeof(GLfloat))); + m_program = new QOpenGLShaderProgram(this); m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); + m_program->bindAttributeLocation("posAttr", 0); + m_program->bindAttributeLocation("colAttr", 1); m_program->link(); - m_posAttr = m_program->attributeLocation("posAttr"); - Q_ASSERT(m_posAttr != -1); - m_colAttr = m_program->attributeLocation("colAttr"); - Q_ASSERT(m_colAttr != -1); + m_program->bind(); + m_matrixUniform = m_program->uniformLocation("matrix"); Q_ASSERT(m_matrixUniform != -1); } @@ -100,28 +110,13 @@ void TriangleWindow::render() m_program->setUniformValue(m_matrixUniform, matrix); - static const GLfloat vertices[] = { - 0.0f, 0.707f, - -0.5f, -0.5f, - 0.5f, -0.5f - }; - - static const GLfloat colors[] = { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f - }; - - glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, 0, vertices); - glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors); - - glEnableVertexAttribArray(m_posAttr); - glEnableVertexAttribArray(m_colAttr); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); glDrawArrays(GL_TRIANGLES, 0, 3); - glDisableVertexAttribArray(m_colAttr); - glDisableVertexAttribArray(m_posAttr); + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); m_program->release(); diff --git a/examples/opengl/stereoqopenglwidget/CMakeLists.txt b/examples/opengl/stereoqopenglwidget/CMakeLists.txt index 214b359c66..d0fb7a0345 100644 --- a/examples/opengl/stereoqopenglwidget/CMakeLists.txt +++ b/examples/opengl/stereoqopenglwidget/CMakeLists.txt @@ -1,17 +1,11 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(stereoqopenglwidget LANGUAGES CXX) set(CMAKE_AUTOMOC ON) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/stereoqopenglwidget") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets) qt_add_executable(stereoqopenglwidget @@ -35,7 +29,14 @@ target_link_libraries(stereoqopenglwidget PUBLIC install(TARGETS stereoqopenglwidget - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET stereoqopenglwidget + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/textures/CMakeLists.txt b/examples/opengl/textures/CMakeLists.txt index 5103782381..2765355c5a 100644 --- a/examples/opengl/textures/CMakeLists.txt +++ b/examples/opengl/textures/CMakeLists.txt @@ -1,15 +1,9 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(textures LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/opengl/textures") - find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets) qt_standard_project_setup() @@ -51,7 +45,14 @@ qt6_add_resources(textures "textures" ) install(TARGETS textures - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET textures + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/opengl/textures/main.cpp b/examples/opengl/textures/main.cpp index c1e91e6257..7e5f0646cb 100644 --- a/examples/opengl/textures/main.cpp +++ b/examples/opengl/textures/main.cpp @@ -8,8 +8,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(textures); - QApplication app(argc, argv); QSurfaceFormat format; |