diff options
author | Määttä Antti <antti.maatta@qt.io> | 2018-06-01 12:32:53 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2018-06-19 08:49:35 +0000 |
commit | 0196510e727f2501c2c1cf0ad6db92b4fcd380f7 (patch) | |
tree | 3da2e29bd60de5daf529333f443c7b955b095201 /src/Authoring/Studio/Render/StudioRenderer.cpp | |
parent | dad11686f36385c579b109861251b0e23a95d4c4 (diff) |
Implement preview of qml streamer content in studio
Task-number: QT3DS-665
Change-Id: Ib8adeaa68e7116161bf898dd898215240a64f1ab
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Render/StudioRenderer.cpp')
-rw-r--r-- | src/Authoring/Studio/Render/StudioRenderer.cpp | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/src/Authoring/Studio/Render/StudioRenderer.cpp b/src/Authoring/Studio/Render/StudioRenderer.cpp index 2fda6c90..62b92b72 100644 --- a/src/Authoring/Studio/Render/StudioRenderer.cpp +++ b/src/Authoring/Studio/Render/StudioRenderer.cpp @@ -33,6 +33,10 @@ #include "HotKeys.h" #include "StudioUtils.h" #include "Qt3DSMath.h" +#include "Qt3DSOffscreenRenderKey.h" +#include "Qt3DSOffscreenRenderManager.h" +#include "q3dsqmlrender.h" +#include "q3dsqmlstreamproxy.h" #include <QtCore/qdebug.h> @@ -65,6 +69,19 @@ SEditCameraDefinition g_EditCameraDefinitions[] = { }; QT3DSU32 g_NumEditCameras = sizeof(g_EditCameraDefinitions) / sizeof(*g_EditCameraDefinitions); +struct StudioSubPresentationRenderer +{ + SubPresentationRecord subpresentation; + IOffscreenRenderer *renderer; + + bool operator == (const SubPresentationRecord &r) const + { + return r.m_id == subpresentation.m_id && + r.m_argsOrSrc == subpresentation.m_argsOrSrc && + r.m_type == subpresentation.m_type; + } +}; + struct SRendererImpl : public IStudioRenderer, public IDataModelListener, public IReloadListener, @@ -95,6 +112,8 @@ struct SRendererImpl : public IStudioRenderer, bool m_GuidesEnabled; qt3dsdm::TSignalConnectionPtr m_SelectionSignal; float m_pixelRatio; + QHash<QString, StudioSubPresentationRenderer> m_subpresentations; + QScopedPointer<Q3DSQmlStreamProxy> m_proxy; SRendererImpl() : m_Dispatch(*g_StudioApp.GetCore()->GetDispatch()) @@ -136,6 +155,57 @@ struct SRendererImpl : public IStudioRenderer, return QT3DSVec3(0, 0, 0); } + void RegisterSubpresentations(const QVector<SubPresentationRecord> &subpresentations) override + { + if (m_proxy.isNull()) + m_proxy.reset(new Q3DSQmlStreamProxy()); + IOffscreenRenderManager &offscreenMgr(m_Context->GetOffscreenRenderManager()); + m_proxy->setPath(m_Doc.GetDocumentPath().GetAbsolutePath().toQString()); + QVector<SubPresentationRecord> toUnregister; + QVector<SubPresentationRecord> toRegister; + const auto keys = m_subpresentations.keys(); + for (QString key : keys) { + if (!subpresentations.contains(m_subpresentations[key].subpresentation)) + toUnregister.append(m_subpresentations[key].subpresentation); + } + + for (int i = 0; i < subpresentations.size(); ++i) { + if (!m_subpresentations.contains(subpresentations[i].m_id) + || !(m_subpresentations[subpresentations[i].m_id] == subpresentations[i])) { + toRegister.append(subpresentations[i]); + } + } + + for (int i = 0; i < toUnregister.size(); ++i) { + QByteArray data = toUnregister[i].m_id.toLocal8Bit(); + qt3ds::render::CRegisteredString rid + = m_Context->GetStringTable().RegisterStr(data.data()); + offscreenMgr.ReleaseOffscreenRenderer(qt3ds::render::SOffscreenRendererKey(rid)); + m_subpresentations.remove(toUnregister[i].m_id); + m_proxy->unregisterPresentation(toUnregister[i].m_id); + } + + for (int i = 0; i < toRegister.size(); ++i) { + QByteArray data = toRegister[i].m_id.toLocal8Bit(); + qt3ds::render::CRegisteredString rid + = m_Context->GetStringTable().RegisterStr(data.data()); + if (toRegister[i].m_type == QStringLiteral("presentation-qml")) { + m_proxy->registerPresentation(toRegister[i].m_id, toRegister[i].m_argsOrSrc); + + qt3ds::render::IOffscreenRenderer *theOffscreenRenderer = + QT3DS_NEW(m_Context->GetAllocator(), + Q3DSQmlRender)(*m_Context, data.data()); + offscreenMgr.RegisterOffscreenRenderer( + qt3ds::render::SOffscreenRendererKey(rid), *theOffscreenRenderer); + m_subpresentations[toRegister[i].m_id].renderer = theOffscreenRenderer; + } else { + + } + m_subpresentations[toRegister[i].m_id].subpresentation = toRegister[i]; + } + RequestRender(); + } + ITextRenderer *GetTextRenderer() override { if (m_Context.mPtr) @@ -259,7 +329,7 @@ struct SRendererImpl : public IStudioRenderer, m_RenderContext->BeginRender(); } - void ReleaseContext() + void ReleaseContext() override { m_RenderContext->EndRender(); } @@ -409,6 +479,8 @@ struct SRendererImpl : public IStudioRenderer, // This must be safe to call from multiple places void Close() override { + m_subpresentations.clear(); + m_proxy.reset(); m_Closed = true; m_Translation = std::shared_ptr<STranslation>(); m_Context = nullptr; @@ -536,6 +608,8 @@ struct SRendererImpl : public IStudioRenderer, void OnNewPresentation() override { OnClosingPresentation(); + m_proxy.reset(); + m_subpresentations.clear(); m_HasPresentation = true; // Reset edit camera information. m_EditCameraInformation.clear(); @@ -657,7 +731,7 @@ struct SRendererImpl : public IStudioRenderer, <= 25) return; } else { - if (abs(theDragDistance.y) <= 5) + if (qAbs(theDragDistance.y) <= 5) return; } } |