Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the documentation of the Qt Toolkit.
- **
- ** $QT_BEGIN_LICENSE:BSD$
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- ** * Redistributions of source code must retain the above copyright
- ** notice, this list of conditions and the following disclaimer.
- ** * Redistributions in binary form must reproduce the above copyright
- ** notice, this list of conditions and the following disclaimer in
- ** the documentation and/or other materials provided with the
- ** distribution.
- ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
- ** of its contributors may be used to endorse or promote products derived
- ** from this software without specific prior written permission.
- **
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ** $QT_END_LICENSE$
- **
- ****************************************************************************/
- #include <QtGui/QWindow>
- #include <QtGui/QOpenGLFunctions>
- class QPainter;
- class QOpenGLContext;
- class QOpenGLPaintDevice;
- class OpenGLWindow : public QWindow, protected QOpenGLFunctions
- {
- Q_OBJECT
- public:
- explicit OpenGLWindow(QWindow *parent = 0);
- ~OpenGLWindow();
- virtual void render(QPainter *painter);
- virtual void render();
- virtual void initialize();
- void setAnimating(bool animating);
- public slots:
- void renderLater();
- void renderNow();
- protected:
- bool event(QEvent *event);
- void exposeEvent(QExposeEvent *event);
- public:
- bool m_update_pending;
- bool m_animating;
- QOpenGLContext *m_context;
- QOpenGLPaintDevice *m_device;
- };
- /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the documentation of the Qt Toolkit.
- **
- ** $QT_BEGIN_LICENSE:BSD$
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- ** * Redistributions of source code must retain the above copyright
- ** notice, this list of conditions and the following disclaimer.
- ** * Redistributions in binary form must reproduce the above copyright
- ** notice, this list of conditions and the following disclaimer in
- ** the documentation and/or other materials provided with the
- ** distribution.
- ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
- ** of its contributors may be used to endorse or promote products derived
- ** from this software without specific prior written permission.
- **
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ** $QT_END_LICENSE$
- **
- ****************************************************************************/
- #include "openglwindow.h"
- #include <QtGui/QGuiApplication>
- #include <QtGui/QMatrix4x4>
- #include <QtGui/QOpenGLShaderProgram>
- #include <QtGui/QScreen>
- #include <QtCore/qmath.h>
- #include <QDebug>
- #include <QTime>
- #include <QtGui/QPainter>
- #include <QOpenGLPaintDevice>
- class TriangleWindow : public OpenGLWindow
- {
- public:
- TriangleWindow();
- void initialize();
- void render();
- private:
- GLuint loadShader(GLenum type, const char *source);
- GLuint m_posAttr;
- GLuint m_colAttr;
- GLuint m_matrixUniform;
- QOpenGLShaderProgram *m_program;
- int m_frame;
- };
- TriangleWindow::TriangleWindow()
- : m_program(0)
- , m_frame(0)
- {
- }
- int main(int argc, char **argv)
- {
- QGuiApplication app(argc, argv);
- QSurfaceFormat format;
- format.setSamples(16);
- TriangleWindow window;
- window.setFormat(format);
- window.resize(640, 480);
- window.show();
- window.setAnimating(true);
- return app.exec();
- }
- 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";
- GLuint TriangleWindow::loadShader(GLenum type, const char *source)
- {
- GLuint shader = glCreateShader(type);
- glShaderSource(shader, 1, &source, 0);
- glCompileShader(shader);
- return shader;
- }
- QTime time;
- void TriangleWindow::initialize()
- {
- m_program = new QOpenGLShaderProgram(this);
- m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
- m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
- m_program->link();
- m_posAttr = m_program->attributeLocation("posAttr");
- m_colAttr = m_program->attributeLocation("colAttr");
- m_matrixUniform = m_program->uniformLocation("matrix");
- time.start();
- }
- int frames = 0;
- void TriangleWindow::render()
- {
- const qreal retinaScale = devicePixelRatio();
- glViewport(0, 0, width() * retinaScale, height() * retinaScale);
- glClear(GL_COLOR_BUFFER_BIT);
- m_program->bind();
- QMatrix4x4 matrix;
- matrix.perspective(60, 4.0/3.0, 0.1, 100.0);
- matrix.translate(0, 0, -2);
- matrix.rotate(100.0f * m_frame / screen()->refreshRate(), 0, 1, 0);
- m_program->setUniformValue(m_matrixUniform, matrix);
- GLfloat vertices[] = {
- 0.0f, 0.707f,
- -0.5f, -0.5f,
- 0.5f, -0.5f
- };
- 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(0);
- glEnableVertexAttribArray(1);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- glDisableVertexAttribArray(1);
- glDisableVertexAttribArray(0);
- m_program->release();
- ++m_frame;
- frames++;
- if(frames == 100)
- {
- this->setTitle(QString::number((1.0f*time.msec())/100*1000));
- frames = 0;
- }
- if (!m_device)
- m_device = new QOpenGLPaintDevice;
- m_device->setSize(size());
- QPainter painter(m_device);
- QPen paint;
- paint.setColor(QColor::fromRgb(255,255,255));
- QFont font("Comic Sans MS");
- font.setPointSize(14);
- painter.setPen(paint);
- painter.setFont(font);
- painter.drawText(0,0,100,100,0,QString("fps:")+QString::number((1.0f*time.msec())/100*1000));
- }
- /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the documentation of the Qt Toolkit.
- **
- ** $QT_BEGIN_LICENSE:BSD$
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- ** * Redistributions of source code must retain the above copyright
- ** notice, this list of conditions and the following disclaimer.
- ** * Redistributions in binary form must reproduce the above copyright
- ** notice, this list of conditions and the following disclaimer in
- ** the documentation and/or other materials provided with the
- ** distribution.
- ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
- ** of its contributors may be used to endorse or promote products derived
- ** from this software without specific prior written permission.
- **
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ** $QT_END_LICENSE$
- **
- ****************************************************************************/
- #include "openglwindow.h"
- #include <QtCore/QCoreApplication>
- #include <QtGui/QOpenGLContext>
- #include <QtGui/QOpenGLPaintDevice>
- #include <QtGui/QPainter>
- OpenGLWindow::OpenGLWindow(QWindow *parent)
- : QWindow(parent)
- , m_update_pending(false)
- , m_animating(false)
- , m_context(0)
- , m_device(0)
- {
- setSurfaceType(QWindow::OpenGLSurface);
- }
- OpenGLWindow::~OpenGLWindow()
- {
- delete m_device;
- }
- void OpenGLWindow::render(QPainter *painter)
- {
- Q_UNUSED(painter);
- }
- void OpenGLWindow::initialize()
- {
- }
- void OpenGLWindow::render()
- {
- if (!m_device)
- m_device = new QOpenGLPaintDevice;
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- m_device->setSize(size());
- QPainter painter(m_device);
- render(&painter);
- }
- void OpenGLWindow::renderLater()
- {
- if (!m_update_pending) {
- m_update_pending = true;
- QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest));
- }
- }
- bool OpenGLWindow::event(QEvent *event)
- {
- switch (event->type()) {
- case QEvent::UpdateRequest:
- m_update_pending = false;
- renderNow();
- return true;
- default:
- return QWindow::event(event);
- }
- }
- void OpenGLWindow::exposeEvent(QExposeEvent *event)
- {
- Q_UNUSED(event);
- if (isExposed())
- renderNow();
- }
- void OpenGLWindow::renderNow()
- {
- if (!isExposed())
- return;
- bool needsInitialize = false;
- if (!m_context) {
- m_context = new QOpenGLContext(this);
- m_context->setFormat(requestedFormat());
- m_context->create();
- needsInitialize = true;
- }
- m_context->makeCurrent(this);
- if (needsInitialize) {
- initializeOpenGLFunctions();
- initialize();
- }
- render();
- m_context->swapBuffers(this);
- if (m_animating)
- renderLater();
- }
- void OpenGLWindow::setAnimating(bool animating)
- {
- m_animating = animating;
- if (animating)
- renderLater();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement