summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2019-10-09 20:51:39 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2019-10-11 13:10:32 +0300
commit7da61c9da6b885fa90d274d220c2bcef2553b006 (patch)
treefbd473eff154ab42133ff14724e87128892b9922
parentd0cfd79d940bd9ed4dd63334ecf686fa013eaf37 (diff)
Add anaglyph stereoscopic modes into opengl runtime
Implement also anaglyph red-cyan & green-magenta stereoscopic modes for opengl runtime. APIs for C++ and QML. Add options into viewer. Task-number: QT3DS-3981 Change-Id: Idb9f659b3799e954253e37045c1a3b2a55fb2779 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io>
-rw-r--r--src/api/studio3d/q3dsviewersettings.cpp10
-rw-r--r--src/api/studio3d/q3dsviewersettings.h4
-rw-r--r--src/engine/Qt3DSRuntimeView.h4
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h4
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp18
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp3
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h4
-rw-r--r--src/viewer/Qt3DSViewerApp.h4
-rw-r--r--tools/viewer/main.cpp4
-rw-r--r--tools/viewer/qml/main.qml24
10 files changed, 72 insertions, 7 deletions
diff --git a/src/api/studio3d/q3dsviewersettings.cpp b/src/api/studio3d/q3dsviewersettings.cpp
index eb62c32..88d1d50 100644
--- a/src/api/studio3d/q3dsviewersettings.cpp
+++ b/src/api/studio3d/q3dsviewersettings.cpp
@@ -240,6 +240,8 @@ void Q3DSViewerSettings::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
\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.
+ \value StereoModeAnaglyphRedCyan Renders presentation in anaglyph red-cyan mode.
+ \value StereoModeAnaglyphGreenMagenta Renders presentation in anaglyph green-magenta mode.
The default value is \c{StereoModeMono}.
*/
@@ -255,6 +257,8 @@ void Q3DSViewerSettings::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
\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.
+ \value StereoModeAnaglyphRedCyan Renders presentation in anaglyph red-cyan mode.
+ \value StereoModeAnaglyphGreenMagenta Renders presentation in anaglyph green-magenta mode.
The default value is \c{StereoModeMono}.
*/
@@ -529,8 +533,12 @@ void Q3DSViewerSettingsPrivate::setStereoMode(Q3DSViewerSettings::StereoMode mod
m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::Mono);
else if (mode == Q3DSViewerSettings::StereoModeTopBottom)
m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::TopBottom);
- else
+ else if (mode == Q3DSViewerSettings::StereoModeLeftRight)
m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::LeftRight);
+ else if (mode == Q3DSViewerSettings::StereoModeAnaglyphRedCyan)
+ m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::AnaglyphRedCyan);
+ else
+ m_viewerApp->SetStereoMode(Q3DSViewer::ViewerStereoModes::AnaglyphGreenMagenta);
} else if (m_commandQueue) {
m_commandQueue->m_stereoMode = mode;
m_commandQueue->m_stereoModeChanged = true;
diff --git a/src/api/studio3d/q3dsviewersettings.h b/src/api/studio3d/q3dsviewersettings.h
index 1099e35..0a5e699 100644
--- a/src/api/studio3d/q3dsviewersettings.h
+++ b/src/api/studio3d/q3dsviewersettings.h
@@ -68,7 +68,9 @@ public:
enum StereoMode {
StereoModeMono,
StereoModeTopBottom,
- StereoModeLeftRight
+ StereoModeLeftRight,
+ StereoModeAnaglyphRedCyan,
+ StereoModeAnaglyphGreenMagenta
};
explicit Q3DSViewerSettings(QObject *parent = nullptr);
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
index 4e0b420..e3f57d1 100644
--- a/src/engine/Qt3DSRuntimeView.h
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -110,7 +110,9 @@ struct TegraRenderStereoModes
enum Enum {
Mono,
TopBottom,
- LeftRight
+ LeftRight,
+ AnaglyphRedCyan,
+ AnaglyphGreenMagenta
};
};
diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h
index dab5be9..9a26876 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.h
+++ b/src/runtimerender/Qt3DSRenderContextCore.h
@@ -57,7 +57,9 @@ namespace render {
enum Enum {
Mono,
TopBottom,
- LeftRight
+ LeftRight,
+ AnaglyphRedCyan,
+ AnaglyphGreenMagenta
};
};
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
index 04b08c1..99d5c45 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
@@ -1142,6 +1142,24 @@ namespace render {
theShader->m_Dimensions.Set(inDimensions);
theShader->m_Sampler.Set(&inQuadTexture);
+ // Set anaglyph color multiplier based on mode & current eye
+ // Default non-anaglyph modes use just vec4(1.0,1.0,1.0,1.0)
+ auto stereoMode = m_qt3dsContext.GetStereoMode();
+ auto stereoView = m_qt3dsContext.GetStereoView();
+ QT3DSVec4 anaglyphColor(1.0);
+ if (stereoMode == StereoModes::AnaglyphRedCyan) {
+ if (stereoView == StereoViews::Left)
+ anaglyphColor = QT3DSVec4(1.0, 0.0, 0.0, 0.0);
+ else
+ anaglyphColor = QT3DSVec4(0.0, 1.0, 1.0, 0.0);
+ } else if (stereoMode == StereoModes::AnaglyphGreenMagenta) {
+ if (stereoView == StereoViews::Left)
+ anaglyphColor = QT3DSVec4(0.0, 1.0, 0.0, 0.0);
+ else
+ anaglyphColor = QT3DSVec4(1.0, 0.0, 1.0, 0.0);
+ }
+ theShader->m_anaglyphColor.Set(anaglyphColor);
+
GenerateXYQuad();
theContext.SetInputAssembler(m_QuadInputAssembler);
theContext.Draw(NVRenderDrawMode::Triangles, m_QuadIndexBuffer->GetNumIndices(), 0);
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
index c33aaeb..d69e46e 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
@@ -2430,10 +2430,11 @@ namespace render {
vertexGenerator.Append("}");
fragmentGenerator.AddUniform("layer_image", "sampler2D");
+ fragmentGenerator.AddUniform("anaglyphColor", "vec4");
fragmentGenerator.Append("void main() {");
fragmentGenerator.Append("\tvec2 theCoords = uv_coords;\n");
fragmentGenerator.Append("\tvec4 theLayerTexture = texture2D( layer_image, theCoords );\n");
- fragmentGenerator.Append("\tfragOutput = theLayerTexture;\n");
+ fragmentGenerator.Append("\tfragOutput = theLayerTexture * anaglyphColor;\n");
fragmentGenerator.Append("}");
NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
"layer shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h
index 9753256..0d77121 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h
@@ -341,7 +341,8 @@ namespace render {
NVRenderCachedShaderProperty<QT3DSVec2> m_Dimensions;
// The fourth member of text color is the opacity
NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
-
+ // Color multiplier for anaglyph stereo modes
+ NVRenderCachedShaderProperty<QT3DSVec4> m_anaglyphColor;
volatile QT3DSI32 mRefCount;
SLayerSceneShader(NVRenderShaderProgram &inShader)
@@ -349,6 +350,7 @@ namespace render {
, m_MVP("model_view_projection", inShader)
, m_Dimensions("layer_dimensions", inShader)
, m_Sampler("layer_image", inShader)
+ , m_anaglyphColor("anaglyphColor", inShader)
, mRefCount(0)
{
m_Shader.addRef();
diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h
index 441cd50..25d2ed7 100644
--- a/src/viewer/Qt3DSViewerApp.h
+++ b/src/viewer/Qt3DSViewerApp.h
@@ -95,7 +95,9 @@ struct ViewerStereoModes
enum Enum {
Mono,
TopBottom,
- LeftRight
+ LeftRight,
+ AnaglyphRedCyan,
+ AnaglyphGreenMagenta
};
};
diff --git a/tools/viewer/main.cpp b/tools/viewer/main.cpp
index 70da8fa..1bcbe9d 100644
--- a/tools/viewer/main.cpp
+++ b/tools/viewer/main.cpp
@@ -377,6 +377,10 @@ int main(int argc, char *argv[])
appWindow->setProperty("stereoMode", Q3DSViewerSettings::StereoModeTopBottom);
else if (stereoStr == QStringLiteral("leftright"))
appWindow->setProperty("stereoMode", Q3DSViewerSettings::StereoModeLeftRight);
+ else if (stereoStr == QStringLiteral("anaglyphredcyan"))
+ appWindow->setProperty("stereoMode", Q3DSViewerSettings::StereoModeAnaglyphRedCyan);
+ else if (stereoStr == QStringLiteral("anaglyphgreenmagenta"))
+ appWindow->setProperty("stereoMode", Q3DSViewerSettings::StereoModeAnaglyphGreenMagenta);
else
appWindow->setProperty("stereoMode", Q3DSViewerSettings::StereoModeMono);
}
diff --git a/tools/viewer/qml/main.qml b/tools/viewer/qml/main.qml
index a53c0df..153753a 100644
--- a/tools/viewer/qml/main.qml
+++ b/tools/viewer/qml/main.qml
@@ -570,6 +570,10 @@ ApplicationWindow {
else if (window.stereoMode === ViewerSettings.StereoModeTopBottom)
window.stereoMode = ViewerSettings.StereoModeLeftRight;
else if (window.stereoMode === ViewerSettings.StereoModeLeftRight)
+ window.stereoMode = ViewerSettings.StereoModeAnaglyphRedCyan;
+ else if (window.stereoMode === ViewerSettings.StereoModeAnaglyphRedCyan)
+ window.stereoMode = ViewerSettings.StereoModeAnaglyphGreenMagenta;
+ else if (window.stereoMode === ViewerSettings.StereoModeAnaglyphGreenMagenta)
window.stereoMode = ViewerSettings.StereoModeMono;
}
}
@@ -610,6 +614,26 @@ ApplicationWindow {
}
}
StyledMenuItem {
+ id: stereoAnaglyphRedCyan
+ text: qsTr("Anaglyph (Red-Cyan)")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.stereoMode === ViewerSettings.StereoModeAnaglyphRedCyan
+ onTriggered: {
+ if (enabled)
+ window.stereoMode = ViewerSettings.StereoModeAnaglyphRedCyan;
+ }
+ }
+ StyledMenuItem {
+ id: stereoAnaglyphGreenMagenta
+ text: qsTr("Anaglyph (Green-Magenta)")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.stereoMode === ViewerSettings.StereoModeAnaglyphGreenMagenta
+ onTriggered: {
+ if (enabled)
+ window.stereoMode = ViewerSettings.StereoModeAnaglyphGreenMagenta;
+ }
+ }
+ StyledMenuItem {
id: stereoEyeSeparationUp
text: qsTr("Increase Separation")
shortcut: "Ctrl+Shift++"