From 2cd6706a6a39a4f3d946f1095604ade16ba7004a Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 26 Feb 2016 12:10:20 -0800 Subject: [PATCH] Update fetch to use nonspatialSet --- .../render-utils/src/RenderDeferredTask.cpp | 54 +++++++++---------- .../render-utils/src/RenderDeferredTask.h | 4 +- libraries/render/src/render/CullTask.cpp | 23 +++----- libraries/render/src/render/CullTask.h | 45 ++-------------- libraries/render/src/render/DrawTask.cpp | 15 ------ libraries/render/src/render/DrawTask.h | 10 ---- 6 files changed, 38 insertions(+), 113 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 31f40f5285..d2209ae321 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -54,34 +54,42 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { // CPU jobs: // Fetch and cull the items from the scene - auto sceneFilter = ItemFilter::Builder::visibleWorldItems().withoutLayered(); - const auto sceneSelection = addJob("FetchSceneSelection", sceneFilter); - const auto culledSceneSelection = addJob("CullSceneSelection", sceneSelection, cullFunctor, RenderDetails::ITEM, sceneFilter); + auto spatialFilter = ItemFilter::Builder::visibleWorldItems().withoutLayered(); + const auto spatialSelection = addJob("FetchSceneSelection", spatialFilter); + const auto culledSpatialSelection = addJob("CullSceneSelection", spatialSelection, cullFunctor, RenderDetails::ITEM, spatialFilter); + + // Overlays are not culled + const auto nonspatialSelection = addJob("FetchOverlaySelection"); // Multi filter visible items into different buckets const int NUM_FILTERS = 3; const int OPAQUE_SHAPE_BUCKET = 0; const int TRANSPARENT_SHAPE_BUCKET = 1; const int LIGHT_BUCKET = 2; - MultiFilterItem::ItemFilterArray triageFilters = { { + const int BACKGROUND_BUCKET = 2; + MultiFilterItem::ItemFilterArray spatialFilters = { { ItemFilter::Builder::opaqueShape(), ItemFilter::Builder::transparentShape(), ItemFilter::Builder::light() } }; - const auto filteredItemsBuckets = addJob>("FilterSceneSelection", culledSceneSelection, triageFilters).get::ItemBoundsArray>(); + MultiFilterItem::ItemFilterArray nonspatialFilters = { { + ItemFilter::Builder::opaqueShape(), + ItemFilter::Builder::transparentShape(), + ItemFilter::Builder::background() + } }; + const auto filteredSpatialBuckets = addJob>("FilterSceneSelection", culledSpatialSelection, spatialFilters).get::ItemBoundsArray>(); + const auto filteredNonspatialBuckets = addJob>("FilterOverlaySelection", nonspatialSelection, nonspatialFilters).get::ItemBoundsArray>(); // Extract / Sort opaques / Transparents / Lights / Overlays - const auto opaques = addJob("DepthSortOpaque", filteredItemsBuckets[OPAQUE_SHAPE_BUCKET]); - const auto transparents = addJob("DepthSortTransparent", filteredItemsBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); - const auto lights = filteredItemsBuckets[LIGHT_BUCKET]; + const auto opaques = addJob("DepthSortOpaque", filteredSpatialBuckets[OPAQUE_SHAPE_BUCKET]); + const auto transparents = addJob("DepthSortTransparent", filteredSpatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); + const auto lights = filteredSpatialBuckets[LIGHT_BUCKET]; - // Overlays are not culled because we want to make sure they are seen - // Could be considered a bug in the current cullfunctor - const auto overlayOpaques = addJob("FetchOverlayOpaque", ItemFilter::Builder::opaqueShapeLayered()); - const auto fetchedOverlayOpaques = addJob("FetchOverlayTransparents", ItemFilter::Builder::transparentShapeLayered()); - const auto overlayTransparents = addJob("DepthSortTransparentOverlay", fetchedOverlayOpaques, DepthSortItems(false)); + const auto overlayOpaques = addJob("DepthSortOverlayOpaque", filteredNonspatialBuckets[OPAQUE_SHAPE_BUCKET]); + const auto overlayTransparents = addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); + const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; - // GPU Jobs: Start preparing the deferred and lighting buffer + // GPU jobs: Start preparing the deferred and lighting buffer addJob("PrepareDeferred"); // Render opaque objects in DeferredBuffer @@ -91,7 +99,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { addJob("DrawOpaqueStencil"); // Use Stencil and start drawing background in Lighting buffer - addJob("DrawBackgroundDeferred"); + addJob("DrawBackgroundDeferred", background); // AO job addJob("AmbientOcclusion"); @@ -123,8 +131,8 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { // Scene Octree Debuging job { - addJob("DrawSceneOctree", sceneSelection); - addJob("DrawItemSelection", sceneSelection); + addJob("DrawSceneOctree", spatialSelection); + addJob("DrawItemSelection", spatialSelection); } // Status icon rendering job @@ -276,20 +284,10 @@ void DrawStencilDeferred::run(const SceneContextPointer& sceneContext, const Ren args->_batch = nullptr; } -void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems) { assert(renderContext->args); assert(renderContext->args->_viewFrustum); - // render backgrounds - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::background()); - - - ItemBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - inItems.emplace_back(id); - } RenderArgs* args = renderContext->args; doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 5591edce7c..f8837f5b24 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -85,9 +85,9 @@ protected: class DrawBackgroundDeferred { public: - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemBounds& inItems); - using JobModel = render::Job::Model; + using JobModel = render::Job::ModelI; }; class DrawOverlay3DConfig : public render::Job::Config { diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index 7824514649..7c5f5184da 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -129,32 +129,21 @@ void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderCo depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems); } - -void FetchItems::configure(const Config& config) { -} - -void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemBounds& outItems) { +void FetchNonspatialItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemBounds& outItems) { assert(renderContext->args); assert(renderContext->args->_viewFrustum); auto& scene = sceneContext->_scene; outItems.clear(); - const auto& bucket = scene->getMasterBucket(); - const auto& items = bucket.find(_filter); - if (items != bucket.end()) { - outItems.reserve(items->second.size()); - for (auto& id : items->second) { - auto& item = scene->getItem(id); - outItems.emplace_back(ItemBound(id, item.getBound())); - } + const auto& items = scene->getNonspatialSet(); + outItems.reserve(items.size()); + for (auto& id : items) { + auto& item = scene->getItem(id); + outItems.emplace_back(ItemBound(id, item.getBound())); } - - std::static_pointer_cast(renderContext->jobConfig)->numItems = (int)outItems.size(); } - - void FetchSpatialTree::configure(const Config& config) { _justFrozeFrustum = _justFrozeFrustum || (config.freezeFrustum && !_freezeFrustum); _freezeFrustum = config.freezeFrustum; diff --git a/libraries/render/src/render/CullTask.h b/libraries/render/src/render/CullTask.h index 734d683ad7..1306640891 100644 --- a/libraries/render/src/render/CullTask.h +++ b/libraries/render/src/render/CullTask.h @@ -23,50 +23,12 @@ namespace render { const ItemBounds& inItems, ItemBounds& outItems); void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemBounds& inItems, ItemBounds& outItems); - class FetchItemsConfig : public Job::Config { - Q_OBJECT - Q_PROPERTY(int numItems READ getNumItems) + class FetchNonspatialItems { public: - int getNumItems() { return numItems; } - - int numItems{ 0 }; - }; - - class FetchItems { - public: - using Config = FetchItemsConfig; - using JobModel = Job::ModelO; - - FetchItems() {} - FetchItems(const ItemFilter& filter) : _filter(filter) {} - - ItemFilter _filter{ ItemFilter::Builder::opaqueShape().withoutLayered() }; - - void configure(const Config& config); + using JobModel = Job::ModelO; void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemBounds& outItems); }; - - template - class CullItems { - public: - using JobModel = Job::ModelIO, ItemBounds, ItemBounds>; - - CullItems(CullFunctor cullFunctor) : _cullFunctor{ cullFunctor } {} - - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { - const auto& args = renderContext->args; - auto& details = args->_details.edit(T); - outItems.clear(); - outItems.reserve(inItems.size()); - render::cullItems(renderContext, _cullFunctor, details, inItems, outItems); - } - - protected: - CullFunctor _cullFunctor; - }; - - class FetchSpatialTreeConfig : public Job::Config { Q_OBJECT Q_PROPERTY(int numItems READ getNumItems) @@ -209,13 +171,14 @@ namespace render { outItems[i].template edit().clear(); } - // For each item, filter it into the buckets + // For each item, filter it into one bucket for (auto itemBound : inItems) { auto& item = scene->getItem(itemBound.id); auto itemKey = item.getKey(); for (size_t i = 0; i < NUM_FILTERS; i++) { if (_filters[i].test(itemKey)) { outItems[i].template edit().emplace_back(itemBound); + break; } } } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 5ad6ca0547..85bb01a378 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -93,18 +93,3 @@ void PipelineSortShapes::run(const SceneContextPointer& sceneContext, const Rend items.second.shrink_to_fit(); } } - -void DepthSortShapes::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapesIDsBounds& inShapes, ShapesIDsBounds& outShapes) { - outShapes.clear(); - outShapes.reserve(inShapes.size()); - - for (auto& pipeline : inShapes) { - auto& inItems = pipeline.second; - auto outItems = outShapes.find(pipeline.first); - if (outItems == outShapes.end()) { - outItems = outShapes.insert(std::make_pair(pipeline.first, ItemBounds{})).first; - } - - depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems->second); - } -} diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index a52bd3192f..29543dfb3e 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -37,16 +37,6 @@ public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ShapesIDsBounds& outShapes); }; -class DepthSortShapes { -public: - using JobModel = Job::ModelIO; - - bool _frontToBack; - DepthSortShapes(bool frontToBack = true) : _frontToBack(frontToBack) {} - - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapesIDsBounds& inShapes, ShapesIDsBounds& outShapes); -}; - } #endif // hifi_render_DrawTask_h