diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-09-05 10:54:12 +0200 |
---|---|---|
committer | Antti Kokko <antti.kokko@qt.io> | 2018-09-07 06:51:49 +0000 |
commit | d4455dba8adae02bdfcebc6c328c33cdbbb1241d (patch) | |
tree | df9f9794db68e2b2182dd8d7d16f391bae9d4dd8 | |
parent | cacfe6209b39b6f17d8956c0b9561d65aaeb5312 (diff) |
Add support for deferred subpres. loading in Image
Task-number: QT3DS-2261
Change-Id: I3996f30045fd29323c25a2fbdbc921d2b59099ef
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 59 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 4 |
2 files changed, 36 insertions, 27 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index a5e5613..f09efb6 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -894,9 +894,11 @@ void Q3DSSceneManager::finalizeMainScene(const QVector<Q3DSSubPresentation> &sub Q_ASSERT(!m_flags.testFlag(SubPresentation)); qCDebug(lcScene, "finalizeMainScene"); + m_inFinalizeMainScene = true; + m_subPresentations = subPresentations; - updateSubPresentationHosts(true); + updateSubPresentationHosts(); for (const Q3DSSubPresentation &subPres : m_subPresentations) { if (subPres.sceneManager) @@ -907,9 +909,33 @@ void Q3DSSceneManager::finalizeMainScene(const QVector<Q3DSSubPresentation> &sub if (!m_flags.testFlag(SubPresentation)) m_consoleCommands->runBootScript(); #endif + + m_inFinalizeMainScene = false; +} + +void Q3DSSceneManager::loadSubUipPresentation(Q3DSSubPresentation *sp) +{ + const QString id = sp->id; + Q_ASSERT(!id.isEmpty()); + *sp = m_engine->loadSubUipPresentation(sp->id); + sp->id = id; + if (sp->colorTex && sp->sceneManager) { + if (!m_inFinalizeMainScene) { + sp->sceneManager->prepareAnimators(); + m_profiler->registerSubPresentationProfiler(sp->sceneManager->m_profiler); + Q3DSUipPresentation::forAllObjectsOfType(sp->sceneManager->m_presentation->scene(), + Q3DSGraphObject::Behavior, + [this, &sp](Q3DSGraphObject *obj) + { + Q3DSBehaviorInstance *behaviorInstance = static_cast<Q3DSBehaviorInstance *>(obj); + if (behaviorInstance->eyeballEnabled()) + m_engine->loadBehaviorInstance(behaviorInstance, sp->sceneManager->m_presentation); + }); + } + } } -void Q3DSSceneManager::updateSubPresentationHosts(bool inFinalizeMainScene) +void Q3DSSceneManager::updateSubPresentationHosts() { for (Q3DSLayerNode *layer3DS : m_pendingSubPresLayers) { const QString subPresId = layer3DS->sourcePath(); @@ -917,29 +943,8 @@ void Q3DSSceneManager::updateSubPresentationHosts(bool inFinalizeMainScene) auto it = std::find_if(m_subPresentations.begin(), m_subPresentations.end(), [subPresId](const Q3DSSubPresentation &sp) { return sp.id == subPresId; }); if (it != m_subPresentations.end()) { - if (!it->colorTex) { - Q3DSSubPresentation sp = m_engine->loadSubUipPresentation(it->id); - if (sp.colorTex && sp.sceneManager) { - it->id = sp.id; - it->sceneManager = sp.sceneManager; - it->colorTex = sp.colorTex; - it->depthOrDepthStencilTex = sp.depthOrDepthStencilTex; - it->stencilTex = sp.stencilTex; - - if (!inFinalizeMainScene) { - sp.sceneManager->prepareAnimators(); - m_profiler->registerSubPresentationProfiler(sp.sceneManager->m_profiler); - Q3DSUipPresentation::forAllObjectsOfType(sp.sceneManager->m_presentation->scene(), - Q3DSGraphObject::Behavior, - [this, &sp](Q3DSGraphObject *obj) - { - Q3DSBehaviorInstance *behaviorInstance = static_cast<Q3DSBehaviorInstance *>(obj); - if (behaviorInstance->eyeballEnabled()) - m_engine->loadBehaviorInstance(behaviorInstance, sp.sceneManager->m_presentation); - }); - } - } - } + if (!it->colorTex) + loadSubUipPresentation(it); if (it->colorTex) { qCDebug(lcScene, "Directing subpresentation %s to layer %s", qPrintable(it->id), layer3DS->id().constData()); Q3DSLayerAttached *layerData = static_cast<Q3DSLayerAttached *>(layer3DS->attached()); @@ -5071,9 +5076,11 @@ void Q3DSSceneManager::updateTextureParameters(Q3DSTextureParameters &texturePar void Q3DSSceneManager::setImageTextureFromSubPresentation(Qt3DRender::QParameter *sampler, Q3DSImage *image) { - auto it = std::find_if(m_subPresentations.cbegin(), m_subPresentations.cend(), + auto it = std::find_if(m_subPresentations.begin(), m_subPresentations.end(), [image](const Q3DSSubPresentation &sp) { return sp.id == image->subPresentation(); }); if (it != m_subPresentations.cend()) { + if (!it->colorTex) + loadSubUipPresentation(it); qCDebug(lcScene, "Directing subpresentation %s to image %s", qPrintable(image->subPresentation()), image->id().constData()); sampler->setValue(QVariant::fromValue(it->colorTex)); diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index 47afea9..c05dea2 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -774,7 +774,8 @@ public: private: Q_DISABLE_COPY(Q3DSSceneManager) - void updateSubPresentationHosts(bool inFinalizeMainScene = false); + void updateSubPresentationHosts(); + void loadSubUipPresentation(Q3DSSubPresentation *sp); void initSubTree(Q3DSGraphObject *subTreeRoot); void buildLayer(Q3DSLayerNode *layer3DS, Qt3DRender::QFrameGraphNode *parent, const QSize &parentSize); void buildSubPresentationLayer(Q3DSLayerNode *layer3DS, const QSize &parentSize); @@ -943,6 +944,7 @@ private: Q3DSInputManager *m_inputManager = nullptr; QVector<Q3DSGraphObject::Event> m_eventQueue; bool m_inDestructor = false; + bool m_inFinalizeMainScene = false; bool m_layerCaching = true; bool m_layerUncachePending = false; QSet<Q3DSSceneManager *> m_layerCacheDeps; |