diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-03-30 09:41:38 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-05-10 10:19:42 +0000 |
commit | 092f86e5bad3101b760cda33d499a3aa736fbb2e (patch) | |
tree | b2cc11287de8684bfca4c8def5b18611bb526b1c | |
parent | 260ac1d2fd155b6df6fbfdc7019a78882a9c0dce (diff) |
QRenderTargetSelector: takes list of active drawBuffers
Change-Id: I63ea3ddcd16034b4fb2d75cb8d5a90e7f557fd5e
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
10 files changed, 225 insertions, 4 deletions
diff --git a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp index 115ca9e6a..a2b2fc705 100644 --- a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp +++ b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp @@ -103,6 +103,7 @@ #include <Qt3DQuickRenderer/quick3dshaderdata.h> #include <Qt3DQuickRenderer/quick3dshaderdataarray.h> #include <Qt3DQuickRenderer/quick3dstateset.h> +#include <Qt3DQuickRenderer/quick3drendertargetselector.h> static void initResources() { @@ -202,7 +203,7 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri) qmlRegisterExtendedType<Qt3D::QRenderPassFilter, Qt3D::Render::Quick::Quick3DRenderPassFilter>(uri, 2, 0, "RenderPassFilter"); qmlRegisterExtendedType<Qt3D::QTechniqueFilter, Qt3D::Render::Quick::Quick3DTechniqueFilter>(uri, 2, 0, "TechniqueFilter"); qmlRegisterExtendedType<Qt3D::QViewport, Qt3D::Render::Quick::Quick3DViewport>(uri, 2, 0, "Viewport"); - qmlRegisterType<Qt3D::QRenderTargetSelector>(uri, 2, 0, "RenderTargetSelector"); + qmlRegisterExtendedType<Qt3D::QRenderTargetSelector, Qt3D::Render::Quick::Quick3DRenderTargetSelector>(uri, 2, 0, "RenderTargetSelector"); qmlRegisterType<Qt3D::QClearBuffer>(uri, 2, 0, "ClearBuffer"); qmlRegisterExtendedUncreatableType<Qt3D::QFrameGraphNode, Qt3D::Render::Quick::Quick3DFrameGraphItem>(uri, 2, 0, "FrameGraphNode", QStringLiteral("FrameGraphNode is a base class")); qmlRegisterExtendedType<Qt3D::QStateSet, Qt3D::Render::Quick::Quick3DStateSet>(uri, 2, 0, "StateSet"); diff --git a/src/quick3d/quick3drenderer/items/items.pri b/src/quick3d/quick3drenderer/items/items.pri index 6d4c905fd..014ab0b38 100644 --- a/src/quick3d/quick3drenderer/items/items.pri +++ b/src/quick3d/quick3drenderer/items/items.pri @@ -16,7 +16,8 @@ HEADERS += \ $$PWD/quick3dparameter.h \ $$PWD/quick3dshaderdata.h \ $$PWD/quick3dshaderdataarray.h \ - $$PWD/quick3dstateset.h + $$PWD/quick3dstateset.h \ + $$PWD/quick3drendertargetselector.h SOURCES += \ $$PWD/quick3drenderpassfilter.cpp \ @@ -35,6 +36,7 @@ SOURCES += \ $$PWD/quick3dparameter.cpp \ $$PWD/quick3dshaderdata.cpp \ $$PWD/quick3dshaderdataarray.cpp \ - $$PWD/quick3dstateset.cpp + $$PWD/quick3dstateset.cpp \ + $$PWD/quick3drendertargetselector.cpp INCLUDEPATH += $$PWD diff --git a/src/quick3d/quick3drenderer/items/quick3drendertargetselector.cpp b/src/quick3d/quick3drenderer/items/quick3drendertargetselector.cpp new file mode 100644 index 000000000..808d05a46 --- /dev/null +++ b/src/quick3d/quick3drenderer/items/quick3drendertargetselector.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "quick3drendertargetselector.h" + +QT_BEGIN_NAMESPACE + +namespace Qt3D { + +namespace Render { + +namespace Quick { + +Quick3DRenderTargetSelector::Quick3DRenderTargetSelector(QObject *parent) + : QObject(parent) +{ +} + +Quick3DRenderTargetSelector::~Quick3DRenderTargetSelector() +{ +} + +QVariantList Quick3DRenderTargetSelector::drawBuffers() const +{ + // Converts RenderAttachmentType to int + QVariantList l; + Q_FOREACH (const QRenderAttachment::RenderAttachmentType &b, parentRenderTargetSelector()->drawBuffers()) + l.append(static_cast<int>(b)); + return l; +} + +void Quick3DRenderTargetSelector::setDrawBuffers(const QVariantList &buffers) +{ + if (buffers != drawBuffers()) { + + // Converts int to RenderAttachmentType + QList<QRenderAttachment::RenderAttachmentType> drawBuffersList; + Q_FOREACH (const QVariant &buf, buffers) + drawBuffersList.append(static_cast<QRenderAttachment::RenderAttachmentType>(buf.toInt())); + + parentRenderTargetSelector()->setDrawBuffers(drawBuffersList); + emit drawBuffersChanged(); + } +} + +} // Quick + +} // Render + +} // Qt3D + +QT_END_NAMESPACE diff --git a/src/quick3d/quick3drenderer/items/quick3drendertargetselector.h b/src/quick3d/quick3drenderer/items/quick3drendertargetselector.h new file mode 100644 index 000000000..e801dd811 --- /dev/null +++ b/src/quick3d/quick3drenderer/items/quick3drendertargetselector.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3D_RENDER_QUICK_QUICK3DRENDERTARGETSELECTOR_H +#define QT3D_RENDER_QUICK_QUICK3DRENDERTARGETSELECTOR_H + +#include <Qt3DQuickRenderer/qt3dquickrenderer_global.h> +#include <Qt3DRenderer/qrenderattachment.h> +#include <Qt3DRenderer/qrendertargetselector.h> +#include <QQmlListProperty> +#include <QVariantList> + +QT_BEGIN_NAMESPACE + +namespace Qt3D { + +namespace Render { + +namespace Quick { + +class QT3DQUICKRENDERERSHARED_EXPORT Quick3DRenderTargetSelector : public QObject +{ + Q_OBJECT + Q_PROPERTY(QVariantList drawBuffers READ drawBuffers WRITE setDrawBuffers NOTIFY drawBuffersChanged) +public: + explicit Quick3DRenderTargetSelector(QObject *parent = 0); + ~Quick3DRenderTargetSelector(); + + inline QRenderTargetSelector *parentRenderTargetSelector() const { return qobject_cast<QRenderTargetSelector *>(parent()); } + + QVariantList drawBuffers() const; + void setDrawBuffers(const QVariantList &drawBuffers); + +Q_SIGNALS: + void drawBuffersChanged(); +}; + +} // Quick + +} // Render + +} // Qt3D + +QT_END_NAMESPACE + +#endif // QUICK3DRENDERTARGETSELECTOR_H diff --git a/src/render/backend/framegraph/rendertargetselectornode.cpp b/src/render/backend/framegraph/rendertargetselectornode.cpp index 59dd1c5a4..d8f696913 100644 --- a/src/render/backend/framegraph/rendertargetselectornode.cpp +++ b/src/render/backend/framegraph/rendertargetselectornode.cpp @@ -42,6 +42,7 @@ #include <Qt3DRenderer/qrendertarget.h> #include <Qt3DCore/qscenepropertychange.h> #include <Qt3DRenderer/private/renderlogging_p.h> +#include <Qt3DRenderer/qrenderattachment.h> QT_BEGIN_NAMESPACE @@ -60,6 +61,7 @@ void RenderTargetSelector::updateFromPeer(QNode *peer) if (selector->target() != Q_NULLPTR) m_renderTargetUuid = selector->target()->id(); setEnabled(selector->isEnabled()); + m_drawBuffers = selector->drawBuffers(); } void RenderTargetSelector::sceneChangeEvent(const QSceneChangePtr &e) @@ -71,6 +73,8 @@ void RenderTargetSelector::sceneChangeEvent(const QSceneChangePtr &e) m_renderTargetUuid = propertyChange->value().value<QNodeId>(); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); + else if (propertyChange->propertyName() == QByteArrayLiteral("drawBuffers")) + m_drawBuffers = propertyChange->value().value<QList<Qt3D::QRenderAttachment::RenderAttachmentType> >(); } } @@ -79,6 +83,11 @@ QNodeId RenderTargetSelector::renderTargetUuid() const return m_renderTargetUuid; } +QList<QRenderAttachment::RenderAttachmentType> RenderTargetSelector::drawBuffers() const +{ + return m_drawBuffers; +} + } // Render } // Qt3D diff --git a/src/render/backend/framegraph/rendertargetselectornode_p.h b/src/render/backend/framegraph/rendertargetselectornode_p.h index 0b6089ae0..adbd8b041 100644 --- a/src/render/backend/framegraph/rendertargetselectornode_p.h +++ b/src/render/backend/framegraph/rendertargetselectornode_p.h @@ -55,9 +55,11 @@ public: void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE; void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; QNodeId renderTargetUuid() const; + QList<QRenderAttachment::RenderAttachmentType> drawBuffers() const; private: QNodeId m_renderTargetUuid; + QList<QRenderAttachment::RenderAttachmentType> m_drawBuffers; }; } // Render diff --git a/src/render/frontend/framegraph-components/qrendertargetselector.cpp b/src/render/frontend/framegraph-components/qrendertargetselector.cpp index 644dd4137..b357f713b 100644 --- a/src/render/frontend/framegraph-components/qrendertargetselector.cpp +++ b/src/render/frontend/framegraph-components/qrendertargetselector.cpp @@ -88,7 +88,41 @@ QRenderTarget *QRenderTargetSelector::target() const return d->m_target; } -/*! \internal */ +/*! + * \internal + * Sets the draw buffers \a buffers to be used. The draw buffers should be + * matching the Qt3D::QRenderAttachment::RenderAttachmentType + * defined in the attachments of the Qt3D::QRenderTarget associated to the + * Qt3D::QRenderTargetSelector instance. + * + * \note At render time, if no draw buffer has been specified, the renderer will + * default to using all the attachments' draw buffers. + * + */ +void QRenderTargetSelector::setDrawBuffers(const QList<QRenderAttachment::RenderAttachmentType> &buffers) +{ + Q_D(QRenderTargetSelector); + if (buffers != d->m_drawBuffers) { + d->m_drawBuffers = buffers; + + if (d->m_changeArbiter) { + QScenePropertyChangePtr change(new QScenePropertyChange(NodeUpdated, QSceneChange::Node, id())); + change->setPropertyName("drawBuffers"); + change->setValue(QVariant::fromValue(d->m_drawBuffers)); + d->notifyObservers(change); + } + } +} + +/*! + * Returns the list of draw buffers for the current Qt3D::QRenderTargetSelector instance. + */ +QList<QRenderAttachment::RenderAttachmentType> QRenderTargetSelector::drawBuffers() const +{ + Q_D(const QRenderTargetSelector); + return d->m_drawBuffers; +} + QRenderTargetSelector::QRenderTargetSelector(QRenderTargetSelectorPrivate &dd, QNode *parent) : QFrameGraphNode(dd, parent) { diff --git a/src/render/frontend/framegraph-components/qrendertargetselector.h b/src/render/frontend/framegraph-components/qrendertargetselector.h index b467673bc..f98f05f8f 100644 --- a/src/render/frontend/framegraph-components/qrendertargetselector.h +++ b/src/render/frontend/framegraph-components/qrendertargetselector.h @@ -40,6 +40,7 @@ #include <Qt3DRenderer/qt3drenderer_global.h> #include <Qt3DCore/qnode.h> #include <Qt3DRenderer/qframegraphnode.h> +#include <Qt3DRenderer/qrenderattachment.h> QT_BEGIN_NAMESPACE @@ -58,6 +59,9 @@ public: void setTarget(QRenderTarget *target); QRenderTarget *target() const; + void setDrawBuffers(const QList<QRenderAttachment::RenderAttachmentType> &buffers); + QList<QRenderAttachment::RenderAttachmentType> drawBuffers() const; + Q_SIGNALS: void targetChanged(); @@ -74,4 +78,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(QList<Qt3D::QRenderAttachment::RenderAttachmentType>) + #endif // QT3D_QRENDERTARGETSELECTOR_H diff --git a/src/render/frontend/framegraph-components/qrendertargetselector_p.h b/src/render/frontend/framegraph-components/qrendertargetselector_p.h index 195dc6938..8c41de798 100644 --- a/src/render/frontend/framegraph-components/qrendertargetselector_p.h +++ b/src/render/frontend/framegraph-components/qrendertargetselector_p.h @@ -53,6 +53,7 @@ public: Q_DECLARE_PUBLIC(QRenderTargetSelector) QRenderTarget *m_target; + QList<QRenderAttachment::RenderAttachmentType> m_drawBuffers; }; } // Qt3D diff --git a/src/render/frontend/qrenderattachment.h b/src/render/frontend/qrenderattachment.h index e27813795..e0ba0ebcc 100644 --- a/src/render/frontend/qrenderattachment.h +++ b/src/render/frontend/qrenderattachment.h @@ -132,4 +132,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(Qt3D::QRenderAttachment::RenderAttachmentType) + #endif // QT3D_QRENDERATTACHMENT_H |