summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2018-11-05 16:15:09 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-11-08 14:25:03 +0000
commitdbc2b32f199870c58bda91ece9860ea6d1b5a819 (patch)
tree9f0dfd39707a3ba40ade769e1f4bd77c852645ad
parentd8a37e66b3a12c0a839e65b93314f0077ff30b3c (diff)
Fix issue with multiple View3D + stereoscopic
Stereoscopic QParameter is per-layer. Also move some logic from engine into scenemanager side. Task-number: QT3DS-2561 Change-Id: I2c426a8511edc0cdbaae8760578651915a05dd28 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/runtime/q3dsengine.cpp8
-rw-r--r--src/runtime/q3dsengine_p.h3
-rw-r--r--src/runtime/q3dsscenemanager.cpp42
-rw-r--r--src/runtime/q3dsscenemanager_p.h3
4 files changed, 29 insertions, 27 deletions
diff --git a/src/runtime/q3dsengine.cpp b/src/runtime/q3dsengine.cpp
index b05c911..6bb87b5 100644
--- a/src/runtime/q3dsengine.cpp
+++ b/src/runtime/q3dsengine.cpp
@@ -1249,13 +1249,7 @@ void Q3DSEngine::setViewportSettings(Q3DSViewportSettings *viewportSettings)
connect(m_viewportSettings, &Q3DSViewportSettings::stereoModeChanged, [this] {
if (!m_uipPresentations.isEmpty()) {
- m_uipPresentations[0].sceneManager->updateViewportRects();
-
- if (isStereoscopic() != m_wasStereoscopic)
- emit stereoscopicChanged();
-
- m_wasStereoscopic = isStereoscopic();
-
+ emit stereoModeChanged();
// Force a refresh
resize(m_size, m_dpr);
}
diff --git a/src/runtime/q3dsengine_p.h b/src/runtime/q3dsengine_p.h
index d349dec..162c205 100644
--- a/src/runtime/q3dsengine_p.h
+++ b/src/runtime/q3dsengine_p.h
@@ -230,7 +230,7 @@ Q_SIGNALS:
void slideExited(Q3DSGraphObject *context, int index, const QString &name);
void layerResized(Q3DSLayerNode *layer3DS);
void layerTextureNodeChanged(Q3DSLayerNode *layer3DS);
- void stereoscopicChanged();
+ void stereoModeChanged();
private:
Q_DISABLE_COPY(Q3DSEngine)
@@ -315,7 +315,6 @@ private:
QMutex m_renderLoopStatsMutex;
float m_quickDeltaSum = 0;
int m_quickDeltaCount = 0;
- bool m_wasStereoscopic = false;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(Q3DSEngine::Flags)
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp
index 80ea720..a43084c 100644
--- a/src/runtime/q3dsscenemanager.cpp
+++ b/src/runtime/q3dsscenemanager.cpp
@@ -726,7 +726,7 @@ Q3DSSceneManager::Scene Q3DSSceneManager::buildScene(Q3DSUipPresentation *presen
this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
}
- QObject::disconnect(m_engine, &Q3DSEngine::stereoscopicChanged, 0, 0);
+ QObject::disconnect(m_engine, &Q3DSEngine::stereoModeChanged, 0, 0);
// Kick off the Qt3D scene.
m_rootEntity = new Qt3DCore::QEntity;
@@ -1166,9 +1166,6 @@ void Q3DSSceneManager::updateViewportRects()
break;
}
}
-
- // Update mode into shader parameter
- m_stereoMode->setValue(m_engine->viewportSettings()->stereoMode());
}
void Q3DSSceneManager::updateStereoRenderTree(Q3DSLayerAttached *layerData)
@@ -1410,8 +1407,10 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
// Enable/disable correct selectors depending on mode
updateStereoRenderTree(layerData);
- m_stereoMode = new Qt3DRender::QParameter(QLatin1String("stereoMode"),
- m_engine->viewportSettings()->stereoMode());
+ layerData->stereoModeParam
+ = new Qt3DRender::QParameter(QLatin1String("stereoMode"),
+ m_engine->viewportSettings()->stereoMode());
+ layerData->wasStereoscopic = m_engine->isStereoscopic();
// The effective texture for the layer can change over time (for example
// when a postproc effect or progaa becomes active or inactive). Keep the
@@ -1437,20 +1436,29 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
emit m_engine->layerTextureNodeChanged(layer3DS);
});
- QObject::connect(m_engine, &Q3DSEngine::stereoscopicChanged,
+ QObject::connect(m_engine, &Q3DSEngine::stereoModeChanged,
[this, layer3DS, layerData]()
{
- // When switching between stereo <-> non-stereo, update used shader
- // TODO: Here we disable effects when rendering stereo as msaa+effect currently doesn't work for stereo
- int activeEffectCount = layerData->eyeMono->effectData.activeEffectCount;
- layerData->effectActive = m_engine->isStereoscopic() ? false : activeEffectCount > 0;
+ if (m_engine->isStereoscopic() != layerData->wasStereoscopic) {
+ // When switching between stereo <-> non-stereo do extra initialization
+ // TODO: Here we disable effects when rendering stereo as msaa+effect currently doesn't work for stereo
+ int activeEffectCount = layerData->eyeMono->effectData.activeEffectCount;
+ layerData->effectActive = m_engine->isStereoscopic() ? false : activeEffectCount > 0;
- // If any layer uses advanced blending, let them update shaders
- updateAdvancedBlendLayers();
+ // If any layer uses advanced blending, let them update shaders
+ updateAdvancedBlendLayers();
+
+ updateLayerCompositorProgram(layer3DS);
+ // And enable/disable related selectors
+ updateStereoRenderTree(layerData);
+
+ layerData->wasStereoscopic = m_engine->isStereoscopic();
+ }
+
+ // Update mode into shader parameter
+ if (m_engine->isStereoscopic())
+ layerData->stereoModeParam->setValue(m_engine->viewportSettings()->stereoMode());
- updateLayerCompositorProgram(layer3DS);
- // And enable/disable related selectors
- updateStereoRenderTree(layerData);
});
layer3DS->setAttached(layerData);
@@ -3807,7 +3815,7 @@ void Q3DSSceneManager::buildLayerQuadEntity(Q3DSLayerNode *layer3DS, Qt3DCore::Q
renderPass->addParameter(data->eyeRight->compositorSourceParam);
// Add stereo parameter
- renderPass->addParameter(m_stereoMode);
+ renderPass->addParameter(data->stereoModeParam);
}
technique->addRenderPass(renderPass);
diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h
index 8607789..507b2cc 100644
--- a/src/runtime/q3dsscenemanager_p.h
+++ b/src/runtime/q3dsscenemanager_p.h
@@ -321,9 +321,11 @@ public:
bool usesDefaultCompositorProgram = true;
bool effectActive = false;
bool wasDirty = false;
+ bool wasStereoscopic = false;
bool rayCasterBusy = false;
Qt3DRender::QParameter *cameraPropertiesParam = nullptr;
Qt3DRender::QRayCaster *layerRayCaster = nullptr;
+ Qt3DRender::QParameter *stereoModeParam = nullptr;
struct RayCastQueueEntry {
QVector3D direction;
@@ -1003,7 +1005,6 @@ private:
QVector<Qt3DCore::QEntity *> m_compositorEntities;
bool m_compositorEnabled = true;
QVector<ViewportSet> m_viewports;
- Qt3DRender::QParameter *m_stereoMode;
friend class Q3DSFrameUpdater;
friend class Q3DSProfiler;
friend class Q3DSSlidePlayer;