diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2018-10-31 09:56:32 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-11-02 11:48:33 +0000 |
commit | 802a907e73a57256363c5547e1b089c1f80df4f9 (patch) | |
tree | f3de7fdf641880c6c5bd2486b20fe24ad02c2b63 | |
parent | 3981b2ce1439eff2f87064296f5a91b4a271515d (diff) |
Create rendering framegraph only for required viewports
When in mono mode, left & right viewport trees are not required
at all and vice versa. So reparent subtrees when stereoscopic
mode is changed instead of just enabling/disabling cameras.
Task-number: QT3DS-2591
Change-Id: I23bae7b9808fb786c59549a1afad8ee49fde533e
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 30 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 2 |
2 files changed, 16 insertions, 16 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index cf2f2e7..ef1b1b7 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -1185,17 +1185,17 @@ void Q3DSSceneManager::updateViewportRects() m_stereoMode->setValue(m_engine->viewportSettings()->stereoMode()); } -void Q3DSSceneManager::updateCamerasStatus(Q3DSLayerAttached *layerData) +void Q3DSSceneManager::updateViewportsRenderTree(Q3DSLayerAttached *layerData, ViewportSet viewports) { Q_ASSERT(layerData); if (m_engine->isStereoscopic()) { - layerData->eyeMono->cameraSelector->setEnabled(false); - layerData->eyeLeft->cameraSelector->setEnabled(true); - layerData->eyeRight->cameraSelector->setEnabled(true); + viewports.viewportMono->setParent(layerData->layerFgDummyParent); + viewports.viewportLeft->setParent(layerData->eyeLeft->rtSelector); + viewports.viewportRight->setParent(layerData->eyeRight->rtSelector); } else { - layerData->eyeMono->cameraSelector->setEnabled(true); - layerData->eyeLeft->cameraSelector->setEnabled(false); - layerData->eyeRight->cameraSelector->setEnabled(false); + viewports.viewportMono->setParent(layerData->eyeMono->rtSelector); + viewports.viewportLeft->setParent(layerData->layerFgDummyParent); + viewports.viewportRight->setParent(layerData->layerFgDummyParent); } } @@ -1342,7 +1342,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, "RT for layer %s", layer3DS->id().constData()); rtSelector->setTarget(rt); - viewports.viewportMono = new Qt3DRender::QViewport(rtSelector); + viewports.viewportMono = new Qt3DRender::QViewport(); // Will be reparented layerData->eyeMono = buildEye(layer3DS, viewports.viewportMono); // Create color and depth-stencil buffers for this layer @@ -1354,7 +1354,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, "RT for layer %s", layer3DS->id().constData()); rtSelectorLeft->setTarget(rtLeft); - viewports.viewportLeft = new Qt3DRender::QViewport(rtSelectorLeft); + viewports.viewportLeft = new Qt3DRender::QViewport(); // Will be reparented layerData->eyeLeft = buildEye(layer3DS, viewports.viewportLeft); // Create color and depth-stencil buffers for this layer @@ -1366,7 +1366,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, "RT for layer %s", layer3DS->id().constData()); rtSelectorRight->setTarget(rtRight); - viewports.viewportRight = new Qt3DRender::QViewport(rtSelectorRight); + viewports.viewportRight = new Qt3DRender::QViewport(); // Will be reparented layerData->eyeRight = buildEye(layer3DS, viewports.viewportRight); // Note: Moved layerSceneRootEntity to be child of layerFgRoot instead of rtSelector @@ -1420,8 +1420,8 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, layerData->eyeLeft->effectData.effectRoot = layerData->eyeLeft->effectRoot; layerData->eyeRight->effectData.effectRoot = layerData->eyeRight->effectRoot; - // Enable/disable correct cameras depending on mode - updateCamerasStatus(layerData); + // Enable/disable correct viewports depending on mode + updateViewportsRenderTree(layerData, viewports); m_stereoMode = new Qt3DRender::QParameter(QLatin1String("stereoMode"), m_engine->viewportSettings()->stereoMode()); @@ -1451,7 +1451,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, }); QObject::connect(m_engine, &Q3DSEngine::stereoscopicChanged, - [this, layer3DS, layerData]() + [this, layer3DS, layerData, viewports]() { // 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 @@ -1462,8 +1462,8 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, updateAdvancedBlendLayers(); updateLayerCompositorProgram(layer3DS); - // And enable/disable related cameras - updateCamerasStatus(layerData); + // And enable/disable related viewports + updateViewportsRenderTree(layerData, viewports); }); layer3DS->setAttached(layerData); diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index cbeac36..bdc713f 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -810,7 +810,7 @@ private: void updateSubPresentationHosts(); void loadSubUipPresentation(Q3DSSubPresentation *sp); void initSubTree(Q3DSGraphObject *subTreeRoot); - void updateCamerasStatus(Q3DSLayerAttached *layerData); + void updateViewportsRenderTree(Q3DSLayerAttached *layerData, ViewportSet viewports); Q3DSEyeData *buildEye(Q3DSLayerNode *layer3DS, Qt3DRender::QViewport *viewport); void buildLayer(Q3DSLayerNode *layer3DS, Qt3DRender::QFrameGraphNode *parent, const QSize &parentSize); void buildSubPresentationLayer(Q3DSLayerNode *layer3DS, const QSize &parentSize); |