diff options
-rw-r--r-- | examples/opengl/hellowindow/hellowindow.cpp | 65 | ||||
-rw-r--r-- | examples/opengl/hellowindow/hellowindow.h | 24 |
2 files changed, 30 insertions, 59 deletions
diff --git a/examples/opengl/hellowindow/hellowindow.cpp b/examples/opengl/hellowindow/hellowindow.cpp index 1c1259de13..bde763dd70 100644 --- a/examples/opengl/hellowindow/hellowindow.cpp +++ b/examples/opengl/hellowindow/hellowindow.cpp @@ -54,11 +54,11 @@ #include <QOpenGLFunctions> #include <QRandomGenerator> #include <qmath.h> +#include <QElapsedTimer> Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *screen) : m_initialized(false) , m_format(format) - , m_currentWindow(0) { m_context = new QOpenGLContext(this); if (screen) @@ -89,24 +89,33 @@ HelloWindow::HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *scre create(); updateColor(); + + connect(renderer.data(), &Renderer::requestUpdate, this, &QWindow::requestUpdate); } void HelloWindow::exposeEvent(QExposeEvent *) { - m_renderer->setAnimating(this, isExposed()); if (isExposed()) - m_renderer->render(); + render(); } bool HelloWindow::event(QEvent *ev) { - if (ev->type() == QEvent::UpdateRequest) { - m_renderer->render(); - requestUpdate(); - } + if (ev->type() == QEvent::UpdateRequest && isExposed()) + render(); return QWindow::event(ev); } +void HelloWindow::render() +{ + static QElapsedTimer timer; + if (!timer.isValid()) + timer.start(); + qreal a = (qreal)(((timer.elapsed() * 3) % 36000) / 100.0); + auto call = [this, r = m_renderer.data(), a, c = color()]() { r->render(this, a, c); }; + QMetaObject::invokeMethod(m_renderer.data(), call); +} + void HelloWindow::mousePressEvent(QMouseEvent *) { updateColor(); @@ -114,14 +123,11 @@ void HelloWindow::mousePressEvent(QMouseEvent *) QColor HelloWindow::color() const { - QMutexLocker locker(&m_colorLock); return m_color; } void HelloWindow::updateColor() { - QMutexLocker locker(&m_colorLock); - QColor colors[] = { QColor(100, 255, 0), @@ -132,41 +138,13 @@ void HelloWindow::updateColor() m_colorIndex = 1 - m_colorIndex; } -void Renderer::setAnimating(HelloWindow *window, bool animating) -{ - QMutexLocker locker(&m_windowLock); - if (m_windows.contains(window) == animating) - return; - - if (animating) { - m_windows << window; - if (m_windows.size() == 1) - window->requestUpdate(); - } else { - m_currentWindow = 0; - m_windows.removeOne(window); - } -} - -void Renderer::render() +void Renderer::render(HelloWindow *surface, qreal angle, const QColor &color) { - QMutexLocker locker(&m_windowLock); - - if (m_windows.isEmpty()) - return; - - HelloWindow *surface = m_windows.at(m_currentWindow); - QColor color = surface->color(); - - m_currentWindow = (m_currentWindow + 1) % m_windows.size(); - if (!m_context->makeCurrent(surface)) return; QSize viewSize = surface->size(); - locker.unlock(); - if (!m_initialized) { initialize(); m_initialized = true; @@ -192,9 +170,9 @@ void Renderer::render() m_program->setAttributeBuffer(normalAttr, GL_FLOAT, verticesSize, 3); 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.rotate(angle, 0.0f, 1.0f, 0.0f); + modelview.rotate(angle, 1.0f, 0.0f, 0.0f); + modelview.rotate(angle, 0.0f, 0.0f, 1.0f); modelview.translate(0.0f, -0.2f, 0.0f); m_program->setUniformValue(matrixUniform, modelview); @@ -204,7 +182,7 @@ void Renderer::render() m_context->swapBuffers(surface); - m_fAngle += 1.0f; + emit requestUpdate(); } Q_GLOBAL_STATIC(QMutex, initMutex) @@ -250,7 +228,6 @@ void Renderer::initialize() matrixUniform = m_program->uniformLocation("matrix"); colorUniform = m_program->uniformLocation("sourceColor"); - m_fAngle = 0; createGeometry(); m_vbo.create(); diff --git a/examples/opengl/hellowindow/hellowindow.h b/examples/opengl/hellowindow/hellowindow.h index 938c6409a4..76f2afb549 100644 --- a/examples/opengl/hellowindow/hellowindow.h +++ b/examples/opengl/hellowindow/hellowindow.h @@ -52,7 +52,7 @@ #include <QColor> #include <QMutex> -#include <QtOpenGL/QOpenGLShaderProgram> +#include <QOpenGLShaderProgram> #include <QOpenGLBuffer> #include <QSharedPointer> #include <QTimer> @@ -64,14 +64,16 @@ class Renderer : public QObject Q_OBJECT public: - explicit Renderer(const QSurfaceFormat &format, Renderer *share = 0, QScreen *screen = 0); + explicit Renderer(const QSurfaceFormat &format, Renderer *share = nullptr, + QScreen *screen = nullptr); QSurfaceFormat format() const { return m_format; } - void setAnimating(HelloWindow *window, bool animating); - public slots: - void render(); + void render(HelloWindow *surface, qreal angle, const QColor &color); + +signals: + void requestUpdate(); private: void initialize(); @@ -81,8 +83,6 @@ private: 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); - qreal m_fAngle; - QVector<QVector3D> vertices; QVector<QVector3D> normals; int vertexAttr; @@ -95,19 +95,13 @@ private: QOpenGLContext *m_context; QOpenGLShaderProgram *m_program; QOpenGLBuffer m_vbo; - - QList<HelloWindow *> m_windows; - int m_currentWindow; - - QMutex m_windowLock; - QColor m_backgroundColor; }; class HelloWindow : public QWindow { public: - explicit HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *screen = 0); + explicit HelloWindow(const QSharedPointer<Renderer> &renderer, QScreen *screen = nullptr); QColor color() const; void updateColor(); @@ -116,10 +110,10 @@ protected: bool event(QEvent *ev) override; void exposeEvent(QExposeEvent *event) override; void mousePressEvent(QMouseEvent *) override; + void render(); private: int m_colorIndex; QColor m_color; const QSharedPointer<Renderer> m_renderer; - mutable QMutex m_colorLock; }; |