mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-05 19:19:39 -06:00
Fix precision problem for renderablebillboardscloud when flying close
E.g. when flying close to an exoplanet system
This commit is contained in:
@@ -624,9 +624,7 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data,
|
||||
_program->setUniform(_uniformCache.modelMatrix, modelMatrix);
|
||||
_program->setUniform(
|
||||
_uniformCache.cameraViewProjectionMatrix,
|
||||
glm::mat4(
|
||||
glm::dmat4(data.camera.projectionMatrix()) * data.camera.combinedViewMatrix()
|
||||
)
|
||||
glm::dmat4(data.camera.projectionMatrix()) * data.camera.combinedViewMatrix()
|
||||
);
|
||||
|
||||
const float minBillboardSize = _billboardMinMaxSize.value().x; // in pixels
|
||||
@@ -698,9 +696,9 @@ void RenderableBillboardsCloud::render(const RenderData& data, RendererTasks&) {
|
||||
glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale));
|
||||
|
||||
glm::dmat4 modelViewMatrix = data.camera.combinedViewMatrix() * modelMatrix;
|
||||
glm::mat4 projectionMatrix = data.camera.projectionMatrix();
|
||||
glm::dmat4 projectionMatrix = glm::dmat4(data.camera.projectionMatrix());
|
||||
|
||||
glm::dmat4 modelViewProjectionMatrix = glm::dmat4(projectionMatrix) * modelViewMatrix;
|
||||
glm::dmat4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix;
|
||||
|
||||
glm::dvec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace();
|
||||
glm::dvec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace();
|
||||
|
||||
@@ -39,7 +39,7 @@ out float ta;
|
||||
// General settings
|
||||
uniform float scaleFactor;
|
||||
uniform int renderOption;
|
||||
uniform mat4 cameraViewProjectionMatrix;
|
||||
uniform dmat4 cameraViewProjectionMatrix;
|
||||
uniform dmat4 modelMatrix;
|
||||
uniform bool enabledRectSizeControl;
|
||||
uniform bool hasDvarScaling;
|
||||
@@ -63,7 +63,7 @@ const double PARSEC = 0.308567756e17LF;
|
||||
|
||||
const vec2 corners[4] = vec2[4](
|
||||
vec2(0.0, 0.0),
|
||||
vec2(1.0, 0.0),
|
||||
vec2(1.0, 0.0),
|
||||
vec2(1.0, 1.0),
|
||||
vec2(0.0, 1.0)
|
||||
);
|
||||
@@ -76,7 +76,7 @@ void main() {
|
||||
ta = 1.0;
|
||||
vec4 pos = gl_in[0].gl_Position;
|
||||
gs_colorMap = colorMap[0];
|
||||
|
||||
|
||||
double unit = PARSEC;
|
||||
|
||||
// Must be the same as the enum in RenderableBillboardsCloud.h
|
||||
@@ -96,10 +96,10 @@ void main() {
|
||||
if (hasDvarScaling) {
|
||||
scaleMultiply *= dvarScaling[0];
|
||||
}
|
||||
|
||||
|
||||
vec3 scaledRight = vec3(0.0);
|
||||
vec3 scaledUp = vec3(0.0);
|
||||
|
||||
|
||||
if (renderOption == RenderOptionCameraViewDirection) {
|
||||
scaledRight = scaleMultiply * right * 0.5;
|
||||
scaledUp = scaleMultiply * up * 0.5;
|
||||
@@ -119,27 +119,27 @@ void main() {
|
||||
scaledRight = scaleMultiply * newRight * 0.5;
|
||||
scaledUp = scaleMultiply * newUp * 0.5;
|
||||
}
|
||||
|
||||
|
||||
if (enabledRectSizeControl) {
|
||||
vec4 initialPosition = z_normalization(cameraViewProjectionMatrix *
|
||||
vec4(vec3(dpos.xyz) - scaledRight - scaledUp, dpos.w));
|
||||
|
||||
vec4 initialPosition = z_normalization(vec4(cameraViewProjectionMatrix *
|
||||
dvec4(dpos.xyz - dvec3(scaledRight - scaledUp), dpos.w)));
|
||||
|
||||
vs_screenSpaceDepth = initialPosition.w;
|
||||
|
||||
vec4 crossCorner = z_normalization(cameraViewProjectionMatrix *
|
||||
vec4(vec3(dpos.xyz) + scaledUp + scaledRight, dpos.w));
|
||||
|
||||
|
||||
vec4 crossCorner = z_normalization(vec4(cameraViewProjectionMatrix *
|
||||
dvec4(dpos.xyz + dvec3(scaledRight + scaledUp), dpos.w)));
|
||||
|
||||
// Testing size for rectangular viewport:
|
||||
vec2 halfViewSize = screenSize * 0.5;
|
||||
vec2 topRight = crossCorner.xy / crossCorner.w;
|
||||
vec2 bottomLeft = initialPosition.xy / initialPosition.w;
|
||||
|
||||
|
||||
// width and height
|
||||
vec2 sizes = abs(halfViewSize * (topRight - bottomLeft));
|
||||
|
||||
|
||||
if (enabledRectSizeControl && (length(sizes) > maxBillboardSize)) {
|
||||
float correctionScale = maxBillboardSize / length(sizes);
|
||||
|
||||
|
||||
scaledRight *= correctionScale;
|
||||
scaledUp *= correctionScale;
|
||||
}
|
||||
@@ -158,9 +158,9 @@ void main() {
|
||||
}
|
||||
|
||||
// Saving one matrix multiplication:
|
||||
vec4 dposClip = cameraViewProjectionMatrix * vec4(dpos);
|
||||
vec4 scaledRightClip = cameraViewProjectionMatrix * vec4(scaledRight, 0.0);
|
||||
vec4 scaledUpClip = cameraViewProjectionMatrix * vec4(scaledUp, 0.0);
|
||||
vec4 dposClip = vec4(cameraViewProjectionMatrix * dpos);
|
||||
vec4 scaledRightClip = vec4(cameraViewProjectionMatrix * dvec4(scaledRight, 0.0));
|
||||
vec4 scaledUpClip = vec4(cameraViewProjectionMatrix * dvec4(scaledUp, 0.0));
|
||||
|
||||
vec4 initialPosition = z_normalization(dposClip - scaledRightClip - scaledUpClip);
|
||||
vs_screenSpaceDepth = initialPosition.w;
|
||||
@@ -172,7 +172,7 @@ void main() {
|
||||
texCoord = corners[0];
|
||||
gl_Position = initialPosition;
|
||||
EmitVertex();
|
||||
|
||||
|
||||
texCoord = corners[1];
|
||||
gl_Position = secondPosition;
|
||||
EmitVertex();
|
||||
@@ -180,10 +180,10 @@ void main() {
|
||||
texCoord = corners[3];
|
||||
gl_Position = thirdPosition;
|
||||
EmitVertex();
|
||||
|
||||
|
||||
texCoord = corners[2];
|
||||
gl_Position = crossCorner;
|
||||
EmitVertex();
|
||||
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user