diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2014-05-15 16:28:33 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-31 11:25:11 +0200 |
commit | c559c941831968dfc0a320c40bb771e0a78b5b68 (patch) | |
tree | 5ed9b2b5f7e7d7863bfab6dcde20da538f0dfa56 | |
parent | db19dc3be0d5447e9a09cf42db02ff95448237ea (diff) |
FrameGraphItems are observed for changes
The Backend FrameGraphNode observe when needed the frontend FrameGraphItem for
SceneChange notifications. This is the case when the camera property of a
CameraSelector is updated to reference another camera. This is also the case
for the Viewport rectangle which could be updated.
Will have to check later for TechniqueFilter/RenderPassFilter
Change-Id: Iaf592f6b2496790a11b05111def5d3af473a1e84
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/core/nodes/entity.h | 3 | ||||
-rw-r--r-- | src/render/backend/framegraph/cameraselectornode.cpp | 37 | ||||
-rw-r--r-- | src/render/backend/framegraph/cameraselectornode.h | 13 | ||||
-rw-r--r-- | src/render/backend/framegraph/framegraphnode.h | 1 | ||||
-rw-r--r-- | src/render/backend/framegraph/viewportnode.cpp | 38 | ||||
-rw-r--r-- | src/render/backend/framegraph/viewportnode.h | 21 | ||||
-rw-r--r-- | src/render/backend/renderscenebuilder.cpp | 6 | ||||
-rw-r--r-- | src/render/frontend/cameraselector.h | 4 | ||||
-rw-r--r-- | src/render/frontend/framegraphitem.cpp | 3 | ||||
-rw-r--r-- | src/render/frontend/framegraphitem.h | 3 | ||||
-rw-r--r-- | src/render/frontend/viewport.h | 8 | ||||
-rw-r--r-- | src/render/renderlogging.cpp | 2 |
12 files changed, 126 insertions, 13 deletions
diff --git a/src/core/nodes/entity.h b/src/core/nodes/entity.h index f7fe40808..262bd4840 100644 --- a/src/core/nodes/entity.h +++ b/src/core/nodes/entity.h @@ -180,6 +180,9 @@ private: } // namespace Qt3D Q_DECLARE_INTERFACE(Qt3D::Entity, "org.qtproject.qt3d.entity/2.0") + QT_END_NAMESPACE +Q_DECLARE_METATYPE(Qt3D::Entity *) + #endif // QT3D_ENTITY_H diff --git a/src/render/backend/framegraph/cameraselectornode.cpp b/src/render/backend/framegraph/cameraselectornode.cpp index 5d10d5ad0..a3e2cdcf3 100644 --- a/src/render/backend/framegraph/cameraselectornode.cpp +++ b/src/render/backend/framegraph/cameraselectornode.cpp @@ -40,20 +40,55 @@ ****************************************************************************/ #include "cameraselectornode.h" - #include "rendercamera.h" +#include <Qt3DRenderer/cameraselector.h> +#include <Qt3DRenderer/renderer.h> +#include <Qt3DRenderer/rendereraspect.h> +#include <Qt3DCore/qaspectmanager.h> +#include <Qt3DCore/entity.h> +#include "renderlogging.h" QT_BEGIN_NAMESPACE namespace Qt3D { + namespace Render { CameraSelector::CameraSelector(FrameGraphNode *parent) : FrameGraphNode(FrameGraphNode::CameraSelector, parent) + , m_renderer(Q_NULLPTR) + , m_peer(Q_NULLPTR) +{ +} + +void CameraSelector::setRenderer(Renderer *renderer) { + m_renderer = renderer; } +void CameraSelector::setPeer(Qt3D::CameraSelector *peer) +{ + if (m_peer != peer) { + if (m_peer) + m_renderer->rendererAspect()->aspectManager()->changeArbiter()->unregisterObserver(this, m_peer); + m_peer = peer; + if (m_peer) + m_renderer->rendererAspect()->aspectManager()->changeArbiter()->registerObserver(this, m_peer, ComponentUpdated); + } } + +void CameraSelector::sceneChangeEvent(const QSceneChangePtr &e) +{ + qCDebug(Render::Framegraph) << Q_FUNC_INFO; + if (e->m_type == ComponentUpdated) { + QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); + if (propertyChange->m_propertyName == QByteArrayLiteral("camera")) + setCameraEntity(qobject_cast<Entity*>(propertyChange->m_value.value<Node*>())); + } } +} // Render + +} // Qt3D + QT_END_NAMESPACE diff --git a/src/render/backend/framegraph/cameraselectornode.h b/src/render/backend/framegraph/cameraselectornode.h index e39e42a8b..911634df6 100644 --- a/src/render/backend/framegraph/cameraselectornode.h +++ b/src/render/backend/framegraph/cameraselectornode.h @@ -49,21 +49,32 @@ QT_BEGIN_NAMESPACE namespace Qt3D { class Entity; +class CameraSelector; namespace Render { +class Renderer; + class RenderCamera; -class CameraSelector : public FrameGraphNode +class CameraSelector : public FrameGraphNode, public QObserverInterface { public: CameraSelector(FrameGraphNode *parent = 0); + void setRenderer(Renderer *renderer); + void setPeer(Qt3D::CameraSelector *peer); + Qt3D::CameraSelector *peer() const { return m_peer; } + void setCameraEntity(Entity *cameraEntity) { m_cameraEntity = cameraEntity; } Entity *cameraEntity() const { return m_cameraEntity; } + void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; private: Entity *m_cameraEntity; + Renderer *m_renderer; + Qt3D::CameraSelector *m_peer; + }; } // namespace Render diff --git a/src/render/backend/framegraph/framegraphnode.h b/src/render/backend/framegraph/framegraphnode.h index 6916c47a2..adf5de19c 100644 --- a/src/render/backend/framegraph/framegraphnode.h +++ b/src/render/backend/framegraph/framegraphnode.h @@ -44,6 +44,7 @@ #include <qglobal.h> #include <QVector> +#include <Qt3DCore/qchangearbiter.h> QT_BEGIN_NAMESPACE diff --git a/src/render/backend/framegraph/viewportnode.cpp b/src/render/backend/framegraph/viewportnode.cpp index 1150e3e6b..7fe9a47a5 100644 --- a/src/render/backend/framegraph/viewportnode.cpp +++ b/src/render/backend/framegraph/viewportnode.cpp @@ -40,7 +40,10 @@ ****************************************************************************/ #include "viewportnode.h" - +#include <Qt3DRenderer/renderer.h> +#include <Qt3DRenderer/rendereraspect.h> +#include <Qt3DCore/qaspectmanager.h> +#include <Qt3DRenderer/viewport.h> #include <QDebug> QT_BEGIN_NAMESPACE @@ -50,6 +53,8 @@ namespace Render { ViewportNode::ViewportNode(FrameGraphNode *parent) : FrameGraphNode(FrameGraphNode::Viewport, parent) + , m_renderer(Q_NULLPTR) + , m_peer(Q_NULLPTR) , m_xMin(0.0f) , m_yMin(0.0f) , m_xMax(1.0f) @@ -57,6 +62,22 @@ ViewportNode::ViewportNode(FrameGraphNode *parent) { } +void ViewportNode::setRenderer(Renderer *renderer) +{ + m_renderer = renderer; +} + +void ViewportNode::setPeer(Qt3D::Viewport *peer) +{ + if (m_peer != peer) { + if (m_peer) + m_renderer->rendererAspect()->aspectManager()->changeArbiter()->unregisterObserver(this, m_peer); + m_peer = peer; + if (m_peer) + m_renderer->rendererAspect()->aspectManager()->changeArbiter()->registerObserver(this, m_peer, ComponentUpdated); + } +} + float ViewportNode::xMin() const { return m_xMin; @@ -94,7 +115,22 @@ void ViewportNode::setYMax(float yMax) m_yMax = yMax; } +void ViewportNode::sceneChangeEvent(const QSceneChangePtr &e) +{ + if (e->m_type == ComponentUpdated) { + QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); + if (propertyChange->m_propertyName == QByteArrayLiteral("rect")) { + QRectF rect = propertyChange->m_value.value<QRectF>(); + setXMin(rect.x()); + setYMin(rect.y()); + setXMax(rect.width()); + setYMax(rect.height()); + } + } +} + } // Render + } // Qt3D QT_END_NAMESPACE diff --git a/src/render/backend/framegraph/viewportnode.h b/src/render/backend/framegraph/viewportnode.h index f6a315b80..2f034c489 100644 --- a/src/render/backend/framegraph/viewportnode.h +++ b/src/render/backend/framegraph/viewportnode.h @@ -47,13 +47,22 @@ QT_BEGIN_NAMESPACE namespace Qt3D { + +class Viewport; + namespace Render { -class ViewportNode : public Render::FrameGraphNode +class Renderer; + +class ViewportNode : public Render::FrameGraphNode, public QObserverInterface { public: ViewportNode(Render::FrameGraphNode *parent = 0); + void setRenderer(Renderer *renderer); + void setPeer(Qt3D::Viewport *peer); + Qt3D::Viewport *peer() const { return m_peer; } + float xMin() const; void setXMin(float xMin); @@ -66,15 +75,21 @@ public: float yMax() const; void setYMax(float yMax); + void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; + private: + Renderer *m_renderer; + Qt3D::Viewport *m_peer; float m_xMin; float m_yMin; float m_xMax; float m_yMax; + }; -} -} +} // Render + +} // Qt3D QT_END_NAMESPACE diff --git a/src/render/backend/renderscenebuilder.cpp b/src/render/backend/renderscenebuilder.cpp index b28f17ab3..adbe751f3 100644 --- a/src/render/backend/renderscenebuilder.cpp +++ b/src/render/backend/renderscenebuilder.cpp @@ -157,7 +157,8 @@ Render::FrameGraphNode *RenderSceneBuilder::backendFrameGraphNode(Node *block) else if (qobject_cast<Qt3D::Viewport*>(block) != Q_NULLPTR) { Qt3D::Viewport *viewport = qobject_cast<Qt3D::Viewport*>(block); Render::ViewportNode *viewportNode = new Render::ViewportNode(); - + viewportNode->setRenderer(m_renderer); + viewportNode->setPeer(viewport); qCDebug(Backend) << Q_FUNC_INFO << "Viewport"; viewportNode->setXMin(viewport->rect().x()); viewportNode->setXMax(viewport->rect().width()); @@ -176,7 +177,8 @@ Render::FrameGraphNode *RenderSceneBuilder::backendFrameGraphNode(Node *block) else if (qobject_cast<Qt3D::CameraSelector*>(block) != Q_NULLPTR) { Qt3D::CameraSelector *cameraSelector = qobject_cast<Qt3D::CameraSelector*>(block); Render::CameraSelector *cameraSelectorNode = new Render::CameraSelector(); - + cameraSelectorNode->setRenderer(m_renderer); + cameraSelectorNode->setPeer(cameraSelector); Entity *cameraEntity = qobject_cast<Entity*>(cameraSelector->camera()); // If the Entity is declared inline on the QML Side, the Entity is not set as part of the Scene tree // So we need to make sure the RenderNode for the given Entity exists in the RenderNodesMananger diff --git a/src/render/frontend/cameraselector.h b/src/render/frontend/cameraselector.h index 61d9cbdd4..1ad07dc9c 100644 --- a/src/render/frontend/cameraselector.h +++ b/src/render/frontend/cameraselector.h @@ -81,6 +81,10 @@ public: if (d->m_camera != camera) { d->m_camera = camera; emit cameraChanged(); + QScenePropertyChangePtr propertyChange(new QScenePropertyChange(ComponentUpdated, this)); + propertyChange->m_propertyName = QByteArrayLiteral("camera"); + propertyChange->m_value = QVariant::fromValue(d->m_camera); + notifyObservers(propertyChange); } } diff --git a/src/render/frontend/framegraphitem.cpp b/src/render/frontend/framegraphitem.cpp index 522e449b2..606cf3c84 100644 --- a/src/render/frontend/framegraphitem.cpp +++ b/src/render/frontend/framegraphitem.cpp @@ -59,7 +59,8 @@ QT_BEGIN_NAMESPACE namespace Qt3D { FrameGraphItem::FrameGraphItem() - : d_ptr(new FrameGraphItemPrivate(this)) + : QObservable() + , d_ptr(new FrameGraphItemPrivate(this)) { } diff --git a/src/render/frontend/framegraphitem.h b/src/render/frontend/framegraphitem.h index 3a8239022..6e304bb6b 100644 --- a/src/render/frontend/framegraphitem.h +++ b/src/render/frontend/framegraphitem.h @@ -44,6 +44,7 @@ #include <Qt3DRenderer/qt3drenderer_global.h> #include <Qt3DCore/node.h> +#include <Qt3DCore/qchangearbiter.h> QT_BEGIN_NAMESPACE @@ -51,7 +52,7 @@ namespace Qt3D { class FrameGraphItemPrivate; -class QT3DRENDERERSHARED_EXPORT FrameGraphItem +class QT3DRENDERERSHARED_EXPORT FrameGraphItem : public QObservable { public: FrameGraphItem(); diff --git a/src/render/frontend/viewport.h b/src/render/frontend/viewport.h index 50877d1f2..3c5fa39a7 100644 --- a/src/render/frontend/viewport.h +++ b/src/render/frontend/viewport.h @@ -66,8 +66,8 @@ public : class QT3DRENDERERSHARED_EXPORT Viewport : public FrameGraphItem { public: - Viewport() : - d_ptr(new ViewportPrivate(this)) + Viewport() + : d_ptr(new ViewportPrivate(this)) {} virtual ~Viewport() {} @@ -84,6 +84,10 @@ public: if (rect != d->m_rect) { d->m_rect = rect; emit rectChanged(); + QScenePropertyChangePtr propertyChange(new QScenePropertyChange(ComponentUpdated, this)); + propertyChange->m_propertyName = QByteArrayLiteral("rect"); + propertyChange->m_value = QVariant::fromValue(d->m_rect); + notifyObservers(propertyChange); } } diff --git a/src/render/renderlogging.cpp b/src/render/renderlogging.cpp index 5d0815163..c17c011ad 100644 --- a/src/render/renderlogging.cpp +++ b/src/render/renderlogging.cpp @@ -51,7 +51,7 @@ Q_LOGGING_CATEGORY(Backend, "Qt3D.Render.Backend") Q_LOGGING_CATEGORY(Frontend, "Qt3D.Render.Frontend") Q_LOGGING_CATEGORY(Io, "Qt3D.Render.IO") Q_LOGGING_CATEGORY(Jobs, "Qt3D.Render.Jobs") -Q_LOGGING_CATEGORY(FrameGraph, "Qt3D.Render.FrameGraph") +Q_LOGGING_CATEGORY(Framegraph, "Qt3D.Render.Framegraph") Q_LOGGING_CATEGORY(RenderNodes, "Qt3D.Render.RenderNodes") Q_LOGGING_CATEGORY(Rendering, "Qt3D.Render.Rendering") |