summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-05-15 16:28:33 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-31 11:25:11 +0200
commitc559c941831968dfc0a320c40bb771e0a78b5b68 (patch)
tree5ed9b2b5f7e7d7863bfab6dcde20da538f0dfa56
parentdb19dc3be0d5447e9a09cf42db02ff95448237ea (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.h3
-rw-r--r--src/render/backend/framegraph/cameraselectornode.cpp37
-rw-r--r--src/render/backend/framegraph/cameraselectornode.h13
-rw-r--r--src/render/backend/framegraph/framegraphnode.h1
-rw-r--r--src/render/backend/framegraph/viewportnode.cpp38
-rw-r--r--src/render/backend/framegraph/viewportnode.h21
-rw-r--r--src/render/backend/renderscenebuilder.cpp6
-rw-r--r--src/render/frontend/cameraselector.h4
-rw-r--r--src/render/frontend/framegraphitem.cpp3
-rw-r--r--src/render/frontend/framegraphitem.h3
-rw-r--r--src/render/frontend/viewport.h8
-rw-r--r--src/render/renderlogging.cpp2
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")