diff --git a/data/assets/scene/solarsystem/missions/apollo/8/trails.asset b/data/assets/scene/solarsystem/missions/apollo/8/trails.asset index bd5d5f594e..5919504dcd 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 = "PostDeferredTransparent" }, GUI = { Name = "Apollo 8 Launch Trail", diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset index 5fb881fdd5..72fabc4988 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -91,7 +91,8 @@ local initializeAndAddNodes = function() Body = identifier, Observer = transforms.EarthInertial.Identifier, File = path, - LineNumber = 1 + LineNumber = 1, + RenderBinMode = "PostDeferredTransparent" }, Color = { 0.9, 0.6715, 0.0 }, Fade = 1.5, diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index 8d13f5fa9a..57d3a6eed3 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -16,7 +16,7 @@ local SunGlare = { Texture = textures .. "/halo.png", BlendMode = "Additive", Opacity = 0.65, - RenderableType = "Transparency" + RenderableType = "PreDeferredTransparency" }, Transform = { Translation = { diff --git a/data/assets/util/tle_helper.asset b/data/assets/util/tle_helper.asset index 9aa08a3c71..c87a21b231 100644 --- a/data/assets/util/tle_helper.asset +++ b/data/assets/util/tle_helper.asset @@ -84,7 +84,8 @@ function satellites(title, file, color, group) Path = file, SegmentQuality = 3, Color = color, - Fade = 1.5 + Fade = 1.5, + RenderBinMode = "PostDeferredTransparent" }, Tag = { "earth_satellites" }, GUI = { diff --git a/include/openspace/rendering/renderable.h b/include/openspace/rendering/renderable.h index d43b8f9bb7..1b2817c946 100644 --- a/include/openspace/rendering/renderable.h +++ b/include/openspace/rendering/renderable.h @@ -53,8 +53,9 @@ public: enum class RenderBin : int { Background = 1, Opaque = 2, - Transparent = 4, - Overlay = 8 + PreDeferredTransparent = 4, + PostDeferredTransparent = 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/renderablelabels.cpp b/modules/base/rendering/renderablelabels.cpp index e44e49fb17..dfff61258d 100644 --- a/modules/base/rendering/renderablelabels.cpp +++ b/modules/base/rendering/renderablelabels.cpp @@ -350,7 +350,7 @@ RenderableLabels::RenderableLabels(const ghoul::Dictionary& dictionary) setRenderBinFromOpacity(); break; case BlendModeAdditive: - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; default: throw ghoul::MissingCaseException(); @@ -608,7 +608,7 @@ void RenderableLabels::initialize() { throw ghoul::RuntimeError("Error loading objects labels data."); } - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); } void RenderableLabels::initializeGL() { diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index cebce3931c..02b55d8379 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -130,7 +130,7 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary) setRenderBinFromOpacity(); break; case BlendModeAdditive: - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; default: throw ghoul::MissingCaseException(); diff --git a/modules/base/rendering/renderableplaneimagelocal.cpp b/modules/base/rendering/renderableplaneimagelocal.cpp index 31f61f140e..0d190356a2 100644 --- a/modules/base/rendering/renderableplaneimagelocal.cpp +++ b/modules/base/rendering/renderableplaneimagelocal.cpp @@ -117,8 +117,11 @@ RenderablePlaneImageLocal::RenderablePlaneImageLocal(const ghoul::Dictionary& di else if (renderType == "Opaque") { setRenderBin(Renderable::RenderBin::Opaque); } - else if (renderType == "Transparent") { - setRenderBin(Renderable::RenderBin::Transparent); + else if (renderType == "PreDeferredTransparent") { + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); + } + else if (renderType == "PostDeferredTransparent") { + setRenderBin(Renderable::RenderBin::PostDeferredTransparent); } else if (renderType == "Overlay") { setRenderBin(Renderable::RenderBin::Overlay); diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index ae91a2f15e..bd46acce0c 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -264,7 +264,7 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) _useAdditiveBlending = dictionary.value(UseAdditiveBlendingInfo.identifier); if (_useAdditiveBlending) { - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); } } diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 46dc11cdcd..d40a6e638f 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 }, + { "PreDeferredTransparent", openspace::Renderable::RenderBin::PreDeferredTransparent}, + { "PostDeferredTransparent", openspace::Renderable::RenderBin::PostDeferredTransparent} + }; + 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/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index 9d58c6dc72..b489867cf0 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -184,8 +184,11 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary) else if (renderType == "Opaque") { setRenderBin(Renderable::RenderBin::Opaque); } - else if (renderType == "Transparent") { - setRenderBin(Renderable::RenderBin::Transparent); + else if (renderType == "PreDeferredTransparent") { + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); + } + else if (renderType == "PostDeferredTransparent") { + setRenderBin(Renderable::RenderBin::PostDeferredTransparent); } else if (renderType == "Overlay") { setRenderBin(Renderable::RenderBin::Overlay); 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/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index 2e5612e913..caa8c1d84f 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -699,7 +699,7 @@ void RenderableBillboardsCloud::initialize() { _colorOption.setValue(static_cast(_colorRangeData.size() - 1)); } - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); } void RenderableBillboardsCloud::initializeGL() { diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index e25c8c9eb9..befa6a125e 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -435,7 +435,7 @@ RenderablePlanesCloud::RenderablePlanesCloud(const ghoul::Dictionary& dictionary setRenderBin(Renderable::RenderBin::Opaque); break; case BlendModeAdditive: - setRenderBin(Renderable::RenderBin::Transparent); + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); break; default: throw ghoul::MissingCaseException(); diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index f9612d567e..2ec587e4cb 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -50,6 +50,14 @@ namespace { constexpr const char* KeyFile = "Path"; constexpr const char* KeyLineNum = "LineNumber"; + // Fragile! Keep in sync with documentation + const std::map RenderBinModeConversion = { + { "Background", openspace::Renderable::RenderBin::Background }, + { "Opaque", openspace::Renderable::RenderBin::Opaque }, + { "PreDeferredTransparent", openspace::Renderable::RenderBin::PreDeferredTransparent}, + { "PostDeferredTransparent", openspace::Renderable::RenderBin::PostDeferredTransparent} + }; + constexpr const std::array LeapYears = { 1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040, @@ -152,6 +160,13 @@ namespace { "Number of objects to render sequentially from StartRenderIdx" }; + constexpr openspace::properties::Property::PropertyInfo RenderBinModeInfo = { + "RenderBinMode", + "RenderBin Mode", + "Determines if the trails will be rendered after all other elements, including" + "atmospheres if needed." + }; + // Count the number of full days since the beginning of 2000 to the beginning of // the parameter 'year' int countDays(int year) { @@ -345,8 +360,8 @@ double RenderableOrbitalKepler::epochFromYMDdSubstring(const std::string& epochS RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) : Renderable(dict) - , _path(PathInfo) , _segmentQuality(SegmentQualityInfo, 2, 1, 10) + , _path(PathInfo) , _upperLimit(UpperLimitInfo, 1000, 1, 1000000) , _startRenderIdx(StartRenderIdxInfo, 0, 0, 1) , _sizeRender(RenderSizeInfo, 1, 1, 2) @@ -400,7 +415,14 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict) _startRenderIdxCallbackHandle = _startRenderIdx.onChange(_updateStartRenderIdxSelect); _sizeRenderCallbackHandle = _sizeRender.onChange(_updateRenderSizeSelect); - setRenderBin(Renderable::RenderBin::Overlay); + if (dict.hasKeyAndValue(RenderBinModeInfo.identifier)) { + openspace::Renderable::RenderBin cfgRenderBin = RenderBinModeConversion.at( + dict.value(RenderBinModeInfo.identifier) + ); + setRenderBin(cfgRenderBin); + } else { + setRenderBin(Renderable::RenderBin::PostDeferredTransparent); + } } void RenderableOrbitalKepler::initializeGL() { diff --git a/src/rendering/abufferrenderer.cpp b/src/rendering/abufferrenderer.cpp index 5bc54db990..db86645354 100644 --- a/src/rendering/abufferrenderer.cpp +++ b/src/rendering/abufferrenderer.cpp @@ -585,7 +585,8 @@ void ABufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor) // Render the scene to the fragment buffer. Collect renderer tasks (active raycasters) int renderBinMask = static_cast(Renderable::RenderBin::Background) | static_cast(Renderable::RenderBin::Opaque) | - static_cast(Renderable::RenderBin::Transparent) | + static_cast(Renderable::RenderBin::PreDeferredTransparent) | + static_cast(Renderable::RenderBin::PostDeferredTransparent) | static_cast(Renderable::RenderBin::Overlay); Time time = global::timeManager.time(); diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index cec4b87e92..2319b58ea5 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -1226,8 +1226,8 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac } { - GLDebugGroup group("Transparent"); - data.renderBinMask = static_cast(Renderable::RenderBin::Transparent); + GLDebugGroup group("PreDeferredTransparent"); + data.renderBinMask = static_cast(Renderable::RenderBin::PreDeferredTransparent); scene->render(data, tasks); } @@ -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("PostDeferredTransparent"); + data.renderBinMask = static_cast(Renderable::RenderBin::PostDeferredTransparent); + 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..8e11770be0 100644 --- a/src/rendering/renderable.cpp +++ b/src/rendering/renderable.cpp @@ -235,21 +235,25 @@ 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); + if (_renderBin != Renderable::RenderBin::PostDeferredTransparent) { + if (_opacity >= 0.f && _opacity < 1.f) { + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); + } + else { + setRenderBin(Renderable::RenderBin::Opaque); + } } } void Renderable::registerUpdateRenderBinFromOpacity() { _opacity.onChange([this](){ - if (_opacity > 0.f && _opacity < 1.f) { - setRenderBin(Renderable::RenderBin::Transparent); - } - else { - setRenderBin(Renderable::RenderBin::Opaque); + if (_renderBin != Renderable::RenderBin::PostDeferredTransparent) { + if (_opacity >= 0.f && _opacity < 1.f) { + setRenderBin(Renderable::RenderBin::PreDeferredTransparent); + } + else { + setRenderBin(Renderable::RenderBin::Opaque); + } } }); } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index ab119610fa..c6e982c21c 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -57,9 +57,12 @@ namespace { return "Opaque"; } else if (renderBin == 4) { - return "Transparent"; + return "PreDeferredTransparent"; } else if (renderBin == 8) { + return "PostDeferredTransparent"; + } + else if (renderBin == 16) { return "Overlay"; } else {