summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Render/StudioRenderer.cpp
diff options
context:
space:
mode:
authorMäättä Antti <antti.maatta@qt.io>2018-06-01 12:32:53 +0300
committerAntti Määttä <antti.maatta@qt.io>2018-06-19 08:49:35 +0000
commit0196510e727f2501c2c1cf0ad6db92b4fcd380f7 (patch)
tree3da2e29bd60de5daf529333f443c7b955b095201 /src/Authoring/Studio/Render/StudioRenderer.cpp
parentdad11686f36385c579b109861251b0e23a95d4c4 (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.cpp78
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;
}
}