From 76d8135fdc452e02f3178e7e3f469ecefa874e1c Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 5 Feb 2016 18:21:21 -0800 Subject: [PATCH] Trying to introduce the Filtering step after the full scene culling --- .../render-utils/src/RenderDeferredTask.cpp | 11 +++++--- libraries/render/src/render/CullTask.cpp | 25 +++++++++++++++++-- libraries/render/src/render/CullTask.h | 25 ++++++++++++++++++- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 654e797e1b..86b433e191 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -66,8 +66,11 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { const auto transparents = addJob("DepthSortTransparent", culledTransparents, DepthSortItems(false)); */ // CPU: Fetch the renderOpaques - const auto opaqueSelection = addJob("FetchOpaque"); - const auto culledOpaques = addJob("CullOpaque", opaqueSelection, cullFunctor); + auto sceneFilter = ItemFilter::Builder::opaqueShape().withTransparent().withTypeLight(); + const auto sceneSelection = addJob("FetchSceneSelection", sceneFilter); + const auto culledSceneSelection = addJob("CullSceneSelection", sceneSelection, cullFunctor, RenderDetails::OPAQUE_ITEM, ItemFilter::Builder::opaqueShape().withoutLayered()); + + const auto culledOpaques = addJob("FilterOpaque", culledSceneSelection); const auto opaques = addJob("DepthSortOpaque", culledOpaques); // CPU only, create the list of renderedTransparents items @@ -112,8 +115,8 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { // Scene Octree Debuging job { - addJob("DrawSceneOctree", opaqueSelection); - addJob("DrawItemSelection", opaqueSelection); + addJob("DrawSceneOctree", sceneSelection); + addJob("DrawItemSelection", sceneSelection); } // Status icon rendering job diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index 580084cb86..a1343318ca 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -193,7 +193,8 @@ void FetchSpatialTree::run(const SceneContextPointer& sceneContext, const Render void CullSpatialSelection::configure(const Config& config) { } -void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems) { +void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, + const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems) { assert(renderContext->args); assert(renderContext->args->_viewFrustum); RenderArgs* args = renderContext->args; @@ -236,7 +237,6 @@ void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const Re Test test(_cullFunctor, args, details); // Now we have a selection of items to render - outItems.clear(); outItems.reserve(inSelection.numItems()); @@ -293,3 +293,24 @@ void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const Re std::static_pointer_cast(renderContext->jobConfig)->numItems = (int)outItems.size(); } + +void FilterItemSelection::configure(const Config& config) { +} + +void FilterItemSelection::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); + RenderArgs* args = renderContext->args; + auto& scene = sceneContext->_scene; + + // Now we have a selection of items to render + outItems.clear(); + outItems.reserve(inItems.size()); + + for (auto itemBound : inItems) { + auto& item = scene->getItem(itemBound.id); + if (_filter.test(item.getKey())) { + outItems.emplace_back(itemBound); + } + } +} diff --git a/libraries/render/src/render/CullTask.h b/libraries/render/src/render/CullTask.h index d17e95b5a8..795dd103e9 100644 --- a/libraries/render/src/render/CullTask.h +++ b/libraries/render/src/render/CullTask.h @@ -131,7 +131,30 @@ namespace render { ItemFilter _filter{ ItemFilter::Builder::opaqueShape().withoutLayered() }; void configure(const Config& config); - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& outSelection, ItemBounds& outItems); + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemSpatialTree::ItemSelection& inSelection, ItemBounds& outItems); + }; + + class FilterItemSelectionConfig : public Job::Config { + Q_OBJECT + Q_PROPERTY(int numItems READ getNumItems) + public: + int numItems{ 0 }; + int getNumItems() { return numItems; } + }; + + class FilterItemSelection { + public: + using Config = FilterItemSelectionConfig; + using JobModel = Job::ModelIO; + + FilterItemSelection() {} + FilterItemSelection(const ItemFilter& filter) : + _filter(filter) {} + + ItemFilter _filter{ ItemFilter::Builder::opaqueShape().withoutLayered() }; + + void configure(const Config& config); + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); }; class DepthSortItems {