From a9b478888c1830b85c7557e93b473b90517cc20d Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 27 Jan 2017 18:03:18 -0800 Subject: [PATCH] First cut of Web3DOverlays without FXAA applied. --- interface/src/ui/overlays/Base3DOverlay.h | 2 ++ interface/src/ui/overlays/OverlaysPayload.cpp | 13 +++++++++++-- interface/src/ui/overlays/Web3DOverlay.h | 2 ++ .../render-utils/src/RenderDeferredTask.cpp | 8 ++++++++ libraries/render/src/render/CullTask.cpp | 16 ++++++++++++++++ libraries/render/src/render/CullTask.h | 13 +++++++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 1860af4e85..487d4eff70 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -36,6 +36,8 @@ public: bool getIgnoreRayIntersection() const { return _ignoreRayIntersection; } bool getDrawInFront() const { return _drawInFront; } + virtual bool isAA() const { return true; } + void setLineWidth(float lineWidth) { _lineWidth = lineWidth; } void setIsSolid(bool isSolid) { _isSolid = isSolid; } void setIsDashedLine(bool isDashedLine) { _isDashedLine = isDashedLine; } diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 7cc74d60e0..277a86e93f 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -38,6 +38,9 @@ namespace render { if (std::static_pointer_cast(overlay)->getDrawInFront()) { builder.withLayered(); } + if (!std::static_pointer_cast(overlay)->isAA()) { + builder.withLayered(); + } if (overlay->getAlphaPulse() != 0.0f || overlay->getAlpha() != 1.0f) { builder.withTransparent(); } @@ -51,11 +54,17 @@ namespace render { } template <> int payloadGetLayer(const Overlay::Pointer& overlay) { // MAgic number while we are defining the layering mechanism: - const int LAYER_2D = 2; + const int LAYER_NO_AA = 3; + const int LAYER_2D = 2; const int LAYER_3D_FRONT = 1; const int LAYER_3D = 0; + if (overlay->is3D()) { - return (std::dynamic_pointer_cast(overlay)->getDrawInFront() ? LAYER_3D_FRONT : LAYER_3D); + auto overlay3D = std::dynamic_pointer_cast(overlay); + if (overlay3D->isAA()) + return (overlay3D->getDrawInFront() ? LAYER_3D_FRONT : LAYER_3D); + else + return LAYER_NO_AA; } else { return LAYER_2D; } diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 2b9686919d..72b923496c 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -29,6 +29,8 @@ public: Web3DOverlay(const Web3DOverlay* Web3DOverlay); virtual ~Web3DOverlay(); + virtual bool isAA() const { return false; } + QString pickURL(); void loadSourceURL(); virtual void render(RenderArgs* args) override; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index e0192b5f85..55a9c8b9e4 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -63,6 +63,10 @@ RenderDeferredTask::RenderDeferredTask(RenderFetchCullSortTask::Output items) { const auto background = items[RenderFetchCullSortTask::BACKGROUND]; const auto spatialSelection = items[RenderFetchCullSortTask::SPATIAL_SELECTION]; + // Filter the non antialiaased overlays + const int LAYER_NO_AA = 3; + const auto nonAAOverlays = addJob("Filter2DWebOverlays", overlayOpaques, LAYER_NO_AA); + // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = addJob("DeferredFrameTransform"); const auto lightingModel = addJob("LightingModel"); @@ -195,6 +199,10 @@ RenderDeferredTask::RenderDeferredTask(RenderFetchCullSortTask::Output items) { // AA job to be revisited addJob("Antialiasing", primaryFramebuffer); + // Draw 2DWeb non AA + const auto nonAAOverlaysInputs = DrawOverlay3D::Inputs(nonAAOverlays, lightingModel).hasVarying(); + addJob("Draw2DWebSurfaces", nonAAOverlaysInputs, false); + addJob("ToneAndPostRangeTimer", toneAndPostRangeTimer); // Blit! diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index e27895352f..42f95f458f 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -306,3 +306,19 @@ void CullSpatialSelection::run(const SceneContextPointer& sceneContext, const Re std::static_pointer_cast(renderContext->jobConfig)->numItems = (int)outItems.size(); } + + +void FilterItemLayer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems) { + auto& scene = sceneContext->_scene; + + // Clear previous values + outItems.clear(); + + // For each item, filter it into one bucket + for (auto itemBound : inItems) { + auto& item = scene->getItem(itemBound.id); + if (item.getLayer() == _keepLayer) { + outItems.emplace_back(itemBound); + } + } +} \ No newline at end of file diff --git a/libraries/render/src/render/CullTask.h b/libraries/render/src/render/CullTask.h index 1a709ed102..f613faa2e6 100644 --- a/libraries/render/src/render/CullTask.h +++ b/libraries/render/src/render/CullTask.h @@ -175,6 +175,19 @@ namespace render { } } }; + + class FilterItemLayer { + public: + using JobModel = Job::ModelIO; + + FilterItemLayer() {} + FilterItemLayer(int keepLayer) : + _keepLayer(keepLayer) {} + + int _keepLayer { 0 }; + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, ItemBounds& outItems); + }; } #endif // hifi_render_CullTask_h; \ No newline at end of file