From 9e7e45c85b6ff375826b7d6de4ac0f47ecf1337e Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Fri, 10 Nov 2017 11:48:21 -0500 Subject: [PATCH] Added limit for screen size of renderablebillboards. --- .../digitaluniverse/digitaluniverse.mod | 2 +- ext/ghoul | 2 +- .../rendering/renderablebillboardscloud.cpp | 4 + .../shaders/billboard2_gs.glsl | 75 ++++++++++++++----- 4 files changed, 61 insertions(+), 22 deletions(-) diff --git a/data/scene/milkyway/digitaluniverse/digitaluniverse.mod b/data/scene/milkyway/digitaluniverse/digitaluniverse.mod index 71494850b5..95a3dd81b2 100644 --- a/data/scene/milkyway/digitaluniverse/digitaluniverse.mod +++ b/data/scene/milkyway/digitaluniverse/digitaluniverse.mod @@ -9,7 +9,7 @@ return { Alpha = 0.4, Texture = "textures/DarkUniverse_mellinger_8k.jpg", Orientation = "Inside/Outside", - FadeOutThreshould = 0.18 + FadeOutThreshould = 0.25 }, GuiPath = "/Milky Way/Milky Way" } diff --git a/ext/ghoul b/ext/ghoul index a6244a16f9..4dce717aac 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit a6244a16f98687c9196c4ba8ced11a3d68a88b46 +Subproject commit 4dce717aac293edd8662d03cc336da355c797343 diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 9b8f4b9ef4..72a1ed02b4 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -650,6 +650,10 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, const g _program->setUniform("right", orthoRight); _program->setUniform("fadeInValue", fadeInVariable); + + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + _program->setUniform("screenSize", glm::vec2(viewport[2], viewport[3])); ghoul::opengl::TextureUnit spriteTextureUnit; if (_hasSpriteTexture) { diff --git a/modules/digitaluniverse/shaders/billboard2_gs.glsl b/modules/digitaluniverse/shaders/billboard2_gs.glsl index 90c9cfb793..d5cf407466 100644 --- a/modules/digitaluniverse/shaders/billboard2_gs.glsl +++ b/modules/digitaluniverse/shaders/billboard2_gs.glsl @@ -38,6 +38,7 @@ uniform dvec3 cameraPosition; uniform dvec3 cameraLookUp; uniform dvec4 centerScreenInWorldPosition; uniform int renderOption; +uniform vec2 screenSize; in vec4 colorMap[]; @@ -101,36 +102,70 @@ void main() { //dvec4 dpos = transformMatrix * dvec4(dvec3(pos.xyz) * unit, 1.0); dvec4 dpos = dvec4(dvec3(pos.xyz) * unit, 1.0); - texCoord = corners[0]; + // texCoord = corners[0]; vec4 initialPosition = z_normalization(vec4(modelViewProjectionTransform * dvec4(dpos.xyz - scaledRight - scaledUp, dpos.w))); vs_screenSpaceDepth = initialPosition.w; - gl_Position = initialPosition; - EmitVertex(); + // gl_Position = initialPosition; + // EmitVertex(); - texCoord = corners[1]; - gl_Position = z_normalization(vec4(modelViewProjectionTransform * + // texCoord = corners[1]; + vec4 secondPosition = z_normalization(vec4(modelViewProjectionTransform * dvec4(dpos.xyz + scaledRight - scaledUp, dpos.w))); - EmitVertex(); + // gl_Position = secondPosition; + // EmitVertex(); - texCoord = corners[2]; + //texCoord = corners[2]; vec4 crossCorner = z_normalization(vec4(modelViewProjectionTransform * dvec4(dpos.xyz + scaledUp + scaledRight, dpos.w))); - gl_Position = crossCorner; - EmitVertex(); - EndPrimitive(); // First Triangle + // gl_Position = crossCorner; + // EmitVertex(); + // EndPrimitive(); // First Triangle - texCoord = corners[0]; - gl_Position = initialPosition; - EmitVertex(); + // texCoord = corners[0]; + // gl_Position = initialPosition; + // EmitVertex(); - texCoord = corners[2]; - gl_Position = crossCorner; - EmitVertex(); + // texCoord = corners[2]; + // gl_Position = crossCorner; + // EmitVertex(); - texCoord = corners[3]; - gl_Position = z_normalization(vec4(modelViewProjectionTransform * + // texCoord = corners[3]; + vec4 thirdPosition = z_normalization(vec4(modelViewProjectionTransform * dvec4(dpos.xyz + scaledUp - scaledRight, dpos.w))); - EmitVertex(); - EndPrimitive(); // Second Triangle + // gl_Position = thirdPosition; + // EmitVertex(); + // EndPrimitive(); // Second Triangle + + // Testing size: + vec4 topLeft = thirdPosition/thirdPosition.w; + topLeft = ((topLeft + vec4(1.0)) / vec4(2.0)) * vec4(screenSize.x, screenSize.y, 1.0, 1.0); + vec4 bottomLeft = initialPosition/initialPosition.w; + bottomLeft = ((bottomLeft + vec4(1.0)) / vec4(2.0)) * vec4(screenSize.x, screenSize.y, 1.0, 1.0); + + if ((topLeft.y - bottomLeft.y) > (0.2 * screenSize.y)) { + return; + } else { + // Build primitive + texCoord = corners[0]; + gl_Position = initialPosition; + EmitVertex(); + texCoord = corners[1]; + gl_Position = secondPosition; + EmitVertex(); + texCoord = corners[2]; + gl_Position = crossCorner; + EmitVertex(); + EndPrimitive(); // First Triangle + texCoord = corners[0]; + gl_Position = initialPosition; + EmitVertex(); + texCoord = corners[2]; + gl_Position = crossCorner; + EmitVertex(); + texCoord = corners[3]; + gl_Position = thirdPosition; + EmitVertex(); + EndPrimitive(); // Second Triangle + } }