From d6ea01c4f3a16ace6ada6de4a9b4d30098d3e964 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Wed, 6 Sep 2017 17:34:29 +0200 Subject: [PATCH] Created outline task but still need to create specific render job with z-pass shaders --- libraries/render-utils/src/OutlineEffect.cpp | 39 +++++++++++++++++++ libraries/render-utils/src/OutlineEffect.h | 15 +++++++ .../render-utils/src/RenderDeferredTask.cpp | 20 ++-------- libraries/render/src/task/Varying.h | 18 +++++++++ 4 files changed, 75 insertions(+), 17 deletions(-) diff --git a/libraries/render-utils/src/OutlineEffect.cpp b/libraries/render-utils/src/OutlineEffect.cpp index 4733120fd3..a99ced93f0 100644 --- a/libraries/render-utils/src/OutlineEffect.cpp +++ b/libraries/render-utils/src/OutlineEffect.cpp @@ -12,6 +12,10 @@ #include "GeometryCache.h" +#include + +#include "RenderDeferredTask.h" + #include "gpu/Context.h" #include "gpu/StandardShaderLib.h" @@ -294,3 +298,38 @@ const gpu::PipelinePointer& DebugOutline::getDebugPipeline() { return _debugPipeline; } + +DrawOutlineTask::DrawOutlineTask() { + +} + +void DrawOutlineTask::configure(const Config& config) { + +} + +void DrawOutlineTask::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) { + const auto input = inputs.get(); + const auto selectedMetas = inputs.getN(0); + const auto shapePlumber = input.get1(); + const auto lightingModel = inputs.getN(2); + const auto deferredFramebuffer = inputs.getN(3); + const auto primaryFramebuffer = inputs.getN(4); + const auto deferredFrameTransform = inputs.getN(5); + + const auto& outlinedItems = task.addJob("OutlinedMetaToSubItems", selectedMetas); + + // Render opaque outline objects first in DeferredBuffer + const auto outlineInputs = DrawStateSortDeferred::Inputs(outlinedItems, lightingModel).asVarying(); + task.addJob("DrawOutlinedDepth", outlineInputs, shapePlumber); + + // Retrieve z value of the outlined objects + const auto outlinePrepareInputs = PrepareOutline::Inputs(outlinedItems, deferredFramebuffer).asVarying(); + const auto outlinedFrameBuffer = task.addJob("CopyOutlineDepth", outlinePrepareInputs); + + // Draw outline + const auto drawOutlineInputs = DrawOutline::Inputs(deferredFrameTransform, deferredFramebuffer, outlinedFrameBuffer, primaryFramebuffer).asVarying(); + task.addJob("DrawOutlineEffect", drawOutlineInputs); + + // Debug outline + task.addJob("DebugOutline", outlinedFrameBuffer); +} diff --git a/libraries/render-utils/src/OutlineEffect.h b/libraries/render-utils/src/OutlineEffect.h index 11bb39b954..ccc1e03fdd 100644 --- a/libraries/render-utils/src/OutlineEffect.h +++ b/libraries/render-utils/src/OutlineEffect.h @@ -165,6 +165,21 @@ private: bool _isDisplayDepthEnabled{ false }; }; +#include "LightingModel.h" + +class DrawOutlineTask { +public: + using Inputs = render::VaryingSet6; + using Config = render::Task::Config; + using JobModel = render::Task::ModelI; + + DrawOutlineTask(); + + void configure(const Config& config); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); + +}; + #endif // hifi_render_utils_OutlineEffect_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 3d39e2ff5e..5ea506e18f 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -95,17 +95,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("PrepareStencil", primaryFramebuffer); // Select items that need to be outlined - const auto outlineSelectionName = "contextOverlayHighlightList"; const auto selectedMetas = task.addJob("PassTestSelection", metas, "contextOverlayHighlightList"); - const auto outlinedItems = task.addJob("OutlinedMetaToSubItems", selectedMetas); - - // Render opaque outline objects first in DeferredBuffer - const auto outlineInputs = DrawStateSortDeferred::Inputs(outlinedItems, lightingModel).asVarying(); - task.addJob("DrawOutlinedDepth", outlineInputs, shapePlumber); - - // Retrieve z value of the outlined objects - const auto outlinePrepareInputs = PrepareOutline::Inputs(outlinedItems, deferredFramebuffer).asVarying(); - const auto outlinedFrameBuffer = task.addJob("PrepareOutline", outlinePrepareInputs); // Render opaque objects in DeferredBuffer const auto opaqueInputs = DrawStateSortDeferred::Inputs(opaques, lightingModel).asVarying(); @@ -173,12 +163,11 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto toneAndPostRangeTimer = task.addJob("BeginToneAndPostRangeTimer", "PostToneOverlaysAntialiasing"); // Lighting Buffer ready for tone mapping - const auto toneMappingInputs = render::Varying(ToneMappingDeferred::Inputs(lightingFramebuffer, primaryFramebuffer)); + const auto toneMappingInputs = ToneMappingDeferred::Inputs(lightingFramebuffer, primaryFramebuffer).asVarying(); task.addJob("ToneMapping", toneMappingInputs); - // Draw outline - const auto drawOutlineInputs = DrawOutline::Inputs(deferredFrameTransform, deferredFramebuffer, outlinedFrameBuffer, primaryFramebuffer).asVarying(); - task.addJob("DrawOutline", drawOutlineInputs); + const auto outlineInputs = DrawOutlineTask::Inputs(selectedMetas, shapePlumber, lightingModel, deferredFramebuffer, primaryFramebuffer, deferredFrameTransform).asVarying(); + task.addJob("DrawOutline", outlineInputs); { // DEbug the bounds of the rendered items, still look at the zbuffer task.addJob("DrawMetaBounds", metas); @@ -213,9 +202,6 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto debugAmbientOcclusionInputs = DebugAmbientOcclusion::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget, ambientOcclusionUniforms).asVarying(); task.addJob("DebugAmbientOcclusion", debugAmbientOcclusionInputs); - // Debug outline - task.addJob("DebugOutline", outlinedFrameBuffer); - // Scene Octree Debugging job { task.addJob("DrawSceneOctree", spatialSelection); diff --git a/libraries/render/src/task/Varying.h b/libraries/render/src/task/Varying.h index 0144801701..9ce234061e 100644 --- a/libraries/render/src/task/Varying.h +++ b/libraries/render/src/task/Varying.h @@ -238,6 +238,24 @@ public: const T5& get5() const { return std::get<5>((*this)).template get(); } T5& edit5() { return std::get<5>((*this)).template edit(); } + virtual Varying operator[] (uint8_t index) const { + switch (index) { + default: + return std::get<0>((*this)); + case 1: + return std::get<1>((*this)); + case 2: + return std::get<2>((*this)); + case 3: + return std::get<3>((*this)); + case 4: + return std::get<4>((*this)); + case 5: + return std::get<5>((*this)); + }; + } + virtual uint8_t length() const { return 6; } + Varying asVarying() const { return Varying((*this)); } };