summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2018-11-02 18:30:50 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-11-05 12:11:51 +0000
commitf8b979918d726ac6c31560537a380a728fc7c274 (patch)
treee1a46e5e63baf3ef7ba31e9d1b0d5bff6c146ff8
parent802a907e73a57256363c5547e1b089c1f80df4f9 (diff)
Don't draw left & right selectors by default
Reparent selectors instead of viewports so render tree is cleaner. Remove viewports disable/enable as that's not useful. Also keep mono selector always enabled as it's needed also in stereo. Task-number: QT3DS-2591 Change-Id: Id797deb0da804e5ac46c03713ea7421b5fb4f57e Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/runtime/q3dsscenemanager.cpp45
-rw-r--r--src/runtime/q3dsscenemanager_p.h2
2 files changed, 17 insertions, 30 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp
index ef1b1b7..80ea720 100644
--- a/src/runtime/q3dsscenemanager.cpp
+++ b/src/runtime/q3dsscenemanager.cpp
@@ -1146,34 +1146,20 @@ void Q3DSSceneManager::updateViewportRects()
switch (m_engine->viewportSettings()->stereoMode()) {
case Q3DSViewportSettings::StereoModeMono:
viewports.viewportMono->setNormalizedRect(QRectF(0, 0, 1, 1));
- // Not sure if hiding Qt3D viewports currently affects anything,
- // but shouldn't harm either
- viewports.viewportMono->setEnabled(true);
- viewports.viewportLeft->setEnabled(false);
- viewports.viewportRight->setEnabled(false);
break;
case Q3DSViewportSettings::StereoModeTopBottom:
viewports.viewportLeft->setNormalizedRect(QRectF(0, 0, 1, 0.5));
viewports.viewportRight->setNormalizedRect(QRectF(0, 0.5, 1, 0.5));
- viewports.viewportMono->setEnabled(false);
- viewports.viewportLeft->setEnabled(true);
- viewports.viewportRight->setEnabled(true);
break;
case Q3DSViewportSettings::StereoModeLeftRight:
viewports.viewportLeft->setNormalizedRect(QRectF(0, 0, 0.5, 1));
viewports.viewportRight->setNormalizedRect(QRectF(0.5, 0, 0.5, 1));
- viewports.viewportMono->setEnabled(false);
- viewports.viewportLeft->setEnabled(true);
- viewports.viewportRight->setEnabled(true);
break;
case Q3DSViewportSettings::StereoModeAnaglyphRedCyan:
Q_FALLTHROUGH();
case Q3DSViewportSettings::StereoModeAnaglyphGreenMagenta:
viewports.viewportLeft->setNormalizedRect(QRectF(0, 0, 1, 1));
viewports.viewportRight->setNormalizedRect(QRectF(0, 0, 1, 1));
- viewports.viewportMono->setEnabled(false);
- viewports.viewportLeft->setEnabled(true);
- viewports.viewportRight->setEnabled(true);
break;
default:
Q_UNREACHABLE();
@@ -1185,17 +1171,18 @@ void Q3DSSceneManager::updateViewportRects()
m_stereoMode->setValue(m_engine->viewportSettings()->stereoMode());
}
-void Q3DSSceneManager::updateViewportsRenderTree(Q3DSLayerAttached *layerData, ViewportSet viewports)
+void Q3DSSceneManager::updateStereoRenderTree(Q3DSLayerAttached *layerData)
{
Q_ASSERT(layerData);
+
+ // Reparent left & right selectors to enable/disable rendering them.
+ // Note: eyeMono->rtSelector is required all the time as it's used e.g. for picking & shadows
if (m_engine->isStereoscopic()) {
- viewports.viewportMono->setParent(layerData->layerFgDummyParent);
- viewports.viewportLeft->setParent(layerData->eyeLeft->rtSelector);
- viewports.viewportRight->setParent(layerData->eyeRight->rtSelector);
+ layerData->eyeLeft->rtSelector->setParent(layerData->layerFgRoot);
+ layerData->eyeRight->rtSelector->setParent(layerData->layerFgRoot);
} else {
- viewports.viewportMono->setParent(layerData->eyeMono->rtSelector);
- viewports.viewportLeft->setParent(layerData->layerFgDummyParent);
- viewports.viewportRight->setParent(layerData->layerFgDummyParent);
+ layerData->eyeLeft->rtSelector->setParent(layerData->layerFgDummyParent);
+ layerData->eyeRight->rtSelector->setParent(layerData->layerFgDummyParent);
}
}
@@ -1342,7 +1329,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
"RT for layer %s", layer3DS->id().constData());
rtSelector->setTarget(rt);
- viewports.viewportMono = new Qt3DRender::QViewport(); // Will be reparented
+ viewports.viewportMono = new Qt3DRender::QViewport(rtSelector);
layerData->eyeMono = buildEye(layer3DS, viewports.viewportMono);
// Create color and depth-stencil buffers for this layer
@@ -1354,7 +1341,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
"RT for layer %s", layer3DS->id().constData());
rtSelectorLeft->setTarget(rtLeft);
- viewports.viewportLeft = new Qt3DRender::QViewport(); // Will be reparented
+ viewports.viewportLeft = new Qt3DRender::QViewport(rtSelectorLeft);
layerData->eyeLeft = buildEye(layer3DS, viewports.viewportLeft);
// Create color and depth-stencil buffers for this layer
@@ -1366,7 +1353,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
"RT for layer %s", layer3DS->id().constData());
rtSelectorRight->setTarget(rtRight);
- viewports.viewportRight = new Qt3DRender::QViewport(); // Will be reparented
+ viewports.viewportRight = new Qt3DRender::QViewport(rtSelectorRight);
layerData->eyeRight = buildEye(layer3DS, viewports.viewportRight);
// Note: Moved layerSceneRootEntity to be child of layerFgRoot instead of rtSelector
@@ -1420,8 +1407,8 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
layerData->eyeLeft->effectData.effectRoot = layerData->eyeLeft->effectRoot;
layerData->eyeRight->effectData.effectRoot = layerData->eyeRight->effectRoot;
- // Enable/disable correct viewports depending on mode
- updateViewportsRenderTree(layerData, viewports);
+ // Enable/disable correct selectors depending on mode
+ updateStereoRenderTree(layerData);
m_stereoMode = new Qt3DRender::QParameter(QLatin1String("stereoMode"),
m_engine->viewportSettings()->stereoMode());
@@ -1451,7 +1438,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
});
QObject::connect(m_engine, &Q3DSEngine::stereoscopicChanged,
- [this, layer3DS, layerData, viewports]()
+ [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
@@ -1462,8 +1449,8 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS,
updateAdvancedBlendLayers();
updateLayerCompositorProgram(layer3DS);
- // And enable/disable related viewports
- updateViewportsRenderTree(layerData, viewports);
+ // And enable/disable related selectors
+ updateStereoRenderTree(layerData);
});
layer3DS->setAttached(layerData);
diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h
index bdc713f..8607789 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 updateViewportsRenderTree(Q3DSLayerAttached *layerData, ViewportSet viewports);
+ void updateStereoRenderTree(Q3DSLayerAttached *layerData);
Q3DSEyeData *buildEye(Q3DSLayerNode *layer3DS, Qt3DRender::QViewport *viewport);
void buildLayer(Q3DSLayerNode *layer3DS, Qt3DRender::QFrameGraphNode *parent, const QSize &parentSize);
void buildSubPresentationLayer(Q3DSLayerNode *layer3DS, const QSize &parentSize);