Fix atmosphere stereo bugs

This commit is contained in:
Emil Axelsson
2018-02-19 22:11:12 +01:00
parent 0f7ca1790f
commit 5a23a3e93f
5 changed files with 40 additions and 6 deletions

View File

@@ -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;

View File

@@ -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
);
}

View File

@@ -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;

View File

@@ -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);
}
}
}
}

View File

@@ -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<Vec3>(_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;
}