summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Kokko <antti.kokko@qt.io>2020-04-16 09:45:05 +0300
committerAntti Kokko <antti.kokko@qt.io>2020-04-16 09:45:42 +0300
commit4cebb63cc080f53e2e52da68920b4f9bc95e609d (patch)
tree246b3bfcd578a7f4a0e27f2df0f137c49a499bd5
parentf07a25c618432e08a145d714781b52c534a694da (diff)
parent02e4d56d055d73340d3af1257b908a52aecc320f (diff)
Merge branch 'master' into 2.7
-rw-r--r--src/api/studio3d/q3dscommandqueue.cpp5
-rw-r--r--src/api/studio3d/q3dscommandqueue_p.h2
-rw-r--r--src/api/studio3d/q3dsviewersettings.cpp55
-rw-r--r--src/api/studio3d/q3dsviewersettings.h4
-rw-r--r--src/api/studio3d/q3dsviewersettings_p.h2
-rw-r--r--src/api/studio3dqml/q3dsplugin.cpp1
-rw-r--r--src/api/studio3dqml/q3dsrenderer.cpp2
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp14
-rw-r--r--src/engine/Qt3DSRuntimeView.h2
-rw-r--r--src/runtime/Qt3DSApplication.cpp19
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp59
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h2
-rw-r--r--src/viewer/Qt3DSViewerApp.cpp14
-rw-r--r--src/viewer/Qt3DSViewerApp.h3
-rw-r--r--tools/viewer/main.cpp5
-rw-r--r--tools/viewer/qml/main.qml15
16 files changed, 192 insertions, 12 deletions
diff --git a/src/api/studio3d/q3dscommandqueue.cpp b/src/api/studio3d/q3dscommandqueue.cpp
index b2d0937..300c0bf 100644
--- a/src/api/studio3d/q3dscommandqueue.cpp
+++ b/src/api/studio3d/q3dscommandqueue.cpp
@@ -217,6 +217,8 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
m_stereoModeChanged = m_stereoModeChanged || fromQueue.m_stereoModeChanged;
m_stereoEyeSeparationChanged
= m_stereoEyeSeparationChanged || fromQueue.m_stereoEyeSeparationChanged;
+ m_stereoProgressiveEnabledChanged
+ = m_stereoProgressiveEnabledChanged || fromQueue.m_stereoProgressiveEnabledChanged;
m_shadeModeChanged = m_shadeModeChanged || fromQueue.m_shadeModeChanged;
m_showRenderStatsChanged = m_showRenderStatsChanged || fromQueue.m_showRenderStatsChanged;
m_matteColorChanged = m_matteColorChanged || fromQueue.m_matteColorChanged;
@@ -236,6 +238,8 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
m_stereoMode = fromQueue.m_stereoMode;
if (fromQueue.m_stereoEyeSeparationChanged)
m_stereoEyeSeparation = fromQueue.m_stereoEyeSeparation;
+ if (fromQueue.m_stereoProgressiveEnabledChanged)
+ m_stereoProgressiveEnabled = fromQueue.m_stereoProgressiveEnabled;
if (fromQueue.m_shadeModeChanged)
m_shadeMode = fromQueue.m_shadeMode;
if (fromQueue.m_showRenderStatsChanged)
@@ -338,6 +342,7 @@ void CommandQueue::clear(bool deleteCommandData)
m_scaleModeChanged = false;
m_stereoModeChanged = false;
m_stereoEyeSeparationChanged = false;
+ m_stereoProgressiveEnabledChanged = false;
m_shadeModeChanged = false;
m_showRenderStatsChanged = false;
m_matteColorChanged = false;
diff --git a/src/api/studio3d/q3dscommandqueue_p.h b/src/api/studio3d/q3dscommandqueue_p.h
index 0b7b833..6096439 100644
--- a/src/api/studio3d/q3dscommandqueue_p.h
+++ b/src/api/studio3d/q3dscommandqueue_p.h
@@ -143,6 +143,7 @@ public:
bool m_scaleModeChanged = false;
bool m_stereoModeChanged = false;
bool m_stereoEyeSeparationChanged = false;
+ bool m_stereoProgressiveEnabledChanged = false;
bool m_shadeModeChanged = false;
bool m_showRenderStatsChanged = false;
bool m_matteColorChanged = false;
@@ -157,6 +158,7 @@ public:
Q3DSViewerSettings::ScaleMode m_scaleMode = Q3DSViewerSettings::ScaleModeCenter;
Q3DSViewerSettings::StereoMode m_stereoMode = Q3DSViewerSettings::StereoModeMono;
double m_stereoEyeSeparation = 0.4;
+ bool m_stereoProgressiveEnabled = false;
Q3DSViewerSettings::ShadeMode m_shadeMode = Q3DSViewerSettings::ShadeModeShaded;
bool m_showRenderStats = false;
QColor m_matteColor = QColor(Qt::black);
diff --git a/src/api/studio3d/q3dsviewersettings.cpp b/src/api/studio3d/q3dsviewersettings.cpp
index dd8e4b2..9025bb8 100644
--- a/src/api/studio3d/q3dsviewersettings.cpp
+++ b/src/api/studio3d/q3dsviewersettings.cpp
@@ -332,6 +332,45 @@ void Q3DSViewerSettings::setStereoEyeSeparation(double separation)
}
/*!
+ \qmlproperty bool ViewerSettings::stereoProgressiveEnabled
+
+ \since QtStudio3D.OpenGL 2.7
+
+ Enables progressive rendering in stereoscopic modes. In this mode,
+ only single eye per frame is rendered. Left eye for odd frames and
+ right for even frames. This halves the maximum animation frame rate
+ (meaning e.g. 30fps on 60Hz screen) while decreasing CPU/GPU usage.
+
+ \note This property has only effect when stereo mode is set to
+ \c{StereoModeTopBottom} or \c{StereoModeLeftRight}.
+ */
+/*!
+ \property Q3DSViewerSettings::stereoProgressiveEnabled
+
+ \since Qt 3D Studio 2.7
+
+ Enables progressive rendering in stereoscopic modes. In this mode,
+ only single eye per frame is rendered. Left eye for odd frames and
+ right for even frames. This halves the maximum animation frame rate
+ (meaning e.g. 30fps on 60Hz screen) while decreasing CPU/GPU usage.
+
+ \note This property has only effect when stereo mode is set to
+ \c{StereoModeTopBottom} or \c{StereoModeLeftRight}.
+ */
+bool Q3DSViewerSettings::stereoProgressiveEnabled() const
+{
+ return d_ptr->m_stereoProgressiveEnabled;
+}
+
+void Q3DSViewerSettings::setStereoProgressiveEnabled(bool enabled)
+{
+ if (d_ptr->m_stereoProgressiveEnabled != enabled) {
+ d_ptr->setStereoProgressiveEnabled(enabled);
+ Q_EMIT stereoProgressiveEnabledChanged(enabled);
+ }
+}
+
+/*!
\qmlproperty bool ViewerSettings::matteEnabled
Specifies if the empty area around the presentation (applicable when
@@ -410,6 +449,7 @@ Q3DSViewerSettingsPrivate::Q3DSViewerSettingsPrivate(Q3DSViewerSettings *q)
, m_scaleMode(Q3DSViewerSettings::ScaleModeCenter)
, m_stereoMode(Q3DSViewerSettings::StereoModeMono)
, m_stereoEyeSeparation(0.4)
+ , m_stereoProgressiveEnabled(false)
, m_savedSettings(nullptr)
{
}
@@ -429,6 +469,7 @@ void Q3DSViewerSettingsPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
setScaleMode(m_scaleMode);
setStereoMode(m_stereoMode);
setStereoEyeSeparation(m_stereoEyeSeparation);
+ setStereoProgressiveEnabled(m_stereoProgressiveEnabled);
}
}
@@ -443,6 +484,7 @@ void Q3DSViewerSettingsPrivate::setCommandQueue(CommandQueue *queue)
setScaleMode(m_scaleMode);
setStereoMode(m_stereoMode);
setStereoEyeSeparation(m_stereoEyeSeparation);
+ setStereoProgressiveEnabled(m_stereoProgressiveEnabled);
}
}
@@ -475,6 +517,8 @@ void Q3DSViewerSettingsPrivate::load(const QString &group, const QString &organi
m_savedSettings->value(QStringLiteral("stereoMode")).toInt()));
q_ptr->setStereoEyeSeparation(
m_savedSettings->value(QStringLiteral("stereoEyeSeparation")).toDouble());
+ q_ptr->setStereoProgressiveEnabled(
+ m_savedSettings->value(QStringLiteral("stereoProgressiveEnabled")).toBool());
q_ptr->setMatteEnabled(m_savedSettings->value(QStringLiteral("matteEnabled")).toBool());
}
@@ -572,6 +616,17 @@ void Q3DSViewerSettingsPrivate::setStereoEyeSeparation(double separation)
}
}
+void Q3DSViewerSettingsPrivate::setStereoProgressiveEnabled(bool enabled)
+{
+ m_stereoProgressiveEnabled = enabled;
+ if (m_viewerApp) {
+ m_viewerApp->SetStereoProgressiveEnabled(enabled);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_stereoProgressiveEnabled = enabled;
+ m_commandQueue->m_stereoProgressiveEnabledChanged = true;
+ }
+}
+
void Q3DSViewerSettingsPrivate::initSettingsStore(const QString &group, const QString &organization,
const QString &application)
{
diff --git a/src/api/studio3d/q3dsviewersettings.h b/src/api/studio3d/q3dsviewersettings.h
index 0a5e699..f956649 100644
--- a/src/api/studio3d/q3dsviewersettings.h
+++ b/src/api/studio3d/q3dsviewersettings.h
@@ -52,6 +52,7 @@ class Q_STUDIO3D_EXPORT Q3DSViewerSettings : public QObject
Q_PROPERTY(ScaleMode scaleMode READ scaleMode WRITE setScaleMode NOTIFY scaleModeChanged)
Q_PROPERTY(StereoMode stereoMode READ stereoMode WRITE setStereoMode NOTIFY stereoModeChanged REVISION 1)
Q_PROPERTY(double stereoEyeSeparation READ stereoEyeSeparation WRITE setStereoEyeSeparation NOTIFY stereoEyeSeparationChanged REVISION 1)
+ Q_PROPERTY(bool stereoProgressiveEnabled READ stereoProgressiveEnabled WRITE setStereoProgressiveEnabled NOTIFY stereoProgressiveEnabledChanged REVISION 2)
public:
enum ShadeMode {
@@ -82,6 +83,7 @@ public:
ScaleMode scaleMode() const;
StereoMode stereoMode() const;
double stereoEyeSeparation() const;
+ Q_REVISION(2) bool stereoProgressiveEnabled() const;
Q_INVOKABLE void save(const QString &group, const QString &organization = QString(),
const QString &application = QString());
@@ -95,6 +97,7 @@ public Q_SLOTS:
void setScaleMode(ScaleMode mode);
void setStereoMode(StereoMode mode);
void setStereoEyeSeparation(double separation);
+ Q_REVISION(2) void setStereoProgressiveEnabled(bool enabled);
Q_SIGNALS:
void matteEnabledChanged(bool enabled);
@@ -104,6 +107,7 @@ Q_SIGNALS:
void scaleModeChanged(ScaleMode mode);
void stereoModeChanged(StereoMode mode);
void stereoEyeSeparationChanged(double separation);
+ Q_REVISION(2) void stereoProgressiveEnabledChanged(bool enabled);
private:
Q_DISABLE_COPY(Q3DSViewerSettings)
diff --git a/src/api/studio3d/q3dsviewersettings_p.h b/src/api/studio3d/q3dsviewersettings_p.h
index 8ff9394..44e1227 100644
--- a/src/api/studio3d/q3dsviewersettings_p.h
+++ b/src/api/studio3d/q3dsviewersettings_p.h
@@ -69,6 +69,7 @@ public:
void setScaleMode(Q3DSViewerSettings::ScaleMode mode);
void setStereoMode(Q3DSViewerSettings::StereoMode mode);
void setStereoEyeSeparation(double separation);
+ void setStereoProgressiveEnabled(bool enabled);
public:
Q3DSViewerSettings *q_ptr;
@@ -86,6 +87,7 @@ private:
Q3DSViewerSettings::ScaleMode m_scaleMode;
Q3DSViewerSettings::StereoMode m_stereoMode;
double m_stereoEyeSeparation;
+ bool m_stereoProgressiveEnabled;
QSettings *m_savedSettings;
};
diff --git a/src/api/studio3dqml/q3dsplugin.cpp b/src/api/studio3dqml/q3dsplugin.cpp
index ee9a9b9..6ce3628 100644
--- a/src/api/studio3dqml/q3dsplugin.cpp
+++ b/src/api/studio3dqml/q3dsplugin.cpp
@@ -67,6 +67,7 @@ void Q3DSPlugin::registerTypes(const char *uri)
// 2.7
qmlRegisterType<Q3DSPresentationItem, 2>(uri, 2, 7, "Presentation");
+ qmlRegisterType<Q3DSViewerSettings, 2>(uri, 2, 7, "ViewerSettings");
qmlRegisterRevision<Q3DSPresentation, 2>(uri, 2, 7);
// Automatically register the latest version
diff --git a/src/api/studio3dqml/q3dsrenderer.cpp b/src/api/studio3dqml/q3dsrenderer.cpp
index 1f78bf7..f7bd25b 100644
--- a/src/api/studio3dqml/q3dsrenderer.cpp
+++ b/src/api/studio3dqml/q3dsrenderer.cpp
@@ -351,6 +351,8 @@ void Q3DSRenderer::processCommands()
m_settings->setStereoMode(m_commands.m_stereoMode);
if (m_commands.m_stereoEyeSeparationChanged)
m_settings->setStereoEyeSeparation(m_commands.m_stereoEyeSeparation);
+ if (m_commands.m_stereoProgressiveEnabledChanged)
+ m_settings->setStereoProgressiveEnabled(m_commands.m_stereoProgressiveEnabled);
if (m_commands.m_shadeModeChanged)
m_settings->setShadeMode(m_commands.m_shadeMode);
if (m_commands.m_matteColorChanged)
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
index 47ed8aa..9fda560 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
@@ -157,6 +157,20 @@ struct SRenderer : public Q3DStudio::ITegraApplicationRenderEngine
return 0;
}
+ void SetStereoProgressiveEnabled(bool enabled) override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context)
+ m_BindingCore->m_Context->SetStereoProgressiveEnabled(enabled);
+ }
+ bool GetStereoProgressiveEnabled() const override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context) {
+ return const_cast<SRenderer &>(*this).m_BindingCore->
+ m_Context->GetStereoProgressiveEnabled();
+ }
+ QT3DS_ASSERT(false);
+ return false;
+ }
void SetShadeMode(Q3DStudio::TegraRenderShadeModes::Enum inShade) override
{
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
index 822efdc..8690b99 100644
--- a/src/engine/Qt3DSRuntimeView.h
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -147,6 +147,8 @@ public:
virtual TegraRenderStereoModes::Enum GetStereoMode() const = 0;
virtual void SetStereoEyeSeparation(double separation) = 0;
virtual double GetStereoEyeSeparation() const = 0;
+ virtual void SetStereoProgressiveEnabled(bool enabled) = 0;
+ virtual bool GetStereoProgressiveEnabled() const = 0;
// TODO: To be removed, not used anywhere anymore
void CycleScaleMode()
diff --git a/src/runtime/Qt3DSApplication.cpp b/src/runtime/Qt3DSApplication.cpp
index 1abc903..f7f8b46 100644
--- a/src/runtime/Qt3DSApplication.cpp
+++ b/src/runtime/Qt3DSApplication.cpp
@@ -638,6 +638,7 @@ struct SApp : public IApplication
bool m_DisableState;
bool m_ProfileLogging;
bool m_LastRenderWasDirty;
+ bool m_ProgressiveLeftFrame;
QT3DSU64 m_LastFrameStartTime;
QT3DSU64 m_ThisFrameStartTime;
double m_MillisecondsSinceLastFrame;
@@ -688,6 +689,7 @@ struct SApp : public IApplication
, m_DisableState(true)
, m_ProfileLogging(false)
, m_LastRenderWasDirty(true)
+ , m_ProgressiveLeftFrame(true)
, m_LastFrameStartTime(0)
, m_ThisFrameStartTime(0)
, m_MillisecondsSinceLastFrame(0)
@@ -1098,12 +1100,17 @@ struct SApp : public IApplication
.RenderPresentation(pres, m_initialFrame);
} else {
// In stereoscopic mode, render 2 times for left & right eye
- rc.SetStereoView(StereoViews::Left);
- m_LastRenderWasDirty = m_RuntimeFactory->GetSceneManager()
- .RenderPresentation(pres, m_initialFrame);
- rc.SetStereoView(StereoViews::Right);
- m_RuntimeFactory->GetSceneManager()
- .RenderPresentation(pres, m_initialFrame);
+ if (!rc.GetStereoProgressiveEnabled() || m_ProgressiveLeftFrame) {
+ rc.SetStereoView(StereoViews::Left);
+ m_LastRenderWasDirty = m_RuntimeFactory->GetSceneManager()
+ .RenderPresentation(pres, m_initialFrame);
+ }
+ if (!rc.GetStereoProgressiveEnabled() || !m_ProgressiveLeftFrame) {
+ rc.SetStereoView(StereoViews::Right);
+ m_RuntimeFactory->GetSceneManager()
+ .RenderPresentation(pres, m_initialFrame);
+ }
+ m_ProgressiveLeftFrame = !m_ProgressiveLeftFrame;
}
m_initialFrame = false;
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
index 484a805..dde70fd 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.cpp
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -248,6 +248,7 @@ struct SRenderContext : public IQt3DSRenderContext
StereoModes::Enum m_StereoMode;
StereoViews::Enum m_StereoView;
double m_StereoEyeSeparation;
+ bool m_StereoProgressiveEnabled;
bool m_WireframeMode;
bool m_subPresentationRenderInLayer;
Option<QT3DSVec4> m_SceneColor;
@@ -289,6 +290,7 @@ struct SRenderContext : public IQt3DSRenderContext
, m_StereoMode(StereoModes::Mono)
, m_StereoView(StereoViews::Mono)
, m_StereoEyeSeparation(0.4)
+ , m_StereoProgressiveEnabled(false)
, m_WireframeMode(false)
, m_subPresentationRenderInLayer(false)
, m_matteEnabled(false)
@@ -474,6 +476,16 @@ struct SRenderContext : public IQt3DSRenderContext
double GetStereoEyeSeparation() const override { return m_StereoEyeSeparation; }
+ void SetStereoProgressiveEnabled(bool enabled) override
+ {
+ m_StereoProgressiveEnabled = enabled;
+ }
+
+ bool GetStereoProgressiveEnabled() const override {
+ return m_StereoProgressiveEnabled && (m_StereoMode == StereoModes::LeftRight
+ || m_StereoMode == StereoModes::TopBottom);
+ }
+
void SetWireframeMode(bool inEnable) override { m_WireframeMode = inEnable; }
bool GetWireframeMode() override { return m_WireframeMode; }
@@ -732,10 +744,38 @@ struct SRenderContext : public IQt3DSRenderContext
QT3DSVec2 GetPresentationScaleFactor() const override { return m_PresentationScale; }
+ void adjustRectToStereoMode(NVRenderRect &rect)
+ {
+ if (m_StereoMode == StereoModes::LeftRight) {
+ if (m_StereoView == StereoViews::Left) {
+ rect = NVRenderRect(rect.m_X, rect.m_Y, rect.m_Width / 2,
+ rect.m_Height);
+ }
+ if (m_StereoView == StereoViews::Right) {
+ rect = NVRenderRect(rect.m_X + rect.m_Width / 2, rect.m_Y,
+ rect.m_Width / 2, rect.m_Height);
+ }
+ } else if (m_StereoMode == StereoModes::TopBottom) {
+ if (m_StereoView == StereoViews::Left) {
+ rect = NVRenderRect(rect.m_X, rect.m_Y + rect.m_Height / 2,
+ rect.m_Width, rect.m_Height / 2);
+ }
+ if (m_StereoView == StereoViews::Right) {
+ rect = NVRenderRect(rect.m_X, rect.m_Y,
+ rect.m_Width, rect.m_Height / 2);
+ }
+ }
+ }
+
virtual void SetupRenderTarget()
{
- NVRenderRect theContextViewport(GetContextViewport());
- if (m_Viewport.hasValue()) {
+ bool stereoProgressiveEnabled = GetStereoProgressiveEnabled();
+ // Clearing for matte / scene background
+ if (m_Viewport.hasValue() || stereoProgressiveEnabled) {
+ // With progressive stereoscopic rendering needs to be adjusted to viewport
+ NVRenderRect theContextViewport(GetContextViewport());
+ if (stereoProgressiveEnabled)
+ adjustRectToStereoMode(theContextViewport);
m_RenderContext->SetScissorTestEnabled(true);
m_RenderContext->SetScissorRect(theContextViewport);
} else {
@@ -758,7 +798,10 @@ struct SRenderContext : public IQt3DSRenderContext
}
bool renderOffscreen = m_BeginFrameResult.m_RenderOffscreen;
m_RenderContext->SetViewport(m_BeginFrameResult.m_Viewport);
- m_RenderContext->SetScissorRect(m_BeginFrameResult.m_ScissorRect);
+ NVRenderRect scissorRect = m_BeginFrameResult.m_ScissorRect;
+ if (stereoProgressiveEnabled)
+ adjustRectToStereoMode(scissorRect);
+ m_RenderContext->SetScissorRect(scissorRect);
m_RenderContext->SetScissorTestEnabled(m_BeginFrameResult.m_ScissorTestEnabled);
if (m_PresentationViewport.m_Width > 0 && m_PresentationViewport.m_Height > 0) {
@@ -826,14 +869,20 @@ struct SRenderContext : public IQt3DSRenderContext
}
}
}
+ // Reset scissor rect to full viewport size
+ m_RenderContext->SetScissorRect(GetContextViewport());
+
}
void RunRenderTasks() override
{
m_RenderList->RunRenderTasks();
- // Don't (re)setup when rendering stereoscopic second (right) eye
- if (m_StereoView != StereoViews::Right)
+ // Don't (re)setup when rendering stereoscopic second (right) eye.
+ // Except in progressive mode, where each viewport needs to be cleared separately.
+ if (m_StereoView != StereoViews::Right
+ || GetStereoProgressiveEnabled()) {
SetupRenderTarget();
+ }
}
// Note this runs before EndFrame
diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h
index 670becc..8382fc6 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.h
+++ b/src/runtimerender/Qt3DSRenderContextCore.h
@@ -203,6 +203,8 @@ namespace render {
virtual StereoViews::Enum GetStereoView() const = 0;
virtual void SetStereoEyeSeparation(double separation) = 0;
virtual double GetStereoEyeSeparation() const = 0;
+ virtual void SetStereoProgressiveEnabled(bool enabled) = 0;
+ virtual bool GetStereoProgressiveEnabled() const = 0;
virtual void SetWireframeMode(bool inEnable) = 0;
virtual bool GetWireframeMode() = 0;
diff --git a/src/viewer/Qt3DSViewerApp.cpp b/src/viewer/Qt3DSViewerApp.cpp
index 5b3ba4a..5d8393a 100644
--- a/src/viewer/Qt3DSViewerApp.cpp
+++ b/src/viewer/Qt3DSViewerApp.cpp
@@ -872,6 +872,20 @@ double Q3DSViewerApp::GetStereoEyeSeparation() const
return 0;
}
+void Q3DSViewerApp::SetStereoProgressiveEnabled(bool enabled)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine())
+ m_Impl.m_view->GetTegraRenderEngine()->SetStereoProgressiveEnabled(enabled);
+}
+
+bool Q3DSViewerApp::GetStereoProgressiveEnabled() const
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine())
+ return m_Impl.m_view->GetTegraRenderEngine()->GetStereoProgressiveEnabled();
+
+ return 0;
+}
+
void Q3DSViewerApp::setMatteColor(const QColor &color)
{
if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h
index 0aa8ade..ab723cd 100644
--- a/src/viewer/Qt3DSViewerApp.h
+++ b/src/viewer/Qt3DSViewerApp.h
@@ -325,6 +325,9 @@ public:
void SetStereoEyeSeparation(double separation);
double GetStereoEyeSeparation() const;
+ void SetStereoProgressiveEnabled(bool enabled);
+ bool GetStereoProgressiveEnabled() const;
+
void setMatteColor(const QColor &color);
void setShowOnScreenStats(bool s);
diff --git a/tools/viewer/main.cpp b/tools/viewer/main.cpp
index 1bcbe9d..4f39817 100644
--- a/tools/viewer/main.cpp
+++ b/tools/viewer/main.cpp
@@ -220,6 +220,9 @@ int main(int argc, char *argv[])
"The default value is 0.4"),
QCoreApplication::translate("main", "separation"),
QString::number(0.4)});
+ parser.addOption({"enableprogressivestereo",
+ QCoreApplication::translate("main",
+ "Enables progressive stereoscopic rendering.\n")});
parser.addOption({"convert-shader-cache",
QCoreApplication::translate("main",
"Convert base64 dump to shader cache file."),
@@ -391,6 +394,8 @@ int main(int argc, char *argv[])
if (ok)
appWindow->setProperty("stereoEyeSeparation", separation);
}
+ if (parser.isSet(QStringLiteral("enableprogressivestereo")))
+ appWindow->setProperty("stereoProgressiveEnabled", true);
viewer.setVariantList(variantList);
diff --git a/tools/viewer/qml/main.qml b/tools/viewer/qml/main.qml
index 153753a..baaf6d3 100644
--- a/tools/viewer/qml/main.qml
+++ b/tools/viewer/qml/main.qml
@@ -31,7 +31,7 @@ import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import Qt3DStudioViewer 1.0
-import QtStudio3D.OpenGL 2.5
+import QtStudio3D.OpenGL 2.7
import QtQuick.Window 2.2
ApplicationWindow {
@@ -52,6 +52,7 @@ ApplicationWindow {
property int scaleMode: ViewerSettings.ScaleModeCenter
property int stereoMode: ViewerSettings.StereoModeMono
property double stereoEyeSeparation: 0.4
+ property bool stereoProgressiveEnabled: false
function closeMenus() {
fileMenu.close();
@@ -219,6 +220,7 @@ ApplicationWindow {
scaleMode: window.scaleMode
stereoMode: window.stereoMode
stereoEyeSeparation: window.stereoEyeSeparation
+ stereoProgressiveEnabled: window.stereoProgressiveEnabled
}
// Hider item keeps the Studio3D hidden until it starts running and we reset the
@@ -634,6 +636,17 @@ ApplicationWindow {
}
}
StyledMenuItem {
+ id: stereoProgressiveEnabled
+ text: qsTr("Progressive Rendering")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.stereoProgressiveEnabled
+ shortcut: "Ctrl+Shift+P"
+ onTriggered: {
+ if (enabled)
+ window.stereoProgressiveEnabled = !window.stereoProgressiveEnabled;
+ }
+ }
+ StyledMenuItem {
id: stereoEyeSeparationUp
text: qsTr("Increase Separation")
shortcut: "Ctrl+Shift++"