From e1682b84bb09ce3b45237b964c820eb4b92857a2 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 26 May 2016 14:34:00 +0200 Subject: Refactor the rendernode example By removing the Renderer abstraction it becomes easier to follow and understand. Change-Id: Iddacb461d51a75864983850660c5480985b3524f Reviewed-by: Andy Nichols --- .../quick/scenegraph/rendernode/openglrenderer.cpp | 35 +++++++++++++++------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'examples/quick/scenegraph/rendernode/openglrenderer.cpp') diff --git a/examples/quick/scenegraph/rendernode/openglrenderer.cpp b/examples/quick/scenegraph/rendernode/openglrenderer.cpp index e9c1be071c..27712e13b2 100644 --- a/examples/quick/scenegraph/rendernode/openglrenderer.cpp +++ b/examples/quick/scenegraph/rendernode/openglrenderer.cpp @@ -39,6 +39,7 @@ ****************************************************************************/ #include "openglrenderer.h" +#include #ifndef QT_NO_OPENGL @@ -46,13 +47,28 @@ #include #include -OpenGLRenderer::OpenGLRenderer(QQuickItem *item, QSGRenderNode *node) - : m_item(item), - m_node(node) +OpenGLRenderNode::OpenGLRenderNode(QQuickItem *item) + : m_item(item) { } -void OpenGLRenderer::init() +OpenGLRenderNode::~OpenGLRenderNode() +{ + releaseResources(); +} + +// No need to reimplement changedStates() since our rendering is so simple, +// without involving any state changes. + +void OpenGLRenderNode::releaseResources() +{ + delete m_program; + m_program = nullptr; + delete m_vbo; + m_vbo = nullptr; +} + +void OpenGLRenderNode::init() { m_program = new QOpenGLShaderProgram; @@ -98,18 +114,15 @@ void OpenGLRenderer::init() m_vbo->release(); } -OpenGLRenderer::~OpenGLRenderer() +void OpenGLRenderNode::render(const RenderState *state) { - delete m_program; - delete m_vbo; -} + if (!m_program) + init(); -void OpenGLRenderer::render(const QSGRenderNode::RenderState *state) -{ QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); m_program->bind(); - m_program->setUniformValue(m_matrixUniform, *state->projectionMatrix() * *m_node->matrix()); + m_program->setUniformValue(m_matrixUniform, *state->projectionMatrix() * *matrix()); m_vbo->bind(); -- cgit v1.2.3