From 8bb70e328d55db64628d03629ef6400d63e386fa Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 14 May 2019 11:05:40 -0400 Subject: [PATCH] Issue/425 (#860) * Working on the fix for the depth sorting problem. * Changed grids and billboards to additive blending. --- data/assets/scene/milkyway/milkyway/eso.asset | 3 ++- modules/base/rendering/renderablesphere.cpp | 25 +++++++++++++++++++ modules/base/rendering/renderablesphere.h | 1 + .../rendering/renderablebillboardscloud.cpp | 6 +++-- .../rendering/renderabledumeshes.cpp | 7 ++++-- .../digitaluniverse/shaders/billboard_fs.glsl | 4 +-- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/data/assets/scene/milkyway/milkyway/eso.asset b/data/assets/scene/milkyway/milkyway/eso.asset index 34cc9d79e9..95eb437099 100644 --- a/data/assets/scene/milkyway/milkyway/eso.asset +++ b/data/assets/scene/milkyway/milkyway/eso.asset @@ -26,7 +26,8 @@ local object = { UseAdditiveBlending = true, Orientation = "Inside", MirrorTexture = true, - FadeOutThreshold = 0.01 + FadeOutThreshold = 0.01, + Background = true }, GUI = { Name = "Milky Way (ESO)", diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index d82bd5e3c3..a13251c05e 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -111,6 +111,12 @@ namespace { "Disable Fade-In/Fade-Out effects", "Enables/Disables the Fade-In/Out effects." }; + + constexpr openspace::properties::Property::PropertyInfo BackgroundInfo = { + "Background", + "Sets the current sphere rendering as a background rendering type", + "Enables/Disables background rendering." + }; } // namespace namespace openspace { @@ -175,6 +181,12 @@ documentation::Documentation RenderableSphere::Documentation() { Optional::Yes, DisableFadeInOutInfo.description }, + { + BackgroundInfo.identifier, + new BoolVerifier, + Optional::Yes, + BackgroundInfo.description + }, } }; } @@ -189,6 +201,7 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) , _mirrorTexture(MirrorTextureInfo, false) , _useAdditiveBlending(UseAdditiveBlendingInfo, false) , _disableFadeInDistance(DisableFadeInOutInfo, true) + , _backgroundRendering(BackgroundInfo, false) , _fadeInThreshold(FadeInThresholdInfo, -1.f, 0.f, 1.f) , _fadeOutThreshold(FadeOutThresholdInfo, -1.f, 0.f, 1.f) { @@ -249,6 +262,10 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) } if (dictionary.hasKey(UseAdditiveBlendingInfo.identifier)) { _useAdditiveBlending = dictionary.value(UseAdditiveBlendingInfo.identifier); + + if (_useAdditiveBlending) { + setRenderBin(Renderable::RenderBin::Transparent); + } } if (dictionary.hasKey(FadeOutThresholdInfo.identifier)) { @@ -270,6 +287,14 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) _disableFadeInDistance.set(false); addProperty(_disableFadeInDistance); } + + if (dictionary.hasKey(BackgroundInfo.identifier)) { + _backgroundRendering = dictionary.value(BackgroundInfo.identifier); + + if (_backgroundRendering) { + setRenderBin(Renderable::RenderBin::Background); + } + } } bool RenderableSphere::isReady() const { diff --git a/modules/base/rendering/renderablesphere.h b/modules/base/rendering/renderablesphere.h index ac77832699..b7ff144fbd 100644 --- a/modules/base/rendering/renderablesphere.h +++ b/modules/base/rendering/renderablesphere.h @@ -72,6 +72,7 @@ private: properties::BoolProperty _mirrorTexture; properties::BoolProperty _useAdditiveBlending; properties::BoolProperty _disableFadeInDistance; + properties::BoolProperty _backgroundRendering; properties::FloatProperty _fadeInThreshold; properties::FloatProperty _fadeOutThreshold; diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index efdafba2d7..91db3fee91 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -643,6 +643,8 @@ void RenderableBillboardsCloud::initialize() { // entry is the one selected by default. _colorOption.setValue(static_cast(_colorRangeData.size() - 1)); } + + setRenderBin(Renderable::RenderBin::Transparent); } void RenderableBillboardsCloud::initializeGL() { @@ -722,6 +724,7 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, float fadeInVariable) { glDepthMask(false); + glEnable(GL_DEPTH_TEST); // Saving current OpenGL state GLboolean blendEnabled = glIsEnabledi(GL_BLEND, 0); @@ -746,8 +749,7 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, glEnablei(GL_BLEND, 0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + _program->activate(); const glm::dmat4 projMatrix = glm::dmat4(data.camera.projectionMatrix()); diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index 2e59ecd81f..33d8f50c2f 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -387,6 +387,8 @@ RenderableDUMeshes::RenderableDUMeshes(const ghoul::Dictionary& dictionary) } } + + setRenderBin(Renderable::RenderBin::Opaque); } bool RenderableDUMeshes::isReady() const { @@ -473,9 +475,10 @@ void RenderableDUMeshes::renderMeshes(const RenderData&, glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); glEnablei(GL_BLEND, 0); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(false); + glEnable(GL_DEPTH_TEST); _program->activate(); diff --git a/modules/digitaluniverse/shaders/billboard_fs.glsl b/modules/digitaluniverse/shaders/billboard_fs.glsl index bd5761bdc1..975f76a7be 100644 --- a/modules/digitaluniverse/shaders/billboard_fs.glsl +++ b/modules/digitaluniverse/shaders/billboard_fs.glsl @@ -52,8 +52,8 @@ Fragment getFragment() { fullColor.a *= fadeInValue * ta; - if (fullColor.a == 0.f || - fullColor.rgb == vec3(0.0)) { + float textureOpacity = dot(fullColor.rgb, vec3(1.0)); + if (fullColor.a == 0.f || textureOpacity == 0.0) { discard; }