diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-01-15 11:57:28 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-01-17 17:20:42 +0000 |
commit | 5301ff32875355fc1c9bfad06f31f78733b14a65 (patch) | |
tree | 66d572221904e078126a3218aecc8a71be336a52 /src/render | |
parent | 022e920cac539cdb94a7c9002737f4ecf3e0d3a2 (diff) |
Register renderer settings and set on renderer
Change-Id: I7f4a0c7a51721e8425f9e32aa1a0609fc3e5ee14
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/backend/abstractrenderer_p.h | 4 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 20 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 7 | ||||
-rw-r--r-- | src/render/backend/renderersettings.cpp | 35 | ||||
-rw-r--r-- | src/render/backend/renderersettings_p.h | 14 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 3 |
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) |