diff options
Diffstat (limited to 'examples/opengl/cube')
-rw-r--r-- | examples/opengl/cube/cube.pro | 21 | ||||
-rw-r--r-- | examples/opengl/cube/geometryengine.cpp | 46 | ||||
-rw-r--r-- | examples/opengl/cube/geometryengine.h | 15 | ||||
-rw-r--r-- | examples/opengl/cube/main.cpp | 8 | ||||
-rw-r--r-- | examples/opengl/cube/mainwidget.cpp | 46 | ||||
-rw-r--r-- | examples/opengl/cube/mainwidget.h | 30 |
6 files changed, 87 insertions, 79 deletions
diff --git a/examples/opengl/cube/cube.pro b/examples/opengl/cube/cube.pro index 85272bc471..b9416f1a9d 100644 --- a/examples/opengl/cube/cube.pro +++ b/examples/opengl/cube/cube.pro @@ -5,20 +5,17 @@ TEMPLATE = app SOURCES += main.cpp -qtHaveModule(opengl) { - QT += opengl +SOURCES += \ + mainwidget.cpp \ + geometryengine.cpp - SOURCES += mainwidget.cpp \ - geometryengine.cpp +HEADERS += \ + mainwidget.h \ + geometryengine.h - HEADERS += \ - mainwidget.h \ - geometryengine.h - - RESOURCES += \ - shaders.qrc \ - textures.qrc -} +RESOURCES += \ + shaders.qrc \ + textures.qrc # install target.path = $$[QT_INSTALL_EXAMPLES]/opengl/cube diff --git a/examples/opengl/cube/geometryengine.cpp b/examples/opengl/cube/geometryengine.cpp index 0a34213084..618a080c37 100644 --- a/examples/opengl/cube/geometryengine.cpp +++ b/examples/opengl/cube/geometryengine.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -49,29 +49,27 @@ struct VertexData QVector2D texCoord; }; +//! [0] GeometryEngine::GeometryEngine() + : indexBuf(QOpenGLBuffer::IndexBuffer) { -} - -GeometryEngine::~GeometryEngine() -{ - glDeleteBuffers(2, vboIds); -} - -void GeometryEngine::init() -{ - initializeGLFunctions(); + initializeOpenGLFunctions(); -//! [0] // Generate 2 VBOs - glGenBuffers(2, vboIds); - -//! [0] + arrayBuf.create(); + indexBuf.create(); // Initializes cube geometry and transfers it to VBOs initCubeGeometry(); } +GeometryEngine::~GeometryEngine() +{ + arrayBuf.destroy(); + indexBuf.destroy(); +} +//! [0] + void GeometryEngine::initCubeGeometry() { // For cube we would need only 8 vertices but we have to @@ -133,21 +131,21 @@ void GeometryEngine::initCubeGeometry() //! [1] // Transfer vertex data to VBO 0 - glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); - glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(VertexData), vertices, GL_STATIC_DRAW); + arrayBuf.bind(); + arrayBuf.allocate(vertices, 24 * sizeof(VertexData)); // Transfer index data to VBO 1 - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, 34 * sizeof(GLushort), indices, GL_STATIC_DRAW); + indexBuf.bind(); + indexBuf.allocate(indices, 34 * sizeof(GLushort)); //! [1] } //! [2] -void GeometryEngine::drawCubeGeometry(QGLShaderProgram *program) +void GeometryEngine::drawCubeGeometry(QOpenGLShaderProgram *program) { // Tell OpenGL which VBOs to use - glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); + arrayBuf.bind(); + indexBuf.bind(); // Offset for position quintptr offset = 0; @@ -155,7 +153,7 @@ void GeometryEngine::drawCubeGeometry(QGLShaderProgram *program) // Tell OpenGL programmable pipeline how to locate vertex position data int vertexLocation = program->attributeLocation("a_position"); program->enableAttributeArray(vertexLocation); - glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); + program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); // Offset for texture coordinate offset += sizeof(QVector3D); @@ -163,7 +161,7 @@ void GeometryEngine::drawCubeGeometry(QGLShaderProgram *program) // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data int texcoordLocation = program->attributeLocation("a_texcoord"); program->enableAttributeArray(texcoordLocation); - glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset); + program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData)); // Draw cube geometry using indices from VBO 1 glDrawElements(GL_TRIANGLE_STRIP, 34, GL_UNSIGNED_SHORT, 0); diff --git a/examples/opengl/cube/geometryengine.h b/examples/opengl/cube/geometryengine.h index fe90c436c6..0b51ebf5f2 100644 --- a/examples/opengl/cube/geometryengine.h +++ b/examples/opengl/cube/geometryengine.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -41,22 +41,23 @@ #ifndef GEOMETRYENGINE_H #define GEOMETRYENGINE_H -#include <QGLFunctions> -#include <QGLShaderProgram> +#include <QOpenGLFunctions> +#include <QOpenGLShaderProgram> +#include <QOpenGLBuffer> -class GeometryEngine : protected QGLFunctions +class GeometryEngine : protected QOpenGLFunctions { public: GeometryEngine(); virtual ~GeometryEngine(); - void init(); - void drawCubeGeometry(QGLShaderProgram *program); + void drawCubeGeometry(QOpenGLShaderProgram *program); private: void initCubeGeometry(); - GLuint vboIds[2]; + QOpenGLBuffer arrayBuf; + QOpenGLBuffer indexBuf; }; #endif // GEOMETRYENGINE_H diff --git a/examples/opengl/cube/main.cpp b/examples/opengl/cube/main.cpp index a414fad023..73363da016 100644 --- a/examples/opengl/cube/main.cpp +++ b/examples/opengl/cube/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -40,6 +40,7 @@ #include <QApplication> #include <QLabel> +#include <QSurfaceFormat> #ifndef QT_NO_OPENGL #include "mainwidget.h" @@ -48,6 +49,11 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); + + QSurfaceFormat format; + format.setDepthBufferSize(24); + QSurfaceFormat::setDefaultFormat(format); + app.setApplicationName("cube"); app.setApplicationVersion("0.1"); #ifndef QT_NO_OPENGL diff --git a/examples/opengl/cube/mainwidget.cpp b/examples/opengl/cube/mainwidget.cpp index 5c1cd28b54..b5a7a972d1 100644 --- a/examples/opengl/cube/mainwidget.cpp +++ b/examples/opengl/cube/mainwidget.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -45,14 +45,21 @@ #include <math.h> MainWidget::MainWidget(QWidget *parent) : - QGLWidget(parent), + QOpenGLWidget(parent), + geometries(0), + texture(0), angularSpeed(0) { } MainWidget::~MainWidget() { - deleteTexture(texture); + // Make sure the context is current when deleting the texture + // and the buffers. + makeCurrent(); + delete texture; + delete geometries; + doneCurrent(); } //! [0] @@ -95,16 +102,18 @@ void MainWidget::timerEvent(QTimerEvent *) // Update rotation rotation = QQuaternion::fromAxisAndAngle(rotationAxis, angularSpeed) * rotation; - // Update scene - updateGL(); + // Request an update + update(); } } //! [1] void MainWidget::initializeGL() { - initializeGLFunctions(); - qglClearColor(Qt::black); + initializeOpenGLFunctions(); + + glClearColor(0, 0, 0, 1); + initShaders(); initTextures(); @@ -116,7 +125,7 @@ void MainWidget::initializeGL() glEnable(GL_CULL_FACE); //! [2] - geometries.init(); + geometries = new GeometryEngine; // Use QBasicTimer because its faster than QTimer timer.start(12, this); @@ -126,11 +135,11 @@ void MainWidget::initializeGL() void MainWidget::initShaders() { // Compile vertex shader - if (!program.addShaderFromSourceFile(QGLShader::Vertex, ":/vshader.glsl")) + if (!program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vshader.glsl")) close(); // Compile fragment shader - if (!program.addShaderFromSourceFile(QGLShader::Fragment, ":/fshader.glsl")) + if (!program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fshader.glsl")) close(); // Link shader pipeline @@ -147,28 +156,23 @@ void MainWidget::initShaders() void MainWidget::initTextures() { // Load cube.png image - glEnable(GL_TEXTURE_2D); - texture = bindTexture(QImage(":/cube.png")); + texture = new QOpenGLTexture(QImage(":/cube.png").mirrored()); // Set nearest filtering mode for texture minification - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + texture->setMinificationFilter(QOpenGLTexture::Nearest); // Set bilinear filtering mode for texture magnification - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + texture->setMagnificationFilter(QOpenGLTexture::Linear); // Wrap texture coordinates by repeating // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + texture->setWrapMode(QOpenGLTexture::Repeat); } //! [4] //! [5] void MainWidget::resizeGL(int w, int h) { - // Set OpenGL viewport to cover whole widget - glViewport(0, 0, w, h); - // Calculate aspect ratio qreal aspect = qreal(w) / qreal(h ? h : 1); @@ -188,6 +192,8 @@ void MainWidget::paintGL() // Clear color and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + texture->bind(); + //! [6] // Calculate model view transformation QMatrix4x4 matrix; @@ -202,5 +208,5 @@ void MainWidget::paintGL() program.setUniformValue("texture", 0); // Draw cube geometry - geometries.drawCubeGeometry(&program); + geometries->drawCubeGeometry(&program); } diff --git a/examples/opengl/cube/mainwidget.h b/examples/opengl/cube/mainwidget.h index 2e6b6bcc77..8aff8f7714 100644 --- a/examples/opengl/cube/mainwidget.h +++ b/examples/opengl/cube/mainwidget.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -43,18 +43,18 @@ #include "geometryengine.h" -#include <QGLWidget> -#include <QGLFunctions> +#include <QOpenGLWidget> +#include <QOpenGLFunctions> #include <QMatrix4x4> #include <QQuaternion> #include <QVector2D> #include <QBasicTimer> -#include <QGLShaderProgram> - +#include <QOpenGLShaderProgram> +#include <QOpenGLTexture> class GeometryEngine; -class MainWidget : public QGLWidget, protected QGLFunctions +class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT @@ -63,23 +63,23 @@ public: ~MainWidget(); protected: - void mousePressEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *e); - void timerEvent(QTimerEvent *e); + void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE; - void initializeGL(); - void resizeGL(int w, int h); - void paintGL(); + void initializeGL() Q_DECL_OVERRIDE; + void resizeGL(int w, int h) Q_DECL_OVERRIDE; + void paintGL() Q_DECL_OVERRIDE; void initShaders(); void initTextures(); private: QBasicTimer timer; - QGLShaderProgram program; - GeometryEngine geometries; + QOpenGLShaderProgram program; + GeometryEngine *geometries; - GLuint texture; + QOpenGLTexture *texture; QMatrix4x4 projection; |