summaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorSvenn-Arne Dragly <s@dragly.com>2018-10-15 19:21:34 +0200
committerAndy Nichols <andy.nichols@qt.io>2018-10-16 07:19:05 +0000
commit7f75012d2efd597605eb031660d8929c6a3bcb04 (patch)
tree48df9930c38b7b23d99a79d87fcb9209cf53f61c /src/imports
parent39e41cedc7cca3bf951177d9afb6e5960a981280 (diff)
Add support for the Dragon render aspect in Studio3D
The Dragon render aspect can be enabled by setting dragonRenderAspectEnabled: true on a Presentation item. Change-Id: Ic21b5493d1bdfc4a1de9ff4a4ad643b2ad72c7ed Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/imports')
-rw-r--r--src/imports/studio3d/q3dsstudio3ditem.cpp3
-rw-r--r--src/imports/studio3d/q3dsstudio3drenderer.cpp29
-rw-r--r--src/imports/studio3d/q3dsstudio3drenderer_p.h7
3 files changed, 33 insertions, 6 deletions
diff --git a/src/imports/studio3d/q3dsstudio3ditem.cpp b/src/imports/studio3d/q3dsstudio3ditem.cpp
index 25a4d8c..381b88a 100644
--- a/src/imports/studio3d/q3dsstudio3ditem.cpp
+++ b/src/imports/studio3d/q3dsstudio3ditem.cpp
@@ -427,6 +427,9 @@ void Q3DSStudio3DItem::createEngine()
if (m_sourceFlags.testFlag(Q3DSPresentationController::Profiling))
flags |= Q3DSEngine::EnableProfiling;
+ if (m_sourceFlags.testFlag(Q3DSPresentationController::AwakenTheDragon))
+ flags |= Q3DSEngine::AwakenTheDragon;
+
m_engine->setFlags(flags);
m_engine->setAutoToggleProfileUi(false); // up to the app to control this via the API instead
diff --git a/src/imports/studio3d/q3dsstudio3drenderer.cpp b/src/imports/studio3d/q3dsstudio3drenderer.cpp
index 7ea2163..d0d1399 100644
--- a/src/imports/studio3d/q3dsstudio3drenderer.cpp
+++ b/src/imports/studio3d/q3dsstudio3drenderer.cpp
@@ -33,6 +33,7 @@
#include <private/q3dslayer3dsgnode_p.h>
#include <private/q3dsengine_p.h>
#include <private/q3dslogging_p.h>
+#include <private/qdragonrenderaspect_p.h>
#include <QQuickWindow>
#include <QOpenGLContext>
#include <QGuiApplication>
@@ -87,10 +88,16 @@ Q3DSStudio3DRenderer::Q3DSStudio3DRenderer(Q3DSStudio3DItem *item, Q3DSLayer3DSG
this, &Q3DSStudio3DRenderer::renderOffscreen, Qt::DirectConnection);
ContextSaver saver;
- m_renderAspect = new Qt3DRender::QRenderAspect(Qt3DRender::QRenderAspect::Synchronous);
- m_aspectEngine->registerAspect(m_renderAspect);
- m_renderAspectD = static_cast<Qt3DRender::QRenderAspectPrivate *>(Qt3DRender::QRenderAspectPrivate::get(m_renderAspect));
- m_renderAspectD->renderInitialize(ctx);
+ if (m_item->engine()->flags().testFlag(Q3DSEngine::AwakenTheDragon)) {
+ m_dragonRenderAspect = new Qt3DRender::Dragon::QDragonRenderAspect(Qt3DRender::Dragon::Renderer::Synchronous);
+ m_dragonRenderAspect->initialize(ctx);
+ m_aspectEngine->registerAspect(m_dragonRenderAspect);
+ } else {
+ m_renderAspect = new Qt3DRender::QRenderAspect(Qt3DRender::QRenderAspect::Synchronous);
+ m_aspectEngine->registerAspect(m_renderAspect);
+ m_renderAspectD = static_cast<Qt3DRender::QRenderAspectPrivate *>(Qt3DRender::QRenderAspectPrivate::get(m_renderAspect));
+ m_renderAspectD->renderInitialize(ctx);
+ }
QMetaObject::invokeMethod(m_item, "startEngine");
@@ -102,7 +109,9 @@ Q3DSStudio3DRenderer::~Q3DSStudio3DRenderer()
{
qCDebug(lcStudio3D, "[R] renderer %p dtor", this);
ContextSaver saver;
- m_renderAspectD->renderShutdown();
+
+ if (m_item->engine()->flags().testFlag(Q3DSEngine::AwakenTheDragon))
+ m_renderAspectD->renderShutdown();
}
void Q3DSStudio3DRenderer::invalidateItem()
@@ -148,7 +157,12 @@ void Q3DSStudio3DRenderer::renderOffscreen()
ContextSaver saver;
w->resetOpenGLState();
m_fbo->bind();
- m_renderAspectD->renderSynchronous();
+
+ if (m_item->engine()->flags().testFlag(Q3DSEngine::AwakenTheDragon))
+ m_currentFrame = m_dragonRenderAspect->renderSynchronous(std::move(m_currentFrame));
+ else
+ m_renderAspectD->renderSynchronous();
+
if (saver.context()->surface() != saver.surface())
saver.context()->makeCurrent(saver.surface());
w->resetOpenGLState();
@@ -156,6 +170,9 @@ void Q3DSStudio3DRenderer::renderOffscreen()
if (m_node) {
m_node->markDirty(QSGNode::DirtyMaterial);
} else {
+ if (m_item->engine()->flags().testFlag(Q3DSEngine::AwakenTheDragon))
+ qFatal("View3D is not yet supported in the Dragon render aspect.");
+
QSharedPointer<Qt3DRender::Render::ResourceAccessor> ra = m_renderAspectD->m_renderer->nodeManagers()->resourceAccessor();
if (ra) {
for (auto vd : m_viewDesc) {
diff --git a/src/imports/studio3d/q3dsstudio3drenderer_p.h b/src/imports/studio3d/q3dsstudio3drenderer_p.h
index e2c1ce1..6508be7 100644
--- a/src/imports/studio3d/q3dsstudio3drenderer_p.h
+++ b/src/imports/studio3d/q3dsstudio3drenderer_p.h
@@ -46,6 +46,7 @@
#include <QElapsedTimer>
#include <QOpenGLFramebufferObject>
#include <QSGTexture>
+#include <private/dragonrenderer_p.h>
#include "q3dsstudio3dviewdesc_p.h"
QT_BEGIN_NAMESPACE
@@ -61,6 +62,9 @@ class QAspectEngine;
namespace Qt3DRender {
class QRenderAspect;
class QRenderAspectPrivate;
+namespace Dragon {
+class QDragonRenderAspect;
+}
}
class Q3DSStudio3DRenderer : public QObject
@@ -92,6 +96,7 @@ private:
Qt3DCore::QAspectEngine *m_aspectEngine;
Qt3DRender::QRenderAspect *m_renderAspect = nullptr;
Qt3DRender::QRenderAspectPrivate *m_renderAspectD = nullptr;
+ Qt3DRender::Dragon::QDragonRenderAspect *m_dragonRenderAspect = nullptr;
QScopedPointer<QSGTexture> m_texture;
QScopedPointer<QOpenGLFramebufferObject> m_fbo;
@@ -100,6 +105,8 @@ private:
QVector<Q3DSStudio3DViewDesc> m_viewDesc;
QElapsedTimer m_renderTimer;
bool m_usingRenderThread;
+
+ Qt3DRender::Dragon::Renderer::Frame m_currentFrame;
};
QT_END_NAMESPACE