summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2018-10-31 09:56:32 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-11-02 11:48:33 +0000
commit802a907e73a57256363c5547e1b089c1f80df4f9 (patch)
treef3de7fdf641880c6c5bd2486b20fe24ad02c2b63
parent3981b2ce1439eff2f87064296f5a91b4a271515d (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.cpp30
-rw-r--r--src/runtime/q3dsscenemanager_p.h2
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);