summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2018-09-05 10:54:12 +0200
committerAntti Kokko <antti.kokko@qt.io>2018-09-07 06:51:49 +0000
commitd4455dba8adae02bdfcebc6c328c33cdbbb1241d (patch)
treedf9f9794db68e2b2182dd8d7d16f391bae9d4dd8
parentcacfe6209b39b6f17d8956c0b9561d65aaeb5312 (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.cpp59
-rw-r--r--src/runtime/q3dsscenemanager_p.h4
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;