From 7da61c9da6b885fa90d274d220c2bcef2553b006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= Date: Wed, 9 Oct 2019 20:51:39 +0300 Subject: Add anaglyph stereoscopic modes into opengl runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Tomi Korpipää Reviewed-by: Antti Määttä --- src/api/studio3d/q3dsviewersettings.cpp | 10 ++++++++- src/api/studio3d/q3dsviewersettings.h | 4 +++- src/engine/Qt3DSRuntimeView.h | 4 +++- src/runtimerender/Qt3DSRenderContextCore.h | 4 +++- .../rendererimpl/Qt3DSRendererImpl.cpp | 18 ++++++++++++++++ .../rendererimpl/Qt3DSRendererImplShaders.cpp | 3 ++- .../rendererimpl/Qt3DSRendererImplShaders.h | 4 +++- src/viewer/Qt3DSViewerApp.h | 4 +++- tools/viewer/main.cpp | 4 ++++ 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 m_Dimensions; // The fourth member of text color is the opacity NVRenderCachedShaderProperty m_Sampler; - + // Color multiplier for anaglyph stereo modes + NVRenderCachedShaderProperty 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; } } @@ -609,6 +613,26 @@ ApplicationWindow { window.stereoMode = ViewerSettings.StereoModeLeftRight; } } + 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") -- cgit v1.2.3