diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2018-11-05 16:15:09 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-11-08 14:25:03 +0000 |
commit | dbc2b32f199870c58bda91ece9860ea6d1b5a819 (patch) | |
tree | 9f0dfd39707a3ba40ade769e1f4bd77c852645ad | |
parent | d8a37e66b3a12c0a839e65b93314f0077ff30b3c (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.cpp | 8 | ||||
-rw-r--r-- | src/runtime/q3dsengine_p.h | 3 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 42 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 3 |
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; |