From d6d36cbd43802776946375406eaa8f0a15fb7f0c Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 8 Sep 2017 11:14:06 +0200 Subject: [PATCH] Outline working on voxels --- libraries/render-utils/src/RenderDeferredTask.cpp | 12 +++++++++--- libraries/render/src/render/FilterTask.cpp | 13 ++++++++++--- libraries/render/src/render/FilterTask.h | 9 +++++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index b6e17b6fae..c67a1c7875 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -95,7 +95,13 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("PrepareStencil", primaryFramebuffer); // Select items that need to be outlined - const auto selectedMetas = task.addJob("PassTestSelection", metas, "contextOverlayHighlightList"); + const auto selectionName = "contextOverlayHighlightList"; + const auto selectMetaInput = SelectItems::Inputs(metas, Varying()).asVarying(); + const auto selectedMetas = task.addJob("PassTestMetaSelection", selectMetaInput, selectionName); + const auto selectMetaAndOpaqueInput = SelectItems::Inputs(opaques, selectedMetas).asVarying(); + const auto selectedMetasAndOpaques = task.addJob("PassTestOpaqueSelection", selectMetaAndOpaqueInput, selectionName); + const auto selectItemInput = SelectItems::Inputs(transparents, selectedMetasAndOpaques).asVarying(); + const auto selectedItems = task.addJob("PassTestTransparentSelection", selectItemInput, selectionName); // Render opaque objects in DeferredBuffer const auto opaqueInputs = DrawStateSortDeferred::Inputs(opaques, lightingModel).asVarying(); @@ -167,7 +173,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("ToneMapping", toneMappingInputs); const auto outlineRangeTimer = task.addJob("BeginOutlineRangeTimer", "Outline"); - const auto outlineInputs = DrawOutlineTask::Inputs(selectedMetas, shapePlumber, deferredFramebuffer, primaryFramebuffer, deferredFrameTransform).asVarying(); + const auto outlineInputs = DrawOutlineTask::Inputs(selectedItems, shapePlumber, deferredFramebuffer, primaryFramebuffer, deferredFrameTransform).asVarying(); task.addJob("DrawOutline", outlineInputs); task.addJob("EndOutlineRangeTimer", outlineRangeTimer); @@ -221,7 +227,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawZoneStack", deferredFrameTransform); // Render.getConfig("RenderMainView.DrawSelectionBounds").enabled = true - task.addJob("DrawSelectionBounds", selectedMetas); + task.addJob("DrawSelectionBounds", selectedItems); } // AA job to be revisited diff --git a/libraries/render/src/render/FilterTask.cpp b/libraries/render/src/render/FilterTask.cpp index 39bc19adc7..e0298c2a44 100644 --- a/libraries/render/src/render/FilterTask.cpp +++ b/libraries/render/src/render/FilterTask.cpp @@ -51,13 +51,20 @@ void SliceItems::run(const RenderContextPointer& renderContext, const ItemBounds } -void SelectItems::run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { +void SelectItems::run(const RenderContextPointer& renderContext, const Inputs& inputs, ItemBounds& outItems) { auto selection = renderContext->_scene->getSelection(_name); const auto& selectedItems = selection.getItems(); - outItems.clear(); + const auto& inItems = inputs.get0(); + const auto itemsToAppend = inputs[1]; + + if (itemsToAppend.isNull()) { + outItems.clear(); + } else { + outItems = itemsToAppend.get(); + } if (!selectedItems.empty()) { - outItems.reserve(selectedItems.size()); + outItems.reserve(outItems.size()+selectedItems.size()); for (auto src : inItems) { if (selection.contains(src.id)) { diff --git a/libraries/render/src/render/FilterTask.h b/libraries/render/src/render/FilterTask.h index 2f8b53722f..1e023a8bb9 100644 --- a/libraries/render/src/render/FilterTask.h +++ b/libraries/render/src/render/FilterTask.h @@ -113,22 +113,23 @@ namespace render { // Keep items belonging to the job selection class SelectItems { public: - using JobModel = Job::ModelIO; + using Inputs = VaryingSet2; + using JobModel = Job::ModelIO; std::string _name; SelectItems(const Selection::Name& name) : _name(name) {} - void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + void run(const RenderContextPointer& renderContext, const Inputs& inputs, ItemBounds& outItems); }; // Same as SelectItems but reorder the output to match the selection order class SelectSortItems { public: using JobModel = Job::ModelIO; - + std::string _name; SelectSortItems(const Selection::Name& name) : _name(name) {} - + void run(const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); };