diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-10-09 20:51:39 +0300 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-10-11 13:10:32 +0300 |
commit | 7da61c9da6b885fa90d274d220c2bcef2553b006 (patch) | |
tree | fbd473eff154ab42133ff14724e87128892b9922 | |
parent | d0cfd79d940bd9ed4dd63334ecf686fa013eaf37 (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.cpp | 10 | ||||
-rw-r--r-- | src/api/studio3d/q3dsviewersettings.h | 4 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.h | 4 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderContextCore.h | 4 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 18 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp | 3 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h | 4 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.h | 4 | ||||
-rw-r--r-- | tools/viewer/main.cpp | 4 | ||||
-rw-r--r-- | tools/viewer/qml/main.qml | 24 |
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++" |