summaryrefslogtreecommitdiffstats
path: root/examples/opengl/cube
diff options
context:
space:
mode:
Diffstat (limited to 'examples/opengl/cube')
-rw-r--r--examples/opengl/cube/cube.pro21
-rw-r--r--examples/opengl/cube/geometryengine.cpp46
-rw-r--r--examples/opengl/cube/geometryengine.h15
-rw-r--r--examples/opengl/cube/main.cpp8
-rw-r--r--examples/opengl/cube/mainwidget.cpp46
-rw-r--r--examples/opengl/cube/mainwidget.h30
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;