mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-03-03 02:48:32 -06:00
Fix atmosphere stereo bugs
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user