diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 6456f2cf60..561f7b9319 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -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(); diff --git a/modules/digitaluniverse/shaders/billboard_gs.glsl b/modules/digitaluniverse/shaders/billboard_gs.glsl index c7884bd0f2..0e5cfc658d 100644 --- a/modules/digitaluniverse/shaders/billboard_gs.glsl +++ b/modules/digitaluniverse/shaders/billboard_gs.glsl @@ -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(); }