diff --git a/libraries/render-utils/src/OutlineEffect.cpp b/libraries/render-utils/src/OutlineEffect.cpp index 4733120fd3..158cb3871a 100644 --- a/libraries/render-utils/src/OutlineEffect.cpp +++ b/libraries/render-utils/src/OutlineEffect.cpp @@ -66,11 +66,12 @@ gpu::TexturePointer OutlineFramebuffer::getDepthTexture() { } void PrepareOutline::run(const render::RenderContextPointer& renderContext, const PrepareOutline::Inputs& inputs, PrepareOutline::Output& output) { - auto outlinedItems = inputs.get0(); + auto outlinedOpaqueItems = inputs.get0(); + auto outlinedTransparentItems = inputs.get1(); - if (!outlinedItems.empty()) { + if (!outlinedOpaqueItems.empty() || !outlinedTransparentItems.empty()) { auto args = renderContext->args; - auto deferredFrameBuffer = inputs.get1(); + auto deferredFrameBuffer = inputs.get2(); auto frameSize = deferredFrameBuffer->getFrameSize(); if (!_outlineFramebuffer) { diff --git a/libraries/render-utils/src/OutlineEffect.h b/libraries/render-utils/src/OutlineEffect.h index 11bb39b954..fb625fbabc 100644 --- a/libraries/render-utils/src/OutlineEffect.h +++ b/libraries/render-utils/src/OutlineEffect.h @@ -44,7 +44,7 @@ class PrepareOutline { public: - using Inputs = render::VaryingSet2; + using Inputs = render::VaryingSet3; // Output will contain outlined objects only z-depth texture and the input primary buffer but without the primary depth buffer using Output = OutlineFramebufferPointer; using JobModel = render::Job::ModelIO; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index f53cfa443b..f240f0728e 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -40,7 +40,6 @@ #include "AntialiasingEffect.h" #include "ToneMappingEffect.h" #include "SubsurfaceScattering.h" -#include "PickItemsJob.h" #include "OutlineEffect.h" #include @@ -96,16 +95,20 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("PrepareStencil", primaryFramebuffer); // Select items that need to be outlined - const auto outlinedOpaques = task.addJob("PickOutlined", opaques, - // Pick only shapes so exclude meta - render::ItemKey::Builder().withTypeShape().build()._flags, render::ItemKey::Builder().withTypeMeta().build()._flags); + const auto outlineSelectionName = "contextOverlayHighlightList"; + const auto outlinedOpaquesSelection = task.addJob("SelectOutlinedOpaques", opaques, outlineSelectionName); + const auto outlinedTransparentSelection = task.addJob("SelectOutlinedTransparents", transparents, outlineSelectionName); + const auto outlinedOpaqueItems = task.addJob("OutlinedOpaqueMetaToSubItems", outlinedOpaquesSelection); + const auto outlinedTransparentItems = task.addJob("OutlinedTransparentMetaToSubItems", outlinedTransparentSelection); // Render opaque outline objects first in DeferredBuffer - const auto opaqueOutlineInputs = DrawStateSortDeferred::Inputs(outlinedOpaques, lightingModel).asVarying(); - task.addJob("DrawOpaqueOutlined", opaqueOutlineInputs, shapePlumber); + const auto outlineOpaqueInputs = DrawStateSortDeferred::Inputs(outlinedOpaqueItems, lightingModel).asVarying(); + const auto outlineTransparentInputs = DrawStateSortDeferred::Inputs(outlinedTransparentItems, lightingModel).asVarying(); + task.addJob("DrawOpaqueOutlined", outlineOpaqueInputs, shapePlumber); + task.addJob("DrawTransparentOutlined", outlineTransparentInputs, shapePlumber); // Retrieve z value of the outlined objects - const auto outlinePrepareInputs = PrepareOutline::Inputs(outlinedOpaques, deferredFramebuffer).asVarying(); + const auto outlinePrepareInputs = PrepareOutline::Inputs(outlinedOpaqueItems, outlinedTransparentItems, deferredFramebuffer).asVarying(); const auto outlinedFrameBuffer = task.addJob("PrepareOutline", outlinePrepareInputs); // Render opaque objects in DeferredBuffer diff --git a/libraries/render/src/render/FilterTask.cpp b/libraries/render/src/render/FilterTask.cpp index 19953f3399..b4da280697 100644 --- a/libraries/render/src/render/FilterTask.cpp +++ b/libraries/render/src/render/FilterTask.cpp @@ -98,8 +98,9 @@ void SelectSortItems::run(const RenderContextPointer& renderContext, const ItemB } } -void MetaToSubItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems) { +void MetaToSubItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { auto& scene = renderContext->_scene; + ItemIDs outItemIds; // Now we have a selection of items to render outItems.clear(); @@ -107,7 +108,14 @@ void MetaToSubItems::run(const RenderContextPointer& renderContext, const ItemBo for (auto idBound : inItems) { auto& item = scene->getItem(idBound.id); - item.fetchMetaSubItems(outItems); + item.fetchMetaSubItems(outItemIds); + } + + // Transform Item IDs to ItemBounds + for (auto id : outItemIds) { + auto& item = scene->getItem(id); + + outItems.emplace_back(ItemBound{ id, item.getBound() }); } } diff --git a/libraries/render/src/render/FilterTask.h b/libraries/render/src/render/FilterTask.h index 1c4611ee9f..b9b02017da 100644 --- a/libraries/render/src/render/FilterTask.h +++ b/libraries/render/src/render/FilterTask.h @@ -135,11 +135,11 @@ namespace render { // From meta-Items, generate the sub-items class MetaToSubItems { public: - using JobModel = Job::ModelIO; + using JobModel = Job::ModelIO; MetaToSubItems() {} - void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemIDs& outItems); + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; }