summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-01-15 11:57:28 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-01-17 17:20:42 +0000
commit5301ff32875355fc1c9bfad06f31f78733b14a65 (patch)
tree66d572221904e078126a3218aecc8a71be336a52
parent022e920cac539cdb94a7c9002737f4ecf3e0d3a2 (diff)
Register renderer settings and set on renderer
Change-Id: I7f4a0c7a51721e8425f9e32aa1a0609fc3e5ee14 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/render/backend/abstractrenderer_p.h4
-rw-r--r--src/render/backend/renderer.cpp20
-rw-r--r--src/render/backend/renderer_p.h7
-rw-r--r--src/render/backend/renderersettings.cpp35
-rw-r--r--src/render/backend/renderersettings_p.h14
-rw-r--r--src/render/frontend/qrenderaspect.cpp3
6 files changed, 83 insertions, 0 deletions
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h
index 78637eb89..39dadbbf8 100644
--- a/src/render/backend/abstractrenderer_p.h
+++ b/src/render/backend/abstractrenderer_p.h
@@ -72,6 +72,7 @@ namespace Render {
class NodeManagers;
class Entity;
class FrameGraphNode;
+class RendererSettings;
class QT3DRENDERSHARED_PRIVATE_EXPORT AbstractRenderer
{
@@ -120,6 +121,9 @@ public:
virtual Qt3DCore::QAbstractFrameAdvanceService *frameAdvanceService() const = 0;
virtual void registerEventFilter(Qt3DCore::QEventFilterService *service) = 0;
+ virtual void setSettings(RendererSettings *settings) = 0;
+ virtual RendererSettings *settings() const = 0;
+
};
} // Render
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 81bf16a18..1ef356f5a 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -109,6 +109,7 @@ static void logOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage)
const QString SCENE_PARSERS_PATH = QStringLiteral("/sceneparsers");
+const RendererSettings Renderer::ms_defaultSettings;
/*!
\internal
@@ -144,6 +145,7 @@ Renderer::Renderer(QRenderAspect::RenderType type)
, m_glContext(Q_NULLPTR)
, m_pickBoundingVolumeJob(Q_NULLPTR)
, m_time(0)
+ , m_settings(const_cast<RendererSettings *>(&ms_defaultSettings))
{
// Set renderer as running - it will wait in the context of the
// RenderThread for RenderViews to be submitted
@@ -154,6 +156,9 @@ Renderer::Renderer(QRenderAspect::RenderType type)
Renderer::~Renderer()
{
+ // CLean up settings if not using defaults
+ if (m_settings != &ms_defaultSettings)
+ delete m_settings;
}
qint64 Renderer::time() const
@@ -512,6 +517,21 @@ void Renderer::registerEventFilter(QEventFilterService *service)
service->registerEventFilter(m_pickEventFilter.data(), 1024);
}
+void Renderer::setSettings(RendererSettings *settings)
+{
+ // If default settings not in use, clean up
+ if (m_settings != &ms_defaultSettings)
+ delete m_settings;
+
+ // If removing settings, restore to default
+ m_settings = (settings != Q_NULLPTR) ? settings : const_cast<RendererSettings *>(&ms_defaultSettings);
+}
+
+RendererSettings *Renderer::settings() const
+{
+ return m_settings;
+}
+
void Renderer::render()
{
// Traversing the framegraph tree from root to lead node
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index 6dd388d73..c3d2587ed 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -57,6 +57,7 @@
#include <Qt3DCore/qaspectjob.h>
#include <Qt3DRender/private/qt3drender_global_p.h>
#include <Qt3DRender/private/pickboundingvolumejob_p.h>
+#include <Qt3DRender/private/renderersettings_p.h>
#include <QHash>
#include <QMatrix4x4>
@@ -160,6 +161,9 @@ public:
void registerEventFilter(Qt3DCore::QEventFilterService *service) Q_DECL_OVERRIDE;
+ virtual void setSettings(RendererSettings *settings) Q_DECL_OVERRIDE;
+ virtual RendererSettings *settings() const Q_DECL_OVERRIDE;
+
void executeCommands(const RenderView *rv);
Attribute *updateBuffersAndAttributes(Geometry *geometry, RenderCommand *command, GLsizei &count, bool forceUpdate);
@@ -254,6 +258,9 @@ private:
PickBoundingVolumeJobPtr m_pickBoundingVolumeJob;
qint64 m_time;
+
+ RendererSettings *m_settings;
+ static const RendererSettings ms_defaultSettings;
};
} // namespace Render
diff --git a/src/render/backend/renderersettings.cpp b/src/render/backend/renderersettings.cpp
index 04d22ee67..0a53746ba 100644
--- a/src/render/backend/renderersettings.cpp
+++ b/src/render/backend/renderersettings.cpp
@@ -37,6 +37,7 @@
#include "renderersettings_p.h"
#include <Qt3DCore/qscenepropertychange.h>
+#include <Qt3DRender/private/abstractrenderer_p.h>
QT_BEGIN_NAMESPACE
@@ -74,6 +75,40 @@ void RendererSettings::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
}
}
+
+RendererSettingsFunctor::RendererSettingsFunctor(AbstractRenderer *renderer)
+ : m_renderer(renderer)
+{
+}
+
+Qt3DCore::QBackendNode *RendererSettingsFunctor::create(Qt3DCore::QNode *frontend, const Qt3DCore::QBackendNodeFactory *factory) const
+{
+ QRendererSettings *settingsFrontend = static_cast<QRendererSettings *>(frontend);
+ if (m_renderer->settings() != Q_NULLPTR) {
+ qWarning() << "Renderer settings already exists";
+ return Q_NULLPTR;
+ }
+
+ RendererSettings *settings = new RendererSettings;
+ settings->setFactory(factory);
+ settings->setPeer(settingsFrontend);
+ m_renderer->setSettings(settings);
+ return settings;
+}
+
+Qt3DCore::QBackendNode *RendererSettingsFunctor::get(const Qt3DCore::QNodeId &id) const
+{
+ Q_UNUSED(id);
+ return Q_NULLPTR;
+}
+
+void RendererSettingsFunctor::destroy(const Qt3DCore::QNodeId &id) const
+{
+ Q_UNUSED(id);
+ // Deletes the old settings object
+ m_renderer->setSettings(Q_NULLPTR);
+}
+
} // namespace Render
} // namespace Qt3DRender
diff --git a/src/render/backend/renderersettings_p.h b/src/render/backend/renderersettings_p.h
index 32e997840..e20422f83 100644
--- a/src/render/backend/renderersettings_p.h
+++ b/src/render/backend/renderersettings_p.h
@@ -56,6 +56,8 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
+class AbstractRenderer;
+
class RendererSettings : public Qt3DCore::QBackendNode
{
public:
@@ -70,6 +72,18 @@ private:
QRendererSettings::PickResultMode m_pickResultMode;
};
+class RendererSettingsFunctor : public Qt3DCore::QBackendNodeFunctor
+{
+public:
+ explicit RendererSettingsFunctor(AbstractRenderer *renderer);
+ Qt3DCore::QBackendNode *create(Qt3DCore::QNode *frontend, const Qt3DCore::QBackendNodeFactory *factory) const Q_DECL_OVERRIDE;
+ Qt3DCore::QBackendNode *get(const Qt3DCore::QNodeId &id) const Q_DECL_OVERRIDE;
+ void destroy(const Qt3DCore::QNodeId &id) const Q_DECL_OVERRIDE;
+
+private:
+ AbstractRenderer *m_renderer;
+};
+
} // namespace Render
} // namespace Qt3DRender
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 1a31fc778..35c194ccf 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -76,6 +76,7 @@
#include <Qt3DRender/qdispatchcompute.h>
#include <Qt3DRender/qcomputejob.h>
#include <Qt3DRender/qrendersurfaceselector.h>
+#include <Qt3DRender/qrenderersettings.h>
#include <Qt3DRender/private/cameraselectornode_p.h>
#include <Qt3DRender/private/layerfilternode_p.h>
@@ -121,6 +122,7 @@
#include <Qt3DRender/private/dispatchcompute_p.h>
#include <Qt3DRender/private/computejob_p.h>
#include <Qt3DRender/private/rendersurfaceselector_p.h>
+#include <Qt3DRender/private/renderersettings_p.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qtransform.h>
@@ -284,6 +286,7 @@ void QRenderAspect::registerBackendTypes()
registerBackendType<QLighting>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::Lighting, QLighting>(d->m_nodeManagers->frameGraphManager())));
registerBackendType<QDispatchCompute>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::DispatchCompute, QDispatchCompute>(d->m_nodeManagers->frameGraphManager())));
registerBackendType<QComputeJob>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::ComputeJob, Render::ComputeJobManager>(d->m_nodeManagers->computeJobManager())));
+ registerBackendType<QRendererSettings>(QBackendNodeFunctorPtr(new Render::RendererSettingsFunctor(d->m_renderer)));
}
void QRenderAspect::renderInitialize(QOpenGLContext *context)