diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-08-15 15:48:23 +0300 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-08-23 14:59:28 +0300 |
commit | b4564780edadae35e7bb3c74ef2343ce9281124a (patch) | |
tree | 8aa5e131436bc440d0fa0045fc3b711793266cd5 /src/api/studio3d | |
parent | a94016946ec24c644d2f01dcb83e66ca55c6b099 (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.cpp | 13 | ||||
-rw-r--r-- | src/api/studio3d/q3dscommandqueue_p.h | 4 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings.cpp | 109 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings.h | 15 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings_p.h | 4 |
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; }; |