summaryrefslogtreecommitdiffstats
path: root/examples/opengl/hellowindow/hellowindow.cpp
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2020-05-20 11:05:17 +0200
committerMichal Klocek <michal.klocek@qt.io>2020-05-25 17:37:57 +0200
commit5786ac12f0a9901b0ddf7ee3c74cd1e87095306c (patch)
tree2e2fddee38ad39c9538c333c9c4bfb06e8eb23ea /examples/opengl/hellowindow/hellowindow.cpp
parent71d63049f718d221e4fc8134c71f050da88c2584 (diff)
Fix hellowindow example
It seems this example never worked as expected. It has a 'multiple' option which should show extra windows with rendering taking place in different thread, however although render is moved to other thread render() function was never called in that thread. Fix following things: * make rendering in other thread * stop requestUpdate if nothing is exposed * add timer so animation works at the same speed despite of number of windows (renderer B renders two windows) * wait for render to finish before triggering requestUdpate * remove mutex where not needed Pick-to: 5.15 Change-Id: I420436bd28d0357534332dd55b088d634d906c14 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'examples/opengl/hellowindow/hellowindow.cpp')
-rw-r--r--examples/opengl/hellowindow/hellowindow.cpp65
1 files changed, 21 insertions, 44 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();