diff options
author | Svenn-Arne Dragly <s@dragly.com> | 2018-10-15 19:21:34 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@qt.io> | 2018-10-16 07:19:05 +0000 |
commit | 7f75012d2efd597605eb031660d8929c6a3bcb04 (patch) | |
tree | 48df9930c38b7b23d99a79d87fcb9209cf53f61c /src/imports | |
parent | 39e41cedc7cca3bf951177d9afb6e5960a981280 (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.cpp | 3 | ||||
-rw-r--r-- | src/imports/studio3d/q3dsstudio3drenderer.cpp | 29 | ||||
-rw-r--r-- | src/imports/studio3d/q3dsstudio3drenderer_p.h | 7 |
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 |