diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-02-19 14:01:09 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-02-20 09:48:19 +0200 |
commit | aa542150122d975a1a6fc097a0ce4e2dd339528e (patch) | |
tree | 5ec1824a5e51d046731d2fefe1dbdf55a5788a91 /src/datavisualizationqml2/declarativerendernode.cpp | |
parent | e0034b33b9e88aae416d6af0751f5826b9b03924 (diff) |
MSAA support added to QML
Change-Id: I64258705e4423b2762aeff28c3eafd6bdf5d34e9
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualizationqml2/declarativerendernode.cpp')
-rw-r--r-- | src/datavisualizationqml2/declarativerendernode.cpp | 149 |
1 files changed, 104 insertions, 45 deletions
diff --git a/src/datavisualizationqml2/declarativerendernode.cpp b/src/datavisualizationqml2/declarativerendernode.cpp index f4ce7532..b22d2633 100644 --- a/src/datavisualizationqml2/declarativerendernode.cpp +++ b/src/datavisualizationqml2/declarativerendernode.cpp @@ -17,72 +17,131 @@ ****************************************************************************/ #include "declarativerendernode_p.h" -#include <QtQuick/QQuickWindow> +#include "abstract3dcontroller_p.h" +#include "abstractdeclarative_p.h" +#include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLFramebufferObject> QT_BEGIN_NAMESPACE_DATAVISUALIZATION -DeclarativeRenderNode::DeclarativeRenderNode(QQuickWindow *window, - Abstract3DController *controller, - AbstractDeclarative::RenderingMode mode, - QObject *parent) - : QObject(parent), - m_fbo(0), - m_texture(0), - m_window(window), - m_controller(controller), - m_mode(mode) +DeclarativeRenderNode::DeclarativeRenderNode(AbstractDeclarative *declarative) + : QSGGeometryNode(), + m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4), + m_texture(0), + m_declarative(declarative), + m_controller(0), + m_fbo(0), + m_multisampledFBO(0), + m_window(0), + m_dirtyFBO(false), + m_samples(0) { - connect(window, &QQuickWindow::beforeRendering, - this, &DeclarativeRenderNode::renderFBO, - Qt::DirectConnection); + setMaterial(&m_material); + setOpaqueMaterial(&m_materialO); + setGeometry(&m_geometry); + setFlag(UsePreprocess); } DeclarativeRenderNode::~DeclarativeRenderNode() { - delete m_texture; delete m_fbo; + delete m_multisampledFBO; } -void DeclarativeRenderNode::renderFBO() +void DeclarativeRenderNode::setSize(const QSize &size) { - QSize size = rect().size().toSize(); - - if (size.width() <= 0 || size.height() <= 0) + if (size == m_size) return; - // Create FBO - if (!m_fbo) { - QOpenGLFramebufferObjectFormat format; - format.setAttachment(QOpenGLFramebufferObject::Depth); - m_fbo = new QOpenGLFramebufferObject(size, format); - m_texture = m_window->createTextureFromId(m_fbo->texture(), size); - - setTexture(m_texture); - - // Flip texture - QSize ts = m_texture->textureSize(); - QRectF sourceRect(0, 0, ts.width(), ts.height()); - float tmp = sourceRect.top(); - sourceRect.setTop(sourceRect.bottom()); - sourceRect.setBottom(tmp); - QSGGeometry *geometry = this->geometry(); - QSGGeometry::updateTexturedRectGeometry(geometry, rect(), - m_texture->convertToNormalizedSourceRect(sourceRect)); - markDirty(DirtyMaterial); + m_size = size; + m_dirtyFBO = true; + markDirty(DirtyGeometry); +} + +void DeclarativeRenderNode::update() +{ + if (m_dirtyFBO) { + updateFBO(); + m_dirtyFBO = false; } +} + +void DeclarativeRenderNode::updateFBO() +{ + m_declarative->activateOpenGLContext(m_window); + + if (m_fbo) + delete m_fbo; + + m_fbo = new QOpenGLFramebufferObject(m_size); + m_fbo->setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + + // Multisampled + if (m_multisampledFBO) { + delete m_multisampledFBO; + m_multisampledFBO = 0; + } + if (m_samples > 0) { + QOpenGLFramebufferObjectFormat multisampledFrambufferFormat; + multisampledFrambufferFormat.setSamples(m_samples); + multisampledFrambufferFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + + m_multisampledFBO = new QOpenGLFramebufferObject(m_size, multisampledFrambufferFormat); + } + + QSGGeometry::updateTexturedRectGeometry(&m_geometry, + QRectF(0, 0, m_size.width(), m_size.height()), + QRectF(0, 1, 1, -1)); + + delete m_texture; + m_texture = m_window->createTextureFromId(m_fbo->texture(), m_size); + m_material.setTexture(m_texture); + m_materialO.setTexture(m_texture); + + m_declarative->doneOpenGLContext(m_window); +} + +void DeclarativeRenderNode::setQuickWindow(QQuickWindow *window) +{ + Q_ASSERT(window); + + m_window = window; +} + +void DeclarativeRenderNode::setController(Abstract3DController *controller) +{ + m_controller = controller; +} + +void DeclarativeRenderNode::setSamples(int samples) +{ + if (m_samples == samples) + return; + + m_samples = samples; + m_dirtyFBO = true; +} + +void DeclarativeRenderNode::preprocess() +{ + QOpenGLFramebufferObject *targetFBO; + if (m_samples > 0) + targetFBO = m_multisampledFBO; + else + targetFBO = m_fbo; - // Call the shared rendering function - m_fbo->bind(); - glDisable(GL_BLEND); + m_declarative->activateOpenGLContext(m_window); - m_controller->render(m_fbo->handle()); + targetFBO->bind(); + // Render scene here + m_controller->render(targetFBO->handle()); - glEnable(GL_BLEND); + targetFBO->release(); - m_fbo->release(); + if (m_samples > 0) + QOpenGLFramebufferObject::blitFramebuffer(m_fbo, m_multisampledFBO); - // New view is in the FBO, request repaint of scene graph + m_declarative->doneOpenGLContext(m_window); } QT_END_NAMESPACE_DATAVISUALIZATION |