diff --git a/apps/openmw/mwrender/skyutil.cpp b/apps/openmw/mwrender/skyutil.cpp index ead9d9af70..ec9e6e7635 100644 --- a/apps/openmw/mwrender/skyutil.cpp +++ b/apps/openmw/mwrender/skyutil.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -602,6 +603,38 @@ namespace MWRender } } + + class SkyMultiviewStatesetUpdater: public SceneUtil::StateSetUpdater + { + public: + SkyMultiviewStatesetUpdater() + { + } + + protected: + virtual void setDefaults(osg::StateSet* stateset) + { + stateset->addUniform(new osg::Uniform(osg::Uniform::FLOAT_MAT4, "viewMatrixMultiView", 2), osg::StateAttribute::OVERRIDE); + } + + virtual void apply(osg::StateSet* stateset, osg::NodeVisitor* /*nv*/) + { + auto* viewMatrixMultiViewUniform = stateset->getUniform("viewMatrixMultiView"); + auto& sm = Stereo::Manager::instance(); + + for (int view : {0, 1}) + { + auto viewOffsetMatrix = sm.computeEyeViewOffset(view); + for (int col : {0, 1, 2}) + viewOffsetMatrix(3, col) = 0; + + viewMatrixMultiViewUniform->setElement(view, viewOffsetMatrix); + } + } + + private: + }; + CameraRelativeTransform::CameraRelativeTransform() { // Culling works in node-local space, not in camera space, so we can't cull this node correctly @@ -610,6 +643,7 @@ namespace MWRender setCullingActive(false); addCullCallback(new CameraRelativeTransformCullCallback); + addCullCallback(new SkyMultiviewStatesetUpdater); } CameraRelativeTransform::CameraRelativeTransform(const CameraRelativeTransform& copy, const osg::CopyOp& copyop) diff --git a/components/stereo/stereomanager.cpp b/components/stereo/stereomanager.cpp index bbbdc6e934..3cca855e7e 100644 --- a/components/stereo/stereomanager.cpp +++ b/components/stereo/stereomanager.cpp @@ -406,6 +406,11 @@ namespace Stereo return mViewMatrix[view]; } + osg::Matrixd Manager::computeEyeViewOffset(int view) const + { + return mViewOffsetMatrix[view]; + } + Eye Manager::getEye(const osgUtil::CullVisitor* cv) const { if (cv->getIdentifier() == mIdentifierMain) diff --git a/components/stereo/stereomanager.hpp b/components/stereo/stereomanager.hpp index fea5a8543f..49ae685e6b 100644 --- a/components/stereo/stereomanager.hpp +++ b/components/stereo/stereomanager.hpp @@ -70,6 +70,7 @@ namespace Stereo osg::Matrixd computeEyeProjection(int view, bool reverseZ) const; osg::Matrixd computeEyeView(int view) const; + osg::Matrixd computeEyeViewOffset(int view) const; //! Sets up any definitions necessary for stereo rendering void shaderStereoDefines(Shader::ShaderManager::DefineMap& defines) const; diff --git a/files/shaders/groundcover_vertex.glsl b/files/shaders/groundcover_vertex.glsl index ff3dacdd99..fff8293b61 100644 --- a/files/shaders/groundcover_vertex.glsl +++ b/files/shaders/groundcover_vertex.glsl @@ -1,7 +1,5 @@ #version 120 -#include "openmw_vertex.h.glsl" - #if @useUBO #extension GL_ARB_uniform_buffer_object : require #endif @@ -146,7 +144,7 @@ void main(void) if (length(gl_ModelViewMatrix * vec4(position, 1.0)) > @groundcoverFadeEnd) gl_Position = vec4(0.0, 0.0, 0.0, 1.0); else - gl_Position = mw_viewToClip(mw_viewStereoAdjust(viewPos)); + gl_Position = mw_viewToClip(viewPos); linearDepth = getLinearDepth(gl_Position.z, viewPos.z); diff --git a/files/shaders/nv_default_vertex.glsl b/files/shaders/nv_default_vertex.glsl index f182bbe8be..0d014b02fa 100644 --- a/files/shaders/nv_default_vertex.glsl +++ b/files/shaders/nv_default_vertex.glsl @@ -1,7 +1,5 @@ #version 120 -#include "openmw_vertex.h.glsl" - #if @useUBO #extension GL_ARB_uniform_buffer_object : require #endif diff --git a/files/shaders/objects_vertex.glsl b/files/shaders/objects_vertex.glsl index 10543f767a..5c94417491 100644 --- a/files/shaders/objects_vertex.glsl +++ b/files/shaders/objects_vertex.glsl @@ -1,7 +1,5 @@ #version 120 -#include "openmw_vertex.h.glsl" - #if @useUBO #extension GL_ARB_uniform_buffer_object : require #endif diff --git a/files/shaders/openmw_vertex.glsl b/files/shaders/openmw_vertex.glsl index cc14f3a0e3..68a98c7880 100644 --- a/files/shaders/openmw_vertex.glsl +++ b/files/shaders/openmw_vertex.glsl @@ -23,13 +23,3 @@ vec4 mw_viewStereoAdjust(vec4 pos) { return pos; } - -mat4 mw_viewMatrix() -{ - return gl_ModelViewMatrix; -} - -mat4 mw_projectionMatrix() -{ - return projectionMatrix; -} diff --git a/files/shaders/openmw_vertex.h.glsl b/files/shaders/openmw_vertex.h.glsl index 5f591e4311..3794121656 100644 --- a/files/shaders/openmw_vertex.h.glsl +++ b/files/shaders/openmw_vertex.h.glsl @@ -4,6 +4,4 @@ vec4 mw_modelToClip(vec4 pos); vec4 mw_modelToView(vec4 pos); vec4 mw_viewToClip(vec4 pos); -vec4 mw_viewStereoAdjust(vec4 pos); -mat4 mw_viewMatrix(); -mat4 mw_projectionMatrix(); \ No newline at end of file +vec4 mw_viewStereoAdjust(vec4 pos); \ No newline at end of file diff --git a/files/shaders/openmw_vertex_multiview.glsl b/files/shaders/openmw_vertex_multiview.glsl index f65d9f0da0..c860112d5c 100644 --- a/files/shaders/openmw_vertex_multiview.glsl +++ b/files/shaders/openmw_vertex_multiview.glsl @@ -22,20 +22,10 @@ vec4 mw_modelToView(vec4 pos) vec4 mw_viewToClip(vec4 pos) { - return projectionMatrixMultiView[gl_ViewID_OVR] * pos; + return projectionMatrixMultiView[gl_ViewID_OVR] * viewMatrixMultiView[gl_ViewID_OVR] * pos; } vec4 mw_viewStereoAdjust(vec4 pos) { return viewMatrixMultiView[gl_ViewID_OVR] * pos; } - -mat4 mw_viewMatrix() -{ - return viewMatrixMultiView[gl_ViewID_OVR] * gl_ModelViewMatrix; -} - -mat4 mw_projectionMatrix() -{ - return projectionMatrixMultiView[gl_ViewID_OVR]; -} diff --git a/files/shaders/sky_vertex.glsl b/files/shaders/sky_vertex.glsl index 6d9ef7a073..8ff9c0f156 100644 --- a/files/shaders/sky_vertex.glsl +++ b/files/shaders/sky_vertex.glsl @@ -2,8 +2,6 @@ #include "openmw_vertex.h.glsl" -#include "openmw_vertex.h.glsl" - #include "skypasses.glsl" uniform int pass; @@ -11,23 +9,9 @@ uniform int pass; varying vec4 passColor; varying vec2 diffuseMapUV; -mat4 selectModelViewMatrix() -{ -#if @useOVR_multiview - mat4 viewOffsetMatrix = mw_viewMatrix(); - // Sky geometries aren't actually all that distant. So delete view translation to keep them looking distant. - viewOffsetMatrix[3][0] = 0; - viewOffsetMatrix[3][1] = 0; - viewOffsetMatrix[3][2] = 0; - return viewOffsetMatrix; -#else - return gl_ModelViewMatrix; -#endif -} - void main() { - gl_Position = mw_viewToClip(selectModelViewMatrix() * gl_Vertex); + gl_Position = mw_modelToClip(gl_Vertex); passColor = gl_Color; if (pass == PASS_CLOUDS) diff --git a/files/shaders/terrain_vertex.glsl b/files/shaders/terrain_vertex.glsl index 07ffeee202..a426061941 100644 --- a/files/shaders/terrain_vertex.glsl +++ b/files/shaders/terrain_vertex.glsl @@ -1,7 +1,5 @@ #version 120 -#include "openmw_vertex.h.glsl" - #if @useUBO #extension GL_ARB_uniform_buffer_object : require #endif diff --git a/files/shaders/water_fragment.glsl b/files/shaders/water_fragment.glsl index 8db92a2984..bf35ca78ca 100644 --- a/files/shaders/water_fragment.glsl +++ b/files/shaders/water_fragment.glsl @@ -1,7 +1,5 @@ #version 120 -#include "openmw_fragment.h.glsl" - #if @useUBO #extension GL_ARB_uniform_buffer_object : require #endif