summaryrefslogtreecommitdiffstats
path: root/src/api/studio3d
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2019-08-15 15:48:23 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2019-08-23 14:59:28 +0300
commitb4564780edadae35e7bb3c74ef2343ce9281124a (patch)
tree8aa5e131436bc440d0fa0045fc3b711793266cd5 /src/api/studio3d
parenta94016946ec24c644d2f01dcb83e66ca55c6b099 (diff)
Add support for stereoscopic rendering
Initial support for top-bottom and left-right stereoscopic rendering on OpenGL runtime. Add settings into viewer menu to control these. Task-number: QT3DS-3212 Task-number: QT3DS-3868 Change-Id: I5b22169fd407118998a43c1e601cb60b7e3fd6a8 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/api/studio3d')
-rw-r--r--src/api/studio3d/q3dscommandqueue.cpp13
-rw-r--r--src/api/studio3d/q3dscommandqueue_p.h4
-rw-r--r--src/api/studio3d/q3dsviewersettings.cpp109
-rw-r--r--src/api/studio3d/q3dsviewersettings.h15
-rw-r--r--src/api/studio3d/q3dsviewersettings_p.h4
5 files changed, 145 insertions, 0 deletions
diff --git a/src/api/studio3d/q3dscommandqueue.cpp b/src/api/studio3d/q3dscommandqueue.cpp
index 102441b..e3a5ced 100644
--- a/src/api/studio3d/q3dscommandqueue.cpp
+++ b/src/api/studio3d/q3dscommandqueue.cpp
@@ -48,6 +48,8 @@ QString ElementCommand::toString() const
CommandQueue::CommandQueue()
: m_visibleChanged(false)
, m_scaleModeChanged(false)
+ , m_stereoModeChanged(false)
+ , m_stereoEyeSeparationChanged(false)
, m_shadeModeChanged(false)
, m_showRenderStatsChanged(false)
, m_matteColorChanged(false)
@@ -57,6 +59,8 @@ CommandQueue::CommandQueue()
, m_delayedLoadingChanged(false)
, m_visible(false)
, m_scaleMode(Q3DSViewerSettings::ScaleModeCenter)
+ , m_stereoMode(Q3DSViewerSettings::StereoModeMono)
+ , m_stereoEyeSeparation(0.4)
, m_shadeMode(Q3DSViewerSettings::ShadeModeShaded)
, m_showRenderStats(false)
, m_matteColor(Qt::black)
@@ -200,6 +204,9 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
{
m_visibleChanged = m_visibleChanged || fromQueue.m_visibleChanged;
m_scaleModeChanged = m_scaleModeChanged || fromQueue.m_scaleModeChanged;
+ m_stereoModeChanged = m_stereoModeChanged || fromQueue.m_stereoModeChanged;
+ m_stereoEyeSeparationChanged
+ = m_stereoEyeSeparationChanged || fromQueue.m_stereoEyeSeparationChanged;
m_shadeModeChanged = m_shadeModeChanged || fromQueue.m_shadeModeChanged;
m_showRenderStatsChanged = m_showRenderStatsChanged || fromQueue.m_showRenderStatsChanged;
m_matteColorChanged = m_matteColorChanged || fromQueue.m_matteColorChanged;
@@ -214,6 +221,10 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue)
m_visible = fromQueue.m_visible;
if (fromQueue.m_scaleModeChanged)
m_scaleMode = fromQueue.m_scaleMode;
+ if (fromQueue.m_stereoModeChanged)
+ m_stereoMode = fromQueue.m_stereoMode;
+ if (fromQueue.m_stereoEyeSeparationChanged)
+ m_stereoEyeSeparation = fromQueue.m_stereoEyeSeparation;
if (fromQueue.m_shadeModeChanged)
m_shadeMode = fromQueue.m_shadeMode;
if (fromQueue.m_showRenderStatsChanged)
@@ -306,6 +317,8 @@ void CommandQueue::clear(bool deleteCommandData)
{
m_visibleChanged = false;
m_scaleModeChanged = false;
+ m_stereoModeChanged = false;
+ m_stereoEyeSeparationChanged = 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 a519ce7..1cd4e8b 100644
--- a/src/api/studio3d/q3dscommandqueue_p.h
+++ b/src/api/studio3d/q3dscommandqueue_p.h
@@ -136,6 +136,8 @@ public:
bool m_visibleChanged;
bool m_scaleModeChanged;
+ bool m_stereoModeChanged;
+ bool m_stereoEyeSeparationChanged;
bool m_shadeModeChanged;
bool m_showRenderStatsChanged;
bool m_matteColorChanged;
@@ -147,6 +149,8 @@ public:
bool m_visible;
Q3DSViewerSettings::ScaleMode m_scaleMode;
+ Q3DSViewerSettings::StereoMode m_stereoMode;
+ double m_stereoEyeSeparation;
Q3DSViewerSettings::ShadeMode m_shadeMode;
bool m_showRenderStats;
QColor m_matteColor;
diff --git a/src/api/studio3d/q3dsviewersettings.cpp b/src/api/studio3d/q3dsviewersettings.cpp
index 9403a32..ead4eb9 100644
--- a/src/api/studio3d/q3dsviewersettings.cpp
+++ b/src/api/studio3d/q3dsviewersettings.cpp
@@ -229,6 +229,76 @@ void Q3DSViewerSettings::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
}
/*!
+ \qmlproperty enumeration ViewerSettings::stereoMode
+
+ \since Qt 3D Studio 2.5
+
+ Specifies the stereo mode. The default value \c is StereoModeMono where the
+ view is rendered normally, as suitable for 2D displays. Other available modes
+ target different 3D stereo rendering types.
+
+ \value StereoModeMono Renders presentation normally in mono.
+ \value StereoModeTopBottom Renders presentation in stereoscopic top-bottom mode.
+ \value StereoModeLeftRight Renders presentation in stereoscopic left-right mode.
+
+ The default value is \c{StereoModeMono}.
+*/
+/*!
+ \property Q3DSViewerSettings::stereoMode
+
+ \since Qt 3D Studio 2.5
+
+ Specifies the stereo mode. The default value \c is StereoModeMono where the
+ view is rendered normally, as suitable for 2D displays. Other available modes
+ target different 3D stereo rendering types.
+
+ \value StereoModeMono Renders presentation normally in mono.
+ \value StereoModeTopBottom Renders presentation in stereoscopic top-bottom mode.
+ \value StereoModeLeftRight Renders presentation in stereoscopic left-right mode.
+
+ The default value is \c{StereoModeMono}.
+ */
+Q3DSViewerSettings::StereoMode Q3DSViewerSettings::stereoMode() const
+{
+ return d_ptr->m_stereoMode;
+}
+
+void Q3DSViewerSettings::setStereoMode(Q3DSViewerSettings::StereoMode mode)
+{
+ if (d_ptr->m_stereoMode != mode) {
+ d_ptr->setStereoMode(mode);
+ Q_EMIT stereoModeChanged(mode);
+ }
+}
+
+/*!
+ \property Q3DSViewerSettings::stereoEyeSeparation
+
+ \since Qt 3D Studio 2.5
+
+ Specifies the eye (camera) separation of stereo rendering.
+ Value is the amount left and right eye cameras move in x-coordinate
+ values away from center. Bigger separation increases the 3D effect.
+ Optimal value depends on viewed presentation.
+
+ This has only effect when stereo mode is set to something else than
+ default \c{StereoModeMono}.
+ */
+double Q3DSViewerSettings::stereoEyeSeparation() const
+{
+ return d_ptr->m_stereoEyeSeparation;
+}
+
+void Q3DSViewerSettings::setStereoEyeSeparation(double separation)
+{
+ if (separation >= 0
+ && !qFuzzyCompare(d_ptr->m_stereoEyeSeparation, separation)) {
+ d_ptr->setStereoEyeSeparation(separation);
+ Q_EMIT stereoEyeSeparationChanged(separation);
+ }
+}
+
+/*!
\qmlproperty bool ViewerSettings::matteEnabled
Specifies if the empty area around the presentation (applicable when
@@ -305,6 +375,8 @@ Q3DSViewerSettingsPrivate::Q3DSViewerSettingsPrivate(Q3DSViewerSettings *q)
, m_matteEnabled(false)
, m_shadeMode(Q3DSViewerSettings::ShadeModeShaded)
, m_scaleMode(Q3DSViewerSettings::ScaleModeCenter)
+ , m_stereoMode(Q3DSViewerSettings::StereoModeMono)
+ , m_stereoEyeSeparation(0.4)
, m_savedSettings(nullptr)
{
}
@@ -322,6 +394,8 @@ void Q3DSViewerSettingsPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
setShowRenderStats(m_showRenderStats);
setShadeMode(m_shadeMode);
setScaleMode(m_scaleMode);
+ setStereoMode(m_stereoMode);
+ setStereoEyeSeparation(m_stereoEyeSeparation);
}
}
@@ -334,6 +408,8 @@ void Q3DSViewerSettingsPrivate::setCommandQueue(CommandQueue *queue)
setShowRenderStats(m_showRenderStats);
setShadeMode(m_shadeMode);
setScaleMode(m_scaleMode);
+ setStereoMode(m_stereoMode);
+ setStereoEyeSeparation(m_stereoEyeSeparation);
}
}
@@ -346,6 +422,8 @@ void Q3DSViewerSettingsPrivate::save(const QString &group, const QString &organi
m_savedSettings->setValue(QStringLiteral("showRenderStats"), m_showRenderStats);
m_savedSettings->setValue(QStringLiteral("shadeMode"), m_shadeMode);
m_savedSettings->setValue(QStringLiteral("scaleMode"), m_scaleMode);
+ m_savedSettings->setValue(QStringLiteral("stereoMode"), m_stereoMode);
+ m_savedSettings->setValue(QStringLiteral("stereoEyeSeparation"), m_stereoEyeSeparation);
m_savedSettings->setValue(QStringLiteral("matteEnabled"), m_matteEnabled);
}
@@ -360,6 +438,10 @@ void Q3DSViewerSettingsPrivate::load(const QString &group, const QString &organi
m_savedSettings->value(QStringLiteral("shadeMode")).toInt()));
q_ptr->setScaleMode(Q3DSViewerSettings::ScaleMode(
m_savedSettings->value(QStringLiteral("scaleMode")).toInt()));
+ q_ptr->setStereoMode(Q3DSViewerSettings::StereoMode(
+ m_savedSettings->value(QStringLiteral("stereoMode")).toInt()));
+ q_ptr->setStereoEyeSeparation(
+ m_savedSettings->value(QStringLiteral("stereoEyeSeparation")).toDouble());
q_ptr->setMatteEnabled(m_savedSettings->value(QStringLiteral("matteEnabled")).toBool());
}
@@ -426,6 +508,33 @@ void Q3DSViewerSettingsPrivate::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
}
}
+void Q3DSViewerSettingsPrivate::setStereoMode(Q3DSViewerSettings::StereoMode mode)
+{
+ m_stereoMode = mode;
+ if (m_viewerApp) {
+ if (mode == Q3DSViewerSettings::StereoModeMono)
+ m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::Mono);
+ else if (mode == Q3DSViewerSettings::StereoModeTopBottom)
+ m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::TopBottom);
+ else
+ m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::LeftRight);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_stereoMode = mode;
+ m_commandQueue->m_stereoModeChanged = true;
+ }
+}
+
+void Q3DSViewerSettingsPrivate::setStereoEyeSeparation(double separation)
+{
+ m_stereoEyeSeparation = separation;
+ if (m_viewerApp) {
+ m_viewerApp->SetStereoEyeSeparation(separation);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_stereoEyeSeparation = separation;
+ m_commandQueue->m_stereoEyeSeparationChanged = 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 7199e1c..0d78e1b 100644
--- a/src/api/studio3d/q3dsviewersettings.h
+++ b/src/api/studio3d/q3dsviewersettings.h
@@ -44,11 +44,14 @@ class Q_STUDIO3D_EXPORT Q3DSViewerSettings : public QObject
Q_DECLARE_PRIVATE(Q3DSViewerSettings)
Q_ENUMS(ShadeMode)
Q_ENUMS(ScaleMode)
+ Q_ENUMS(StereoMode)
Q_PROPERTY(bool matteEnabled READ matteEnabled WRITE setMatteEnabled NOTIFY matteEnabledChanged)
Q_PROPERTY(QColor matteColor READ matteColor WRITE setMatteColor NOTIFY matteColorChanged)
Q_PROPERTY(bool showRenderStats READ isShowRenderStats WRITE setShowRenderStats NOTIFY showRenderStatsChanged)
Q_PROPERTY(ScaleMode scaleMode READ scaleMode WRITE setScaleMode NOTIFY scaleModeChanged)
+ Q_PROPERTY(StereoMode stereoMode READ stereoMode WRITE setStereoMode NOTIFY stereoModeChanged)
+ Q_PROPERTY(double stereoEyeSeparation READ stereoEyeSeparation WRITE setStereoEyeSeparation NOTIFY stereoEyeSeparationChanged)
public:
enum ShadeMode {
@@ -62,6 +65,12 @@ public:
ScaleModeCenter
};
+ enum StereoMode {
+ StereoModeMono,
+ StereoModeTopBottom,
+ StereoModeLeftRight
+ };
+
explicit Q3DSViewerSettings(QObject *parent = nullptr);
~Q3DSViewerSettings();
@@ -69,6 +78,8 @@ public:
QColor matteColor() const;
bool isShowRenderStats() const;
ScaleMode scaleMode() const;
+ StereoMode stereoMode() const;
+ double stereoEyeSeparation() const;
Q_INVOKABLE void save(const QString &group, const QString &organization = QString(),
const QString &application = QString());
@@ -80,6 +91,8 @@ public Q_SLOTS:
void setMatteColor(const QColor &color);
void setShowRenderStats(bool show);
void setScaleMode(ScaleMode mode);
+ void setStereoMode(StereoMode mode);
+ void setStereoEyeSeparation(double separation);
Q_SIGNALS:
void matteEnabledChanged(bool enabled);
@@ -87,6 +100,8 @@ Q_SIGNALS:
void showRenderStatsChanged(bool show);
void shadeModeChanged(ShadeMode mode);
void scaleModeChanged(ScaleMode mode);
+ void stereoModeChanged(StereoMode mode);
+ void stereoEyeSeparationChanged(double separation);
private:
Q_DISABLE_COPY(Q3DSViewerSettings)
diff --git a/src/api/studio3d/q3dsviewersettings_p.h b/src/api/studio3d/q3dsviewersettings_p.h
index 4628241..8ff9394 100644
--- a/src/api/studio3d/q3dsviewersettings_p.h
+++ b/src/api/studio3d/q3dsviewersettings_p.h
@@ -67,6 +67,8 @@ public:
void setShowRenderStats(bool show);
void setShadeMode(Q3DSViewerSettings::ShadeMode mode);
void setScaleMode(Q3DSViewerSettings::ScaleMode mode);
+ void setStereoMode(Q3DSViewerSettings::StereoMode mode);
+ void setStereoEyeSeparation(double separation);
public:
Q3DSViewerSettings *q_ptr;
@@ -82,6 +84,8 @@ private:
bool m_matteEnabled;
Q3DSViewerSettings::ShadeMode m_shadeMode;
Q3DSViewerSettings::ScaleMode m_scaleMode;
+ Q3DSViewerSettings::StereoMode m_stereoMode;
+ double m_stereoEyeSeparation;
QSettings *m_savedSettings;
};