summaryrefslogtreecommitdiffstats
path: root/src/render
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 /src/render
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>
Diffstat (limited to 'src/render')
-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
11 files changed, 123 insertions, 13 deletions
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")