summaryrefslogtreecommitdiffstats
path: root/examples/opengl
diff options
context:
space:
mode:
authorJason Barron <jbarron@trolltech.com>2009-06-25 15:49:53 +0200
committerJason Barron <jbarron@trolltech.com>2009-06-25 15:49:53 +0200
commitdb8f05e257019694f5e8076845626008f2adc3dd (patch)
tree05d3959403cf15ac5f702091439e028af01f343b /examples/opengl
parent8aafaa65a1d16f8b982279f5aceedf1e281ddb5a (diff)
parent796a5a2c7d8c91a46ac761dde18b7da2ec6c177b (diff)
Merge commit 'qt/master-stable' into 4.6-stable
Bring Qt 4.6 into the Qt-S60 repo. Conflicts: configure.exe mkspecs/features/qttest_p4.prf qmake/generators/makefile.cpp src/corelib/io/qdir.cpp src/corelib/io/qprocess.h src/corelib/kernel/qcoreevent.h src/corelib/kernel/qobject.cpp src/corelib/kernel/qsharedmemory_unix.cpp src/corelib/thread/qthread_p.h src/corelib/tools/qvector.h src/gui/dialogs/qdialog.cpp src/gui/dialogs/qfiledialog.cpp src/gui/dialogs/qfiledialog_p.h src/gui/dialogs/qmessagebox.cpp src/gui/graphicsview/qgraphicsitem.cpp src/gui/graphicsview/qgraphicsview.cpp src/gui/image/qpixmapcache.cpp src/gui/kernel/qapplication.cpp src/gui/kernel/qapplication_p.h src/gui/kernel/qwidget.cpp src/gui/kernel/qwidget_p.h src/gui/painting/qdrawhelper.cpp src/gui/painting/qpaintengine_raster.cpp src/gui/text/qfontengine_qpf.cpp src/gui/widgets/qmenubar.cpp src/network/socket/qlocalserver.cpp src/testlib/qtestcase.cpp src/testlib/testlib.pro tests/auto/qimagereader/tst_qimagereader.cpp tests/auto/qitemdelegate/tst_qitemdelegate.cpp tests/auto/qnetworkreply/tst_qnetworkreply.cpp tests/auto/qpixmap/qpixmap.pro
Diffstat (limited to 'examples/opengl')
-rw-r--r--examples/opengl/framebufferobject/glwidget.cpp28
-rw-r--r--examples/opengl/framebufferobject/glwidget.h3
-rw-r--r--examples/opengl/grabber/mainwindow.cpp2
-rw-r--r--examples/opengl/hellogl_es2/glwidget.cpp391
-rw-r--r--examples/opengl/hellogl_es2/glwidget.h31
5 files changed, 146 insertions, 309 deletions
diff --git a/examples/opengl/framebufferobject/glwidget.cpp b/examples/opengl/framebufferobject/glwidget.cpp
index d3591d60c..3cb392999 100644
--- a/examples/opengl/framebufferobject/glwidget.cpp
+++ b/examples/opengl/framebufferobject/glwidget.cpp
@@ -53,7 +53,18 @@ GLWidget::GLWidget(QWidget *parent)
{
setWindowTitle(tr("OpenGL framebuffer objects"));
makeCurrent();
- fbo = new QGLFramebufferObject(1024, 1024);
+
+ if (QGLFramebufferObject::hasOpenGLFramebufferBlit()) {
+ QGLFramebufferObjectFormat format;
+ format.setSamples(4);
+
+ render_fbo = new QGLFramebufferObject(512, 512, format);
+ texture_fbo = new QGLFramebufferObject(512, 512);
+ } else {
+ render_fbo = new QGLFramebufferObject(1024, 1024);
+ texture_fbo = render_fbo;
+ }
+
rot_x = rot_y = rot_z = 0.0f;
scale = 0.1f;
anim = new QTimeLine(750, this);
@@ -113,7 +124,9 @@ GLWidget::~GLWidget()
{
delete[] wave;
glDeleteLists(tile_list, 1);
- delete fbo;
+ delete texture_fbo;
+ if (render_fbo != texture_fbo)
+ delete render_fbo;
}
void GLWidget::paintEvent(QPaintEvent *)
@@ -129,10 +142,16 @@ void GLWidget::draw()
saveGLState();
// render the 'bubbles.svg' file into our framebuffer object
- QPainter fbo_painter(fbo);
+ QPainter fbo_painter(render_fbo);
svg_renderer->render(&fbo_painter);
fbo_painter.end();
+ if (render_fbo != texture_fbo) {
+ QRect rect(0, 0, render_fbo->width(), render_fbo->height());
+ QGLFramebufferObject::blitFramebuffer(texture_fbo, rect,
+ render_fbo, rect);
+ }
+
// draw into the GL widget
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
@@ -145,8 +164,9 @@ void GLWidget::draw()
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glBindTexture(GL_TEXTURE_2D, fbo->texture());
+ glBindTexture(GL_TEXTURE_2D, texture_fbo->texture());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glEnable(GL_MULTISAMPLE);
glEnable(GL_CULL_FACE);
diff --git a/examples/opengl/framebufferobject/glwidget.h b/examples/opengl/framebufferobject/glwidget.h
index b64cfa87f..d97ef7839 100644
--- a/examples/opengl/framebufferobject/glwidget.h
+++ b/examples/opengl/framebufferobject/glwidget.h
@@ -77,6 +77,7 @@ private:
QImage logo;
QTimeLine *anim;
QSvgRenderer *svg_renderer;
- QGLFramebufferObject *fbo;
+ QGLFramebufferObject *render_fbo;
+ QGLFramebufferObject *texture_fbo;
};
diff --git a/examples/opengl/grabber/mainwindow.cpp b/examples/opengl/grabber/mainwindow.cpp
index 7e878f967..9e2702361 100644
--- a/examples/opengl/grabber/mainwindow.cpp
+++ b/examples/opengl/grabber/mainwindow.cpp
@@ -136,7 +136,7 @@ void MainWindow::createActions()
connect(clearPixmapAct, SIGNAL(triggered()), this, SLOT(clearPixmap()));
exitAct = new QAction(tr("E&xit"), this);
- exitAct->setShortcut(tr("Ctrl+Q"));
+ exitAct->setShortcuts(QKeySequence::Quit);
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
aboutAct = new QAction(tr("&About"), this);
diff --git a/examples/opengl/hellogl_es2/glwidget.cpp b/examples/opengl/hellogl_es2/glwidget.cpp
index 213c5b2a3..cb4a48de9 100644
--- a/examples/opengl/hellogl_es2/glwidget.cpp
+++ b/examples/opengl/hellogl_es2/glwidget.cpp
@@ -48,124 +48,10 @@
const int bubbleNum = 8;
-inline void CrossProduct(qreal &xOut, qreal &yOut, qreal &zOut, qreal x1, qreal y1, qreal z1, qreal x2, qreal y2, qreal z2)
-{
- xOut = y1 * z2 - z1 * y2;
- yOut = z1 * x2 - x1 * z2;
- zOut = x1 * y2 - y1 * x2;
-}
-
-inline void Normalize(qreal &x, qreal &y, qreal &z)
-{
- qreal l = sqrt(x*x + y*y + z*z);
- x = x / l;
- y = y / l;
- z = z / l;
-}
-
-inline void IdentityMatrix(GLfloat *m)
-{
- m[0 * 4 + 0] = 1.0f;
- m[1 * 4 + 0] = 0.0f;
- m[2 * 4 + 0] = 0.0f;
- m[3 * 4 + 0] = 0.0f;
- m[0 * 4 + 1] = 0.0f;
- m[1 * 4 + 1] = 1.0f;
- m[2 * 4 + 1] = 0.0f;
- m[3 * 4 + 1] = 0.0f;
- m[0 * 4 + 2] = 0.0f;
- m[1 * 4 + 2] = 0.0f;
- m[2 * 4 + 2] = 1.0f;
- m[3 * 4 + 2] = 0.0f;
- m[0 * 4 + 3] = 0.0f;
- m[1 * 4 + 3] = 0.0f;
- m[2 * 4 + 3] = 0.0f;
- m[3 * 4 + 3] = 1.0f;
-}
-
-// Adjust a 4x4 matrix to apply a scale.
-inline void ScaleMatrix(GLfloat *m, GLfloat scalex, GLfloat scaley, GLfloat scalez)
-{
- m[0 * 4 + 0] *= scalex;
- m[0 * 4 + 1] *= scalex;
- m[0 * 4 + 2] *= scalex;
- m[0 * 4 + 3] *= scalex;
- m[1 * 4 + 0] *= scaley;
- m[1 * 4 + 1] *= scaley;
- m[1 * 4 + 2] *= scaley;
- m[1 * 4 + 3] *= scaley;
- m[2 * 4 + 0] *= scalez;
- m[2 * 4 + 1] *= scalez;
- m[2 * 4 + 2] *= scalez;
- m[2 * 4 + 3] *= scalez;
-}
-
-// Adjust a 4x4 matrix to apply a translation.
-inline void TranslateMatrix(GLfloat *m, GLfloat translatex, GLfloat translatey, GLfloat translatez)
-{
- m[3 * 4 + 0] += m[0 * 4 + 0] * translatex + m[1 * 4 + 0] * translatey + m[2 * 4 + 0] * translatez;
- m[3 * 4 + 1] += m[0 * 4 + 1] * translatex + m[1 * 4 + 1] * translatey + m[2 * 4 + 1] * translatez;
- m[3 * 4 + 2] += m[0 * 4 + 2] * translatex + m[1 * 4 + 2] * translatey + m[2 * 4 + 2] * translatez;
- m[3 * 4 + 3] += m[0 * 4 + 3] * translatex + m[1 * 4 + 3] * translatey + m[2 * 4 + 3] * translatez;
-}
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-// Adjust a 4x4 matrix to apply a rotation.
-inline void RotateMatrix(GLfloat *m, GLfloat angle, GLfloat vx, GLfloat vy, GLfloat vz)
-{
- GLfloat len = sqrt(vx * vx + vy * vy + vz * vz);
- if (len != 0) {
- vx /= len;
- vy /= len;
- vz /= len;
- }
-
- GLfloat c, s, ic;
- c = cos(angle * M_PI / 180.0);
- s = sin(angle * M_PI / 180.0);
- ic = 1.0f - c;
-
- GLfloat rot[16];
- rot[0 * 4 + 0] = vx * vx * ic + c;
- rot[1 * 4 + 0] = vx * vy * ic - vz * s;
- rot[2 * 4 + 0] = vx * vz * ic + vy * s;
- rot[3 * 4 + 0] = 0.0f;
- rot[0 * 4 + 1] = vy * vx * ic + vz * s;
- rot[1 * 4 + 1] = vy * vy * ic + c;
- rot[2 * 4 + 1] = vy * vz * ic - vx * s;
- rot[3 * 4 + 1] = 0.0f;
- rot[0 * 4 + 2] = vx * vz * ic - vy * s;
- rot[1 * 4 + 2] = vy * vz * ic + vx * s;
- rot[2 * 4 + 2] = vz * vz * ic + c;
- rot[3 * 4 + 2] = 0.0f;
- rot[0 * 4 + 3] = 0.0f;
- rot[1 * 4 + 3] = 0.0f;
- rot[2 * 4 + 3] = 0.0f;
- rot[3 * 4 + 3] = 1.0f;
-
- GLfloat temp[16];
- for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < 4; ++j) {
- temp[j * 4 + i] = 0.0f;
- for (int k = 0; k < 4; ++k) {
- temp[j * 4 + i] += m[k * 4 + i] * rot[j * 4 + k];
- }
- }
- }
-
- qMemCopy(m, temp, sizeof(temp));
-}
-
GLWidget::GLWidget(QWidget *parent)
: QGLWidget(parent)
{
qtLogo = true;
- createdVertices = 0;
- createdNormals = 0;
- m_vertexNumber = 0;
frames = 0;
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
@@ -178,10 +64,6 @@ GLWidget::GLWidget(QWidget *parent)
GLWidget::~GLWidget()
{
- if (createdVertices)
- delete[] createdVertices;
- if (createdNormals)
- delete[] createdNormals;
}
void GLWidget::setScaling(int scale) {
@@ -210,13 +92,11 @@ void GLWidget::showBubbles(bool bubbles)
void GLWidget::paintQtLogo()
{
glDisable(GL_TEXTURE_2D);
- glVertexAttribPointer(vertexAttr1, 3, GL_FLOAT, GL_FALSE, 0, createdVertices);
- glEnableVertexAttribArray(vertexAttr1);
- glVertexAttribPointer(normalAttr1, 3, GL_FLOAT, GL_FALSE, 0, createdNormals);
- glEnableVertexAttribArray(normalAttr1);
- glDrawArrays(GL_TRIANGLES, 0, m_vertexNumber / 3);
- glDisableVertexAttribArray(normalAttr1);
- glDisableVertexAttribArray(vertexAttr1);
+ program1.setAttributeArray(vertexAttr1, vertices.constData());
+ program1.setAttributeArray(normalAttr1, normals.constData());
+ glDrawArrays(GL_TRIANGLES, 0, vertices.size());
+ program1.disableAttributeArray(normalAttr1);
+ program1.disableAttributeArray(vertexAttr1);
}
void GLWidget::paintTexturedCube()
@@ -239,8 +119,7 @@ void GLWidget::paintTexturedCube()
-0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5,
0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5
};
- glVertexAttribPointer(vertexAttr2, 3, GL_FLOAT, GL_FALSE, 0, afVertices);
- glEnableVertexAttribArray(vertexAttr2);
+ program2.setAttributeArray(vertexAttr2, afVertices, 3);
GLfloat afTexCoord[] = {
0.0f,0.0f, 1.0f,1.0f, 1.0f,0.0f,
@@ -258,8 +137,7 @@ void GLWidget::paintTexturedCube()
1.0f,0.0f, 1.0f,1.0f, 0.0f,0.0f,
0.0f,1.0f, 0.0f,0.0f, 1.0f,1.0f
};
- glVertexAttribPointer(texCoordAttr2, 2, GL_FLOAT, GL_FALSE, 0, afTexCoord);
- glEnableVertexAttribArray(texCoordAttr2);
+ program2.setAttributeArray(texCoordAttr2, afTexCoord, 2);
GLfloat afNormals[] = {
@@ -278,50 +156,15 @@ void GLWidget::paintTexturedCube()
0,1,0, 0,1,0, 0,1,0,
0,1,0, 0,1,0, 0,1,0
};
- glVertexAttribPointer(normalAttr2, 3, GL_FLOAT, GL_FALSE, 0, afNormals);
- glEnableVertexAttribArray(normalAttr2);
+ program2.setAttributeArray(normalAttr2, afNormals, 3);
- glUniform1i(textureUniform2, 0); // use texture unit 0
+ program2.setUniformValue(textureUniform2, 0); // use texture unit 0
glDrawArrays(GL_TRIANGLES, 0, 36);
- glDisableVertexAttribArray(vertexAttr2);
- glDisableVertexAttribArray(normalAttr2);
- glDisableVertexAttribArray(texCoordAttr2);
-}
-
-static void reportCompileErrors(GLuint shader, const char *src)
-{
- GLint value = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
- bool compiled = (value != 0);
- value = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &value);
- if (!compiled && value > 1) {
- char *log = new char [value];
- GLint len;
- glGetShaderInfoLog(shader, value, &len, log);
- qWarning("%s\n", log);
- qWarning("when compiling:\n%s\n", src);
- delete [] log;
- }
-}
-
-static void reportLinkErrors(GLuint program, const char *vsrc, const char *fsrc)
-{
- GLint value = 0;
- glGetProgramiv(program, GL_LINK_STATUS, &value);
- bool linked = (value != 0);
- value = 0;
- glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
- if (!linked && value > 1) {
- char *log = new char [value];
- GLint len;
- glGetProgramInfoLog(program, value, &len, log);
- qWarning("%s\n", log);
- qWarning("when linking:\n%s\nwith:\n%s\n", vsrc, fsrc);
- delete [] log;
- }
+ program2.disableAttributeArray(vertexAttr2);
+ program2.disableAttributeArray(normalAttr2);
+ program2.disableAttributeArray(texCoordAttr2);
}
void GLWidget::initializeGL ()
@@ -332,8 +175,8 @@ void GLWidget::initializeGL ()
glGenTextures(1, &m_uiTexture);
m_uiTexture = bindTexture(QImage(":/qt.png"));
- GLuint vshader1 = glCreateShader(GL_VERTEX_SHADER);
- const char *vsrc1[1] = {
+ QGLShader *vshader1 = new QGLShader(QGLShader::VertexShader, this);
+ const char *vsrc1 =
"attribute highp vec4 vertex;\n"
"attribute mediump vec3 normal;\n"
"uniform mediump mat4 matrix;\n"
@@ -346,36 +189,28 @@ void GLWidget::initializeGL ()
" color = vec4(col * 0.2 + col * 0.8 * angle, 1.0);\n"
" color = clamp(color, 0.0, 1.0);\n"
" gl_Position = matrix * vertex;\n"
- "}\n"
- };
- glShaderSource(vshader1, 1, vsrc1, 0);
- glCompileShader(vshader1);
- reportCompileErrors(vshader1, vsrc1[0]);
+ "}\n";
+ vshader1->compile(vsrc1);
- GLuint fshader1 = glCreateShader(GL_FRAGMENT_SHADER);
- const char *fsrc1[1] = {
+ QGLShader *fshader1 = new QGLShader(QGLShader::FragmentShader, this);
+ const char *fsrc1 =
"varying mediump vec4 color;\n"
"void main(void)\n"
"{\n"
" gl_FragColor = color;\n"
- "}\n"
- };
- glShaderSource(fshader1, 1, fsrc1, 0);
- glCompileShader(fshader1);
- reportCompileErrors(fshader1, fsrc1[0]);
-
- program1 = glCreateProgram();
- glAttachShader(program1, vshader1);
- glAttachShader(program1, fshader1);
- glLinkProgram(program1);
- reportLinkErrors(program1, vsrc1[0], fsrc1[0]);
-
- vertexAttr1 = glGetAttribLocation(program1, "vertex");
- normalAttr1 = glGetAttribLocation(program1, "normal");
- matrixUniform1 = glGetUniformLocation(program1, "matrix");
-
- GLuint vshader2 = glCreateShader(GL_VERTEX_SHADER);
- const char *vsrc2[1] = {
+ "}\n";
+ fshader1->compile(fsrc1);
+
+ program1.addShader(vshader1);
+ program1.addShader(fshader1);
+ program1.link();
+
+ vertexAttr1 = program1.attributeLocation("vertex");
+ normalAttr1 = program1.attributeLocation("normal");
+ matrixUniform1 = program1.uniformLocation("matrix");
+
+ QGLShader *vshader2 = new QGLShader(QGLShader::VertexShader);
+ const char *vsrc2 =
"attribute highp vec4 vertex;\n"
"attribute highp vec4 texCoord;\n"
"attribute mediump vec3 normal;\n"
@@ -388,14 +223,11 @@ void GLWidget::initializeGL ()
" angle = max(dot(normal, toLight), 0.0);\n"
" gl_Position = matrix * vertex;\n"
" texc = texCoord;\n"
- "}\n"
- };
- glShaderSource(vshader2, 1, vsrc2, 0);
- glCompileShader(vshader2);
- reportCompileErrors(vshader2, vsrc2[0]);
+ "}\n";
+ vshader2->compile(vsrc2);
- GLuint fshader2 = glCreateShader(GL_FRAGMENT_SHADER);
- const char *fsrc2[1] = {
+ QGLShader *fshader2 = new QGLShader(QGLShader::FragmentShader);
+ const char *fsrc2 =
"varying highp vec4 texc;\n"
"uniform sampler2D tex;\n"
"varying mediump float angle;\n"
@@ -404,23 +236,18 @@ void GLWidget::initializeGL ()
" highp vec3 color = texture2D(tex, texc.st).rgb;\n"
" color = color * 0.2 + color * 0.8 * angle;\n"
" gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);\n"
- "}\n"
- };
- glShaderSource(fshader2, 1, fsrc2, 0);
- glCompileShader(fshader2);
- reportCompileErrors(fshader2, fsrc2[0]);
-
- program2 = glCreateProgram();
- glAttachShader(program2, vshader2);
- glAttachShader(program2, fshader2);
- glLinkProgram(program2);
- reportLinkErrors(program2, vsrc2[0], fsrc2[0]);
-
- vertexAttr2 = glGetAttribLocation(program2, "vertex");
- normalAttr2 = glGetAttribLocation(program2, "normal");
- texCoordAttr2 = glGetAttribLocation(program2, "texCoord");
- matrixUniform2 = glGetUniformLocation(program2, "matrix");
- textureUniform2 = glGetUniformLocation(program2, "tex");
+ "}\n";
+ fshader2->compile(fsrc2);
+
+ program2.addShader(vshader2);
+ program2.addShader(fshader2);
+ program2.link();
+
+ vertexAttr2 = program2.attributeLocation("vertex");
+ normalAttr2 = program2.attributeLocation("normal");
+ texCoordAttr2 = program2.attributeLocation("texCoord");
+ matrixUniform2 = program2.uniformLocation("matrix");
+ textureUniform2 = program2.uniformLocation("tex");
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
@@ -450,24 +277,23 @@ void GLWidget::paintGL()
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
- GLfloat modelview[16];
- IdentityMatrix(modelview);
- RotateMatrix(modelview, m_fAngle, 0.0, 1.0, 0.0);
- RotateMatrix(modelview, m_fAngle, 1.0, 0.0, 0.0);
- RotateMatrix(modelview, m_fAngle, 0.0, 0.0, 1.0);
- ScaleMatrix(modelview, m_fScale, m_fScale, m_fScale);
- TranslateMatrix(modelview, 0, -0.2, 0);
+ QMatrix4x4 modelview;
+ modelview.rotate(m_fAngle, 0.0f, 1.0f, 0.0f);
+ modelview.rotate(m_fAngle, 1.0f, 0.0f, 0.0f);
+ modelview.rotate(m_fAngle, 0.0f, 0.0f, 1.0f);
+ modelview.scale(m_fScale);
+ modelview.translate(0.0f, -0.2f, 0.0f);
if (qtLogo) {
- glUseProgram(program1);
- glUniformMatrix4fv(matrixUniform1, 1, GL_FALSE, modelview);
+ program1.enable();
+ program1.setUniformValue(matrixUniform1, modelview);
paintQtLogo();
- glUseProgram(0);
+ program1.disable();
} else {
- glUseProgram(program2);
- glUniformMatrix4fv(matrixUniform2, 1, GL_FALSE, modelview);
+ program2.enable();
+ program1.setUniformValue(matrixUniform2, modelview);
paintTexturedCube();
- glUseProgram(0);
+ program2.disable();
}
glDisable(GL_DEPTH_TEST);
@@ -563,80 +389,69 @@ void GLWidget::createGeometry()
extrude(x8, y8, x5, y5);
}
- m_vertexNumber = vertices.size();
- createdVertices = new GLfloat[m_vertexNumber];
- createdNormals = new GLfloat[m_vertexNumber];
- for (int i = 0;i < m_vertexNumber;i++) {
- createdVertices[i] = vertices.at(i) * 2;
- createdNormals[i] = normals.at(i);
- }
- vertices.clear();
- normals.clear();
+ for (int i = 0;i < vertices.size();i++)
+ vertices[i] *= 2.0f;
}
void GLWidget::quad(qreal x1, qreal y1, qreal x2, qreal y2, qreal x3, qreal y3, qreal x4, qreal y4)
{
- qreal nx, ny, nz;
+ vertices << QVector3D(x1, y1, -0.05f);
+ vertices << QVector3D(x2, y2, -0.05f);
+ vertices << QVector3D(x4, y4, -0.05f);
- vertices << x1 << y1 << -0.05f;
- vertices << x2 << y2 << -0.05f;
- vertices << x4 << y4 << -0.05f;
+ vertices << QVector3D(x3, y3, -0.05f);
+ vertices << QVector3D(x4, y4, -0.05f);
+ vertices << QVector3D(x2, y2, -0.05f);
- vertices << x3 << y3 << -0.05f;
- vertices << x4 << y4 << -0.05f;
- vertices << x2 << y2 << -0.05f;
+ QVector3D n = QVector3D::normal
+ (QVector3D(x2 - x1, y2 - y1, 0.0f), QVector3D(x4 - x1, y4 - y1, 0.0f));
- CrossProduct(nx, ny, nz, x2 - x1, y2 - y1, 0, x4 - x1, y4 - y1, 0);
- Normalize(nx, ny, nz);
+ normals << n;
+ normals << n;
+ normals << n;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
+ normals << n;
+ normals << n;
+ normals << n;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
+ vertices << QVector3D(x4, y4, 0.05f);
+ vertices << QVector3D(x2, y2, 0.05f);
+ vertices << QVector3D(x1, y1, 0.05f);
- vertices << x4 << y4 << 0.05f;
- vertices << x2 << y2 << 0.05f;
- vertices << x1 << y1 << 0.05f;
+ vertices << QVector3D(x2, y2, 0.05f);
+ vertices << QVector3D(x4, y4, 0.05f);
+ vertices << QVector3D(x3, y3, 0.05f);
- vertices << x2 << y2 << 0.05f;
- vertices << x4 << y4 << 0.05f;
- vertices << x3 << y3 << 0.05f;
+ n = QVector3D::normal
+ (QVector3D(x2 - x4, y2 - y4, 0.0f), QVector3D(x1 - x4, y1 - y4, 0.0f));
- CrossProduct(nx, ny, nz, x2 - x4, y2 - y4, 0, x1 - x4, y1 - y4, 0);
- Normalize(nx, ny, nz);
+ normals << n;
+ normals << n;
+ normals << n;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
-
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
+ normals << n;
+ normals << n;
+ normals << n;
}
void GLWidget::extrude(qreal x1, qreal y1, qreal x2, qreal y2)
{
- qreal nx, ny, nz;
-
- vertices << x1 << y1 << +0.05f;
- vertices << x2 << y2 << +0.05f;
- vertices << x1 << y1 << -0.05f;
+ vertices << QVector3D(x1, y1, +0.05f);
+ vertices << QVector3D(x2, y2, +0.05f);
+ vertices << QVector3D(x1, y1, -0.05f);
- vertices << x2 << y2 << -0.05f;
- vertices << x1 << y1 << -0.05f;
- vertices << x2 << y2 << +0.05f;
+ vertices << QVector3D(x2, y2, -0.05f);
+ vertices << QVector3D(x1, y1, -0.05f);
+ vertices << QVector3D(x2, y2, +0.05f);
- CrossProduct(nx, ny, nz, x2 - x1, y2 - y1, 0.0f, 0.0f, 0.0f, -0.1f);
- Normalize(nx, ny, nz);
+ QVector3D n = QVector3D::normal
+ (QVector3D(x2 - x1, y2 - y1, 0.0f), QVector3D(0.0f, 0.0f, -0.1f));
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
+ normals << n;
+ normals << n;
+ normals << n;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
- normals << nx << ny << nz;
+ normals << n;
+ normals << n;
+ normals << n;
}
diff --git a/examples/opengl/hellogl_es2/glwidget.h b/examples/opengl/hellogl_es2/glwidget.h
index 9a7823a49..596e1cc5d 100644
--- a/examples/opengl/hellogl_es2/glwidget.h
+++ b/examples/opengl/hellogl_es2/glwidget.h
@@ -43,7 +43,11 @@
#define GLWIDGET_H
#include <QGLWidget>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qmatrix4x4.h>
+#include <QtOpenGL/qglshaderprogram.h>
#include <QTime>
+#include <QVector>
class Bubble;
class GLWidget : public QGLWidget {
@@ -71,24 +75,21 @@ private:
void createBubbles(int number);
void quad(qreal x1, qreal y1, qreal x2, qreal y2, qreal x3, qreal y3, qreal x4, qreal y4);
void extrude(qreal x1, qreal y1, qreal x2, qreal y2);
- QList<qreal> vertices;
- QList<qreal> normals;
- GLfloat *createdVertices;
- GLfloat *createdNormals;
- int m_vertexNumber;
+ QVector<QVector3D> vertices;
+ QVector<QVector3D> normals;
bool qtLogo;
QList<Bubble*> bubbles;
int frames;
QTime time;
- GLuint program1;
- GLuint program2;
- GLuint vertexAttr1;
- GLuint normalAttr1;
- GLuint matrixUniform1;
- GLuint vertexAttr2;
- GLuint normalAttr2;
- GLuint texCoordAttr2;
- GLuint matrixUniform2;
- GLuint textureUniform2;
+ QGLShaderProgram program1;
+ QGLShaderProgram program2;
+ int vertexAttr1;
+ int normalAttr1;
+ int matrixUniform1;
+ int vertexAttr2;
+ int normalAttr2;
+ int texCoordAttr2;
+ int matrixUniform2;
+ int textureUniform2;
};
#endif