From 87833abd31160a610f2e538916c654ae6b4a25ae Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 30 Jun 2017 16:46:25 +0200 Subject: [PATCH] Sky working again. --- libraries/render-utils/src/Fade.slh | 5 +- libraries/render-utils/src/FadeEffect.cpp | 138 ++++++++++++------ libraries/render-utils/src/FadeEffect.h | 53 +++---- .../render-utils/src/RenderDeferredTask.cpp | 52 +++---- .../render-utils/src/RenderForwardTask.cpp | 16 +- libraries/render/src/render/FilterTask.cpp | 2 +- .../src/render/RenderFetchCullSortTask.cpp | 2 +- .../src/render/RenderFetchCullSortTask.h | 4 +- libraries/render/src/task/Varying.h | 14 +- 9 files changed, 169 insertions(+), 117 deletions(-) diff --git a/libraries/render-utils/src/Fade.slh b/libraries/render-utils/src/Fade.slh index 5ee7bb2178..e3a801ff8b 100644 --- a/libraries/render-utils/src/Fade.slh +++ b/libraries/render-utils/src/Fade.slh @@ -90,11 +90,10 @@ float evalFadeGradient(vec3 position) { } float evalFadeAlpha(vec3 position) { -/* float edgeWidth = fadeParameters[fadeCategory]._edgeWidthInvWidth.x; + float edgeWidth = fadeParameters[fadeCategory]._edgeWidthInvWidth.x; float cutoff = mix(-edgeWidth, 1.0+edgeWidth, fadeThreshold); - return evalFadeGradient(position)-cutoff;*/ - return evalFadeNoiseGradient(position)-fadeThreshold; + return evalFadeGradient(position)-cutoff; } void applyFadeClip(vec3 position) { diff --git a/libraries/render-utils/src/FadeEffect.cpp b/libraries/render-utils/src/FadeEffect.cpp index 7c975ef201..82dc684d2f 100644 --- a/libraries/render-utils/src/FadeEffect.cpp +++ b/libraries/render-utils/src/FadeEffect.cpp @@ -6,24 +6,32 @@ #include #include -#define FADE_MIN_SCALE 0.001f -#define FADE_MAX_SCALE 100000.f +#define FADE_MIN_SCALE 0.001 +#define FADE_MAX_SCALE 10000.0 + +inline float parameterToValuePow(float parameter, const double minValue, const double maxOverMinValue) { + return (float)(minValue * pow(maxOverMinValue, parameter)); +} + +inline float valueToParameterPow(float value, const double minValue, const double maxOverMinValue) { + return (float)(log(value / minValue) / log(maxOverMinValue)); +} void FadeSwitchJob::configure(const Config& config) { _parameters->_isEditEnabled = config.editFade; } void FadeSwitchJob::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { - auto& normalOutputs = output.edit0(); + auto& normalOutputs = output.edit0().edit0(); auto& fadeOutputs = output.edit1(); // Only shapes are affected by fade at this time. - normalOutputs[RenderFetchCullSortTask::LIGHT] = input[RenderFetchCullSortTask::LIGHT]; - normalOutputs[RenderFetchCullSortTask::META] = input[RenderFetchCullSortTask::META]; - normalOutputs[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE] = input[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - normalOutputs[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE] = input[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; - normalOutputs[RenderFetchCullSortTask::BACKGROUND] = input[RenderFetchCullSortTask::BACKGROUND]; - normalOutputs[RenderFetchCullSortTask::SPATIAL_SELECTION] = input[RenderFetchCullSortTask::SPATIAL_SELECTION]; + normalOutputs[RenderFetchCullSortTask::LIGHT].edit() = input.get0()[RenderFetchCullSortTask::LIGHT].get(); + normalOutputs[RenderFetchCullSortTask::META].edit() = input.get0()[RenderFetchCullSortTask::META].get(); + normalOutputs[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE].edit() = input.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE].get(); + normalOutputs[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE].edit() = input.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE].get(); + normalOutputs[RenderFetchCullSortTask::BACKGROUND].edit() = input.get0()[RenderFetchCullSortTask::BACKGROUND].get(); + output.edit0().edit1() = input.get1(); // Find the nearest item that intersects the view direction const render::Item* editedItem = nullptr; @@ -32,16 +40,20 @@ void FadeSwitchJob::run(const render::RenderContextPointer& renderContext, const float nearestTransparentDistance = std::numeric_limits::max(); const render::Item* nearestItem; - editedItem = findNearestItem(renderContext, input[RenderFetchCullSortTask::OPAQUE_SHAPE], nearestOpaqueDistance); - nearestItem = findNearestItem(renderContext, input[RenderFetchCullSortTask::TRANSPARENT_SHAPE], nearestTransparentDistance); + editedItem = findNearestItem(renderContext, input.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE], nearestOpaqueDistance); + nearestItem = findNearestItem(renderContext, input.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE], nearestTransparentDistance); if (nearestTransparentDistance < nearestOpaqueDistance) { editedItem = nearestItem; } + + if (editedItem) { + output.edit2() = editedItem->getBound(); + } } // Now, distribute items that need to be faded accross both outputs - distribute(renderContext, input[RenderFetchCullSortTask::OPAQUE_SHAPE], normalOutputs[RenderFetchCullSortTask::OPAQUE_SHAPE], fadeOutputs[OPAQUE_SHAPE], editedItem); - distribute(renderContext, input[RenderFetchCullSortTask::TRANSPARENT_SHAPE], normalOutputs[RenderFetchCullSortTask::TRANSPARENT_SHAPE], fadeOutputs[TRANSPARENT_SHAPE], editedItem); + distribute(renderContext, input.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE], normalOutputs[RenderFetchCullSortTask::OPAQUE_SHAPE], fadeOutputs[OPAQUE_SHAPE], editedItem); + distribute(renderContext, input.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE], normalOutputs[RenderFetchCullSortTask::TRANSPARENT_SHAPE], fadeOutputs[TRANSPARENT_SHAPE], editedItem); } const render::Item* FadeSwitchJob::findNearestItem(const render::RenderContextPointer& renderContext, const render::Varying& input, float& minIsectDistance) const { @@ -71,22 +83,21 @@ void FadeSwitchJob::distribute(const render::RenderContextPointer& renderContext render::Varying& normalOutput, render::Varying& fadeOutput, const render::Item* editedItem) const { auto& scene = renderContext->_scene; assert(_parameters); - const double fadeDuration = double(_parameters->_durations[FadeJobConfig::ELEMENT_ENTER_LEAVE_DOMAIN]) * USECS_PER_SECOND; const auto& inputItems = input.get(); // Clear previous values - normalOutput.template edit().clear(); - fadeOutput.template edit().clear(); + normalOutput.edit().clear(); + fadeOutput.edit().clear(); for (const auto& itemBound : inputItems) { auto& item = scene->getItem(itemBound.id); if (!item.mustFade() && &item!=editedItem) { // No need to fade - normalOutput.template edit().emplace_back(itemBound); + normalOutput.edit().emplace_back(itemBound); } else { - fadeOutput.template edit().emplace_back(itemBound); + fadeOutput.edit().emplace_back(itemBound); } } } @@ -108,30 +119,30 @@ float FadeJobConfig::getDuration() const { } void FadeJobConfig::setBaseSizeX(float value) { - baseSize[editedCategory].x = FADE_MIN_SCALE*powf(FADE_MAX_SCALE/ FADE_MIN_SCALE, value); + baseSize[editedCategory].x = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE/ FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getBaseSizeX() const { - return logf(baseSize[editedCategory].x / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(baseSize[editedCategory].x, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setBaseSizeY(float value) { - baseSize[editedCategory].y = FADE_MIN_SCALE*powf(FADE_MAX_SCALE / FADE_MIN_SCALE, value); + baseSize[editedCategory].y = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getBaseSizeY() const { - return logf(baseSize[editedCategory].y / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(baseSize[editedCategory].y, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setBaseSizeZ(float value) { - baseSize[editedCategory].z = FADE_MIN_SCALE*powf(FADE_MAX_SCALE / FADE_MIN_SCALE, value); + baseSize[editedCategory].z = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getBaseSizeZ() const { - return logf(baseSize[editedCategory].z / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(baseSize[editedCategory].z, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setBaseLevel(float value) { @@ -149,30 +160,30 @@ bool FadeJobConfig::isBaseInverted() const { } void FadeJobConfig::setNoiseSizeX(float value) { - noiseSize[editedCategory].x = FADE_MIN_SCALE*powf(FADE_MAX_SCALE / FADE_MIN_SCALE, value); + noiseSize[editedCategory].x = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getNoiseSizeX() const { - return logf(noiseSize[editedCategory].x / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(noiseSize[editedCategory].x, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setNoiseSizeY(float value) { - noiseSize[editedCategory].y = FADE_MIN_SCALE*powf(FADE_MAX_SCALE / FADE_MIN_SCALE, value); + noiseSize[editedCategory].y = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getNoiseSizeY() const { - return logf(noiseSize[editedCategory].y / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(noiseSize[editedCategory].y, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setNoiseSizeZ(float value) { - noiseSize[editedCategory].z = FADE_MIN_SCALE*powf(FADE_MAX_SCALE / FADE_MIN_SCALE, value); + noiseSize[editedCategory].z = parameterToValuePow(value, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); emit dirty(); } float FadeJobConfig::getNoiseSizeZ() const { - return logf(noiseSize[editedCategory].z / FADE_MIN_SCALE) / logf(FADE_MAX_SCALE / FADE_MIN_SCALE); + return valueToParameterPow(noiseSize[editedCategory].z, FADE_MIN_SCALE, FADE_MAX_SCALE / FADE_MIN_SCALE); } void FadeJobConfig::setNoiseLevel(float value) { @@ -251,7 +262,7 @@ void FadeConfigureJob::configure(const Config& config) { configuration._noiseInvSizeAndLevel.y = 1.f / config.noiseSize[i].y; configuration._noiseInvSizeAndLevel.z = 1.f / config.noiseSize[i].z; configuration._noiseInvSizeAndLevel.w = config.noiseLevel[i]; - configuration._invertBase = config.baseInverted[i]; + configuration._invertBase = config.baseInverted[i] & 1; configuration._edgeWidthInvWidth.x = config.edgeWidth[i]; configuration._edgeWidthInvWidth.y = 1.f / configuration._edgeWidthInvWidth.x; configuration._innerEdgeColor = config.edgeInnerColor[i]; @@ -260,10 +271,13 @@ void FadeConfigureJob::configure(const Config& config) { _isBufferDirty = true; } -void FadeConfigureJob::run(const render::RenderContextPointer& renderContext, Output& output) { - if (_isBufferDirty) { +void FadeConfigureJob::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { + if (_isBufferDirty || _parameters->_isEditEnabled) { auto& configurations = output.edit1().edit(); std::copy(_configurations, _configurations + FadeJobConfig::EVENT_CATEGORY_COUNT, configurations.parameters); + if (_parameters->_editedCategory == FadeJobConfig::USER_ENTER_LEAVE_DOMAIN) { + configurations.parameters[FadeJobConfig::USER_ENTER_LEAVE_DOMAIN]._baseInvSizeAndLevel.y = 2.f / input.getDimensions().y; + } _isBufferDirty = false; } output.edit0() = _fadeMaskMap; @@ -290,14 +304,6 @@ void FadeRenderJob::run(const render::RenderContextPointer& renderContext, const defaultKeyBuilder.withFade(); - // Update interactive edit effect - if (_parameters->_isEditEnabled) { - updateFadeEdit(); - } - else { - _editStartTime = 0; - } - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; @@ -306,6 +312,14 @@ void FadeRenderJob::run(const render::RenderContextPointer& renderContext, const _currentFadeMaskMap = fadeMaskMap; _currentFadeBuffer = &fadeParamBuffer; + // Update interactive edit effect + if (_parameters->_isEditEnabled) { + updateFadeEdit(inItems.front()); + } + else { + _editStartTime = 0; + } + // Setup camera, projection and viewport for all items batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); @@ -365,18 +379,18 @@ float FadeRenderJob::computeFadePercent(quint64 startTime) { return _currentInstance->computeElementEnterThreshold(time); } -void FadeRenderJob::updateFadeEdit() { +void FadeRenderJob::updateFadeEdit(const render::ItemBound& itemBounds) { if (_editStartTime == 0) { _editStartTime = usecTimestampNow(); } const double time = (int64_t(usecTimestampNow()) - int64_t(_editStartTime)) / double(USECS_PER_SECOND); + const float eventDuration = _parameters->_durations[_parameters->_editedCategory]; switch (_parameters->_editedCategory) { case FadeJobConfig::ELEMENT_ENTER_LEAVE_DOMAIN: { const double waitTime = 0.5; // Wait between fade in and out - const float eventDuration = _parameters->_durations[FadeJobConfig::ELEMENT_ENTER_LEAVE_DOMAIN]; double cycleTime = fmod(time, (eventDuration+waitTime) * 2.0); if (cycleTime < eventDuration) { @@ -401,7 +415,35 @@ void FadeRenderJob::updateFadeEdit() { break; case FadeJobConfig::USER_ENTER_LEAVE_DOMAIN: - break; + { + const double waitTime = 0.5; // Wait between fade in and out + double cycleTime = fmod(time, (eventDuration + waitTime) * 2.0); + + _editNoiseOffset.x = time*0.5; + _editNoiseOffset.y = 0.f; + _editNoiseOffset.z = time*0.75; + + _editBaseOffset.x = 0.f; + _editBaseOffset.y = -itemBounds.bound.getDimensions().y; + _editBaseOffset.z = 0.f; + { + + } + + if (cycleTime < eventDuration) { + _editThreshold = 1.f - computeElementEnterThreshold(cycleTime); + } + else if (cycleTime < (eventDuration + waitTime)) { + _editThreshold = 0.f; + } + else if (cycleTime < (2 * eventDuration + waitTime)) { + _editThreshold = computeElementEnterThreshold(cycleTime - (eventDuration + waitTime)); + } + else { + _editThreshold = 1.f; + } + } + break; case FadeJobConfig::AVATAR_CHANGE: break; @@ -443,6 +485,8 @@ bool FadeRenderJob::bindPerItem(gpu::Batch& batch, const gpu::Pipeline* pipeline if (fadeNoiseOffsetLocation >= 0 || fadeBaseOffsetLocation>=0 || fadeThresholdLocation >= 0 || fadeCategoryLocation>=0) { float threshold; int eventCategory = FadeJobConfig::ELEMENT_ENTER_LEAVE_DOMAIN; + glm::vec3 noiseOffset = offset; + glm::vec3 baseOffset = offset; threshold = 1.f-computeFadePercent(startTime); @@ -451,14 +495,16 @@ bool FadeRenderJob::bindPerItem(gpu::Batch& batch, const gpu::Pipeline* pipeline if (_currentInstance->_parameters->_isEditEnabled) { eventCategory = _currentInstance->_parameters->_editedCategory; threshold = _currentInstance->_editThreshold; + noiseOffset += _currentInstance->_editNoiseOffset; + baseOffset += _currentInstance->_editBaseOffset; } batch._glUniform1i(fadeCategoryLocation, eventCategory); batch._glUniform1f(fadeThresholdLocation, threshold); // This is really temporary - batch._glUniform3f(fadeNoiseOffsetLocation, offset.x, offset.y, offset.z); + batch._glUniform3f(fadeNoiseOffsetLocation, noiseOffset.x, noiseOffset.y, noiseOffset.z); // This is really temporary - batch._glUniform3f(fadeBaseOffsetLocation, offset.x, offset.y, offset.z); + batch._glUniform3f(fadeBaseOffsetLocation, baseOffset.x, baseOffset.y, baseOffset.z); return threshold > 0.f; } diff --git a/libraries/render-utils/src/FadeEffect.h b/libraries/render-utils/src/FadeEffect.h index 122449e08a..dce5687151 100644 --- a/libraries/render-utils/src/FadeEffect.h +++ b/libraries/render-utils/src/FadeEffect.h @@ -126,15 +126,29 @@ public: float getEdgeOuterIntensity() const { return edgeOuterColor[editedCategory].a; } int editedCategory{ ELEMENT_ENTER_LEAVE_DOMAIN }; - glm::vec3 baseSize[EVENT_CATEGORY_COUNT]{ - { 0.4f, 0.4f, 0.4f }, // ELEMENT_ENTER_LEAVE_DOMAIN + glm::vec3 noiseSize[EVENT_CATEGORY_COUNT]{ + { 1.f, 1.f, 1.f }, // ELEMENT_ENTER_LEAVE_DOMAIN { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_OWNER { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_TRESPASSER - { 0.875f, 0.4f, 0.875f }, // USER_ENTER_LEAVE_DOMAIN + { 10.f, 0.01f, 10.0f }, // USER_ENTER_LEAVE_DOMAIN + { 0.4f, 0.4f, 0.4f }, // AVATAR_CHANGE + }; + float noiseLevel[EVENT_CATEGORY_COUNT]{ + 1.0f, // ELEMENT_ENTER_LEAVE_DOMAIN + 1.0f, // BUBBLE_ISECT_OWNER + 1.0f, // BUBBLE_ISECT_TRESPASSER + 0.70f, // USER_ENTER_LEAVE_DOMAIN + 1.0f, // AVATAR_CHANGE + }; + glm::vec3 baseSize[EVENT_CATEGORY_COUNT]{ + { 1.0f, 1.0f, 1.0f }, // ELEMENT_ENTER_LEAVE_DOMAIN + { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_OWNER + { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_TRESPASSER + { 10000.f, 1.0f, 10000.0f }, // USER_ENTER_LEAVE_DOMAIN { 0.4f, 0.4f, 0.4f }, // AVATAR_CHANGE }; float baseLevel[EVENT_CATEGORY_COUNT]{ - 1.0f, // ELEMENT_ENTER_LEAVE_DOMAIN + 0.0f, // ELEMENT_ENTER_LEAVE_DOMAIN 1.0f, // BUBBLE_ISECT_OWNER 1.0f, // BUBBLE_ISECT_TRESPASSER 1.0f, // USER_ENTER_LEAVE_DOMAIN @@ -147,20 +161,6 @@ public: true, // USER_ENTER_LEAVE_DOMAIN false, // AVATAR_CHANGE }; - glm::vec3 noiseSize[EVENT_CATEGORY_COUNT]{ - { 0.41f, 0.41f, 0.41f }, // ELEMENT_ENTER_LEAVE_DOMAIN - { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_OWNER - { 0.4f, 0.4f, 0.4f }, // BUBBLE_ISECT_TRESPASSER - { 0.4f, 0.4f, 0.4f }, // USER_ENTER_LEAVE_DOMAIN - { 0.4f, 0.4f, 0.4f }, // AVATAR_CHANGE - }; - float noiseLevel[EVENT_CATEGORY_COUNT]{ - 1.0f, // ELEMENT_ENTER_LEAVE_DOMAIN - 1.0f, // BUBBLE_ISECT_OWNER - 1.0f, // BUBBLE_ISECT_TRESPASSER - 1.0f, // USER_ENTER_LEAVE_DOMAIN - 1.0f, // AVATAR_CHANGE - }; float _duration[EVENT_CATEGORY_COUNT]{ 4.0f, // ELEMENT_ENTER_LEAVE_DOMAIN 0.0f, // BUBBLE_ISECT_OWNER @@ -172,21 +172,21 @@ public: 0.10f, // ELEMENT_ENTER_LEAVE_DOMAIN 0.10f, // BUBBLE_ISECT_OWNER 0.10f, // BUBBLE_ISECT_TRESPASSER - 0.10f, // USER_ENTER_LEAVE_DOMAIN + 0.529f, // USER_ENTER_LEAVE_DOMAIN 0.05f, // AVATAR_CHANGE }; glm::vec4 edgeInnerColor[EVENT_CATEGORY_COUNT]{ { 78.f / 255.f, 215.f / 255.f, 255.f / 255.f, 0.0f }, // ELEMENT_ENTER_LEAVE_DOMAIN { 31.f / 255.f, 198.f / 255.f, 166.f / 255.f, 1.0f }, // BUBBLE_ISECT_OWNER { 1.0f, 1.0f, 1.0f, 1.0f }, // BUBBLE_ISECT_TRESPASSER - { 1.0f, 1.0f, 1.0f, 1.0f }, // USER_ENTER_LEAVE_DOMAIN + { 78.f / 255.f, 215.f / 255.f, 255.f / 255.f, 0.25f }, // USER_ENTER_LEAVE_DOMAIN { 1.0f, 1.0f, 1.0f, 1.0f }, // AVATAR_CHANGE }; glm::vec4 edgeOuterColor[EVENT_CATEGORY_COUNT]{ { 78.f / 255.f, 215.f / 255.f, 255.f / 255.f, 1.0f }, // ELEMENT_ENTER_LEAVE_DOMAIN { 31.f / 255.f, 198.f / 255.f, 166.f / 255.f, 1.0f }, // BUBBLE_ISECT_OWNER { 1.0f, 1.0f, 1.0f, 1.0f }, // BUBBLE_ISECT_TRESPASSER - { 1.0f, 1.0f, 1.0f, 1.0f }, // USER_ENTER_LEAVE_DOMAIN + { 78.f / 255.f, 215.f / 255.f, 255.f / 255.f, 1.0f }, // USER_ENTER_LEAVE_DOMAIN { 1.0f, 1.0f, 1.0f, 1.0f }, // AVATAR_CHANGE }; @@ -224,7 +224,7 @@ public: using FadeOutput = render::VaryingArray; using Input = RenderFetchCullSortTask::Output; - using Output = render::VaryingSet2; + using Output = render::VaryingSet3 < RenderFetchCullSortTask::Output, FadeOutput, render::Item::Bound > ; using Config = FadeSwitchJobConfig; using JobModel = render::Job::ModelIO; @@ -263,16 +263,17 @@ class FadeConfigureJob { public: using UniformBuffer = gpu::StructBuffer; + using Input = render::Item::Bound ; using Output = render::VaryingSet2; using Config = FadeJobConfig; - using JobModel = render::Job::ModelO; + using JobModel = render::Job::ModelIO; FadeConfigureJob(FadeCommonParameters::Pointer commonParams); const gpu::TexturePointer getFadeMaskMap() const { return _fadeMaskMap; } void configure(const Config& config); - void run(const render::RenderContextPointer& renderContext, Output& output); + void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output); private: @@ -316,8 +317,10 @@ private: // Everything needed for interactive edition uint64_t _editStartTime{ 0 }; float _editThreshold{ 0.f }; + glm::vec3 _editNoiseOffset{ 0.f, 0.f, 0.f }; + glm::vec3 _editBaseOffset{ 0.f, 0.f, 0.f }; - void updateFadeEdit(); + void updateFadeEdit(const render::ItemBound& itemBounds); }; #endif // hifi_FadeEffect_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index ca7f4a10d9..aa62038bb6 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -55,24 +55,26 @@ void RenderDeferredTask::configure(const Config& config) void RenderDeferredTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { auto commonFadeParameters = std::make_shared(); const auto fadeSwitchOutputs = task.addJob("FadeSwitch", input, commonFadeParameters).get(); - const auto fadeConfigureOutputs = task.addJob("FadeConfigure", commonFadeParameters).get(); const auto& items = fadeSwitchOutputs.get0(); const auto& fadeItems = fadeSwitchOutputs.get1(); + const auto& fadeEditedItem = fadeSwitchOutputs[2]; + + const auto fadeConfigureOutputs = task.addJob("FadeConfigure", fadeEditedItem, commonFadeParameters).get(); // Prepare the ShapePipelines ShapePlumberPointer shapePlumber = std::make_shared(); initDeferredPipelines(*shapePlumber); // Extract opaques / transparents / lights / metas / overlays / background - const auto opaques = items[RenderFetchCullSortTask::OPAQUE_SHAPE]; - const auto transparents = items[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; - const auto lights = items[RenderFetchCullSortTask::LIGHT]; - const auto metas = items[RenderFetchCullSortTask::META]; - const auto overlayOpaques = items[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - const auto overlayTransparents = items[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; - const auto background = items[RenderFetchCullSortTask::BACKGROUND]; - const auto spatialSelection = items[RenderFetchCullSortTask::SPATIAL_SELECTION]; + const auto& opaques = items.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE]; + const auto& transparents = items.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; + const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT]; + const auto& metas = items.get0()[RenderFetchCullSortTask::META]; + const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; + const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; + const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND]; + const auto& spatialSelection = items[1]; // Filter the non antialiaased overlays const int LAYER_NO_AA = 3; @@ -87,7 +89,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto opaqueRangeTimer = task.addJob("BeginOpaqueRangeTimer", "DrawOpaques"); - const auto prepareDeferredInputs = PrepareDeferred::Inputs(primaryFramebuffer, lightingModel).hasVarying(); + const auto prepareDeferredInputs = PrepareDeferred::Inputs(primaryFramebuffer, lightingModel).asVarying(); const auto prepareDeferredOutputs = task.addJob("PrepareDeferred", prepareDeferredInputs); const auto deferredFramebuffer = prepareDeferredOutputs.getN(0); const auto lightingFramebuffer = prepareDeferredOutputs.getN(1); @@ -96,11 +98,11 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("PrepareStencil", primaryFramebuffer); // Render opaque objects in DeferredBuffer - const auto opaqueInputs = DrawStateSortDeferred::Inputs(opaques, lightingModel).hasVarying(); + const auto opaqueInputs = DrawStateSortDeferred::Inputs(opaques, lightingModel).asVarying(); task.addJob("DrawOpaqueDeferred", opaqueInputs, shapePlumber); const auto fadeOpaques = fadeItems[FadeSwitchJob::OPAQUE_SHAPE]; - const auto fadeOpaqueInputs = FadeRenderJob::Input(fadeOpaques, lightingModel, fadeConfigureOutputs).hasVarying(); + const auto fadeOpaqueInputs = FadeRenderJob::Input(fadeOpaques, lightingModel, fadeConfigureOutputs).asVarying(); task.addJob("DrawFadeOpaque", fadeOpaqueInputs, commonFadeParameters, shapePlumber); @@ -110,12 +112,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Opaque all rendered // Linear Depth Pass - const auto linearDepthPassInputs = LinearDepthPass::Inputs(deferredFrameTransform, deferredFramebuffer).hasVarying(); + const auto linearDepthPassInputs = LinearDepthPass::Inputs(deferredFrameTransform, deferredFramebuffer).asVarying(); const auto linearDepthPassOutputs = task.addJob("LinearDepth", linearDepthPassInputs); const auto linearDepthTarget = linearDepthPassOutputs.getN(0); // Curvature pass - const auto surfaceGeometryPassInputs = SurfaceGeometryPass::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).hasVarying(); + const auto surfaceGeometryPassInputs = SurfaceGeometryPass::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).asVarying(); const auto surfaceGeometryPassOutputs = task.addJob("SurfaceGeometry", surfaceGeometryPassInputs); const auto surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN(0); const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN(1); @@ -126,7 +128,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto scatteringResource = task.addJob("Scattering"); // AO job - const auto ambientOcclusionInputs = AmbientOcclusionEffect::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).hasVarying(); + const auto ambientOcclusionInputs = AmbientOcclusionEffect::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).asVarying(); const auto ambientOcclusionOutputs = task.addJob("AmbientOcclusion", ambientOcclusionInputs); const auto ambientOcclusionFramebuffer = ambientOcclusionOutputs.getN(0); const auto ambientOcclusionUniforms = ambientOcclusionOutputs.getN(1); @@ -140,13 +142,13 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Light Clustering // Create the cluster grid of lights, cpu job for now - const auto lightClusteringPassInputs = LightClusteringPass::Inputs(deferredFrameTransform, lightingModel, linearDepthTarget).hasVarying(); + const auto lightClusteringPassInputs = LightClusteringPass::Inputs(deferredFrameTransform, lightingModel, linearDepthTarget).asVarying(); const auto lightClusters = task.addJob("LightClustering", lightClusteringPassInputs); // DeferredBuffer is complete, now let's shade it into the LightingBuffer const auto deferredLightingInputs = RenderDeferred::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, - surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource, lightClusters).hasVarying(); + surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource, lightClusters).asVarying(); task.addJob("RenderDeferred", deferredLightingInputs); @@ -154,16 +156,16 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawBackgroundDeferred", lightingModel); // Render transparent objects forward in LightingBuffer - const auto transparentsInputs = DrawDeferred::Inputs(transparents, lightingModel).hasVarying(); + const auto transparentsInputs = DrawDeferred::Inputs(transparents, lightingModel).asVarying(); task.addJob("DrawTransparentDeferred", transparentsInputs, shapePlumber); const auto fadeTransparents = fadeItems[FadeSwitchJob::TRANSPARENT_SHAPE]; - const auto fadeTransparentInputs = FadeRenderJob::Input(fadeTransparents, lightingModel, fadeConfigureOutputs).hasVarying(); + const auto fadeTransparentInputs = FadeRenderJob::Input(fadeTransparents, lightingModel, fadeConfigureOutputs).asVarying(); task.addJob("DrawFadeTransparent", fadeTransparentInputs, commonFadeParameters, shapePlumber); // LIght Cluster Grid Debuging job { - const auto debugLightClustersInputs = DebugLightClusters::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, linearDepthTarget, lightClusters).hasVarying(); + const auto debugLightClustersInputs = DebugLightClusters::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, linearDepthTarget, lightClusters).asVarying(); task.addJob("DebugLightClusters", debugLightClustersInputs); } @@ -184,8 +186,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren } // Overlays - const auto overlayOpaquesInputs = DrawOverlay3D::Inputs(overlayOpaques, lightingModel).hasVarying(); - const auto overlayTransparentsInputs = DrawOverlay3D::Inputs(overlayTransparents, lightingModel).hasVarying(); + const auto overlayOpaquesInputs = DrawOverlay3D::Inputs(overlayOpaques, lightingModel).asVarying(); + const auto overlayTransparentsInputs = DrawOverlay3D::Inputs(overlayTransparents, lightingModel).asVarying(); task.addJob("DrawOverlay3DOpaque", overlayOpaquesInputs, true); task.addJob("DrawOverlay3DTransparent", overlayTransparentsInputs, false); @@ -201,10 +203,10 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DebugDeferredBuffer", debugFramebuffers); const auto debugSubsurfaceScatteringInputs = DebugSubsurfaceScattering::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, - surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource).hasVarying(); + surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource).asVarying(); task.addJob("DebugScattering", debugSubsurfaceScatteringInputs); - const auto debugAmbientOcclusionInputs = DebugAmbientOcclusion::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget, ambientOcclusionUniforms).hasVarying(); + const auto debugAmbientOcclusionInputs = DebugAmbientOcclusion::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget, ambientOcclusionUniforms).asVarying(); task.addJob("DebugAmbientOcclusion", debugAmbientOcclusionInputs); // Scene Octree Debugging job @@ -229,7 +231,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("Antialiasing", primaryFramebuffer); // Draw 2DWeb non AA - const auto nonAAOverlaysInputs = DrawOverlay3D::Inputs(nonAAOverlays, lightingModel).hasVarying(); + const auto nonAAOverlaysInputs = DrawOverlay3D::Inputs(nonAAOverlays, lightingModel).asVarying(); task.addJob("Draw2DWebSurfaces", nonAAOverlaysInputs, false); task.addJob("ToneAndPostRangeTimer", toneAndPostRangeTimer); diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index a77d741aa5..ef9cfe8613 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -36,14 +36,14 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend initForwardPipelines(*shapePlumber); // Extract opaques / transparents / lights / metas / overlays / background - const auto opaques = items[RenderFetchCullSortTask::OPAQUE_SHAPE]; - const auto transparents = items[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; - const auto lights = items[RenderFetchCullSortTask::LIGHT]; - const auto metas = items[RenderFetchCullSortTask::META]; - const auto overlayOpaques = items[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - const auto overlayTransparents = items[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; - const auto background = items[RenderFetchCullSortTask::BACKGROUND]; - const auto spatialSelection = items[RenderFetchCullSortTask::SPATIAL_SELECTION]; + const auto& opaques = items.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE]; + const auto& transparents = items.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; + const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT]; + const auto& metas = items.get0()[RenderFetchCullSortTask::META]; + const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; + const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; + const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND]; + const auto& spatialSelection = items[1]; const auto framebuffer = task.addJob("PrepareFramebuffer"); diff --git a/libraries/render/src/render/FilterTask.cpp b/libraries/render/src/render/FilterTask.cpp index f6b765cd9d..19953f3399 100644 --- a/libraries/render/src/render/FilterTask.cpp +++ b/libraries/render/src/render/FilterTask.cpp @@ -28,7 +28,7 @@ void FilterLayeredItems::run(const RenderContextPointer& renderContext, const It outItems.clear(); // For each item, filter it into one bucket - for (auto itemBound : inItems) { + for (auto& itemBound : inItems) { auto& item = scene->getItem(itemBound.id); if (item.getLayer() == _keepLayer) { outItems.emplace_back(itemBound); diff --git a/libraries/render/src/render/RenderFetchCullSortTask.cpp b/libraries/render/src/render/RenderFetchCullSortTask.cpp index 6e5d723ce6..b9f65f48a0 100644 --- a/libraries/render/src/render/RenderFetchCullSortTask.cpp +++ b/libraries/render/src/render/RenderFetchCullSortTask.cpp @@ -65,5 +65,5 @@ void RenderFetchCullSortTask::build(JobModel& task, const Varying& input, Varyin const auto overlayTransparents = task.addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; - output = Output{opaques, transparents, lights, metas, overlayOpaques, overlayTransparents, background, spatialSelection}; + output = Output(BucketList{ opaques, transparents, lights, metas, overlayOpaques, overlayTransparents, background }, spatialSelection); } diff --git a/libraries/render/src/render/RenderFetchCullSortTask.h b/libraries/render/src/render/RenderFetchCullSortTask.h index f3f326aae8..b25480ae3a 100644 --- a/libraries/render/src/render/RenderFetchCullSortTask.h +++ b/libraries/render/src/render/RenderFetchCullSortTask.h @@ -26,12 +26,12 @@ public: OVERLAY_OPAQUE_SHAPE, OVERLAY_TRANSPARENT_SHAPE, BACKGROUND, - SPATIAL_SELECTION, NUM_BUCKETS }; - using Output = render::VaryingArray; + using BucketList = render::VaryingArray; + using Output = render::VaryingSet2; using JobModel = render::Task::ModelO; RenderFetchCullSortTask() {} diff --git a/libraries/render/src/task/Varying.h b/libraries/render/src/task/Varying.h index d5021383fb..c9eb78fd71 100644 --- a/libraries/render/src/task/Varying.h +++ b/libraries/render/src/task/Varying.h @@ -40,6 +40,8 @@ public: template Varying getN (uint8_t index) const { return get()[index]; } template Varying editN (uint8_t index) { return edit()[index]; } + bool isNull() const { return _concept == nullptr; } + protected: class Concept { public: @@ -93,7 +95,7 @@ public: } virtual uint8_t length() const { return 2; } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } }; @@ -126,7 +128,7 @@ public: } virtual uint8_t length() const { return 3; } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } }; template @@ -163,7 +165,7 @@ public: } virtual uint8_t length() const { return 4; } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } }; @@ -206,7 +208,7 @@ public: } virtual uint8_t length() const { return 5; } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } }; template @@ -236,7 +238,7 @@ public: const T5& get5() const { return std::get<5>((*this)).template get(); } T5& edit5() { return std::get<5>((*this)).template edit(); } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } }; template @@ -269,7 +271,7 @@ public: const T6& get6() const { return std::get<6>((*this)).template get(); } T6& edit6() { return std::get<6>((*this)).template edit(); } - Varying hasVarying() const { return Varying((*this)); } + Varying asVarying() const { return Varying((*this)); } };