From e64f557bb4f8732da63e331a9b6c7407ceb9fe8c Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Mon, 29 Jun 2020 15:58:04 -0400 Subject: [PATCH] Proposed solution. --- .../missions/apollo/8/trails.asset | 3 ++- include/openspace/rendering/renderable.h | 3 ++- .../shaders/atmosphere_deferred_fs.glsl | 2 +- modules/base/rendering/renderabletrail.cpp | 22 ++++++++++++++++ modules/base/shaders/renderabletrail_fs.glsl | 5 +++- src/rendering/framebufferrenderer.cpp | 8 +++++- src/rendering/renderable.cpp | 26 +++++++++++-------- 7 files changed, 53 insertions(+), 16 deletions(-) diff --git a/data/assets/scene/solarsystem/missions/apollo/8/trails.asset b/data/assets/scene/solarsystem/missions/apollo/8/trails.asset index bd5d5f594e..3f4e2dccf8 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/trails.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/trails.asset @@ -22,7 +22,8 @@ local LaunchTrail = { Color = { 0.70, 0.50, 0.20 }, StartTime = "1968 DEC 21 12:51:00", EndTime = "1968 DEC 21 23:23:22", - SampleInterval = 30 + SampleInterval = 30, + RenderBinMode = "SuperTransparent" }, GUI = { Name = "Apollo 8 Launch Trail", diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index d43b8f9bb7..fabea8f6fb 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -54,7 +54,8 @@ public: Background = 1, Opaque = 2, Transparent = 4, - Overlay = 8 + SuperTransparent = 8, + Overlay = 16 }; static std::unique_ptr createFromDictionary( diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index e9c3fdb17a..15365be28f 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -621,7 +621,7 @@ void main() { // All calculations are done in Km: pixelDepth *= 0.001; positionObjectsCoords.xyz *= 0.001; - + if (pixelDepth < offset) { // ATM Occluded - Something in fron of ATM. atmosphereFinalColor += color; diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 46dc11cdcd..68b237763c 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -68,6 +68,14 @@ namespace { { "Points+Lines", RenderingModeLinesPoints } }; + // Fragile! Keep in sync with documentation + const std::map RenderBinModeConversion = { + { "Background", openspace::Renderable::RenderBin::Background }, + { "Opaque", openspace::Renderable::RenderBin::Opaque }, + { "Transparent", openspace::Renderable::RenderBin::Transparent}, + { "SuperTransparent", openspace::Renderable::RenderBin::SuperTransparent} + }; + static const openspace::properties::PropertyOwner::PropertyOwnerInfo AppearanceInfo = { "Appearance", @@ -122,6 +130,13 @@ namespace { "corresponding points (and subpoints) are shown. 'Lines+Points' shows both parts." }; + constexpr openspace::properties::Property::PropertyInfo RenderBinModeInfo = { + "RenderBinMode", + "RenderBin Mode", + "Determines if the trails will be rendered after all other elements, including" + "atmospheres if needed." + }; + } // namespace namespace openspace { @@ -255,6 +270,13 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) } addPropertySubOwner(_appearance); + + if (dictionary.hasKeyAndValue(RenderBinModeInfo.identifier)) { + openspace::Renderable::RenderBin cfgRenderBin = RenderBinModeConversion.at( + dictionary.value(RenderBinModeInfo.identifier) + ); + setRenderBin(cfgRenderBin); + } } void RenderableTrail::initializeGL() { diff --git a/modules/base/shaders/renderabletrail_fs.glsl b/modules/base/shaders/renderabletrail_fs.glsl index 86aae007f2..d08f19b371 100644 --- a/modules/base/shaders/renderabletrail_fs.glsl +++ b/modules/base/shaders/renderabletrail_fs.glsl @@ -67,13 +67,16 @@ Fragment getFragment() { if (distanceCenter > dLW) { frag.color.a = 0.0; + //discard; } else { frag.color.a *= pow(float((dLW - distanceCenter) / dLW), blendFactor); + // if (frag.color.a < 0.4) + // discard; } frag.gPosition = vs_gPosition; - + // There is no normal here frag.gNormal = vec4(0.0, 0.0, -1.0, 1.0); diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index cec4b87e92..569aef9729 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1265,10 +1265,16 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } performDeferredTasks(tasks.deferredcasterTasks); } - + glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]); glEnablei(GL_BLEND, 0); + { + GLDebugGroup group("SuperTransparent"); + data.renderBinMask = static_cast(Renderable::RenderBin::SuperTransparent); + scene->render(data, tasks); + } + { GLDebugGroup group("Overlay"); data.renderBinMask = static_cast(Renderable::RenderBin::Overlay); diff --git a/src/rendering/renderable.cpp b/src/rendering/renderable.cpp index be742c6fc4..fe79fe21c4 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -235,22 +235,26 @@ void Renderable::onEnabledChange(std::function callback) { } void Renderable::setRenderBinFromOpacity() { - if (_opacity > 0.f && _opacity < 1.f) { - setRenderBin(Renderable::RenderBin::Transparent); - } - else { - setRenderBin(Renderable::RenderBin::Opaque); - } -} - -void Renderable::registerUpdateRenderBinFromOpacity() { - _opacity.onChange([this](){ - if (_opacity > 0.f && _opacity < 1.f) { + if (_renderBin != Renderable::RenderBin::SuperTransparent) { + if (_opacity >= 0.f && _opacity < 1.f) { setRenderBin(Renderable::RenderBin::Transparent); } else { setRenderBin(Renderable::RenderBin::Opaque); } + } +} + +void Renderable::registerUpdateRenderBinFromOpacity() { + _opacity.onChange([this](){ + if (_renderBin != Renderable::RenderBin::SuperTransparent) { + if (_opacity >= 0.f && _opacity < 1.f) { + setRenderBin(Renderable::RenderBin::Transparent); + } + else { + setRenderBin(Renderable::RenderBin::Opaque); + } + } }); }