From 5a23a3e93f2588346da4efe25131e1b391dac850 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Mon, 19 Feb 2018 22:11:12 +0100 Subject: [PATCH] Fix atmosphere stereo bugs --- include/openspace/util/camera.h | 1 + .../rendering/atmospheredeferredcaster.cpp | 15 ++++++++++---- .../shaders/atmosphere_deferred_fs.glsl | 3 ++- src/rendering/framebufferrenderer.cpp | 7 ++++++- src/util/camera.cpp | 20 +++++++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index b3b2e28d03..d691f1181f 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -101,6 +101,7 @@ public: // Accessors // Remove Vec3 from the name when psc is gone const Vec3& positionVec3() const; + const Vec3 eyePositionVec3() const; const Vec3& unsynchedPositionVec3() const; const Vec3& focusPositionVec3() const; const Vec3& viewDirectionWorldSpace() const; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 23bec4878f..5821803910 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -192,7 +192,7 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, _modelTransform * glm::dvec4(0.0, 0.0, 0.0, 1.0) ); - double distance = glm::distance(tPlanetPosWorld, renderData.camera.positionVec3()); + double distance = glm::distance(tPlanetPosWorld, renderData.camera.eyePositionVec3()); if (distance > DISTANCE_CULLING) { program.setUniform("cullAtmosphere", 1); } @@ -254,11 +254,16 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, glm::inverse(dfScaleCamTransf) ); + program.setUniform( + "dCamScaleTransform", + renderData.camera.viewScaleMatrix() + ); + // World to Eye Space in OS program.setUniform( "dInverseCamScaleTransform", glm::inverse(renderData.camera.viewScaleMatrix()) - ); + ); program.setUniform( "dInverseCamRotTransform", @@ -284,7 +289,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, program.setUniform("dInverseSgctProjectionMatrix", dInverseProjection); program.setUniform("dObjpos", glm::dvec4(renderData.position.dvec3(), 1.0)); - program.setUniform("dCampos", renderData.camera.positionVec3()); + + glm::dvec3 campos = renderData.camera.eyePositionVec3(); + program.setUniform("dCampos", campos); double lt; glm::dvec3 sunPosWorld = SpiceManager::ref().targetPosition( @@ -300,7 +307,7 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, // Sun following camera position if (_sunFollowingCameraEnabled) { sunPosObj = inverseModelMatrix * glm::dvec4( - renderData.camera.positionVec3(), + renderData.camera.eyePositionVec3(), 1.0 ); } diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index a4c434f2b4..21a73bfc69 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -88,6 +88,7 @@ uniform sampler2DMS mainColorTexture; uniform dmat4 dInverseSgctEyeToWorldTranform; // SGCT Eye to OS World uniform dmat4 dSgctEyeToOSEyeTranform; // SGCT Eye to OS Eye * uniform dmat4 dInverseSgctProjectionMatrix; // Clip to SGCT Eye * +uniform dmat4 dCamScaleTransform; uniform dmat4 dInverseCamScaleTransform; uniform dmat4 dInverseCamRotTransform; uniform dmat4 dInverseModelTransformMatrix; @@ -639,7 +640,7 @@ void main() { // OS Eye to World coords dvec4 tmpSInvPos = dInverseCamScaleTransform * dSgctEyeToOSEyeTranform * position; dvec4 tmpRInvPos = dInverseCamRotTransform * tmpSInvPos;//dSgctEyeToOSEyeTranform * position; - dvec4 fragWorldCoords = dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); + dvec4 fragWorldCoords = dCamScaleTransform * dvec4(dvec3(tmpRInvPos) + dCampos, 1.0); // World to Object (Normal and Position in meters) dvec4 fragObjectCoords = dInverseModelTransformMatrix * fragWorldCoords; diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 58c827d893..5c142dd588 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -331,7 +331,12 @@ void FramebufferRenderer::update() { for (auto &program : _deferredcastPrograms) { if (program.second && program.second->isDirty()) { - program.second->rebuildFromFile(); + try { + program.second->rebuildFromFile(); + } + catch (const ghoul::RuntimeError& e) { + LERRORC(e.component, e.message); + } } } } diff --git a/src/util/camera.cpp b/src/util/camera.cpp index 3da20a3f69..bc59e4dc66 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -121,6 +121,26 @@ namespace openspace { return _position; } + const Camera::Vec3 Camera::eyePositionVec3() const { + glm::dvec4 eyeInEyeSpace(0.0, 0.0, 0.0, 1.0); + + glm::dmat4 invViewMatrix = glm::inverse(sgctInternal.viewMatrix()); + glm::dmat4 invRotationMatrix = glm::inverse(viewRotationMatrix()); + glm::dmat4 invTranslationMatrix = + glm::translate(Mat4(1.0), static_cast(_position)); + + glm::dmat4 invViewScale = glm::inverse(viewScaleMatrix()); + + glm::dvec4 eyeInWorldSpace = + invTranslationMatrix * + invRotationMatrix * + invViewScale * + invViewMatrix * + eyeInEyeSpace; + + return glm::dvec3(eyeInWorldSpace.x, eyeInWorldSpace.y, eyeInWorldSpace.z); + } + const Camera::Vec3& Camera::unsynchedPositionVec3() const { return _position; }