From c60bfe2b655a18911609b07c63b6bd8acbf3b13e Mon Sep 17 00:00:00 2001 From: samcake Date: Sat, 10 Jun 2017 18:42:57 -0700 Subject: [PATCH 01/45] Adding a camera Jittering --- .../render-utils/src/AntialiasingEffect.cpp | 183 +++++++++++++++++- .../render-utils/src/AntialiasingEffect.h | 75 +++++++ .../render-utils/src/RenderDeferredTask.cpp | 2 + libraries/render-utils/src/fxaa.slf | 7 +- libraries/render-utils/src/fxaa_blend.slf | 4 +- 5 files changed, 265 insertions(+), 6 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index f7881b0333..c5ec6b0f6e 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include "AntialiasingEffect.h" #include "StencilMaskPass.h" @@ -23,7 +24,7 @@ #include "DependencyManager.h" #include "ViewFrustum.h" #include "GeometryCache.h" - +/* #include "fxaa_vert.h" #include "fxaa_frag.h" #include "fxaa_blend_frag.h" @@ -170,3 +171,183 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); }); } +*/ + +#include "fxaa_vert.h" +#include "fxaa_frag.h" +#include "fxaa_blend_frag.h" + + +Antialiasing::Antialiasing() { + _geometryId = DependencyManager::get()->allocateID(); +} + +Antialiasing::~Antialiasing() { + auto geometryCache = DependencyManager::get(); + if (geometryCache) { + geometryCache->releaseID(_geometryId); + } +} + +const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { + int width = DependencyManager::get()->getFrameBufferSize().width(); + int height = DependencyManager::get()->getFrameBufferSize().height(); + + if (_antialiasingBuffer && _antialiasingBuffer->getSize() != uvec2(width, height)) { + _antialiasingBuffer.reset(); + } + + if (!_antialiasingBuffer) { + // Link the antialiasing FBO to texture + _antialiasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); + auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + _antialiasingTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); + _antialiasingBuffer->setRenderBuffer(0, _antialiasingTexture); + } + + if (!_antialiasingPipeline) { + + auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); + auto ps = gpu::Shader::createPixel(std::string(fxaa_frag)); + gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); + + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); + + gpu::Shader::makeProgram(*program, slotBindings); + + _texcoordOffsetLoc = program->getUniforms().findLocation("texcoordOffset"); + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + PrepareStencil::testMask(*state); + + state->setDepthTest(false, false, gpu::LESS_EQUAL); + state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA ); + + // Good to go add the brand new pipeline + _antialiasingPipeline = gpu::Pipeline::create(program, state); + } + + return _antialiasingPipeline; +} + +const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { + if (!_blendPipeline) { + auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); + auto ps = gpu::Shader::createPixel(std::string(fxaa_blend_frag)); + gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); + + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); + + gpu::Shader::makeProgram(*program, slotBindings); + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + state->setDepthTest(false, false, gpu::LESS_EQUAL); + PrepareStencil::testMask(*state); + + // Good to go add the brand new pipeline + _blendPipeline = gpu::Pipeline::create(program, state); + } + return _blendPipeline; +} + +void Antialiasing::run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer) { + assert(renderContext->args); + assert(renderContext->args->hasViewFrustum()); + + RenderArgs* args = renderContext->args; + + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setViewportTransform(args->_viewport); + + // FIXME: NEED to simplify that code to avoid all the GeometryCahce call, this is purely pixel manipulation + auto framebufferCache = DependencyManager::get(); + QSize framebufferSize = framebufferCache->getFrameBufferSize(); + float fbWidth = framebufferSize.width(); + float fbHeight = framebufferSize.height(); + + + // FXAA step + batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); + batch.setFramebuffer(_antialiasingBuffer); + batch.setPipeline(getAntialiasingPipeline()); + + batch.draw(gpu::TRIANGLES, 4, 0); + + // initialize the view-space unpacking uniforms using frustum data + /* float left, right, bottom, top, nearVal, farVal; + glm::vec4 nearClipPlane, farClipPlane; + + args->getViewFrustum().computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + + // float depthScale = (farVal - nearVal) / farVal; + // float nearScale = -1.0f / nearVal; + // float depthTexCoordScaleS = (right - left) * nearScale / sWidth; + // float depthTexCoordScaleT = (top - bottom) * nearScale / tHeight; + // float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS; + // float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT; + + batch._glUniform2f(_texcoordOffsetLoc, 1.0f / fbWidth, 1.0f / fbHeight); + + glm::vec4 color(0.0f, 0.0f, 0.0f, 1.0f); + glm::vec2 bottomLeft(-1.0f, -1.0f); + glm::vec2 topRight(1.0f, 1.0f); + glm::vec2 texCoordTopLeft(0.0f, 0.0f); + glm::vec2 texCoordBottomRight(1.0f, 1.0f); + DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); + + */ + // Blend step + getBlendPipeline(); + batch.setResourceTexture(0, _antialiasingTexture); + batch.setFramebuffer(sourceBuffer); + batch.setPipeline(getBlendPipeline()); + + // DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); + batch.draw(gpu::TRIANGLES, 4, 0); + + }); +} + + + +void JitterSample::configure(const Config& config) { + _freeze = config.freeze; + _scale = config.scale; +} +void JitterSample::run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer) { + auto& current = _jitterBuffer.edit().currentIndex; + if (!_freeze) { + current = (current + 1) % SampleSequence::SEQUENCE_LENGTH; + } + auto viewFrustum = renderContext->args->getViewFrustum(); + auto projMat = viewFrustum.getProjection(); + auto theNear = viewFrustum.getNearClip(); + + auto jit = _scale * jitterBuffer.get().offsets[current]; + auto width = (float) renderContext->args->_viewport.z; + auto height = (float) renderContext->args->_viewport.w; + + auto oneOverRL = 0.5 * projMat[0][0] / theNear; + auto oneOverTB = 0.5 * projMat[1][1] / theNear; + + + auto jx = -4.0 * jit.x / width; + auto jy = -4.0 * jit.y / height; + + projMat[2][0] += jx; + projMat[2][1] += jy; + + viewFrustum.setProjection(projMat); + + renderContext->args->pushViewFrustum(viewFrustum); + + jitterBuffer = _jitterBuffer; +} + + diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index e403032b4e..a74c332b91 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -50,4 +50,79 @@ private: int _geometryId { 0 }; }; +/* +class AntiAliasingConfig : public render::Job::Config { + Q_OBJECT + Q_PROPERTY(bool enabled MEMBER enabled) +public: + AntiAliasingConfig() : render::Job::Config(true) {} +}; + +class Antialiasing { +public: + using Config = AntiAliasingConfig; + using JobModel = render::Job::ModelI; + + Antialiasing(); + ~Antialiasing(); + void configure(const Config& config) {} + void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); + + const gpu::PipelinePointer& getAntialiasingPipeline(); + const gpu::PipelinePointer& getBlendPipeline(); + +private: + + // Uniforms for AA + gpu::int32 _texcoordOffsetLoc; + + gpu::FramebufferPointer _antialiasingBuffer; + + gpu::TexturePointer _antialiasingTexture; + + gpu::PipelinePointer _antialiasingPipeline; + gpu::PipelinePointer _blendPipeline; + int _geometryId { 0 }; +}; +*/ +class JitterSampleConfig : public render::Job::Config { + Q_OBJECT + Q_PROPERTY(float scale MEMBER scale NOTIFY dirty) + Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) +public: + JitterSampleConfig() : render::Job::Config(true) {} + + float scale { 0.5f }; + bool freeze{ false }; +signals: + void dirty(); +}; + +class JitterSample { +public: + + struct SampleSequence { + static const int SEQUENCE_LENGTH { 4 }; + int sequenceLength{ SEQUENCE_LENGTH }; + int currentIndex { 0 }; + + glm::vec2 offsets[SEQUENCE_LENGTH] { { 1.0f, 1.0f},{ -1.0f, -1.0f}, { 1.0f, -1.0f}, { -1.0f, 1.0f} }; + }; + + using JitterBuffer = gpu::StructBuffer; + + using Config = JitterSampleConfig; + using JobModel = render::Job::ModelO; + + void configure(const Config& config); + void run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer); + + +private: + + JitterBuffer _jitterBuffer; + float _scale { 1.0 }; + bool _freeze { false }; +}; + #endif // hifi_AntialiasingEffect_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 1b99fe92ee..34e7eedad0 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -72,6 +72,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); const auto lightingModel = task.addJob("LightingModel"); + + const auto jitterBuffer = task.addJob("JitterCam"); // GPU jobs: Start preparing the primary, deferred and lighting buffer const auto primaryFramebuffer = task.addJob("PreparePrimaryBuffer"); diff --git a/libraries/render-utils/src/fxaa.slf b/libraries/render-utils/src/fxaa.slf index 7b241a3ebf..fce9f3b05f 100644 --- a/libraries/render-utils/src/fxaa.slf +++ b/libraries/render-utils/src/fxaa.slf @@ -25,11 +25,12 @@ precision mediump int; uniform sampler2D colorTexture; uniform vec2 texcoordOffset; -in vec2 varTexcoord; +in vec2 varTexCoord0; out vec4 outFragColor; void main() { - // filter width limit for dependent "two-tap" texture samples + outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 0.3); + /* // filter width limit for dependent "two-tap" texture samples float FXAA_SPAN_MAX = 8.0; // local contrast multiplier for performing AA @@ -90,5 +91,5 @@ void main() { } else { outFragColor.xyz=rgbB; } - outFragColor.a = 1.0; + outFragColor.a = 1.0;*/ } diff --git a/libraries/render-utils/src/fxaa_blend.slf b/libraries/render-utils/src/fxaa_blend.slf index d5819cc9a6..c38de8cb4e 100644 --- a/libraries/render-utils/src/fxaa_blend.slf +++ b/libraries/render-utils/src/fxaa_blend.slf @@ -14,11 +14,11 @@ <@include DeferredBufferWrite.slh@> -in vec2 varTexcoord; +in vec2 varTexCoord0; out vec4 outFragColor; uniform sampler2D colorTexture; void main(void) { - outFragColor = texture(colorTexture, varTexcoord); + outFragColor = texture(colorTexture, varTexCoord0); } From 0b26aa500db51aa6b549d7cef4ecffca487362ef Mon Sep 17 00:00:00 2001 From: Sam Cake Date: Mon, 12 Jun 2017 00:00:35 -0700 Subject: [PATCH 02/45] Using halton for the sequence --- .../render-utils/src/AntialiasingEffect.cpp | 68 ++++++------------- .../render-utils/src/AntialiasingEffect.h | 12 ++-- 2 files changed, 27 insertions(+), 53 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index c5ec6b0f6e..4d853f01d1 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -223,7 +223,7 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { PrepareStencil::testMask(*state); - state->setDepthTest(false, false, gpu::LESS_EQUAL); + // state->setDepthTest(false, false, gpu::LESS_EQUAL); state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA ); // Good to go add the brand new pipeline @@ -245,10 +245,8 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - - state->setDepthTest(false, false, gpu::LESS_EQUAL); PrepareStencil::testMask(*state); - + // Good to go add the brand new pipeline _blendPipeline = gpu::Pipeline::create(program, state); } @@ -264,57 +262,37 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); - - // FIXME: NEED to simplify that code to avoid all the GeometryCahce call, this is purely pixel manipulation - auto framebufferCache = DependencyManager::get(); - QSize framebufferSize = framebufferCache->getFrameBufferSize(); - float fbWidth = framebufferSize.width(); - float fbHeight = framebufferSize.height(); - - // FXAA step + // TAA step batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(getAntialiasingPipeline()); - - batch.draw(gpu::TRIANGLES, 4, 0); - - // initialize the view-space unpacking uniforms using frustum data - /* float left, right, bottom, top, nearVal, farVal; - glm::vec4 nearClipPlane, farClipPlane; - - args->getViewFrustum().computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); - - // float depthScale = (farVal - nearVal) / farVal; - // float nearScale = -1.0f / nearVal; - // float depthTexCoordScaleS = (right - left) * nearScale / sWidth; - // float depthTexCoordScaleT = (top - bottom) * nearScale / tHeight; - // float depthTexCoordOffsetS = left * nearScale - sMin * depthTexCoordScaleS; - // float depthTexCoordOffsetT = bottom * nearScale - tMin * depthTexCoordScaleT; - - batch._glUniform2f(_texcoordOffsetLoc, 1.0f / fbWidth, 1.0f / fbHeight); - - glm::vec4 color(0.0f, 0.0f, 0.0f, 1.0f); - glm::vec2 bottomLeft(-1.0f, -1.0f); - glm::vec2 topRight(1.0f, 1.0f); - glm::vec2 texCoordTopLeft(0.0f, 0.0f); - glm::vec2 texCoordBottomRight(1.0f, 1.0f); - DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); - - */ + batch.draw(gpu::TRIANGLE_STRIP, 4); + // Blend step - getBlendPipeline(); batch.setResourceTexture(0, _antialiasingTexture); batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); - - // DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); - batch.draw(gpu::TRIANGLES, 4, 0); + batch.draw(gpu::TRIANGLE_STRIP, 4); }); } +JitterSample::SampleSequence::SampleSequence(){ + // Halton sequence (2,3) + offsets[0] = { 1.0f / 2.0f, 1.0f / 3.0f }; + offsets[1] = { 1.0f / 4.0f, 2.0f / 3.0f }; + offsets[2] = { 3.0f / 4.0f, 1.0f / 9.0f }; + offsets[3] = { 1.0f / 8.0f, 4.0f / 9.0f }; + offsets[4] = { 5.0f / 8.0f, 7.0f / 9.0f }; + offsets[5] = { 3.0f / 8.0f, 2.0f / 9.0f }; + offsets[6] = { 7.0f / 8.0f, 5.0f / 9.0f }; + offsets[7] = { 1.0f / 16.0f, 8.0f / 9.0f }; + for (int i = 0; i < SEQUENCE_LENGTH; i++) { + offsets[i] = offsets[i] - vec2(0.5f); + } +} void JitterSample::configure(const Config& config) { _freeze = config.freeze; @@ -332,11 +310,7 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter auto jit = _scale * jitterBuffer.get().offsets[current]; auto width = (float) renderContext->args->_viewport.z; auto height = (float) renderContext->args->_viewport.w; - - auto oneOverRL = 0.5 * projMat[0][0] / theNear; - auto oneOverTB = 0.5 * projMat[1][1] / theNear; - - + auto jx = -4.0 * jit.x / width; auto jy = -4.0 * jit.y / height; diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index a74c332b91..8b17b328e4 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -16,16 +16,15 @@ #include "render/DrawTask.h" -class AntiAliasingConfig : public render::Job::Config { +class AntialiasingConfig : public render::Job::Config { Q_OBJECT - Q_PROPERTY(bool enabled MEMBER enabled) public: - AntiAliasingConfig() : render::Job::Config(true) {} + AntialiasingConfig() : render::Job::Config(true) {} }; class Antialiasing { public: - using Config = AntiAliasingConfig; + using Config = AntialiasingConfig; using JobModel = render::Job::ModelI; Antialiasing(); @@ -102,11 +101,12 @@ class JitterSample { public: struct SampleSequence { - static const int SEQUENCE_LENGTH { 4 }; + SampleSequence(); + static const int SEQUENCE_LENGTH { 8 }; int sequenceLength{ SEQUENCE_LENGTH }; int currentIndex { 0 }; - glm::vec2 offsets[SEQUENCE_LENGTH] { { 1.0f, 1.0f},{ -1.0f, -1.0f}, { 1.0f, -1.0f}, { -1.0f, 1.0f} }; + glm::vec2 offsets[SEQUENCE_LENGTH]; }; using JitterBuffer = gpu::StructBuffer; From 1c8332d85d5c5b58794127f3bc9159776383c735 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 6 Aug 2017 10:52:50 -0700 Subject: [PATCH 03/45] cleaning the build --- libraries/render-utils/src/AntialiasingEffect.cpp | 1 + libraries/render-utils/src/AntialiasingEffect.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 8cbe9c811c..1627908beb 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -23,6 +23,7 @@ #include "DependencyManager.h" #include "ViewFrustum.h" #include "GeometryCache.h" +#include "FramebufferCache.h" /* #include "fxaa_vert.h" #include "fxaa_frag.h" diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 4f7bc48b18..8b17b328e4 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -32,7 +32,7 @@ public: void configure(const Config& config) {} void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); - const gpu::PipelinePointer& getAntialiasingPipeline(RenderArgs* args); + const gpu::PipelinePointer& getAntialiasingPipeline(); const gpu::PipelinePointer& getBlendPipeline(); private: From f3a6729940d07f8454ba5bb44ab39a1a240784be Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 6 Aug 2017 23:08:06 -0700 Subject: [PATCH 04/45] Fidling around with aa --- .../render-utils/src/AntialiasingEffect.cpp | 17 ++++++----- libraries/render-utils/src/fxaa.slf | 28 ++++++++++++++++++- libraries/render-utils/src/fxaa_blend.slf | 3 ++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 1627908beb..ce7c418776 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -211,7 +211,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyTexture"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 1)); gpu::Shader::makeProgram(*program, slotBindings); @@ -220,10 +221,7 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); - - // state->setDepthTest(false, false, gpu::LESS_EQUAL); - state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA ); - + // Good to go add the brand new pipeline _antialiasingPipeline = gpu::Pipeline::create(program, state); } @@ -245,6 +243,8 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); + state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA ); + // Good to go add the brand new pipeline _blendPipeline = gpu::Pipeline::create(program, state); } @@ -262,13 +262,16 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setViewportTransform(args->_viewport); // TAA step - batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); + getAntialiasingPipeline(); + batch.setResourceTexture(0, _antialiasingTexture); + batch.setResourceTexture(1, sourceBuffer->getRenderBuffer(0)); batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step - batch.setResourceTexture(0, _antialiasingTexture); + // batch.setResourceTexture(0, _antialiasingTexture); + batch.setResourceTexture(1, nullptr); batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/fxaa.slf b/libraries/render-utils/src/fxaa.slf index fce9f3b05f..8bbe2887f5 100644 --- a/libraries/render-utils/src/fxaa.slf +++ b/libraries/render-utils/src/fxaa.slf @@ -23,13 +23,39 @@ precision mediump int; #endif uniform sampler2D colorTexture; +uniform sampler2D historyTexture; uniform vec2 texcoordOffset; in vec2 varTexCoord0; out vec4 outFragColor; void main() { - outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 0.3); + // outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 0.3); + +// v2 + float ModulationFactor = 1.0 / 16.0; + + vec3 CurrentSubpixel = textureLod(colorTexture, varTexCoord0, 0.0).rgb; + vec3 History = textureLod(historyTexture, varTexCoord0, 0.0).rgb; + + vec3 NearColor0 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(1, 0)).xyz; + vec3 NearColor1 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, 1)).xyz; + vec3 NearColor2 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(-1, 0)).xyz; + vec3 NearColor3 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, -1)).xyz; + + vec3 BoxMin = min(CurrentSubpixel, min(NearColor0, min(NearColor1, min(NearColor2, NearColor3)))); + vec3 BoxMax = max(CurrentSubpixel, max(NearColor0, max(NearColor1, max(NearColor2, NearColor3))));; + + History = clamp(History, BoxMin, BoxMax); + + //if (gl_FragCoord.x > 800) { + outFragColor.xyz = History; + outFragColor.w = ModulationFactor; + /* } else { + outFragColor.xyz = CurrentSubpixel; + outFragColor.w = 1.0; + + }*/ /* // filter width limit for dependent "two-tap" texture samples float FXAA_SPAN_MAX = 8.0; diff --git a/libraries/render-utils/src/fxaa_blend.slf b/libraries/render-utils/src/fxaa_blend.slf index c38de8cb4e..c42bf5fecf 100644 --- a/libraries/render-utils/src/fxaa_blend.slf +++ b/libraries/render-utils/src/fxaa_blend.slf @@ -21,4 +21,7 @@ uniform sampler2D colorTexture; void main(void) { outFragColor = texture(colorTexture, varTexCoord0); + if (gl_FragCoord.x > 800) { + outFragColor.w = 1.0; + } } From ff6b9f59f86bbf7b47519c8ed0dd4c1f29e2348c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 8 Aug 2017 01:06:47 -0700 Subject: [PATCH 05/45] Trying to produce history and current in one pass but it doesn;t work ? --- .../render-utils/src/AntialiasingEffect.cpp | 41 +++++++++++-------- libraries/render-utils/src/fxaa.slf | 18 +++++--- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index ce7c418776..c520e26bb1 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -188,22 +188,7 @@ Antialiasing::~Antialiasing() { } const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { - int width = DependencyManager::get()->getFrameBufferSize().width(); - int height = DependencyManager::get()->getFrameBufferSize().height(); - - if (_antialiasingBuffer && _antialiasingBuffer->getSize() != uvec2(width, height)) { - _antialiasingBuffer.reset(); - } - - if (!_antialiasingBuffer) { - // Link the antialiasing FBO to texture - _antialiasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); - auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); - auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); - _antialiasingTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); - _antialiasingBuffer->setRenderBuffer(0, _antialiasingTexture); - } - + if (!_antialiasingPipeline) { auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); @@ -257,6 +242,25 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const RenderArgs* args = renderContext->args; + int width = sourceBuffer->getWidth(); + int height = sourceBuffer->getHeight(); + + if (_antialiasingBuffer) { + if (_antialiasingBuffer->getSize() != uvec2(width, height) || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { + _antialiasingBuffer.reset(); + } + } + + if (!_antialiasingBuffer) { + // Link the antialiasing FBO to texture + _antialiasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); + auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + _antialiasingTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); + _antialiasingBuffer->setRenderBuffer(0, _antialiasingTexture); + _antialiasingBuffer->setRenderBuffer(1, sourceBuffer->getRenderBuffer(0)); + } + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); @@ -268,14 +272,15 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); + batch.setFramebuffer(sourceBuffer); // Blend step // batch.setResourceTexture(0, _antialiasingTexture); - batch.setResourceTexture(1, nullptr); + /* batch.setResourceTexture(1, nullptr); batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); - + */ }); } diff --git a/libraries/render-utils/src/fxaa.slf b/libraries/render-utils/src/fxaa.slf index 8bbe2887f5..860030181a 100644 --- a/libraries/render-utils/src/fxaa.slf +++ b/libraries/render-utils/src/fxaa.slf @@ -27,17 +27,18 @@ uniform sampler2D historyTexture; uniform vec2 texcoordOffset; in vec2 varTexCoord0; -out vec4 outFragColor; +layout(location = 0) out vec4 outFragColor; +layout(location = 1) out vec4 outFragColor2; void main() { // outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 0.3); // v2 - float ModulationFactor = 1.0 / 16.0; + float ModulationFactor = 1.0 / 8.0; vec3 CurrentSubpixel = textureLod(colorTexture, varTexCoord0, 0.0).rgb; vec3 History = textureLod(historyTexture, varTexCoord0, 0.0).rgb; - +/* vec3 NearColor0 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(1, 0)).xyz; vec3 NearColor1 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, 1)).xyz; vec3 NearColor2 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(-1, 0)).xyz; @@ -46,11 +47,16 @@ void main() { vec3 BoxMin = min(CurrentSubpixel, min(NearColor0, min(NearColor1, min(NearColor2, NearColor3)))); vec3 BoxMax = max(CurrentSubpixel, max(NearColor0, max(NearColor1, max(NearColor2, NearColor3))));; - History = clamp(History, BoxMin, BoxMax); + if (gl_FragCoord.x > 800) { + History = clamp(History, BoxMin, BoxMax); + }*/ + outFragColor2.xyz = mix(CurrentSubpixel, History, ModulationFactor); + outFragColor2.w = 1.0; - //if (gl_FragCoord.x > 800) { - outFragColor.xyz = History; + outFragColor.xyz = CurrentSubpixel; outFragColor.w = ModulationFactor; + + /* } else { outFragColor.xyz = CurrentSubpixel; outFragColor.w = 1.0; From 26f058b6f71ecb98774692900cdbb27c1a9ce051 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 8 Aug 2017 22:43:21 -0700 Subject: [PATCH 06/45] back to experience of pure melting --- .../render-utils/src/AntialiasingEffect.cpp | 19 +- libraries/render-utils/src/fxaa.slf | 167 +++++++++--------- libraries/render-utils/src/fxaa_blend.slf | 3 - 3 files changed, 94 insertions(+), 95 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index c520e26bb1..75f5402edc 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -196,8 +196,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("historyTexture"), 0)); - slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 1)); + // slotBindings.insert(gpu::Shader::Binding(std::string("historyTexture"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); gpu::Shader::makeProgram(*program, slotBindings); @@ -206,7 +206,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); - + state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA); + // Good to go add the brand new pipeline _antialiasingPipeline = gpu::Pipeline::create(program, state); } @@ -228,7 +229,6 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); - state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA ); // Good to go add the brand new pipeline _blendPipeline = gpu::Pipeline::create(program, state); @@ -246,7 +246,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const int height = sourceBuffer->getHeight(); if (_antialiasingBuffer) { - if (_antialiasingBuffer->getSize() != uvec2(width, height) || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { + if (_antialiasingBuffer->getSize() != uvec2(width, height)) {// || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { _antialiasingBuffer.reset(); } } @@ -258,7 +258,6 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); _antialiasingTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); _antialiasingBuffer->setRenderBuffer(0, _antialiasingTexture); - _antialiasingBuffer->setRenderBuffer(1, sourceBuffer->getRenderBuffer(0)); } gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { @@ -267,20 +266,16 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const // TAA step getAntialiasingPipeline(); - batch.setResourceTexture(0, _antialiasingTexture); - batch.setResourceTexture(1, sourceBuffer->getRenderBuffer(0)); + batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); - batch.setFramebuffer(sourceBuffer); // Blend step - // batch.setResourceTexture(0, _antialiasingTexture); - /* batch.setResourceTexture(1, nullptr); + batch.setResourceTexture(0, _antialiasingTexture); batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); - */ }); } diff --git a/libraries/render-utils/src/fxaa.slf b/libraries/render-utils/src/fxaa.slf index 860030181a..94fa75c47f 100644 --- a/libraries/render-utils/src/fxaa.slf +++ b/libraries/render-utils/src/fxaa.slf @@ -23,105 +23,112 @@ precision mediump int; #endif uniform sampler2D colorTexture; -uniform sampler2D historyTexture; +//uniform sampler2D historyTexture; uniform vec2 texcoordOffset; in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; -layout(location = 1) out vec4 outFragColor2; +//layout(location = 0) out vec4 outFragHistory; void main() { - // outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 0.3); + outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, 1.0/8.0); -// v2 - float ModulationFactor = 1.0 / 8.0; + // v2 + /* float ModulationFactor = 1.0 / 8.0; - vec3 CurrentSubpixel = textureLod(colorTexture, varTexCoord0, 0.0).rgb; - vec3 History = textureLod(historyTexture, varTexCoord0, 0.0).rgb; -/* - vec3 NearColor0 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(1, 0)).xyz; - vec3 NearColor1 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, 1)).xyz; - vec3 NearColor2 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(-1, 0)).xyz; - vec3 NearColor3 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, -1)).xyz; + vec3 History = textureLod(historyTexture, varTexCoord0, 0.0).rgb; + vec3 CurrentSubpixel = textureLod(colorTexture, varTexCoord0, 0.0).rgb; + /* + vec3 NearColor0 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(1, 0)).xyz; + vec3 NearColor1 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, 1)).xyz; + vec3 NearColor2 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(-1, 0)).xyz; + vec3 NearColor3 = textureLodOffset(colorTexture, varTexCoord0, 0.0, ivec2(0, -1)).xyz; - vec3 BoxMin = min(CurrentSubpixel, min(NearColor0, min(NearColor1, min(NearColor2, NearColor3)))); - vec3 BoxMax = max(CurrentSubpixel, max(NearColor0, max(NearColor1, max(NearColor2, NearColor3))));; + vec3 BoxMin = min(CurrentSubpixel, min(NearColor0, min(NearColor1, min(NearColor2, NearColor3)))); + vec3 BoxMax = max(CurrentSubpixel, max(NearColor0, max(NearColor1, max(NearColor2, NearColor3))));; + if (gl_FragCoord.x > 800) { + History = clamp(History, BoxMin, BoxMax); + } + + History = mix(CurrentSubpixel, History, ModulationFactor); + + /* outFragHistory.xyz = History; + outFragHistory.w = ModulationFactor + + outFragColor.xyz = History; + outFragColor.w = 1.0;*/ + + + + /* } else { + outFragColor.xyz = CurrentSubpixel; + outFragColor.w = 1.0; + + }*/ if (gl_FragCoord.x > 800) { - History = clamp(History, BoxMin, BoxMax); - }*/ - outFragColor2.xyz = mix(CurrentSubpixel, History, ModulationFactor); - outFragColor2.w = 1.0; + /* // filter width limit for dependent "two-tap" texture samples + float FXAA_SPAN_MAX = 8.0; - outFragColor.xyz = CurrentSubpixel; - outFragColor.w = ModulationFactor; + // local contrast multiplier for performing AA + // higher = sharper, but setting this value too high will cause near-vertical and near-horizontal edges to fail + // see "fxaaQualityEdgeThreshold" + float FXAA_REDUCE_MUL = 1.0 / 8.0; + // luminance threshold for processing dark colors + // see "fxaaQualityEdgeThresholdMin" + float FXAA_REDUCE_MIN = 1.0 / 128.0; - /* } else { - outFragColor.xyz = CurrentSubpixel; - outFragColor.w = 1.0; + // fetch raw RGB values for nearby locations + // sampling pattern is "five on a die" (each diagonal direction and the center) + // computing the coordinates for these texture reads could be moved to the vertex shader for speed if needed + vec3 rgbNW = texture(colorTexture, varTexCoord0 + (vec2(-1.0, -1.0) * texcoordOffset)).xyz; + vec3 rgbNE = texture(colorTexture, varTexCoord0 + (vec2(+1.0, -1.0) * texcoordOffset)).xyz; + vec3 rgbSW = texture(colorTexture, varTexCoord0 + (vec2(-1.0, +1.0) * texcoordOffset)).xyz; + vec3 rgbSE = texture(colorTexture, varTexCoord0 + (vec2(+1.0, +1.0) * texcoordOffset)).xyz; + vec3 rgbM = texture(colorTexture, varTexCoord0).xyz; - }*/ - /* // filter width limit for dependent "two-tap" texture samples - float FXAA_SPAN_MAX = 8.0; + // convert RGB values to luminance + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); - // local contrast multiplier for performing AA - // higher = sharper, but setting this value too high will cause near-vertical and near-horizontal edges to fail - // see "fxaaQualityEdgeThreshold" - float FXAA_REDUCE_MUL = 1.0 / 8.0; + // luma range of local neighborhood + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); - // luminance threshold for processing dark colors - // see "fxaaQualityEdgeThresholdMin" - float FXAA_REDUCE_MIN = 1.0 / 128.0; + // direction perpendicular to local luma gradient + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); - // fetch raw RGB values for nearby locations - // sampling pattern is "five on a die" (each diagonal direction and the center) - // computing the coordinates for these texture reads could be moved to the vertex shader for speed if needed - vec3 rgbNW = texture(colorTexture, varTexcoord + (vec2(-1.0, -1.0) * texcoordOffset)).xyz; - vec3 rgbNE = texture(colorTexture, varTexcoord + (vec2(+1.0, -1.0) * texcoordOffset)).xyz; - vec3 rgbSW = texture(colorTexture, varTexcoord + (vec2(-1.0, +1.0) * texcoordOffset)).xyz; - vec3 rgbSE = texture(colorTexture, varTexcoord + (vec2(+1.0, +1.0) * texcoordOffset)).xyz; - vec3 rgbM = texture(colorTexture, varTexcoord).xyz; - - // convert RGB values to luminance - vec3 luma = vec3(0.299, 0.587, 0.114); - float lumaNW = dot(rgbNW, luma); - float lumaNE = dot(rgbNE, luma); - float lumaSW = dot(rgbSW, luma); - float lumaSE = dot(rgbSE, luma); - float lumaM = dot( rgbM, luma); - - // luma range of local neighborhood - float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); - float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); - - // direction perpendicular to local luma gradient - vec2 dir; - dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); - dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); + // compute clamped direction offset for additional "two-tap" samples + // longer vector = blurry, shorter vector = sharp + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texcoordOffset; - // compute clamped direction offset for additional "two-tap" samples - // longer vector = blurry, shorter vector = sharp - float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); - float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); - dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), - max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texcoordOffset; - - // perform additional texture sampling perpendicular to gradient - vec3 rgbA = (1.0 / 2.0) * ( - texture(colorTexture, varTexcoord + dir * (1.0 / 3.0 - 0.5)).xyz + - texture(colorTexture, varTexcoord + dir * (2.0 / 3.0 - 0.5)).xyz); - vec3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * ( - texture(colorTexture, varTexcoord + dir * (0.0 / 3.0 - 0.5)).xyz + - texture(colorTexture, varTexcoord + dir * (3.0 / 3.0 - 0.5)).xyz); - float lumaB = dot(rgbB, luma); + // perform additional texture sampling perpendicular to gradient + vec3 rgbA = (1.0 / 2.0) * ( + texture(colorTexture, varTexCoord0 + dir * (1.0 / 3.0 - 0.5)).xyz + + texture(colorTexture, varTexCoord0 + dir * (2.0 / 3.0 - 0.5)).xyz); + vec3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * ( + texture(colorTexture, varTexCoord0 + dir * (0.0 / 3.0 - 0.5)).xyz + + texture(colorTexture, varTexCoord0 + dir * (3.0 / 3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); - // compare luma of new samples to the luma range of the original neighborhood - // if the new samples exceed this range, just use the first two samples instead of all four - if (lumaB < lumaMin || lumaB > lumaMax) { - outFragColor.xyz=rgbA; - } else { - outFragColor.xyz=rgbB; + // compare luma of new samples to the luma range of the original neighborhood + // if the new samples exceed this range, just use the first two samples instead of all four + if (lumaB < lumaMin || lumaB > lumaMax) { + outFragColor.xyz = rgbA; + } + else { + outFragColor.xyz = rgbB; + }*/ + outFragColor.a = 1.0; } - outFragColor.a = 1.0;*/ } diff --git a/libraries/render-utils/src/fxaa_blend.slf b/libraries/render-utils/src/fxaa_blend.slf index c42bf5fecf..c38de8cb4e 100644 --- a/libraries/render-utils/src/fxaa_blend.slf +++ b/libraries/render-utils/src/fxaa_blend.slf @@ -21,7 +21,4 @@ uniform sampler2D colorTexture; void main(void) { outFragColor = texture(colorTexture, varTexCoord0); - if (gl_FragCoord.x > 800) { - outFragColor.w = 1.0; - } } From dfc0bb8bcc9380edb8dbd9619432c4ae459bd4ec Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Aug 2017 17:24:08 -0700 Subject: [PATCH 07/45] Setting up taa job and debug ui --- .../render-utils/src/AntialiasingEffect.cpp | 17 +++---- .../render-utils/src/AntialiasingEffect.h | 27 ++++++++++- libraries/render-utils/src/taa.slf | 45 ++++++++++++++++++ .../utilities/render/antialiasing.js | 21 +++++++++ .../utilities/render/antialiasing.qml | 46 +++++++++++++++++++ 5 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 libraries/render-utils/src/taa.slf create mode 100644 scripts/developer/utilities/render/antialiasing.js create mode 100644 scripts/developer/utilities/render/antialiasing.qml diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 75f5402edc..32bc57f7c5 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -171,20 +171,14 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const } */ -#include "fxaa_vert.h" #include "fxaa_frag.h" #include "fxaa_blend_frag.h" Antialiasing::Antialiasing() { - _geometryId = DependencyManager::get()->allocateID(); } Antialiasing::~Antialiasing() { - auto geometryCache = DependencyManager::get(); - if (geometryCache) { - geometryCache->releaseID(_geometryId); - } } const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { @@ -201,8 +195,6 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::Shader::makeProgram(*program, slotBindings); - _texcoordOffsetLoc = program->getUniforms().findLocation("texcoordOffset"); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); @@ -236,6 +228,12 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { return _blendPipeline; } +void Antialiasing::configure(const Config& config) { + _params.edit().debugX = config.debugX; + _params.edit().blend = config.blend; +} + + void Antialiasing::run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); @@ -269,6 +267,9 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); batch.setFramebuffer(_antialiasingBuffer); batch.setPipeline(getAntialiasingPipeline()); + + batch.setUniformBuffer(0, _params._buffer); + batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 8b17b328e4..ada8d5376d 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -18,10 +18,29 @@ class AntialiasingConfig : public render::Job::Config { Q_OBJECT + Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) + Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) + public: AntialiasingConfig() : render::Job::Config(true) {} + + float debugX{ 1.0f }; + float blend { 0.1f }; + +signals: + void dirty(); }; + +struct TAAParams { + float debugX{ 1.0f }; + float blend{ 0.1f }; + float spareA; + float spareB; + +}; +using TAAParamsBuffer = gpu::StructBuffer; + class Antialiasing { public: using Config = AntialiasingConfig; @@ -29,12 +48,15 @@ public: Antialiasing(); ~Antialiasing(); - void configure(const Config& config) {} + void configure(const Config& config); void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); const gpu::PipelinePointer& getAntialiasingPipeline(); const gpu::PipelinePointer& getBlendPipeline(); + + + private: // Uniforms for AA @@ -46,7 +68,8 @@ private: gpu::PipelinePointer _antialiasingPipeline; gpu::PipelinePointer _blendPipeline; - int _geometryId { 0 }; + + TAAParamsBuffer _params; }; /* diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf new file mode 100644 index 0000000000..bd55a40539 --- /dev/null +++ b/libraries/render-utils/src/taa.slf @@ -0,0 +1,45 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// taa.frag +// fragment shader +// +// Created by Sam Gateau on 8/14/2017 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +uniform sampler2D colorTexture; +//uniform sampler2D historyTexture; + +in vec2 varTexCoord0; +layout(location = 0) out vec4 outFragColor; + +struct TAAParams +{ + float debugX; + float blend; + float spareA; + float spareB; +}; + +layout(std140, location=0) uniform taaParamsBuffer { + TAAParams params; +}; + +void main() { + outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, params.blend); + + if (varTexCoord0.x < params.debugX) { + outFragColor.a = 1.0; + } +} diff --git a/scripts/developer/utilities/render/antialiasing.js b/scripts/developer/utilities/render/antialiasing.js new file mode 100644 index 0000000000..c5a8f05a76 --- /dev/null +++ b/scripts/developer/utilities/render/antialiasing.js @@ -0,0 +1,21 @@ +// +// antialiasing.js +// +// Created by Sam Gateau on 8/14/2017 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// + +// Set up the qml ui +var qml = Script.resolvePath('antialiasing.qml'); +var window = new OverlayWindow({ + title: 'Antialiasing', + source: qml, + width: 400, height:400, +}); +window.setPosition(Window.innerWidth - 420, 50); +window.closed.connect(function() { Script.stop(); }); + + diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml new file mode 100644 index 0000000000..c8b756945a --- /dev/null +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -0,0 +1,46 @@ +// +// Antialiasing.qml +// +// Created by Sam Gateau on 8/14/2017 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "configSlider" +import "../lib/plotperf" + +Column { + spacing: 8 + Column { + id: antialiasing + spacing: 10 + + Column{ + ConfigSlider { + label: qsTr("Debug X") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "debugX" + max: 1.0 + min: 0.0 + } + ConfigSlider { + label: qsTr("History blend") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "blend" + max: 1.0 + min: 0.0 + } + CheckBox { + text: "Freeze " + checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] + onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } + } + + } + } +} From 76fd72561030a08ad9b83a300aa1a9dd5d8229f1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 14 Aug 2017 23:26:36 -0700 Subject: [PATCH 08/45] switching to a new shader --- libraries/render-utils/src/AntialiasingEffect.cpp | 4 ++-- libraries/render-utils/src/taa.slf | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 32bc57f7c5..f89d81b36a 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -171,7 +171,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const } */ -#include "fxaa_frag.h" +#include "taa_frag.h" #include "fxaa_blend_frag.h" @@ -186,7 +186,7 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { if (!_antialiasingPipeline) { auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); - auto ps = gpu::Shader::createPixel(std::string(fxaa_frag)); + auto ps = gpu::Shader::createPixel(std::string(taa_frag)); gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index bd55a40539..72f1dfc66a 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -32,13 +32,16 @@ struct TAAParams float spareB; }; -layout(std140, location=0) uniform taaParamsBuffer { +layout(std140) uniform taaParamsBuffer { TAAParams params; }; void main() { outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, params.blend); + if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { + outFragColor.rgb = vec3(1.0, 1.0, 0.0); + } if (varTexCoord0.x < params.debugX) { outFragColor.a = 1.0; } From 2f0eee5e4abbd485a71fb43fd9b8c416f9a2f52e Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 15 Aug 2017 18:11:23 -0700 Subject: [PATCH 09/45] introducing the Velocity buffer pass generation --- interface/src/Application.cpp | 2 +- libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp | 44 ++++- .../render-utils/src/DebugDeferredBuffer.cpp | 18 +- .../render-utils/src/DebugDeferredBuffer.h | 4 +- .../src/DeferredFrameTransform.cpp | 4 + .../render-utils/src/DeferredFrameTransform.h | 5 + .../render-utils/src/DeferredTransform.slh | 2 + .../render-utils/src/RenderDeferredTask.cpp | 12 +- .../render-utils/src/VelocityBufferPass.cpp | 174 ++++++++++++++++++ .../render-utils/src/VelocityBufferPass.h | 89 +++++++++ .../src/debug_deferred_buffer.slf | 1 + .../src/velocityBuffer_cameraMotion.slf | 44 +++++ .../utilities/render/deferredLighting.qml | 1 + 13 files changed, 393 insertions(+), 7 deletions(-) create mode 100644 libraries/render-utils/src/VelocityBufferPass.cpp create mode 100644 libraries/render-utils/src/VelocityBufferPass.h create mode 100644 libraries/render-utils/src/velocityBuffer_cameraMotion.slf diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2f5006e5e8..be47b40bac 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -351,7 +351,7 @@ public: // Don't actually crash in debug builds, in case this apparent deadlock is simply from // the developer actively debugging code #ifdef NDEBUG - deadlockDetectionCrash(); + // deadlockDetectionCrash(); #endif } } diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp index ef9b6c4297..a5dced6f08 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp @@ -140,7 +140,49 @@ GLenum GLTexelFormat::evalGLTexelFormatInternal(const gpu::Element& dstFormat) { case gpu::RGB: case gpu::RGBA: case gpu::XY: - result = GL_RG8; + switch (dstFormat.getType()) { + case gpu::UINT32: + result = GL_RG32UI; + break; + case gpu::INT32: + result = GL_RG32I; + break; + case gpu::FLOAT: + result = GL_RG32F; + break; + case gpu::UINT16: + result = GL_RG16UI; + break; + case gpu::INT16: + result = GL_RG16I; + break; + case gpu::NUINT16: + result = GL_RG16; + break; + case gpu::NINT16: + result = GL_RG16_SNORM; + break; + case gpu::HALF: + result = GL_RG16F; + break; + case gpu::UINT8: + result = GL_RG8UI; + break; + case gpu::INT8: + result = GL_RG8I; + break; + case gpu::NUINT8: + result = GL_RG8; + break; + case gpu::NINT8: + result = GL_RG8_SNORM; + break; + case gpu::NUINT32: + case gpu::NINT32: + case gpu::COMPRESSED: + case gpu::NUM_TYPES: // quiet compiler + Q_UNREACHABLE(); + } break; default: qCWarning(gpugllogging) << "Unknown combination of texel format"; diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 44e2bd290b..54a68c9016 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -52,7 +52,8 @@ enum Slot { DiffusedCurvature, Scattering, AmbientOcclusion, - AmbientOcclusionBlurred + AmbientOcclusionBlurred, + Velocity, }; @@ -226,6 +227,12 @@ static const std::string DEFAULT_AMBIENT_OCCLUSION_BLURRED_SHADER{ " }" }; +static const std::string DEFAULT_VELOCITY_SHADER{ + "vec4 getFragmentColor() {" + " return vec4(vec2(texture(velocityMap, uv).xy), 0.0, 1.0);" + " }" +}; + static const std::string DEFAULT_CUSTOM_SHADER { "vec4 getFragmentColor() {" " return vec4(1.0, 0.0, 0.0, 1.0);" @@ -308,6 +315,8 @@ std::string DebugDeferredBuffer::getShaderSourceCode(Mode mode, std::string cust return DEFAULT_AMBIENT_OCCLUSION_SHADER; case AmbientOcclusionBlurredMode: return DEFAULT_AMBIENT_OCCLUSION_BLURRED_SHADER; + case VelocityMode: + return DEFAULT_VELOCITY_SHADER; case CustomMode: return getFileContent(customFile, DEFAULT_CUSTOM_SHADER); default: @@ -366,6 +375,7 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Mode mode, std::str slotBindings.insert(gpu::Shader::Binding("diffusedCurvatureMap", DiffusedCurvature)); slotBindings.insert(gpu::Shader::Binding("scatteringMap", Scattering)); slotBindings.insert(gpu::Shader::Binding("occlusionBlurredMap", AmbientOcclusionBlurred)); + slotBindings.insert(gpu::Shader::Binding("velocityMap", Velocity)); gpu::Shader::makeProgram(*program, slotBindings); auto pipeline = gpu::Pipeline::create(program, std::make_shared()); @@ -403,6 +413,7 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I auto& linearDepthTarget = inputs.get1(); auto& surfaceGeometryFramebuffer = inputs.get2(); auto& ambientOcclusionFramebuffer = inputs.get3(); + auto& velocityFramebuffer = inputs.get4(); gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); @@ -431,6 +442,9 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I batch.setResourceTexture(Depth, deferredFramebuffer->getPrimaryDepthTexture()); batch.setResourceTexture(Lighting, deferredFramebuffer->getLightingTexture()); } + if (velocityFramebuffer) { + batch.setResourceTexture(Velocity, velocityFramebuffer->getVelocityTexture()); + } auto lightStage = renderContext->_scene->getStage(); assert(lightStage); @@ -476,5 +490,7 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I batch.setResourceTexture(AmbientOcclusion, nullptr); batch.setResourceTexture(AmbientOcclusionBlurred, nullptr); + batch.setResourceTexture(Velocity, nullptr); + }); } diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index bd5618f5be..376967017b 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -18,6 +18,7 @@ #include "DeferredFramebuffer.h" #include "SurfaceGeometryPass.h" #include "AmbientOcclusionEffect.h" +#include "VelocityBufferPass.h" class DebugDeferredBufferConfig : public render::Job::Config { Q_OBJECT @@ -37,7 +38,7 @@ signals: class DebugDeferredBuffer { public: - using Inputs = render::VaryingSet4; + using Inputs = render::VaryingSet5; using Config = DebugDeferredBufferConfig; using JobModel = render::Job::ModelI; @@ -76,6 +77,7 @@ protected: ScatteringDebugMode, AmbientOcclusionMode, AmbientOcclusionBlurredMode, + VelocityMode, CustomMode, // Needs to stay last NumModes, diff --git a/libraries/render-utils/src/DeferredFrameTransform.cpp b/libraries/render-utils/src/DeferredFrameTransform.cpp index baf523312c..cee5786847 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.cpp +++ b/libraries/render-utils/src/DeferredFrameTransform.cpp @@ -31,6 +31,10 @@ void DeferredFrameTransform::update(RenderArgs* args) { //_parametersBuffer.edit()._ditheringInfo.y += 0.25f; + // Move the current view transform to prev + frameTransformBuffer.prevInvView = frameTransformBuffer.invView; + frameTransformBuffer.prevView = frameTransformBuffer.view; + Transform cameraTransform; args->getViewFrustum().evalViewTransform(cameraTransform); cameraTransform.getMatrix(frameTransformBuffer.invView); diff --git a/libraries/render-utils/src/DeferredFrameTransform.h b/libraries/render-utils/src/DeferredFrameTransform.h index 93e194f052..a90effe053 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.h +++ b/libraries/render-utils/src/DeferredFrameTransform.h @@ -52,6 +52,11 @@ protected: // View matrix from world space to eye space (mono) glm::mat4 view; + // Previous Frame Inv View matrix from eye space (mono) to world space + glm::mat4 prevInvView; + // Previous Frame View matrix from world space to eye space (mono) + glm::mat4 prevView; + FrameTransform() {} }; UniformBufferView _frameTransformBuffer; diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index e7771821dc..86fbea9d45 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -31,6 +31,8 @@ struct DeferredFrameTransform { mat4 _projectionMono; mat4 _viewInverse; mat4 _view; + mat4 _prevViewInverse; + mat4 _prevView; }; uniform deferredFrameTransformBuffer { diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 2719b921ee..0428caa716 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -31,6 +31,7 @@ #include "DeferredFramebuffer.h" #include "DeferredLightingEffect.h" #include "SurfaceGeometryPass.h" +#include "VelocityBufferPass.h" #include "FramebufferCache.h" #include "TextureCache.h" #include "ZoneRenderer.h" @@ -130,7 +131,11 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto ambientOcclusionFramebuffer = ambientOcclusionOutputs.getN(0); const auto ambientOcclusionUniforms = ambientOcclusionOutputs.getN(1); - + // Velocity + const auto velocityBufferInputs = VelocityBufferPass::Inputs(deferredFrameTransform, deferredFramebuffer).asVarying(); + const auto velocityBufferOutputs = task.addJob("VelocityBuffer", velocityBufferInputs); + const auto velocityBuffer = velocityBufferOutputs.getN(0); + // Draw Lights just add the lights to the current list of lights to deal with. NOt really gpu job for now. task.addJob("DrawLight", lights); @@ -149,6 +154,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("RenderDeferred", deferredLightingInputs); + // Similar to light stage, background stage has been filled by several potential render items and resolved for the frame in this job task.addJob("DrawBackgroundDeferred", lightingModel); @@ -191,7 +197,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Debugging stages { // Debugging Deferred buffer job - const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer)); + const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, velocityBuffer)); task.addJob("DebugDeferredBuffer", debugFramebuffers); const auto debugSubsurfaceScatteringInputs = DebugSubsurfaceScattering::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, @@ -217,7 +223,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawZoneStack", deferredFrameTransform); } - + // AA job to be revisited task.addJob("Antialiasing", primaryFramebuffer); diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp new file mode 100644 index 0000000000..5def9e1bca --- /dev/null +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -0,0 +1,174 @@ +// +// VelocityBufferPass.cpp +// libraries/render-utils/src/ +// +// Created by Sam Gateau 8/15/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "VelocityBufferPass.h" + +#include + +#include +#include +#include "StencilMaskPass.h" + +const int VelocityBufferPass_FrameTransformSlot = 0; +const int VelocityBufferPass_DepthMapSlot = 0; +const int VelocityBufferPass_NormalMapSlot = 1; + + +#include "velocityBuffer_cameraMotion_frag.h" + +VelocityFramebuffer::VelocityFramebuffer() { +} + + +void VelocityFramebuffer::updatePrimaryDepth(const gpu::TexturePointer& depthBuffer) { + //If the depth buffer or size changed, we need to delete our FBOs + bool reset = false; + if ((_primaryDepthTexture != depthBuffer)) { + _primaryDepthTexture = depthBuffer; + reset = true; + } + if (_primaryDepthTexture) { + auto newFrameSize = glm::ivec2(_primaryDepthTexture->getDimensions()); + if (_frameSize != newFrameSize) { + _frameSize = newFrameSize; + _halfFrameSize = newFrameSize >> 1; + + reset = true; + } + } + + if (reset) { + clear(); + } +} + +void VelocityFramebuffer::clear() { + _velocityFramebuffer.reset(); + _velocityTexture.reset(); +} + +void VelocityFramebuffer::allocate() { + + auto width = _frameSize.x; + auto height = _frameSize.y; + + // For Velocity Buffer: + _velocityTexture = gpu::Texture::createRenderBuffer(gpu::Element(gpu::VEC2, gpu::HALF, gpu::RGB), width, height, gpu::Texture::SINGLE_MIP, + gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT)); + _velocityFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("velocity")); + _velocityFramebuffer->setRenderBuffer(0, _velocityTexture); + _velocityFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, _primaryDepthTexture->getTexelFormat()); +} + +gpu::FramebufferPointer VelocityFramebuffer::getVelocityFramebuffer() { + if (!_velocityFramebuffer) { + allocate(); + } + return _velocityFramebuffer; +} + +gpu::TexturePointer VelocityFramebuffer::getVelocityTexture() { + if (!_velocityTexture) { + allocate(); + } + return _velocityTexture; +} + +VelocityBufferPass::VelocityBufferPass() { +} + +void VelocityBufferPass::configure(const Config& config) { +} + +void VelocityBufferPass::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { + assert(renderContext->args); + assert(renderContext->args->hasViewFrustum()); + + RenderArgs* args = renderContext->args; + + const auto& frameTransform = inputs.get0(); + const auto& deferredFramebuffer = inputs.get1(); + + if (!_gpuTimer) { + _gpuTimer = std::make_shared < gpu::RangeTimer>(__FUNCTION__); + } + + if (!_velocityFramebuffer) { + _velocityFramebuffer = std::make_shared(); + } + _velocityFramebuffer->updatePrimaryDepth(deferredFramebuffer->getPrimaryDepthTexture()); + + auto depthBuffer = deferredFramebuffer->getPrimaryDepthTexture(); + + auto velocityFBO = _velocityFramebuffer->getVelocityFramebuffer(); + auto velocityTexture = _velocityFramebuffer->getVelocityTexture(); + + outputs.edit0() = _velocityFramebuffer; + outputs.edit1() = velocityFBO; + outputs.edit2() = velocityTexture; + + auto cameraMotionPipeline = getCameraMotionPipeline(); + + auto fullViewport = args->_viewport; + + gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + _gpuTimer->begin(batch); + batch.enableStereo(false); + + batch.setViewportTransform(fullViewport); + batch.setProjectionTransform(glm::mat4()); + batch.resetViewTransform(); + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(_velocityFramebuffer->getDepthFrameSize(), fullViewport)); + + batch.setUniformBuffer(VelocityBufferPass_FrameTransformSlot, frameTransform->getFrameTransformBuffer()); + + // Velocity buffer camera motion + batch.setFramebuffer(velocityFBO); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.setPipeline(cameraMotionPipeline); + batch.setResourceTexture(VelocityBufferPass_DepthMapSlot, depthBuffer); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + _gpuTimer->end(batch); + }); + + auto config = std::static_pointer_cast(renderContext->jobConfig); + config->setGPUBatchRunTime(_gpuTimer->getGPUAverage(), _gpuTimer->getBatchAverage()); +} + + +const gpu::PipelinePointer& VelocityBufferPass::getCameraMotionPipeline() { + if (!_cameraMotionPipeline) { + auto vs = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS(); + auto ps = gpu::Shader::createPixel(std::string(velocityBuffer_cameraMotion_frag)); + gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); + + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), VelocityBufferPass_FrameTransformSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), VelocityBufferPass_DepthMapSlot)); + gpu::Shader::makeProgram(*program, slotBindings); + + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + // Stencil test the curvature pass for objects pixels only, not the background + PrepareStencil::testShape(*state); + + state->setColorWriteMask(true, true, false, false); + + // Good to go add the brand new pipeline + _cameraMotionPipeline = gpu::Pipeline::create(program, state); + } + + return _cameraMotionPipeline; +} + + + diff --git a/libraries/render-utils/src/VelocityBufferPass.h b/libraries/render-utils/src/VelocityBufferPass.h new file mode 100644 index 0000000000..fb2b729368 --- /dev/null +++ b/libraries/render-utils/src/VelocityBufferPass.h @@ -0,0 +1,89 @@ +// +// VelocityBufferPass.h +// libraries/render-utils/src/ +// +// Created by Sam Gateau 8/15/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_VelocityBufferPass_h +#define hifi_VelocityBufferPass_h + +#include "SurfaceGeometryPass.h" + + +// VelocityFramebuffer is a helper class gathering in one place theframebuffers and targets describing the surface geometry linear depth +// from a z buffer +class VelocityFramebuffer { +public: + VelocityFramebuffer(); + + gpu::FramebufferPointer getVelocityFramebuffer(); + gpu::TexturePointer getVelocityTexture(); + + // Update the depth buffer which will drive the allocation of all the other resources according to its size. + void updatePrimaryDepth(const gpu::TexturePointer& depthBuffer); + + gpu::TexturePointer getPrimaryDepthTexture(); + const glm::ivec2& getDepthFrameSize() const { return _frameSize; } + + void setResolutionLevel(int level); + int getResolutionLevel() const { return _resolutionLevel; } + +protected: + void clear(); + void allocate(); + + gpu::TexturePointer _primaryDepthTexture; + + gpu::FramebufferPointer _velocityFramebuffer; + gpu::TexturePointer _velocityTexture; + + glm::ivec2 _frameSize; + glm::ivec2 _halfFrameSize; + int _resolutionLevel{ 0 }; +}; + +using VelocityFramebufferPointer = std::shared_ptr; + +class VelocityBufferPassConfig : public render::GPUJobConfig { + Q_OBJECT + Q_PROPERTY(float depthThreshold MEMBER depthThreshold NOTIFY dirty) + +public: + VelocityBufferPassConfig() : render::GPUJobConfig(true) {} + + float depthThreshold{ 5.0f }; + +signals: + void dirty(); +}; + +class VelocityBufferPass { +public: + using Inputs = render::VaryingSet2; + using Outputs = render::VaryingSet3; + using Config = VelocityBufferPassConfig; + using JobModel = render::Job::ModelIO; + + VelocityBufferPass(); + + void configure(const Config& config); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); + +private: + typedef gpu::BufferView UniformBufferView; + + VelocityFramebufferPointer _velocityFramebuffer; + + const gpu::PipelinePointer& getCameraMotionPipeline(); + gpu::PipelinePointer _cameraMotionPipeline; + + gpu::RangeTimerPointer _gpuTimer; +}; + + +#endif // hifi_VelocityBufferPass_h diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf index e9750f0054..c952b474ed 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slf +++ b/libraries/render-utils/src/debug_deferred_buffer.slf @@ -23,6 +23,7 @@ uniform sampler2D halfNormalMap; uniform sampler2D occlusionMap; uniform sampler2D occlusionBlurredMap; uniform sampler2D scatteringMap; +uniform sampler2D velocityMap; <$declareDeferredCurvature()$> diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf new file mode 100644 index 0000000000..b2fe379e61 --- /dev/null +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -0,0 +1,44 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// Created by Sam Gateau on 6/3/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredTransform.slh@> +<$declareDeferredFrameTransform()$> + +in vec2 varTexCoord0; +out vec4 outFragColor; + +uniform sampler2D depthMap; + + +void main(void) { + // Pixel being shaded + ivec2 pixelPos; + vec2 texcoordPos; + ivec4 stereoSide; + ivec2 framePixelPos = getPixelPosTexcoordPosAndSide(gl_FragCoord.xy, pixelPos, texcoordPos, stereoSide); + + float Zdb = texelFetch(depthMap, ivec2(gl_FragCoord.xy), 0).x; + float Zeye = -evalZeyeFromZdb(Zdb); + if (Zeye <= -getPosLinearDepthFar()) { + outFragColor = vec4(0.0, 0.0, 0.0, 0.0); + return; + } + + // The position of the pixel fragment in Eye space then in world space + vec3 eyePos = evalEyePositionFromZeye(stereoSide.x, Zeye, texcoordPos); + vec3 worldPos = (frameTransform._viewInverse * vec4(eyePos, 1.0)).xyz; + + vec3 prevEyePos = (frameTransform._prevView * vec4(worldPos, 1.0)).xyz; + vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); + vec2 prevUV = prevClipPos.xy / prevClipPos.w; + + outFragColor = vec4(prevUV, 0.0, 0.0); +} diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 2254b6d95f..de7802d723 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -157,6 +157,7 @@ Column { ListElement { text: "Debug Scattering"; color: "White" } ListElement { text: "Ambient Occlusion"; color: "White" } ListElement { text: "Ambient Occlusion Blurred"; color: "White" } + ListElement { text: "Velocity"; color: "White" } ListElement { text: "Custom"; color: "White" } } width: 200 From 52b6c54b264f0f8038e566b4a21fc4398a9e14df Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 15 Aug 2017 18:14:18 -0700 Subject: [PATCH 10/45] introducing the Velocity buffer pass generation --- libraries/render-utils/src/velocityBuffer_cameraMotion.slf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index b2fe379e61..1189600d32 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -38,7 +38,7 @@ void main(void) { vec3 prevEyePos = (frameTransform._prevView * vec4(worldPos, 1.0)).xyz; vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); - vec2 prevUV = prevClipPos.xy / prevClipPos.w; + vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); - outFragColor = vec4(prevUV, 0.0, 0.0); + outFragColor = vec4(texcoordPos - prevUV, 0.0, 0.0); } From 800e4cb4d7044a4f24f7addfd87159ae8c667646 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 16 Aug 2017 18:29:59 -0700 Subject: [PATCH 11/45] Messing around with the velocity buffer --- libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp | 45 +++++++++++++- .../render-utils/src/AntialiasingEffect.cpp | 59 +++++++++++++------ .../render-utils/src/AntialiasingEffect.h | 13 ++-- .../render-utils/src/RenderDeferredTask.cpp | 4 +- libraries/render-utils/src/taa.slf | 25 ++++++-- .../src/velocityBuffer_cameraMotion.slf | 4 +- 6 files changed, 118 insertions(+), 32 deletions(-) diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp index a5dced6f08..2ca22d5dc7 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp @@ -597,7 +597,50 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E case gpu::RGB: case gpu::RGBA: case gpu::XY: - texel.internalFormat = GL_RG8; + switch (dstFormat.getType()) { + case gpu::UINT32: + texel.internalFormat = GL_RG32UI; + break; + case gpu::INT32: + texel.internalFormat = GL_RG32I; + break; + case gpu::FLOAT: + texel.internalFormat = GL_RG32F; + break; + case gpu::UINT16: + texel.internalFormat = GL_RG16UI; + break; + case gpu::INT16: + texel.internalFormat = GL_RG16I; + break; + case gpu::NUINT16: + texel.internalFormat = GL_RG16; + break; + case gpu::NINT16: + texel.internalFormat = GL_RG16_SNORM; + break; + case gpu::HALF: + texel.type = GL_FLOAT; + texel.internalFormat = GL_RG16F; + break; + case gpu::UINT8: + texel.internalFormat = GL_RG8UI; + break; + case gpu::INT8: + texel.internalFormat = GL_RG8I; + break; + case gpu::NUINT8: + texel.internalFormat = GL_RG8; + break; + case gpu::NINT8: + texel.internalFormat = GL_RG8_SNORM; + break; + case gpu::NUINT32: + case gpu::NINT32: + case gpu::COMPRESSED: + case gpu::NUM_TYPES: // quiet compiler + Q_UNREACHABLE(); + } break; default: qCWarning(gpugllogging) << "Unknown combination of texel format"; diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index f89d81b36a..e47051c635 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -175,10 +175,20 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const #include "fxaa_blend_frag.h" + +const int AntialiasingPass_FrameTransformSlot = 0; +const int AntialiasingPass_HistoryMapSlot = 0; +const int AntialiasingPass_SourceMapSlot = 1; +const int AntialiasingPass_VelocityMapSlot = 2; + Antialiasing::Antialiasing() { } Antialiasing::~Antialiasing() { + _antialiasingBuffer[0].reset(); + _antialiasingBuffer[1].reset(); + _antialiasingTexture[0].reset(); + _antialiasingTexture[1].reset(); } const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { @@ -190,15 +200,15 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - // slotBindings.insert(gpu::Shader::Binding(std::string("historyTexture"), 0)); - slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); - state->setBlendFunction(true, gpu::State::BlendArg::SRC_ALPHA, gpu::State::BlendOp::BLEND_OP_ADD, gpu::State::BlendArg::INV_SRC_ALPHA); // Good to go add the brand new pipeline _antialiasingPipeline = gpu::Pipeline::create(program, state); @@ -219,7 +229,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - PrepareStencil::testMask(*state); + // PrepareStencil::testMask(*state); // Good to go add the brand new pipeline @@ -234,38 +244,51 @@ void Antialiasing::configure(const Config& config) { } -void Antialiasing::run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer) { +void Antialiasing::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; + + auto& deferredFrameTransform = inputs.get0(); + auto& sourceBuffer = inputs.get1(); + auto& velocityBuffer = inputs.get2(); int width = sourceBuffer->getWidth(); int height = sourceBuffer->getHeight(); - if (_antialiasingBuffer) { - if (_antialiasingBuffer->getSize() != uvec2(width, height)) {// || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { - _antialiasingBuffer.reset(); + if (_antialiasingBuffer[0]) { + if (_antialiasingBuffer[0]->getSize() != uvec2(width, height)) {// || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { + _antialiasingBuffer[0].reset(); + _antialiasingBuffer[1].reset(); + _antialiasingTexture[0].reset(); + _antialiasingTexture[1].reset(); } } - if (!_antialiasingBuffer) { + if (!_antialiasingBuffer[0]) { // Link the antialiasing FBO to texture - _antialiasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); - auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); - auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); - _antialiasingTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); - _antialiasingBuffer->setRenderBuffer(0, _antialiasingTexture); + for (int i = 0; i < 2; i++) { + _antialiasingBuffer[i] = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); + auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + _antialiasingTexture[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); + _antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]); + } } - + int currentFrame = (_currentFrame++) % 2; + int prevFrame = (currentFrame + 1) % 2; + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); // TAA step getAntialiasingPipeline(); - batch.setResourceTexture(0, sourceBuffer->getRenderBuffer(0)); - batch.setFramebuffer(_antialiasingBuffer); + batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); + batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); + batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); + batch.setFramebuffer(_antialiasingBuffer[currentFrame]); batch.setPipeline(getAntialiasingPipeline()); batch.setUniformBuffer(0, _params._buffer); @@ -273,7 +296,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step - batch.setResourceTexture(0, _antialiasingTexture); + batch.setResourceTexture(0, _antialiasingTexture[currentFrame]); batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index ada8d5376d..46319a2eab 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -15,6 +15,8 @@ #include #include "render/DrawTask.h" +#include "DeferredFrameTransform.h" +#include "VelocityBufferPass.h" class AntialiasingConfig : public render::Job::Config { Q_OBJECT @@ -43,13 +45,14 @@ using TAAParamsBuffer = gpu::StructBuffer; class Antialiasing { public: + using Inputs = render::VaryingSet3; using Config = AntialiasingConfig; - using JobModel = render::Job::ModelI; + using JobModel = render::Job::ModelI; Antialiasing(); ~Antialiasing(); void configure(const Config& config); - void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceBuffer); + void run(const render::RenderContextPointer& renderContext, const Inputs& inputs); const gpu::PipelinePointer& getAntialiasingPipeline(); const gpu::PipelinePointer& getBlendPipeline(); @@ -62,14 +65,14 @@ private: // Uniforms for AA gpu::int32 _texcoordOffsetLoc; - gpu::FramebufferPointer _antialiasingBuffer; - - gpu::TexturePointer _antialiasingTexture; + gpu::FramebufferPointer _antialiasingBuffer[2]; + gpu::TexturePointer _antialiasingTexture[2]; gpu::PipelinePointer _antialiasingPipeline; gpu::PipelinePointer _blendPipeline; TAAParamsBuffer _params; + int _currentFrame{ 0 }; }; /* diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 0428caa716..055b66b8cd 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -226,7 +226,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // AA job to be revisited - task.addJob("Antialiasing", primaryFramebuffer); + const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, velocityBuffer).asVarying(); + + task.addJob("Antialiasing", antialiasingInputs); // Draw 2DWeb non AA const auto nonAAOverlaysInputs = DrawOverlay3D::Inputs(nonAAOverlays, lightingModel).asVarying(); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 72f1dfc66a..1dc73345fd 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -18,8 +18,9 @@ precision mediump float; precision mediump int; #endif -uniform sampler2D colorTexture; -//uniform sampler2D historyTexture; +uniform sampler2D colorMap; +uniform sampler2D historyMap; +uniform sampler2D velocityMap; in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; @@ -37,12 +38,26 @@ layout(std140) uniform taaParamsBuffer { }; void main() { - outFragColor = vec4(texture(colorTexture, varTexCoord0).xyz, params.blend); + vec3 currentColor = texture(colorMap, varTexCoord0).xyz; + + vec2 rawVelocity = texture(velocityMap, varTexCoord0).xy; + + vec2 velocity = rawVelocity; + vec2 prevTexCoord = varTexCoord0 - velocity; + vec3 prevColor = texture(historyMap, prevTexCoord).xyz; + + vec3 newColor = mix(currentColor, prevColor, params.blend); + + outFragColor = vec4(newColor, 1.0); + // outFragColor = vec4(varTexCoord0, 0.0, 1.0); if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { - outFragColor.rgb = vec3(1.0, 1.0, 0.0); + outFragColor.rgb = vec3(1.0, 1.0, 1.0); } if (varTexCoord0.x < params.debugX) { - outFragColor.a = 1.0; + outFragColor = vec4(prevColor, 1.0); + /*if (dot(velocity, velocity) > 0.0001) { + outFragColor = vec4(rawVelocity, 0.0, 1.0); + }*/ } } diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index 1189600d32..a16fd57c01 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -28,7 +28,7 @@ void main(void) { float Zdb = texelFetch(depthMap, ivec2(gl_FragCoord.xy), 0).x; float Zeye = -evalZeyeFromZdb(Zdb); if (Zeye <= -getPosLinearDepthFar()) { - outFragColor = vec4(0.0, 0.0, 0.0, 0.0); + outFragColor = vec4(0.5, 0.5, 0.0, 0.0); return; } @@ -40,5 +40,5 @@ void main(void) { vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); - outFragColor = vec4(texcoordPos - prevUV, 0.0, 0.0); + outFragColor = vec4( ((texcoordPos - prevUV)), 0.0, 0.0); } From cbf5c25f3579f22a44f4eb64683ec606c8c96fba Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 17 Aug 2017 01:29:12 -0700 Subject: [PATCH 12/45] Adding the velocity factor --- .../render-utils/src/AntialiasingEffect.cpp | 1 + .../render-utils/src/AntialiasingEffect.h | 10 ++++++---- libraries/render-utils/src/taa.slf | 19 ++++++++++--------- .../utilities/render/antialiasing.qml | 10 +++++++++- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index e47051c635..8e532b2e82 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -241,6 +241,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { void Antialiasing::configure(const Config& config) { _params.edit().debugX = config.debugX; _params.edit().blend = config.blend; + _params.edit().velocityScale = config.velocityScale; } diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 46319a2eab..3ee14cae2d 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -22,12 +22,14 @@ class AntialiasingConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) + Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) public: AntialiasingConfig() : render::Job::Config(true) {} - float debugX{ 1.0f }; - float blend { 0.1f }; + float debugX{ 0.0f }; + float blend{ 0.1f }; + float velocityScale{ 1.0f }; signals: void dirty(); @@ -35,9 +37,9 @@ signals: struct TAAParams { - float debugX{ 1.0f }; + float debugX{ 0.0f }; float blend{ 0.1f }; - float spareA; + float velocityScale{ 1.0f }; float spareB; }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 1dc73345fd..9e1aaf6d43 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -29,7 +29,7 @@ struct TAAParams { float debugX; float blend; - float spareA; + float motionScale; float spareB; }; @@ -43,21 +43,22 @@ void main() { vec2 rawVelocity = texture(velocityMap, varTexCoord0).xy; vec2 velocity = rawVelocity; - vec2 prevTexCoord = varTexCoord0 - velocity; + vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; + + prevTexCoord = clamp(prevTexCoord, vec2(0.1), vec2(0.9)); vec3 prevColor = texture(historyMap, prevTexCoord).xyz; - vec3 newColor = mix(currentColor, prevColor, params.blend); + vec3 newColor = mix(prevColor, currentColor, params.blend); outFragColor = vec4(newColor, 1.0); - // outFragColor = vec4(varTexCoord0, 0.0, 1.0); if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { - outFragColor.rgb = vec3(1.0, 1.0, 1.0); + outFragColor.rgb = vec3(1.0, 1.0, 0.0); } if (varTexCoord0.x < params.debugX) { - outFragColor = vec4(prevColor, 1.0); - /*if (dot(velocity, velocity) > 0.0001) { - outFragColor = vec4(rawVelocity, 0.0, 1.0); - }*/ + outFragColor = vec4(currentColor, 1.0); + if (dot(velocity, velocity) > 0.0001) { + outFragColor = vec4(0.0, 1.0, 1.0, 1.0); + } } } diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index c8b756945a..85278ebce0 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -28,13 +28,21 @@ Column { min: 0.0 } ConfigSlider { - label: qsTr("History blend") + label: qsTr("Source blend") integral: false config: Render.getConfig("RenderMainView.Antialiasing") property: "blend" max: 1.0 min: 0.0 } + ConfigSlider { + label: qsTr("Velocity scale") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "velocityScale" + max: 1.0 + min: -1.0 + } CheckBox { text: "Freeze " checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] From 6ec6ccfec15410eddb79a6ebbaf68f6c6e215d31 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 17 Aug 2017 18:26:59 -0700 Subject: [PATCH 13/45] Just making debugging easier --- .../render-utils/src/AntialiasingEffect.cpp | 25 ++++++-- libraries/render-utils/src/taa.slf | 17 ++---- libraries/render-utils/src/taa_blend.slf | 61 +++++++++++++++++++ 3 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 libraries/render-utils/src/taa_blend.slf diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 8e532b2e82..5508891568 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -172,7 +172,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const */ #include "taa_frag.h" -#include "fxaa_blend_frag.h" +#include "taa_blend_frag.h" @@ -180,6 +180,8 @@ const int AntialiasingPass_FrameTransformSlot = 0; const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_SourceMapSlot = 1; const int AntialiasingPass_VelocityMapSlot = 2; +const int AntialiasingPass_CurrentMapSlot = 3; + Antialiasing::Antialiasing() { } @@ -220,16 +222,20 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { if (!_blendPipeline) { auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); - auto ps = gpu::Shader::createPixel(std::string(fxaa_blend_frag)); + auto ps = gpu::Shader::createPixel(std::string(taa_blend_frag)); gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), 0)); - + slotBindings.insert(gpu::Shader::Binding(std::string("currentMap"), AntialiasingPass_CurrentMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); + + gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - // PrepareStencil::testMask(*state); + PrepareStencil::testMask(*state); // Good to go add the brand new pipeline @@ -297,10 +303,17 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step - batch.setResourceTexture(0, _antialiasingTexture[currentFrame]); + batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, _antialiasingTexture[currentFrame]); + batch.setFramebuffer(sourceBuffer); batch.setPipeline(getBlendPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, nullptr); + }); } diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 9e1aaf6d43..ce9a347065 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -44,21 +44,14 @@ void main() { vec2 velocity = rawVelocity; vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; + + vec3 prevColor = currentColor; - prevTexCoord = clamp(prevTexCoord, vec2(0.1), vec2(0.9)); - vec3 prevColor = texture(historyMap, prevTexCoord).xyz; + if (any(lessThan(prevTexCoord, vec2(0.0)) || any(greaterThan(prevTexCoord, vec2(1.0))) { + prevColor = texture(historyMap, prevTexCoord).xyz; + } vec3 newColor = mix(prevColor, currentColor, params.blend); outFragColor = vec4(newColor, 1.0); - - if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { - outFragColor.rgb = vec3(1.0, 1.0, 0.0); - } - if (varTexCoord0.x < params.debugX) { - outFragColor = vec4(currentColor, 1.0); - if (dot(velocity, velocity) > 0.0001) { - outFragColor = vec4(0.0, 1.0, 1.0, 1.0); - } - } } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf new file mode 100644 index 0000000000..2b54baaf9d --- /dev/null +++ b/libraries/render-utils/src/taa_blend.slf @@ -0,0 +1,61 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// taa_blend.frag +// fragment shader +// +// Created by Sam Gateau on 8/17/2017 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +uniform sampler2D currentMap; +uniform sampler2D colorMap; +uniform sampler2D historyMap; +uniform sampler2D velocityMap; + +in vec2 varTexCoord0; +layout(location = 0) out vec4 outFragColor; + +struct TAAParams +{ + float debugX; + float blend; + float motionScale; + float spareB; +}; + +layout(std140) uniform taaParamsBuffer { + TAAParams params; +}; + +void main(void) { + outFragColor = texture(currentMap, varTexCoord0); + + if (varTexCoord0.x > params.debugX) { + return; + } + + vec3 sourceColor = texture(colorMap, varTexCoord0).xyz; + + vec2 velocity = texture(velocityMap, varTexCoord0).xy; + vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; + + outFragColor = vec4(sourceColor, 1.0); + + if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { + outFragColor.rgb = vec3(1.0, 1.0, 0.0); + return; + } + + if (dot(velocity, velocity) > 0.0001) { + outFragColor = vec4(0.0, 1.0, 1.0, 1.0); + } + + +} From ed27c2adb714068431f6ac6d957eeb6e22b891ed Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 17 Aug 2017 18:28:49 -0700 Subject: [PATCH 14/45] Just making debugging easier --- libraries/render-utils/src/taa.slf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index ce9a347065..0e40a8b38d 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -47,7 +47,7 @@ void main() { vec3 prevColor = currentColor; - if (any(lessThan(prevTexCoord, vec2(0.0)) || any(greaterThan(prevTexCoord, vec2(1.0))) { + if (any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0)))) { prevColor = texture(historyMap, prevTexCoord).xyz; } From d6e0fd758f26e0c4838263710e03a6e3a07e666c Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 18 Aug 2017 18:31:27 -0700 Subject: [PATCH 15/45] Better debugging but now trying to check the velocity buffer fetch point --- .../render-utils/src/AntialiasingEffect.cpp | 67 ++++++++++++++----- .../render-utils/src/AntialiasingEffect.h | 6 +- libraries/render-utils/src/taa.slf | 4 +- libraries/render-utils/src/taa_blend.slf | 22 ++++-- .../utilities/render/antialiasing.qml | 10 ++- 5 files changed, 85 insertions(+), 24 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 5508891568..359fd73b7d 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -172,11 +172,14 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const */ #include "taa_frag.h" +#include "fxaa_blend_frag.h" #include "taa_blend_frag.h" -const int AntialiasingPass_FrameTransformSlot = 0; +const int AntialiasingPass_ParamsSlot = 0; +const int AntialiasingPass_FrameTransformSlot = 1; + const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_SourceMapSlot = 1; const int AntialiasingPass_VelocityMapSlot = 2; @@ -202,6 +205,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); @@ -222,15 +227,11 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { if (!_blendPipeline) { auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); - auto ps = gpu::Shader::createPixel(std::string(taa_blend_frag)); + auto ps = gpu::Shader::createPixel(std::string(fxaa_blend_frag)); gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("currentMap"), AntialiasingPass_CurrentMapSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); - + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), AntialiasingPass_CurrentMapSlot)); gpu::Shader::makeProgram(*program, slotBindings); @@ -244,10 +245,39 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { return _blendPipeline; } +const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { + if (!_debugBlendPipeline) { + auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS(); + auto ps = gpu::Shader::createPixel(std::string(taa_blend_frag)); + gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); + + gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); + + slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("currentMap"), AntialiasingPass_CurrentMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); + + + gpu::Shader::makeProgram(*program, slotBindings); + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + PrepareStencil::testMask(*state); + + + // Good to go add the brand new pipeline + _debugBlendPipeline = gpu::Pipeline::create(program, state); + } + return _debugBlendPipeline; +} + void Antialiasing::configure(const Config& config) { _params.edit().debugX = config.debugX; _params.edit().blend = config.blend; _params.edit().velocityScale = config.velocityScale; + _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; } @@ -295,19 +325,26 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); - batch.setFramebuffer(_antialiasingBuffer[currentFrame]); - batch.setPipeline(getAntialiasingPipeline()); - - batch.setUniformBuffer(0, _params._buffer); + batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer); + batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); + + batch.setFramebuffer(_antialiasingBuffer[currentFrame]); + batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step - batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, _antialiasingTexture[currentFrame]); - batch.setFramebuffer(sourceBuffer); - batch.setPipeline(getBlendPipeline()); - batch.draw(gpu::TRIANGLE_STRIP, 4); + if (_params->debugX <= 0.0) { + batch.setPipeline(getBlendPipeline()); + } else { + batch.setPipeline(getDebugBlendPipeline()); + } + batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, _antialiasingTexture[currentFrame]); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); + batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 3ee14cae2d..163d058a8e 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -23,6 +23,7 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) + Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) public: AntialiasingConfig() : render::Job::Config(true) {} @@ -30,6 +31,7 @@ public: float debugX{ 0.0f }; float blend{ 0.1f }; float velocityScale{ 1.0f }; + float debugShowVelocityThreshold{ 1.0f }; signals: void dirty(); @@ -40,7 +42,7 @@ struct TAAParams { float debugX{ 0.0f }; float blend{ 0.1f }; float velocityScale{ 1.0f }; - float spareB; + float debugShowVelocityThreshold{ 1.0f }; }; using TAAParamsBuffer = gpu::StructBuffer; @@ -58,6 +60,7 @@ public: const gpu::PipelinePointer& getAntialiasingPipeline(); const gpu::PipelinePointer& getBlendPipeline(); + const gpu::PipelinePointer& getDebugBlendPipeline(); @@ -72,6 +75,7 @@ private: gpu::PipelinePointer _antialiasingPipeline; gpu::PipelinePointer _blendPipeline; + gpu::PipelinePointer _debugBlendPipeline; TAAParamsBuffer _params; int _currentFrame{ 0 }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 0e40a8b38d..506a9bee92 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -30,7 +30,7 @@ struct TAAParams float debugX; float blend; float motionScale; - float spareB; + float debugShowVelocityThreshold; }; layout(std140) uniform taaParamsBuffer { @@ -47,7 +47,7 @@ void main() { vec3 prevColor = currentColor; - if (any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0)))) { + if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { prevColor = texture(historyMap, prevTexCoord).xyz; } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 2b54baaf9d..cb465c1eab 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -12,7 +12,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -<@include DeferredBufferWrite.slh@> +<@include DeferredTransform.slh@> +<$declareDeferredFrameTransform()$> + uniform sampler2D currentMap; uniform sampler2D colorMap; @@ -27,7 +29,7 @@ struct TAAParams float debugX; float blend; float motionScale; - float spareB; + float debugShowVelocityThreshold; }; layout(std140) uniform taaParamsBuffer { @@ -35,25 +37,35 @@ layout(std140) uniform taaParamsBuffer { }; void main(void) { - outFragColor = texture(currentMap, varTexCoord0); + vec3 newColor = texture(currentMap, varTexCoord0).xyz; + outFragColor = vec4(newColor, 1.0); if (varTexCoord0.x > params.debugX) { return; } + // Pixel being shaded vec3 sourceColor = texture(colorMap, varTexCoord0).xyz; vec2 velocity = texture(velocityMap, varTexCoord0).xy; + vec2 pixelVelocity = velocity * getWidthHeight(0); vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; outFragColor = vec4(sourceColor, 1.0); - if (abs(varTexCoord0.x - params.debugX) < (1.0 / 2048.0)) { + if (abs(varTexCoord0.x - params.debugX) < getInvWidthHeight().x) { outFragColor.rgb = vec3(1.0, 1.0, 0.0); return; } - if (dot(velocity, velocity) > 0.0001) { + vec3 prevColor = sourceColor; + + if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { + prevColor = texture(historyMap, prevTexCoord).xyz; + } + outFragColor.xyz = prevColor; + + if (dot(pixelVelocity, pixelVelocity) > (params.debugShowVelocityThreshold * params.debugShowVelocityThreshold)) { outFragColor = vec4(0.0, 1.0, 1.0, 1.0); } diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 85278ebce0..a557a4a738 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -41,7 +41,15 @@ Column { config: Render.getConfig("RenderMainView.Antialiasing") property: "velocityScale" max: 1.0 - min: -1.0 + min: 0.0 + } + ConfigSlider { + label: qsTr("Debug Velocity Threshold [pix]") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "debugShowVelocityThreshold" + max: 20 + min: 0.0 } CheckBox { text: "Freeze " From 65ab2ce90d8757293e00333228ee21e8e38c853b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 21 Aug 2017 00:35:18 -0700 Subject: [PATCH 16/45] Adding more debug and saving th emotion blur as pixel size, not uv --- .../render-utils/src/AntialiasingEffect.cpp | 11 ++++- .../render-utils/src/AntialiasingEffect.h | 13 ++++-- libraries/render-utils/src/taa.slf | 10 +++-- libraries/render-utils/src/taa_blend.slf | 44 +++++++++++++++---- .../src/velocityBuffer_cameraMotion.slf | 3 +- 5 files changed, 63 insertions(+), 18 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 359fd73b7d..3fc4756799 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -207,6 +207,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); @@ -278,6 +280,14 @@ void Antialiasing::configure(const Config& config) { _params.edit().blend = config.blend; _params.edit().velocityScale = config.velocityScale; _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; + + _params.edit().debugCursor.x = config.showCursorPixel; + + auto cursorPos = glm::vec2(_params->pixelInfo); + if (cursorPos != config.debugCursorTexcoord) { + _params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, 0.0f, 0.0f); + } + } @@ -350,7 +360,6 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, nullptr); - }); } diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 163d058a8e..99af206843 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -24,7 +24,8 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) - + Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) + Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) public: AntialiasingConfig() : render::Job::Config(true) {} @@ -33,6 +34,9 @@ public: float velocityScale{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; + bool showCursorPixel{ false }; + glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; + signals: void dirty(); }; @@ -44,6 +48,9 @@ struct TAAParams { float velocityScale{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; + glm::vec4 debugCursor{ 0.0f }; + glm::vec4 pixelInfo{ 0.5f, 0.5f, 0.0f, 0.0f }; + }; using TAAParamsBuffer = gpu::StructBuffer; @@ -62,9 +69,6 @@ public: const gpu::PipelinePointer& getBlendPipeline(); const gpu::PipelinePointer& getDebugBlendPipeline(); - - - private: // Uniforms for AA @@ -81,6 +85,7 @@ private: int _currentFrame{ 0 }; }; + /* class AntiAliasingConfig : public render::Job::Config { Q_OBJECT diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 506a9bee92..83dd78ced5 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -13,6 +13,9 @@ // +<@include DeferredTransform.slh@> +<$declareDeferredFrameTransform()$> + #ifdef GL_ES precision mediump float; precision mediump int; @@ -40,10 +43,9 @@ layout(std140) uniform taaParamsBuffer { void main() { vec3 currentColor = texture(colorMap, varTexCoord0).xyz; - vec2 rawVelocity = texture(velocityMap, varTexCoord0).xy; - - vec2 velocity = rawVelocity; - vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; + vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; + vec2 velocity = params.motionScale * pixVelocity * getInvWidthHeight(); + vec2 prevTexCoord = varTexCoord0 - velocity; vec3 prevColor = currentColor; diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index cb465c1eab..bfc4f4f27d 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -30,29 +30,57 @@ struct TAAParams float blend; float motionScale; float debugShowVelocityThreshold; + vec4 debugCursor; + vec4 pixelInfo; }; layout(std140) uniform taaParamsBuffer { TAAParams params; }; +vec2 getDebugCursorTexcoord() { + return params.pixelInfo.xy; +} + void main(void) { vec3 newColor = texture(currentMap, varTexCoord0).xyz; outFragColor = vec4(newColor, 1.0); - if (varTexCoord0.x > params.debugX) { - return; - } - // Pixel being shaded vec3 sourceColor = texture(colorMap, varTexCoord0).xyz; - vec2 velocity = texture(velocityMap, varTexCoord0).xy; - vec2 pixelVelocity = velocity * getWidthHeight(0); - vec2 prevTexCoord = varTexCoord0 - params.motionScale * velocity; + vec2 imageSize = getWidthHeight(0); + + vec2 pixPos = varTexCoord0 * imageSize; + vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; + vec2 velocity = params.motionScale * pixVelocity * getInvWidthHeight(); + vec2 prevTexCoord = varTexCoord0 - velocity; + vec2 prevPix = prevTexCoord * imageSize; outFragColor = vec4(sourceColor, 1.0); + // Pixel Debugged + vec2 cursorUV = getDebugCursorTexcoord(); + vec2 cursorPixelPos = cursorUV * imageSize; + vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; + float cursorVelocityLength = length(cursorVelocity); + + vec2 cursorToFragVec = pixPos - cursorPixelPos; + float cursorToFragLength = length(cursorToFragVec); + + if (cursorToFragLength <= cursorVelocityLength) { + vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; + + if (abs(dot(cursorVelocityDir, cursorToFragVec)) < 3.0) { + outFragColor = vec4(0.5, 1.0, 1.0, 1.0); + return; + } + } + + if (varTexCoord0.x > params.debugX) { + return; + } + if (abs(varTexCoord0.x - params.debugX) < getInvWidthHeight().x) { outFragColor.rgb = vec3(1.0, 1.0, 0.0); return; @@ -65,7 +93,7 @@ void main(void) { } outFragColor.xyz = prevColor; - if (dot(pixelVelocity, pixelVelocity) > (params.debugShowVelocityThreshold * params.debugShowVelocityThreshold)) { + if (dot(pixVelocity, pixVelocity) > (params.debugShowVelocityThreshold * params.debugShowVelocityThreshold)) { outFragColor = vec4(0.0, 1.0, 1.0, 1.0); } diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index a16fd57c01..abb32c124b 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -40,5 +40,6 @@ void main(void) { vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); - outFragColor = vec4( ((texcoordPos - prevUV)), 0.0, 0.0); + vec2 imageSize = getWidthHeight(0); + outFragColor = vec4( ((texcoordPos - prevUV) * imageSize), 0.0, 0.0); } From 97c6b2a60fc8db3a42e5e619bf762bd0835b23b9 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 21 Aug 2017 23:51:29 -0700 Subject: [PATCH 17/45] Trying to debug the motion vector --- .../render-utils/src/VelocityBufferPass.cpp | 2 +- libraries/render-utils/src/taa.slf | 2 +- libraries/render-utils/src/taa_blend.slf | 30 ++++++++++++++++++- .../src/velocityBuffer_cameraMotion.slf | 4 +-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp index 5def9e1bca..b06ecca5dd 100644 --- a/libraries/render-utils/src/VelocityBufferPass.cpp +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -162,7 +162,7 @@ const gpu::PipelinePointer& VelocityBufferPass::getCameraMotionPipeline() { PrepareStencil::testShape(*state); state->setColorWriteMask(true, true, false, false); - + // Good to go add the brand new pipeline _cameraMotionPipeline = gpu::Pipeline::create(program, state); } diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 023648999d..f0cd66b368 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -22,7 +22,7 @@ void main() { vec3 currentColor = texture(colorMap, varTexCoord0).xyz; vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; - vec2 velocity = params.motionScale * pixVelocity * getInvWidthHeight(); + vec2 velocity = params.motionScale * pixVelocity;// *getInvWidthHeight(); vec2 prevTexCoord = varTexCoord0 - velocity; vec3 prevColor = currentColor; diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index d355c184ba..a633b61821 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -27,7 +27,7 @@ void main(void) { vec2 imageSize = getWidthHeight(0); vec2 pixPos = varTexCoord0 * imageSize; - vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; + vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); vec2 velocity = params.motionScale * pixVelocity * getInvWidthHeight(); vec2 prevTexCoord = varTexCoord0 - velocity; @@ -37,6 +37,8 @@ void main(void) { vec2 cursorUV = getDebugCursorTexcoord(); vec2 cursorPixelPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; + vec2 cursorPrevUV = cursorUV - cursorVelocity; + cursorVelocity *= imageSize; float cursorVelocityLength = length(cursorVelocity); vec2 cursorToFragVec = pixPos - cursorPixelPos; @@ -55,6 +57,32 @@ void main(void) { } } + float tenPercentHeight = 0.1 * imageSize.y; + float centerWidth = imageSize.x * 0.5; + + vec2 prevOrbPos = vec2(centerWidth - tenPercentHeight, imageSize.y - tenPercentHeight); + vec2 prevOrbPosToPix = pixPos - prevOrbPos; + if (dot(prevOrbPosToPix, prevOrbPosToPix) < tenPercentHeight * tenPercentHeight) { + vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() * 0.5; + vec3 preOrbColor = vec3(0.0); + if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { + preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; + } + outFragColor = vec4(preOrbColor, 1.0); + return; + } + vec2 nextOrbPos = vec2(centerWidth + tenPercentHeight, imageSize.y - tenPercentHeight); + vec2 nextOrbPosToPix = pixPos - nextOrbPos; + if (dot(nextOrbPosToPix, nextOrbPosToPix) < tenPercentHeight * tenPercentHeight) { + vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() * 0.5; + vec3 nextOrbColor = vec3(0.0); + if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { + nextOrbColor = texture(colorMap, nextOrbPosToPix_uv).xyz; + } + outFragColor = vec4(nextOrbColor, 1.0); + return; + } + // Debug region before debugX if (varTexCoord0.x > params.debugX) { return; diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index abb32c124b..5a83501b4c 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -35,11 +35,11 @@ void main(void) { // The position of the pixel fragment in Eye space then in world space vec3 eyePos = evalEyePositionFromZeye(stereoSide.x, Zeye, texcoordPos); vec3 worldPos = (frameTransform._viewInverse * vec4(eyePos, 1.0)).xyz; - + vec3 prevEyePos = (frameTransform._prevView * vec4(worldPos, 1.0)).xyz; vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); - vec2 imageSize = getWidthHeight(0); + vec2 imageSize = vec2(1.0, 1.0); // getWidthHeight(0); outFragColor = vec4( ((texcoordPos - prevUV) * imageSize), 0.0, 0.0); } From 4cdbefc440453f99a07cc11fbca5479918d38fd3 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 22 Aug 2017 17:44:14 -0700 Subject: [PATCH 18/45] MOre debugging, adding the find the closest fragment 3x3 --- .../render-utils/src/AntialiasingEffect.cpp | 34 +++++++---- .../render-utils/src/AntialiasingEffect.h | 4 +- libraries/render-utils/src/taa.slf | 14 +++-- libraries/render-utils/src/taa.slh | 59 +++++++++++++++++-- libraries/render-utils/src/taa_blend.slf | 45 ++++++++++---- .../src/velocityBuffer_cameraMotion.slf | 3 +- .../utilities/render/antialiasing.qml | 14 +++-- 7 files changed, 129 insertions(+), 44 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 95c66a3ca9..fd576f89d0 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -182,7 +182,8 @@ const int AntialiasingPass_FrameTransformSlot = 1; const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_SourceMapSlot = 1; const int AntialiasingPass_VelocityMapSlot = 2; -const int AntialiasingPass_CurrentMapSlot = 3; +const int AntialiasingPass_NextMapSlot = 3; +const int AntialiasingPass_DepthMapSlot = 3; Antialiasing::Antialiasing() { @@ -209,8 +210,10 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("sourceMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), AntialiasingPass_DepthMapSlot)); + gpu::Shader::makeProgram(*program, slotBindings); @@ -232,7 +235,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), AntialiasingPass_CurrentMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("colorTexture"), AntialiasingPass_NextMapSlot)); gpu::Shader::makeProgram(*program, slotBindings); @@ -256,10 +259,11 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("currentMap"), AntialiasingPass_CurrentMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("nextMap"), AntialiasingPass_NextMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); - slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), AntialiasingPass_SourceMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("sourceMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), AntialiasingPass_DepthMapSlot)); gpu::Shader::makeProgram(*program, slotBindings); @@ -282,9 +286,10 @@ void Antialiasing::configure(const Config& config) { _params.edit().debugCursor.x = config.showCursorPixel; + auto orbZoom = (_params->pixelInfo.z); auto cursorPos = glm::vec2(_params->pixelInfo); - if (cursorPos != config.debugCursorTexcoord) { - _params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, 0.0f, 0.0f); + if (cursorPos != config.debugCursorTexcoord || (orbZoom != config.debugOrbZoom)) { + _params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, config.debugOrbZoom, 0.0f); } } @@ -322,8 +327,8 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const _antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]); } } - int currentFrame = (_currentFrame++) % 2; - int prevFrame = (currentFrame + 1) % 2; + int nextFrame = (_currentFrame++) % 2; + int prevFrame = (nextFrame + 1) % 2; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); @@ -334,31 +339,34 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); + batch.setResourceTexture(AntialiasingPass_DepthMapSlot, sourceBuffer->getDepthStencilBuffer()); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); - batch.setFramebuffer(_antialiasingBuffer[currentFrame]); + batch.setFramebuffer(_antialiasingBuffer[nextFrame]); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); // Blend step + batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); + batch.setFramebuffer(sourceBuffer); if (_params->debugX <= 0.0) { batch.setPipeline(getBlendPipeline()); } else { batch.setPipeline(getDebugBlendPipeline()); } - batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, _antialiasingTexture[currentFrame]); + batch.setResourceTexture(AntialiasingPass_NextMapSlot, _antialiasingTexture[nextFrame]); batch.draw(gpu::TRIANGLE_STRIP, 4); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_DepthMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); - batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr); - batch.setResourceTexture(AntialiasingPass_CurrentMapSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_NextMapSlot, nullptr); }); } diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 99af206843..1fd3fb6584 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -26,6 +26,7 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) + Q_PROPERTY(float debugOrbZoom MEMBER debugOrbZoom NOTIFY dirty) public: AntialiasingConfig() : render::Job::Config(true) {} @@ -36,6 +37,7 @@ public: bool showCursorPixel{ false }; glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; + float debugOrbZoom{ 2.0f }; signals: void dirty(); @@ -49,7 +51,7 @@ struct TAAParams { float debugShowVelocityThreshold{ 1.0f }; glm::vec4 debugCursor{ 0.0f }; - glm::vec4 pixelInfo{ 0.5f, 0.5f, 0.0f, 0.0f }; + glm::vec4 pixelInfo{ 0.5f, 0.5f, 2.0f, 0.0f }; }; using TAAParamsBuffer = gpu::StructBuffer; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index f0cd66b368..a3c6313b8e 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -19,19 +19,21 @@ in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; void main() { - vec3 currentColor = texture(colorMap, varTexCoord0).xyz; - vec2 pixVelocity = texture(velocityMap, varTexCoord0).xy; + vec2 fragUV = find_closest_fragment_3x3(varTexCoord0); + vec3 sourceColor = texture(sourceMap, fragUV).xyz; + + vec2 pixVelocity = texture(velocityMap, fragUV).xy; vec2 velocity = params.motionScale * pixVelocity;// *getInvWidthHeight(); vec2 prevTexCoord = varTexCoord0 - velocity; - vec3 prevColor = currentColor; + vec3 historyColor = sourceColor; if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { - prevColor = texture(historyMap, prevTexCoord).xyz; + historyColor = texture(historyMap, prevTexCoord).xyz; } - vec3 newColor = mix(prevColor, currentColor, params.blend); + vec3 nextColor = mix(historyColor, sourceColor, params.blend); - outFragColor = vec4(newColor, 1.0); + outFragColor = vec4(nextColor, 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 153bed90e9..c2dc47707e 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -13,10 +13,11 @@ <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> -uniform sampler2D currentMap; -uniform sampler2D colorMap; +uniform sampler2D depthMap; +uniform sampler2D sourceMap; uniform sampler2D historyMap; uniform sampler2D velocityMap; +uniform sampler2D nextMap; struct TAAParams { @@ -25,7 +26,7 @@ struct TAAParams float motionScale; float debugShowVelocityThreshold; vec4 debugCursor; - vec4 pixelInfo; + vec4 pixelInfo_orbZoom; }; layout(std140) uniform taaParamsBuffer { @@ -33,9 +34,57 @@ layout(std140) uniform taaParamsBuffer { }; vec2 getDebugCursorTexcoord() { - return params.pixelInfo.xy; + return params.pixelInfo_orbZoom.xy; } +float getOrbZoom() { + return params.pixelInfo_orbZoom.z; +} + +float fetchDepth(vec2 uv) { + return texture(depthMap, vec2(uv), 0).x; +} + +float resolveDepthLinear(float depth) { + return Zeye = -evalZeyeFromZdb(Zdb); + } + +#define ZCMP_GT(a, b) (a < b) + +vec3 find_closest_fragment_3x3(vec2 uv) +{ + vec2 dd = abs(getInvWidthHeight()); + vec2 du = vec2(dd.x, 0.0); + vec2 dv = vec2(0.0, dd.y); + + vec3 dtl = vec3(-1, -1, fetchDepth(uv - dv - du); + vec3 dtc = vec3( 0, -1, fetchDepth(uv - dv).x); + vec3 dtr = vec3( 1, -1, fetchDepth(uv - dv + du); + + vec3 dml = vec3(-1, 0, fetchDepth(CameraDepthTexture, uv - du); + vec3 dmc = vec3( 0, 0, fetchDepth(CameraDepthTexture, uv); + vec3 dmr = vec3( 1, 0, fetchDepth(CameraDepthTexture, uv + du); + + vec3 dbl = vec3(-1, 1, fetchDepth(CameraDepthTexture, uv + dv - du); + vec3 dbc = vec3( 0, 1, fetchDepth(CameraDepthTexture, uv + dv); + vec3 dbr = vec3( 1, 1, fetchDepth(CameraDepthTexture, uv + dv + du); + + vec3 dmin = dtl; + if (ZCMP_GT(dmin.z, dtc.z)) dmin = dtc; + if (ZCMP_GT(dmin.z, dtr.z)) dmin = dtr; + + if (ZCMP_GT(dmin.z, dml.z)) dmin = dml; + if (ZCMP_GT(dmin.z, dmc.z)) dmin = dmc; + if (ZCMP_GT(dmin.z, dmr.z)) dmin = dmr; + + if (ZCMP_GT(dmin.z, dbl.z)) dmin = dbl; + if (ZCMP_GT(dmin.z, dbc.z)) dmin = dbc; + if (ZCMP_GT(dmin.z, dbr.z)) dmin = dbr; + + return vec3(uv + dd.xy * dmin.xy, dmin.z); +} + + <@include gpu/Color.slh@> <$declareColorWheel()$> @@ -45,4 +94,4 @@ vec3 getVelocityColorRelative(float velocityPixLength) { vec3 getVelocityColorAboveThreshold(float velocityPixLength) { return colorRamp((velocityPixLength - params.debugShowVelocityThreshold)/params.debugShowVelocityThreshold); -} \ No newline at end of file +} diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index a633b61821..29b32f0412 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -18,11 +18,11 @@ in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; void main(void) { - vec3 newColor = texture(currentMap, varTexCoord0).xyz; - outFragColor = vec4(newColor, 1.0); + vec3 nextColor = texture(nextMap, varTexCoord0).xyz; + outFragColor = vec4(nextColor, 1.0); // Pixel being shaded - vec3 sourceColor = texture(colorMap, varTexCoord0).xyz; + vec3 sourceColor = texture(sourceMap, varTexCoord0).xyz; vec2 imageSize = getWidthHeight(0); @@ -34,12 +34,14 @@ void main(void) { vec2 prevPix = prevTexCoord * imageSize; // Pixel Debugged - vec2 cursorUV = getDebugCursorTexcoord(); + vec3 cursorFrag = find_closest_fragment_3x3(getDebugCursorTexcoord()); + vec2 cursorUV = cursorFrag.xy; vec2 cursorPixelPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; vec2 cursorPrevUV = cursorUV - cursorVelocity; cursorVelocity *= imageSize; float cursorVelocityLength = length(cursorVelocity); + vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; vec2 cursorToFragVec = pixPos - cursorPixelPos; float cursorToFragLength = length(cursorToFragVec); @@ -60,25 +62,44 @@ void main(void) { float tenPercentHeight = 0.1 * imageSize.y; float centerWidth = imageSize.x * 0.5; - vec2 prevOrbPos = vec2(centerWidth - tenPercentHeight, imageSize.y - tenPercentHeight); + vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); + vec2 nextOrbPosToPix = pixPos - nextOrbPos; + + vec2 prevOrbPos = nextOrbPos + cursorVelocityDir * 2.0 * tenPercentHeight; vec2 prevOrbPosToPix = pixPos - prevOrbPos; + if (dot(prevOrbPosToPix, prevOrbPosToPix) < tenPercentHeight * tenPercentHeight) { - vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() * 0.5; + vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() / getOrbZoom(); vec3 preOrbColor = vec3(0.0); if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; } + float distanceToPrev = length(prevOrbPosToPix); + if (distanceToPrev < 2.0) { + preOrbColor = vec3(1.0, 0.0, 1.0); + } + float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv)); + if (distanceToNext < 2.0) { + preOrbColor = vec3(1.0, 0.5, 0.0); + } outFragColor = vec4(preOrbColor, 1.0); return; } - vec2 nextOrbPos = vec2(centerWidth + tenPercentHeight, imageSize.y - tenPercentHeight); - vec2 nextOrbPosToPix = pixPos - nextOrbPos; if (dot(nextOrbPosToPix, nextOrbPosToPix) < tenPercentHeight * tenPercentHeight) { - vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() * 0.5; + vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() / getOrbZoom(); vec3 nextOrbColor = vec3(0.0); if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { - nextOrbColor = texture(colorMap, nextOrbPosToPix_uv).xyz; + nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz; } + float distanceToPrev = length(imageSize * (cursorPrevUV - nextOrbPosToPix_uv)); + if (distanceToPrev < 2.0) { + nextOrbColor = vec3(1.0, 0.0, 1.0); + } + float distanceToNext = length(nextOrbPosToPix); + if (distanceToNext < 2.0) { + nextOrbColor = vec3(1.0, 0.5, 0.0); + } + outFragColor = vec4(nextOrbColor, 1.0); return; } @@ -94,9 +115,9 @@ void main(void) { return; } - outFragColor = vec4(sourceColor, 1.0); + outFragColor = vec4(nextColor, 1.0); - vec3 prevColor = sourceColor; + vec3 prevColor = nextColor; if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { prevColor = texture(historyMap, prevTexCoord).xyz; diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index 5a83501b4c..cef6afea84 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -40,6 +40,7 @@ void main(void) { vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); - vec2 imageSize = vec2(1.0, 1.0); // getWidthHeight(0); + //vec2 imageSize = getWidthHeight(0); + vec2 imageSize = vec2(1.0, 1.0); outFragColor = vec4( ((texcoordPos - prevUV) * imageSize), 0.0, 0.0); } diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index c09b5293bd..9076e9eee4 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -56,12 +56,14 @@ Column { max: 50 min: 0.0 } - CheckBox { - text: "Freeze " - checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] - onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } - } - + ConfigSlider { + label: qsTr("Debug Orb Zoom") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "debugOrbZoom" + max: 8.0 + min: 0.0 + } } } } From 051f8c5b40e10641456c298c66912f35af09d90b Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 23 Aug 2017 18:48:20 -0700 Subject: [PATCH 19/45] AH ah moment and exploring using the tablet with html --- .../render-utils/src/AntialiasingEffect.cpp | 19 ++-- .../render-utils/src/AntialiasingEffect.h | 23 ++++- libraries/render-utils/src/taa.slf | 8 +- libraries/render-utils/src/taa.slh | 34 +++---- libraries/render-utils/src/taa_blend.slf | 22 ++--- .../src/velocityBuffer_cameraMotion.slf | 2 +- .../utilities/render/TestQML/qml_app.js | 99 +++++++++++++++++++ .../utilities/render/antialiasing.qml | 16 ++- 8 files changed, 167 insertions(+), 56 deletions(-) create mode 100644 scripts/developer/utilities/render/TestQML/qml_app.js diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index fd576f89d0..b07eff949e 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -279,19 +279,14 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { } void Antialiasing::configure(const Config& config) { - _params.edit().debugX = config.debugX; _params.edit().blend = config.blend; _params.edit().velocityScale = config.velocityScale; _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; - _params.edit().debugCursor.x = config.showCursorPixel; - - auto orbZoom = (_params->pixelInfo.z); - auto cursorPos = glm::vec2(_params->pixelInfo); - if (cursorPos != config.debugCursorTexcoord || (orbZoom != config.debugOrbZoom)) { - _params.edit().pixelInfo = glm::vec4(config.debugCursorTexcoord, config.debugOrbZoom, 0.0f); - } - + _params.edit().debugX = config.debugX; + _params.edit().setDebug(config.debug); + _params.edit().setDebugCursor(config.debugCursorTexcoord); + _params.edit().setDebugOrbZoom(config.debugOrbZoom); } @@ -352,10 +347,10 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_SourceMapSlot, nullptr); batch.setFramebuffer(sourceBuffer); - if (_params->debugX <= 0.0) { - batch.setPipeline(getBlendPipeline()); - } else { + if (_params->isDebug()) { batch.setPipeline(getDebugBlendPipeline()); + } else { + batch.setPipeline(getBlendPipeline()); } batch.setResourceTexture(AntialiasingPass_NextMapSlot, _antialiasingTexture[nextFrame]); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 1fd3fb6584..f4b0b93915 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -20,9 +20,11 @@ class AntialiasingConfig : public render::Job::Config { Q_OBJECT - Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) + + Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) + Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) @@ -30,15 +32,17 @@ class AntialiasingConfig : public render::Job::Config { public: AntialiasingConfig() : render::Job::Config(true) {} - float debugX{ 0.0f }; float blend{ 0.1f }; float velocityScale{ 1.0f }; - float debugShowVelocityThreshold{ 1.0f }; - bool showCursorPixel{ false }; + float debugX{ 0.0f }; + float debugShowVelocityThreshold{ 1.0f }; glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; float debugOrbZoom{ 2.0f }; + bool debug { false }; + bool showCursorPixel { false }; + signals: void dirty(); }; @@ -50,9 +54,18 @@ struct TAAParams { float velocityScale{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; - glm::vec4 debugCursor{ 0.0f }; + glm::vec4 debug{ 0.0f }; glm::vec4 pixelInfo{ 0.5f, 0.5f, 2.0f, 0.0f }; + void setDebug(bool enabled) { debug.x = (float)enabled; } + bool isDebug() const { return (bool) debug.x; } + + void setDebugCursor(glm::vec2 debugCursor) { pixelInfo.x = debugCursor.x; pixelInfo.y = debugCursor.y; } + glm::vec2 getDebugCursor() const { return glm::vec2(pixelInfo.x, pixelInfo.y); } + + void setDebugOrbZoom(float orbZoom) { pixelInfo.z = orbZoom; } + float getDebugOrbZoom() const { return pixelInfo.z; } + }; using TAAParamsBuffer = gpu::StructBuffer; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index a3c6313b8e..4b2901b4fb 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -20,11 +20,11 @@ layout(location = 0) out vec4 outFragColor; void main() { - vec2 fragUV = find_closest_fragment_3x3(varTexCoord0); - vec3 sourceColor = texture(sourceMap, fragUV).xyz; + vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); + vec3 sourceColor = texture(sourceMap, fragUV.xy).xyz; - vec2 pixVelocity = texture(velocityMap, fragUV).xy; - vec2 velocity = params.motionScale * pixVelocity;// *getInvWidthHeight(); + vec2 pixVelocity = texture(velocityMap, fragUV.xy).xy; + vec2 velocity = params.motionScale * pixVelocity; vec2 prevTexCoord = varTexCoord0 - velocity; vec3 historyColor = sourceColor; diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index c2dc47707e..239d79a275 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -33,41 +33,37 @@ layout(std140) uniform taaParamsBuffer { TAAParams params; }; -vec2 getDebugCursorTexcoord() { +vec2 taa_getDebugCursorTexcoord() { return params.pixelInfo_orbZoom.xy; } -float getOrbZoom() { +float taa_getDebugOrbZoom() { return params.pixelInfo_orbZoom.z; } -float fetchDepth(vec2 uv) { +float taa_fetchDepth(vec2 uv) { return texture(depthMap, vec2(uv), 0).x; } -float resolveDepthLinear(float depth) { - return Zeye = -evalZeyeFromZdb(Zdb); - } - #define ZCMP_GT(a, b) (a < b) -vec3 find_closest_fragment_3x3(vec2 uv) +vec3 taa_findClosestFragment3x3(vec2 uv) { vec2 dd = abs(getInvWidthHeight()); vec2 du = vec2(dd.x, 0.0); vec2 dv = vec2(0.0, dd.y); - vec3 dtl = vec3(-1, -1, fetchDepth(uv - dv - du); - vec3 dtc = vec3( 0, -1, fetchDepth(uv - dv).x); - vec3 dtr = vec3( 1, -1, fetchDepth(uv - dv + du); + vec3 dtl = vec3(-1, -1, taa_fetchDepth(uv - dv - du)); + vec3 dtc = vec3( 0, -1, taa_fetchDepth(uv - dv)); + vec3 dtr = vec3( 1, -1, taa_fetchDepth(uv - dv + du)); - vec3 dml = vec3(-1, 0, fetchDepth(CameraDepthTexture, uv - du); - vec3 dmc = vec3( 0, 0, fetchDepth(CameraDepthTexture, uv); - vec3 dmr = vec3( 1, 0, fetchDepth(CameraDepthTexture, uv + du); + vec3 dml = vec3(-1, 0, taa_fetchDepth(uv - du)); + vec3 dmc = vec3( 0, 0, taa_fetchDepth(uv)); + vec3 dmr = vec3( 1, 0, taa_fetchDepth(uv + du)); - vec3 dbl = vec3(-1, 1, fetchDepth(CameraDepthTexture, uv + dv - du); - vec3 dbc = vec3( 0, 1, fetchDepth(CameraDepthTexture, uv + dv); - vec3 dbr = vec3( 1, 1, fetchDepth(CameraDepthTexture, uv + dv + du); + vec3 dbl = vec3(-1, 1, taa_fetchDepth(uv + dv - du)); + vec3 dbc = vec3( 0, 1, taa_fetchDepth(uv + dv)); + vec3 dbr = vec3( 1, 1, taa_fetchDepth(uv + dv + du)); vec3 dmin = dtl; if (ZCMP_GT(dmin.z, dtc.z)) dmin = dtc; @@ -88,10 +84,10 @@ vec3 find_closest_fragment_3x3(vec2 uv) <@include gpu/Color.slh@> <$declareColorWheel()$> -vec3 getVelocityColorRelative(float velocityPixLength) { +vec3 taa_getVelocityColorRelative(float velocityPixLength) { return colorRamp(velocityPixLength/params.debugShowVelocityThreshold); } -vec3 getVelocityColorAboveThreshold(float velocityPixLength) { +vec3 taa_getVelocityColorAboveThreshold(float velocityPixLength) { return colorRamp((velocityPixLength - params.debugShowVelocityThreshold)/params.debugShowVelocityThreshold); } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 29b32f0412..3be62353a3 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -34,7 +34,7 @@ void main(void) { vec2 prevPix = prevTexCoord * imageSize; // Pixel Debugged - vec3 cursorFrag = find_closest_fragment_3x3(getDebugCursorTexcoord()); + vec3 cursorFrag = taa_findClosestFragment3x3(taa_getDebugCursorTexcoord()); vec2 cursorUV = cursorFrag.xy; vec2 cursorPixelPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; @@ -52,7 +52,7 @@ void main(void) { if ((dot(cursorVelocityDir, cursorToFragVec) < 0) && abs(dot(cursorVelocityNor, cursorToFragVec)) < 1.0) { - vec3 speedColor = getVelocityColorRelative(cursorToFragLength); + vec3 speedColor = taa_getVelocityColorRelative(cursorToFragLength); outFragColor = vec4(speedColor, 1.0); return; @@ -64,18 +64,19 @@ void main(void) { vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); vec2 nextOrbPosToPix = pixPos - nextOrbPos; + float nextOrbPosToPixLength = length(nextOrbPosToPix); vec2 prevOrbPos = nextOrbPos + cursorVelocityDir * 2.0 * tenPercentHeight; vec2 prevOrbPosToPix = pixPos - prevOrbPos; + float prevOrbPosToPixLength = length(prevOrbPosToPix); - if (dot(prevOrbPosToPix, prevOrbPosToPix) < tenPercentHeight * tenPercentHeight) { - vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() / getOrbZoom(); + if ((prevOrbPosToPixLength < tenPercentHeight) && (cursorVelocityLength > 0.5)) { + vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() / taa_getDebugOrbZoom(); vec3 preOrbColor = vec3(0.0); if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; } - float distanceToPrev = length(prevOrbPosToPix); - if (distanceToPrev < 2.0) { + if (prevOrbPosToPixLength < 2.0) { preOrbColor = vec3(1.0, 0.0, 1.0); } float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv)); @@ -85,8 +86,8 @@ void main(void) { outFragColor = vec4(preOrbColor, 1.0); return; } - if (dot(nextOrbPosToPix, nextOrbPosToPix) < tenPercentHeight * tenPercentHeight) { - vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() / getOrbZoom(); + if (nextOrbPosToPixLength < tenPercentHeight) { + vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() / taa_getDebugOrbZoom(); vec3 nextOrbColor = vec3(0.0); if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz; @@ -95,8 +96,7 @@ void main(void) { if (distanceToPrev < 2.0) { nextOrbColor = vec3(1.0, 0.0, 1.0); } - float distanceToNext = length(nextOrbPosToPix); - if (distanceToNext < 2.0) { + if (nextOrbPosToPixLength < 2.0) { nextOrbColor = vec3(1.0, 0.5, 0.0); } @@ -125,7 +125,7 @@ void main(void) { outFragColor.xyz = prevColor; if (pixVelocityLength > params.debugShowVelocityThreshold) { - vec3 speedColor = getVelocityColorAboveThreshold(pixVelocityLength); + vec3 speedColor = taa_getVelocityColorAboveThreshold(pixVelocityLength); outFragColor = vec4(0.0, 1.0, 1.0, 1.0); } diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index cef6afea84..d44219d25f 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -26,7 +26,7 @@ void main(void) { ivec2 framePixelPos = getPixelPosTexcoordPosAndSide(gl_FragCoord.xy, pixelPos, texcoordPos, stereoSide); float Zdb = texelFetch(depthMap, ivec2(gl_FragCoord.xy), 0).x; - float Zeye = -evalZeyeFromZdb(Zdb); + float Zeye = evalZeyeFromZdb(Zdb); if (Zeye <= -getPosLinearDepthFar()) { outFragColor = vec4(0.5, 0.5, 0.0, 0.0); return; diff --git a/scripts/developer/utilities/render/TestQML/qml_app.js b/scripts/developer/utilities/render/TestQML/qml_app.js new file mode 100644 index 0000000000..a563c52b6c --- /dev/null +++ b/scripts/developer/utilities/render/TestQML/qml_app.js @@ -0,0 +1,99 @@ +"use strict"; + +// +// gemstoneMagicMaker.js +// tablet-sample-app +// +// Created by Faye Li on Feb 6 2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +(function() { + var TABLET_BUTTON_NAME = "LUCI"; + var QMLAPP_URL = Script.resolvePath("../antialiasing.qml"); + + + var onLuciScreen = false; + + function onClicked() { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } else { + tablet.loadQMLSource(QMLAPP_URL); + } + } + + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + var button = tablet.addButton({ + text: TABLET_BUTTON_NAME, + sortOrder: 1 + }); + + var hasEventBridge = false; + + function wireEventBridge(on) { + if (!tablet) { + print("Warning in wireEventBridge(): 'tablet' undefined!"); + return; + } + if (on) { + if (!hasEventBridge) { + tablet.fromQml.connect(fromQml); + hasEventBridge = true; + } + } else { + if (hasEventBridge) { + tablet.fromQml.disconnect(fromQml); + hasEventBridge = false; + } + } + } + + function onScreenChanged(type, url) { + if (url === QMLAPP_URL) { + onLuciScreen = true; + } else { + onLuciScreen = false; + } + + button.editProperties({isActive: onLuciScreen}); + wireEventBridge(onLuciScreen); + } + + function fromQml(message) { + } + + button.clicked.connect(onClicked); + tablet.screenChanged.connect(onScreenChanged); + + var moveDebugCursor = false; + Controller.mousePressEvent.connect(function (e) { + if (e.isMiddleButton) { + moveDebugCursor = true; + setDebugCursor(e.x, e.y); + } + }); + Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; }); + Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); }); + + + Script.scriptEnding.connect(function () { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } + button.clicked.disconnect(onClicked); + tablet.screenChanged.disconnect(onScreenChanged); + tablet.removeButton(button); + }); + + function setDebugCursor(x, y) { + nx = (x / Window.innerWidth); + ny = 1.0 - ((y) / (Window.innerHeight - 32)); + + Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny }; + } + +}()); \ No newline at end of file diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 9076e9eee4..4f048a6533 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -8,12 +8,15 @@ // See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html // import QtQuick 2.5 +import QtQuick.Layouts 1.3 import QtQuick.Controls 1.4 import "configSlider" import "../lib/plotperf" Column { - spacing: 8 + id: root; + // color: hifi.colors.baseGray; + Column { id: antialiasing spacing: 20 @@ -36,9 +39,14 @@ Column { min: 0.0 } CheckBox { - text: "Freeze " - checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] - onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } + text: "Debug" + checked: Render.getConfig("RenderMainView.Antialiasing")["debug"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["debug"] = checked } + } + CheckBox { + text: "Freeze " + checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] + onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } } ConfigSlider { label: qsTr("Debug X") From 9335acc887873fba59583ab3fe9276090a48ad04 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 24 Aug 2017 18:02:11 -0700 Subject: [PATCH 20/45] Merge and a lot of rewriting the color conversion --- .../entities-renderer/src/paintStroke.slv | 2 +- .../src/paintStroke_fade.slv | 2 +- libraries/gpu/src/gpu/Color.slh | 37 ++++- libraries/render-utils/src/animdebugdraw.slv | 2 +- libraries/render-utils/src/model.slv | 2 +- libraries/render-utils/src/model_fade.slv | 2 +- libraries/render-utils/src/model_lightmap.slv | 2 +- .../render-utils/src/model_lightmap_fade.slv | 2 +- .../src/model_lightmap_normal_map.slv | 2 +- .../src/model_lightmap_normal_map_fade.slv | 2 +- .../render-utils/src/model_normal_map.slv | 2 +- .../src/model_normal_map_fade.slv | 2 +- libraries/render-utils/src/overlay3D.slv | 2 +- libraries/render-utils/src/simple.slv | 2 +- libraries/render-utils/src/simple_fade.slv | 2 +- .../src/simple_opaque_web_browser.slf | 2 +- .../render-utils/src/simple_textured.slf | 2 +- .../render-utils/src/simple_textured_fade.slf | 2 +- .../src/simple_textured_unlit.slf | 2 +- .../src/simple_textured_unlit_fade.slf | 2 +- .../src/simple_transparent_textured.slf | 2 +- .../src/simple_transparent_textured_fade.slf | 2 +- .../src/simple_transparent_textured_unlit.slf | 2 +- ...simple_transparent_textured_unlit_fade.slf | 2 +- .../src/simple_transparent_web_browser.slf | 2 +- libraries/render-utils/src/skin_model.slv | 2 +- .../render-utils/src/skin_model_fade.slv | 2 +- .../src/skin_model_normal_map.slv | 2 +- .../src/skin_model_normal_map_fade.slv | 2 +- .../src/standardTransformPNTC.slv | 2 +- libraries/render-utils/src/taa.slf | 16 +-- libraries/render-utils/src/taa.slh | 133 +++++++++++++++++- libraries/render-utils/src/taa_blend.slf | 2 +- .../utilities/render/TestQML/qml_app.js | 99 ------------- .../utilities/render/deferredLighting.qml | 1 + 35 files changed, 201 insertions(+), 145 deletions(-) delete mode 100644 scripts/developer/utilities/render/TestQML/qml_app.js diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index 769b87f2a9..0cf9596cce 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -30,7 +30,7 @@ void main(void) { varTexcoord = inTexCoord0.st; // pass along the diffuse color - varColor = colorToLinearRGBA(inColor); + varColor = color_sRGBAToLinear(inColor); // standard transform diff --git a/libraries/entities-renderer/src/paintStroke_fade.slv b/libraries/entities-renderer/src/paintStroke_fade.slv index 9f10fa5d91..b6075caaf8 100644 --- a/libraries/entities-renderer/src/paintStroke_fade.slv +++ b/libraries/entities-renderer/src/paintStroke_fade.slv @@ -31,7 +31,7 @@ void main(void) { varTexcoord = inTexCoord0.st; // pass along the diffuse color - varColor = colorToLinearRGBA(inColor); + varColor = color_sRGBAToLinear(inColor); // standard transform diff --git a/libraries/gpu/src/gpu/Color.slh b/libraries/gpu/src/gpu/Color.slh index 526cc3dd46..d70e588f4d 100644 --- a/libraries/gpu/src/gpu/Color.slh +++ b/libraries/gpu/src/gpu/Color.slh @@ -11,18 +11,45 @@ <@if not GPU_COLOR_SLH@> <@def GPU_COLOR_SLH@> -float sRGBFloatToLinear(float value) { +// Linear ====> linear RGB +// sRGB ======> standard RGB with gamma of 2.2 +// YCoCg =====> Luma (Y) chrominance green (Cg) and chrominance orange (Co) +// https://software.intel.com/en-us/node/503873 + +float color_scalar_sRGBToLinear(float value) { const float SRGB_ELBOW = 0.04045; return (value <= SRGB_ELBOW) ? value / 12.92 : pow((value + 0.055) / 1.055, 2.4); } -vec3 colorToLinearRGB(vec3 srgb) { - return vec3(sRGBFloatToLinear(srgb.r), sRGBFloatToLinear(srgb.g), sRGBFloatToLinear(srgb.b)); +vec3 color_sRGBToLinear(vec3 srgb) { + return vec3(color_scalar_sRGBToLinear(srgb.r), color_scalar_sRGBToLinear(srgb.g), color_scalar_sRGBToLinear(srgb.b)); } -vec4 colorToLinearRGBA(vec4 srgba) { - return vec4(colorToLinearRGB(srgba.xyz), srgba.w); +vec4 color_sRGBAToLinear(vec4 srgba) { + return vec4(color_sRGBToLinear(srgba.xyz), srgba.w); +} + +vec3 color_LinearToYCoCg(vec3 rgb) { + // Y = R/4 + G/2 + B/4 + // Co = R/2 - B/2 + // Cg = -R/4 + G/2 - B/4 + return vec3( + rgb.x/4.0 + rgb.y/2.0 + rgb.z/4.0, + rgb.x/2.0 - rgb.z/2.0, + -rgb.x/4.0 + rgb.y/2.0 - rgb.z/4.0 + ); +} + +vec3 color_YCoCgToLinear(vec3 ycocg) { + // R = Y + Co - Cg + // G = Y + Cg + // B = Y - Co - Cg + return clamp(vec3( + ycocg.x + ycocg.y - ycocg.z, + ycocg.x + ycocg.z, + ycocg.x - ycocg.y - ycocg.z + ), vec3(0.0), vec3(1.0)); } <@func declareColorWheel()@> diff --git a/libraries/render-utils/src/animdebugdraw.slv b/libraries/render-utils/src/animdebugdraw.slv index ffa44b6cee..3255c6783c 100644 --- a/libraries/render-utils/src/animdebugdraw.slv +++ b/libraries/render-utils/src/animdebugdraw.slv @@ -17,7 +17,7 @@ out vec4 _color; void main(void) { // pass along the color - _color = colorToLinearRGBA(inColor.rgba); + _color = color_sRGBAToLinear(inColor.rgba); TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 06f6030e77..ccedff9b61 100644 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -27,7 +27,7 @@ out vec4 _position; out vec3 _normal; void main(void) { - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); _alpha = inColor.w; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/model_fade.slv b/libraries/render-utils/src/model_fade.slv index 4c6bc534a9..61b8e9e1b6 100644 --- a/libraries/render-utils/src/model_fade.slv +++ b/libraries/render-utils/src/model_fade.slv @@ -28,7 +28,7 @@ out vec3 _normal; out vec3 _color; void main(void) { - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); _alpha = inColor.w; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index 161ceed14c..e00fcb708e 100644 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -28,7 +28,7 @@ out vec3 _color; void main(void) { // pass along the color in linear space - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); // and the texture coordinates TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/model_lightmap_fade.slv b/libraries/render-utils/src/model_lightmap_fade.slv index 561049d614..d1a1194de1 100644 --- a/libraries/render-utils/src/model_lightmap_fade.slv +++ b/libraries/render-utils/src/model_lightmap_fade.slv @@ -29,7 +29,7 @@ out vec4 _worldPosition; void main(void) { // pass along the color in linear space - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); // and the texture coordinates TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/model_lightmap_normal_map.slv b/libraries/render-utils/src/model_lightmap_normal_map.slv index 5fb60d9227..3b1ecaab0c 100644 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -29,7 +29,7 @@ out vec3 _color; void main(void) { // pass along the color in linear space - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); TexMapArray texMapArray = getTexMapArray(); <$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord0)$> diff --git a/libraries/render-utils/src/model_lightmap_normal_map_fade.slv b/libraries/render-utils/src/model_lightmap_normal_map_fade.slv index 4049fb0077..5c1212b1b7 100644 --- a/libraries/render-utils/src/model_lightmap_normal_map_fade.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map_fade.slv @@ -30,7 +30,7 @@ out vec4 _worldPosition; void main(void) { // pass along the color in linear space - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); TexMapArray texMapArray = getTexMapArray(); <$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord0)$> diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 9e674d93fc..a84f8c5e2a 100644 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -30,7 +30,7 @@ out float _alpha; void main(void) { // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/model_normal_map_fade.slv b/libraries/render-utils/src/model_normal_map_fade.slv index a71900d5c3..6a6142d317 100644 --- a/libraries/render-utils/src/model_normal_map_fade.slv +++ b/libraries/render-utils/src/model_normal_map_fade.slv @@ -31,7 +31,7 @@ out float _alpha; void main(void) { // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/overlay3D.slv b/libraries/render-utils/src/overlay3D.slv index ee28367413..7184f923e4 100644 --- a/libraries/render-utils/src/overlay3D.slv +++ b/libraries/render-utils/src/overlay3D.slv @@ -23,7 +23,7 @@ out vec4 _position; out vec3 _normal; void main(void) { - _color = colorToLinearRGB(inColor.xyz); + _color = color_sRGBToLinear(inColor.xyz); _alpha = inColor.w; _texCoord0 = inTexCoord0.st; diff --git a/libraries/render-utils/src/simple.slv b/libraries/render-utils/src/simple.slv index 64d3e24192..0ce6505a65 100644 --- a/libraries/render-utils/src/simple.slv +++ b/libraries/render-utils/src/simple.slv @@ -25,7 +25,7 @@ out vec2 _texCoord0; out vec4 _position; void main(void) { - _color = colorToLinearRGBA(inColor); + _color = color_sRGBAToLinear(inColor); _texCoord0 = inTexCoord0.st; _position = inPosition; _modelNormal = inNormal.xyz; diff --git a/libraries/render-utils/src/simple_fade.slv b/libraries/render-utils/src/simple_fade.slv index 3d9eb2c812..85946045ac 100644 --- a/libraries/render-utils/src/simple_fade.slv +++ b/libraries/render-utils/src/simple_fade.slv @@ -29,7 +29,7 @@ out vec4 _position; out vec4 _worldPosition; void main(void) { - _color = colorToLinearRGBA(inColor); + _color = color_sRGBAToLinear(inColor); _texCoord0 = inTexCoord0.st; _position = inPosition; _modelNormal = inNormal.xyz; diff --git a/libraries/render-utils/src/simple_opaque_web_browser.slf b/libraries/render-utils/src/simple_opaque_web_browser.slf index 3acf104b55..af7ef78682 100644 --- a/libraries/render-utils/src/simple_opaque_web_browser.slf +++ b/libraries/render-utils/src/simple_opaque_web_browser.slf @@ -25,6 +25,6 @@ in vec2 _texCoord0; void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); packDeferredFragmentUnlit(normalize(_normal), 1.0, _color.rgb * texel.rgb); } diff --git a/libraries/render-utils/src/simple_textured.slf b/libraries/render-utils/src/simple_textured.slf index 550f6546fd..385270c72c 100644 --- a/libraries/render-utils/src/simple_textured.slf +++ b/libraries/render-utils/src/simple_textured.slf @@ -28,7 +28,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } diff --git a/libraries/render-utils/src/simple_textured_fade.slf b/libraries/render-utils/src/simple_textured_fade.slf index 025fe5fca6..75dac714fe 100644 --- a/libraries/render-utils/src/simple_textured_fade.slf +++ b/libraries/render-utils/src/simple_textured_fade.slf @@ -40,7 +40,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } diff --git a/libraries/render-utils/src/simple_textured_unlit.slf b/libraries/render-utils/src/simple_textured_unlit.slf index d261fb343a..1daea2f5c7 100644 --- a/libraries/render-utils/src/simple_textured_unlit.slf +++ b/libraries/render-utils/src/simple_textured_unlit.slf @@ -27,7 +27,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } diff --git a/libraries/render-utils/src/simple_textured_unlit_fade.slf b/libraries/render-utils/src/simple_textured_unlit_fade.slf index 6f03c6746f..b3c5a914b2 100644 --- a/libraries/render-utils/src/simple_textured_unlit_fade.slf +++ b/libraries/render-utils/src/simple_textured_unlit_fade.slf @@ -39,7 +39,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } diff --git a/libraries/render-utils/src/simple_transparent_textured.slf b/libraries/render-utils/src/simple_transparent_textured.slf index b9eb921e9d..8f0216690f 100644 --- a/libraries/render-utils/src/simple_transparent_textured.slf +++ b/libraries/render-utils/src/simple_transparent_textured.slf @@ -34,7 +34,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float opacity = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); opacity = -_color.a; } opacity *= texel.a; diff --git a/libraries/render-utils/src/simple_transparent_textured_fade.slf b/libraries/render-utils/src/simple_transparent_textured_fade.slf index 20c7907bbe..cee443e3be 100644 --- a/libraries/render-utils/src/simple_transparent_textured_fade.slf +++ b/libraries/render-utils/src/simple_transparent_textured_fade.slf @@ -46,7 +46,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float opacity = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); opacity = -_color.a; } opacity *= texel.a; diff --git a/libraries/render-utils/src/simple_transparent_textured_unlit.slf b/libraries/render-utils/src/simple_transparent_textured_unlit.slf index 693d7be2db..e9c1104cf0 100644 --- a/libraries/render-utils/src/simple_transparent_textured_unlit.slf +++ b/libraries/render-utils/src/simple_transparent_textured_unlit.slf @@ -29,7 +29,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } _fragColor0 = vec4(_color.rgb * texel.rgb, colorAlpha * texel.a); diff --git a/libraries/render-utils/src/simple_transparent_textured_unlit_fade.slf b/libraries/render-utils/src/simple_transparent_textured_unlit_fade.slf index 1c42a1f724..093b70755f 100644 --- a/libraries/render-utils/src/simple_transparent_textured_unlit_fade.slf +++ b/libraries/render-utils/src/simple_transparent_textured_unlit_fade.slf @@ -40,7 +40,7 @@ void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); float colorAlpha = _color.a; if (_color.a <= 0.0) { - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); colorAlpha = -_color.a; } _fragColor0 = vec4(_color.rgb * texel.rgb+fadeEmissive, colorAlpha * texel.a); diff --git a/libraries/render-utils/src/simple_transparent_web_browser.slf b/libraries/render-utils/src/simple_transparent_web_browser.slf index 19079f5d92..414f3f683f 100644 --- a/libraries/render-utils/src/simple_transparent_web_browser.slf +++ b/libraries/render-utils/src/simple_transparent_web_browser.slf @@ -25,7 +25,7 @@ in vec2 _texCoord0; void main(void) { vec4 texel = texture(originalTexture, _texCoord0.st); - texel = colorToLinearRGBA(texel); + texel = color_sRGBAToLinear(texel); packDeferredFragmentTranslucent( normalize(_normal), _color.a, diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 4236508edb..46ed45e9be 100644 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -36,7 +36,7 @@ void main(void) { skinPositionNormal(inSkinClusterIndex, inSkinClusterWeight, inPosition, inNormal.xyz, position, interpolatedNormal); // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/skin_model_fade.slv b/libraries/render-utils/src/skin_model_fade.slv index fa8e1f8991..ca4500a18a 100644 --- a/libraries/render-utils/src/skin_model_fade.slv +++ b/libraries/render-utils/src/skin_model_fade.slv @@ -37,7 +37,7 @@ void main(void) { skinPositionNormal(inSkinClusterIndex, inSkinClusterWeight, inPosition, inNormal.xyz, position, interpolatedNormal); // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index 9f1087f87a..3bf057c3c1 100644 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -38,7 +38,7 @@ void main(void) { skinPositionNormalTangent(inSkinClusterIndex, inSkinClusterWeight, inPosition, inNormal.xyz, inTangent.xyz, position, interpolatedNormal.xyz, interpolatedTangent.xyz); // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/skin_model_normal_map_fade.slv b/libraries/render-utils/src/skin_model_normal_map_fade.slv index 4e638866fc..032ef001d9 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade.slv @@ -39,7 +39,7 @@ void main(void) { skinPositionNormalTangent(inSkinClusterIndex, inSkinClusterWeight, inPosition, inNormal.xyz, inTangent.xyz, position, interpolatedNormal.xyz, interpolatedTangent.xyz); // pass along the color - _color = colorToLinearRGB(inColor.rgb); + _color = color_sRGBToLinear(inColor.rgb); _alpha = inColor.a; TexMapArray texMapArray = getTexMapArray(); diff --git a/libraries/render-utils/src/standardTransformPNTC.slv b/libraries/render-utils/src/standardTransformPNTC.slv index 0ced5ba6e2..8ec685cea0 100644 --- a/libraries/render-utils/src/standardTransformPNTC.slv +++ b/libraries/render-utils/src/standardTransformPNTC.slv @@ -24,7 +24,7 @@ out vec4 varColor; void main(void) { varTexCoord0 = inTexCoord0.st; - varColor = colorToLinearRGBA(inColor); + varColor = color_sRGBAToLinear(inColor); // standard transform TransformCamera cam = getTransformCamera(); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 4b2901b4fb..aa88cc61e2 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -21,19 +21,15 @@ layout(location = 0) out vec4 outFragColor; void main() { vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); - vec3 sourceColor = texture(sourceMap, fragUV.xy).xyz; + vec2 fragVel = taa_fetchVelocityMap(fragUV.xy); - vec2 pixVelocity = texture(velocityMap, fragUV.xy).xy; - vec2 velocity = params.motionScale * pixVelocity; - vec2 prevTexCoord = varTexCoord0 - velocity; - - vec3 historyColor = sourceColor; - - if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { - historyColor = texture(historyMap, prevTexCoord).xyz; - } + vec3 sourceColor; + vec3 historyColor; + //vec3 nextColor = taa_temporalReprojection(fragUV.xy, fragVel, fragUV.z); + vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV.xy, fragVel, sourceColor, historyColor); vec3 nextColor = mix(historyColor, sourceColor, params.blend); + outFragColor = vec4(nextColor, 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 239d79a275..ad27ae4939 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -13,6 +13,8 @@ <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> +<@include gpu/Color.slh@> + uniform sampler2D depthMap; uniform sampler2D sourceMap; uniform sampler2D historyMap; @@ -41,10 +43,59 @@ float taa_getDebugOrbZoom() { return params.pixelInfo_orbZoom.z; } +vec4 taa_fetchColor(sampler2D map, vec2 uv) { +#if USE_YCOCG + vec4 c = texture(map, uv); + return vec4(color_LinearToYCoCg(c.rgb), c.a); +#else + return texture(map, uv); +#endif +} + +vec3 taa_resolveColor(vec3 color) { +#if USE_YCOCG + return color_YCoCgToLinear(color); +#else + return color; +#endif +} + +vec4 taa_fetchSourceMap(vec2 uv) { +#if USE_YCOCG + vec4 c = texture(sourceMap, uv); + return vec4(color_LinearToYCoCg(c.rgb), c.a); +#else + return texture(sourceMap, uv); +#endif +} + +vec4 taa_fetchHistoryMap(vec2 uv) { +#if USE_YCOCG + vec4 c = texture(historyMap, uv); + return vec4(color_LinearToYCoCg(c.rgb), c.a); +#else + return texture(historyMap, uv); +#endif +} + +vec4 taa_fetchNextMap(vec2 uv) { +#if USE_YCOCG + vec4 c = texture(nextMap, uv); + return vec4(color_LinearToYCoCg(c.rgb), c.a); +#else + return texture(nextMap, uv); +#endif +} + +vec2 taa_fetchVelocityMap(vec2 uv) { + return params.motionScale * texture(velocityMap, uv).xy; +} + float taa_fetchDepth(vec2 uv) { return texture(depthMap, vec2(uv), 0).x; } + #define ZCMP_GT(a, b) (a < b) vec3 taa_findClosestFragment3x3(vec2 uv) @@ -80,8 +131,88 @@ vec3 taa_findClosestFragment3x3(vec2 uv) return vec3(uv + dd.xy * dmin.xy, dmin.z); } +vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { + sourceColor = taa_fetchSourceMap(fragUV).xyz; + vec2 prevFragUV = fragUV - fragVelocity; + historyColor = sourceColor; + if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { + historyColor = taa_fetchHistoryMap(prevFragUV).xyz; + } + return prevFragUV; +} + +vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) +{ + vec3 sourceColor; + vec3 historyColor; + vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVelocity, sourceColor, historyColor); + + vec3 nextColor = mix(historyColor, sourceColor, params.blend); + + return taa_resolveColor(nextColor); + +/* + const float _SubpixelThreshold = 0.5; + const float _GatherBase = 0.5; + const float _GatherSubpixelMotion = 0.1666; + + float2 texel_vel = ss_vel / _MainTex_TexelSize.xy; + float texel_vel_mag = length(texel_vel) * fragZe; + float k_subpixel_motion = saturate(_SubpixelThreshold / (FLT_EPS + texel_vel_mag)); + float k_min_max_support = _GatherBase + _GatherSubpixelMotion * k_subpixel_motion; + + float2 ss_offset01 = k_min_max_support * float2(-_MainTex_TexelSize.x, _MainTex_TexelSize.y); + float2 ss_offset11 = k_min_max_support * float2(_MainTex_TexelSize.x, _MainTex_TexelSize.y); + float4 c00 = taa_fetchSourceMap(uv - ss_offset11); + float4 c10 = taa_fetchSourceMap(uv - ss_offset01); + float4 c01 = taa_fetchSourceMap(uv + ss_offset01); + float4 c11 = taa_fetchSourceMap(uv + ss_offset11); + + float4 cmin = min(c00, min(c10, min(c01, c11))); + float4 cmax = max(c00, max(c10, max(c01, c11))); + + #if USE_YCOCG || USE_CLIPPING + float4 cavg = (c00 + c10 + c01 + c11) / 4.0; + #endif + + #else + #error "missing keyword MINMAX_..." + #endif + + // shrink chroma min-max + #if USE_YCOCG + float2 chroma_extent = 0.25 * 0.5 * (cmax.r - cmin.r); + float2 chroma_center = texel0.gb; + cmin.yz = chroma_center - chroma_extent; + cmax.yz = chroma_center + chroma_extent; + cavg.yz = chroma_center; + #endif + + // clamp to neighbourhood of current sample + #if USE_CLIPPING + texel1 = clip_aabb(cmin.xyz, cmax.xyz, clamp(cavg, cmin, cmax), texel1); + #else + texel1 = clamp(texel1, cmin, cmax); + #endif + + // feedback weight from unbiased luminance diff (t.lottes) + #if USE_YCOCG + float lum0 = texel0.r; + float lum1 = texel1.r; + #else + float lum0 = Luminance(texel0.rgb); + float lum1 = Luminance(texel1.rgb); + #endif + float unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2)); + float unbiased_weight = 1.0 - unbiased_diff; + float unbiased_weight_sqr = unbiased_weight * unbiased_weight; + float k_feedback = lerp(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); + + // output + return lerp(texel0, texel1, k_feedback); + */ +} -<@include gpu/Color.slh@> <$declareColorWheel()$> vec3 taa_getVelocityColorRelative(float velocityPixLength) { diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 3be62353a3..c66957a0ab 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -66,7 +66,7 @@ void main(void) { vec2 nextOrbPosToPix = pixPos - nextOrbPos; float nextOrbPosToPixLength = length(nextOrbPosToPix); - vec2 prevOrbPos = nextOrbPos + cursorVelocityDir * 2.0 * tenPercentHeight; + vec2 prevOrbPos = nextOrbPos - cursorVelocityDir * 2.0 * tenPercentHeight; vec2 prevOrbPosToPix = pixPos - prevOrbPos; float prevOrbPosToPixLength = length(prevOrbPosToPix); diff --git a/scripts/developer/utilities/render/TestQML/qml_app.js b/scripts/developer/utilities/render/TestQML/qml_app.js deleted file mode 100644 index a563c52b6c..0000000000 --- a/scripts/developer/utilities/render/TestQML/qml_app.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; - -// -// gemstoneMagicMaker.js -// tablet-sample-app -// -// Created by Faye Li on Feb 6 2017. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -(function() { - var TABLET_BUTTON_NAME = "LUCI"; - var QMLAPP_URL = Script.resolvePath("../antialiasing.qml"); - - - var onLuciScreen = false; - - function onClicked() { - if (onLuciScreen) { - tablet.gotoHomeScreen(); - } else { - tablet.loadQMLSource(QMLAPP_URL); - } - } - - var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); - var button = tablet.addButton({ - text: TABLET_BUTTON_NAME, - sortOrder: 1 - }); - - var hasEventBridge = false; - - function wireEventBridge(on) { - if (!tablet) { - print("Warning in wireEventBridge(): 'tablet' undefined!"); - return; - } - if (on) { - if (!hasEventBridge) { - tablet.fromQml.connect(fromQml); - hasEventBridge = true; - } - } else { - if (hasEventBridge) { - tablet.fromQml.disconnect(fromQml); - hasEventBridge = false; - } - } - } - - function onScreenChanged(type, url) { - if (url === QMLAPP_URL) { - onLuciScreen = true; - } else { - onLuciScreen = false; - } - - button.editProperties({isActive: onLuciScreen}); - wireEventBridge(onLuciScreen); - } - - function fromQml(message) { - } - - button.clicked.connect(onClicked); - tablet.screenChanged.connect(onScreenChanged); - - var moveDebugCursor = false; - Controller.mousePressEvent.connect(function (e) { - if (e.isMiddleButton) { - moveDebugCursor = true; - setDebugCursor(e.x, e.y); - } - }); - Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; }); - Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); }); - - - Script.scriptEnding.connect(function () { - if (onLuciScreen) { - tablet.gotoHomeScreen(); - } - button.clicked.disconnect(onClicked); - tablet.screenChanged.disconnect(onScreenChanged); - tablet.removeButton(button); - }); - - function setDebugCursor(x, y) { - nx = (x / Window.innerWidth); - ny = 1.0 - ((y) / (Window.innerHeight - 32)); - - Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny }; - } - -}()); \ No newline at end of file diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index de7802d723..a369301570 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -12,6 +12,7 @@ import QtQuick.Controls 1.4 import "configSlider" Column { + id: root spacing: 8 property var mainViewTask: Render.getConfig("RenderMainView") From 914db1d5a67bcf0be1c06f0927d8f3cd93947215 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 24 Aug 2017 18:06:07 -0700 Subject: [PATCH 21/45] adding the tablet apps --- .../utilities/render/TestQML/antialiasing.js | 99 +++++++++++++++++++ .../utilities/render/TestQML/luci.js | 99 +++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 scripts/developer/utilities/render/TestQML/antialiasing.js create mode 100644 scripts/developer/utilities/render/TestQML/luci.js diff --git a/scripts/developer/utilities/render/TestQML/antialiasing.js b/scripts/developer/utilities/render/TestQML/antialiasing.js new file mode 100644 index 0000000000..c6dab6eb15 --- /dev/null +++ b/scripts/developer/utilities/render/TestQML/antialiasing.js @@ -0,0 +1,99 @@ +"use strict"; + +// +// gemstoneMagicMaker.js +// tablet-sample-app +// +// Created by Faye Li on Feb 6 2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +(function() { + var TABLET_BUTTON_NAME = "TAA"; + var QMLAPP_URL = Script.resolvePath("../antialiasing.qml"); + + + var onLuciScreen = false; + + function onClicked() { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } else { + tablet.loadQMLSource(QMLAPP_URL); + } + } + + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + var button = tablet.addButton({ + text: TABLET_BUTTON_NAME, + sortOrder: 1 + }); + + var hasEventBridge = false; + + function wireEventBridge(on) { + if (!tablet) { + print("Warning in wireEventBridge(): 'tablet' undefined!"); + return; + } + if (on) { + if (!hasEventBridge) { + tablet.fromQml.connect(fromQml); + hasEventBridge = true; + } + } else { + if (hasEventBridge) { + tablet.fromQml.disconnect(fromQml); + hasEventBridge = false; + } + } + } + + function onScreenChanged(type, url) { + if (url === QMLAPP_URL) { + onLuciScreen = true; + } else { + onLuciScreen = false; + } + + button.editProperties({isActive: onLuciScreen}); + wireEventBridge(onLuciScreen); + } + + function fromQml(message) { + } + + button.clicked.connect(onClicked); + tablet.screenChanged.connect(onScreenChanged); + + var moveDebugCursor = false; + Controller.mousePressEvent.connect(function (e) { + if (e.isMiddleButton) { + moveDebugCursor = true; + setDebugCursor(e.x, e.y); + } + }); + Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; }); + Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); }); + + + Script.scriptEnding.connect(function () { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } + button.clicked.disconnect(onClicked); + tablet.screenChanged.disconnect(onScreenChanged); + tablet.removeButton(button); + }); + + function setDebugCursor(x, y) { + nx = (x / Window.innerWidth); + ny = 1.0 - ((y) / (Window.innerHeight - 32)); + + Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny }; + } + +}()); \ No newline at end of file diff --git a/scripts/developer/utilities/render/TestQML/luci.js b/scripts/developer/utilities/render/TestQML/luci.js new file mode 100644 index 0000000000..ab77ebc016 --- /dev/null +++ b/scripts/developer/utilities/render/TestQML/luci.js @@ -0,0 +1,99 @@ +"use strict"; + +// +// gemstoneMagicMaker.js +// tablet-sample-app +// +// Created by Faye Li on Feb 6 2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +(function() { + var TABLET_BUTTON_NAME = "LUCI"; + var QMLAPP_URL = Script.resolvePath("../deferredLighting.qml"); + + + var onLuciScreen = false; + + function onClicked() { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } else { + tablet.loadQMLSource(QMLAPP_URL); + } + } + + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + var button = tablet.addButton({ + text: TABLET_BUTTON_NAME, + sortOrder: 1 + }); + + var hasEventBridge = false; + + function wireEventBridge(on) { + if (!tablet) { + print("Warning in wireEventBridge(): 'tablet' undefined!"); + return; + } + if (on) { + if (!hasEventBridge) { + tablet.fromQml.connect(fromQml); + hasEventBridge = true; + } + } else { + if (hasEventBridge) { + tablet.fromQml.disconnect(fromQml); + hasEventBridge = false; + } + } + } + + function onScreenChanged(type, url) { + if (url === QMLAPP_URL) { + onLuciScreen = true; + } else { + onLuciScreen = false; + } + + button.editProperties({isActive: onLuciScreen}); + wireEventBridge(onLuciScreen); + } + + function fromQml(message) { + } + + button.clicked.connect(onClicked); + tablet.screenChanged.connect(onScreenChanged); + + var moveDebugCursor = false; + Controller.mousePressEvent.connect(function (e) { + if (e.isMiddleButton) { + moveDebugCursor = true; + setDebugCursor(e.x, e.y); + } + }); + Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; }); + Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); }); + + + Script.scriptEnding.connect(function () { + if (onLuciScreen) { + tablet.gotoHomeScreen(); + } + button.clicked.disconnect(onClicked); + tablet.screenChanged.disconnect(onScreenChanged); + tablet.removeButton(button); + }); + + function setDebugCursor(x, y) { + nx = (x / Window.innerWidth); + ny = 1.0 - ((y) / (Window.innerHeight - 32)); + + Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny }; + } + +}()); \ No newline at end of file From bf982c3a85e91c4434155e78b830d8ffc8dfdcf5 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 25 Aug 2017 00:25:13 -0700 Subject: [PATCH 22/45] using the linear depth buffer and voila --- libraries/render-utils/src/AntialiasingEffect.cpp | 8 +++++--- libraries/render-utils/src/AntialiasingEffect.h | 2 +- libraries/render-utils/src/RenderDeferredTask.cpp | 2 +- libraries/render-utils/src/taa.slf | 8 +++++++- libraries/render-utils/src/taa.slh | 6 +++--- libraries/render-utils/src/taa_blend.slf | 5 +++++ 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index b07eff949e..cd90c1b08c 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -182,9 +182,10 @@ const int AntialiasingPass_FrameTransformSlot = 1; const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_SourceMapSlot = 1; const int AntialiasingPass_VelocityMapSlot = 2; -const int AntialiasingPass_NextMapSlot = 3; const int AntialiasingPass_DepthMapSlot = 3; +const int AntialiasingPass_NextMapSlot = 4; + Antialiasing::Antialiasing() { } @@ -298,7 +299,8 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const auto& deferredFrameTransform = inputs.get0(); auto& sourceBuffer = inputs.get1(); - auto& velocityBuffer = inputs.get2(); + auto& linearDepthBuffer = inputs.get2(); + auto& velocityBuffer = inputs.get3(); int width = sourceBuffer->getWidth(); int height = sourceBuffer->getHeight(); @@ -334,7 +336,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); - batch.setResourceTexture(AntialiasingPass_DepthMapSlot, sourceBuffer->getDepthStencilBuffer()); + batch.setResourceTexture(AntialiasingPass_DepthMapSlot, linearDepthBuffer->getLinearDepthTexture()); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index f4b0b93915..91c92697b6 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -71,7 +71,7 @@ using TAAParamsBuffer = gpu::StructBuffer; class Antialiasing { public: - using Inputs = render::VaryingSet3; + using Inputs = render::VaryingSet4 < DeferredFrameTransformPointer, gpu::FramebufferPointer, LinearDepthFramebufferPointer, VelocityFramebufferPointer > ; using Config = AntialiasingConfig; using JobModel = render::Job::ModelI; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 8028b158f6..d5b8ac7fe0 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -221,7 +221,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren } // AA job to be revisited - const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, velocityBuffer).asVarying(); + const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); task.addJob("Antialiasing", antialiasingInputs); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index aa88cc61e2..4b02757702 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -21,12 +21,18 @@ layout(location = 0) out vec4 outFragColor; void main() { vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); + // vec3 fragUV = vec3(varTexCoord0, taa_fetchDepth(varTexCoord0)); vec2 fragVel = taa_fetchVelocityMap(fragUV.xy); - vec3 sourceColor; vec3 historyColor; //vec3 nextColor = taa_temporalReprojection(fragUV.xy, fragVel, fragUV.z); vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV.xy, fragVel, sourceColor, historyColor); + /* vec3 sourceColor = taa_fetchSourceMap(fragUV.xy).xyz; + vec2 prevFragUV = fragUV.xy - fragVel; + vec3 historyColor = sourceColor; + if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { + historyColor = taa_fetchHistoryMap(prevFragUV).xyz; + }*/ vec3 nextColor = mix(historyColor, sourceColor, params.blend); diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index ad27ae4939..1b2e0e3300 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -88,15 +88,15 @@ vec4 taa_fetchNextMap(vec2 uv) { } vec2 taa_fetchVelocityMap(vec2 uv) { - return params.motionScale * texture(velocityMap, uv).xy; + return texture(velocityMap, uv).xy; } float taa_fetchDepth(vec2 uv) { - return texture(depthMap, vec2(uv), 0).x; + return -texture(depthMap, vec2(uv), 0).x; } -#define ZCMP_GT(a, b) (a < b) +#define ZCMP_GT(a, b) (a > b) vec3 taa_findClosestFragment3x3(vec2 uv) { diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index c66957a0ab..9bddee0a3d 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -21,6 +21,7 @@ void main(void) { vec3 nextColor = texture(nextMap, varTexCoord0).xyz; outFragColor = vec4(nextColor, 1.0); + // Pixel being shaded vec3 sourceColor = texture(sourceMap, varTexCoord0).xyz; @@ -115,6 +116,10 @@ void main(void) { return; } + vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); + outFragColor = vec4((fragUV.xy - varTexCoord0) * imageSize * 0.5 + vec2(0.5), 0.0, 1.0); + + return; outFragColor = vec4(nextColor, 1.0); vec3 prevColor = nextColor; From 21987c4c5df1e46c722f7dae4f959e4202286f65 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 25 Aug 2017 16:58:05 -0700 Subject: [PATCH 23/45] Adding the code for the color clamping --- libraries/render-utils/src/taa.slf | 22 +++----- libraries/render-utils/src/taa.slh | 54 +++++++++++-------- .../utilities/render/antialiasing.qml | 14 +++-- 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 4b02757702..48f4c83bcf 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -20,22 +20,16 @@ layout(location = 0) out vec4 outFragColor; void main() { - vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); - // vec3 fragUV = vec3(varTexCoord0, taa_fetchDepth(varTexCoord0)); - vec2 fragVel = taa_fetchVelocityMap(fragUV.xy); - vec3 sourceColor; + vec3 nearFragUV = taa_findClosestFragment3x3(varTexCoord0); + vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); + vec2 fragUV = varTexCoord0; + + /*vec3 sourceColor; vec3 historyColor; - //vec3 nextColor = taa_temporalReprojection(fragUV.xy, fragVel, fragUV.z); - vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV.xy, fragVel, sourceColor, historyColor); - /* vec3 sourceColor = taa_fetchSourceMap(fragUV.xy).xyz; - vec2 prevFragUV = fragUV.xy - fragVel; - vec3 historyColor = sourceColor; - if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { - historyColor = taa_fetchHistoryMap(prevFragUV).xyz; - }*/ - + vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, sourceColor, historyColor); vec3 nextColor = mix(historyColor, sourceColor, params.blend); - + */ + vec3 nextColor = taa_temporalReprojection(fragUV, fragVel, nearFragUV.z); outFragColor = vec4(nextColor, 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 1b2e0e3300..862ef62bb2 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -141,48 +141,52 @@ vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceCo return prevFragUV; } +float Luminance(vec3 rgb) { + return rgb.x/4.0 + rgb.y/2.0 + rgb.z/4.0; +} + vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) { vec3 sourceColor; vec3 historyColor; vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVelocity, sourceColor, historyColor); - vec3 nextColor = mix(historyColor, sourceColor, params.blend); + vec4 texel1 = vec4(historyColor, 1.0); + vec4 texel0 = vec4(sourceColor, 1.0); - return taa_resolveColor(nextColor); +vec2 imageSize = getWidthHeight(0); +vec2 texelSize = getInvWidthHeight(); -/* const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; const float _GatherSubpixelMotion = 0.1666; + const float _FeedbackMin = 0.1; + const float _FeedbackMax = 0.9; - float2 texel_vel = ss_vel / _MainTex_TexelSize.xy; - float texel_vel_mag = length(texel_vel) * fragZe; - float k_subpixel_motion = saturate(_SubpixelThreshold / (FLT_EPS + texel_vel_mag)); + vec2 texel_vel = fragVelocity * imageSize; + float texel_vel_mag = length(texel_vel) * -fragZe; + float k_subpixel_motion = clamp(_SubpixelThreshold / (0.0001 + texel_vel_mag), 0.0, 1.0); float k_min_max_support = _GatherBase + _GatherSubpixelMotion * k_subpixel_motion; - float2 ss_offset01 = k_min_max_support * float2(-_MainTex_TexelSize.x, _MainTex_TexelSize.y); - float2 ss_offset11 = k_min_max_support * float2(_MainTex_TexelSize.x, _MainTex_TexelSize.y); - float4 c00 = taa_fetchSourceMap(uv - ss_offset11); - float4 c10 = taa_fetchSourceMap(uv - ss_offset01); - float4 c01 = taa_fetchSourceMap(uv + ss_offset01); - float4 c11 = taa_fetchSourceMap(uv + ss_offset11); + vec2 ss_offset01 = k_min_max_support * vec2(-texelSize.x, texelSize.y); + vec2 ss_offset11 = k_min_max_support * vec2(texelSize.x, texelSize.y); + vec4 c00 = taa_fetchSourceMap(fragUV - ss_offset11); + vec4 c10 = taa_fetchSourceMap(fragUV - ss_offset01); + vec4 c01 = taa_fetchSourceMap(fragUV + ss_offset01); + vec4 c11 = taa_fetchSourceMap(fragUV + ss_offset11); - float4 cmin = min(c00, min(c10, min(c01, c11))); - float4 cmax = max(c00, max(c10, max(c01, c11))); + vec4 cmin = min(c00, min(c10, min(c01, c11))); + vec4 cmax = max(c00, max(c10, max(c01, c11))); #if USE_YCOCG || USE_CLIPPING - float4 cavg = (c00 + c10 + c01 + c11) / 4.0; + vec4 cavg = (c00 + c10 + c01 + c11) / 4.0; #endif - #else - #error "missing keyword MINMAX_..." - #endif // shrink chroma min-max #if USE_YCOCG - float2 chroma_extent = 0.25 * 0.5 * (cmax.r - cmin.r); - float2 chroma_center = texel0.gb; + vec2 chroma_extent = 0.25 * 0.5 * (cmax.r - cmin.r); + vec2 chroma_center = texel0.gb; cmin.yz = chroma_center - chroma_extent; cmax.yz = chroma_center + chroma_extent; cavg.yz = chroma_center; @@ -206,11 +210,15 @@ vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) float unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2)); float unbiased_weight = 1.0 - unbiased_diff; float unbiased_weight_sqr = unbiased_weight * unbiased_weight; - float k_feedback = lerp(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); + float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); // output - return lerp(texel0, texel1, k_feedback); - */ + vec3 nextColor = mix(texel0, texel1, k_feedback).xyz; + + + // vec3 nextColor = mix(texel0, texel1, params.blend); + + return taa_resolveColor(nextColor); } <$declareColorWheel()$> diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 4f048a6533..dc37bddf59 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -7,15 +7,23 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html // + import QtQuick 2.5 -import QtQuick.Layouts 1.3 import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.3 + +import "../lib/styles-uit" +//import "../../controls-uit" as HifiControls + + import "configSlider" import "../lib/plotperf" -Column { +Rectangle { id: root; - // color: hifi.colors.baseGray; + + HifiConstants { id: hifi; } + color: hifi.colors.baseGray; Column { id: antialiasing From 878ac6472114f2aeb7ead0b5e96fd323137a4e0f Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 25 Aug 2017 17:00:27 -0700 Subject: [PATCH 24/45] adding the qml styles --- .../lib/styles-uit/AnonymousProRegular.qml | 23 ++ .../utilities/lib/styles-uit/ButtonLabel.qml | 18 + .../lib/styles-uit/FiraSansRegular.qml | 23 ++ .../lib/styles-uit/FiraSansSemiBold.qml | 23 ++ .../utilities/lib/styles-uit/HiFiGlyphs.qml | 25 ++ .../lib/styles-uit/HifiConstants.qml | 342 ++++++++++++++++++ .../lib/styles-uit/HifiConstants.qmlc | Bin 0 -> 51304 bytes .../utilities/lib/styles-uit/IconButton.qml | 20 + .../utilities/lib/styles-uit/InfoItem.qml | 19 + .../utilities/lib/styles-uit/InputLabel.qml | 18 + .../utilities/lib/styles-uit/ListItem.qml | 18 + .../utilities/lib/styles-uit/Logs.qml | 18 + .../utilities/lib/styles-uit/OverlayTitle.qml | 18 + .../utilities/lib/styles-uit/RalewayBold.qml | 24 ++ .../utilities/lib/styles-uit/RalewayLight.qml | 23 ++ .../lib/styles-uit/RalewayRegular.qml | 23 ++ .../lib/styles-uit/RalewaySemiBold.qml | 23 ++ .../utilities/lib/styles-uit/SectionName.qml | 19 + .../utilities/lib/styles-uit/Separator.qml | 41 +++ .../utilities/lib/styles-uit/ShortcutText.qml | 18 + .../utilities/lib/styles-uit/TabName.qml | 19 + .../lib/styles-uit/TextFieldInput.qml | 18 + 22 files changed, 773 insertions(+) create mode 100644 scripts/developer/utilities/lib/styles-uit/AnonymousProRegular.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/ButtonLabel.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/FiraSansRegular.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/FiraSansSemiBold.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/HiFiGlyphs.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/HifiConstants.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc create mode 100644 scripts/developer/utilities/lib/styles-uit/IconButton.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/InfoItem.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/InputLabel.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/ListItem.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/Logs.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/OverlayTitle.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/RalewayBold.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/RalewayLight.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/RalewayRegular.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/RalewaySemiBold.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/SectionName.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/Separator.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/ShortcutText.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/TabName.qml create mode 100644 scripts/developer/utilities/lib/styles-uit/TextFieldInput.qml diff --git a/scripts/developer/utilities/lib/styles-uit/AnonymousProRegular.qml b/scripts/developer/utilities/lib/styles-uit/AnonymousProRegular.qml new file mode 100644 index 0000000000..789689973b --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/AnonymousProRegular.qml @@ -0,0 +1,23 @@ +// +// AnonymousProRegular.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: anonymousProRegular; source: "../../fonts/AnonymousPro-Regular.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: anonymousProRegular.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/ButtonLabel.qml b/scripts/developer/utilities/lib/styles-uit/ButtonLabel.qml new file mode 100644 index 0000000000..aade5fb439 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/ButtonLabel.qml @@ -0,0 +1,18 @@ +// +// ButtonLabel.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayBold { + font.pixelSize: hifi.fontSizes.buttonLabel +} diff --git a/scripts/developer/utilities/lib/styles-uit/FiraSansRegular.qml b/scripts/developer/utilities/lib/styles-uit/FiraSansRegular.qml new file mode 100644 index 0000000000..4ae0826772 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/FiraSansRegular.qml @@ -0,0 +1,23 @@ +// +// FiraSansRegular.qml +// +// Created by David Rowe on 12 May 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: firaSansRegular; source: "../../fonts/FiraSans-Regular.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: firaSansRegular.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/FiraSansSemiBold.qml b/scripts/developer/utilities/lib/styles-uit/FiraSansSemiBold.qml new file mode 100644 index 0000000000..b3f3324090 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/FiraSansSemiBold.qml @@ -0,0 +1,23 @@ +// +// FiraSansSemiBold.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: firaSansSemiBold; source: pathToFonts + "fonts/FiraSans-SemiBold.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: firaSansSemiBold.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/HiFiGlyphs.qml b/scripts/developer/utilities/lib/styles-uit/HiFiGlyphs.qml new file mode 100644 index 0000000000..cbd6fa1d68 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/HiFiGlyphs.qml @@ -0,0 +1,25 @@ +// +// HiFiGlyphs.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: hiFiGlyphs; source: pathToFonts + "fonts/hifi-glyphs.ttf"; } + property int size: 32 + font.pixelSize: size + width: size + height: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: hiFiGlyphs.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qml b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qml new file mode 100644 index 0000000000..4a26d11128 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qml @@ -0,0 +1,342 @@ +// +// HiFiConstants.qml +// +// Created by Bradley Austin Davis on 28 Apr 2015 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Window 2.2 + +Item { + readonly property alias colors: colors + readonly property alias colorSchemes: colorSchemes + readonly property alias dimensions: dimensions + readonly property alias fontSizes: fontSizes + readonly property alias glyphs: glyphs + readonly property alias icons: icons + readonly property alias buttons: buttons + readonly property alias effects: effects + + function glyphForIcon(icon) { + // Translates icon enum to glyph char. + var glyph; + switch (icon) { + case hifi.icons.information: + glyph = hifi.glyphs.info; + break; + case hifi.icons.question: + glyph = hifi.glyphs.question; + break; + case hifi.icons.warning: + glyph = hifi.glyphs.alert; + break; + case hifi.icons.critical: + glyph = hifi.glyphs.error; + break; + case hifi.icons.placemark: + glyph = hifi.glyphs.placemark; + break; + default: + glyph = hifi.glyphs.noIcon; + } + return glyph; + } + + Item { + id: colors + + // Base colors + readonly property color baseGray: "#393939" + readonly property color darkGray: "#121212" + readonly property color baseGrayShadow: "#252525" + readonly property color baseGrayHighlight: "#575757" + readonly property color lightGray: "#6a6a6a" + readonly property color lightGrayText: "#afafaf" + readonly property color faintGray: "#e3e3e3" + readonly property color primaryHighlight: "#00b4ef" + readonly property color blueHighlight: "#00b4ef" + readonly property color blueAccent: "#0093C5" + readonly property color redHighlight: "#EA4C5F" + readonly property color redAccent: "#C62147" + readonly property color greenHighlight: "#1ac567" + readonly property color greenShadow: "#359D85" + readonly property color orangeHighlight: "#FFC49C" + readonly property color orangeAccent: "#FF6309" + readonly property color indigoHighlight: "#C0D2FF" + readonly property color indigoAccent: "#9495FF" + readonly property color magentaHighlight: "#EF93D1" + readonly property color magentaAccent: "#A2277C" + readonly property color checkboxCheckedRed: "#FF0000" + readonly property color checkboxCheckedBorderRed: "#D00000" + readonly property color lightBlueHighlight: "#d6f6ff" + + // Semitransparent + readonly property color darkGray30: "#4d121212" + readonly property color darkGray0: "#00121212" + readonly property color baseGrayShadow60: "#99252525" + readonly property color baseGrayShadow50: "#80252525" + readonly property color baseGrayShadow25: "#40252525" + readonly property color baseGrayHighlight40: "#66575757" + readonly property color baseGrayHighlight15: "#26575757" + readonly property color lightGray50: "#806a6a6a" + readonly property color lightGrayText80: "#ccafafaf" + readonly property color faintGray80: "#cce3e3e3" + readonly property color faintGray50: "#80e3e3e3" + + // Other colors + readonly property color white: "#ffffff" + readonly property color gray: "#808080" + readonly property color black: "#000000" + readonly property color locked: "#252525" + // Semitransparent + readonly property color white50: "#80ffffff" + readonly property color white30: "#4dffffff" + readonly property color white25: "#40ffffff" + readonly property color transparent: "#00ffffff" + + // Control specific colors + readonly property color tableRowLightOdd: "#fafafa" + readonly property color tableRowLightEven: "#eeeeee" // Equivavlent to "#1a575757" over #e3e3e3 background + readonly property color tableRowDarkOdd: "#2e2e2e" // Equivalent to "#80393939" over #404040 background + readonly property color tableRowDarkEven: "#1c1c1c" // Equivalent to "#a6181818" over #404040 background + readonly property color tableBackgroundLight: tableRowLightEven + readonly property color tableBackgroundDark: tableRowDarkEven + readonly property color tableScrollHandleLight: "#DDDDDD" + readonly property color tableScrollHandleDark: "#707070" + readonly property color tableScrollBackgroundLight: tableRowLightOdd + readonly property color tableScrollBackgroundDark: "#323232" + readonly property color checkboxLightStart: "#ffffff" + readonly property color checkboxLightFinish: "#afafaf" + readonly property color checkboxDarkStart: "#7d7d7d" + readonly property color checkboxDarkFinish: "#6b6a6b" + readonly property color checkboxChecked: primaryHighlight + readonly property color checkboxCheckedBorder: "#36cdff" + readonly property color sliderGutterLight: "#d4d4d4" + readonly property color sliderGutterDark: "#252525" + readonly property color sliderBorderLight: "#afafaf" + readonly property color sliderBorderDark: "#7d7d7d" + readonly property color sliderLightStart: "#ffffff" + readonly property color sliderLightFinish: "#afafaf" + readonly property color sliderDarkStart: "#7d7d7d" + readonly property color sliderDarkFinish: "#6b6a6b" + readonly property color dropDownPressedLight: "#d4d4d4" + readonly property color dropDownPressedDark: "#afafaf" + readonly property color dropDownLightStart: "#ffffff" + readonly property color dropDownLightFinish: "#afafaf" + readonly property color dropDownDarkStart: "#7d7d7d" + readonly property color dropDownDarkFinish: "#6b6a6b" + readonly property color textFieldLightBackground: "#d4d4d4" + readonly property color tabBackgroundDark: "#252525" + readonly property color tabBackgroundLight: "#d4d4d4" + } + + Item { + id: colorSchemes + readonly property int light: 0 + readonly property int dark: 1 + } + + Item { + id: dimensions + readonly property bool largeScreen: Screen.width >= 1920 && Screen.height >= 1080 + readonly property real borderRadius: largeScreen ? 7.5 : 5.0 + readonly property real borderWidth: largeScreen ? 2 : 1 + readonly property vector2d contentMargin: Qt.vector2d(21, 21) + readonly property vector2d contentSpacing: Qt.vector2d(11, 14) + readonly property real labelPadding: 40 + readonly property real textPadding: 8 + readonly property real sliderHandleSize: 18 + readonly property real sliderGrooveHeight: 8 + readonly property real frameIconSize: 22 + readonly property real spinnerSize: 50 + readonly property real tablePadding: 12 + readonly property real tableRowHeight: largeScreen ? 26 : 23 + readonly property real tableHeaderHeight: 29 + readonly property vector2d modalDialogMargin: Qt.vector2d(50, 30) + readonly property real modalDialogTitleHeight: 40 + readonly property real controlLineHeight: 28 // Height of spinbox control on 1920 x 1080 monitor + readonly property real controlInterlineHeight: 21 // 75% of controlLineHeight + readonly property vector2d menuPadding: Qt.vector2d(14, 102) + readonly property real scrollbarBackgroundWidth: 18 + readonly property real scrollbarHandleWidth: scrollbarBackgroundWidth - 2 + readonly property real tabletMenuHeader: 90 + } + + Item { + id: fontSizes // In pixels + readonly property real overlayTitle: dimensions.largeScreen ? 18 : 14 + readonly property real tabName: dimensions.largeScreen ? 12 : 10 + readonly property real sectionName: dimensions.largeScreen ? 12 : 10 + readonly property real inputLabel: dimensions.largeScreen ? 14 : 10 + readonly property real textFieldInput: dimensions.largeScreen ? 15 : 12 + readonly property real textFieldInputLabel: dimensions.largeScreen ? 13 : 9 + readonly property real textFieldSearchIcon: dimensions.largeScreen ? 30 : 24 + readonly property real tableHeading: dimensions.largeScreen ? 12 : 10 + readonly property real tableHeadingIcon: dimensions.largeScreen ? 60 : 33 + readonly property real tableText: dimensions.largeScreen ? 15 : 12 + readonly property real buttonLabel: dimensions.largeScreen ? 13 : 9 + readonly property real iconButton: dimensions.largeScreen ? 13 : 9 + readonly property real listItem: dimensions.largeScreen ? 15 : 11 + readonly property real tabularData: dimensions.largeScreen ? 15 : 11 + readonly property real logs: dimensions.largeScreen ? 16 : 12 + readonly property real code: dimensions.largeScreen ? 16 : 12 + readonly property real rootMenu: dimensions.largeScreen ? 15 : 11 + readonly property real rootMenuDisclosure: dimensions.largeScreen ? 20 : 16 + readonly property real menuItem: dimensions.largeScreen ? 15 : 11 + readonly property real shortcutText: dimensions.largeScreen ? 13 : 9 + readonly property real carat: dimensions.largeScreen ? 38 : 30 + readonly property real disclosureButton: dimensions.largeScreen ? 30 : 22 + } + + Item { + id: icons + // Values per OffscreenUi::Icon + readonly property int none: 0 + readonly property int question: 1 + readonly property int information: 2 + readonly property int warning: 3 + readonly property int critical: 4 + readonly property int placemark: 5 + } + + Item { + id: buttons + readonly property int white: 0 + readonly property int blue: 1 + readonly property int red: 2 + readonly property int black: 3 + readonly property var textColor: [ colors.darkGray, colors.white, colors.white, colors.white ] + readonly property var colorStart: [ colors.white, colors.primaryHighlight, "#d42043", "#343434" ] + readonly property var colorFinish: [ colors.lightGrayText, colors.blueAccent, "#94132e", colors.black ] + readonly property var hoveredColor: [ colorStart[white], colorStart[blue], colorStart[red], colorFinish[black] ] + readonly property var pressedColor: [ colorFinish[white], colorFinish[blue], colorFinish[red], colorStart[black] ] + readonly property var disabledColorStart: [ colorStart[white], colors.baseGrayHighlight] + readonly property var disabledColorFinish: [ colorFinish[white], colors.baseGrayShadow] + readonly property var disabledTextColor: [ colors.lightGrayText, colors.baseGrayShadow] + readonly property int radius: 5 + } + + QtObject { + id: effects + readonly property int fadeInDuration: 300 + } + Item { + id: glyphs + readonly property string noIcon: "" + readonly property string hmd: "b" + readonly property string screen: "c" + readonly property string keyboard: "d" + readonly property string handControllers: "e" + readonly property string headphonesMic: "f" + readonly property string gamepad: "g" + readonly property string headphones: "h" + readonly property string mic: "i" + readonly property string upload: "j" + readonly property string script: "k" + readonly property string text: "l" + readonly property string cube: "m" + readonly property string sphere: "n" + readonly property string zone: "o" + readonly property string light: "p" + readonly property string web: "q" + readonly property string web2: "r" + readonly property string edit: "s" + readonly property string market: "t" + readonly property string directory: "u" + readonly property string menu: "v" + readonly property string close: "w" + readonly property string closeInverted: "x" + readonly property string pin: "y" + readonly property string pinInverted: "z" + readonly property string resizeHandle: "A" + readonly property string disclosureExpand: "B" + readonly property string reloadSmall: "a" + readonly property string closeSmall: "C" + readonly property string forward: "D" + readonly property string backward: "E" + readonly property string reload: "F" + readonly property string unmuted: "G" + readonly property string muted: "H" + readonly property string minimize: "I" + readonly property string maximize: "J" + readonly property string maximizeInverted: "K" + readonly property string disclosureButtonExpand: "L" + readonly property string disclosureButtonCollapse: "M" + readonly property string scriptStop: "N" + readonly property string scriptReload: "O" + readonly property string scriptRun: "P" + readonly property string scriptNew: "Q" + readonly property string hifiForum: "2" + readonly property string hifiLogoSmall: "S" + readonly property string avatar1: "T" + readonly property string placemark: "U" + readonly property string box: "V" + readonly property string community: "0" + readonly property string grabHandle: "X" + readonly property string search: "Y" + readonly property string disclosureCollapse: "Z" + readonly property string scriptUpload: "R" + readonly property string code: "W" + readonly property string avatar: "<" + readonly property string arrowsH: ":" + readonly property string arrowsV: ";" + readonly property string arrows: "`" + readonly property string compress: "!" + readonly property string expand: "\"" + readonly property string placemark1: "#" + readonly property string circle: "$" + readonly property string handPointer: "9" + readonly property string plusSquareO: "%" + readonly property string sliders: "&" + readonly property string square: "'" + readonly property string alignCenter: "8" + readonly property string alignJustify: ")" + readonly property string alignLeft: "*" + readonly property string alignRight: "^" + readonly property string bars: "7" + readonly property string circleSlash: "," + readonly property string sync: "()" + readonly property string key: "-" + readonly property string link: "." + readonly property string location: "/" + readonly property string caratR: "3" + readonly property string caratL: "4" + readonly property string caratDn: "5" + readonly property string caratUp: "6" + readonly property string folderLg: ">" + readonly property string folderSm: "?" + readonly property string levelUp: "1" + readonly property string info: "[" + readonly property string question: "]" + readonly property string alert: "+" + readonly property string home: "_" + readonly property string error: "=" + readonly property string settings: "@" + readonly property string trash: "{" + readonly property string objectGroup: "\ue000" + readonly property string cm: "}" + readonly property string msvg79: "~" + readonly property string deg: "\\" + readonly property string px: "|" + readonly property string editPencil: "\ue00d" + readonly property string vol_0: "\ue00e" + readonly property string vol_1: "\ue00f" + readonly property string vol_2: "\ue010" + readonly property string vol_3: "\ue011" + readonly property string vol_4: "\ue012" + readonly property string vol_x_0: "\ue013" + readonly property string vol_x_1: "\ue014" + readonly property string vol_x_2: "\ue015" + readonly property string vol_x_3: "\ue016" + readonly property string vol_x_4: "\ue017" + readonly property string source: "\ue01c" + readonly property string playback_play: "\ue01d" + readonly property string stop_square: "\ue01e" + readonly property string avatarTPose: "\ue01f" + readonly property string lock: "\ue006" + } +} diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc new file mode 100644 index 0000000000000000000000000000000000000000..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e GIT binary patch literal 51304 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 literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/lib/styles-uit/IconButton.qml b/scripts/developer/utilities/lib/styles-uit/IconButton.qml new file mode 100644 index 0000000000..84c1ef14c1 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/IconButton.qml @@ -0,0 +1,20 @@ +// +// IconButton.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayRegular { + font.pixelSize: hifi.fontSizes.iconButton + font.capitalization: Font.AllUppercase + font.letterSpacing: 1.5 +} diff --git a/scripts/developer/utilities/lib/styles-uit/InfoItem.qml b/scripts/developer/utilities/lib/styles-uit/InfoItem.qml new file mode 100644 index 0000000000..83781a4ef5 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/InfoItem.qml @@ -0,0 +1,19 @@ +// +// InfoItem.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewaySemiBold { + lineHeight: 2 + font.pixelSize: hifi.fontSizes.menuItem +} diff --git a/scripts/developer/utilities/lib/styles-uit/InputLabel.qml b/scripts/developer/utilities/lib/styles-uit/InputLabel.qml new file mode 100644 index 0000000000..59657a554d --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/InputLabel.qml @@ -0,0 +1,18 @@ +// +// InputLabel.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewaySemiBold { + font.pixelSize: hifi.fontSizes.inputLabel +} diff --git a/scripts/developer/utilities/lib/styles-uit/ListItem.qml b/scripts/developer/utilities/lib/styles-uit/ListItem.qml new file mode 100644 index 0000000000..f707686edc --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/ListItem.qml @@ -0,0 +1,18 @@ +// +// ListItem.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayRegular { + font.pixelSize: hifi.fontSizes.listItem +} diff --git a/scripts/developer/utilities/lib/styles-uit/Logs.qml b/scripts/developer/utilities/lib/styles-uit/Logs.qml new file mode 100644 index 0000000000..577fe2f8d8 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/Logs.qml @@ -0,0 +1,18 @@ +// +// Logs.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +AnonymousProRegular { + font.pixelSize: hifi.fontSizes.logs +} diff --git a/scripts/developer/utilities/lib/styles-uit/OverlayTitle.qml b/scripts/developer/utilities/lib/styles-uit/OverlayTitle.qml new file mode 100644 index 0000000000..e23b9eca14 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/OverlayTitle.qml @@ -0,0 +1,18 @@ +// +// OverlayTitle.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayRegular { + font.pixelSize: hifi.fontSizes.overlayTitle +} diff --git a/scripts/developer/utilities/lib/styles-uit/RalewayBold.qml b/scripts/developer/utilities/lib/styles-uit/RalewayBold.qml new file mode 100644 index 0000000000..433fdb7ae6 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/RalewayBold.qml @@ -0,0 +1,24 @@ +// +// RalewayBold.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: ralewayBold; source: pathToFonts + "fonts/Raleway-Bold.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: ralewayBold.name + font.bold: true // Font seems to need this in order to display bold. +} diff --git a/scripts/developer/utilities/lib/styles-uit/RalewayLight.qml b/scripts/developer/utilities/lib/styles-uit/RalewayLight.qml new file mode 100644 index 0000000000..913918afd7 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/RalewayLight.qml @@ -0,0 +1,23 @@ +// +// RalewayLight.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: ralewayLight; source: "../../fonts/Raleway-Light.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: ralewayLight.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/RalewayRegular.qml b/scripts/developer/utilities/lib/styles-uit/RalewayRegular.qml new file mode 100644 index 0000000000..2cffeeb59d --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/RalewayRegular.qml @@ -0,0 +1,23 @@ +// +// RalewayRegular.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: ralewayRegular; source: pathToFonts + "fonts/Raleway-Regular.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: ralewayRegular.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/RalewaySemiBold.qml b/scripts/developer/utilities/lib/styles-uit/RalewaySemiBold.qml new file mode 100644 index 0000000000..b6c79e02a4 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/RalewaySemiBold.qml @@ -0,0 +1,23 @@ +// +// RalewaySemiBold.qml +// +// Created by David Rowe on 12 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Text { + id: root + FontLoader { id: ralewaySemiBold; source: pathToFonts + "fonts/Raleway-SemiBold.ttf"; } + property real size: 32 + font.pixelSize: size + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.family: ralewaySemiBold.name +} diff --git a/scripts/developer/utilities/lib/styles-uit/SectionName.qml b/scripts/developer/utilities/lib/styles-uit/SectionName.qml new file mode 100644 index 0000000000..5438fec7bc --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/SectionName.qml @@ -0,0 +1,19 @@ +// +// SectionName.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayRegular { + font.pixelSize: hifi.fontSizes.sectionName + font.capitalization: Font.AllUppercase +} diff --git a/scripts/developer/utilities/lib/styles-uit/Separator.qml b/scripts/developer/utilities/lib/styles-uit/Separator.qml new file mode 100644 index 0000000000..4134b928a7 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/Separator.qml @@ -0,0 +1,41 @@ +// +// Separator.qml +// +// Created by Zach Fox on 2017-06-06 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import "../styles-uit" + +Item { + // Size + height: 2; + width: parent.width; + + Rectangle { + // Size + width: parent.width; + height: 1; + // Anchors + anchors.left: parent.left; + anchors.bottom: parent.bottom; + anchors.bottomMargin: height; + // Style + color: hifi.colors.baseGrayShadow; + } + + Rectangle { + // Size + width: parent.width; + height: 1; + // Anchors + anchors.left: parent.left; + anchors.bottom: parent.bottom; + // Style + color: hifi.colors.baseGrayHighlight; + } +} diff --git a/scripts/developer/utilities/lib/styles-uit/ShortcutText.qml b/scripts/developer/utilities/lib/styles-uit/ShortcutText.qml new file mode 100644 index 0000000000..a3ab351870 --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/ShortcutText.qml @@ -0,0 +1,18 @@ +// +// ShortcutText.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayLight { + font.pixelSize: hifi.fontSizes.shortcutText +} diff --git a/scripts/developer/utilities/lib/styles-uit/TabName.qml b/scripts/developer/utilities/lib/styles-uit/TabName.qml new file mode 100644 index 0000000000..eb4e790e7e --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/TabName.qml @@ -0,0 +1,19 @@ +// +// TabName.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +RalewayRegular { + font.pixelSize: hifi.fontSizes.tabName + font.capitalization: Font.AllUppercase +} diff --git a/scripts/developer/utilities/lib/styles-uit/TextFieldInput.qml b/scripts/developer/utilities/lib/styles-uit/TextFieldInput.qml new file mode 100644 index 0000000000..010b4d03ad --- /dev/null +++ b/scripts/developer/utilities/lib/styles-uit/TextFieldInput.qml @@ -0,0 +1,18 @@ +// +// TextFieldInput.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import "." + +FiraSansSemiBold { + font.pixelSize: hifi.fontSizes.textFieldInput +} From 0f67f9bc524ee4ff7f91a0bf7b30c97eef02ad30 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 27 Aug 2017 22:08:33 -0700 Subject: [PATCH 25/45] Eposing the jitter sequence and debugging it --- .../render-utils/src/AntialiasingEffect.cpp | 27 ++- .../render-utils/src/AntialiasingEffect.h | 117 ++++++++----- .../render-utils/src/RenderDeferredTask.cpp | 2 +- libraries/render-utils/src/taa.slf | 6 +- libraries/render-utils/src/taa.slh | 44 ++++- libraries/render-utils/src/taa_blend.slf | 157 ++++++++++-------- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 42 ++++- 8 files changed, 263 insertions(+), 132 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index cd90c1b08c..af896024d6 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -178,6 +178,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const const int AntialiasingPass_ParamsSlot = 0; const int AntialiasingPass_FrameTransformSlot = 1; +const int AntialiasingPass_JitterBufferSlot = 2; const int AntialiasingPass_HistoryMapSlot = 0; const int AntialiasingPass_SourceMapSlot = 1; @@ -209,7 +210,8 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); - + slotBindings.insert(gpu::Shader::Binding(std::string("taaJitterBuffer"), AntialiasingPass_JitterBufferSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("historyMap"), AntialiasingPass_HistoryMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("sourceMap"), AntialiasingPass_SourceMapSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("velocityMap"), AntialiasingPass_VelocityMapSlot)); @@ -258,6 +260,7 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("taaParamsBuffer"), AntialiasingPass_ParamsSlot)); + slotBindings.insert(gpu::Shader::Binding(std::string("taaJitterBuffer"), AntialiasingPass_JitterBufferSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), AntialiasingPass_FrameTransformSlot)); slotBindings.insert(gpu::Shader::Binding(std::string("nextMap"), AntialiasingPass_NextMapSlot)); @@ -282,12 +285,19 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { void Antialiasing::configure(const Config& config) { _params.edit().blend = config.blend; _params.edit().velocityScale = config.velocityScale; + + _params.edit().setUnjitter(config.unjitter); + _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; _params.edit().debugX = config.debugX; _params.edit().setDebug(config.debug); + _params.edit().setShowDebugCursor(config.showCursorPixel); _params.edit().setDebugCursor(config.debugCursorTexcoord); _params.edit().setDebugOrbZoom(config.debugOrbZoom); + + _params.edit().setShowJitterSequence(config.showJitterSequence); + _params.edit().setShowClosestFragment(config.showClosestFragment); } @@ -298,9 +308,10 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const RenderArgs* args = renderContext->args; auto& deferredFrameTransform = inputs.get0(); - auto& sourceBuffer = inputs.get1(); - auto& linearDepthBuffer = inputs.get2(); - auto& velocityBuffer = inputs.get3(); + auto& jitterBuffer = inputs.get1(); + auto& sourceBuffer = inputs.get2(); + auto& linearDepthBuffer = inputs.get3(); + auto& velocityBuffer = inputs.get4(); int width = sourceBuffer->getWidth(); int height = sourceBuffer->getHeight(); @@ -338,9 +349,10 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); batch.setResourceTexture(AntialiasingPass_DepthMapSlot, linearDepthBuffer->getLinearDepthTexture()); - batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params._buffer); + batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); - + batch.setUniformBuffer(AntialiasingPass_JitterBufferSlot, jitterBuffer); + batch.setFramebuffer(_antialiasingBuffer[nextFrame]); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); @@ -359,8 +371,9 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); - batch.setResourceTexture(AntialiasingPass_DepthMapSlot, nullptr); + batch.setUniformBuffer(AntialiasingPass_JitterBufferSlot, nullptr); + batch.setResourceTexture(AntialiasingPass_DepthMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_NextMapSlot, nullptr); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 91c92697b6..0fa0a5739e 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -18,17 +18,67 @@ #include "DeferredFrameTransform.h" #include "VelocityBufferPass.h" + +class JitterSampleConfig : public render::Job::Config { + Q_OBJECT + Q_PROPERTY(float scale MEMBER scale NOTIFY dirty) + Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) +public: + JitterSampleConfig() : render::Job::Config(true) {} + + float scale{ 0.5f }; + bool freeze{ false }; +signals: + void dirty(); +}; + + +class JitterSample { +public: + + struct SampleSequence { + SampleSequence(); + static const int SEQUENCE_LENGTH{ 8 }; + glm::vec2 offsets[SEQUENCE_LENGTH]; + int sequenceLength{ SEQUENCE_LENGTH }; + int currentIndex{ 0 }; + + }; + + using JitterBuffer = gpu::StructBuffer; + + using Config = JitterSampleConfig; + using JobModel = render::Job::ModelO; + + void configure(const Config& config); + void run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer); + + +private: + + JitterBuffer _jitterBuffer; + float _scale{ 1.0 }; + bool _freeze{ false }; +}; + + class AntialiasingConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) - + + Q_PROPERTY(bool unjitter MEMBER unjitter NOTIFY dirty) + Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) Q_PROPERTY(float debugOrbZoom MEMBER debugOrbZoom NOTIFY dirty) + + Q_PROPERTY(bool showJitterSequence MEMBER showJitterSequence NOTIFY dirty) + Q_PROPERTY(bool showClosestFragment MEMBER showClosestFragment NOTIFY dirty) + public: AntialiasingConfig() : render::Job::Config(true) {} @@ -40,13 +90,19 @@ public: glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; float debugOrbZoom{ 2.0f }; + bool unjitter{ true }; + bool debug { false }; bool showCursorPixel { false }; + bool showJitterSequence{ false }; + bool showClosestFragment{ false }; signals: void dirty(); }; +#define SET_BIT(bitfield, bitIndex, value) bitfield = ((bitfield) & ~(1 << (bitIndex))) | ((value) << (bitIndex)) +#define GET_BIT(bitfield, bitIndex) ((bitfield) & (1 << (bitIndex))) struct TAAParams { float debugX{ 0.0f }; @@ -54,11 +110,18 @@ struct TAAParams { float velocityScale{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; - glm::vec4 debug{ 0.0f }; + glm::ivec4 debug{ 0 }; glm::vec4 pixelInfo{ 0.5f, 0.5f, 2.0f, 0.0f }; - void setDebug(bool enabled) { debug.x = (float)enabled; } - bool isDebug() const { return (bool) debug.x; } + void setUnjitter(bool enabled) { SET_BIT(debug.y, 0, enabled); } + bool isUnjitter() const { return (bool)GET_BIT(debug.y, 0); } + + + void setDebug(bool enabled) { SET_BIT(debug.x, 0, enabled); } + bool isDebug() const { return (bool) GET_BIT(debug.x, 0); } + + void setShowDebugCursor(bool enabled) { SET_BIT(debug.x, 1, enabled); } + bool showDebugCursor() const { return (bool)GET_BIT(debug.x, 1); } void setDebugCursor(glm::vec2 debugCursor) { pixelInfo.x = debugCursor.x; pixelInfo.y = debugCursor.y; } glm::vec2 getDebugCursor() const { return glm::vec2(pixelInfo.x, pixelInfo.y); } @@ -66,12 +129,16 @@ struct TAAParams { void setDebugOrbZoom(float orbZoom) { pixelInfo.z = orbZoom; } float getDebugOrbZoom() const { return pixelInfo.z; } + void setShowJitterSequence(bool enabled) { SET_BIT(debug.x, 2, enabled); } + void setShowClosestFragment(bool enabled) { SET_BIT(debug.x, 3, enabled); } + + }; using TAAParamsBuffer = gpu::StructBuffer; class Antialiasing { public: - using Inputs = render::VaryingSet4 < DeferredFrameTransformPointer, gpu::FramebufferPointer, LinearDepthFramebufferPointer, VelocityFramebufferPointer > ; + using Inputs = render::VaryingSet5 < DeferredFrameTransformPointer, JitterSample::JitterBuffer, gpu::FramebufferPointer, LinearDepthFramebufferPointer, VelocityFramebufferPointer > ; using Config = AntialiasingConfig; using JobModel = render::Job::ModelI; @@ -136,45 +203,5 @@ private: int _geometryId { 0 }; }; */ -class JitterSampleConfig : public render::Job::Config { - Q_OBJECT - Q_PROPERTY(float scale MEMBER scale NOTIFY dirty) - Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) -public: - JitterSampleConfig() : render::Job::Config(true) {} - - float scale { 0.5f }; - bool freeze{ false }; -signals: - void dirty(); -}; - -class JitterSample { -public: - - struct SampleSequence { - SampleSequence(); - static const int SEQUENCE_LENGTH { 8 }; - int sequenceLength{ SEQUENCE_LENGTH }; - int currentIndex { 0 }; - - glm::vec2 offsets[SEQUENCE_LENGTH]; - }; - - using JitterBuffer = gpu::StructBuffer; - - using Config = JitterSampleConfig; - using JobModel = render::Job::ModelO; - - void configure(const Config& config); - void run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer); - - -private: - - JitterBuffer _jitterBuffer; - float _scale { 1.0 }; - bool _freeze { false }; -}; #endif // hifi_AntialiasingEffect_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index d5b8ac7fe0..99ccfe602b 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -221,7 +221,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren } // AA job to be revisited - const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); + const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, jitterBuffer, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); task.addJob("Antialiasing", antialiasingInputs); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 48f4c83bcf..8f591035f3 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -19,10 +19,12 @@ in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; void main() { + vec2 texelSize = getInvWidthHeight(); + vec2 fragUV = varTexCoord0 - float(taa_unjitter()) * taa_getJitterSample(sequence.currentIndex) * texelSize; - vec3 nearFragUV = taa_findClosestFragment3x3(varTexCoord0); + vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); - vec2 fragUV = varTexCoord0; + /*vec3 sourceColor; vec3 historyColor; diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 862ef62bb2..ae9f62d471 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -13,6 +13,20 @@ <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> +const int SEQUENCE_LENGTH = 8; +struct JitterSequence { + vec4 offsets[SEQUENCE_LENGTH / 2]; + int sequenceLength; + int currentIndex; +}; +layout(std140) uniform taaJitterBuffer { + JitterSequence sequence; +}; + +vec2 taa_getJitterSample(int index) { + return vec2((bool(index & 0x01) ? sequence.offsets[index >> 1].zw : sequence.offsets[index >> 1].xy)); +} + <@include gpu/Color.slh@> uniform sampler2D depthMap; @@ -27,7 +41,7 @@ struct TAAParams float blend; float motionScale; float debugShowVelocityThreshold; - vec4 debugCursor; + ivec4 debug; vec4 pixelInfo_orbZoom; }; @@ -35,6 +49,26 @@ layout(std140) uniform taaParamsBuffer { TAAParams params; }; +#define GET_BIT(bitfield, bitIndex) bool((bitfield) & (1 << (bitIndex))) + +bool taa_showDebugCursor() { + return GET_BIT(params.debug.x, 1); +} + +bool taa_showJitterSequence() { + return GET_BIT(params.debug.x, 2); +} + +bool taa_showClosestFragment() { + return GET_BIT(params.debug.x, 3); +} + + +bool taa_unjitter() { + return GET_BIT(params.debug.y, 0); +} + + vec2 taa_getDebugCursorTexcoord() { return params.pixelInfo_orbZoom.xy; } @@ -133,6 +167,7 @@ vec3 taa_findClosestFragment3x3(vec2 uv) vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; + vec2 prevFragUV = fragUV - fragVelocity; historyColor = sourceColor; if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { @@ -154,8 +189,9 @@ vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) vec4 texel1 = vec4(historyColor, 1.0); vec4 texel0 = vec4(sourceColor, 1.0); -vec2 imageSize = getWidthHeight(0); -vec2 texelSize = getInvWidthHeight(); + vec2 imageSize = getWidthHeight(0); + vec2 texelSize = getInvWidthHeight(); + fragUV += float(taa_unjitter()) * taa_getJitterSample(sequence.currentIndex) * texelSize; const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; @@ -213,7 +249,7 @@ vec2 texelSize = getInvWidthHeight(); float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); // output - vec3 nextColor = mix(texel0, texel1, k_feedback).xyz; + vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; // vec3 nextColor = mix(texel0, texel1, params.blend); diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 9bddee0a3d..44a54b44de 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -26,83 +26,106 @@ void main(void) { vec3 sourceColor = texture(sourceMap, varTexCoord0).xyz; vec2 imageSize = getWidthHeight(0); + vec2 texelSize = getInvWidthHeight(); vec2 pixPos = varTexCoord0 * imageSize; vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); - vec2 velocity = params.motionScale * pixVelocity * getInvWidthHeight(); + vec2 velocity = params.motionScale * pixVelocity * texelSize; vec2 prevTexCoord = varTexCoord0 - velocity; vec2 prevPix = prevTexCoord * imageSize; // Pixel Debugged - vec3 cursorFrag = taa_findClosestFragment3x3(taa_getDebugCursorTexcoord()); - vec2 cursorUV = cursorFrag.xy; - vec2 cursorPixelPos = cursorUV * imageSize; - vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; - vec2 cursorPrevUV = cursorUV - cursorVelocity; - cursorVelocity *= imageSize; - float cursorVelocityLength = length(cursorVelocity); - vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; + if (taa_showDebugCursor()) { + vec3 cursorFrag = taa_findClosestFragment3x3(taa_getDebugCursorTexcoord()); + vec2 cursorUV = cursorFrag.xy; + vec2 cursorPixelPos = cursorUV * imageSize; + vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; + vec2 cursorPrevUV = cursorUV - cursorVelocity; + cursorVelocity *= imageSize; + float cursorVelocityLength = length(cursorVelocity); + vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; - vec2 cursorToFragVec = pixPos - cursorPixelPos; - float cursorToFragLength = length(cursorToFragVec); + vec2 cursorToFragVec = pixPos - cursorPixelPos; + float cursorToFragLength = length(cursorToFragVec); - if ((cursorToFragLength <= cursorVelocityLength)) { - vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; - vec2 cursorVelocityNor = vec2(cursorVelocityDir.y, -cursorVelocityDir.x); + if ((cursorToFragLength <= cursorVelocityLength)) { + vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; + vec2 cursorVelocityNor = vec2(cursorVelocityDir.y, -cursorVelocityDir.x); - if ((dot(cursorVelocityDir, cursorToFragVec) < 0) && abs(dot(cursorVelocityNor, cursorToFragVec)) < 1.0) { + if ((dot(cursorVelocityDir, cursorToFragVec) < 0) && abs(dot(cursorVelocityNor, cursorToFragVec)) < 1.0) { + + vec3 speedColor = taa_getVelocityColorRelative(cursorToFragLength); + + outFragColor = vec4(speedColor, 1.0); + return; + } + } + + float tenPercentHeight = 0.1 * imageSize.y; + float centerWidth = imageSize.x * 0.5; + + vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); + vec2 nextOrbPosToPix = pixPos - nextOrbPos; + float nextOrbPosToPixLength = length(nextOrbPosToPix); + + vec2 prevOrbPos = nextOrbPos - cursorVelocityDir * 2.0 * tenPercentHeight; + vec2 prevOrbPosToPix = pixPos - prevOrbPos; + float prevOrbPosToPixLength = length(prevOrbPosToPix); + + if ((prevOrbPosToPixLength < tenPercentHeight) && (cursorVelocityLength > 0.5)) { + vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * texelSize / taa_getDebugOrbZoom(); + vec3 preOrbColor = vec3(0.0); + if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { + preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; + } + if (prevOrbPosToPixLength < 2.0) { + preOrbColor = vec3(1.0, 0.0, 1.0); + } + float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv)); + if (distanceToNext < 2.0) { + preOrbColor = vec3(1.0, 0.5, 0.0); + } + outFragColor = vec4(preOrbColor, 1.0); + return; + } + if (nextOrbPosToPixLength < tenPercentHeight) { + vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * texelSize / taa_getDebugOrbZoom(); + vec3 nextOrbColor = vec3(0.0); + if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { + nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz; + } + float distanceToPrev = length(imageSize * (cursorPrevUV - nextOrbPosToPix_uv)); + if (distanceToPrev < 2.0) { + nextOrbColor = vec3(1.0, 0.0, 1.0); + } + if (nextOrbPosToPixLength < 2.0) { + nextOrbColor = vec3(1.0, 0.5, 0.0); + } + + outFragColor = vec4(nextOrbColor, 1.0); + return; + } + } + + if (taa_showJitterSequence()) { + float tenPercentHeight = 0.1 * imageSize.y; + vec2 jitterRegionSize = vec2(tenPercentHeight); + vec2 jitterRegionPos = (pixPos - vec2(tenPercentHeight, imageSize.y - tenPercentHeight)); + if ((all(lessThan(jitterRegionPos, jitterRegionSize)) && all(greaterThan(jitterRegionPos, vec2(0.0))))) { - vec3 speedColor = taa_getVelocityColorRelative(cursorToFragLength); + float niceDotR2 = 4; - outFragColor = vec4(speedColor, 1.0); - return; - } - } + for (int s = 0; s < SEQUENCE_LENGTH; s++) { + vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize; + float radius2 = (s == sequence.currentIndex ? 2.0 * niceDotR2 : niceDotR2); + if (dot(pixToSampleVec, pixToSampleVec) < radius2) { + outFragColor = vec4(colorRamp(float(s) / float(SEQUENCE_LENGTH)), 1.0); + return; + } + } - float tenPercentHeight = 0.1 * imageSize.y; - float centerWidth = imageSize.x * 0.5; - - vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); - vec2 nextOrbPosToPix = pixPos - nextOrbPos; - float nextOrbPosToPixLength = length(nextOrbPosToPix); - - vec2 prevOrbPos = nextOrbPos - cursorVelocityDir * 2.0 * tenPercentHeight; - vec2 prevOrbPosToPix = pixPos - prevOrbPos; - float prevOrbPosToPixLength = length(prevOrbPosToPix); - - if ((prevOrbPosToPixLength < tenPercentHeight) && (cursorVelocityLength > 0.5)) { - vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * getInvWidthHeight() / taa_getDebugOrbZoom(); - vec3 preOrbColor = vec3(0.0); - if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { - preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; } - if (prevOrbPosToPixLength < 2.0) { - preOrbColor = vec3(1.0, 0.0, 1.0); - } - float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv)); - if (distanceToNext < 2.0) { - preOrbColor = vec3(1.0, 0.5, 0.0); - } - outFragColor = vec4(preOrbColor, 1.0); - return; - } - if (nextOrbPosToPixLength < tenPercentHeight) { - vec2 nextOrbPosToPix_uv = cursorUV + nextOrbPosToPix * getInvWidthHeight() / taa_getDebugOrbZoom(); - vec3 nextOrbColor = vec3(0.0); - if (!(any(lessThan(nextOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(nextOrbPosToPix_uv, vec2(1.0))))) { - nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz; - } - float distanceToPrev = length(imageSize * (cursorPrevUV - nextOrbPosToPix_uv)); - if (distanceToPrev < 2.0) { - nextOrbColor = vec3(1.0, 0.0, 1.0); - } - if (nextOrbPosToPixLength < 2.0) { - nextOrbColor = vec3(1.0, 0.5, 0.0); - } - - outFragColor = vec4(nextOrbColor, 1.0); - return; } // Debug region before debugX @@ -116,10 +139,14 @@ void main(void) { return; } - vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); - outFragColor = vec4((fragUV.xy - varTexCoord0) * imageSize * 0.5 + vec2(0.5), 0.0, 1.0); - return; + + if (taa_showClosestFragment()) { + vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); + outFragColor = vec4((fragUV.xy - varTexCoord0) * imageSize * 0.5 + vec2(0.5), 0.0, 1.0); + return; + } + outFragColor = vec4(nextColor, 1.0); vec3 prevColor = nextColor; diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..369d4444878f60a092189d56d24fd586c7a0c747 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH Date: Mon, 28 Aug 2017 18:14:46 -0700 Subject: [PATCH 26/45] Refining the debugging to better understand the issues --- .../render-utils/src/AntialiasingEffect.cpp | 35 ++++++++++++++++ .../render-utils/src/AntialiasingEffect.h | 20 +++++++++ libraries/render-utils/src/taa.slf | 6 ++- libraries/render-utils/src/taa.slh | 16 +++++--- libraries/render-utils/src/taa_blend.slf | 19 +++++---- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 38 ++++++++++++++---- 7 files changed, 111 insertions(+), 23 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index af896024d6..b41aec4030 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -287,6 +287,7 @@ void Antialiasing::configure(const Config& config) { _params.edit().velocityScale = config.velocityScale; _params.edit().setUnjitter(config.unjitter); + _params.edit().setConstrainColor(config.constrainColor); _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; @@ -380,6 +381,34 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const }); } + +void JitterSampleConfig::setIndex(int current) { + _index = (current) % JitterSample::SampleSequence::SEQUENCE_LENGTH; + emit dirty(); +} + +int JitterSampleConfig::pause() { + freeze = true; + emit dirty(); + return _index; +} + +int JitterSampleConfig::prev() { + setIndex(_index - 1); + return _index; +} + +int JitterSampleConfig::next() { + setIndex(_index + 1); + return _index; +} + +int JitterSampleConfig::play() { + freeze = false; + emit dirty(); + return _index; +} + JitterSample::SampleSequence::SampleSequence(){ // Halton sequence (2,3) offsets[0] = { 1.0f / 2.0f, 1.0f / 3.0f }; @@ -398,6 +427,12 @@ JitterSample::SampleSequence::SampleSequence(){ void JitterSample::configure(const Config& config) { _freeze = config.freeze; + if (_freeze) { + auto pausedIndex = config.getIndex(); + if (_jitterBuffer->currentIndex != pausedIndex) { + _jitterBuffer.edit().currentIndex = pausedIndex; + } + } _scale = config.scale; } void JitterSample::run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer) { diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 0fa0a5739e..b63a42b8ac 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -23,13 +23,29 @@ class JitterSampleConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float scale MEMBER scale NOTIFY dirty) Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) + Q_PROPERTY(int index READ getIndex NOTIFY dirty) public: JitterSampleConfig() : render::Job::Config(true) {} float scale{ 0.5f }; bool freeze{ false }; + + void setIndex(int current); + +public slots: + int pause(); + int prev(); + int next(); + int play(); + + int getIndex() const { return _index; } + signals: void dirty(); + +private: + int _index{ 0 }; + }; @@ -68,6 +84,7 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) Q_PROPERTY(bool unjitter MEMBER unjitter NOTIFY dirty) + Q_PROPERTY(bool constrainColor MEMBER constrainColor NOTIFY dirty) Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) @@ -91,6 +108,7 @@ public: float debugOrbZoom{ 2.0f }; bool unjitter{ true }; + bool constrainColor{ true }; bool debug { false }; bool showCursorPixel { false }; @@ -116,6 +134,8 @@ struct TAAParams { void setUnjitter(bool enabled) { SET_BIT(debug.y, 0, enabled); } bool isUnjitter() const { return (bool)GET_BIT(debug.y, 0); } + void setConstrainColor(bool enabled) { SET_BIT(debug.y, 1, enabled); } + bool isConstrainColor() const { return (bool)GET_BIT(debug.y, 1); } void setDebug(bool enabled) { SET_BIT(debug.x, 0, enabled); } bool isDebug() const { return (bool) GET_BIT(debug.x, 0); } diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 8f591035f3..c387e165da 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -20,12 +20,14 @@ layout(location = 0) out vec4 outFragColor; void main() { vec2 texelSize = getInvWidthHeight(); - vec2 fragUV = varTexCoord0 - float(taa_unjitter()) * taa_getJitterSample(sequence.currentIndex) * texelSize; + vec2 fragUV = varTexCoord0; + if (taa_unjitter()) { + fragUV -= taa_getJitterSample(sequence.currentIndex) * texelSize; + } vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); - /*vec3 sourceColor; vec3 historyColor; vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, sourceColor, historyColor); diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index ae9f62d471..cfe3170e24 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -67,7 +67,9 @@ bool taa_showClosestFragment() { bool taa_unjitter() { return GET_BIT(params.debug.y, 0); } - +bool taa_constrainColor() { + return GET_BIT(params.debug.y, 1); +} vec2 taa_getDebugCursorTexcoord() { return params.pixelInfo_orbZoom.xy; @@ -191,7 +193,10 @@ vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); - fragUV += float(taa_unjitter()) * taa_getJitterSample(sequence.currentIndex) * texelSize; + + if (taa_unjitter()) { + fragUV += taa_getJitterSample(sequence.currentIndex) * texelSize; + } const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; @@ -249,10 +254,11 @@ vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); // output - vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; + vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; - - // vec3 nextColor = mix(texel0, texel1, params.blend); + if (!taa_constrainColor()) { + nextColor = mix(historyColor, sourceColor, params.blend); + } return taa_resolveColor(nextColor); } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 44a54b44de..6cecaab7ea 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -73,17 +73,19 @@ void main(void) { vec2 prevOrbPosToPix = pixPos - prevOrbPos; float prevOrbPosToPixLength = length(prevOrbPosToPix); + float orbPixThreshold = 2.0 / taa_getDebugOrbZoom(); + if ((prevOrbPosToPixLength < tenPercentHeight) && (cursorVelocityLength > 0.5)) { vec2 prevOrbPosToPix_uv = cursorPrevUV + prevOrbPosToPix * texelSize / taa_getDebugOrbZoom(); vec3 preOrbColor = vec3(0.0); if (!(any(lessThan(prevOrbPosToPix_uv, vec2(0.0))) || any(greaterThan(prevOrbPosToPix_uv, vec2(1.0))))) { preOrbColor = texture(historyMap, prevOrbPosToPix_uv).xyz; } - if (prevOrbPosToPixLength < 2.0) { + if (prevOrbPosToPixLength < orbPixThreshold) { preOrbColor = vec3(1.0, 0.0, 1.0); } float distanceToNext = length(imageSize * (cursorUV - prevOrbPosToPix_uv)); - if (distanceToNext < 2.0) { + if (distanceToNext < orbPixThreshold) { preOrbColor = vec3(1.0, 0.5, 0.0); } outFragColor = vec4(preOrbColor, 1.0); @@ -96,10 +98,10 @@ void main(void) { nextOrbColor = texture(nextMap, nextOrbPosToPix_uv).xyz; } float distanceToPrev = length(imageSize * (cursorPrevUV - nextOrbPosToPix_uv)); - if (distanceToPrev < 2.0) { + if (distanceToPrev < orbPixThreshold) { nextOrbColor = vec3(1.0, 0.0, 1.0); } - if (nextOrbPosToPixLength < 2.0) { + if (nextOrbPosToPixLength < orbPixThreshold) { nextOrbColor = vec3(1.0, 0.5, 0.0); } @@ -114,13 +116,14 @@ void main(void) { vec2 jitterRegionPos = (pixPos - vec2(tenPercentHeight, imageSize.y - tenPercentHeight)); if ((all(lessThan(jitterRegionPos, jitterRegionSize)) && all(greaterThan(jitterRegionPos, vec2(0.0))))) { - float niceDotR2 = 4; + float niceDotR2 = 4.0; for (int s = 0; s < SEQUENCE_LENGTH; s++) { vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize; - float radius2 = (s == sequence.currentIndex ? 2.0 * niceDotR2 : niceDotR2); - if (dot(pixToSampleVec, pixToSampleVec) < radius2) { - outFragColor = vec4(colorRamp(float(s) / float(SEQUENCE_LENGTH)), 1.0); + float radius2 = (s == sequence.currentIndex ? 4.0 * niceDotR2 : niceDotR2); + float distToSample2 = dot(pixToSampleVec, pixToSampleVec); + if (distToSample2 < radius2) { + outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(SEQUENCE_LENGTH)), 1.0 - distToSample2 / radius2), 1.0); return; } } diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index 369d4444878f60a092189d56d24fd586c7a0c747..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e 100644 GIT binary patch delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtHR)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index e3001e96cc..8f9c02b8be 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -30,6 +30,8 @@ Rectangle { spacing: 20 Column{ + spacing: 10 + ConfigSlider { label: qsTr("Source blend") integral: false @@ -47,11 +49,36 @@ Rectangle { min: 0.0 } Row { + spacing: 10 CheckBox { text: "Unjitter" checked: Render.getConfig("RenderMainView.Antialiasing")["unjitter"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["unjitter"] = checked } } + CheckBox { + text: "Freeze " + checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] + onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } + } + Text { + text: Render.getConfig("RenderMainView.JitterCam").index + } + Button { + text: "<" + onClicked: { Render.getConfig("RenderMainView.JitterCam").prev(); } + } + Button { + text: ">" + onClicked: { Render.getConfig("RenderMainView.JitterCam").next(); } + } + } + Row { + spacing: 10 + CheckBox { + text: "Constrain color" + checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } + } } Row { CheckBox { @@ -59,11 +86,6 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["debug"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["debug"] = checked } } - CheckBox { - text: "Freeze " - checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] - onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } - } CheckBox { text: "Show Debug Cursor" checked: Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] @@ -85,7 +107,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showJitterSequence"] = checked } } CheckBox { - text: "CLosest Fragment" + text: "Closest Fragment" checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } } @@ -103,8 +125,8 @@ Rectangle { integral: false config: Render.getConfig("RenderMainView.Antialiasing") property: "debugOrbZoom" - max: 8.0 - min: 0.0 + max: 32.0 + min: 1.0 } } } From af09ae06861c7745cfd4e18934009cc8e6714d4c Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 29 Aug 2017 18:12:05 -0700 Subject: [PATCH 27/45] Some more refinment, no clear changes though --- libraries/render-utils/src/taa.slf | 17 +++++++++++------ libraries/render-utils/src/taa.slh | 16 ++++------------ libraries/render-utils/src/taa_blend.slf | 17 ++++++++++++----- .../utilities/render/TestQML/antialiasing.js | 4 ++-- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index c387e165da..9115cdc832 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -19,21 +19,26 @@ in vec2 varTexCoord0; layout(location = 0) out vec4 outFragColor; void main() { - vec2 texelSize = getInvWidthHeight(); vec2 fragUV = varTexCoord0; + + vec2 texelSize = getInvWidthHeight(); + vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex); if (taa_unjitter()) { - fragUV -= taa_getJitterSample(sequence.currentIndex) * texelSize; + fragUV -= fragJitterPix * texelSize; } vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); - /*vec3 sourceColor; + vec3 sourceColor; vec3 historyColor; vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, sourceColor, historyColor); - vec3 nextColor = mix(historyColor, sourceColor, params.blend); - */ - vec3 nextColor = taa_temporalReprojection(fragUV, fragVel, nearFragUV.z); + vec3 nextColor = mix(historyColor, sourceColor, params.blend); + + if (taa_constrainColor()) { + nextColor = taa_temporalReprojection(sourceColor, historyColor, fragUV, fragVel, nearFragUV.z, fragJitterPix); + } + outFragColor = vec4(nextColor, 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index cfe3170e24..85f094401b 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -182,21 +182,17 @@ float Luminance(vec3 rgb) { return rgb.x/4.0 + rgb.y/2.0 + rgb.z/4.0; } -vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) +vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { - vec3 sourceColor; - vec3 historyColor; - vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVelocity, sourceColor, historyColor); - vec4 texel1 = vec4(historyColor, 1.0); vec4 texel0 = vec4(sourceColor, 1.0); vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); - if (taa_unjitter()) { - fragUV += taa_getJitterSample(sequence.currentIndex) * texelSize; - } + /* if (taa_unjitter()) { + fragUV += fragJitterPix * texelSize; + }*/ const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; @@ -256,10 +252,6 @@ vec3 taa_temporalReprojection(vec2 fragUV, vec2 fragVelocity, float fragZe) // output vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; - if (!taa_constrainColor()) { - nextColor = mix(historyColor, sourceColor, params.blend); - } - return taa_resolveColor(nextColor); } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 6cecaab7ea..df820a5124 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -28,6 +28,10 @@ void main(void) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); + vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex); + + + vec2 pixPos = varTexCoord0 * imageSize; vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); @@ -37,16 +41,18 @@ void main(void) { // Pixel Debugged if (taa_showDebugCursor()) { - vec3 cursorFrag = taa_findClosestFragment3x3(taa_getDebugCursorTexcoord()); - vec2 cursorUV = cursorFrag.xy; - vec2 cursorPixelPos = cursorUV * imageSize; + vec2 cursorUVRaw = taa_getDebugCursorTexcoord(); + vec2 cursorPosRaw = floor(cursorUVRaw * imageSize) + vec2(0.5); + vec3 cursorFrag = taa_findClosestFragment3x3(cursorUVRaw); + vec2 cursorUV = cursorFrag.xy - fragJitterPix * texelSize; + vec2 cursorPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; vec2 cursorPrevUV = cursorUV - cursorVelocity; cursorVelocity *= imageSize; float cursorVelocityLength = length(cursorVelocity); vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; - vec2 cursorToFragVec = pixPos - cursorPixelPos; + vec2 cursorToFragVec = pixPos - cursorPos; float cursorToFragLength = length(cursorToFragVec); if ((cursorToFragLength <= cursorVelocityLength)) { @@ -65,7 +71,8 @@ void main(void) { float tenPercentHeight = 0.1 * imageSize.y; float centerWidth = imageSize.x * 0.5; - vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); + //vec2 nextOrbPos = vec2(centerWidth, imageSize.y - 3 * tenPercentHeight); + vec2 nextOrbPos = cursorPos; vec2 nextOrbPosToPix = pixPos - nextOrbPos; float nextOrbPosToPixLength = length(nextOrbPosToPix); diff --git a/scripts/developer/utilities/render/TestQML/antialiasing.js b/scripts/developer/utilities/render/TestQML/antialiasing.js index c6dab6eb15..a3414218a2 100644 --- a/scripts/developer/utilities/render/TestQML/antialiasing.js +++ b/scripts/developer/utilities/render/TestQML/antialiasing.js @@ -90,8 +90,8 @@ }); function setDebugCursor(x, y) { - nx = (x / Window.innerWidth); - ny = 1.0 - ((y) / (Window.innerHeight - 32)); + nx = ((x + 0.5) / Window.innerWidth); + ny = 1.0 - ((y + 0.5) / (Window.innerHeight)); Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny }; } From 37f440031f7397d496ca4093397ec44099acf721 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 30 Aug 2017 17:59:06 -0700 Subject: [PATCH 28/45] Expose Hlaton 16 sequence --- .../render-utils/src/AntialiasingEffect.cpp | 42 ++++++++++++++++--- .../render-utils/src/AntialiasingEffect.h | 2 +- libraries/render-utils/src/taa.slh | 2 +- libraries/render-utils/src/taa_blend.slf | 5 ++- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index b41aec4030..4e2d6dd489 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -409,8 +409,32 @@ int JitterSampleConfig::play() { return _index; } +template class Halton { +public: + + float eval(int index) { + float f = 1.0f; + float r = 0.0f; + float invB = 1.0f / (float)B; + index++; + + while (index > 0) { + f = f * invB; + r = r + f * (float) (index % B); + index = index / B; + } + + return r; + } +}; + + JitterSample::SampleSequence::SampleSequence(){ // Halton sequence (2,3) + + Halton<2> genX; + Halton<3> genY; + offsets[0] = { 1.0f / 2.0f, 1.0f / 3.0f }; offsets[1] = { 1.0f / 4.0f, 2.0f / 3.0f }; offsets[2] = { 3.0f / 4.0f, 1.0f / 9.0f }; @@ -421,7 +445,11 @@ JitterSample::SampleSequence::SampleSequence(){ offsets[7] = { 1.0f / 16.0f, 8.0f / 9.0f }; for (int i = 0; i < SEQUENCE_LENGTH; i++) { - offsets[i] = offsets[i] - vec2(0.5f); + offsets[i] = glm::vec2(genX.eval(i), genY.eval(i)); + } + + for (int i = 0; i < SEQUENCE_LENGTH; i++) { + offsets[i] -= vec2(0.5f); } } @@ -448,11 +476,13 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter auto width = (float) renderContext->args->_viewport.z; auto height = (float) renderContext->args->_viewport.w; - auto jx = -4.0 * jit.x / width; - auto jy = -4.0 * jit.y / height; - - projMat[2][0] += jx; - projMat[2][1] += jy; + // auto jx = -4.0 * jit.x / width; +// auto jy = -4.0 * jit.y / height; + auto jx = -2.0 * jit.x / width; + auto jy = -2.0 * jit.y / height; + + projMat[2][0] += jx * projMat[0][0]; + projMat[2][1] += jy * projMat[1][1]; viewFrustum.setProjection(projMat); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index b63a42b8ac..7743906509 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -54,7 +54,7 @@ public: struct SampleSequence { SampleSequence(); - static const int SEQUENCE_LENGTH{ 8 }; + static const int SEQUENCE_LENGTH{ 16 }; glm::vec2 offsets[SEQUENCE_LENGTH]; int sequenceLength{ SEQUENCE_LENGTH }; int currentIndex{ 0 }; diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 85f094401b..6c4f85d70c 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -13,7 +13,7 @@ <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> -const int SEQUENCE_LENGTH = 8; +const int SEQUENCE_LENGTH = 16; struct JitterSequence { vec4 offsets[SEQUENCE_LENGTH / 2]; int sequenceLength; diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index df820a5124..0daef04144 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -125,12 +125,13 @@ void main(void) { float niceDotR2 = 4.0; - for (int s = 0; s < SEQUENCE_LENGTH; s++) { + int sequenceLength = sequence.sequenceLength; + for (int s = 0; s < sequenceLength; s++) { vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize; float radius2 = (s == sequence.currentIndex ? 4.0 * niceDotR2 : niceDotR2); float distToSample2 = dot(pixToSampleVec, pixToSampleVec); if (distToSample2 < radius2) { - outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(SEQUENCE_LENGTH)), 1.0 - distToSample2 / radius2), 1.0); + outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(sequenceLength)), 1.0 - distToSample2 / radius2), 1.0); return; } } From 16fbe00ef5cc1063086a22fc2e6e66f200d9b293 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 30 Aug 2017 22:42:55 -0700 Subject: [PATCH 29/45] FIxing the jittering projection modification --- .../render-utils/src/AntialiasingEffect.cpp | 24 +++++------------- .../render-utils/src/AntialiasingEffect.h | 2 +- libraries/render-utils/src/taa.slf | 2 +- libraries/render-utils/src/taa.slh | 16 +++++++++--- libraries/render-utils/src/taa_blend.slf | 8 +++--- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 4e2d6dd489..b18d7f20ce 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -411,12 +411,11 @@ int JitterSampleConfig::play() { template class Halton { public: - float eval(int index) { float f = 1.0f; float r = 0.0f; float invB = 1.0f / (float)B; - index++; + index++; // Indices start at 1, not 0 while (index > 0) { f = f * invB; @@ -431,19 +430,9 @@ public: JitterSample::SampleSequence::SampleSequence(){ // Halton sequence (2,3) - Halton<2> genX; Halton<3> genY; - offsets[0] = { 1.0f / 2.0f, 1.0f / 3.0f }; - offsets[1] = { 1.0f / 4.0f, 2.0f / 3.0f }; - offsets[2] = { 3.0f / 4.0f, 1.0f / 9.0f }; - offsets[3] = { 1.0f / 8.0f, 4.0f / 9.0f }; - offsets[4] = { 5.0f / 8.0f, 7.0f / 9.0f }; - offsets[5] = { 3.0f / 8.0f, 2.0f / 9.0f }; - offsets[6] = { 7.0f / 8.0f, 5.0f / 9.0f }; - offsets[7] = { 1.0f / 16.0f, 8.0f / 9.0f }; - for (int i = 0; i < SEQUENCE_LENGTH; i++) { offsets[i] = glm::vec2(genX.eval(i), genY.eval(i)); } @@ -451,6 +440,7 @@ JitterSample::SampleSequence::SampleSequence(){ for (int i = 0; i < SEQUENCE_LENGTH; i++) { offsets[i] -= vec2(0.5f); } + offsets[SEQUENCE_LENGTH] = glm::vec2(0.0f); } void JitterSample::configure(const Config& config) { @@ -472,17 +462,17 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter auto projMat = viewFrustum.getProjection(); auto theNear = viewFrustum.getNearClip(); - auto jit = _scale * jitterBuffer.get().offsets[current]; + auto jit = jitterBuffer.get().offsets[current]; auto width = (float) renderContext->args->_viewport.z; auto height = (float) renderContext->args->_viewport.w; // auto jx = -4.0 * jit.x / width; // auto jy = -4.0 * jit.y / height; - auto jx = -2.0 * jit.x / width; - auto jy = -2.0 * jit.y / height; + auto jx = 2.0 * jit.x / width; + auto jy = 2.0 * jit.y / height; - projMat[2][0] += jx * projMat[0][0]; - projMat[2][1] += jy * projMat[1][1]; + projMat[2][0] += jx; + projMat[2][1] += jy; viewFrustum.setProjection(projMat); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 7743906509..ab25642880 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -55,7 +55,7 @@ public: struct SampleSequence { SampleSequence(); static const int SEQUENCE_LENGTH{ 16 }; - glm::vec2 offsets[SEQUENCE_LENGTH]; + glm::vec2 offsets[SEQUENCE_LENGTH + 1]; int sequenceLength{ SEQUENCE_LENGTH }; int currentIndex{ 0 }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 9115cdc832..23c6b5e8cc 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -22,7 +22,7 @@ void main() { vec2 fragUV = varTexCoord0; vec2 texelSize = getInvWidthHeight(); - vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex); + vec2 fragJitterPix = taa_getCurrentJitterSample(); if (taa_unjitter()) { fragUV -= fragJitterPix * texelSize; } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 6c4f85d70c..fff5ef15c5 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -15,9 +15,7 @@ const int SEQUENCE_LENGTH = 16; struct JitterSequence { - vec4 offsets[SEQUENCE_LENGTH / 2]; - int sequenceLength; - int currentIndex; + vec4 offsets[(SEQUENCE_LENGTH / 2) + 1]; }; layout(std140) uniform taaJitterBuffer { JitterSequence sequence; @@ -27,6 +25,18 @@ vec2 taa_getJitterSample(int index) { return vec2((bool(index & 0x01) ? sequence.offsets[index >> 1].zw : sequence.offsets[index >> 1].xy)); } +int taa_getJitterSequenceLength() { + return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].z); +} + +int taa_getCurrentJitterIndex() { + return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].w); +} + +vec2 taa_getCurrentJitterSample() { + return taa_getJitterSample(taa_getCurrentJitterIndex()); +} + <@include gpu/Color.slh@> uniform sampler2D depthMap; diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 0daef04144..cd046506d0 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -28,7 +28,7 @@ void main(void) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); - vec2 fragJitterPix = taa_getJitterSample(sequence.currentIndex); + vec2 fragJitterPix = taa_getCurrentJitterSample(); @@ -44,7 +44,7 @@ void main(void) { vec2 cursorUVRaw = taa_getDebugCursorTexcoord(); vec2 cursorPosRaw = floor(cursorUVRaw * imageSize) + vec2(0.5); vec3 cursorFrag = taa_findClosestFragment3x3(cursorUVRaw); - vec2 cursorUV = cursorFrag.xy - fragJitterPix * texelSize; + vec2 cursorUV = cursorUVRaw - fragJitterPix * texelSize; vec2 cursorPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; vec2 cursorPrevUV = cursorUV - cursorVelocity; @@ -125,10 +125,10 @@ void main(void) { float niceDotR2 = 4.0; - int sequenceLength = sequence.sequenceLength; + int sequenceLength = taa_getJitterSequenceLength(); for (int s = 0; s < sequenceLength; s++) { vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize; - float radius2 = (s == sequence.currentIndex ? 4.0 * niceDotR2 : niceDotR2); + float radius2 = (s == taa_getCurrentJitterIndex() ? 4.0 * niceDotR2 : niceDotR2); float distToSample2 = dot(pixToSampleVec, pixToSampleVec); if (distToSample2 < radius2) { outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(sequenceLength)), 1.0 - distToSample2 / radius2), 1.0); diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..369d4444878f60a092189d56d24fd586c7a0c747 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH Date: Thu, 31 Aug 2017 18:27:47 -0700 Subject: [PATCH 30/45] COmparing against fxaa --- .../render-utils/src/AntialiasingEffect.cpp | 4 +- .../render-utils/src/AntialiasingEffect.h | 27 +++--- libraries/render-utils/src/taa.slf | 9 ++ libraries/render-utils/src/taa.slh | 91 ++++++++++++++++-- libraries/render-utils/src/taa_blend.slf | 18 ++-- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 10 +- 7 files changed, 132 insertions(+), 27 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index b18d7f20ce..c1d622b8de 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -291,7 +291,9 @@ void Antialiasing::configure(const Config& config) { _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; - _params.edit().debugX = config.debugX; + _params.edit().regionInfo.x = config.debugX; + _params.edit().regionInfo.z = config.debugFXAAX; + _params.edit().setDebug(config.debug); _params.edit().setShowDebugCursor(config.showCursorPixel); _params.edit().setDebugCursor(config.debugCursorTexcoord); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index ab25642880..b981704602 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -88,6 +88,7 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) + Q_PROPERTY(float debugFXAAX MEMBER debugFXAAX NOTIFY dirty) Q_PROPERTY(float debugShowVelocityThreshold MEMBER debugShowVelocityThreshold NOTIFY dirty) Q_PROPERTY(bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty) Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty) @@ -103,6 +104,7 @@ public: float velocityScale{ 1.0f }; float debugX{ 0.0f }; + float debugFXAAX{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; float debugOrbZoom{ 2.0f }; @@ -123,25 +125,26 @@ signals: #define GET_BIT(bitfield, bitIndex) ((bitfield) & (1 << (bitIndex))) struct TAAParams { - float debugX{ 0.0f }; + float nope{ 0.0f }; float blend{ 0.1f }; float velocityScale{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; - glm::ivec4 debug{ 0 }; + glm::ivec4 flags{ 0 }; glm::vec4 pixelInfo{ 0.5f, 0.5f, 2.0f, 0.0f }; + glm::vec4 regionInfo{ 0.0f, 0.0f, 1.0f, 0.0f }; - void setUnjitter(bool enabled) { SET_BIT(debug.y, 0, enabled); } - bool isUnjitter() const { return (bool)GET_BIT(debug.y, 0); } + void setUnjitter(bool enabled) { SET_BIT(flags.y, 0, enabled); } + bool isUnjitter() const { return (bool)GET_BIT(flags.y, 0); } - void setConstrainColor(bool enabled) { SET_BIT(debug.y, 1, enabled); } - bool isConstrainColor() const { return (bool)GET_BIT(debug.y, 1); } + void setConstrainColor(bool enabled) { SET_BIT(flags.y, 1, enabled); } + bool isConstrainColor() const { return (bool)GET_BIT(flags.y, 1); } - void setDebug(bool enabled) { SET_BIT(debug.x, 0, enabled); } - bool isDebug() const { return (bool) GET_BIT(debug.x, 0); } + void setDebug(bool enabled) { SET_BIT(flags.x, 0, enabled); } + bool isDebug() const { return (bool) GET_BIT(flags.x, 0); } - void setShowDebugCursor(bool enabled) { SET_BIT(debug.x, 1, enabled); } - bool showDebugCursor() const { return (bool)GET_BIT(debug.x, 1); } + void setShowDebugCursor(bool enabled) { SET_BIT(flags.x, 1, enabled); } + bool showDebugCursor() const { return (bool)GET_BIT(flags.x, 1); } void setDebugCursor(glm::vec2 debugCursor) { pixelInfo.x = debugCursor.x; pixelInfo.y = debugCursor.y; } glm::vec2 getDebugCursor() const { return glm::vec2(pixelInfo.x, pixelInfo.y); } @@ -149,8 +152,8 @@ struct TAAParams { void setDebugOrbZoom(float orbZoom) { pixelInfo.z = orbZoom; } float getDebugOrbZoom() const { return pixelInfo.z; } - void setShowJitterSequence(bool enabled) { SET_BIT(debug.x, 2, enabled); } - void setShowClosestFragment(bool enabled) { SET_BIT(debug.x, 3, enabled); } + void setShowJitterSequence(bool enabled) { SET_BIT(flags.x, 2, enabled); } + void setShowClosestFragment(bool enabled) { SET_BIT(flags.x, 3, enabled); } }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 23c6b5e8cc..01c8942aee 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -20,6 +20,8 @@ layout(location = 0) out vec4 outFragColor; void main() { vec2 fragUV = varTexCoord0; + + vec2 texelSize = getInvWidthHeight(); vec2 fragJitterPix = taa_getCurrentJitterSample(); @@ -27,6 +29,13 @@ void main() { fragUV -= fragJitterPix * texelSize; } + // Debug region before debug or fxaa region X + float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; + if (distToRegionFXAA > 0.0) { + outFragColor = vec4(taa_evalTXAA(fragUV), 1.0); + return; + } + vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index fff5ef15c5..fd4bcde377 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -47,12 +47,13 @@ uniform sampler2D nextMap; struct TAAParams { - float debugX; + float none; float blend; float motionScale; float debugShowVelocityThreshold; - ivec4 debug; + ivec4 flags; vec4 pixelInfo_orbZoom; + vec4 regionInfo; }; layout(std140) uniform taaParamsBuffer { @@ -62,23 +63,23 @@ layout(std140) uniform taaParamsBuffer { #define GET_BIT(bitfield, bitIndex) bool((bitfield) & (1 << (bitIndex))) bool taa_showDebugCursor() { - return GET_BIT(params.debug.x, 1); + return GET_BIT(params.flags.x, 1); } bool taa_showJitterSequence() { - return GET_BIT(params.debug.x, 2); + return GET_BIT(params.flags.x, 2); } bool taa_showClosestFragment() { - return GET_BIT(params.debug.x, 3); + return GET_BIT(params.flags.x, 3); } bool taa_unjitter() { - return GET_BIT(params.debug.y, 0); + return GET_BIT(params.flags.y, 0); } bool taa_constrainColor() { - return GET_BIT(params.debug.y, 1); + return GET_BIT(params.flags.y, 1); } vec2 taa_getDebugCursorTexcoord() { @@ -89,6 +90,14 @@ float taa_getDebugOrbZoom() { return params.pixelInfo_orbZoom.z; } +vec2 taa_getRegionDebug() { + return params.regionInfo.xy; +} + +vec2 taa_getRegionFXAA() { + return params.regionInfo.zw; +} + vec4 taa_fetchColor(sampler2D map, vec2 uv) { #if USE_YCOCG vec4 c = texture(map, uv); @@ -274,3 +283,71 @@ vec3 taa_getVelocityColorRelative(float velocityPixLength) { vec3 taa_getVelocityColorAboveThreshold(float velocityPixLength) { return colorRamp((velocityPixLength - params.debugShowVelocityThreshold)/params.debugShowVelocityThreshold); } + + +vec3 taa_evalTXAA(vec2 fragUV) { + + vec2 texelSize = getInvWidthHeight(); + + // filter width limit for dependent "two-tap" texture samples + float FXAA_SPAN_MAX = 8.0; + + // local contrast multiplier for performing AA + // higher = sharper, but setting this value too high will cause near-vertical and near-horizontal edges to fail + // see "fxaaQualityEdgeThreshold" + float FXAA_REDUCE_MUL = 1.0 / 8.0; + + // luminance threshold for processing dark colors + // see "fxaaQualityEdgeThresholdMin" + float FXAA_REDUCE_MIN = 1.0 / 128.0; + + // fetch raw RGB values for nearby locations + // sampling pattern is "five on a die" (each diagonal direction and the center) + // computing the coordinates for these texture reads could be moved to the vertex shader for speed if needed + vec3 rgbNW = texture(sourceMap, fragUV + (vec2(-1.0, -1.0) * texelSize)).xyz; + vec3 rgbNE = texture(sourceMap, fragUV + (vec2(+1.0, -1.0) * texelSize)).xyz; + vec3 rgbSW = texture(sourceMap, fragUV + (vec2(-1.0, +1.0) * texelSize)).xyz; + vec3 rgbSE = texture(sourceMap, fragUV + (vec2(+1.0, +1.0) * texelSize)).xyz; + vec3 rgbM = texture(sourceMap, fragUV).xyz; + + // convert RGB values to luminance + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot( rgbM, luma); + + // luma range of local neighborhood + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); + + // direction perpendicular to local luma gradient + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); + + // compute clamped direction offset for additional "two-tap" samples + // longer vector = blurry, shorter vector = sharp + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize; + + // perform additional texture sampling perpendicular to gradient + vec3 rgbA = (1.0 / 2.0) * ( + texture(sourceMap, fragUV + dir * (1.0 / 3.0 - 0.5)).xyz + + texture(sourceMap, fragUV + dir * (2.0 / 3.0 - 0.5)).xyz); + vec3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * ( + texture(sourceMap, fragUV + dir * (0.0 / 3.0 - 0.5)).xyz + + texture(sourceMap, fragUV + dir * (3.0 / 3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); + + // compare luma of new samples to the luma range of the original neighborhood + // if the new samples exceed this range, just use the first two samples instead of all four + if (lumaB < lumaMin || lumaB > lumaMax) { + return rgbA; + } else { + return rgbB; + } +} \ No newline at end of file diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index cd046506d0..ac8e18036a 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -125,7 +125,8 @@ void main(void) { float niceDotR2 = 4.0; - int sequenceLength = taa_getJitterSequenceLength(); + //int sequenceLength = taa_getJitterSequenceLength(); + int sequenceLength = SEQUENCE_LENGTH; for (int s = 0; s < sequenceLength; s++) { vec2 pixToSampleVec = jitterRegionPos - (vec2(0.5) + taa_getJitterSample(s)) * jitterRegionSize; float radius2 = (s == taa_getCurrentJitterIndex() ? 4.0 * niceDotR2 : niceDotR2); @@ -139,18 +140,23 @@ void main(void) { } } - // Debug region before debugX - if (varTexCoord0.x > params.debugX) { + // Debug region before debug or fxaa region X + float distToRegionDebug = varTexCoord0.x - taa_getRegionDebug().x; + float distToRegionFXAA = varTexCoord0.x - taa_getRegionFXAA().x; + if ((distToRegionFXAA < 0.0) && (distToRegionDebug > 0.0)) { return; } - // draw a region splitter - if (abs(varTexCoord0.x - params.debugX) < getInvWidthHeight().x) { + // draw region splitter + if ((abs(distToRegionDebug) < getInvWidthHeight().x) || (abs(distToRegionFXAA) < getInvWidthHeight().x)) { outFragColor.rgb = vec3(1.0, 1.0, 0.0); return; } - + if (distToRegionFXAA > 0.0) { + outFragColor.rgb = taa_evalTXAA(); + return; + } if (taa_showClosestFragment()) { vec3 fragUV = taa_findClosestFragment3x3(varTexCoord0); diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index 369d4444878f60a092189d56d24fd586c7a0c747..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e 100644 GIT binary patch delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtHR)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 8f9c02b8be..b4b20d48bd 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -93,13 +93,21 @@ Rectangle { } } ConfigSlider { - label: qsTr("Debug X") + label: qsTr("Debug Region <") integral: false config: Render.getConfig("RenderMainView.Antialiasing") property: "debugX" max: 1.0 min: 0.0 } + ConfigSlider { + label: qsTr("FXAA Region >") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "debugFXAAX" + max: 1.0 + min: 0.0 + } Row { CheckBox { text: "Jitter Sequence" From a3f1c487f1b5b3381118adb116e536e22be89f6e Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 31 Aug 2017 23:42:43 -0700 Subject: [PATCH 31/45] adding disabling of jittering for comparison --- .../render-utils/src/AntialiasingEffect.cpp | 11 +++++++---- libraries/render-utils/src/taa.slh | 9 +++++---- libraries/render-utils/src/taa_blend.slf | 1 - .../src/velocityBuffer_cameraMotion.slf | 4 ++-- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index c1d622b8de..a61b4172a0 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -458,18 +458,21 @@ void JitterSample::configure(const Config& config) { void JitterSample::run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer) { auto& current = _jitterBuffer.edit().currentIndex; if (!_freeze) { - current = (current + 1) % SampleSequence::SEQUENCE_LENGTH; + if (current >= 0) { + current = (current + 1) % SampleSequence::SEQUENCE_LENGTH; + } + else { + current = -1; + } } auto viewFrustum = renderContext->args->getViewFrustum(); auto projMat = viewFrustum.getProjection(); auto theNear = viewFrustum.getNearClip(); - auto jit = jitterBuffer.get().offsets[current]; + auto jit = jitterBuffer.get().offsets[(current < 0 ? SampleSequence::SEQUENCE_LENGTH : current)]; auto width = (float) renderContext->args->_viewport.z; auto height = (float) renderContext->args->_viewport.w; - // auto jx = -4.0 * jit.x / width; -// auto jy = -4.0 * jit.y / height; auto jx = 2.0 * jit.x / width; auto jy = 2.0 * jit.y / height; diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index fd4bcde377..f8debce7d9 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -14,8 +14,9 @@ <$declareDeferredFrameTransform()$> const int SEQUENCE_LENGTH = 16; +const int INFO_INDEX = SEQUENCE_LENGTH / 2; struct JitterSequence { - vec4 offsets[(SEQUENCE_LENGTH / 2) + 1]; + vec4 offsets[INFO_INDEX + 1]; }; layout(std140) uniform taaJitterBuffer { JitterSequence sequence; @@ -26,11 +27,11 @@ vec2 taa_getJitterSample(int index) { } int taa_getJitterSequenceLength() { - return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].z); + return floatBitsToInt(sequence.offsets[INFO_INDEX].z); } int taa_getCurrentJitterIndex() { - return int(sequence.offsets[(SEQUENCE_LENGTH / 2)].w); + return floatBitsToInt(sequence.offsets[INFO_INDEX].w); } vec2 taa_getCurrentJitterSample() { @@ -269,7 +270,7 @@ vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); // output - vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; + vec3 nextColor = mix(texel0, texel1, k_feedback).xyz; return taa_resolveColor(nextColor); } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index ac8e18036a..0ef3728cc3 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -154,7 +154,6 @@ void main(void) { } if (distToRegionFXAA > 0.0) { - outFragColor.rgb = taa_evalTXAA(); return; } diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index d44219d25f..50ab39191f 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -27,10 +27,10 @@ void main(void) { float Zdb = texelFetch(depthMap, ivec2(gl_FragCoord.xy), 0).x; float Zeye = evalZeyeFromZdb(Zdb); - if (Zeye <= -getPosLinearDepthFar()) { +/* if (Zeye <= -getPosLinearDepthFar()) { outFragColor = vec4(0.5, 0.5, 0.0, 0.0); return; - } + }*/ // The position of the pixel fragment in Eye space then in world space vec3 eyePos = evalEyePositionFromZeye(stereoSide.x, Zeye, texcoordPos); diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..369d4444878f60a092189d56d24fd586c7a0c747 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH Date: Thu, 31 Aug 2017 23:51:19 -0700 Subject: [PATCH 32/45] adding disabling of jittering for comparison --- libraries/render-utils/src/taa.slh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index f8debce7d9..eee1aaed5f 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -98,6 +98,7 @@ vec2 taa_getRegionDebug() { vec2 taa_getRegionFXAA() { return params.regionInfo.zw; } +#define USE_YCOCG 1 vec4 taa_fetchColor(sampler2D map, vec2 uv) { #if USE_YCOCG @@ -242,7 +243,7 @@ vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, // shrink chroma min-max #if USE_YCOCG - vec2 chroma_extent = 0.25 * 0.5 * (cmax.r - cmin.r); + vec2 chroma_extent = vec2(0.25 * 0.5 * (cmax.r - cmin.r)); vec2 chroma_center = texel0.gb; cmin.yz = chroma_center - chroma_extent; cmax.yz = chroma_center + chroma_extent; @@ -270,7 +271,7 @@ vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); // output - vec3 nextColor = mix(texel0, texel1, k_feedback).xyz; + vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; return taa_resolveColor(nextColor); } From 3695cd616479176edeef6a03bc5e53a00aa7af34 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 1 Sep 2017 09:27:49 -0700 Subject: [PATCH 33/45] Editing .gitignore to remove qmlc files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d6227f1f30..acaf95ba6a 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ TAGS # ignore node files for the console node_modules npm-debug.log + +# ignore qmlc files generated from qml as cache +*.qmlc \ No newline at end of file From b243475cc99013311fae965b1ba4a70f5c505bc1 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 1 Sep 2017 15:32:23 -0700 Subject: [PATCH 34/45] New stuff for better rendering f ui --- interface/src/ui/overlays/Web3DOverlay.cpp | 1 + .../render-utils/src/AntialiasingEffect.cpp | 28 ++++++- .../render-utils/src/AntialiasingEffect.h | 6 +- libraries/render-utils/src/taa.slf | 2 +- libraries/render-utils/src/taa.slh | 2 +- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 70 +++++++++++------- 7 files changed, 80 insertions(+), 29 deletions(-) diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 104082dee4..cb25480a09 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -255,6 +255,7 @@ void Web3DOverlay::loadSourceURL() { _webSurface->getSurfaceContext()->setContextProperty("InputConfiguration", DependencyManager::get().data()); _webSurface->getSurfaceContext()->setContextProperty("SoundCache", DependencyManager::get().data()); _webSurface->getSurfaceContext()->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); + _webSurface->getSurfaceContext()->setContextProperty("Render", AbstractViewStateInterface::instance()->getRenderEngine()->getConfiguration().get()); _webSurface->getSurfaceContext()->setContextProperty("pathToFonts", "../../"); diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index a61b4172a0..8a19e9c5cb 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -389,6 +389,32 @@ void JitterSampleConfig::setIndex(int current) { emit dirty(); } +int JitterSampleConfig::cycleStopPauseRun() { + _state = (_state + 1) % 3; + switch (_state) { + case 0: { + stop = true; + freeze = false; + setIndex(-1); + break; + } + case 1: { + stop = false; + freeze = true; + setIndex(0); + break; + } + case 2: + default: { + stop = false; + freeze = false; + setIndex(0); + break; + } + } + return _state; +} + int JitterSampleConfig::pause() { freeze = true; emit dirty(); @@ -447,7 +473,7 @@ JitterSample::SampleSequence::SampleSequence(){ void JitterSample::configure(const Config& config) { _freeze = config.freeze; - if (_freeze) { + if (config.stop || _freeze) { auto pausedIndex = config.getIndex(); if (_jitterBuffer->currentIndex != pausedIndex) { _jitterBuffer.edit().currentIndex = pausedIndex; diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index b981704602..9e10673369 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -23,27 +23,31 @@ class JitterSampleConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float scale MEMBER scale NOTIFY dirty) Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) + Q_PROPERTY(bool stop MEMBER stop NOTIFY dirty) Q_PROPERTY(int index READ getIndex NOTIFY dirty) public: JitterSampleConfig() : render::Job::Config(true) {} float scale{ 0.5f }; + bool stop{ false }; bool freeze{ false }; void setIndex(int current); public slots: + int cycleStopPauseRun(); int pause(); int prev(); int next(); int play(); int getIndex() const { return _index; } - + int getState() const { return _state; } signals: void dirty(); private: + int _state{ 0 }; int _index{ 0 }; }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 01c8942aee..be2a40ba3f 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -49,5 +49,5 @@ void main() { nextColor = taa_temporalReprojection(sourceColor, historyColor, fragUV, fragVel, nearFragUV.z, fragJitterPix); } - outFragColor = vec4(nextColor, 1.0); + outFragColor = vec4(taa_resolveColor(nextColor), 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index eee1aaed5f..cb2df97790 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -273,7 +273,7 @@ vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, // output vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; - return taa_resolveColor(nextColor); + return nextColor; } <$declareColorWheel()$> diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index 369d4444878f60a092189d56d24fd586c7a0c747..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e 100644 GIT binary patch delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtHR)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index b4b20d48bd..e6c0b0db79 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -13,7 +13,7 @@ import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 import "../lib/styles-uit" -//import "../../controls-uit" as HifiControls +import "../lib/controls-uit" as HifiControls import "configSlider" @@ -32,7 +32,7 @@ Rectangle { Column{ spacing: 10 - ConfigSlider { + HifiControls.ConfigSlider { label: qsTr("Source blend") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -48,45 +48,68 @@ Rectangle { max: 1.0 min: 0.0 } + Separator {} Row { spacing: 10 - CheckBox { - text: "Unjitter" - checked: Render.getConfig("RenderMainView.Antialiasing")["unjitter"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["unjitter"] = checked } + + HifiControls.Button { + text: { + var state = 2 - (Render.getConfig("RenderMainView.JitterCam").freeze * 1 - Render.getConfig("RenderMainView.JitterCam").stop * 2); + if (state === 2) { + return ">>" + } else if (state === 1) { + return "|" + Render.getConfig("RenderMainView.JitterCam").index + "|" + } else { + return "[]" + } + } + onClicked: { Render.getConfig("RenderMainView.JitterCam").cycleStopPauseRun(); } } - CheckBox { - text: "Freeze " - checked: Render.getConfig("RenderMainView.JitterCam")["freeze"] - onCheckedChanged: { Render.getConfig("RenderMainView.JitterCam")["freeze"] = checked } - } - Text { - text: Render.getConfig("RenderMainView.JitterCam").index - } - Button { + HifiControls.Button { text: "<" onClicked: { Render.getConfig("RenderMainView.JitterCam").prev(); } } - Button { + HifiControls.Button { text: ">" onClicked: { Render.getConfig("RenderMainView.JitterCam").next(); } } } Row { spacing: 10 - CheckBox { + HifiControls.CheckBox { + boxSize: 20 + text: "Unjitter" + checked: Render.getConfig("RenderMainView.Antialiasing")["unjitter"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["unjitter"] = checked } + } + HifiControls.CheckBox { + boxSize: 20 + text: "Show Sequence" + checked: Render.getConfig("RenderMainView.Antialiasing")["showJitterSequence"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showJitterSequence"] = checked } + } + } + Separator {} + Row { + spacing: 10 + HifiControls.CheckBox { + boxSize: 20 text: "Constrain color" checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } } } Row { - CheckBox { + + spacing: 10 + HifiControls.CheckBox { + boxSize: 20 text: "Debug" checked: Render.getConfig("RenderMainView.Antialiasing")["debug"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["debug"] = checked } } - CheckBox { + HifiControls.CheckBox { + boxSize: 20 text: "Show Debug Cursor" checked: Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] = checked } @@ -109,12 +132,9 @@ Rectangle { min: 0.0 } Row { - CheckBox { - text: "Jitter Sequence" - checked: Render.getConfig("RenderMainView.Antialiasing")["showJitterSequence"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showJitterSequence"] = checked } - } - CheckBox { + + HifiControls.CheckBox { + boxSize: 20 text: "Closest Fragment" checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } From 2035940cc9435f93f1018a4d22fd5d9d4ec3d5b3 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 1 Sep 2017 15:33:17 -0700 Subject: [PATCH 35/45] Duplicating the qml hif stuff to be able to use the same objects --- .../utilities/lib/controls-uit/Button.qml | 73 +++++ .../utilities/lib/controls-uit/CheckBox.qml | 101 +++++++ .../utilities/lib/controls-uit/ComboBox.qml | 249 ++++++++++++++++++ .../lib/controls-uit/ConfigSlider.qml | 72 +++++ .../lib/controls-uit/ContentSection.qml | 138 ++++++++++ .../lib/controls-uit/GlyphButton.qml | 78 ++++++ .../lib/controls-uit/HorizontalRule.qml | 20 ++ .../lib/controls-uit/HorizontalSpacer.qml | 21 ++ .../utilities/lib/controls-uit/Label.qml | 22 ++ .../lib/controls-uit/QueuedButton.qml | 43 +++ .../lib/controls-uit/RadioButton.qml | 71 +++++ .../utilities/lib/controls-uit/Separator.qml | 38 +++ .../utilities/lib/controls-uit/Slider.qml | 98 +++++++ .../utilities/lib/controls-uit/SpinBox.qml | 117 ++++++++ .../utilities/lib/controls-uit/Switch.qml | 156 +++++++++++ .../utilities/lib/controls-uit/Table.qml | 179 +++++++++++++ .../lib/controls-uit/VerticalSpacer.qml | 21 ++ 17 files changed, 1497 insertions(+) create mode 100644 scripts/developer/utilities/lib/controls-uit/Button.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/CheckBox.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/ComboBox.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/ContentSection.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/GlyphButton.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/HorizontalRule.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/HorizontalSpacer.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/Label.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/QueuedButton.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/RadioButton.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/Separator.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/Slider.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/SpinBox.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/Switch.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/Table.qml create mode 100644 scripts/developer/utilities/lib/controls-uit/VerticalSpacer.qml diff --git a/scripts/developer/utilities/lib/controls-uit/Button.qml b/scripts/developer/utilities/lib/controls-uit/Button.qml new file mode 100644 index 0000000000..59f8a63238 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Button.qml @@ -0,0 +1,73 @@ +// +// Button.qml +// +// Created by David Rowe on 16 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" + +Original.Button { + property int color: 0 + property int colorScheme: hifi.colorSchemes.light + + width: 120 + height: hifi.dimensions.controlLineHeight + + HifiConstants { id: hifi } + + style: ButtonStyle { + + background: Rectangle { + radius: hifi.buttons.radius + + gradient: Gradient { + GradientStop { + position: 0.2 + color: { + if (!control.enabled) { + hifi.buttons.disabledColorStart[control.colorScheme] + } else if (control.pressed) { + hifi.buttons.pressedColor[control.color] + } else if (control.hovered) { + hifi.buttons.hoveredColor[control.color] + } else { + hifi.buttons.colorStart[control.color] + } + } + } + GradientStop { + position: 1.0 + color: { + if (!control.enabled) { + hifi.buttons.disabledColorFinish[control.colorScheme] + } else if (control.pressed) { + hifi.buttons.pressedColor[control.color] + } else if (control.hovered) { + hifi.buttons.hoveredColor[control.color] + } else { + hifi.buttons.colorFinish[control.color] + } + } + } + } + } + + label: RalewayBold { + font.capitalization: Font.AllUppercase + color: enabled ? hifi.buttons.textColor[control.color] + : hifi.buttons.disabledTextColor[control.colorScheme] + size: hifi.fontSizes.buttonLabel + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + text: control.text + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/CheckBox.qml b/scripts/developer/utilities/lib/controls-uit/CheckBox.qml new file mode 100644 index 0000000000..b279b7ca8d --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/CheckBox.qml @@ -0,0 +1,101 @@ +// +// CheckBox.qml +// +// Created by David Rowe on 26 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" + +Original.CheckBox { + id: checkBox + + property int colorScheme: hifi.colorSchemes.light + property string color: hifi.colors.lightGrayText + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + property bool isRedCheck: false + property int boxSize: 14 + property int boxRadius: 3 + property bool wrap: true; + readonly property int checkSize: Math.max(boxSize - 8, 10) + readonly property int checkRadius: 2 + activeFocusOnPress: true + + style: CheckBoxStyle { + indicator: Rectangle { + id: box + width: boxSize + height: boxSize + radius: boxRadius + border.width: 1 + border.color: pressed || hovered + ? hifi.colors.checkboxCheckedBorder + : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) + + gradient: Gradient { + GradientStop { + position: 0.2 + color: pressed || hovered + ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart) + : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) + } + GradientStop { + position: 1.0 + color: pressed || hovered + ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish) + : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) + } + } + + Rectangle { + visible: pressed || hovered + anchors.centerIn: parent + id: innerBox + width: checkSize - 4 + height: width + radius: checkRadius + color: hifi.colors.checkboxCheckedBorder + } + + Rectangle { + id: check + width: checkSize + height: checkSize + radius: checkRadius + anchors.centerIn: parent + color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked + border.width: 2 + border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder + visible: checked && !pressed || !checked && pressed + } + + Rectangle { + id: disabledOverlay + visible: !enabled + width: boxSize + height: boxSize + radius: boxRadius + border.width: 1 + border.color: hifi.colors.baseGrayHighlight + color: hifi.colors.baseGrayHighlight + opacity: 0.5 + } + } + + label: Label { + text: control.text + color: control.color + x: 2 + wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap + elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight + enabled: checkBox.enabled + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/ComboBox.qml b/scripts/developer/utilities/lib/controls-uit/ComboBox.qml new file mode 100644 index 0000000000..d672fa6387 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/ComboBox.qml @@ -0,0 +1,249 @@ +// +// ComboBox.qml +// +// Created by Bradley Austin David on 27 Jan 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +FocusScope { + id: root + HifiConstants { id: hifi } + + property alias model: comboBox.model; + property alias editable: comboBox.editable + property alias comboBox: comboBox + readonly property alias currentText: comboBox.currentText; + property alias currentIndex: comboBox.currentIndex; + + property int dropdownHeight: 480 + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + property string label: "" + property real controlHeight: height + (comboBoxLabel.visible ? comboBoxLabel.height + comboBoxLabel.anchors.bottomMargin : 0) + + readonly property ComboBox control: comboBox + + property bool isDesktop: true + + signal accepted(); + + implicitHeight: comboBox.height; + focus: true + + Rectangle { + id: background + gradient: Gradient { + GradientStop { + position: 0.2 + color: popup.visible + ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) + : (isLightColorScheme ? hifi.colors.dropDownLightStart : hifi.colors.dropDownDarkStart) + } + GradientStop { + position: 1.0 + color: popup.visible + ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) + : (isLightColorScheme ? hifi.colors.dropDownLightFinish : hifi.colors.dropDownDarkFinish) + } + } + anchors.fill: parent + } + + SystemPalette { id: palette } + + ComboBox { + id: comboBox + anchors.fill: parent + visible: false + height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. + } + + FiraSansSemiBold { + id: textField + anchors { + left: parent.left + leftMargin: hifi.dimensions.textPadding + right: dropIcon.left + verticalCenter: parent.verticalCenter + } + size: hifi.fontSizes.textFieldInput + text: comboBox.currentText + elide: Text.ElideRight + color: controlHover.containsMouse || popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText ) + } + + Item { + id: dropIcon + anchors { right: parent.right; verticalCenter: parent.verticalCenter } + height: background.height + width: height + Rectangle { + width: 1 + height: parent.height + anchors.top: parent.top + anchors.left: parent.left + color: isLightColorScheme ? hifi.colors.faintGray : hifi.colors.baseGray + } + HiFiGlyphs { + anchors { + top: parent.top + topMargin: -11 + horizontalCenter: parent.horizontalCenter + } + size: hifi.dimensions.spinnerSize + text: hifi.glyphs.caratDn + color: controlHover.containsMouse || popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText) + } + } + + MouseArea { + id: controlHover + hoverEnabled: true + anchors.fill: parent + onClicked: toggleList(); + } + + function toggleList() { + if (popup.visible) { + hideList(); + } else { + showList(); + } + } + + function showList() { + var r; + if (isDesktop) { + r = desktop.mapFromItem(root, 0, 0, root.width, root.height); + } else { + r = mapFromItem(root, 0, 0, root.width, root.height); + } + var y = r.y + r.height; + var bottom = y + scrollView.height; + var height = isDesktop ? desktop.height : tabletRoot.height; + if (bottom > height) { + y -= bottom - height + 8; + } + scrollView.x = r.x; + scrollView.y = y; + popup.visible = true; + popup.forceActiveFocus(); + listView.currentIndex = root.currentIndex; + scrollView.hoverEnabled = true; + } + + function hideList() { + popup.visible = false; + scrollView.hoverEnabled = false; + root.accepted(); + } + + FocusScope { + id: popup + parent: isDesktop ? desktop : root + anchors.fill: parent + z: isDesktop ? desktop.zLevels.menu : 12 + visible: false + focus: true + + MouseArea { + anchors.fill: parent + onClicked: hideList(); + } + + function previousItem() { listView.currentIndex = (listView.currentIndex + listView.count - 1) % listView.count; } + function nextItem() { listView.currentIndex = (listView.currentIndex + listView.count + 1) % listView.count; } + function selectCurrentItem() { root.currentIndex = listView.currentIndex; hideList(); } + function selectSpecificItem(index) { root.currentIndex = index; hideList(); } + + Keys.onUpPressed: previousItem(); + Keys.onDownPressed: nextItem(); + Keys.onSpacePressed: selectCurrentItem(); + Keys.onRightPressed: selectCurrentItem(); + Keys.onReturnPressed: selectCurrentItem(); + Keys.onEscapePressed: hideList(); + + ScrollView { + id: scrollView + height: root.dropdownHeight + width: root.width + 4 + property bool hoverEnabled: false; + + style: ScrollViewStyle { + decrementControl: Item { + visible: false + } + incrementControl: Item { + visible: false + } + scrollBarBackground: Rectangle{ + implicitWidth: 20 + color: hifi.colors.baseGray + } + + handle: + Rectangle { + implicitWidth: 16 + anchors.left: parent.left + anchors.leftMargin: 3 + anchors.top: parent.top + anchors.bottom: parent.bottom + radius: 6 + color: hifi.colors.lightGrayText + } + } + + ListView { + id: listView + height: textField.height * count * 1.4 + model: root.model + delegate: Rectangle { + width: root.width + 4 + height: popupText.implicitHeight * 1.4 + color: (listView.currentIndex === index) ? hifi.colors.primaryHighlight : + (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) + FiraSansSemiBold { + anchors.left: parent.left + anchors.leftMargin: hifi.dimensions.textPadding + anchors.verticalCenter: parent.verticalCenter + id: popupText + text: listView.model[index] ? listView.model[index] : (listView.model.get && listView.model.get(index).text ? listView.model.get(index).text : "") + size: hifi.fontSizes.textFieldInput + color: hifi.colors.baseGray + } + MouseArea { + id: popupHover + anchors.fill: parent; + hoverEnabled: scrollView.hoverEnabled; + onEntered: listView.currentIndex = index; + onClicked: popup.selectSpecificItem(index); + } + } + } + } + } + + HifiControls.Label { + id: comboBoxLabel + text: root.label + colorScheme: root.colorScheme + anchors.left: parent.left + anchors.bottom: parent.top + anchors.bottomMargin: 4 + visible: label != "" + } + + Component.onCompleted: { + isDesktop = (typeof desktop !== "undefined"); + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml b/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml new file mode 100644 index 0000000000..f6ecf6c176 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml @@ -0,0 +1,72 @@ +// +// ConfigSlider.qml +// examples/utilities/tools/render +// +// Created by Zach Pomerantz on 2/8/2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +Item { + id: root + width: 400 + height: 24 + property bool integral: false + property var config + property string property + property alias label: labelControl.text + property alias min: sliderControl.minimumValue + property alias max: sliderControl.maximumValue + + Component.onCompleted: { + // Binding favors qml value, so set it first + sliderControl.value = root.config[root.property]; + bindingControl.when = true; + } + + HifiControls.Label { + id: labelControl + text: root.label + anchors.left: root.left + anchors.leftMargin: 8 + anchors.top: root.top + anchors.topMargin: 7 + } + + HifiControls.Label { + id: labelValue + text: sliderControl.value.toFixed(root.integral ? 0 : 2) + anchors.left: root.left + anchors.leftMargin: 200 + anchors.top: root.top + anchors.topMargin: 15 + } + + Binding { + id: bindingControl + target: root.config + property: root.property + value: sliderControl.value + when: false + } + + HifiControls.Slider { + id: sliderControl + stepSize: root.integral ? 1.0 : 0.0 + width: root.width-130 + height: 20 + anchors.right: root.right + anchors.rightMargin: 8 + anchors.top: root.top + anchors.topMargin: 3 + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/ContentSection.qml b/scripts/developer/utilities/lib/controls-uit/ContentSection.qml new file mode 100644 index 0000000000..47a13e9262 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/ContentSection.qml @@ -0,0 +1,138 @@ +// +// ContentSection.qml +// +// Created by David Rowe on 16 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtGraphicalEffects 1.0 + +import "../styles-uit" + +Column { + property string name: "Content Section" + property bool isFirst: false + property bool isCollapsible: false // Set at creation. + property bool isCollapsed: false + + spacing: 0 // Defer spacing decisions to individual controls. + + anchors { + left: parent.left + leftMargin: hifi.dimensions.contentMargin.x + right: parent.right + rightMargin: hifi.dimensions.contentMargin.x + } + + function toggleCollapsed() { + if (isCollapsible) { + isCollapsed = !isCollapsed; + for (var i = 1; i < children.length; i++) { + children[i].visible = !isCollapsed; + } + } + } + + Item { + id: sectionName + anchors.left: parent.left + anchors.right: parent.right + height: leadingSpace.height + topBar.height + heading.height + bottomBar.height + + Item { + id: leadingSpace + width: 1 + height: isFirst ? 7 : 0 + anchors.top: parent.top + } + + Item { + id: topBar + visible: !isFirst + height: visible ? 2 : 0 + anchors.top: leadingSpace.bottom + + Rectangle { + id: shadow + width: frame.width + height: 1 + color: hifi.colors.baseGrayShadow + x: -hifi.dimensions.contentMargin.x + } + + Rectangle { + width: frame.width + height: 1 + color: hifi.colors.baseGrayHighlight + x: -hifi.dimensions.contentMargin.x + anchors.top: shadow.bottom + } + } + + Item { + id: heading + anchors { + left: parent.left + right: parent.right + top: topBar.bottom + } + height: isCollapsible ? 36 : 28 + + RalewayRegular { + id: title + anchors { + left: parent.left + top: parent.top + topMargin: 12 + } + size: hifi.fontSizes.sectionName + font.capitalization: Font.AllUppercase + text: name + color: hifi.colors.lightGrayText + } + + HiFiGlyphs { + anchors { + top: title.top + topMargin: -9 + right: parent.right + rightMargin: -4 + } + size: hifi.fontSizes.disclosureButton + text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse + color: hifi.colors.lightGrayText + visible: isCollapsible + } + + MouseArea { + // Events are propogated so that any active control is defocused. + anchors.fill: parent + propagateComposedEvents: true + onPressed: { + toggleCollapsed(); + mouse.accepted = false; + } + } + } + + LinearGradient { + id: bottomBar + visible: desktop.gradientsSupported && isCollapsible + width: frame.width + height: visible ? 4 : 0 + x: -hifi.dimensions.contentMargin.x + anchors.top: heading.bottom + start: Qt.point(0, 0) + end: Qt.point(0, 4) + gradient: Gradient { + GradientStop { position: 0.0; color: hifi.colors.darkGray } + GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background. + } + cached: true + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/GlyphButton.qml b/scripts/developer/utilities/lib/controls-uit/GlyphButton.qml new file mode 100644 index 0000000000..ac353b5a52 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/GlyphButton.qml @@ -0,0 +1,78 @@ +// +// GlyphButton.qml +// +// Created by Clement on 3/7/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" + +Original.Button { + property int color: 0 + property int colorScheme: hifi.colorSchemes.light + property string glyph: "" + property int size: 32 + + width: 120 + height: 28 + + style: ButtonStyle { + + background: Rectangle { + radius: hifi.buttons.radius + + gradient: Gradient { + GradientStop { + position: 0.2 + color: { + if (!control.enabled) { + hifi.buttons.disabledColorStart[control.colorScheme] + } else if (control.pressed) { + hifi.buttons.pressedColor[control.color] + } else if (control.hovered) { + hifi.buttons.hoveredColor[control.color] + } else { + hifi.buttons.colorStart[control.color] + } + } + } + GradientStop { + position: 1.0 + color: { + if (!control.enabled) { + hifi.buttons.disabledColorFinish[control.colorScheme] + } else if (control.pressed) { + hifi.buttons.pressedColor[control.color] + } else if (control.hovered) { + hifi.buttons.hoveredColor[control.color] + } else { + hifi.buttons.colorFinish[control.color] + } + } + } + } + } + + label: HiFiGlyphs { + color: enabled ? hifi.buttons.textColor[control.color] + : hifi.buttons.disabledTextColor[control.colorScheme] + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors { + // Tweak horizontal alignment so that it looks right. + left: parent.left + leftMargin: -0.5 + } + text: control.glyph + size: control.size + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/HorizontalRule.qml b/scripts/developer/utilities/lib/controls-uit/HorizontalRule.qml new file mode 100644 index 0000000000..425500f1d4 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/HorizontalRule.qml @@ -0,0 +1,20 @@ +// +// HorizontalRule.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: hifi.colors.lightGray +} diff --git a/scripts/developer/utilities/lib/controls-uit/HorizontalSpacer.qml b/scripts/developer/utilities/lib/controls-uit/HorizontalSpacer.qml new file mode 100644 index 0000000000..545154ab44 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/HorizontalSpacer.qml @@ -0,0 +1,21 @@ +// +// HorizontalSpacer.qml +// +// Created by Clement on 7/18/16 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 + +import "../styles-uit" + +Item { + id: root + property alias size: root.width + + width: hifi.dimensions.controlInterlineHeight + height: 1 // Must be non-zero +} diff --git a/scripts/developer/utilities/lib/controls-uit/Label.qml b/scripts/developer/utilities/lib/controls-uit/Label.qml new file mode 100644 index 0000000000..330d74fa14 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Label.qml @@ -0,0 +1,22 @@ +// +// Label.qml +// +// Created by David Rowe on 26 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 + +import "../styles-uit" + +RalewaySemiBold { + HifiConstants { id: hifi } + property int colorScheme: hifi.colorSchemes.light + + size: hifi.fontSizes.inputLabel + color: enabled ? (colorScheme == hifi.colorSchemes.light ? hifi.colors.lightGray : hifi.colors.lightGrayText) + : (colorScheme == hifi.colorSchemes.light ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight); +} diff --git a/scripts/developer/utilities/lib/controls-uit/QueuedButton.qml b/scripts/developer/utilities/lib/controls-uit/QueuedButton.qml new file mode 100644 index 0000000000..36ffbe582f --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/QueuedButton.qml @@ -0,0 +1,43 @@ +// +// QueuedButton.qml +// -- original Button.qml + signal timer workaround --ht +// Created by David Rowe on 16 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "." as HifiControls + +HifiControls.Button { + // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML + + // For some reason trigginer an API that enters + // an internal event loop directly from the button clicked + // trigger below causes the appliction to behave oddly. + // Most likely because the button onClicked handling is never + // completed until the function returns. + // FIXME find a better way of handling the input dialogs that + // doesn't trigger this. + + // NOTE: dialogs that need to use this workaround can connect via + // onQueuedClicked: ... + // instead of: + // onClicked: ... + + signal clickedQueued() + Timer { + id: fromTimer + interval: 5 + repeat: false + running: false + onTriggered: clickedQueued() + } + onClicked: fromTimer.running = true +} diff --git a/scripts/developer/utilities/lib/controls-uit/RadioButton.qml b/scripts/developer/utilities/lib/controls-uit/RadioButton.qml new file mode 100644 index 0000000000..ab11ec68b1 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/RadioButton.qml @@ -0,0 +1,71 @@ +// +// RadioButton.qml +// +// Created by Cain Kilgore on 20th July 2017 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +Original.RadioButton { + id: radioButton + HifiConstants { id: hifi } + + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + + readonly property int boxSize: 14 + readonly property int boxRadius: 3 + readonly property int checkSize: 10 + readonly property int checkRadius: 2 + + style: RadioButtonStyle { + indicator: Rectangle { + id: box + width: boxSize + height: boxSize + radius: 7 + gradient: Gradient { + GradientStop { + position: 0.2 + color: pressed || hovered + ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkStart : hifi.colors.checkboxLightStart) + : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) + } + GradientStop { + position: 1.0 + color: pressed || hovered + ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkFinish : hifi.colors.checkboxLightFinish) + : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) + } + } + + Rectangle { + id: check + width: checkSize + height: checkSize + radius: 7 + anchors.centerIn: parent + color: "#00B4EF" + border.width: 1 + border.color: "#36CDFF" + visible: checked && !pressed || !checked && pressed + } + } + + label: RalewaySemiBold { + text: control.text + size: hifi.fontSizes.inputLabel + color: isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText + x: radioButton.boxSize / 2 + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/Separator.qml b/scripts/developer/utilities/lib/controls-uit/Separator.qml new file mode 100644 index 0000000000..5a775221f6 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Separator.qml @@ -0,0 +1,38 @@ +// +// Separator.qml +// +// Created by Zach Fox on 2017-06-06 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import "../styles-uit" + +Item { + // Size + height: 2; + Rectangle { + // Size + width: parent.width; + height: 1; + // Anchors + anchors.left: parent.left; + anchors.bottom: parent.bottom; + anchors.bottomMargin: height; + // Style + color: hifi.colors.baseGrayShadow; + } + Rectangle { + // Size + width: parent.width; + height: 1; + // Anchors + anchors.left: parent.left; + anchors.bottom: parent.bottom; + // Style + color: hifi.colors.baseGrayHighlight; + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/Slider.qml b/scripts/developer/utilities/lib/controls-uit/Slider.qml new file mode 100644 index 0000000000..89bae9bcde --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Slider.qml @@ -0,0 +1,98 @@ +// +// Slider.qml +// +// Created by David Rowe on 27 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +Slider { + id: slider + + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + property string label: "" + property real controlHeight: height + (sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0) + + height: hifi.fontSizes.textFieldInput + 14 // Match height of TextField control. + y: sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0 + + style: SliderStyle { + + groove: Rectangle { + implicitWidth: 50 + implicitHeight: hifi.dimensions.sliderGrooveHeight + radius: height / 2 + color: isLightColorScheme ? hifi.colors.sliderGutterLight : hifi.colors.sliderGutterDark + + Rectangle { + width: parent.height - 2 + height: slider.width * (slider.value - slider.minimumValue) / (slider.maximumValue - slider.minimumValue) - 1 + radius: height / 2 + anchors { + top: parent.top + topMargin: width + 1 + left: parent.left + leftMargin: 1 + } + transformOrigin: Item.TopLeft + rotation: -90 + gradient: Gradient { + GradientStop { position: 0.0; color: hifi.colors.blueAccent } + GradientStop { position: 1.0; color: hifi.colors.primaryHighlight } + } + } + } + + handle: Rectangle { + implicitWidth: hifi.dimensions.sliderHandleSize + implicitHeight: hifi.dimensions.sliderHandleSize + radius: height / 2 + border.width: 1 + border.color: isLightColorScheme ? hifi.colors.sliderBorderLight : hifi.colors.sliderBorderDark + gradient: Gradient { + GradientStop { + position: 0.0 + color: pressed || hovered + ? (isLightColorScheme ? hifi.colors.sliderDarkStart : hifi.colors.sliderLightStart ) + : (isLightColorScheme ? hifi.colors.sliderLightStart : hifi.colors.sliderDarkStart ) + } + GradientStop { + position: 1.0 + color: pressed || hovered + ? (isLightColorScheme ? hifi.colors.sliderDarkFinish : hifi.colors.sliderLightFinish ) + : (isLightColorScheme ? hifi.colors.sliderLightFinish : hifi.colors.sliderDarkFinish ) + } + } + + Rectangle { + height: parent.height - 2 + width: height + radius: height / 2 + anchors.centerIn: parent + color: hifi.colors.transparent + border.width: 1 + border.color: hifi.colors.black + } + } + } + + HifiControls.Label { + id: sliderLabel + text: slider.label + colorScheme: slider.colorScheme + anchors.left: parent.left + anchors.bottom: parent.top + anchors.bottomMargin: 2 + visible: label != "" + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/SpinBox.qml b/scripts/developer/utilities/lib/controls-uit/SpinBox.qml new file mode 100644 index 0000000000..a1237d4bc7 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/SpinBox.qml @@ -0,0 +1,117 @@ +// +// SpinBox.qml +// +// Created by David Rowe on 26 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +SpinBox { + id: spinBox + + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + property string label: "" + property string labelInside: "" + property color colorLabelInside: hifi.colors.white + property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0) + + FontLoader { id: firaSansSemiBold; source: "../../fonts/FiraSans-SemiBold.ttf"; } + font.family: firaSansSemiBold.name + font.pixelSize: hifi.fontSizes.textFieldInput + height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. + + y: spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0 + + style: SpinBoxStyle { + id: spinStyle + background: Rectangle { + color: isLightColorScheme + ? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray) + : (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow) + border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight + border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0 + } + + textColor: isLightColorScheme + ? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray) + : (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText) + selectedTextColor: hifi.colors.black + selectionColor: hifi.colors.primaryHighlight + + horizontalAlignment: Qt.AlignLeft + padding.left: spinBoxLabelInside.visible ? 30 : hifi.dimensions.textPadding + padding.right: hifi.dimensions.spinnerSize + padding.top: 0 + + incrementControl: HiFiGlyphs { + id: incrementButton + text: hifi.glyphs.caratUp + x: 10 + y: 1 + size: hifi.dimensions.spinnerSize + color: styleData.upPressed ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray + } + + decrementControl: HiFiGlyphs { + text: hifi.glyphs.caratDn + x: 10 + y: -1 + size: hifi.dimensions.spinnerSize + color: styleData.downPressed ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray + } + } + + HifiControls.Label { + id: spinBoxLabel + text: spinBox.label + colorScheme: spinBox.colorScheme + anchors.left: parent.left + anchors.bottom: parent.top + anchors.bottomMargin: 4 + visible: label != "" + } + + HifiControls.Label { + id: spinBoxLabelInside + text: spinBox.labelInside + anchors.left: parent.left + anchors.leftMargin: 10 + font.bold: true + anchors.verticalCenter: parent.verticalCenter + color: spinBox.colorLabelInside + visible: spinBox.labelInside != "" + } + + MouseArea { + anchors.fill: parent + propagateComposedEvents: true + onWheel: { + if(spinBox.activeFocus) + wheel.accepted = false + else + wheel.accepted = true + } + onPressed: { + mouse.accepted = false + } + onReleased: { + mouse.accepted = false + } + onClicked: { + mouse.accepted = false + } + onDoubleClicked: { + mouse.accepted = false + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/Switch.qml b/scripts/developer/utilities/lib/controls-uit/Switch.qml new file mode 100644 index 0000000000..d54f986717 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Switch.qml @@ -0,0 +1,156 @@ +// +// Switch.qml +// +// Created by Zach Fox on 2017-06-06 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" + +Item { + id: rootSwitch; + + property int colorScheme: hifi.colorSchemes.light; + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light; + property int switchWidth: 70; + readonly property int switchRadius: height/2; + property string labelTextOff: ""; + property string labelGlyphOffText: ""; + property int labelGlyphOffSize: 32; + property string labelTextOn: ""; + property string labelGlyphOnText: ""; + property int labelGlyphOnSize: 32; + property alias checked: originalSwitch.checked; + signal onCheckedChanged; + signal clicked; + + Original.Switch { + id: originalSwitch; + activeFocusOnPress: true; + anchors.top: rootSwitch.top; + anchors.left: rootSwitch.left; + anchors.leftMargin: rootSwitch.width/2 - rootSwitch.switchWidth/2; + onCheckedChanged: rootSwitch.onCheckedChanged(); + onClicked: rootSwitch.clicked(); + + style: SwitchStyle { + + padding { + top: 3; + left: 3; + right: 3; + bottom: 3; + } + + groove: Rectangle { + color: "#252525"; + implicitWidth: rootSwitch.switchWidth; + implicitHeight: rootSwitch.height; + radius: rootSwitch.switchRadius; + } + + handle: Rectangle { + id: switchHandle; + implicitWidth: rootSwitch.height - padding.top - padding.bottom; + implicitHeight: implicitWidth; + radius: implicitWidth/2; + border.color: hifi.colors.lightGrayText; + color: hifi.colors.lightGray; + + MouseArea { + anchors.fill: parent; + hoverEnabled: true; + onEntered: parent.color = hifi.colors.blueHighlight; + onExited: parent.color = hifi.colors.lightGray; + } + } + } + } + + // OFF Label + Item { + anchors.right: originalSwitch.left; + anchors.rightMargin: 10; + anchors.top: rootSwitch.top; + height: rootSwitch.height; + + RalewaySemiBold { + id: labelOff; + text: labelTextOff; + size: hifi.fontSizes.inputLabel; + color: originalSwitch.checked ? hifi.colors.lightGrayText : "#FFFFFF"; + anchors.top: parent.top; + anchors.right: parent.right; + width: paintedWidth; + height: parent.height; + verticalAlignment: Text.AlignVCenter; + } + + HiFiGlyphs { + id: labelGlyphOff; + text: labelGlyphOffText; + size: labelGlyphOffSize; + color: labelOff.color; + anchors.top: parent.top; + anchors.topMargin: 2; + anchors.right: labelOff.left; + anchors.rightMargin: 4; + } + + MouseArea { + anchors.top: parent.top; + anchors.bottom: parent.bottom; + anchors.left: labelGlyphOff.left; + anchors.right: labelOff.right; + onClicked: { + originalSwitch.checked = false; + } + } + } + + // ON Label + Item { + anchors.left: originalSwitch.right; + anchors.leftMargin: 10; + anchors.top: rootSwitch.top; + height: rootSwitch.height; + + RalewaySemiBold { + id: labelOn; + text: labelTextOn; + size: hifi.fontSizes.inputLabel; + color: originalSwitch.checked ? "#FFFFFF" : hifi.colors.lightGrayText; + anchors.top: parent.top; + anchors.left: parent.left; + width: paintedWidth; + height: parent.height; + verticalAlignment: Text.AlignVCenter; + } + + HiFiGlyphs { + id: labelGlyphOn; + text: labelGlyphOnText; + size: labelGlyphOnSize; + color: labelOn.color; + anchors.top: parent.top; + anchors.left: labelOn.right; + } + + MouseArea { + anchors.top: parent.top; + anchors.bottom: parent.bottom; + anchors.left: labelOn.left; + anchors.right: labelGlyphOn.right; + onClicked: { + originalSwitch.checked = true; + } + } + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/Table.qml b/scripts/developer/utilities/lib/controls-uit/Table.qml new file mode 100644 index 0000000000..11d1920f95 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/Table.qml @@ -0,0 +1,179 @@ +// +// Table.qml +// +// Created by David Rowe on 18 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" + +TableView { + id: tableView + + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + property bool expandSelectedRow: false + property bool centerHeaderText: false + + model: ListModel { } + + headerVisible: false + headerDelegate: Rectangle { + height: hifi.dimensions.tableHeaderHeight + color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark + + RalewayRegular { + id: titleText + text: styleData.value + size: hifi.fontSizes.tableHeading + font.capitalization: Font.AllUppercase + color: hifi.colors.baseGrayHighlight + horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft) + anchors { + left: parent.left + leftMargin: hifi.dimensions.tablePadding + right: parent.right + rightMargin: hifi.dimensions.tablePadding + verticalCenter: parent.verticalCenter + } + } + + HiFiGlyphs { + id: titleSort + text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn + color: hifi.colors.darkGray + opacity: 0.6; + size: hifi.fontSizes.tableHeadingIcon + anchors { + left: titleText.right + leftMargin: -hifi.fontSizes.tableHeadingIcon / 3 - (centerHeaderText ? 5 : 0) + right: parent.right + rightMargin: hifi.dimensions.tablePadding + verticalCenter: titleText.verticalCenter + } + visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column + } + + Rectangle { + width: 1 + anchors { + left: parent.left + top: parent.top + topMargin: 1 + bottom: parent.bottom + bottomMargin: 2 + } + color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight + visible: styleData.column > 0 + } + + Rectangle { + height: 1 + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight + } + } + + // Use rectangle to draw border with rounded corners. + frameVisible: false + Rectangle { + color: "#00000000" + anchors { fill: parent; margins: -2 } + border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight + border.width: 2 + } + anchors.margins: 2 // Shrink TableView to lie within border. + + backgroundVisible: true + + horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff + verticalScrollBarPolicy: Qt.ScrollBarAsNeeded + + style: TableViewStyle { + // Needed in order for rows to keep displaying rows after end of table entries. + backgroundColor: tableView.isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark + alternateBackgroundColor: tableView.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd + + padding.top: headerVisible ? hifi.dimensions.tableHeaderHeight: 0 + + handle: Item { + id: scrollbarHandle + implicitWidth: hifi.dimensions.scrollbarHandleWidth + Rectangle { + anchors { + fill: parent + topMargin: 3 + bottomMargin: 3 // "" + leftMargin: 1 // Move it right + rightMargin: -1 // "" + } + radius: hifi.dimensions.scrollbarHandleWidth/2 + color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark + } + } + + scrollBarBackground: Item { + implicitWidth: hifi.dimensions.scrollbarBackgroundWidth + Rectangle { + anchors { + fill: parent + margins: -1 // Expand + topMargin: -1 + } + color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight : hifi.colors.tableScrollBackgroundDark + + // Extend header color above scrollbar background + Rectangle { + anchors { + top: parent.top + topMargin: -hifi.dimensions.tableHeaderHeight + left: parent.left + right: parent.right + } + height: hifi.dimensions.tableHeaderHeight + color: tableView.isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark + visible: headerVisible + } + Rectangle { + // Extend header bottom border + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: 1 + color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight + visible: headerVisible + } + } + } + + incrementControl: Item { + visible: false + } + + decrementControl: Item { + visible: false + } + } + + rowDelegate: Rectangle { + height: (styleData.selected && expandSelectedRow ? 1.8 : 1) * hifi.dimensions.tableRowHeight + color: styleData.selected + ? hifi.colors.primaryHighlight + : tableView.isLightColorScheme + ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) + : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) + } +} diff --git a/scripts/developer/utilities/lib/controls-uit/VerticalSpacer.qml b/scripts/developer/utilities/lib/controls-uit/VerticalSpacer.qml new file mode 100644 index 0000000000..2df65f1002 --- /dev/null +++ b/scripts/developer/utilities/lib/controls-uit/VerticalSpacer.qml @@ -0,0 +1,21 @@ +// +// VerticalSpacer.qml +// +// Created by David Rowe on 16 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 + +import "../styles-uit" + +Item { + id: root + property alias size: root.height + + width: 1 // Must be non-zero + height: hifi.dimensions.controlInterlineHeight +} From 78fee715242329a6354c56a07fa8e3eb97cd5a8f Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 5 Sep 2017 10:04:49 -0700 Subject: [PATCH 36/45] seprating the constraint function --- libraries/render-utils/src/taa.slh | 79 +++++++++++++----- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index cb2df97790..dfd6471243 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -203,18 +203,41 @@ float Luminance(vec3 rgb) { return rgb.x/4.0 + rgb.y/2.0 + rgb.z/4.0; } -vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) -{ - vec4 texel1 = vec4(historyColor, 1.0); - vec4 texel0 = vec4(sourceColor, 1.0); - +mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); - /* if (taa_unjitter()) { - fragUV += fragJitterPix * texelSize; - }*/ + #if MINMAX_3X3 || MINMAX_3X3_ROUNDED + vec2 du = vec2(texelSize.x, 0.0); + vec2 dv = vec2(0.0, texelSize.y); + + vec3 ctl = taa_fetchSourceMap(fragUV - dv - du).rgb; + vec3 ctc = taa_fetchSourceMap(fragUV - dv).rgb; + vec3 ctr = taa_fetchSourceMap(fragUV - dv + du).rgb; + vec3 cml = taa_fetchSourceMap(fragUV - du).rgb; + vec3 cmc = taa_fetchSourceMap(fragUV).rgb; // could resuse the same osurce sample isn't it ? + vec3 cmr = taa_fetchSourceMap(fragUV + du).rgb; + vec3 cbl = taa_fetchSourceMap(fragUV + dv - du).rgb; + vec3 cbc = taa_fetchSourceMap(fragUV + dv).rgb; + vec3 cbr = taa_fetchSourceMap(fragUV + dv + du).rgb; + + vec3 cmin = min(ctl, min(ctc, min(ctr, min(cml, min(cmc, min(cmr, min(cbl, min(cbc, cbr)))))))); + vec3 cmax = max(ctl, max(ctc, max(ctr, max(cml, max(cmc, max(cmr, max(cbl, max(cbc, cbr)))))))); + + #if MINMAX_3X3_ROUNDED || USE_YCOCG || USE_CLIPPING + vec3 cavg = (ctl + ctc + ctr + cml + cmc + cmr + cbl + cbc + cbr) / 9.0; + #endif + + #if MINMAX_3X3_ROUNDED + vec3 cmin5 = min(ctc, min(cml, min(cmc, min(cmr, cbc)))); + vec3 cmax5 = max(ctc, max(cml, max(cmc, max(cmr, cbc)))); + vec3 cavg5 = (ctc + cml + cmc + cmr + cbc) / 5.0; + cmin = 0.5 * (cmin + cmin5); + cmax = 0.5 * (cmax + cmax5); + cavg = 0.5 * (cavg + cavg5); + #endif + #else const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; const float _GatherSubpixelMotion = 0.1666; @@ -228,33 +251,51 @@ vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, vec2 ss_offset01 = k_min_max_support * vec2(-texelSize.x, texelSize.y); vec2 ss_offset11 = k_min_max_support * vec2(texelSize.x, texelSize.y); - vec4 c00 = taa_fetchSourceMap(fragUV - ss_offset11); - vec4 c10 = taa_fetchSourceMap(fragUV - ss_offset01); - vec4 c01 = taa_fetchSourceMap(fragUV + ss_offset01); - vec4 c11 = taa_fetchSourceMap(fragUV + ss_offset11); + vec3 c00 = taa_fetchSourceMap(fragUV - ss_offset11).rgb; + vec3 c10 = taa_fetchSourceMap(fragUV - ss_offset01).rgb; + vec3 c01 = taa_fetchSourceMap(fragUV + ss_offset01).rgb; + vec3 c11 = taa_fetchSourceMap(fragUV + ss_offset11).rgb; - vec4 cmin = min(c00, min(c10, min(c01, c11))); - vec4 cmax = max(c00, max(c10, max(c01, c11))); + vec3 cmin = min(c00, min(c10, min(c01, c11))); + vec3 cmax = max(c00, max(c10, max(c01, c11))); #if USE_YCOCG || USE_CLIPPING - vec4 cavg = (c00 + c10 + c01 + c11) / 4.0; + vec3 cavg = (c00 + c10 + c01 + c11) / 4.0; #endif - + #endif // shrink chroma min-max #if USE_YCOCG vec2 chroma_extent = vec2(0.25 * 0.5 * (cmax.r - cmin.r)); vec2 chroma_center = texel0.gb; - cmin.yz = chroma_center - chroma_extent; + colorMinMaxAvg[0].yz = chroma_center - chroma_extent; cmax.yz = chroma_center + chroma_extent; cavg.yz = chroma_center; #endif + return mat3(cmin, cmax, cavg); +} + + +vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) +{ + vec3 texel0 = (sourceColor); + vec3 texel1 = (historyColor); + + vec2 imageSize = getWidthHeight(0); + vec2 texelSize = getInvWidthHeight(); + + if (taa_unjitter()) { + fragUV -= fragJitterPix * texelSize; + } + + mat3 colorMinMaxAvg = taa_evalNeighbourColorRegion(fragUV, fragVelocity, fragZe, fragJitterPix); + // clamp to neighbourhood of current sample #if USE_CLIPPING - texel1 = clip_aabb(cmin.xyz, cmax.xyz, clamp(cavg, cmin, cmax), texel1); + texel1 = clip_aabb(colorMinMaxAvg[0], colorMinMaxAvg[1], clamp(colorMinMaxAvg[2], colorMinMaxAvg[0], colorMinMaxAvg[1]), texel1); #else - texel1 = clamp(texel1, cmin, cmax); + texel1 = clamp(texel1, colorMinMaxAvg[0], colorMinMaxAvg[1]); #endif // feedback weight from unbiased luminance diff (t.lottes) diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..369d4444878f60a092189d56d24fd586c7a0c747 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH Date: Tue, 5 Sep 2017 18:09:46 -0700 Subject: [PATCH 37/45] Adding the full code path, starting debugging the problems in hmd, --- .../display-plugins/OpenGLDisplayPlugin.cpp | 2 +- libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 7 +- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 9 +- .../render-utils/src/AntialiasingEffect.cpp | 48 ++++--- .../render-utils/src/AntialiasingEffect.h | 18 ++- .../render-utils/src/DeferredTransform.slh | 3 + .../render-utils/src/VelocityBufferPass.cpp | 2 +- libraries/render-utils/src/taa.slf | 12 +- libraries/render-utils/src/taa.slh | 133 ++++++++++++------ .../src/velocityBuffer_cameraMotion.slf | 4 +- .../lib/controls-uit/ConfigSlider.qml | 4 +- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 85 ++++++++--- 13 files changed, 232 insertions(+), 95 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 98f4e04492..dc49a04880 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -356,7 +356,7 @@ void OpenGLDisplayPlugin::customizeContext() { auto presentThread = DependencyManager::get(); Q_ASSERT(thread() == presentThread->thread()); - getGLBackend()->setCameraCorrection(mat4()); + getGLBackend()->setCameraCorrection(mat4(), true); for (auto& cursorValue : _cursorsData) { auto& cursorData = cursorValue.second; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index f138244fa2..62adcd4eeb 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -779,9 +779,12 @@ void GLBackend::recycle() const { } -void GLBackend::setCameraCorrection(const Mat4& correction) { +void GLBackend::setCameraCorrection(const Mat4& correction, bool reset) { + auto invCorrection = glm::inverse(correction); + _transform._correction.prevCorrection = (reset ? correction : _transform._correction.correction); + _transform._correction.prevCorrectionInverse = (reset ? invCorrection : _transform._correction.correctionInverse); _transform._correction.correction = correction; - _transform._correction.correctionInverse = glm::inverse(correction); + _transform._correction.correctionInverse = invCorrection; _pipeline._cameraCorrectionBuffer._buffer->setSubData(0, _transform._correction); _pipeline._cameraCorrectionBuffer._buffer->flush(); } diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index 1908db614d..2c383e97f1 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -68,7 +68,7 @@ public: virtual ~GLBackend(); - void setCameraCorrection(const Mat4& correction); + void setCameraCorrection(const Mat4& correction, bool reset = false); void render(const Batch& batch) final override; // This call synchronize the Full Backend cache with the current GLState @@ -302,9 +302,12 @@ protected: // Allows for correction of the camera pose to account for changes // between the time when a was recorded and the time(s) when it is // executed + // Prev is the previous correction used at previous frame struct CameraCorrection { - Mat4 correction; - Mat4 correctionInverse; + mat4 correction; + mat4 correctionInverse; + mat4 prevCorrection; + mat4 prevCorrectionInverse; }; struct TransformStageState { diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 8a19e9c5cb..86a1ea877d 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -288,6 +288,9 @@ void Antialiasing::configure(const Config& config) { _params.edit().setUnjitter(config.unjitter); _params.edit().setConstrainColor(config.constrainColor); + _params.edit().setConstrainColor9Taps(config.constrainColor9Taps); + _params.edit().setClipHistoryColor(config.clipHistoryColor); + _params.edit().setFeedbackColor(config.feedbackColor); _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; @@ -393,34 +396,22 @@ int JitterSampleConfig::cycleStopPauseRun() { _state = (_state + 1) % 3; switch (_state) { case 0: { - stop = true; - freeze = false; - setIndex(-1); + return none(); break; } case 1: { - stop = false; - freeze = true; - setIndex(0); + return pause(); break; } case 2: default: { - stop = false; - freeze = false; - setIndex(0); + return play(); break; } } return _state; } -int JitterSampleConfig::pause() { - freeze = true; - emit dirty(); - return _index; -} - int JitterSampleConfig::prev() { setIndex(_index - 1); return _index; @@ -431,12 +422,33 @@ int JitterSampleConfig::next() { return _index; } -int JitterSampleConfig::play() { +int JitterSampleConfig::none() { + _state = 0; + stop = true; freeze = false; - emit dirty(); - return _index; + setIndex(-1); + return _state; } +int JitterSampleConfig::pause() { + _state = 1; + stop = false; + freeze = true; + setIndex(0); + return _state; +} + + +int JitterSampleConfig::play() { + _state = 2; + stop = false; + freeze = false; + setIndex(0); + return _state; +} + + + template class Halton { public: float eval(int index) { diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 9e10673369..3be6f7e87a 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -36,9 +36,10 @@ public: public slots: int cycleStopPauseRun(); - int pause(); int prev(); int next(); + int none(); + int pause(); int play(); int getIndex() const { return _index; } @@ -89,6 +90,9 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(bool unjitter MEMBER unjitter NOTIFY dirty) Q_PROPERTY(bool constrainColor MEMBER constrainColor NOTIFY dirty) + Q_PROPERTY(bool constrainColor9Taps MEMBER constrainColor9Taps NOTIFY dirty) + Q_PROPERTY(bool clipHistoryColor MEMBER clipHistoryColor NOTIFY dirty) + Q_PROPERTY(bool feedbackColor MEMBER feedbackColor NOTIFY dirty) Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) Q_PROPERTY(float debugX MEMBER debugX NOTIFY dirty) @@ -115,6 +119,9 @@ public: bool unjitter{ true }; bool constrainColor{ true }; + bool constrainColor9Taps{ true }; + bool clipHistoryColor{ true }; + bool feedbackColor{ true }; bool debug { false }; bool showCursorPixel { false }; @@ -144,6 +151,15 @@ struct TAAParams { void setConstrainColor(bool enabled) { SET_BIT(flags.y, 1, enabled); } bool isConstrainColor() const { return (bool)GET_BIT(flags.y, 1); } + void setConstrainColor9Taps(bool enabled) { SET_BIT(flags.y, 2, enabled); } + bool isConstrainColor9Taps() const { return (bool)GET_BIT(flags.y, 2); } + + void setClipHistoryColor(bool enabled) { SET_BIT(flags.y, 3, enabled); } + bool isClipHistoryColor() const { return (bool)GET_BIT(flags.y, 3); } + + void setFeedbackColor(bool enabled) { SET_BIT(flags.y, 4, enabled); } + bool isFeedbackColor() const { return (bool)GET_BIT(flags.y, 4); } + void setDebug(bool enabled) { SET_BIT(flags.x, 0, enabled); } bool isDebug() const { return (bool) GET_BIT(flags.x, 0); } diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index 86fbea9d45..25d352387f 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -16,6 +16,9 @@ struct CameraCorrection { mat4 _correction; mat4 _correctionInverse; + + mat4 _prevCorrection; + mat4 _prevCorrectionInverse; }; uniform cameraCorrectionBuffer { diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp index b06ecca5dd..1df67b9952 100644 --- a/libraries/render-utils/src/VelocityBufferPass.cpp +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -159,7 +159,7 @@ const gpu::PipelinePointer& VelocityBufferPass::getCameraMotionPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); // Stencil test the curvature pass for objects pixels only, not the background - PrepareStencil::testShape(*state); + // PrepareStencil::testShape(*state); state->setColorWriteMask(true, true, false, false); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index be2a40ba3f..fb68ecbf6a 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -45,9 +45,17 @@ void main() { vec3 nextColor = mix(historyColor, sourceColor, params.blend); - if (taa_constrainColor()) { - nextColor = taa_temporalReprojection(sourceColor, historyColor, fragUV, fragVel, nearFragUV.z, fragJitterPix); + if (taa_constrainColor()) { + mat3 colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, fragUV, fragVel, nearFragUV.z, fragJitterPix); + + // clamp history to neighbourhood of current sample + historyColor = taa_clampColor(colorMinMaxAvg[0], colorMinMaxAvg[1], colorMinMaxAvg[2], historyColor); + nextColor = historyColor; } + if (taa_feedbackColor()) { + nextColor = taa_evalFeedbackColor(sourceColor, historyColor, params.blend); + } + outFragColor = vec4(taa_resolveColor(nextColor), 1.0); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index dfd6471243..c6528aaa61 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -82,6 +82,15 @@ bool taa_unjitter() { bool taa_constrainColor() { return GET_BIT(params.flags.y, 1); } +bool taa_constrainColor9Taps() { + return GET_BIT(params.flags.y, 2); +} +bool taa_clipHistoryColor() { + return GET_BIT(params.flags.y, 3); +} +bool taa_feedbackColor() { + return GET_BIT(params.flags.y, 4); +} vec2 taa_getDebugCursorTexcoord() { return params.pixelInfo_orbZoom.xy; @@ -203,11 +212,14 @@ float Luminance(vec3 rgb) { return rgb.x/4.0 + rgb.y/2.0 + rgb.z/4.0; } -mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { +#define MINMAX_3X3_ROUNDED 1 + +mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); + vec3 cmin, cmax, cavg; - #if MINMAX_3X3 || MINMAX_3X3_ROUNDED + if (taa_constrainColor9Taps()) { vec2 du = vec2(texelSize.x, 0.0); vec2 dv = vec2(0.0, texelSize.y); @@ -222,11 +234,13 @@ mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, vec3 cbc = taa_fetchSourceMap(fragUV + dv).rgb; vec3 cbr = taa_fetchSourceMap(fragUV + dv + du).rgb; - vec3 cmin = min(ctl, min(ctc, min(ctr, min(cml, min(cmc, min(cmr, min(cbl, min(cbc, cbr)))))))); - vec3 cmax = max(ctl, max(ctc, max(ctr, max(cml, max(cmc, max(cmr, max(cbl, max(cbc, cbr)))))))); + cmin = min(ctl, min(ctc, min(ctr, min(cml, min(cmc, min(cmr, min(cbl, min(cbc, cbr)))))))); + cmax = max(ctl, max(ctc, max(ctr, max(cml, max(cmc, max(cmr, max(cbl, max(cbc, cbr)))))))); #if MINMAX_3X3_ROUNDED || USE_YCOCG || USE_CLIPPING - vec3 cavg = (ctl + ctc + ctr + cml + cmc + cmr + cbl + cbc + cbr) / 9.0; + cavg = (ctl + ctc + ctr + cml + cmc + cmr + cbl + cbc + cbr) / 9.0; + #elif + cavg = (cmin + cmax ) * 0.5; #endif #if MINMAX_3X3_ROUNDED @@ -237,12 +251,10 @@ mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, cmax = 0.5 * (cmax + cmax5); cavg = 0.5 * (cavg + cavg5); #endif - #else + } else { const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; const float _GatherSubpixelMotion = 0.1666; - const float _FeedbackMin = 0.1; - const float _FeedbackMax = 0.9; vec2 texel_vel = fragVelocity * imageSize; float texel_vel_mag = length(texel_vel) * -fragZe; @@ -256,19 +268,22 @@ mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, vec3 c01 = taa_fetchSourceMap(fragUV + ss_offset01).rgb; vec3 c11 = taa_fetchSourceMap(fragUV + ss_offset11).rgb; - vec3 cmin = min(c00, min(c10, min(c01, c11))); - vec3 cmax = max(c00, max(c10, max(c01, c11))); + cmin = min(c00, min(c10, min(c01, c11))); + cmax = max(c00, max(c10, max(c01, c11))); + cavg = (cmin + cmax ) * 0.5; #if USE_YCOCG || USE_CLIPPING - vec3 cavg = (c00 + c10 + c01 + c11) / 4.0; + cavg = (c00 + c10 + c01 + c11) / 4.0; + #elif + cavg = (cmin + cmax ) * 0.5; #endif - #endif + } - // shrink chroma min-max + // shrink chroma min-max #if USE_YCOCG vec2 chroma_extent = vec2(0.25 * 0.5 * (cmax.r - cmin.r)); - vec2 chroma_center = texel0.gb; - colorMinMaxAvg[0].yz = chroma_center - chroma_extent; + vec2 chroma_center = sourceColor.gb; + cmin.yz = chroma_center - chroma_extent; cmax.yz = chroma_center + chroma_extent; cavg.yz = chroma_center; #endif @@ -276,47 +291,77 @@ mat3 taa_evalNeighbourColorRegion(vec2 fragUV, vec2 fragVelocity, float fragZe, return mat3(cmin, cmax, cavg); } +#define USE_OPTIMIZATIONS 1 -vec3 taa_temporalReprojection(vec3 sourceColor, vec3 historyColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) -{ - vec3 texel0 = (sourceColor); - vec3 texel1 = (historyColor); +vec3 taa_clampColor(vec3 colorMin, vec3 colorMax, vec3 colorAvg, vec3 color) { + if (taa_clipHistoryColor()) { + vec3 p = clamp(colorAvg, colorMin, colorMax); + vec3 q = color; + const float eps = 0.00001; - vec2 imageSize = getWidthHeight(0); - vec2 texelSize = getInvWidthHeight(); + #if USE_OPTIMIZATIONS + // note: only clips towards aabb center (but fast!) + vec3 p_clip = 0.5 * (colorMax + colorMin); + vec3 e_clip = 0.5 * (colorMax - colorMin) + vec3(eps); - if (taa_unjitter()) { - fragUV -= fragJitterPix * texelSize; - } + vec3 v_clip = q - p_clip; + vec3 v_unit = v_clip.xyz / e_clip; + vec3 a_unit = abs(v_unit); + float ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z)); - mat3 colorMinMaxAvg = taa_evalNeighbourColorRegion(fragUV, fragVelocity, fragZe, fragJitterPix); - - // clamp to neighbourhood of current sample - #if USE_CLIPPING - texel1 = clip_aabb(colorMinMaxAvg[0], colorMinMaxAvg[1], clamp(colorMinMaxAvg[2], colorMinMaxAvg[0], colorMinMaxAvg[1]), texel1); - #else - texel1 = clamp(texel1, colorMinMaxAvg[0], colorMinMaxAvg[1]); - #endif + if (ma_unit > 1.0) + return p_clip + v_clip / ma_unit; + else + return q;// point inside aabb + #else + vec3 r = q - p; + vec3 rmax = colorMax - p.xyz; + vec3 rmin = colorMin - p.xyz; - // feedback weight from unbiased luminance diff (t.lottes) + + if (r.x > rmax.x + eps) + r *= (rmax.x / r.x); + if (r.y > rmax.y + eps) + r *= (rmax.y / r.y); + if (r.z > rmax.z + eps) + r *= (rmax.z / r.z); + + if (r.x < rmin.x - eps) + r *= (rmin.x / r.x); + if (r.y < rmin.y - eps) + r *= (rmin.y / r.y); + if (r.z < rmin.z - eps) + r *= (rmin.z / r.z); + + return p + r; + #endif + } else { + return clamp(color, colorMin, colorMax); + } +} + +vec3 taa_evalFeedbackColor(vec3 sourceColor, vec3 historyColor, float blendFactor) { + const float _FeedbackMin = 0.1; + const float _FeedbackMax = 0.9; + // feedback weight from unbiased luminance diff (t.lottes) #if USE_YCOCG - float lum0 = texel0.r; - float lum1 = texel1.r; + float lum0 = sourceColor.r; + float lum1 = historyColor.r; #else - float lum0 = Luminance(texel0.rgb); - float lum1 = Luminance(texel1.rgb); + float lum0 = Luminance(sourceColor.rgb); + float lum1 = Luminance(historyColor.rgb); #endif - float unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2)); - float unbiased_weight = 1.0 - unbiased_diff; - float unbiased_weight_sqr = unbiased_weight * unbiased_weight; - float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); - - // output - vec3 nextColor = mix(texel1, texel0, k_feedback).xyz; + float unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2)); + float unbiased_weight = 1.0 - unbiased_diff; + float unbiased_weight_sqr = unbiased_weight * unbiased_weight; + float k_feedback = mix(_FeedbackMin, _FeedbackMax, unbiased_weight_sqr); + + vec3 nextColor = mix(historyColor, sourceColor, k_feedback * blendFactor).xyz; return nextColor; } + <$declareColorWheel()$> vec3 taa_getVelocityColorRelative(float velocityPixLength) { diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index 50ab39191f..7488f42535 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -34,9 +34,9 @@ void main(void) { // The position of the pixel fragment in Eye space then in world space vec3 eyePos = evalEyePositionFromZeye(stereoSide.x, Zeye, texcoordPos); - vec3 worldPos = (frameTransform._viewInverse * vec4(eyePos, 1.0)).xyz; + vec3 worldPos = (frameTransform._viewInverse * cameraCorrection._correction * vec4(eyePos, 1.0)).xyz; - vec3 prevEyePos = (frameTransform._prevView * vec4(worldPos, 1.0)).xyz; + vec3 prevEyePos = (cameraCorrection._prevCorrectionInverse * frameTransform._prevView * vec4(worldPos, 1.0)).xyz; vec4 prevClipPos = (frameTransform._projection[stereoSide.x] * vec4(prevEyePos, 1.0)); vec2 prevUV = 0.5 * (prevClipPos.xy / prevClipPos.w) + vec2(0.5); diff --git a/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml b/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml index f6ecf6c176..9c38b66ed8 100644 --- a/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml +++ b/scripts/developer/utilities/lib/controls-uit/ConfigSlider.qml @@ -45,8 +45,8 @@ Item { HifiControls.Label { id: labelValue text: sliderControl.value.toFixed(root.integral ? 0 : 2) - anchors.left: root.left - anchors.leftMargin: 200 + anchors.right: root.right + anchors.rightMargin: 8 anchors.top: root.top anchors.topMargin: 15 } diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index 369d4444878f60a092189d56d24fd586c7a0c747..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e 100644 GIT binary patch delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtHR)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index e6c0b0db79..3f80cd3ddd 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -30,25 +30,32 @@ Rectangle { spacing: 20 Column{ - spacing: 10 - - HifiControls.ConfigSlider { - label: qsTr("Source blend") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "blend" - max: 1.0 - min: 0.0 + + + Row { + spacing: 10 + + var debugFXAA = false + HifiControls.Button { + text: { + if (debugFXAA) { + return "FXAA" + } else { + return "TAA" + } + } + onClicked: { + if (debugFXAA) { + Render.getConfig("RenderMainView.JitterCam").stop(); + Render.getConfig("RenderMainView.Antialiasing").debugFXAAX = 0; + } else { + Render.getConfig("RenderMainView.JitterCam").run(); + Render.getConfig("RenderMainView.Antialiasing").debugFXAAX = 1.0; + } + debugFXAA = !debugFXAA + } + } } - ConfigSlider { - label: qsTr("Velocity scale") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "velocityScale" - max: 1.0 - min: 0.0 - } - Separator {} Row { spacing: 10 @@ -90,7 +97,7 @@ Rectangle { } } Separator {} - Row { + Column { spacing: 10 HifiControls.CheckBox { boxSize: 20 @@ -98,6 +105,37 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } } + HifiControls.CheckBox { + boxSize: 20 + text: "Constrain color 9 Taps" + checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor9Taps"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor9Taps"] = checked } + } + HifiControls.CheckBox { + boxSize: 20 + text: "Clip / Clamp History color" + checked: Render.getConfig("RenderMainView.Antialiasing")["clipHistoryColor"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["clipHistoryColor"] = checked } + } + Row { + spacing: 10 + + HifiControls.CheckBox { + boxSize: 20 + text: "Feedback history color" + checked: Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked } + } + + HifiControls.ConfigSlider { + label: qsTr("Source blend") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "blend" + max: 1.0 + min: 0.0 + } + } } Row { @@ -156,6 +194,15 @@ Rectangle { max: 32.0 min: 1.0 } + Separator {} + ConfigSlider { + label: qsTr("Velocity scale") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "velocityScale" + max: 1.0 + min: 0.0 + } } } } From 3e1c2bdb48056a3357fab827efb254945a6adcf6 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 5 Sep 2017 18:17:27 -0700 Subject: [PATCH 38/45] Adding the full code path, starting debugging the problems in hmd, --- .../developer/utilities/render/antialiasing.qml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 3f80cd3ddd..37f0a7d2d7 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -34,25 +34,26 @@ Rectangle { Row { spacing: 10 - - var debugFXAA = false + id: fxaaOnOff + property bool debugFXAA: false HifiControls.Button { text: { - if (debugFXAA) { + if (fxaaOnOff.debugFXAA) { return "FXAA" } else { return "TAA" } } onClicked: { - if (debugFXAA) { - Render.getConfig("RenderMainView.JitterCam").stop(); + fxaaOnOff.debugFXAA = !fxaaOnOff.debugFXAA + if (fxaaOnOff.debugFXAA) { + Render.getConfig("RenderMainView.JitterCam").none(); Render.getConfig("RenderMainView.Antialiasing").debugFXAAX = 0; } else { - Render.getConfig("RenderMainView.JitterCam").run(); + Render.getConfig("RenderMainView.JitterCam").play(); Render.getConfig("RenderMainView.Antialiasing").debugFXAAX = 1.0; } - debugFXAA = !debugFXAA + } } } From dbdcef3d332dde681ee7f813edff3ffd381627a1 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 6 Sep 2017 17:40:59 -0700 Subject: [PATCH 39/45] making the 9 fetch the default for the constraining pass --- libraries/render-utils/src/AntialiasingEffect.cpp | 6 +++++- libraries/render-utils/src/taa.slf | 4 ++-- libraries/render-utils/src/taa.slh | 11 +++++------ scripts/developer/utilities/render/antialiasing.qml | 13 ++++--------- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 86a1ea877d..bed111aa8f 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -336,7 +336,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const for (int i = 0; i < 2; i++) { _antialiasingBuffer[i] = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); auto format = gpu::Element::COLOR_SRGBA_32; // DependencyManager::get()->getLightingTexture()->getTexelFormat(); - auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); _antialiasingTexture[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); _antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]); } @@ -490,6 +490,10 @@ void JitterSample::configure(const Config& config) { if (_jitterBuffer->currentIndex != pausedIndex) { _jitterBuffer.edit().currentIndex = pausedIndex; } + } else { + if (_jitterBuffer->currentIndex == SampleSequence::SEQUENCE_LENGTH) { + _jitterBuffer.edit().currentIndex = config.getIndex(); + } } _scale = config.scale; } diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index fb68ecbf6a..c82ba34c37 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -32,7 +32,7 @@ void main() { // Debug region before debug or fxaa region X float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; if (distToRegionFXAA > 0.0) { - outFragColor = vec4(taa_evalTXAA(fragUV), 1.0); + outFragColor = vec4(taa_evalFXAA(fragUV), 1.0); return; } @@ -41,7 +41,7 @@ void main() { vec3 sourceColor; vec3 historyColor; - vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, sourceColor, historyColor); + vec2 prevFragUV = taa_fetchSourceAndHistory(nearFragUV.xy, fragVel, sourceColor, historyColor); vec3 nextColor = mix(historyColor, sourceColor, params.blend); diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index c6528aaa61..1c97fd39ef 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -219,8 +219,7 @@ mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVeloci vec2 texelSize = getInvWidthHeight(); vec3 cmin, cmax, cavg; - if (taa_constrainColor9Taps()) { - + #if MINMAX_3X3_ROUNDED vec2 du = vec2(texelSize.x, 0.0); vec2 dv = vec2(0.0, texelSize.y); @@ -228,7 +227,7 @@ mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVeloci vec3 ctc = taa_fetchSourceMap(fragUV - dv).rgb; vec3 ctr = taa_fetchSourceMap(fragUV - dv + du).rgb; vec3 cml = taa_fetchSourceMap(fragUV - du).rgb; - vec3 cmc = taa_fetchSourceMap(fragUV).rgb; // could resuse the same osurce sample isn't it ? + vec3 cmc = sourceColor; //taa_fetchSourceMap(fragUV).rgb; // could resuse the same osurce sample isn't it ? vec3 cmr = taa_fetchSourceMap(fragUV + du).rgb; vec3 cbl = taa_fetchSourceMap(fragUV + dv - du).rgb; vec3 cbc = taa_fetchSourceMap(fragUV + dv).rgb; @@ -251,7 +250,7 @@ mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVeloci cmax = 0.5 * (cmax + cmax5); cavg = 0.5 * (cavg + cavg5); #endif - } else { + #else const float _SubpixelThreshold = 0.5; const float _GatherBase = 0.5; const float _GatherSubpixelMotion = 0.1666; @@ -277,7 +276,7 @@ mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVeloci #elif cavg = (cmin + cmax ) * 0.5; #endif - } + #endif // shrink chroma min-max #if USE_YCOCG @@ -373,7 +372,7 @@ vec3 taa_getVelocityColorAboveThreshold(float velocityPixLength) { } -vec3 taa_evalTXAA(vec2 fragUV) { +vec3 taa_evalFXAA(vec2 fragUV) { vec2 texelSize = getInvWidthHeight(); diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 37f0a7d2d7..64502d32e8 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -57,6 +57,7 @@ Rectangle { } } } + Separator {} Row { spacing: 10 @@ -64,11 +65,11 @@ Rectangle { text: { var state = 2 - (Render.getConfig("RenderMainView.JitterCam").freeze * 1 - Render.getConfig("RenderMainView.JitterCam").stop * 2); if (state === 2) { - return ">>" + return "Jitter" } else if (state === 1) { - return "|" + Render.getConfig("RenderMainView.JitterCam").index + "|" + return "Paused at " + Render.getConfig("RenderMainView.JitterCam").index + "" } else { - return "[]" + return "No Jitter" } } onClicked: { Render.getConfig("RenderMainView.JitterCam").cycleStopPauseRun(); } @@ -106,12 +107,6 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } } - HifiControls.CheckBox { - boxSize: 20 - text: "Constrain color 9 Taps" - checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor9Taps"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor9Taps"] = checked } - } HifiControls.CheckBox { boxSize: 20 text: "Clip / Clamp History color" From 965118aa47fa273917e55bf9c5aec499ea9f041d Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 7 Sep 2017 02:05:06 -0700 Subject: [PATCH 40/45] Introducing covariance clipping and it works better, cleaning the controls and debugs --- .../render-utils/src/AntialiasingEffect.cpp | 10 +- .../render-utils/src/AntialiasingEffect.h | 31 ++-- .../render-utils/src/VelocityBufferPass.cpp | 2 +- libraries/render-utils/src/taa.slf | 13 +- libraries/render-utils/src/taa.slh | 167 +++++++++++++----- libraries/render-utils/src/taa_blend.slf | 2 +- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 86 +++++---- 8 files changed, 200 insertions(+), 111 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index bed111aa8f..27a3689889 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -220,7 +220,7 @@ const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { gpu::Shader::makeProgram(*program, slotBindings); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); PrepareStencil::testMask(*state); @@ -284,12 +284,12 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { void Antialiasing::configure(const Config& config) { _params.edit().blend = config.blend; - _params.edit().velocityScale = config.velocityScale; + _params.edit().covarianceGamma = config.covarianceGamma; _params.edit().setUnjitter(config.unjitter); _params.edit().setConstrainColor(config.constrainColor); - _params.edit().setConstrainColor9Taps(config.constrainColor9Taps); - _params.edit().setClipHistoryColor(config.clipHistoryColor); + _params.edit().setCovarianceClipColor(config.covarianceClipColor); + _params.edit().setClipExactColor(config.clipExactColor); _params.edit().setFeedbackColor(config.feedbackColor); _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; @@ -491,7 +491,7 @@ void JitterSample::configure(const Config& config) { _jitterBuffer.edit().currentIndex = pausedIndex; } } else { - if (_jitterBuffer->currentIndex == SampleSequence::SEQUENCE_LENGTH) { + if (_jitterBuffer->currentIndex < 0) { _jitterBuffer.edit().currentIndex = config.getIndex(); } } diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 3be6f7e87a..09468e7942 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -86,12 +86,12 @@ private: class AntialiasingConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) - Q_PROPERTY(float velocityScale MEMBER velocityScale NOTIFY dirty) + Q_PROPERTY(float covarianceGamma MEMBER covarianceGamma NOTIFY dirty) Q_PROPERTY(bool unjitter MEMBER unjitter NOTIFY dirty) Q_PROPERTY(bool constrainColor MEMBER constrainColor NOTIFY dirty) - Q_PROPERTY(bool constrainColor9Taps MEMBER constrainColor9Taps NOTIFY dirty) - Q_PROPERTY(bool clipHistoryColor MEMBER clipHistoryColor NOTIFY dirty) + Q_PROPERTY(bool covarianceClipColor MEMBER covarianceClipColor NOTIFY dirty) + Q_PROPERTY(bool clipExactColor MEMBER clipExactColor NOTIFY dirty) Q_PROPERTY(bool feedbackColor MEMBER feedbackColor NOTIFY dirty) Q_PROPERTY(bool debug MEMBER debug NOTIFY dirty) @@ -109,7 +109,14 @@ public: AntialiasingConfig() : render::Job::Config(true) {} float blend{ 0.1f }; - float velocityScale{ 1.0f }; + + + bool unjitter{ false }; + bool constrainColor{ true }; + bool covarianceClipColor{ true }; + float covarianceGamma{ 1.0f }; + bool clipExactColor{ true }; + bool feedbackColor{ true }; float debugX{ 0.0f }; float debugFXAAX{ 1.0f }; @@ -117,12 +124,6 @@ public: glm::vec2 debugCursorTexcoord{ 0.5f, 0.5f }; float debugOrbZoom{ 2.0f }; - bool unjitter{ true }; - bool constrainColor{ true }; - bool constrainColor9Taps{ true }; - bool clipHistoryColor{ true }; - bool feedbackColor{ true }; - bool debug { false }; bool showCursorPixel { false }; bool showJitterSequence{ false }; @@ -138,7 +139,7 @@ signals: struct TAAParams { float nope{ 0.0f }; float blend{ 0.1f }; - float velocityScale{ 1.0f }; + float covarianceGamma{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; glm::ivec4 flags{ 0 }; @@ -151,11 +152,11 @@ struct TAAParams { void setConstrainColor(bool enabled) { SET_BIT(flags.y, 1, enabled); } bool isConstrainColor() const { return (bool)GET_BIT(flags.y, 1); } - void setConstrainColor9Taps(bool enabled) { SET_BIT(flags.y, 2, enabled); } - bool isConstrainColor9Taps() const { return (bool)GET_BIT(flags.y, 2); } + void setCovarianceClipColor(bool enabled) { SET_BIT(flags.y, 2, enabled); } + bool isCovarianceClipColor() const { return (bool)GET_BIT(flags.y, 2); } - void setClipHistoryColor(bool enabled) { SET_BIT(flags.y, 3, enabled); } - bool isClipHistoryColor() const { return (bool)GET_BIT(flags.y, 3); } + void setClipExactColor(bool enabled) { SET_BIT(flags.y, 3, enabled); } + bool isClipExactColor() const { return (bool)GET_BIT(flags.y, 3); } void setFeedbackColor(bool enabled) { SET_BIT(flags.y, 4, enabled); } bool isFeedbackColor() const { return (bool)GET_BIT(flags.y, 4); } diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp index 1df67b9952..26dc1c6848 100644 --- a/libraries/render-utils/src/VelocityBufferPass.cpp +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -61,7 +61,7 @@ void VelocityFramebuffer::allocate() { // For Velocity Buffer: _velocityTexture = gpu::Texture::createRenderBuffer(gpu::Element(gpu::VEC2, gpu::HALF, gpu::RGB), width, height, gpu::Texture::SINGLE_MIP, - gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT)); + gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR)); _velocityFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("velocity")); _velocityFramebuffer->setRenderBuffer(0, _velocityTexture); _velocityFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, _primaryDepthTexture->getTexelFormat()); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index c82ba34c37..670851d956 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -41,20 +41,19 @@ void main() { vec3 sourceColor; vec3 historyColor; - vec2 prevFragUV = taa_fetchSourceAndHistory(nearFragUV.xy, fragVel, sourceColor, historyColor); + vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, fragJitterPix, sourceColor, historyColor); - vec3 nextColor = mix(historyColor, sourceColor, params.blend); + vec3 nextColor = sourceColor; if (taa_constrainColor()) { - mat3 colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, fragUV, fragVel, nearFragUV.z, fragJitterPix); - // clamp history to neighbourhood of current sample - historyColor = taa_clampColor(colorMinMaxAvg[0], colorMinMaxAvg[1], colorMinMaxAvg[2], historyColor); - nextColor = historyColor; + historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, nearFragUV.z, fragJitterPix, historyColor); } if (taa_feedbackColor()) { - nextColor = taa_evalFeedbackColor(sourceColor, historyColor, params.blend); + nextColor = taa_evalFeedbackColor(sourceColor, historyColor, params.blend); + } else { + nextColor = mix(historyColor, sourceColor, params.blend); } outFragColor = vec4(taa_resolveColor(nextColor), 1.0); diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 1c97fd39ef..27a67c79eb 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -50,7 +50,7 @@ struct TAAParams { float none; float blend; - float motionScale; + float covarianceGamma; float debugShowVelocityThreshold; ivec4 flags; vec4 pixelInfo_orbZoom; @@ -82,10 +82,10 @@ bool taa_unjitter() { bool taa_constrainColor() { return GET_BIT(params.flags.y, 1); } -bool taa_constrainColor9Taps() { +bool taa_covarianceClipColor() { return GET_BIT(params.flags.y, 2); } -bool taa_clipHistoryColor() { +bool taa_clipExactColor() { return GET_BIT(params.flags.y, 3); } bool taa_feedbackColor() { @@ -197,10 +197,10 @@ vec3 taa_findClosestFragment3x3(vec2 uv) return vec3(uv + dd.xy * dmin.xy, dmin.z); } -vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { +vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, vec2 fragJitterPix, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; - vec2 prevFragUV = fragUV - fragVelocity; + vec2 prevFragUV = fragUV - fragJitterPix - fragVelocity; historyColor = sourceColor; if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { historyColor = taa_fetchHistoryMap(prevFragUV).xyz; @@ -214,6 +214,60 @@ float Luminance(vec3 rgb) { #define MINMAX_3X3_ROUNDED 1 +mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { + vec2 texelSize = getInvWidthHeight(); + + + vec2 du = vec2(texelSize.x, 0.0); + vec2 dv = vec2(0.0, texelSize.y); + + vec3 sampleColor = taa_fetchSourceMap(fragUV - dv - du).rgb; + vec3 sumSamples = sampleColor; + vec3 sumSamples2 = sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV - dv).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV - dv + du).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV - du).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = sourceColor; //taa_fetchSourceMap(fragUV).rgb; // could resuse the same osurce sampleColor isn't it ? + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV + du).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV + dv - du).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV + dv).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + sampleColor = taa_fetchSourceMap(fragUV + dv + du).rgb; + sumSamples += sampleColor; + sumSamples2 += sampleColor * sampleColor; + + + vec3 mu = sumSamples / vec3(9.0); + vec3 sigma = sqrt(sumSamples2 / vec3(9.0) - mu * mu); + + float gamma = params.covarianceGamma; + vec3 cmin = mu - gamma * sigma; + vec3 cmax = mu + gamma * sigma; + + return mat3(cmin, cmax, mu); +} + mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); @@ -290,53 +344,78 @@ mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVeloci return mat3(cmin, cmax, cavg); } -#define USE_OPTIMIZATIONS 1 +//#define USE_OPTIMIZATIONS 0 -vec3 taa_clampColor(vec3 colorMin, vec3 colorMax, vec3 colorAvg, vec3 color) { - if (taa_clipHistoryColor()) { - vec3 p = clamp(colorAvg, colorMin, colorMax); - vec3 q = color; - const float eps = 0.00001; +vec3 taa_clampColor(vec3 colorMin, vec3 colorMax, vec3 colorSource, vec3 color) { + const float eps = 0.00001; + vec3 p = colorSource; + vec3 q = color; + if (taa_clipExactColor()) { + vec3 r = q - p; + vec3 rmax = colorMax - p.xyz; + vec3 rmin = colorMin - p.xyz; - #if USE_OPTIMIZATIONS - // note: only clips towards aabb center (but fast!) - vec3 p_clip = 0.5 * (colorMax + colorMin); - vec3 e_clip = 0.5 * (colorMax - colorMin) + vec3(eps); + /* bvec3 over = (greaterThan(r, rmax + vec3(eps))); + bvec3 under = (lessThan(r, rmin - vec3(eps))); - vec3 v_clip = q - p_clip; - vec3 v_unit = v_clip.xyz / e_clip; - vec3 a_unit = abs(v_unit); - float ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z)); + float minScale = 1.0; + if (over.x || under.x) + minScale = (float(over.x) * rmax.x + float(under.x) * rmin.x) / r.x; + if (over.y || under.y) + minScale = min(minScale, (float(over.y) * rmax.y + float(under.y) * rmin.y) / r.y); + if (over.z || under.z) + minScale = min(minScale, (float(over.z) * rmax.z + float(under.z) * rmin.z) / r.z); - if (ma_unit > 1.0) - return p_clip + v_clip / ma_unit; - else - return q;// point inside aabb - #else - vec3 r = q - p; - vec3 rmax = colorMax - p.xyz; - vec3 rmin = colorMin - p.xyz; + r *= minScale; - - if (r.x > rmax.x + eps) - r *= (rmax.x / r.x); - if (r.y > rmax.y + eps) - r *= (rmax.y / r.y); - if (r.z > rmax.z + eps) - r *= (rmax.z / r.z); +*/ + if (r.x > rmax.x + eps) + r *= (rmax.x / r.x); + if (r.y > rmax.y + eps) + r *= (rmax.y / r.y); + if (r.z > rmax.z + eps) + r *= (rmax.z / r.z); - if (r.x < rmin.x - eps) - r *= (rmin.x / r.x); - if (r.y < rmin.y - eps) - r *= (rmin.y / r.y); - if (r.z < rmin.z - eps) - r *= (rmin.z / r.z); + if (r.x < rmin.x - eps) + r *= (rmin.x / r.x); + if (r.y < rmin.y - eps) + r *= (rmin.y / r.y); + if (r.z < rmin.z - eps) + r *= (rmin.z / r.z); - return p + r; - #endif - } else { - return clamp(color, colorMin, colorMax); + return p + r; + } else { + // note: only clips towards aabb center (but fast!) + vec3 p_clip = 0.5 * (colorMax + colorMin); + vec3 e_clip = 0.5 * (colorMax - colorMin) + vec3(eps); + + vec3 v_clip = q - p_clip; + vec3 v_unit = v_clip.xyz / e_clip; + vec3 a_unit = abs(v_unit); + float ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z)); + + if (ma_unit > 1.0) + return p_clip + v_clip / ma_unit; + else + return q;// point inside aabb } + // Not using clamp at all + // else { + // return clamp(color, colorMin, colorMax); + //} +} + +vec3 taa_evalConstrainColor(vec3 sourceColor, vec2 sourceUV, vec2 sourceVel, float sourceZe, vec2 sourceJitterPix, vec3 candidateColor) { + mat3 colorMinMaxAvg; + + if (taa_covarianceClipColor()) { + colorMinMaxAvg = taa_evalNeighbourColorVariance(sourceColor, sourceUV, sourceVel, sourceZe, sourceJitterPix); + } else { + colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, sourceUV, sourceVel, sourceZe, sourceJitterPix); + } + + // clamp history to neighbourhood of current sample + return taa_clampColor(colorMinMaxAvg[0], colorMinMaxAvg[1], sourceColor, candidateColor); } vec3 taa_evalFeedbackColor(vec3 sourceColor, vec3 historyColor, float blendFactor) { diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 0ef3728cc3..3d040af9db 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -35,7 +35,7 @@ void main(void) { vec2 pixPos = varTexCoord0 * imageSize; vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); - vec2 velocity = params.motionScale * pixVelocity * texelSize; + vec2 velocity = pixVelocity * texelSize; vec2 prevTexCoord = varTexCoord0 - velocity; vec2 prevPix = prevTexCoord * imageSize; diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..369d4444878f60a092189d56d24fd586c7a0c747 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -174,7 +193,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } } } - ConfigSlider { + HifiControls.ConfigSlider { label: qsTr("Debug Velocity Threshold [pix]") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -182,23 +201,14 @@ Rectangle { max: 50 min: 0.0 } - ConfigSlider { + HifiControls.ConfigSlider { label: qsTr("Debug Orb Zoom") integral: false config: Render.getConfig("RenderMainView.Antialiasing") property: "debugOrbZoom" max: 32.0 min: 1.0 - } - Separator {} - ConfigSlider { - label: qsTr("Velocity scale") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "velocityScale" - max: 1.0 - min: 0.0 - } + } } } } From 12d063c008ec3af8a751b8341740dd1a58cfa654 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 7 Sep 2017 02:14:52 -0700 Subject: [PATCH 41/45] Not trying to unjitter the history coordinate --- libraries/render-utils/src/taa.slh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 27a67c79eb..856247de6e 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -200,7 +200,7 @@ vec3 taa_findClosestFragment3x3(vec2 uv) vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, vec2 fragJitterPix, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; - vec2 prevFragUV = fragUV - fragJitterPix - fragVelocity; + vec2 prevFragUV = fragUV - fragVelocity; historyColor = sourceColor; if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { historyColor = taa_fetchHistoryMap(prevFragUV).xyz; From 05f039a251b45ea9668553fd4937c31cc86a2c68 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 7 Sep 2017 17:50:55 -0700 Subject: [PATCH 42/45] Almost there --- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes .../utilities/render/antialiasing.qml | 46 ++++++++---------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index 369d4444878f60a092189d56d24fd586c7a0c747..a11d8cf029dcb2a16ad80b66aa3ac76475f0233e 100644 GIT binary patch delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtHR)%vaax!s@3=B5a3=DU@Bo!xd$^}mDUF9x# zN&L=6ogbB&p$rTRX$+YRISi=`Rt)-Jm<(olFl2&df*4X63K;Sydsek?zEU;C7XT#3 B9RmOW diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 1a81db9904..c194b0ace4 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -8,7 +8,7 @@ // See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html // -import QtQuick 2.5 +import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 @@ -28,6 +28,7 @@ Rectangle { Column { id: antialiasing spacing: 20 + padding: 10 Column{ spacing: 10 @@ -125,16 +126,17 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["clipExactColor"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["clipExactColor"] = checked } } - HifiControls.ConfigSlider { - label: qsTr("Covariance gamma") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "covarianceGamma" - max: 1.5 - min: 0.5 - } } - } + } + HifiControls.ConfigSlider { + label: qsTr("Covariance gamma") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "covarianceGamma" + max: 1.5 + min: 0.5 + } + Separator {} HifiControls.CheckBox { boxSize: 20 text: "Feedback history color" @@ -152,6 +154,7 @@ Rectangle { } } + Separator {} Row { spacing: 10 @@ -176,23 +179,12 @@ Rectangle { max: 1.0 min: 0.0 } - HifiControls.ConfigSlider { - label: qsTr("FXAA Region >") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "debugFXAAX" - max: 1.0 - min: 0.0 - } - Row { - - HifiControls.CheckBox { - boxSize: 20 - text: "Closest Fragment" - checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } - } - } + HifiControls.CheckBox { + boxSize: 20 + text: "Closest Fragment" + checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } + } HifiControls.ConfigSlider { label: qsTr("Debug Velocity Threshold [pix]") integral: false From 7a3466a200c31da2e90a8170884b43e883acd721 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 10 Sep 2017 20:39:33 -0700 Subject: [PATCH 43/45] Adding fonts just because --- .../utilities/fonts/AnonymousPro-Regular.ttf | Bin 0 -> 158080 bytes .../utilities/fonts/AnonymousPro.license | 93 +++++++++++++++++ .../utilities/fonts/FiraSans-Regular.ttf | Bin 0 -> 403924 bytes .../utilities/fonts/FiraSans-SemiBold.ttf | Bin 0 -> 437824 bytes .../utilities/fonts/FiraSans.license | 94 ++++++++++++++++++ .../utilities/fonts/Raleway-Bold.ttf | Bin 0 -> 179244 bytes .../utilities/fonts/Raleway-Light.ttf | Bin 0 -> 182376 bytes .../utilities/fonts/Raleway-Regular.ttf | Bin 0 -> 178520 bytes .../utilities/fonts/Raleway-SemiBold.ttf | Bin 0 -> 180492 bytes .../developer/utilities/fonts/Raleway.license | 94 ++++++++++++++++++ .../utilities/fonts/fontawesome-webfont.ttf | Bin 0 -> 138204 bytes .../developer/utilities/fonts/hifi-glyphs.ttf | Bin 0 -> 29160 bytes 12 files changed, 281 insertions(+) create mode 100644 scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf create mode 100644 scripts/developer/utilities/fonts/AnonymousPro.license create mode 100644 scripts/developer/utilities/fonts/FiraSans-Regular.ttf create mode 100644 scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf create mode 100644 scripts/developer/utilities/fonts/FiraSans.license create mode 100644 scripts/developer/utilities/fonts/Raleway-Bold.ttf create mode 100644 scripts/developer/utilities/fonts/Raleway-Light.ttf create mode 100644 scripts/developer/utilities/fonts/Raleway-Regular.ttf create mode 100644 scripts/developer/utilities/fonts/Raleway-SemiBold.ttf create mode 100644 scripts/developer/utilities/fonts/Raleway.license create mode 100644 scripts/developer/utilities/fonts/fontawesome-webfont.ttf create mode 100644 scripts/developer/utilities/fonts/hifi-glyphs.ttf diff --git a/scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf b/scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06aafc067310fba0d33b0a133654475ac73388ab GIT binary patch literal 158080 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%0De#;=TZ#{I_Q#`DG- z#@pO``-oXG_cIrnhnvTmr<-HuMdoGZb>=$re)Dnjd2^d3TedaN`lxk)RkaSczG5x4 zzHXgjeamWC-?uKXF19YSuC}hVZno~W?zjHOdeVB{dc)cg2nBM1`GLIy<-nnVuLe#F zoD=W@KMnjMur_daU~}NFfmZ@=2d!W__@Ur};DNzf@Tv8^4f<>k1)mJQ z6#Qq1gi@hhL;Hj(p)ZAw51ko0FVqTM5n2HQ@zArOH^Ndl5*`lk8D1FvLip(L zso}H3Uii}R)#01M)8Rjcp9;Sielwy*?8s1LkH{w@2S>gVIWclpWJTnX$d!>_Mb<}t zANf<{g~&ErwWGFU?`bczKaZB|J9g8))Nb21+P||m*-zRp+5d`?XdLa>r=y2NkBOcV zZA5<<{jca`^p@y!^pDZML|=~fVu4sTR*dZvtHiz-J1+Lk*jVhM*w12}*sZY*u}5N0 z#Ga1L#&*QR@uB!0@%`hUk1vUz7(X-q{rJlG&*Hy~-x8mWKNx=^{`dH{gq#Q`@`++% zpTwfX;fbY*Qxe}v{2;L^@$0EcNYFGj&Po%GC9#^{M+) zkEWhZy_$L_9Zcub#q>VuMd`!S$ELrLZlupouS)+s{p<8^(;L%|rJqT^mhNTDOe*ui zOeu3f=8()$nUgZ#&aBA%7`?6AGXI@V{yg;D(Cn~092@@N@Pgsb4u56% z>%(UZj}3dnmkwVwJT-jx@WaD@8Gd2-_2J$;GA}-FXx?t~_L{fIc-1tNW{;Q4dxZtH-OStLLZ}sN?F-)f?42)Cbf*b4zDvNo^NxPi;gyNIODX zs-3KzseNC&P`g~aUb{ovpgpQRr)|?UJ)zIn7wC)hntrVQ4gGB0(|@90qu-?8rEk)o z(6{Pu5|u>BJhCU*pH#_L$O+_3;*yKW&&W08CUO_qOr9WH$(vNAHqFux(B0_AX_+2I zkECCxb^1Me5uKpFq-*It^g;SJ`oHv_hHltK-uSSwuTeG*F_s!98fO_}=(n|uwlQT) z8xI+OHvVQjZ@g;!)09lpjGM#ep5_7QyPar$(;PD|G=FMdVgAy*(fpnHp!pZ`74sb{ zWDQw+S_fE%T3@wJx6ZLHvM#r-w|;BgXFX^=YCT~+ZT;PP&3e z1B(LHz!w8c11ANR2UY}Hfhz;o1#S=AA9yVALg39H3C4pT4DJ>DOz^PavBA@VW5El9 zmj$m4{w8>D@Uh^t!PkR3LXl7*v`6TZq0fho44oWW9%_bGg{}_W9J(j;aOj!P>tQ(@ z4SyiKSNPN6L&IMUe*@#tiSRGOw}tNwKNfyIye*$Yr%?O}Tldw+~Rm)YO8&$lnNud#2k@3#MF|IL2c?nSL=E?SI^ zL=TF7CHnQ~S<&;NmqdRay(u~!eJJ`=^yTPVF)Nmi?H1c7_Sx8%VqcGaD|TM&N3kno zH^lCUZHhe=dnxu-oW|4fUE_Pl4~!oX|62SEv}vp3H^gs=uaEyB{zUwx_*)4pkxP6e zF_Jhau{d#jqMkT6u`+R4qLa8Su>t+CR};OYmCPhRlw6Qpl&mF>O`ewgZt}w9WywzR zw&Z=uN0ZMaUrD}`vQnAU2UB~e%BjOrN2N|kotgT6>cZ4zsb8dSPTiIIL+Y{AOzM@? zTWKR5Pdn*7)BC3nP9K>*IsNVQ`RPm3KTqG7zAOD;`pNW*>3?QuCY{+Wvrp#0%n_O6 zGG}DIm$@kOv&^-b-(>F1Jd$}j^IGPeY#^J>?v~vrdtmm6>~YyMvfs;Il)XHAUG_KG zd$W&ZpU%FPeJf|=;<;h8U!Tbxk~=bYVy>P$CwD>alHBUtwYjyqyK;ZX{VDhN+#9(a zc`KjH?~>m$KaxK%e^~yg{0aGQ<53+Ej?@0fX~&-?zoOXgiO@78(u%zJ3wlk>LD+vdnl+}YLH x*IDEo;vDH5?|jo4b3A9z$3@=3&lJeZM>;rIz)6G{bm*nrT|r{{dW1_)h=; literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/AnonymousPro.license b/scripts/developer/utilities/fonts/AnonymousPro.license new file mode 100644 index 0000000000..5e8b7385e7 --- /dev/null +++ b/scripts/developer/utilities/fonts/AnonymousPro.license @@ -0,0 +1,93 @@ +Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com), +with Reserved Font Name Anonymous Pro. +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/scripts/developer/utilities/fonts/FiraSans-Regular.ttf b/scripts/developer/utilities/fonts/FiraSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d9fdc0e922030c6836a9ad5f808fd7e1c5970873 GIT binary patch literal 403924 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 r-(pXe}H&MjC7NAiF2}5 zIgw_jW98JKhx#~UwiZW6*^Jg?tQLO(TBp& z@v4+k!9?{K&eML-VaF@@>k3et2XvHDVG>)u@V%nJiM^c4_5g&ZwZA6-n_l4AiG;JP zjF7TmS)i%{GR>ioY~z@4)l)iCzeaL2>no|sig0z-`B=Fm(SH%wtUWi(eVuIzRM?kY zkcHoV$G2W#K*afafJSk+ZZ|65415b4vzP#nUR}w?$r}SAO_+lK0v~2bsl};IRT?xHF=0gRYsm zAOY@c_w+fx1?P2ibyc*Y$uMAOs~>GD_|lQ}R}J(XP3^zcecw*lJ(`Y%`6)yoRiqZO zfi^Q^K$D=;Grf+Xr7lt+NFV|eHfml;xgKX4kcttv=ZpDRUY_La^L-MExjyp=lV*?i zfBf2~Oq>!&`UCo;Rv!R-l2%~xgF;b=aq*&natL7Zj+Gonj`aaSFeY5{x^#rK>N>rA z<2ql1zeQfYdf7;*y|O+$7TteM_x_|MP!V^#&%NOM9S%oZS=nvZr>^ct9etcd*`35q zDo6;}Fx(EtXh1IWiUP9$cbqWdaxyw(HZcOZ6wPFS+^uFZR92RhRE8>pB^4#*wL!fG z6kY%`E;=0m6}N$PCb%N>4}IMSlHRha5qU{p;y|*r%s&!P-sri?<~-r6x=M00ddzYHe?i~GY{Y!D zb`HTmufW@RBC$5h(8^1W=}?vj)kp;$6K0?cRyS#yZ=g3eR#u84+|02^<)X@la8Rre z%Y(sc3&4&I;W#@h!0)VvI(_hy`A}_Vs-AN|^_*G&@z?Q5x@cWS2HO%d(A-KWEMPk5 zK1a-4g930xCqUfNLUjgFH&cl2TETpGjf;VsD7k_taYN{nup3lRTmG% zViC1I5dL7`TyVey^HOWe&XJLw@z$39RDFBO{7z6VvQ<8_j0z4ER{G)~u@g^2)zeh}_EQUlaJ8xb8DtmK^y&2mUqHjJ`SnirU&=K;-{9V^?mdG6AKh=;Si)jN2@KtGF4jBi-~Pb{ju zvN*B(70@}5+xsKNP@lk9=ev-mQ|m11ku#?f81Ra%OvivQl5_RUfD#q3ouigcFDW6U zq_U)<+)LcV>5~HJa)I#yd8&COd70VG;_Ncj7Wd~)Gq2i$PdF=|0^)$GG(8oFs1w8t zi_i?u&mxNpR!}$!?Y3gIwk3Z`YA>c7DWwMS`{~Odrade=rG72$+q>8p>mm+P0T~_e zf(CVz2}EFIAMgMIl{Ln7wF`xiGEa$%IEW(@fa@f{!Eo9ZLc7cWdxsklOiXr0rb^zO^jy=e_h?j)PwLFJjY^OR_S)mv7 zIxn_Y_u`O{JEUgQ0mVc_0=QxA;6VafI|g3pG{zsmYzjPur!M!QiG;PRtSnp>s`lGM zP^IG0h!1lPj0-5#kp3``%cJ%n5M0I2?cUHF+d2>#@ak6pd6IH6QSR-mSvqtDv{Jf! zWrjv=?uHR_!FO_))HsF!xSa}#3-p}@Fj*tosoA8>I0K`y7CG%jF00Gs1FH$Bec-TQ zUw}MXDfhaR%HDJmvVjaKjF3tLjEB%kK4-de}>yi z%^z9OH{$C%LSM}HjR+%UAOpb8089v9HS z6`KGaq4t75%ljM}n)gQE>ZAJncZ%GXAJAu57YPGPE~7+ny99v|uq0G77L!}r2_b}p zNhnZ<1}zr6s%UlKyae5s(>4>#1rB{(JQ0di^n@0*JL9pn>o3^Svm+GgSs&|n#v)T| zn#WsNm){@vl!OBA3QuuqayU5^4zzVN)p`A1t2f!*&>zBmQwnp%{r5cA-P7C`<>Qbu z=i~1H*ckh%!}E~W;^XflUpDlcx8j=HA;wlubz(zli6H1)P!ucV6vcAvZ>A_#3-9QX z!TR8*6vbv5OJ{_Ti_b)1(Pw7X;c5)(V1lV(Y zeK;1!%?aUd!|X{d($N`uFrrrG&nj%>8{U)P;zk ziGaU*lhMF*I<0n2!)#<39}tFvB%B zZ%%DR946&6$P(>s8ji=SN{c;GNkwgAfgdLK_0A?=Q?w*%G(v0M8Tw{2IrnQk7uIwI z&c~1Q1gzM7d|Ww|H~wdG1Kvm0^t1Fyb{;7vcCZ`m29b&Yn=LG0Y6n}LUIc+^6)tLl zl1(DTq}VPwZE!79gCrx)OOE+?>sr}KQ^~a*;mzNoUGA{dXS$}6zIjsl_cga#Pg6PB zX01&o;T&7jZF%#$g97;<$G88S#fS~??FAONRYq`YK!Lkv!`Aw8w+3>fxDBAQBR=}$ zJ5$3DZ|kWV?xBP9w~Cwo)>T~OvQ;(JE$&ohwL0&+AEY1?N<8V)^xNo@seMkZRM0`M zTVS7DxX&q8)@ors$tDBB9iu$569Q1Y!Fx7-qBS`^{90{%<>uJT((X0Em@i%z@7Yq( zP}W12(KoMmY+c(nu{a>dOI=;9d(0NGkxhwGBNlD6cekw?}v#MRocE`Yh`rLAY~y zf73#NfIa~y12Se9MasEzgCtNd*K(2xK)|X|P0q^+FD%~0umuT^tJAS9=S&SoyPKB} zH=lEH=TvljU31LcTwmQ2Y^<4XXI(3oc8!#~n!+-eONxX+Ug!Lp8;DJ51U5#&3wt^+{-}e z3jJ9=U;^^bcoQYuP0!&lu=(wr!+=vyae`RD)d~ByZrhVObaCpt>vruNrwsA)2iI>Bj2T=%G(#xOg@8Z;yRNo66p*VbvibXJ^QR#E?epFleS875|8DI)E{yq~ zdnotyX4i4A+Ba|!Fng#C1L0KfH$$UJ0dd9H_y|i0HADyW@q^B3;gIah?c!%a(g!7&&zoh=X%DoAFzc!7w5m=v+7!MK9{elServ0KPavZWAz{xZQjgm z+?n&~896}?73F6pkHN94cD$hBx^tWTHVyQ&1u?y#s?F5t+? zWVv)A!@?SDHCO2`m67uvz{Yro=GKEFa2xKfn8bv>M7AQlxoQ38)S-)6R5{wa$(|_+ z4|O>W+gE8S?#Njq{)TME8Csh6c?H#`<}Xa2 zn!lKTZs<2ZIc;%!Mp>UVTcLF2DQt>dm9Mkt{QhkkL>cD`(BZ8h6YZvOmDQvi{t zKUd%F2aK_9QV#vwyi}mz8$gc>=%vS7ALyVTc$QX3ZGC`4g221Bq;bQ6#=$ z{1*;Mx1<(%5mVQ!_E&pGTk_nC^yf+te!r9u2DOD}_E*bP9Ps{X z`cjZwPJgwLgXiwN;KIp?y_@zPXEF1$8Vj%k z(tbiGGD0#%0p5fg7~44&0kAfeYvlsazEZN;Wh_%CEfI~Y9UHP?6F|G2O~#viA+OaY z*~Q7MMEY4l#Fo(8+)7KHXs!jz0rCNVUKy%##fr&yw95zx&3M98q^Aw;`Sc*7XGJVvXaeC|2#pjKrQf;gC zBaOAa(WNZ0dT8CbVb47*8eFXWYN)-ww)WShYX7uTSl2hde_GC-u&Grj&_7Lp{%Ha| zwf*STGY{W&?*0pA?t1rK+CUA@J*UiZpBr)-P`7A=ia1y+IIP(ELM>*s*(5lfL8lz! z{T2OFPj9{9rcI|#y-cT+cc`7)tN1y%AB7I1YF2Dn1VL%=vr;KA+2k8CZhY$Z(?21ic;20)Z}i>MN7blYr)WT2ljW!U?5{ z;9{V$kBJM9keqnTAqOOgj>LsXe$AXy{>P`cUcaVvaRY9tVpqYzDOmmQpNKcu5_)^d zd#7;jIL8BgO~`?A^o;w9%UjXbZDtTs!@h5K(=TI8EuM&0QYKVD&nJw1n4$F>w7?>O z_*0!iU*N=FI&`G6-zW!*NrsPRX3D)VgZ>joc9~(13Dlw$mrBH)ogqSqTHkn3OT9|u$5Ew>~iFexJ&3v`dezFRnf z3zJtKra`lE#gR4FU#NTlQom>9!DT}ak9-5m{rB^Kf! zC8RYGQ+w*n0H}>lLQgJS2r`nb*Ch)I2mxZk0!M+pxQJMYIbhUUajNiK1Utbp1fSDK z*KIv_GPP~{VkWnVFecyP1A@ZMQN< zh3>W8w7{&q)y=;XcoLpq?+^iM#nqZ1Xxv*&%}yw_jz6(>E&Gib&j;MW+t@qAFIIx= z#7Y%kxg~v?yo;Y(o9e8S>fvqiP57>b)prs`ii`?q*IGtXv zGu#sQRC$&Ofl|A@)MK-Glw(WUY^_BVexM9MSsf!^6$(fp(LXE_+Eix?#iTffH6w1l zJXE_(63wi*)J=~CL$ukbJZ}}+fVNtdb0NEv*vOX?=B%9gnmj06tks-A`T;@x0UTSg!9jg2R)MJC3e zwwtjLBQ~qcju^4iRL0I{gs^q+(u4`zSOT0I_>2+}QRHj*6Pne=$O>ooF4p+_My8hO_SlAVGFEV;78tM`) z>`s5Z#cZ}%Earlc9EgN#3oRa##cZ&Is$?(@&_|*t**A%g>_}K_5*M8TEY`(iDCCa|kDZ0v*+{zwR0gG0#g#>ldX?`C?1Q*d0+Z*j*X z^!#;=jg!4&!N~H)>JfU&v(Hk~bI(2hyn42}*lol@^bhOdz2Ps$)sE3!>pI%jY+AQ= z@uJnM=`CBg-gw#CwTIRB?W67NHd07h5*E;V*tMLfilzXTa{$~QJWFO^9-&a_x?|!| zo8-p!yU+@_r3JbzyW^3U?E~GW+E9^qa&_C%<@Dxgv$4fkQc6uPL)jP+NOgKAJIH2< zo0O9P8A~j)Q-je=O$IhX48$ZDOq=i&uOddHH~|iCWVFC+(F0WiuxvzWvZ8{JiamhF9b|D#Fq0s|wS=eWgW04k!Ss`N49gq7YL2rn}WP3~olpZ@cYE`ycN89?U zhXXM5FtxV?m%o1e`0FDlZM$aZSWL`dh>Thb8E|=s@Uo*M z$w@OS%DtY_61Pi&UOAA8E;g1!@IsbkZ5dq*W*^~Q1%;q&fJVo0*%=WY+VizVheoZ+ zgVxbTZ@JS|N}bcwjmNiqOW8V8WOE1Q*Pfi7roGC^&Mw9<>gBcw>d_N>c=W6=bv6JE0{J$zTe>JDwnv zMzSb|D9P|LXBe}MM&Pd|mm~H2o}_p1YIH zW^Bhl3O5tK2t><*>1yb;&biCzAB84jB+DM5l+oc)>?`et8;1$o=6{Pf;ex*r;N0hZ zJ-2g=#3)HN9n8ZCq%@K*M*mm@b7>Zuj;w;&9D#Sv;M}0Bt;7u#hj`9cLInfxLqB7*5AAWO-NUrzj_AIEQ?ui<;p5h66<8E8s0SSZ!g5hL_)p+rwN0SlZi zGOB3|r$h58C9|=-j@nU8NU{J?ExW29*tyT|`qrw+)er1={;_Q*R!y$DV+-A*d>*s_ z{=0`ln`=}8un)}X)ASeYBnd(P1E>xcDuFkHF^(`n9$B!L@Xl?A!^n;M4s6pHB0)Le z3j_>CXw#Shb>&1^vTd`}!lS$Q*R&?42bV7!U0T@EIoQ^*YI*ah4?Ly>GCf zaZyX}z>+0B%a_C&I}&YcW|noYC^C#EyQX96zGZ`KmJ}lAjF{n^i6G}plq4OJqgXVS z0O4LVPGv}q8)$?LP8TY_y=1zOdJfXD3qLdWIGa@-x^WL1QP10;aFqDPCGc*{HENA7 z;5G;GUE;XuCJOij=wZ5(Jt`c9{;klXvCPQ~Iyz!D2}}fP2P1`sXpqf=Fx(V)G7+rv zjS3ttQCU=3Q4UJqCKX#D7#cJioj{n(sZZn3IDr}fqLZ@%iMm(omze7Ufkoye`ZZm2 z)7YrICbKAkcDEE(m6cZ(wsg-ed;NI+B0=MFzQSJAYxDRDBWP?#3FknQaIdSI3tQRJ z^MA7Ekqy(+)Awig5}VEHPmohD$_e;ZLB~9Xd%Gxonl-XnVg;U46GrS*oDbLP$N`Ih zDbeWSZF@6U32U6ry+%NL&$~sq?gpNv7g1N9(9Rj&DU9sJcLhD6E@LN&bv`Fadj?O@ zaV94TypDwn<)mVn&K?~eKDut*(c$5%)~?^Ob>hh<*~!&k+rRH?=dAkL`Fp>txIS1<89NE6 zJNy}NV}Hf<{{>}E(x;h^&5|OBhZmqN2PuR>c>id`MQG9{mB5t|gln5yZFYNvPIx=d zNfZtAx#U-79>06z6Mf5T&HY93ZhBf7pih7f!_UTZ0(yX%Yk>X^?YUnG1?;CpA|<2} zV|AiH#WgzM5;Euo!;IO)^x!?~f$~%Y?Jm+~rKP2nrIl{UA;JG7i?JMAsK_x6*oj4e zGhcMMCB5D$V(Ggi6nyKp)E#%@f95Vf|GFnO~54>=jxO}r@NHgRCU@Rge` z+^3^IHSD?QwLKRd*r!t(VD36Xm>c9o8&OWsUxKh%B0=P~7_K%-!S={Hmw3gZrA7#m zh~&4+X!JmPY3yvG!fxUcBh&ROqNzR8M<+Yc%y9Y2_DxfhqFmih)ff}#jH@&E4H3vH zNQ^{A^*V48RjZbeEUUD3*GXW_L?m|gs8wm3ruJ#Dr)K9)u$j3Ne18dT__>vdGM&J{ zI)P6{vNY{P7sHA6sWv1WX`yYdZtB&ESEsa3LKN?o^iJVAJg*IjTAZUE(!-Ha&OMeh z%N&%W5&Bxm;hYbbgzHAFb20qHz`ks5!ISR-S%*d(i3BV)|A|4^$xLeOG` z+iBC2W2;t``8W?}P)eV<8(6R2-UTkcq||-KW`zz;T^p zBmNR>#CxeB|JygN%=voW-;4b#nkr4LLmr%z5Rr&q07wPH<15OZ@Y*zDX_ zG--f5iqfZrootr4xCSVsWH4(tFDMhYn-F)U8w!M6#Oamt?B?u6kSiPZOPJF4a@~vb zmaop8+dM}j`^MCLB7BL>5*zVA#Mz`r5;mhqXZZdz14n*J-GFvGA$E_ww8Vw6A^0a? zF?zC=J&=~+(NwFKq=;a<`o;?%Q+_i&P0OdJ23LG>!!-Tc_L=jx)3wU|Y!-V$zNMU^lADR)aCEsxzKcbIpi6NC<9z5E9d;=Jah^%XbkMOL)|;>t`3p}is+CZ z&N%io%2X7o?YezVz)m-}#93M8)}C{Y4kte|*0rWS+C8vhyMcJyvq@fA^wq=#>wsS+{PuArW3&w{ZzO`QT#@ zJYMZz;w}60@UXCG4S?A3Tr>e2_vPw+X8!L<^? z?#KNaPedJ*>Uq2ux<7*HjXOg1Nz@HN2<%g6;33<=?*w#&7K6s&yq;H#_O6;aTJh1I|Z}s&DgUZWngbVTY70&Wf#MguG5HcHqgAbfj zEJXpv=!g_)X^GgRVh(VQuxpR>_a9kv=@$*-)6)~yTQ7X%k+mB(p2JSAx^w@&J6C`E zgz_w#Ret{YJLawi8|V64Z@h{y;y|1L*yS!bTLwyXygU#H?66NFRtIJ*9}PDwp#dyO z5_rvUwSqT;J2+yO)EUt~Oy79*?&CeZ*Ic<}!^DcwZoFiz%6qh`bo0`!dzJfWVc$T{ zQm}EX>4W%Q%fSxuQlhf~QSOLA&*&hwG^0ATT9F%KnXm@16iSkP5nQ|+_`-Q~d8#=7 z1y4+tE?Q(e<1OE?ZCiQ2t+uo2n*6s7`?NECS}?=@GlTuX?~e_ri?DM-mi5&{c?%D4 zx+1Dd;RwnQsf@+YmMh!6>ZfpPy>}T`ZH<$x&kI%B?*sFCW#x?lg`a9$r|LC2!rX{3DxHezxg`fqaF=Fy7OH z_D2y|e}&kQ(EyygV4`luKm?jnQJO3$C@3l@;-NW=HX+HnAR|gCY@pY)uWcRQ_}ZaY zx9m+OX}R(n_!sx*t`9%tu_OUvInedAH4$@CgPx99%*+5zJvETcMyl6GMol_FzyO=W z0gX=WHvC422Nr;*uYIX{UezyWhw#g%K0iJEz^?om@L4EN(1E!XI1|`&U<02in9?1n~hJT*p!J%;sM3>7lw!&_p#HvZdx_D`m;NpT=#WW zaL@R6Z&zNVapigZ_v+vF_Wt(u%-y>iW4<21SUYXZVxS|X)JTWT)CkfhM!KnhS}cYM z(0P$jJ!E>oc;Q`l-GJ#(|0yoapAHv`4|;MKB0+at*u8y!*JSs;9asF_^fWbok-mQ0 zsPfb6ug^>@t~}3Xm6vdOufGnmsYut*7loUMp40$iM3^$cPpQa8bRw`}ks*hj(Lo&~ zmw>ntJQzftpcY|CgMko3jiEXe49LDpq9=NT(Sh_>akl}}ZH6MI=GCDbfoB}#7+io( zL*$>Xt-kz7_}JJ5dnTJB&Op%LyL4>r@{!?@&HtwSj2=H##QwOaVdct(J<74|8zy&I z^o4e--EZ$K>#u8WHJg?u`Z{~xUcL-?)YEC~C2%X~8Xedbz*(gEz%Eh_T@%$Vu$!{E z_V!Vrl+g?dx4XEQ5O=w|%u`zIDt6kTlWkGRw4hsTfE(P_62}6qT-SK@RwKQ_uw~7< zt)g;;Zrhr9PVxm8UvgmXrx#y&<;9@4AqM*;c9KYBFku1Al9@piO65z|YKM?r6c9`HKmdJed&F)>1`*W^5@h|hZ(nU2i2D|o1j;K*E6v~9#%AXpqrXVB zJMAs5GXETu0P>!|>`TIH#4nzw))U-Iz7AMm_R!aX-Wr~Xr|ZPy>?HA%?|_WiGwczx z;mm~4kMJHuE^n1T`B^s@uXeRSOb zb*xf-r#jZbW=RDg{L3iQL$^+iwpYw_uST*h9#RFlWDK%68e|ou9NRz#RXZjxdY-xP zAa>mnq5rlk6GrDZ9>%W|yXg}LwkiLqhSO;!UU{#w+2z0Qhxe&V?-WMaEGb2sv5+wX z9WjA*!z=~{=Nw$!DYKD*_S2Lt(&d*zYYP=SBS~=5!M|K6)G647(NSytylCfRf4BVg z;|qm5m6Hk(?L*AdiZRa?IO%n@Ow>iFAY$;-3{3Mt4ywzR*YPGTYMJXsqSGNfzg?Gv z&}VHRWH5Rma=~-z*%G^O=+gtD^cM%FM*BNjYu!?XtE@a2YDvjwjgFqb&$4(RvZS=d zXs+;7c9iHBg%=K$!WzNHUdv`lF|VHH^g##|g0v_h1~LVnaby%=0z9!(Oo~}>6*HLOMfpSoL>F%JWxWV7)_2Ye^k)LJZ?>FFk7AdDE;CLo%D5Cy9CoO=%L zf5>||<(PWQK{=5Dr|-UGj1!Y?`oUvw`uWWHwON}i)r z-{TiBCexH?fHuSi-PzyZnPC|jP%;NVp)3;;Q*LvL#(7Ji=y4 z6-2cwC^O{i7T7mTFd)~rYA1jJIA6I`kxDS61A!oHBjP%nc7ZIB)DjVfbM;HpU>T2q zCU$_|r2InDFExGrvaI}+2S$}2qpc5n{ARS{Y7=2J?sb^4R25%#XJ=ZqsX;X^6`#az z28lqx72;GFbLFxC9*t|*?d&A*Z$TG3CuP({Mb=Qo1RWH}38ETT6^Tv|b(k9j$`8DU zw0pER90-JJz%d8?0Ih|Qjvp)lB=^g9OU`n0LC90XBRJXZ$$|EgL|J7p+&pn?B;&ZR z-LY%RX$}PI$6~9dlyqf9Q=~c=u7Bpr;GnM|5L#qj{k8q7Cx6xFZ@z{`CK@8En>LQN ztf+BMbT>4{n_&OO(^iZn*MYB8K?PP@$wZ;f%mgZe4iup)Bo#!h#CW6DbE#cO1_Jeg zkj_}Tpype|&Rk(j+|AgkXfjvZjqK~rS&j^boltpp^b+&KeyxFduM3# zz}s&R&?CyXDD-H?dy>`T`EE?q7g>xtQ73@<(gE4<6u^PNW!6-*l~~av&unCY=l<-V zpX*1h;XCf!_OB;*-*Dr$@7)7Oe6jMcbT3^B_(SCf%FhTz?8O-78(R}G8x;i|&~!rW zD$|Q>2I3z?Po`AQPWxUbaoQmMjR|+Wj^~BIBN78~X2Rg8VDiG?c(7# z`z54B&cmV%0;~#%-sly;X zzu&<2vhkb&6?x1k7gm;uZ{$GAjJ%R2Csq`Z(5_PBMAP$PM6=4jK#rK-;WuE6sx=WS zrc7s{dZ>cd5ugFgyesrqv&zmzTz)CD*>C^04c9O`X7P7-GClmEX18}*H7!6DWu)9by)TS8qLy$%XO9ldg+CXhk zuJs3fXigA=4`YzLDSVhicHt+dBf=ehr`j);Ju4_Z=I=z;)-*Nm>%Z){pnxP=rEggCey!G#`G zNf@=?FeE1uQgd^2YjbN*t_{mIKFMq>%US=t!n%0qZ|e?l1} zNqJtEmQG-O87Xj6jm^%vG$ZIUN;dDV>WA)WpQ-1S#R;O2~fck`UWgv-96{2QB9Ec64oztq@39L@*FikWM6WMc+# z%sT*vOfcO*GyQ|;t9YIO55&whyU}eR4e8Tt6+20s!~+o-o5U#aGV(UGkmlj>^7d>R zv4bRCE<#)$S80ixIElmW2xg#Wyas|Z=0H+EVvGA+5&G1vgO{$n`bL31C2m+dwH6fW zHw%@oir-=1;_?09FWZ;C<8tYvf<-50Cq2f!+0_? zehbs#IAR*`c_^TR&woj?BPiepP0;rYN9YuwYPA%IW-6PA3A8mBEOymW_8EQvb{$5d z=H3P50feDc%+$Z)cdb>|xDG$roUX(8mzN|H!-Z7T6+knQ5$FR=nQor}l55DGWTqyQ zae^3)5lCf5A^ERew7fqP*OV$UgxAW2)Zl&WWGt z(sis3<5IneM2XX874a-|Fn>b1)_7fJO1@m9 zJUgc|ZF3Eyf|wKw$PKFp^i+W4zQ8u~Spj|=5fb2X*ouwDGG6U$mt)-F5F$>Qxp&`j z=eF-3yZT=62JXA@TH2z#K$i{B3gyq#sJu2n7}P7%pCN_-aT8EhAyNd;12Bb(BAJJq zC<54kIp71_1eMgXt4Jx+@^n9Y`l1_dJUp3Nv1;WqP~_Y8?A%9%xv$WYzU13SGEooA)=bZI`hAd`5t*LnzQD#5Ip=E!Nmf-stB`<0mV$u*Mi#Ur zCMrK9zW{6tw3cp(MZ*!&qE)R4rM){k<74iM@#dC|oi`qyoNladTdtc@q@|A3ojozy z-m(5rTXR!$bMwaDy@#kU_ffoMYWJc6-_dlA&GLFW zH)Tj_PMBU`5PwF$4s-MbB5)bsu7s5M0zjGwMu{3~J#&I|Zq(X!ckZlifNL_4GnfD3 zHrZ)m51S=EU{)^%%pcT7iNd}t2n4Ec)D)mY_BsL(MbKVmD3)iIWnQMRr*}tZ^XkR< z78-wz{PoqWh|?$YVdm;vRCVBK;V7FW)4 z7{oqwRHQm_A2@&-G8>K!pBYTc5r7C(c2XGrkh2qF=kp06USZyJ=*g8Ul~H~gQ13US zPgBSdGh|i<8@vuNo~00O=2dZBO*3kP`kLhBgFa}S_D12RIz^9 z=NQ85Yk4nP+joF9Eg^M@>Jq0(2VK1A2;h)%rlP7&Tba#P4BHM_BJ5$=oxz>@AeJID zg7W;=o6n~%Q+02bI~;ZxtEd2B6|T15r^?HRFONG$to4&q^a>td(ej+^ZH&8@g3oL% zV0s;ZxuFOQ_%8qgsgdhOMh$?~iqfPc5h9gJC2l7~;T=B7ZvqIjz`2sqWsgS$dj^}u zu6iP|Z{75x2d+H4>7V{Zx#*lV!)sR4mbN)IdtkHqSIR@m9dxK?)nLE!D#vCBCbZov zpu4&OBlEz4O?CQB7HT5YV4|ChU=aZO9iR@NvPunHqtRL60u%}NUqX^36(H=-mxI>8 zN(ZOx6g1R^U{bEtU>o!$3&7>qBYGp5%)xFXUroMEi&Xpu?)BR+?#jrkxZg?%5qLZf zic)iP49$r~yHs3QU@;p+!C`}l5rnZaP1rM`7_1%O5XekIBOZ>s;}L_~5H_%0j&1JV z8#-@r%glwL{cT!keCI$%-^Je??id1M1>Ebx-E5XrL*6K)=H4nyjQ7mUO}?om={#9E z?*LSjuouJQpO}2h9tRAPx911R%k#j|^!mikGos}IS$Sz598UQ+&V2}R{>SkyTaifm zd7K~cT-f?k95GW9VWNr65CahfgNTjiBMZj*0|eC`E(ZX-pBU}uS%{X1usnY;Wz(uE zJWI@9dmFS0!dQgu|1fsuZotk=PEKEceLi-ksDHzT{*AfVnQYBa5%EH1)?Uo? zB6R82!=}{fbDL>eSpdCb*X28R9+B6r=ok!!<yLl=z^&6>M^$ORD=0~ID+d-um6fZ{og7=-oS51QJ_eaath*Pn{C?7x z=rK@%LR(cU6`_G6BchIpGtl@8b1|J+=Q&D}9#3(x$M5k~RY3RAYJVQyR3%O`gbYsA zHd7%~&Io;c>BU>0oEqD7U~&8Bt2Z>q+dC4=5*=GsQ+J|c#WH5J4=t^0FM3S>#Xwzk zK)JvdjRe1q`U2*AFS8OIV6&0UhY%9uUIiimbVMg%?E|K%6cSW;QStj91; zx|8Xdb>W(<*#EF5E5h`=GBH?E<~9`3k=Wv^!k8~I$o6o= zjd|~Qgay8|^|FES{>!&~>8g!;2F3^XPSXhVlaR>Xk}8c(-|&qWbx2U}$<_sM}e4t<1Eox>H44GD59x>O2P`?^>p zzO?Vi=7Z-n`G*!=Iova#Z)xpoZ>;IAs;^G9Gp{evP~U2`bhfTqv$U+rPk3}xYabrd%rvLuRI6hEG9>^>ltXW@N9bQBjlwJEO&ZzH_Wr(e zx1>xk>+fUd7t?QK&&^*19r26*3v`{i`l8%%I8QJxn7%<@L|r(Y-pQr}9VsL}a$%y- zMRUrzMjxt$`g5(A%cznnkap~v64UCsp#FTJ!mrE&6A2GOUVTNrs!FK%&8z*gomu;p zzhvp1{Nk_3z^J@3BLsFdr}*nfzdoKX6s1Fz^&GQu?zCJpDV7gV09S$9aYI5$L_9)A z9zO5$y{T0H)my1odE@=}ne`mv+>o%GezT~?E~t=;V}D>6Enb?!a-!-sb5Y_km)gqCl5kNdlwgs>TA zB@)E7tVW$c!Q+K?Qt<+Af@Fx_m9jfR*WTrnHx8w-&DREnSSAL z>(1f5m$vR4x$fF)k1_8Tj;y+@AOAD*!t*ZxsEyD6U1nA5(9|McxQkT(gV&)U(9|c% z^wv`;dP|D_Q0WBO!@Ew`F$dTWY;8slK8^Oo<@ouarGKD(K6nloT-0tNyEBBsjj&=o$ zD`z*~bp5oD+GQCs`C|>tszl*@r_=niK_4*C<;+~2fc+zou5=yyBl|t^kPul+#uIBw zoJ?ek8Y;>~ooF^Nq7y~{6*gotGAL((MteqqG1fV1Hkbs!OM*k$L6YGx*hk^T;imdp zZ^#=|t)x)ElBosvhb4oWGzXeix8#;uAVwvr4I&~{(4og~kX)_^yJPjnHKU8hU47xP zsg+YJ8^;$dQ(lcb8xo6}nj7e3bf&w;+3aK9&t84`@m?iup#@d)@yoBext$hTl#e?V zzg$V(om;nV-L`G(3th@vRX&gdyrW+;D`5=!kWdmQgg(!##18pv+x!~1EyxY337^v* z$=Mn>HI1V+go?-L^QrPR4Wr3aO`W{V1>5Eq-pZAuKmK3M4OOLY;~q@!WbJr{pypbu zfs6f3HE7f4z|H3&*?-UAAcjeW<#s1qhaD}7Rxd-s``E1p%fElZ@pl{)vb8FyY5C;FG8n}oQ zp>KV8)OuU$r>Wzr5cnO2_3TjBc18_cY{6LWC)dC^BlO_TgX0gU26~pX4fL;|TT^Q$ zCYkkqMTinwumUb$BA;9Vm$?kH6>!c7yBQ{RN6y_yS9HQF(x#VpO=jf9 zz-JIFcvqG}1bbfXTP(l!&1NISR%(NAl%#?}WvqPzhYyjGU>o2o18fOUkys9`yYEyg zbt=_)MccrVLAvbjRcon1`3ti?`|PvIUpF>2K83m%YRMkLdj$HMQM9Lj$h^b@IAN{k zjX}*DB|5AvgLYn-y0^}3vpQZ|<{_n$Ex>Eb0^oyYtbdiW2#9=K5!xHCtQ(xzb6MMt zf$6^b%2>scQSoO#Gac=AxI5c#x$>OL``X&vw$;lA9^mJ*B7K^Ei+S^F-i(xD?~Mg& z-saoXUgCkWyxf{Mt-N23MRIE1S}we3-{$`M@_49yQ1|l7`mRp7v!YgB9b?{Gj(+Cz z?Hw-1>WP8X%k9qAa;V2kr!lks&q4w5Q{;O#{T=xojHllsgf^mY!pBblZYiBkf0(W( zFXHnbpq=)2f;DN#28%UmJdA*i&O5fnW9JTTyui32m72C(nCk6Zy5vZri+TGlUA_FW z;bZ54eRb|<6nWd0joY8!xC7QB6GER;_0uQRq-Cr`O+ytI@&0gHO$%i{z2{y&wQuX{HEnIN4!G`Kc;Q#|Gs{<}|Dmq2xgPd*X}TWe>nGb2Qk5Obi$=U2 zCJX@xX^?~6%5~5=Pm7cjqMw9P0o+YdAei%t6d-z#!#U$`Ind2de3D&~?2XxYA}?Lb zBKZMz5l3KiON8FNGSJ`U4c9vBYHAW?sbn(s)vtDKVBWQ(%00v5@v>f<+#RQ@TNgFe zE7!3N16}5!fiJItebeypt1@Kk-JB76=)%hm+;Yx2 zsjDrQ#0UC&dJ$-`__4KC$=UEO7>`{Kx*cFd(pB?u5UCc|W$X9qy$mXDW!AV6u zgQ7P|Owh1t-XJq!wINm70Gb3%npY23oAVI-wblt-Js$jNEsbO&1o6|h zfFIM}NQ$6pHHZ;_+J(qQo^E4))NR`j8}Mu#-gu^hyYhnHGV3pPUz)4q7}lzMh&IUC z>fmCT(v10aaJ;!1`cN{|!L3=GZ0t=vv-|1k$*!&!UU=aJ^x34xALn-u#zsD|1}^p~ zHE`M&##J%IBlyLvqCQ!hSU+%HDs|1eJ&#VUYj1~d$M2t;dym>411=ICGX{G>`jpzY zY?NkR?OP^9lc{}^*^v!fhQ}Z=YeXn~fpblT~kPPbtz zJ7vP=lqqeb-{+kBp7dlZ2{WJh&*#4kpARiQ@9Dj}y>rh!=X}riYxI!Vo`9m9If#n| zK+b@F4fQJ_^!p3|#M!Y{VKFtEkStg$o}e9es-M}lD?U0(7w6HZzSR5fyS=X>er6^a zpdT_FDFZ)qv6-boR>FLcRd`<3Bl0PfW`L~FSuW+SaFCT53WT|#6evA1mMTVE<*$sE z#laU`GF(TeR}6nRIP7c5(++&tSXbqLn(6uwN0<6T*%;KIDi#S>=X8NO< zp(Sb1fyc9XNmhSl!%FmLE+5OS>j#h(zz<4Wij?hhU6(1hrgV;D1x$A)oK?!xLP$28 zm89DtB*_Y5I*;gayW`-%tB1MEZIJB)QUpXskC_%qkg_ z%D1Q`-;rC|VxVDrv3tvfO&j}ahdkBA;qqu-UsTgHGSEBnhdO^nc}cnJ>t~l6$_qTz zX4>IYfAQjF`+FUwEhghx>o=?!i*`)_J)E(x))lDr!}rmg)S)l53UcF107q5I6bL0f zJ&dYN81#4p97g5M3Lu@|wT8wB{YhJo3^eNZuUIYbOYg$6Q2BydOtz`m<$?BEXNY?n$;q6hI{gfwbx!Vqx(bd8;m4Y(C^BAUjW}s9x^xsQ%WDCKf)(N z2%Qu$Q3g;l-02R1r=Mu<3_)ZaruFrf(h^c=hlruTab1e)`iBzvg~~NOCi?q5X$> z^K!rLresoCX1?S6;zMh<%)Vj^6{eeX|pheQpo{V zB7|yv282rH?X?rT-e{~hVH2p{9Y**Rx>tBfT>wyVx34o4QRT-5JFRiDqtcWF^r1g>7+Ums9?9bZ79sX+W%VllsePYGB{<+9l zuPb1Re(1YW!JyVW!tB!EDJ!vh0Xvlf*v)w{f~VSIx}o&j`$j=CXTE$zY!>QmBxhL< z*sY|Jv_+daeo72%gB3X!K{Y3|?W%HlTzX6>%m{AJ0Z(N_x>=7r(!FV~iuUxG_03vs zW4?BGd|uG|vfb_BlDZ;?rA!~(dO(bRqs~?)OR?>Mo!S%Cdp&@iqLkPT8i8Y{0IKJg z08u$~E_4ddw^By8BkIX=XC`v04UkiLdanyWQ!YJN4YGcp5jAznVW_U}s&8_*H16W& z?*7TMm8TsMx4tA)Qm5`!H&^#8&|Y%({NX{awpprY#|eW<&dDU=&wqsRX7I%e+6r<^ zv<(C3<39stN_KjHeCr4=!+9Fa6gS->K{Y+HICW~MZQ6uE+MB3%B=)3uV)$v(g14CN zwbx$9_IQ(9aQ)_Fb!UTXdz5OO-alw^9*k5eN6<`>hQ{Gr%)T8SZ7Q4g&6FWPy~Yq_1b0{T49 z&;u;>W{jm-LC;&};-l8f@li4*Yb90)sc}6|^>TcaJg~N07aNl)deE?kU%d^YYtQ@` zqH9n}m{8J|+{~WA9F#~jWXR1CREUvML1m*1jFjB&1Zc0`WEQs?=k5 zM#(D&UOhZ7QVu4slxqgx1J5}vNdEUy~c z(6LaFNc6NZ$BmaQ+qdYNFE|UvM=Xx^&V*}dJSR5B`vh(OEA&YTg{7fSzme$#LR?%Y zXpS&H$}wLD=wo;v#Pj~fUQOky+%G;C<@kG^!*YbaFO4D7q5N0k zbD{2%kn-i^69chkul>`OQTxYegv0}*)o3xB3Je8Og<@X&M}%CUSqg=J+#F_>PC&RQ zkLvRG?$ahd)b7tnMEK@66Wi{+H#KIwt>|BZF?${RfH4>B1GZgr1oGXa_&tsVB%TPG z`yuyAlH>hcegx_cr{v&A;_~m%mr#zj5Z({*4tPF~gU=*4W1e1Ce3Z-#&Wexv5tzW} zJxUycur%l`o*Tn1#&^BK-^F;{Sz9uIKC91o6xq~aEB-5_0uR|$( za4Rj8d|t|A0CPlaXU0Z>2KmonqvTfe2dU<`NVL33b=WKc7jZeG&_2)nT*DgM99m!exDeUd^D%3$8 z$&ZC z&+GPJj3xzKO2;bo)-)aifJ>>PtWe#tp|y3TDYA9d*$t~YN801H)sbH1bfT=)Zg2Ir zFY0KaO#okN3UB$+zLEWX3#lph@_PlsQU*(g?Gor7PR2e49G>5pQ%ii@|T zTeNoI)x*!Fn{gA2k2m?T0Qn3~u#faqP!v*hbI(CAp{bG@n`{UsnUR!+{a89Sv^I>? zW!g)8GWiTv4M(U`ZaaN7(m1uHo{!B;@?*izbfg5%GDIyvVtxj6iR&qjUrJ+tvOtm~ z%Si^66a2hwXxGeXQV&{D(3Z)wLmUItoIF9_!rZSuv^$i^k6AbRp|jzUcutF~O=rX- zb@SGMU*S8@8pSlN2u$wb0~CuT-h{SzhfvSL{`)g*%TdwB4Pfq}jnqdMn2c&+9v}&q z4z}kEfTYwc($`Y@NfNa2xCO{QNB zd^&3O6zHrU?jFriI@(&TuCfAU!Jon30DAK11Dm!r8y4q#$KoIT^rt5<=9CNw7BP;0 z6OU|~iXFznTqr`P;$S3jxH&S!3cx6Vc!K}LPLxVIApo&!I0jWJ$&?z%Xt55h3y#dF zBqWtb6^f8}n-tA7V*%PSb14>}H5uF{H^Q1Y8hsUFJnRjBXkT!%(DFI!HOCE7QQYga_U6B5XR4b${Mzq>f{9s}tT38dP^c%cR zABKZ56gI|l{-Bs#fc`(=*fkXwNfF+LQ#5&wjSH-fm>-XkPpSSTqZE(wq zw_KGQcTRP-H$@fyaq{CGy~>)a7u5Z=X!!tS!tdYu@<*ng+V0W3n=f=Momx3@RJ8rrI+!{jx$wOhageVoXYEf z^fG$E`TKWCX&pVimqk11$g=GmDlcFPrPF2+ zR0<8y^Qr_Wz6;c5@WFdz&@8e$h0BC2J(Y^a38k%&gHw@t8|1P`&@DK4rf;2y>da=d z$L#i)-6j`S3HPWth|87Mca{{AE2Z&FHPwrkHkOn~N^ireU+Jco_Pa%;_sE6r3&wLK zz4yff&nmuh-hy*8^d9(`Cvm?iA#UJQGf{O;?&&zy!dW@h+@CmxwNEBm zX}&7&(!{|B7OwybPROZGZWdaZjud}hPPOoVic<~rO9rPJPhpG%)pAa?)@}Rkz^V3E zorGLsWAWmh8?H^YQSh6bZXFCO-8h1Wnls$e*KDDqr1DXxFp7i7RpHfy3`q@5uC-Jg) zf@C8vfuC(XkkexATYuC8)sUzXv(^-1CCoI~K#J5#cmu?SI@xCri%?Kn2GtnTz)wD| z5c|Fc^F6XXKjqXy?Z+d*@cgu%W0&55TI~dVHWA@U4EHTvax>P&)`86k0RiM@5hegg z2;?VBsXPPs2^18BU~N#(W@EZU^V9VA+IvN=menI8Cy$HdC%oR@_2`S7|1L-}|Ge+Q zeE91jAO3sv+T05;C!Rjr+nczIXT?L_=PV%%Y7t{5B=^4wC1@+}!u=cY=%26vEpC&?$NEZ0US%dp6!Xm7Mo3BP;I=?NAZxFYd- zeS1^G@3B4b{sgo~00L87PxL_+%H+MXL6i(g%=LwW$||lPdiPs#x|F`1urZ*y6ZzI2 z1kQ5hF!W9H0Z?70o_Xv{ym!)D=JDQ17czM7pdDrjUio1DTk-#3$M!9O#_SV0@90Su z%8swJ$?=tTU|7uLyi=Wm^DYP#ITH8jVs#dqsn9|j<5%Yu8p}&RMNMmt?!M^mgoS=1 ze&LR8i`eh)vk=M6#&>4}eSn2C?J2%HpiT#m68!7bJL$LHeCC z{CynfWjM|W5o-r?`F)|3xCE%q$uyrq2_snlSc5)v8l0q!<0S1QgYQl?m+vlxlWcut zKEr5Q~5X9c)Nyk-@N9^K zw5K@mVEs!Rc!-1Sd2`Fpo8$4;AFY$t7Yn`fj;L!`6^_$1`g%VgcjLPXlC$);IA7Uu zkT&=x?6|TpyGWrDS@5LI-$;KO|E^K%Xl}MTOY$`~7CQL?efRmT+d7Pk3j#yyX&%lK zaNzAjy}2(vZ}>OozKJAHun_AYO!#7I402c~lao%~e`yh6>JQ6_zaOV}(RUI>@X?F9 z^<#Ygqxg3ud4m2KpKrjwfs^iWy#9aT`$+NxeT{`q%}HnDoOG&roOF#vO-tJH+geS| zM^_)de)>quB6rS0ZB-rpYT`D!9@>J>#Bq1`Ed0qi`2Vi%!j zzIS3GYM4uar#dqM9(&+R2Pdz(;pWRHue#yni>qeV#Obd1s+n)?Q$(Yx{pao7r)X_e z?LTjNLP2*cC#JtYF+DXYB(4*&f4_%0QK)fFDiHe@;gOf#~T}$)WITs)oz^``R%VG!2pF?ys-b^`9#`(B*gxrOE`+aH&VR>VIeGcy z4_7=g$wCPWeGmTSZ4_$pd(FW9+2q(i-bz_ApehUhU2RNv@&6l`e(pdCsb1BWE%$IHAj5ye`4V%H>!yr4eFw0FmJcgK$dJP^kT#vkjG z;5VBEA81SC1MOr!N1iGhN1i#zZMwK*&~2U=pP6K#=Mpb9bhZRJPb$2)Jexf!;sgH^ z_T(IV;J3k^yyp)9~YEb{_cg()hsbd-rWQ67Ql{ z#^3Ai?vD1P#^AY=FR)O;C=LX2h4)2HITkXdu^9m)XdwK^<;hj0`SD=yNP`5yiNk($-rlpm^_O`3FY(yEeX%8UYQ@;(I5j8! z!a{%e!ygjwpS^+Cx3ncsP{{FT0>`dP`^)Fx#Vbki;+3X&@l>ba#RFgt+KT! zek(nkb8FKiJ%9DeC!W|=>^MQ+@9)1ijQS~gf}LO;#6XJ4ZLy=4;qh#Ic<|Xu*uzo+ z-uR;7@u)XNiU%kxB+jz|^uwMe#DkkN$n$Jzpkm4VdnYDD^jWddky_vek5)ce;sS?q zN7!S8DegRY`K~ROsR!cm!Gir~9X{MUw6uqHeC3*JzIN@!Ny0+!oqI`wy!6MdyLLd` zV2(?okFe00c=J*tKA$%a4xixVNCg9oDUjkL@tr$1UE0)i-p`|fBAJd+z^7btV>?ShFFLc0}q6q5~cohoO#j-m=ID-AUn)hBQ9d7&f@Q2;rR>T zqv?^6B7cPrSHbP{j=Zn(RdCMucu|+mUFY8-Uk$J}+YpNyB1{{`af1I*qHa13U!J6* zxLG|1J_!G0YAEh!mht78gY>#R7j3zF&z|^!1B21-MT-W8xT}Iby0E!<;R?xH0rt!Z z_5|x7ZgN+&K!OdrMXo$ty)xV%EKA7nwQ>48$a0mf-t0HR@|DQ)`0AD2hmQiFEm2C# zS9b5jM6|$JCNk?8TyS>g%z9FUMNX`j(t_-Xl8L4*SLG~^$5-U^Zi!}7g;(!C$wKch z+0mS#4PhMvf0qJnnp0s3Z5&HzpTnsK+F7c8#36k&-Y`@fi~nNB&u7+jE_~ySH{QT= zPxa4!Ce~Slz4WwLLYs&sw9_nndN3N|3ptbyNO(AwunS*2vM(M#yej>6cs~@)J^6yz z2Jm6r%tB|x5~e*FX)K{i4&_T@37zcb^?TZ^RmRJ@DFWyyshnV zh_9gyCxC+su!Nt7L(e863hmiB^fH=~i7EsRJ=>bKb(0ON*K9rzkH3B?z3;L`i4*6a z`&ayjg+BXnN5_vJ25=>C=MB+Ygj(dz!^{#Un2Xj;6fU4aP_hS&xOw;25H?mqRk}DGE(Q^;A16|(n=Kff;E!wg4-V=27QSH>) znWeRUV^L|bz;^DeS+?vSO-;T)oi-;_AFk^>*5CWU_>v{d^K)_v@(ZknCeSf%ald0~ zz;Z!taehvQN)E-@bLC3XxpJjM;>jzvI&4L9o;+1H`gqQh$7%8|+uhl@dvI`fG`f4R zXG~2y)T6y$&PhC}Sl-Jzx(~$Tm-loZoSr<`yLe)HdLps-sST?{jyx~xB!$3{mqQuR zNE~^faMB!k=+3iC9C^4EVm-VPaP!%bBhT%@Grq);m!`;Dd(&2Z^8&ZWp)=^s>YLAE zp@fg_X>Bk>RR(LK5p^?s>t104aVf77`SA`BFXzYerup$sD27-EaiPyaP~bE5J%=ApmBEh}cB&t{=9>7*m2_!7ef!J(@NM?Lk>Xho;670TxJ?ITD$^cg zN=2Y=RENINHo$JyQk8lERjQh)LTM{vg2Ey&feHDPGAPX?LvKo@<;2kxQJf_zz;1ec zCQn6<3bC7JEGx%(pTz=;5vk@`HlL{szxnM=qjfdCjm333TdC9PsH)9f*OlFi+RXi| z@#&meMXjqYl%E?aG@8xk3C*H;9@Uh;RXmTkv(T9^oHh(#aR-2mD^GL)h^1x0RVY|l zdrapMy@fCSlQ{0+E=-L#_;PhDbY>hUxHHg8DCew0)t%?_U7)3cLI<@U00zvdXCeLo6}D2Z#p?F@LbXc9 zmlssy@Uk&@+jYm4sdv5KuXqFA#QjXu_?}Z>I_0xC-;IM^0^>BvfUtyxNEzg^lu)M5 z)L&_6r})JwI2E4_5uSDdR7Dv8&ryTH+MGkWqn9)ov;+7(*@ts<7_^C7=l>xgDF|BU z*vL;%j{!g4SJ^1*Abt`AOsA1DYN85OMFpk$H1v451xXQ=Dxb&Wt$_16WJv&^Go2AD zvbMsZN+icaJg1x+Z?vnus=TSe>+@asMd|3?);}H}%~#p&W8K}Oe>7XG7C1}Gy+<~e z)_MGmH923s4o~vURcG(mxrO@rd|jhUI&0dUhQ5%~QvqnENK%Ks>?$}50hY58u$)zA z=EN%jPCNi}sA$Wui;IwkASHR>uQ@NTUy( z@=oo<7`Wx@gUX}#=Qybj^rd*N#@u=xr3&uzk#pLmR5Br04$SB>LL2}TOWM~HgwjIy zh<={9+{eR2oxyeUa`Z1XMZ-GEl-g7A*~t|sa7gKmF8O#%It*Tlh|J|N-6$Gh@utZY z(*v&_M(+~5dG*Tk@a#mAC)gg=L7b!l`8-Wbp;A*|h6OZZ7CJk0*kSr+DI0XTTotYg zKxDdIdeo{s6O-2)%MQroHNMy$A#p%4)VHj+dTh_Oi`8l%vugt~JI$qMox69E4KC^) zR8g&U)yhy~-^KgVG;Nn$cFR?^wehKSV*87*{dFV)HT;pw4%%+8(>@x9{ zCF;TY`ua$H1QC`MF1=R8Y3V@2T0b|ya$dLUqkSO>UpY3j{q#MoGL%WIbOW_H7oVHG zyK{Y*xOM`V8&V9F2D9_eiCZGKBKS!MeLfy9D4{v~AR3)%AmzP%DMP-YWpg|}aLdeX zv}xJ!FU2kJ#iqKyv(SehVm*w4I(f6S{daTI z2lYS1@wWdL?JJHTmEr<=wjE%FSq&`Yo1@^Hwt%iM&&5+_@Xg6oqlH*RJSFxs3!XBf zr%wQ!(!DUSbUGdi_1A)GJpAe%5V3sz=Mb@kEe`nR*uO}=aD!HTN-X6ZRb|ivc{y$k z97_qshOH*4+OU!ROK;5GY0SH5{8FkhjMsnRf^+v)4ZM2z)0?Lfll1Pu(l30>LWzy^ zR+wTzfy>u@W5+o+fOUN1t{tC#N^^T( z|Mjn52fP{QhJ)`+%omVz!)4DGNO8mQBqmS>jlp18p9)5O`|d6KF5J8%*0rc-A?V!k z>E)}ROBi1cwYArCon%YSvLCV#DIq@azLu#^#SI4;8Ndw}hoUm2WU#cf)K}_tn_POY z+k@sAhgiy~;Q;R@GQ%k(VmS80=Bd!SDtoM^ZdqvWmL>7Q>Q3ck;-cb#L*W1=b&J>4 z4*Go+!!0u#o=Z%Q^bA)we>QRbzOd-at4N+;8(EmR$=ZiFoRY^QOI5&dD5r$8$-~mX zBYX<#xQzQIqFM=g3HFN^BbI|3t;p3NLtbv&I2s*uEnPp+*}1Uyob7LQbS|}4l?8%| z2}u$MBsCXKzsb?)}h!Cpc{ z&`O_*=|b0R80(I9_HN(xdRyl?KsVi68>$QReY2(Cav$h{g5)fF3;iAq(b_^FogdI; zVUI(bM)Dt+Tn?iL&f5~AHmpyl&N)-l&E9H`hx;-T>F6ZRG@s%n{d7j25s{c2?HR6V zmUQ6>p%nGg8XlF-${UB#WX>ChvAV3haa?nz5SpcAa3Y#(f84aPU1_u*&wbL7s#Tu2*P5DjGDGDSz0R0Y?D zzJHM=4rALg|GR8{>2FiIQ*JuT>{eDKpH*><{R+q7)R@ea`sA2Q6>!95Vls{BUSPih z{rTW|TV#ng{{emmP}z^YAWP8%cLUdNaMnJ8wzCzu;R2;6Xx;wvMDLTWgEpb4_3+anVL@w?WYvtj!FV~MxBoBR6y8hD$MJ6)Aq?|dfNELvVL(prnQ@0HSB8i? zgtWl4<35c$WK}%Zw`;O|_1L=IQ{}7Mz^BbZ?~H_lO&f1$Y-kqq*$a{Z!OlX&5B7_f zGF7RG39KX=DO}29i`I+mbmk{M$EhMtX@9LO-K#Ok9-HH}m45?tGOPbKBXOAfalt1O z5Jp*uxPhX?-I^iZSUOr63?IB%pe!mMoNi?#G?IY#1q;P?UMJQpOXeKy;2wn~)Y>WVy5U_++fD#5-tq5)@@fUV=PTFk>!9rax z=UjdM`G*Uuy&UA?STUYI9^1J+P_H$V0NSOe`IeW*R@eygIP=PAdk4QQMC&v=@Z93pz8Pg?R(8XGc-R7c?2d647n)zbl`oa8sTY1qB?iw7V zio`zvOIW`DYscPx`|YM|7BkjSY)z2)2V0PnC^49nrQOj zWL4VFG#^Wdg`Zi<&m_SZz|Vw7G132`pARHt`SFiZJ2(27UZ6taDbd%&&VTDI)bYyX z1>`q~UAqSND#$sAuwz6`w6J??z(bB+YC;ucEn%z&qqDtqFefKRo1=xPQfZ0;UMH_n z?iU35^~B#pt6$plZ|h@Qw%&Ii5LACgHzmH3I-dsdeLm@LkPI&lYeA`a`Hfk>5>CJxZ^*oM~z-ydYhV2>;%guVprr$8Ra{rcVb z9>BTC_^Nu4uc{XSbbO59`Jj~%zUZcJie#KKY4qhusNaS8F|%wRdkpy(OTaG&MVy&Z zu||!Iiz-U#5*!XNCWi=GE+xedJMb-9OhiWtd^wtIsWBMk(--0il^#2=c=3UiD-SGQ zd~n6&`VAA0KYqanAF#*9?%1{Cj%A~F?A-p%z9Jh5jS%zR5kj;YX zw6l<922L^jqF<*I`l|rPWSR$6^c$$C0>4mTbZ1k*b|_*?z4P~9RCIT%Z@TD`>lMAd>Kpg0-=v^lRj*(3iwzrAZB!)A z!u1UOv_iiruU`f^b2qbN!~*9ygIWOzKm!Dt$;b|+LJ-m;KnVEb^+uB!6fr~{)Mj_s z6V^lJA*(*9Z)^qBpDu3(Yq3H_0Up^ zV;(`A+hfED^K8*FLKhRpI8<{9rpeF=z?k;}iWbXTTYP$pT9X262F>npBPW#sontj4 z6%SUkqYobFYZ*A_cYO=jO--&})cw0ni&_>RT)`e2IkIi*zRKa@qJ!sOb@1}5F5F)< zJnXq-+m<8CaC}M$VJq2F#H9s%AtMUFs&jqJ`egE+v(obK%H-SAa#|^q?~&xmS@s8+ z`~lHF4)6V4N-oek@TZFJmEEsA&hJltNC*uJ`-zL}LI3MDlw$*N9fO?KiE@tFgSf$m zxZeUl8G{PFOjsjRu7nUZQS0@3rN$aC@(slN)XWU6kv5JY_%;Dk(1iO?b+l3e%LFKp zVV0B=DyoDnkHHs7WY8}Sk86YV0J?xRjeKe5OC#)9;?-ZByo0U&HHBI~qV7RmtAITZ za#9*`e<~z)5_?z)X()6cc67n;c+^4|&w+$>A_z!cKLD5jBlL_2WIA;N!!opby$nhcjms9=J&F}D*RFT@M6#`6QFXCu(Nv^?YfJt)- zg4^hae}k01v3`2_HNl^({+oB48fb3f1l@UMLd_<|PcDT$D;Z!bagVk_E|bN`R3w)Q zR7;t_>jwe+Wrvay(i4NdwHNF(%ncY|g9?Shs<0Xi9*@2-M`I5dgL?NImp`RJYFs}v zLq8erTiD<+m08=%6CYC5*2Ldm1~YW%(BQDIJui2llkT7k6F*CEZeRE|FJ+GrBUv2H z*HT9GxdKrLj1BPeHR+6BG#q=Sj9>hwFynU#G_)5oeoY<^4!2PV8Y5UMS<3m?fk|lwk^Y!Lw=Q6W@V2N8??POC z-6FSFY@1Z*F@iX=FenYRAIg^>ym{czMDMz~1(k!r=`9b1hU%&tH!ft4J$&D;Z;VxX z+KNlAxPe-V>}_r*`g8dhxl~ZGL(tq#f04MFXpT|(!^G8)a1Ax6#kRUsIpRIt^X`E? zV>$Z~acOfwUn+kGG|b|j!R1hQBUAoo_7HJt^ISSC4~K+JxW|!y(q_8xS|}|34B=a99|i*x!*3F;DUsLj5%GS-F z2(M`j>y^v-x{>6t4!CWF>mb9n;&NOE8S;B%?SDzuelF+jm&t{&to<*g+b^`p+W%6z z{X(6r{V%24FUooQMLDc*AuL<>;`2qhG!KF#$NqAgk@r_-Gm3KFUrD|`*@b(hO9_sC znCB8c&dDy>IJmICaP?BzI!=#A*6Xryar5@U6NCck`LgkW>&WA!)e6Sc_4GKw_4j%E z#9WoqWS4Bb=3R$%DjTp+zAbs(32U$zcjNv{L?h-@9a zl3oY&e%U&BCA|(rIbR2&9Oj#TU$zd!=ZkWwAA%%@bs(M*_&P|P5mIu#4n%qK?}X4Q z)PKAN^%a1^;(IuCp#J0X8)>sRKeOz2?6K7T@Fuvm;5$#wve!_~$LCFH+>*1xIVk7* z!<*9hBxi-)DChgbo6`6sXN4J*^ZnsX@@MJ!qMVP9B-bWq+3P7=gOLa3or!pVU@wE-2q4hxvO65f;nl@jY6Rl24K9*yArppPC& zwG+-_qTWuO(V(5_Gg|7*rG&a$urED>&*5^|m$>{!`iRt?jCnaO%?lwJ^Kv}h-;8-V zF3k%e8S`>nnioPc=H<9FFDW@62T_jW(2MiP_wD24+0^)OIp4QMIgXEP9+k(Xc_c(U ztKvLLXH^nOcHueBr93X`FE<~DWS49lTsRJ(zxK)WS9+bga6I7pq4agxxVZVap#CyR z&zFr4T$l8hEpre&otpveJhFzz%3KNxnXFHHkI1UZT3N^^zB8Sr_~*&`b5=LU!(&~gODC3vwDsYxj?ivFoZV zvs=C#4pa_DBFp@>Wf50xjj17M?grrjBrHV@00vg0HdtN*q~TfqORWb$}WUm7nx1T|yw@(3~7jW(+#&yc6r6_8w_^=L30 z!SmZ7YfvR(r5hVLTKb0bFWA20{5{(jEmY6~MYOA?sYFQ3DxzKN_|L!p@N++Z(%#|H<1L_pJZYejK044=6HqB?~DI)spZGFU`4=0L=Rt17GyK5Vj=wAIJ2 z^SSbR3OhULb)b)8$yt`q97IFR#2&SpO}bo7j*9dbLP8pPnvC!igM|~5`6Eim!Gm?` z_Z#mwz}V4|C%$NOTS`22&WB&7pG^%W?&CvO@vrw;Z8_Zvm;VoxavuZz8~adt6C?cv z`FS~NrPSUs{w7#aR`mkr7yQQH0_Kn0J{dN7n!^4S6^#v!YbNfg%yV~y3fP~U)-L<% z(X$q~8qfZxs}lhWQ`WV4HPC8aW13M0Sqe4Lsv^ix$fJxfHlQzL0_g*%Y`;8yXK)o& zfQ!z9UE?Sxzr|vP%I%Pt21qCRwtYpeMp4ukaMu)Sa;D--hwJ0R!+CapIjw54I*QvC zY|dqGB(9rSO}8e#1?@n)6!fKrn4)@3jzATppO32vduudW1ve6N+P?E(hH2qb?}|Cnb%N!S@~XsYYY>uT#QYH4YUy6_`5E~t+VR>v1LM;9z> zV#giDO(tWgrY#Pp@i)_9IZzFumRpn-f&Fp9xTR1YMDeP;ijX@1ulcA90lRPhv;fWq5PRL_61slR4w~UVGsw=NNltIJu+_TT|no7FlEDJNJ zbbwqJL?~3C{!midr&KWTiBAzh=uayT3$b|hdYc%_5kDYcBKL5&b%I7XD3}m6YcaVg}Ps(!rUoFCX)f=nJyp>(i&}o9U=!AH?$h~ zUcqAz-qvBnwo3b*PDhB&p|hKfq=4jS41-^fJ3im)T`IE~;0L$wteftds*P{k+_b2@ zt-IOS=4FoSFCW}L(3K>)^o`38B|IC~Zd$i#%Y|;S&SrD668St`#2a-%Xp0V*O@e@* zB%OjF-!QHw7jb$8)LrR4YVH!k#S^4ML!KH($QkXoMw;qc+_5oVUA>_)uyXm{t<2#l zZ8MwJPKVnoEJjz*8(Hesf)&_;qaQpe1skQBojp@a!MRE_pfe}+k* z*XxV*4sXa09#RTltV!G~fo*|>Lx5O=jVj3M_E(0QHZR_O(Sb|1TzRmvOc`6|xsv`& zW8Ks@y07O;7hiOfDpC7f-$r}I%7JI$yHh4->AzrYYk$;JfMb)dRDkvXlan_F2ggW^ z-b&bOC`9|zK1j}0ardXwOl`PQdi-v_P}b0=6VHMU<_jgYNGRxWdIC8G9MPhA8p`B0 zdO$;^lT~G`CiKLjv)h)O6|b#s9I;Q+%MMKLX^xN4t%=(rjjOg?3a0`_7A6Di4(1?5 znB|n`F)*T_1Gr&ui`qaG3ciu{V^Y8nSO5@C>W4~w_>l}t7bbpCQE4{nl^TQqo7FsK z6yf%=6|GUdirWORKK1O516Ph8_(FMc+~Hg@HnsGTXJh3Ce|bgq!9zJu@@$vBy`?Ou9eq4V zHT_LuLC%`hmmRw90K9Wya+W>Ibi@a1siZhZfF%t%0^)MU^!_0-X!3c@9uH)~5YbBD ziT$9QQ)iKIIKuUx&mUypc5NDM>euA=bu3-)ES@TNG&EGzj4#_*QXZ$zT{XIYUu#Qy z(}kCeUDdt(VE@$ehMw=`J$k_dJqK6dISy=xe;2BWOSK!;h}H}?S2CG=GdWAEfYS@* zz#rBxlOImqZ+(XQO>phvb1ueno|$l-GcJecpj>l=z9zkwp1|jToN2AA`Ezi8fakD) z_#B=ih2w|MKfvXpf2SGFi6{qLkDxV^f5qn`R}RXzi}I&YjBLE}fC>#%c;_8%^f;#mOE{*6 z30S|~87C-27<+87!mVk9M zlbmHv)Dh*;5)DIMS%H#1(A526xY4Y)Lpp|st0J+kFxcqEpq_qWvX`|s6e|9-eJY3j ze#=HM1{W{#KkrRUFx~O+&O&-u0?bN6k)!VC3{o0T6B9y{TiUQr9}_|-Gsc8^E^XgA z7#j0ec^Z9-M{lfZcUD)Ag_+~amoD48u%x8bY?xX9oWa~uW(S`f%;jsqEvx#581K0w z(IUo#TEv(T@aaKYT`Hirg1Avh<~?Y8@I4rqihNPGQXwz}>k}Y2yju!Q4?_|l_C`?cet4UEfz@jAmu`p;_dS*O z0DW@tL2ce5wK{QKK3hCE42ux3ZnN}J_7O1?)q^?(^jpn$#7IQxk2FH`Ql(aV>7yHb z<*E^-%Qu|(XWMG=zhktHUibWxl~skInckbn2YxF4=T$55*~(-!>tn}>74ng+7L#6= zt0Mhs72{u5FBvo!Lv{h-?ht=tI0V6QtIto})aQ>-!!I}445MWwhbMoQ=U9;V#}xGp zU+H3ZKk(rDAcGz+w7_GrW&q;QLW&4*97PoZ-=tMfKQY@ZOi1Xb)fF_SV9Abrv9A|q3<3aV7F z0f1@2d37DnUnJl~%b`lndpAS|%gZemLdpZ>RX&fU%u)($qF%2?N>q~-D}hEg27M~E zSh-9zLDg!NB}jib)VQf{@0Qp_eZ#%e6D7vcxYoONqO91`9qg-W_Oj*y`p^ZdI<|H_ zbo7!RPA{(S+U&^r|dpzgh8$tFjoTvw<=ohqMSiH2@iN;`T)jq4H;hV*Ul$;$sidT&vZSKgTLXGbVL^Wa z*yZRYm7J!aff+wLHDIb7y}T=Lx!PP^KRL2(^OoIps}@ewTbf%(nvLzAj_!`ub1Gcr zI$dr~!SD*oE<)lzDhSIqB^$e$L+YTuQ(Xa2ex=M?|ukY3y z^#-lR7O?m+say>tv9cAAG4*fO-hO+0>C$bRx4|KL1kTQ#i`v`ry3X(I&RyC|mtKAd zPtx=iJUzoPn%gE|f4YcEv_Fdo&;8+cX83aO5%=WGz$!?a~kdp9LND9Q8P74N zp0kf)oQyvo_>B4ZXzr(+N1-{{h4CF}+_d!H#OHT0PwKsHt%qERc6#>fF0FSzMwQ^# zvfoSN?&k9Wai@&ur?2C@obtL0=STc?mgl>0o=$z;&F4$H1LpzyC%xZ=^EUtY()_t_ z{^nno=Fx@oIRCmdKW?pt{$bAe&C;LY`}w)3h`b>7D^qSKS7ebhtpnVQ*bn*rOk2$L zjCk&X{=xH^wq$Si`%A^RC_kscI>Yv8?xNq6JwGkqOL?4`pWop5{QOo#KE(Uy%I$=& z*ST_s$oG;dXWHV;yq%eH_}*^M`utLIwM-841?^$lGT>fHCdKE#JaKtB@Vuww&@XJi z<}Uj4tn$6|$1*w0Cx4Dl{v15-;B&NE%Fpw>{nGQ{`}wLk|Jkp53Gk%M{k=54@cn#v z+Uq#Zr};gO_bIQtaNNbW%leysKaRh2M{4}i*Kr=^U6_&a9-wLm&O~u zpTA`EAN(b6;`_P3q-d14+Yd1qncNO(8Ca)emTF~k$D1fmzMY&Uf0fCLU*PvUlC#t+ zlb48kO`V*jdYQZw(utDEN=+NMUl85}AB2EtNe7#)Ch{$Dfn@FgZ)hP~Y?C>;o)T68@Q`g{bej{C>KC5TX$M zN&AR^$Wbquj26O1PSM8eFE3+?zSvRU@Oab&6~pP2N`Po;ANU>n6@!kb0R;?-#34ka zUokilH5C>r6kZPiLoFtSPEk;y)<87hA5n?UGYGLY$o^Z9{IkLD`L1lDPG^zL>9oD) zblQrX&Y~6`A!F~m_cwmcSp=f=zbEfa2hRRS`$Iohf2iR~-}!fD?~u^9-+kk0JCvHE zpl~s<6CY_HZRAi?Z?!N+H91TmY#`Fea>PmULR46QnP3_!D4DPhaxs)sxoWL|r?H%z z{+vNa)IIM$yhBA5IZDMke%C~_)bDpV2x)8eH~8yo0uGnwxBXRp_j2W|)e2uSCi z28cRHCh?i4`N1-y&YW9Vl;32GxXqgqAc5+Wvxr1DqMb5OvoA`G-_xUB{ zwk-Dx+ETEWQtg579NVM0i*o-be@uLj)KCi1> zrXIB#^J&$IL5iMb#FqN9sLHMKcvE(TnYd$K6zcz-{l7PhX3gk-cKv#q{!2QxkK7*3 zlj~T%0P50eGf%Ew3)K0jUUR8N(+`B|Ia4GjX9zUyf_Xo|n^jbyQ7YEW`@uxi!Wm{Ad3npJM6ynf)^ z`yFC#=v;X*&jFn$FCizhKEIT_E0cqc;_WFTf0W5VM{#*M`H4&px(MZ(yO=ktd@pmz zW$S>J8GW6ZY-tutem>MADz@jF^G!ad z8`;vp$?et$u@afzEV?wgdmf6SBre|h-J6cLH9Wj5*tw{C`QpBo_z*ShSQ%rXn?jBG zPkpPpvc{d5@Hd7QJb~*2aIwHi%s8(wV2tQLSZH2d2&~eAbs><15V?xQx)Agq3GI`+ zo}>kbSSVqpfW_f;A^z{+=LKxQJtEmS+;el7PPXjWwfUt#o`AU0y!yYqt^n|l3Pb}DE;T>*+4~#&F{4p~R!3QteQzhxOmU=PIjTq$LJmO_*P^L8|zdn@dQpAy;2m zK(s`o_sF;*rJ4=+Rb6o5#b*!1?_AV(O>Ykr7Fsp=JPRdWs*i4c3Fa2+HGB=$q&kT6 zA^n{PZ|C(Jpe#3o8V)p7zyTY91sv>R0S6!>l?pgS{9z~kT4MH|duU$bx*z|T?xufv zB=peY{(t`MVt8i;C+)nt_E?7jYoX~$5h=^4!+>P3={gM3Sj?@%@Oju<@4Mx|VfkV&CROw&)RgZqPbal{<@)21zn^Z9=v^YXkbK0Jci!` z6eX7Pw@Tba7N~|J)nVZE7cx|jtOx@Pmzft~kZQ&AA`D@+_=0n$-u^%Je((O7IO((=Sqb2xf#jCCy9zhe2O@_~Ny=GB|d+PG=`26O*F z@s{PwF7BD9Cr-_EcxnzrkMqEtT#I!VRASu)bI|;gc>J%FB@!(3Hs)4h z-36?XmVb)63sMy^LP$Qz$67$hCjdMRyzW9c7^WYM?27Lip)B;y?ZAtgLY@3@n-YT2;5Nx@NkW zMZbLAs>{3GWzE*2Ej#{bG&h$NgB}B(P^f$9AbyCG@vLAa0agP5lq&|*R7n&RyeyF3 z3U)+BmH*;mLW=#xK3BOIb>w`j>Euqy#Ueq>F%m77x~1n2FQ|35`j*6}mIPWV7Wm_B zL+3B-zF@#vT2@q4T3W<99Hq?`!={}(He2j1W$s0nubMj8{qLnkmeNv-wG3n9(l~md z{fIcHN~Wb$p`j$B{eV7CwO`ts?RG-!Uc0BfR2*I2{!@)^M(eYWv`T7wmJ$CT)p9=e zji?)-_C{sYCl=qBTU?`rL2{~CSwn@DHPmi-Wev!z1;`mFTM0fuo=Kl2YD!!s2}Im)v(b)XEjq<0#-Q~V_wSlKkDj@ zHTBcuhrf7X{yEbdi`v>EZJyZJt(Jh(V6_-rJI=oB$k5gejU81*W@jBBGx&QYd+F^)e~Wzx;S0_uM?XZ)m^n2yY+_9f&P^}Y)BuwRE1_ad z4I{l}cwlh1|H$~S%SYe&?Qd!Qro={iy!Ryd?8TZIF0_HHq$ApTs+t;N9XTki0Yq2G zv64|x1E}BT7t|1pLBYB{9;c6|a)e6Wd}-sqJqU%R)8(_l;!BeEB)ywJo5O{AH>J1L z+}97-OErrUrr=m+{9EWGF8G@;%?GPe`v6np{=ns*fe9mW2|_JZrsf=ZU}xvx-*qWH z5B4ilS4n>(A2(A&@oQMWlI}W99gGZZg|*KyHv)C&skPK8HB)wtB=%Fz4J_Zc)cm{+ z>;7ZtkHGDd44atO=tMqH1F^&W6San_h+4Hy0d-)Y>^dw%~P_&cqud7jbSzq6i!;QN%HiT*$Q_uMnv|NhO-`O+Eozk599`G64{(nx>9 zbR?Ik9#j#)GNJnoOJ@r7H>)nccGaVIZ#Z}RnmeAO;l%Uwa=I+>F)c{kOBm@$2I!~E zLF~j&avmyoSOivw^(Ngee*{y2MTS01Znj2PV z>Rh%^wV|!p-s)}Z?r34Ule3%8sqQH6?3?iiZajZ*Z*PBFqRa0;?sBhNHM0izujwIL z&Avel#74G7wS|-kI?UCL9W5Ikj}{Y36iN!PXeA*^GLt&JO)$s@P(f`)Dli~0lijxx zVwiBWQ<9|-CNPfoNMlds5L} z=`F5pZ&vLqD`ns4?~V>FUYK9dZmKDJtzBh@Od0{(Un}GiEqcGsjvciPk4H-+Fn5mF z>U5Fcbx>%|qoPzzfqM?fxDfWu?_4RR&||yp1_O8v4Mhg4*_5l#EiA|f-=SNhH6vOOHrK3lir$k?|bLaN$J9lnh*x9)-8jb!R_TB@&t?KLpex7r+ykg5*wk6Bf zuq1C=vLsJg-g_lZ9NQs@Gsz$u2zw=j7AT>NLMW>=O?YWbLP#3gx=>2r7CI=Dj+eIY z3u&P(Wpt#_LVWM{d(OR*WycAD@{Zs4eYAEgoqO&*_l##h|0l{096osPvBwS`Jlu8l z-o4jcv-g&30Ley&E$m*- zYrWwBwk-L)@A)BCx2%b5%Sg2kaFQK>Y#55Bm`w~A`N|0qkY1be66Jhnes>O8Fh&vK zMh@T!w8<1CgE6F#a5*{2tGB3=$q>VB1zLyJ5sXlpXe_=2^T+++Z9A|uMZEC(Efw|t z!iXbMxGKU9R4k}!*mCWTzOEauSst#cb9yTRem>50=_G!W9e_eOKbqn7FhQlE5@Q(* znV<}oV5#MOPhm0y20BXF#@w30m&&FgdyPQ$n%I@o&7)CLzzV@fND(F4(qx!7THaCDGF*LrYr`5(*wI$l*xB0TPjObY)d##y&WeTW*@3eDvW9_q zn&HmcrNPqDfHS|NzB$wpsV)!O^1}nP7G$@6mmPq4WMk8iV#5nbcJl27D8K~al@Q4D z7{P5D36eZHr?`NMp*n&Fix42(czkzcR6Ox)-_dXB21oYq-`|W+<%??{e_YnlDK_o< z>|U_L1<@3SDomfp1U0QU?V|!vs|1x=pgL4UI%st@qoC1@Qt}6nqF=#jO#C{M^)-~h zr(8dM)o3(XpXn|raAs(et%NzQM2XQ6O_)ljM(ff$@QdOHf$Bx)*RE@8SYB9dZ!L~? zHCN}9WOw3vw(z?-TUR!(ttl=FIr0X(x|&l`aY)9h#<$o3$O0E^j;51MPLBf1H#4;= zwkh(68miQSYGn-WWOTaz9N!g`Nyza-;#bB9rF@W$+1UWuu51c;&jO39z(bT$+1oO? zp)_bM-`ydeElw{*WM}QLzhIxeXD z%H0?2A1`dk{q&B-;_k&gw^SByqJSiXZ0TLRkDvFNXfkjQ6+?m$k&nD`@J44rh>TL# zzR}0^20HgBcsbTG{SX9UYG z3y)M*EDA@4ZPvc3P`}U97xH)Jeh~6k_)VIe+M@F6sb58d?#co~QdUz!Be##lUS1%Mnn}rB=6rLW zHJcKsr(Gx2P@sl~u!)wG(x1AyyZyi`EC& zfg3OR)Pa?rHqW&i-6g?^rq)$K@%9CqC;B_vJGf0mI>|yT!lONlqTV?f5wG^cV>dZo zzC5Uy30J{+NaRG9?QCh;+1ty1cdl5`Nk1&owrhNRcYFKp@$p@4T^qJ+-MDe<7Rm*V z@g&9f8DmNb{AVuigD(>Ik$nnJu!vm4DS`LQ#aqsivE(ib6kKuz7Nm%qKYf+2(O=Z= zsw-OE#3E%w{;Hvk1ASd9F6bz(sBsrpP}Mccp}Y~l!6HyZReWdjl{xqY0FEeJ1A+1~ zilFeLbBs^`bH~cN>N@7vtZP?TMsrtNt3SmV>WBo1WfU)~W|6Yq(%Qi^-Ed#+c?!>H zY^v+150-^&`C(pP+$i0Fe`XPwN9axoJOfk$surHcIaJtpX2$X7;SurqXZw!6pz9y@ z-F90Pf1WQ69h2)S8l@ZYXUxwOY7MBAqMz@{&9 zK5)?(=L7!YO;lMEAzk_u-p9|FGnzNe2Phg%Mvan5{w#w3_u)6iALA|f&eT2|Ywh{} zG`;^6{)$C7y|0hfB+~n{Q1p*W&i7qyy5_T5%Rt3!avr&H=QaD+7PPsqU*RmSS`lqo z85BP^|ALAB_BOfJMYVJi|G_4?-Z7*0#zdmZ@lo`O8@9;*#r2BGqmLdsdi2nt$GdiY z?ygkh6FiSy5ophm!nZ67)LwHDHl>IY z*IyHeR#!ARB86+(*`$AQxbdP}HuQB}vv*B(byG}rP%svL&nBUes^rCKe5Ri34slf= zrZh|>Dh)A}z*SJ1pb~I2wi$BlX&OP@M6j>EsH>!5Q%B=APi@{{ar?kcwJC+6?#^&= zi_5=oJDV&YD32^m6AF9%b<4x$Wt9$RSL4+k^)U>jXsF zpL$AuhF>~~Z?MB)Bg{3T?eo&OP7tTV}0aJx$ftviwfm&epw{yM0aTy4r=I=uls8Yf36o4l;vA=_F3ENw9#E(Erkr zVFn5;&&1{XxVRn@>?dXj_E}i~St)l;TtfS{k*eC2^{+*C4E8m+ z%d5LbgvJ%F#%(3tIV{?SPgkz!=-yP1gWLY?yuyauy_b!OmyHhG?l0aU%R{}=NqmhR z1`XJw))=jp(c<_QxNII5$|q(BuPt00<}wn!KJm; zb$c5cJ9OoR4WUT4t*Oo&sOXAd_0=__{))vlm)2SbLbXGM-htXcj~%r&;i{mSW!IGk z>!!Zj67*Gh^}4K{>e@zH&w%s>{*g^`IvkAp6Y2120`~;#{a6I}k}W;=>^6P+R#jHN zKe)(Wx3a!H%o>{OqV+*G`I#$k`RXc9n`ie{S7~TfOXu2ThQR}b}dchUF=mpJni zmZw*4jYPKg^zh$pi$_~qM;EuTNZWNwmh5V8-?e1Pb!}biw~{=)l>!fts4V`I*GZm1 zi;-Wa>9 zVUe=IKup$dFG-NKebSBiDvN-RWbFdCV#CQu=XCg7WNjaK-42&~F6&I(qA-gRhXUBN zq`a%9ZGO#$&TD(Z&i3Ngo|{7{o|?|a>Y`?6Me*`FE@#&arRf&-)}9v}3%K$+BbRs7 zhsuJoluh#&knUhPpNyQ%awbN^7oP1q`n;}xVz!(ekZ#03u_~~CTsiyPO)lRP|5Dkw zcthRB_UMYj>b$nH=H9kiTZyd`cbqP1bCU}&h)O3Ja(kgW(dOd#gl#T7^vIp#%FC5Q zk7iPDS#OQoTxJ?wE?!hsyRzYuO_2+S1|x2Nb>CvaF~2ImX={0pO=xOAUD_@$md!3D zT-@es{V9CmqsrSakb&h%ye~oC4oD}NO0ln0k$t7?ld-Q<`2ru)z7jL9Fjd`#*0y!r zyi$8!h{$~Htql!LnPtBEaAQ}~0;|8GGkO;5N@c*Pj$2oPb+)9ePBN}g%-pB&o&OnG z`^v37_g-)M^zE9gA%AF*ziw51cZfxr8(JEJBx_&0e@#JK!L_UBlC=fGTTyKM2C%|; z(WLAweMW-qD~oXB6x&Y^MaIR9TvmcfLA7lCN^BU7nvF&h&W%=MPO2d_lbijubC~@t z2HD)@70iJI(|_hMYiTr^`88|V4DCJJJ!oeLuSgX;H*UQs zDDEO3fRLce(EQd$!}0l@p4f>Q6Z>%{Z(6^hX;UUIQODWUfX`%2J-h3!>*~dN3;Cwv zJpR9T?q>3R*QC9mb+qUyd--X+e|-oy^SRp|7H=e+c9ce?$FP{aO*tS(1j1n?SrLoH z_4W8U_QI)GbA>$a_ivIOW8YwJgHz|BIoBnl91qYWJtl07fA5mN2SJz17oBK-a(%JYZ$`nr(n zcrhrG-oq7mklP8)WcU3jRsv&xe{XMpf3L^o@_5{C4<6jSZrzqG>(*_q>s+{~vvbiR zvQHp10bnLRDCfC+sI51%Z-w)wHk@A*Tp-8#<6=Ar7Q)9f85vL*GO#n*dM#k~>dmqf zk>ZWDftfzU017>h?#@Y___yKCJa=x6$5a_!hzDD%oQ;D`k=miYkj?HiW_elxp-OrW zm*7DtfR<>~g(|fZ1r<^7d5A0x0o8L!pK-?_02F}R?Qpw_WE%h_J#g9?j|Z5;C8+Ky z^OaOD>>Q~o^;8uU7kZsZmVBSvo?T?})%N1S`cjWSSyfdQ?y4^;^f=sk)ed`(J=0J^ z^??zJ0B|)P{8)OwD`>E2WnbXxVDHzjZr-|H+ZtTHe0c~nv;Vek9o=7^lLsN2qA5w| zPeVbS$_v!R)&4X4_Vjv}%dI%}TrtPq^lZ4CRF4~*_B))_ZHqextIG-ko{~4{QpFMe<0^lmhmNa> zd1kxpc5%6RAVZ?3JuW8(%puAJ;I6rxwgu6_o~84Hg}IKr;()5KKFQTs?qp6cnmeP- z3pXrVcV$jxW@ohgwaTKQ(w2HaXp#PbeSH5@E`{QcBi;UthFDk7fqh@-xclpvjO)eE zWZ`fF2v8)whimX47{LLhgqQ8J8k0Hyp3|-7bec@gQfG>?smo3+kuFa{jJ2~y~OMk|tcn}O=Cu^Ds1(wV)wz>Q4Eap_B z5x{6S=4M;K0GV@o#|TKooZuVF=nrlf%UCp~O|Q(WYG2go%R`69>2cZd;7IqvjZLO% zQ%8d_yE_u?{Z(mWsMuR5=fISq4p*=zP|#TcP!CCmfgMLZp_s~a3^Op3+i0xOX*xFT zPL+LDgcwT^6AB&6kSQ6RoiJwLVs;!XgnOSr%XlMFbJH@u9bs9bL6b%Vg0O@S=o2Sq?D*M;8A1_e;A(dKY_trKr!Ou^jB7xO zYnYps;g)G)7Mqj9kWD-C477|;EjfIDESy29{IZG)qkmjt#x9;o%p?gaQH#siaTIh^ zRv<&!dl~V)*Md5vdf^{#9~8Wao^sSNvgf6C1`{r*K#DX!uD zsSXrx7ZUsXB@Zs;?e19njQf{i4X$8sDDxvE`NL++WWSZ?Pj1KK3GHEQ#>KpU zF3iMc9n1d3)ZR?Q(y5e*T>8l~{wzcz@cXr;on{Yq5{_cgEUh zJ--Im@cy*_cz+@B{ru?1rM#W?->myn-Vv_FhuCjn9u!5>=cT14>9iUGipEqWxaBAS zj6<*W2mq`bJ(7dTred^cy;^VB8@6}@+OP$a&+i=Q?_7JA^)u;X>7TK&j2*%2udlk$ zF~8y7`x+@19buhx7v3*;r}ZecRtV$$1HbQIXb`U8x)%81FEELhLki?YZRG3%93h-< zQuk#CKUI_wl6iR+B{nh?xWnhO=lXoPc)2e(x3DlbmqNF|53gY+{`*I~*Nf3;MMX4P zf&boAQ4ysdl8Gn{=v&+um`+H@l*+^{5Zo2WD=Uu?kTgvnAEBB?$T_GC#ib1xT;s|p zeM2d0m_IhswPH}Vb>mm~{e9&1@f0ZaA5cIhY*8mXP7qW}2zhFSN>(a-sb04;%M!P4 zBtDhNAti)b93(V!1%o@_r$V}~D8o5#q{QmUFDe?(^*KE5Q2Ah8?8@?;md4k_NAr!a*0RsBzqLD0+()xqkFh?L-<#cmS}X`?{N~o#p^+*(}?1d1~0M^ z3#wD82wbf|pFv7b*d+uQ=^08m>jOh6YmCbDy^cSa`f+SAmHUU_Tlfy7Kst2E^~sGS ziOJ|;g20p9mr~qbcEZ<;2@91*f%Wn5$C{V-$hwvTR^E8O5 z4gz&zJRkl&b}v{V4<3;t)O_h025N!v>?}gZ8SR;uktS%hy3y2RrqeCyAy?KI>$S>J zSH2WX(j{$6>~)6gqaOKEx(&YsblMe({gfMzjz;YOdG=fzSizc;onA*Sf;|Cm0CRPk@vs`rf4t;3Kw{K2yJGpQ+yz?Y1>_8~cs>jQz%zefwCVaKRSAF;22gF`<*doDMkY0-ipUC~H#Zj`*O%*cIlugo8f`M3-5D|~PIs3y-WIs>5Q z$$Kl~RA%WXNo9Qbg@xlbpTkq2P#Ihm8{5=(i#rQ_VW-(v?ky}Us&$#O3Kc5D*RUQR z!3FFvICTrT?PVcQ04>t@a6doG2CCa8$61eJubxL)8v=r>er0+aJ1o90--pv8POoUO z=B8Jt@hOu1@c!Qq{6R3Cy3Qb64h-A?ER`MR=c_B)p19f1cC`N0-T&>}mR@ted7ru8 z+|-@h+^d{~rn~p$?!#wam3RNE?O*u97rxN`s=U`r@CPg%G=!=W(~;#$M-=C=B*Fd7 z<5GVh;qXcE-|=qz{?sZPyR=V|;_u3I1kjA2m$u=1(zii?tf&cS(rHcTet>=Q#9JID zhaO)Sa~kQ$kp?7{u=}LfAcZQfr6j8a)pY5ArO@lnr{Gu>H(AJO_$WSl=zd?vjSCmv z*x`F=SFo(OxGW^E;db#c%)%-Zbn5`5N|N{RxKtUJ_omy|pWe>ncz2>nXazgz`dXw4 zo0KD^QWMH12&fWP0(l!Ku#ngRvH_Fcq_^?tZluCfvcZW0MoomUU*&NH36Z`k6hKp; z#O?LDN&>6q=Xt$(^H;H{yn=TErD^ku0`C;$b+irsXOXklUG$%WZ8VlrX(tx)u~bKc zW?rX)dtO0CF+c(6FwTtK0{}bNZF-a5L|z8 zhT!gX(hxdmY(?|ZO8MA$&7PYuL#O~Pk8Km^j8HT=V?45rI2W=$y1BC6;HJHT+Pob`<$R-7H!^2Z@JxG?!^=BS1ws{WxJzh zcvE}(rr{cSzD~PGrotEG8k64e4|wlNekXiR>FZGLrJM`66SIUY`COn$o-s5{pNn|= zdN{3}@*SkjXcPKC51J$TBzli|jMoc@zlg1>!R2bGs%`G5tn6qO3i>YDw|33G%X)oF zFL`+L=7%q#B>GwRq4|iv3(q>C!hgJft#UW^j?&xLd)dAkC#lOAMt%8 z3Gy)$|A5PZ=`Q9xBp(~uyLdA)-9=Cey2F5nO8MmQYa8(oyzS!C+Ul_pM|j&MXKA}^ zW*Zy$8Sapu zQ;(TA^5J8vN2~Z6e-52Ti1}q zTk3r|-ki_H|H3y4a#FKRpSja$&nZawlkmWlF}i5%?0OVv^z3@bB)-kAKNO&4mH*)L z;=?!KIDe=5qdLwKEZ62WKVQ?wyrTIjhkTL;s%@ijgN*;M+6 zv>vV&LXZsYG#`Aqlar_%3C}{J(#6P8%SVARve`sU@>dLiEd<7B{uuO)9@Xm&Lb8P; zhZ7=Hz#G0goL0OnV{>sDd%H6!d}^0)Q#gtI-&afPLC2rj6-`e<20AT6#^KwhAIosN za(5Uf)z$?3EBcP4LmCe-{#ZRdR?r3rhRUM#hU<$rXDlmD3x|c$@Tncb<>91GDi@2= zH>LH^DwM-Kk{RcvrKTh&>9n$4iY{1ZB0H3U&X=D12E1WQxG7YVQkhYiQWHuEg#WZWt2;`_5kT7yrq zFGDW*PBZ4E2n=)eOkf-oNuUU35P;kca)c@Cb$hZ5Brg?cv?c`(DI5%#W?{PEQ`L=w zV{6uq4K#&HY{C3!M|)FVReo7%@~yX~-n@PL9cj1Uo>W?EG*Gb{gNfdSK`tz22DX4> zVy%xlvdo!O=rub%1yuq|)~T2Z1fkoaXV{rURgz`Z-k<U5$-(b4J8nY268M+CD?OyS`||@cOR!r{xO=FPk6gT-7*~9jRTrY{lSUMV~9^>?#hnWJT&5hXb3=pLg3{ z&0t-7q{dO=%*-F@ZeN=8+1u0wj@o=%Wm&G*VK9{S*AuOVWT{xSiroud2tfq&{h_^ePa+{W|v29Cd~7{mkU?eO+m}<;A#2eAr)OLELuxx-A~`>m8PSo8KO8x%P~u zhbe#bB=fQZPyoB4nOUgSWTRTErmAj;pi+`N3w5YYLduGsNJb$ADXDt`v|7!$oc5~} z;ax%e+zT4esx{h`bM~3Oax|J*;C4A3`Fgiguh(Z5I8u{yi$h$|Hpz(-u5cje3I~+b zS;87{XkDg&*7eF@kGIL~=`2}$jd5{$`@;0@tQ(fCT;TRZeV4gGN`Lpa^IqILU^Wb9 z8ZW=NVJx!cvg$^Q@&3qI13$MqsRVE3_3Xx@=~h&$YzS)Botna{oKfOz7G;KWnD_A> znZXMPu!P>v3@WY+t5?owkW<6$kn7T0^#-m2YfLm&Jz2O($slEt*56M%!S%NL>g0>u zZ4s-t$TU1W((kTug0Yi^H~-OjlzVzuM8+x*%;{i&4(~W;Sj=?TMPL zWTwp2XQaz4NTb%Xc&a}con#0CeqNO1UxwS_=K*?0j}~S-iR%?;G%ikadtfGKRz z@*e^oWH!f@>+Y$}9tv59#`otu`Nf=XwRSGf|H`6~ALfKT-Ptt-(o4P7qdk4qiw}ld zNq&g&A*Pe-1jTp()5&!MVlkN^T(`V4W4hKxKr#irEpD7L) zmtL=+L;v{EN5^}5dU`&0!IoJYBOQy);@gN_wJniiAGiO+=FkBvINpPxCSnl7d!TH2twI8nLoy5aAs1Aj z7F24A#fe>+hyanIHx#(^W__kE*;X8iV?WT$#19Bhe&!%-Kg)4pG({YDIn$b(SB-`j zyBo5C1(m^{{N(OxV;`q{7uIiHu(q(M%$8FV+){rL&Cx<>4gUJSK_2?`N0o;pY33QA zd}wJ6{!9jI@Q)H+LCnfW8VZOfAP?b8%E>hg2_Wp*FQ4Fg0wWx1i99hT(=_|CN4AoKqj za>H5V0=ZvFj1AA^_%TL2OFD>Fo&EASaho9@{Eu+$dnYIN99Fn?-^9g{r;dradIn$w?@H!D!#($Gx$}7%&%UV&9A;0ZY6#|c!O5g`e?bqHGSom|1EO;9mmBAL6fL8Tf~^_oqF%$P4ZBZcOQ1c4dC0EZjH z!m5^soB6XV~At2EubE%`AT=xuh^vwFGtU$}^=wFvD7_3|E33V=O7|gD( zS#{pB-of%7XH|44(2~_q*Dw^=OzNnr#3SpYu1v?m?zW}LpS?{}kY8I*>ZsFTEaB>C zoUi=<`e=d{8)JiK;A{Ug`sfVK#`Vz;;cWk+K3XK5WaaDtct{`3My)32e@-9uaAv44 zI0t=HvCe1%vO@ZozAjHgfv3G_&6P1`xcj`yks`OJ!MoG>kMwtbJ?{s%^qY)>27{uI z+H5h6RHk|V3wqt0d~!~`F3u{_{Y4o1wmJ01Iv%YVOk{tW&*hw_Ke&T&2t zKtAbyCS#oc$~M|hME7%_P4|mIigO&;zhMS>I13h8NTS&9M5Y%(7*rKmWrxw>6rdj7gBRZLSMt<~|zDIA{Jo z9Ov&(uKD6aiTu4q{123K5(xA33N{H$E!V7c!Gri+{2e%T-+=?jbl-thpyzQV2W0=$ zp;fXUonvghkKe_s!9+L^hD^p#r{&c`fsAz{6y+e-36=8>m_QL5CNR2PZnB-b<@$02 z=IJ+EDBOjjF)_c)nqf{Ua#Z_Aa!ah4megWRS;mx!8 zsL5{Aed^Skl-35_FpM481}Rj#0Mx+L3#XywL9Hf#lA1@ND5#4GR-eF|zd-jVlkXS~KkIsGa(KWeKip9~{1M2zPyYFzgra=pAG2w=Z0M zV4^NO=D&Gx^}!YXvH|g-ZN>P8Z^6yO;*aOwG~9k^v1qL1V~xNwcnn_zr|v&s8DFXU z8vKug03#VPNW)xjiEc8--4m!hKZ%Xo^NE>{-bwwFaeaeEzbM>C!D8w^q|+C1cUL zHBQ&ErfBSM_p+$?)eeWXtGc|lwj3X?tu3!=b6dNsSxU{)nwq86ZMF3+@?WiW4b9?L z+FPo6+9Q#6q+hMARRj|v{ZcB%dxc@hp|~=tPLm-pM&)UkAXiFZ0#y%Y+#awLX-4IO zzj9usjDBO%^SIL(eukc6%37-(w$f5>USFHr@5s&anDQJ0UBYl$db82vJtcN@rKY!} z=-dv0_4M+%_k=a&F$ik4wjfx5Pm51rheNy-H{-89v$y+^rLx`DA79g-oqbIKAp$q! zFQW%y!jT2BU~mGGi2$&G*qY-A%Y$} zhNLE)F^-U8T_U(syaBgUgg8RC^lNN~+_Uvj=tyo8KOguywlgmZx@SSz|CqS{JK-Aq zGQQ4nsgvUI8ggPo7{7e!rPZ0skDcnqb=bki zP|!U$XKd9u^Fv-6MdpXZHRE1_+EX8n|Ou#n?^1h`9A^+4n;9HrMa<6R`6*@-qcGlh)Ic1S!(y>GEcrzq z50N${{4b8T>Ni`+@R1qv#whe(Z|exIY_6TC2`mbhb!BUIUut^15la?VG&Y6VJsTgn zYVh*5s@3h$mBC`y`di#BQ&+EAeO_m4_aG2_dTgF30+Z^vSHj-tJccR_b_=%1y6Ok#ALpm=wbipWQ3r%F(EkstQx_X>X;s zB38;hBPS!1b^ZGz4bVW=@#P%yXa1{Dce+)%0}dPyhL0Q;d%( zb1kk{CO;zo`{9#5d-4<3fcS=dZd1S!wI@imj0*0l)k}C0HASrDHcVa{DHuT4XFof9 z>#f7MwfBxYdhb;D;co1Ji~c1!IX6L0j(h|f(v7!Z2fJF~AzZec!CPZACIwoK5oc7z zu(Ic=1OjyCF=`wx+mH~R#@i@DjicA6K#JaAAS!}-ErogMT|tKlUmn{()``DkL#JL# z5j^}?FUeqWI;NxiLCRv3i&%1%WkN=3H_8GEx&)UHHW&izN5_AC{(+%AFaA@|p86*~ zYZWhJf2VuJXkaSzM>FKQrARePb%?A>R&6N?i)a6FXnX!b+<$GD4xNvGJ9^BhH^_1G zv8tv9A?U#GioZO59DU*iKl~xy#s=OfdaJ*m*S?Q` z#H)!9yXo^1aN$de?)RXg`#mV@e)coyey{|d!Ixy+!_IXN`jK}6$^W0QE+9z|l#20v&QD)DPoA6DT>Wg;T>b3q zbH&&3W_$_PkzB$1E{^WOG(SIgAKIP+G+eCbue&wdr>N0qQ7Iy#eg z$C%JuOnagyffdL2$S2E(pF1}`e0Zv&i2cMKBm8kb{Jq#WGx=~pdR28r!h6encw2Nc z!$dwDd-s`4beaKA%w)j-tK9UFvrp8Sx#@>a-RvohaZ`Ra_To=v8Cco-fG;UBuwCRb zaNe9UFwaXaX36Y0q>wJF)d)-l9h4obP;^R-Q|LA4J2LNK$t?=+*?8)?6rqX#B31sA zCpZ}@(m-e?LfrsyJ%6k^yqR+E+ zynXF2!936$Nz+iQn?|G6dJ(l=kH@Qb;T@^Drq6}325Z8fGv%g^ zv0SsmaAN~zi@$HU(cmyo{g$7DuR||;j*U;}!-bJTaJ^x*LF@Hah4Jfnsn2Oh{kj_O zGmoTVvbg6{c)1Rf7nsE{^>;0v5^)!e=Ta~UMs@|H(RdWxy|5B)=kaV97oIdgThHsR3EZEl79aagnkLfB$4YLPuBUN29MxPng(UV`t7yZG$j zm-y`9%})x?HPUFb4wJ)du~3xCzwgP)HZlFwJ9*wcE#g~fV6C@XEop%!* z97#=BD|sjuJ}@dL6ISh&SMAhaW20)JVG8qREMaVjH8fy(IT1c3HM0+dRgevuBiX6^ zefh?mu@dr@WgqZWn7Jm(?qxlEMNYjkbA^O_WixZ1N4<2C-7Z8S6%3#|nwhQ!R#B|- z1obXNiZgb(3<0k;pbsG09>x+ZdDv?C!u}0UKDpsws?Cgl#v<|OVusnq1|}z`ek0pZ ze2^yG#a1i#)Te9JtfJUZ6$&_lh(U+b6SO!?VXw*IvzeKZ?lASH*;c|jCMTz!!0Rm5 zL*h%~ONVS`&E_Yc+$`U-Uit#NoxMGCoM1N5zyf4E4hSv_CHUY^tPfN7hiztMoa}9@ zMa&R?jz#!qi*@So}njC(!$y5;3T7r(CaF^9G^(Nhc z87A%FoR7TEuDx zIujNGE#~+N%$RzmZ)|=vN7PhzaK_vuPRh*bpgldkUYa8s70#N2nJ=I4+I$WPDTrdF z)sO^%Xi}0+E2z$`K3t|=t`o(JU>ghq{{7g7W5+f;ebY@h;gI+!4q~79xcE0r#bjWx z0s!CP_y=0h9aXCs?Nf(C?@;RldVELRjyH?X|BM}8B5LuUk`x~oOKMcs8dwrL%*Sbq zX2-{wP{3~XfLPKuHhkk78@_kzt+(R1xF5%GMEp1Lk7!1t>?0}#strxH!^U))#|NZ+ z@HdY8qmRyuCs$3UR{d?kf;Ga;@_wGaR?a||eW?>X1wH{DC6+mEaOo+JjBc@D0e%BF zp4yHZN#|*oiiKlr5`xeOW6=>4>R5F+Nf2~}sD>ics8!^x)d@_u5>zVfcrt3W6Fn(O zjBJ>M)iTxtYBf)~SgPp_g#bd0p-5c~1fk09aTmDV1*yqaMLnVlYTN^*gjDN|<^UP- zWPhPiaq&(YKr_QZ56@Exu-l(nv1+2aG0D&o8a!|3ilXj9r*nPp?He}jU%c>(+m=ma zSFdcm{>R(5|73Te!{NEEqKr*$cznaP2P1_gH9J>bxhK;sPDKK*PV606`RL}&k1TU` z7!8|$e8aUbUNUv-qW99j(?jXLAi$7xk{xD~kO##OB&@n%RY7)oYI2fRlPnPErog)A zA#^070mHOCH$NZ1Uy)y&Uj%tzH|RCVM&;eLmQdKD;pt$p7gT_Ibzi7IWGi>X!Rs8LguJ09hdj9O5swJHi+(J-}!YG?w3 zWz**7aVoM|EE}1%D6E{j#|QpbCC?)QM_ctX5{Z232Z7trE6?7Ls(@q?IX&)!vd3 zah%SgZX9&FB|HhuI=DDm8t=w|YqiK$p4LC1Q?%;L*Mkn!DxG>le(p$$f-X*JkE2mL zO?j2SytKH`=cTB%gh?mM{%iwDrZU?UDL^Mbq|sVjUKhb+_)S_)7F;g8{=$})3p?6& zw6yGKs~ryn#%rs`0)esW3*5QgEe%;U{g>Wi4_R|6=PvG-xKU6>yEQ%WPP+*Z@MZQI=K|w5%kH-nrfrbB)8LUbGzuI$VjI#=X6y(i&8#0@rWX$ znF3n~CdFg6m}MH^@e+|V;S(E2COVvXO@$@Z#z1gEXQ3lId&A&Fx62Xr6;~Om0>hn! zuHSj9gV{z)W@)J_-(bF>p=H1yF&UhBS@s;gHCp3tGG|sen)^ewCZpS)Ww+^V%{9(? z%eI2d%oKg0AuBICBW<3c$iR7=3yXvjb{Mpf3%aA(It`=x!Ibn&LDMcTC9sk)*hQkR z%MdUa0(kxnBE%j4;;tn4a?_{+-!^uu}IUxW?p2OLpdcQiLkpTsJPQRIN%DxOY#dW1~qFSHdmy z6!OBaQu9n%ek~_96FoDo9F5uuwyUJLs8ELPvhfUxd1;UeDQ=kp#G%4M0d%3+Y$A~a zJ)WRGV3yrYJOV{j}))~z2KTVF9+C;rz};vY2H(aX^)B#*uw4hI6^aNwI1?7${> zu3mZBC99iORZq3BuC@yoh|jRYQ^#_y4dKq}-adi{@9Uj~jlZcBKc0anS+ zb0#>zC<8D#iK*3^Q5|YD(~nNLXlA=s8}qr0MhQUD0Ml@CJOyB8{C_ZD3Ye5((b#bE zg}(dm?|Y%|w%hnz>fuW1vns#P4e4NpTyR4%_@M?Gp$&RrJ}ic1um&!G9dH?;Kwfsq zwk;QITrsh1Y|-%ifu4@G=7zfJDt~FA*X_*CGMkc_o|J}|TqK`3aA~w=OVI2!g~CJ; zwPs5wtnzsIKiU9&sq)gd0k>D94Fp44Q^4Z|3pKb@;h@WGaa%%Rm&qOGcT!n`bhV%N zG`Yn$jto z<_m%?8en3FzsV*%H1+#|Y~iV^`@bz@Pu<^H*=!TOfK3BW3E5aQlr4N4Z`3{{*jg&Y z>(#wo<)f|1<0V~v;)`3Fx{Diq`1+P&Z)0KaTfe&c>R(-R4gZb*wtSOG_&wt91=IRf zIjxm;!`gx2){Ob94EF1<9A0e6Te&jNvS9QEbKlT)f^glUPVsAN^0F2W?-6zl4rFC@ zFWjZMa&$pf-XVNlFl}14a=l4-eQ8U^z*>uSM{9-EvT8o34>4U)18HCZE2Kq}bF$1C zsYz<4swg&a?cJfM?gmoh3BSvs4Fp}U$!fg#{x7%|Uv9O0!E8g#FAg4LX0FZu5nCrG z#n;6tv(09{@G==oa+P#awSzs&X}#{KIfL5?%pM-MMXEBH3LFJtOV}IsYQ0*E_G+8W zEPUBwwOURMWBtB;EwTTn+RSV#eLr=J+4fob_U^WO?rFPwpRA`zC)GywEF^=O>=CIt zB-;VTAA$1SE%YQGUM@uV6P{)l$M4^=50~RQ`SwgF-&Etst4ou*Qd;Q55&`7 zA%d5SyG}ig$+7Xb?2EmE_&M?RnJ-{~ozh8lJ)fsMD2GNEfMu{5u7X?Oes~m~grCFf z@Gff5j2;ZZf+io9pcidu!Bo`3DR>Xwgx|xj;TP~Md>f9!A=nQOz#Xs`cEiXiCXAIsy_t!x zn%tl8W0YY#lxcC?ZnK$H%V{@#@PIWnRoAVfUtj(Re_c;Ku0QqpkI+Sa$oErqA?mx7 ze(6$A-SCm`F!gw9s*bIp{!_8tshoiOVy{AtANAM%kKRT6b84#YWc*>*F8%1YNO&qg zvvx@5bxrh;1G=M@%v7QY5DL(~;B<%E>-1s0gPZI0>|&ewep*QpxYe(`RJ?d{l2x*w z(su!~?WJ^&r}qu6I!y&GeM)jp zF`8WSSWI(O3YW`}k*=VdKvZS9S=hNHY1Of-_dV2lQFryivLgrPt(*AFS2E5QAM5sg zYDakq{-$@!H@5xTJxgxvDefv;bwSeT@R85=Hdn80(HkVCrZLV?ES+;pH4au2YVM?EumRV$=_3pu2@iz7XvZOwv zk@5-HA)_2Hj!*-D@3F%a(<3L!o>^WrB}jH8Q^rsm&Ll0i9yzl3$dSd&-Y1sh3w^h7 z**5k(1FVprmmmtBSzgT7p@sxS(5NR8Mlp>r@e!m&c~~?yeBqhCr=IG2hD(c*1jEu3 z_#3vL&c!@=-mbvg$hVi&XQa<90Qi=CF0yBSUXV@u%P;*M9!0snuv|AtP8^{!_Awah zIqC)_0zoJKeWTlL&2hVPtjfPQ>CPc2wj8&3H1?N#9#O(>_9u=R*H4&n(}wBv1ZX(q z@L?7iCJt~U0ZtAnJZnzWIIi?l>V#|xB@;mG(;k;LsXpYkxGcxxf3ZI~EGcH=ReSU{ zizDGrzV;DJ!oApkwpedDK779TRqSt*`@pq$3;y)nGOjKf}B65y&74kfv5K6~a7Z$asqHwrQN$B?5g*0jU{~?lcnx2zi1*Z7>`#85Mim zE8ROU8i`u+jBbDH&)OrpXm6ywJteh{%7p=g2pq<}_|Q4$**Hx6e-ZxvGzSm0o!>@d z#=Tf5q;OxHmV6$DpbT~;S+c4xhUy2lwt(r&pAPn~hmT zX=!gdQ9_(@Mxc)yL4g{`?}^y4j|dsezgO@}f3wdgbMu z#|T@B8)4O;*6U>>ELE_^TJd);vcppYEo@U_e=Q-k6Cl}ipxqLx%q!nS3tGKg2OAaT z6KlI){aEDF&24b+-{zBj7@=WK;Ge^v9eW1rE}tO#xglzI0LJ#owxX-~rBO zDJJ_7W(B7D9sf*N*e5C9Ch3QKto71ma1yQoVYc5T$y{u483OmO+}^euHL@&$PK>a- zAw!lW45{2V$xTt5*@nFVOE|!|3C|et2Y;5S_qbeM_l5?O}KhNU*TvTqz{?J|SJDy|v7nhO46~!a$ zI_ZR9f)r>trqfc$P^WBEmBA^gQ1%2tSIOX%Bh+UGIAyGQ1(P%X!xoLkb#j5G!PMGe zYS1i=^H~0tc!aHyPOyJK3PhCg zC~rw3B7d~}nwg1+m2xeOQI3`wACR1XM0mr2OBQMxOdYMJ2F-#7_K$=Cp?HW*V84(9 zDNuDZMXM2FkK>a{I43I=1gu#`>rKpa%_PM$;)~Sta9J>IvUc(7I@o+xIlw;JflF z_PecHONXiaAfWgz`~0?+eXzsQ5LHvv;N63RglZ(a$6u->@7vHF0YK zaAPKcrYifAEVvriUxzgfmS$&pN`q!m1ADhMoYw5hOAEIGig&WVN+*Py&t=TQ@=cpc zhsaz4D1IQNOD{qO7@;Cs3dn?HM3y8A(*j2cKg|K5H@XW5Ju_D0ZyGbh6%O23QQ97| zRitOz9Tsa*`MkPnRk^dGDlMfd!(cL*w$n53Wba8QgwMvt$^+2}-qRq@uQwd9XrH;# zcSFM-uh2PEx@l7>AFH%p{H1h4I&#jqubLU+PNO3wy)c-Y<;?2K&q~YBU$n!Nla&v^ z#CwHQ>4b14uNPSoEu1Z2jT5LV49p?@R} zTFPP{NGF6}gMp-5T4TKq1O|*-r?=1cGnril92i#dd&ue0BtM#5k9+g8jCQNJFc_#Q z^0o;BYP~5lGd-A9SyWK0si1dT!aAfAf*MjFBbugBGx-GZN<{)0-@ReFm+Ol)T5YGH zxt3j~DYfKfraLOjDZYz|cd>s+&k5h+vX}0tRxOY&O+1JYYJa@Ew)ge*wTpy1?#ez` zcyIPsLA1u{R9y7bf_@sFo`dqUdV21115^>ZRv#YG++M# znJ1Ze4P!ZP27n9yoRH=ud`}+a8UEnRIkrgR$|>1I-1o3F8uk05QGd40mYtPr%NCw) zC@pQEAHO{($4)=|e11-tC%q=@f*i_ix0o5jB;AMRwohlVGC8-MC_I-o?MxPZHLiQ| z4C$tnjI6Y3L)c}q8w5j!ECo!n=x8Jw3yQhPK(tC_6zAD#0^pF7ouM2b&;%Y1Bt-6EY3 zs4iJZ9?`UH$cJ+dvSHlA8EB5NgVbqu04PmJHPQ*`7^Fb3=a6e~al$i}o{K!JnKl@> zE>j-yz1R~ZNjxl-;DGcR2)ZTWVR|h<@tF9WA}10?#H?I&lGzwfw@wt$NUd|2?r6LS zOYVH&fx0?=pG3Vv&0|-&R^io(9fcQOw8ysbLUy92zki}M65-d+t;=Nn())R0eP_~T zY%dkEM=KY}yivT4EtgIR^FRZE$7!gYa-FcaZo<>z=Fm-y)4GWzV1E|x2yguwo4_rR z^X0Y9Vk@N+LjNbubJ@3N@Z4IO|6fYQ(g{FFqbLVnS^znBSK!mRNrdX0$#f)>TSYbU zsg=vox!(1=jd_;nlA-pWd1_OWyPIo!$$~=s93PZUu$7QPb&C{!j;Khj^n`(Ic_yZr zyH;lI(R%z3p+aWvfm#9B+0Xg07;m>E@^-0<%?A)tKu!8xGQkvc^0=0)JjfQ3B}2hG zutqI>@15Q<%9k^4;L!8k*SJ$idE&}CdPlQ(zjQ+SHfTwSG7m0}!?MS*#;n?)yp`Vbjjo zqZCGWu6tC^i#Z8ij%IKKpZ(g_Fk6mo=SKj=7e3NhUO>GvmKWGP(h2qo2t;2f#O}<+ zAQbsaR&QsEVCy(UgdC#0{Up!;C1u}CKIe(6=d z?;`TP%aqIUo<}E--kuL8i+{;2DGYETp)_G!xhCWa3T%7irkkSC$7^;V)pwOdQG8Q6 zAw7jc(lLNjmn%H-@;Hwa*%s-9&>E9}3F&JN`Il3`|33M*bx!$L+9Hn~(s=zV*-p3; zC=!+wW~$l@!hlh4RnKZ>4WT8u+3GG{=mJ zdJ%dOiSxWRwTuy!25CmUk&>Mm7urp-l4m+k5!}VM;sU#$%UWa`dIoY}!BGn@f8N7G zBMn*&QH-{i7ZVU!Hs zq*agw7ExG8hS>jyy>|hVx~d=lU+?qz%w=b1?=ySfVV9X@2G|?yWp-hKMG#h4U=f7n zl8Z1RA{izX6&eZ^CK)Oj79}MWCSSusL!&~aM8iU(q9Q{hLqj7a!^EBcbI!~x%hl{# zzu)uxpWi;ud(ZiN&Y5%jywCe~&Uqh=d6rDFZQEtLaufG%Ix74X(Z--(TW@-f9NaW^ zYg1dB#<6#Nk{f?T-(TeZ@X6zPnB(!D`y@BM+r0Z|&-;__*2ml9FUEf;R@x8Yee5%*Z5U*UN>N~ z5*DL>MP2&J`PC)0?p*3pJl@mBKjSaTN-XyiJ?6MkJf4z~#7bM%v%JTf=zotl)&Kad z>VxqYt=Sh^W3lS}!4J)xY0W-@#6QuqFaE3ejtk}2RN@ly5qGr8pTGFsFPgH1fSSky)}{ZdPIdbIL}Poe2~rc!xF<;8 zefb%E_ocDxTWNc_OXE8Mb)#fzn|a#i#2A=&3pip;#!CB!vFw|7y<>H6?^vbQ3arGv znTgHu`p9eVy_vT!xIT4nrs>;K)>&i8U{qoqR=aG_izxc4P-FJ)-9?;udj`qW&JPkq zGw(E_xh_RC)z?l@&C~k!u~U8P*~f=8?xj7>J&E~EKz)!8Y5Yxl483BUXlrs@`mPg5 zW}n3bVYIx(7WMs8w$nUUIJ#wMqfb4!!~JNgoK-UEKVa+6?PKfz$oXvjW{j_w#pkmF zOTrE;i_bI!YrK0yGW*(r^}2{;_AvzOJa5XR_h1K3wmD%3UVdIXFah4C9 z8iMurjc4(9va!I=t@%iku`um*APOHnZyt2T$QS0P#6E`MyEZn%Qey~Z) z;2!HUVx@hBA0*Pmq@912{7&H1~Ac z(nq=1nmsE z$zEN3we^A9OZCO8x_w`g+W&=~l-F3{4@go?GWb}?%m23CVocC|^_G{)TH((XD(-%MKHz9rWzoc=TE_m5AlSrF(sz+M09 z`li!AIB}vYwVmrjy^8>+t#6vPZj}XAAjyvn?x+OrXxeDf-s9S*MuI*z=nHa&z}ZG{ z)29F79&1oi4mcB^P1?Jyi=NSlUIsBJWu{KllbSbLCO@;DbIu#hJDxFy;pBJjG%|&j zH_jZp4La@g^@_9jO5-UzrYY|csZ~8m8Rg9On6!7X3u+unGKEJjzSxwRVccd*P zyY=#kvbJJl;OaA@jV&t}QqKJM#1RthzfF`iKPg9@IUXj>;8JZ{)%ll7&s--x<4azU zAIv|8oyd&q1G2;lC1toX$JM0$TWhG!f`60PKX5Lifc*c*zJbKE;upnVjQ@rVu4?n> zQ@`nEBW7a%POibXg^2X7JCr1BIC?9V-l^FqLEClAJEdf1Dn(T1tc1xv18;wGFx)x7 zEL0@7Z$3PH%AlOWto}8PKWwS1sT$-?t2N6`0Xf87>icBqJ&uX{fwe5A8JS#>I%%G` zlGto$IGcj1@1M4es(EbRGHqkrJG)H3x#l?E@6$(&6Gw1A(7&*(abQ+@g(ceG3+QY9=#{;&(U@*9-nIeuUf}V zQxBD&>cg|yPic3Hx*z-hBmJnIHm+|!JU{b4byoTR`+ht-uC?~GeiS~H{WD!p{AIaI zqUuqKi7>1!+SmH1?*!Es94*k-``Hd-nb!tJgHDlfMZcsG(WTw%o>w?@o%R*KcYaZE zT6slLQMotA*QmyxgN`iCE7u=8v%Fs@(e5uuRDIvHdrVu~sdk6OVOxFM?vgVaUs3`k zk&;NTBH01=g*(u@Z&~B`1v+q%FUMP6R8&!(r!GE62ObFZE6>zjD9_VNxCkD3g$?S7 zQ!=dPqZ=;1S#}%H*>(Chg7JFq#09nyXm`ZfCE3ME7sSpq zE#!uyW`|mG(^y|2N=inIESq$uj=kzzp6_lyOPUf&)OhZ+^xhFIzngaU-Ca6MkBeUB z)>p|}X-Uzom+GC`JYx0lL-peERJmp^%!6m|g-N9+>P^tZ^VRE5)q9FEF6pI=y53Wi zQBk5sOQq>g4ujhwIoa-Bx^=$t&(SYUy-xM*r>*0roz_1?y%Kc|>RZ<-8hO6D&e0cL z*Qx$!N_kqJ`qcFw@7K82+SB@FsM$Hj@ITNmO*v2NSF)~v8ZAq#D-Hb_-qw7I{wQ-G zD{=Qqihd?0P8sWS^2l^1sW9R6=8H6)Mr*8N!(kV@d&qt^JJYY?;oI$44 z(cq0uUpk9S{U2%T1!?NUH3L3;?-`A?#@`sc{p`kCl&ht3t@R1xzkVny&s>Yt450iJ zg1E(UC~JXsyY84{E>Cfc*G}srXJs*ow(Xdi$Yor$JM1a5+Df&zTnG;h4@vo~PqO6n z3u4y!KFw?Amo7eg<{+e<1JlB1f58NQJ?C0ZAA9S0ZL+7W_nfldO+RyN&CZ)MS8@%5 zy}(MY+2592$i3irU108=b0Ie#CnB$~L;X!G_pP8ll~}V?pGvLS5-{sh4l)?=uqW-D zXHbS+XwO{+-b%}zw5u7fTza#=wyb#uhe9=;#5t5vO&R5-W&JXmMw#zmiA=IqC3tVL z(moo#=3T~SXUg_mxNJ+#DBIWrga2CDDSP1g+WpnOWvlr8@xgMLdXPNIXlkp^$yAo) z=UJ9*8D?SGV(BY+W=+&?V2loQIUPQqugq5(&J9&MJ%xiE1Ckp~&5_1}ocf&n0%ub+ zag45BM!A~%d1qd7QTz1C!Tj##=Ho$C)USHb$oZDvJ>in!Lz_of>YMM3%PfjjH#$no zY7%mzBYvaGGUsT^+sb;^#m!Q<-btorsgBf&xFcv;!8~(ysim@(eCf*zfBMLhPp?_{ zy_@ADJ-5h1a%0b9GOFj(Mt6zDn^e7ekQ_o>-GI_fIv(KaP#%w5K=MqC7TI0tpkGUherfsn1n=%1gS<1GS z>Z||sceO0$>a%t8>B#S&H^3hZx{T*Oe|E5cuiHND7%AbYuPLSSo1KOA>iMeuA1Tjn zA36V;s*1S-LWT8%Ylgh<%5X!VvU0Av>iakKJoTYr!*Bn_%10*6+`hc)s_Mp(zxmCw z@Kx{o$oARsIHTjo)l=rqqg4rd1`;#hePG)Fr$bqmJqz2OHPIYC(wnbln~S0Jy$AZw zXM=AAfb?3x$huGR3 zoAyIhq%@M3`brFvJ1>Of{uGYS7&mr8635@@uZsH3yhx*X`z6Ebn?_h_&^u3L7R|4& zcSLJ6y>P@g$^q3t`kDBRnx*l(hy;G?s+0I#5Usc5z@k;3T=3m{ulnG!1^33JqUR6N zEiM22XU|Vj8n>lKHIPk();qJsvitSo_BqkD=oDrb(~*;tQ;}01tcYk_bruiC@6+4K z6S%5Rn&cZtAkn0gHjSt~&2t(@Md#k}TIRA_?)#$?LPdX6J$E!T zWgMP2w0g|6no!RYy^<})2aWD~MB}9UESxOrgOdR|{K33Re<eb#4UrSVZx zZ*Gi9BIP6fu9-gk5>ICP=&4s#^y?}wsc)*O>8h?8GQ6~6uKaq{)LT~%8$P1>rrV~i zy>$Mk+Lm5EWZYwqjcT6$!LgrO*o%jg%=bAB4~tIWVe#pB=sX<{|G2p4*{iRXS~=P? zx4m69x9imueTF$cSbbf+Mu;KY)mB;}wpA+1_KQIXDMb5bXz>(yj^WP9|usl}6OFTZ-|<)fwz z?;Jlmv3I%ccx!3#@X8TmMh?5x;~h4jv*Q!t!Rv3BdgJ(uS9Ej^817A<@XnPJ_JqTt z`Ue+YxiFR(r=s|Ab)9;RAhrBtqVZeSue7AVXWLeJc2>IWP*sB~EVs)oxNUvUlGR>v zz8sRuF)LBfAZ;{q+78Xw%+Ovj(cDL$CQfI}To{lzfH7Yi5o#`&S<|EBFEA8zR$D=IRk=;16&1-QGfD+%l=`1Q+=-4*Vy0X*H`hm z7VDvGNt^2PnrkmT*>nAw=GM#XjF!2j7q<-`*XSS7UzOZ`^QAXjJZ_j;sBgklRp|@8 zb%8n7)suVrFIaR<_oXK*%zi>z;>XqJleqW!wm_)7%yK%43VpVXohL3U5_VZ`mp!3h zKsnkILp4x)fwP=w&m)dGI2>lE%%Ev3bh{H)%h_6-s=iQOGf?^m1}o=luV^`yl^XlP zmBCS6j1!l`=~{5s@6OIW zt4+HL9>l=#0DVnuZm@rD(CaB1jPXpWiSns|(eC7oAHn1uiGF<-bbh_G=qpkSa_4&8 z27%HXmtQ_}a;T-Eth#nkXr<@FWx3K?7ntLGOR5}AWmib&`1Y~WGBU^bD#MqIU+yzn zEY>PjLM7ESa%)>jLsdz>?eH|#R1c^OInx~3S)Mef!-=iMC+%LaQr|_4!(O1T57u`R zr;Eqqoa1&W?XgZ9>=NiQ@XUPZbe-8X$1N^btT*qhw%nn0gCfEHq5e6(9DO&S9*2-V z`Pdjvf;pHSZLBXy?ZMT)pN2*YDjOS&14l(Ubebm&}dX)w0gQ|pn4CJG2{)k`M?tvBk0=CP}%1m?ESgG;puVqHGciN*F~@1}M6ZY#L>X{aCWA(9xAC|fOJ$tZ<_+fsb9_1Z`mV&(m}pO;{$QgyWN3y& zkBQ&k6xF`)8nj&Q@~f*`!gGf%^jFQT$ZJe%2~TmCP8-@jwIZ*v=fzor1`cW~)%|}s zz0m1-`E?m=24M1_x)~F1l)-u8dw+9HUG-R0{Hge0$PuPZTi>?y9YORKNEe93~LZH2zp(9Iw5wl4K}^z5lm|DdgBj|z{E3|_Zt#Rhr4 zCe#z}SMk)-riIgBADuIaKq+TKdSyy;DMMaD`o2w^u0AX&cxtrtr1{(HN(*xe^X0Mjj*OhTz#PX<-*M@&*?rCMR_AQ( zOGC_fJgCa(udRIf;;;*Hl;!AOrks{H-DMm4nj(;zr-RSBYEqaKRT5ub9;`j>TTUI9lupctmWnyfy@L6MO&y))q}4)?N1vP4a)|s`l~7M} zTVqfxRX?;gR9sl#OB0V++PH5`NcjmiZ8Ngid^#cnD*6R0wc{3C39+?z+hM}fuPfYS zyZ{-3W#lTYU>R?~(E|B)S>U5HmrofoW@^KT{HBKTg2J+l5k(cjAv2qrW`x6`(V^;w zA#L^jatpj8MEOEZlP|rvxqfhENkvhn+hdg$_N(=Wq65cN1_Hwh@+-^BLpd2)j(lIa z=5O)ia+|uH2(#K|l=myKTq=~|b=&%u$27MR(u_o9x9cs;ZoP%sg*(mVUf>k1jwNQQ zN7B+#eFY+fgZ=fDt-(-GI~ENk{b#4pr@-*2Xp%9d=AtjZUM{W-He57jVrD|d@y(q( z_Xf}PMcD?qGV;s%w-t;EO}b=-TVv7n<3Eyq^Z0wR>jHD^aRVz6GC{VfEXtVJ)}AM} zmS-|;r&Z=jbJ#9ri(ngMa%qC&)V@(%Mwl@-32F~HDWx)~d2BEz+wCbG9IbFwG-?Y* zLhy)c&C=CNLT-`#^q$Xt%9}v@eu3_{CAKQVV_Mv=eA1+gA8|I7U6HwJ^0?)IYdZM$2XLLHRf(qrLJ`Sti%W6*5UKlHqJ(jOLuw4bF{@RP{p(^6NEn z7%M?Q6=*ML`kybck=1D~ATa{v0CQ2O)0L_8JtFz}#&vnPMunr{a8pw>!3Z?IX=u=A z&!bM4K|ohne<-KlSKz8q;h?_G#+5`vQ>~7h)%{GReP?PpH#J7J zpVn|gQ?xN$qZ)NPo0?AL(fA%T)`J3?ApP+h2d^BlLDhSr7a5!oxQN7`1;ihQVs3O|ezH#B?GCc|o7|^Jjm9Lwnf6y3? z22_E|>GCJ%n=4$I*biJ#uwu&aIUi^)pIz;&4GkFLSEBrplCtQqW|yT8G`b2(-Oh|0 zr*C+6c4cT9aFZv;?bnHhh z|0RX}(;BO+s+D(&?!Q1$@y4X;rtwLz~RmFH`QNSU`cMCB?V=^ z((+7)BhSwCIvcH_6Sp>org)Xh?Q|<=KbPB)=BgiBG`-EPQe!%*l*;rE@Od-y(qxhv zc4c`{h9jr6V%#XF<&%Po0u5cw9(B{4tbEH+Z+R?djz6Q=vZvG)_7itaMv2%(!7OnE zODtEdue93flq@Y-rB%AT&fNYE*YHN$ zvanXE{fWt0>KJWE7QOIZREGw7g8OZ-75jsj7}Ks>*JgUNp4cmF94}`Z<-`>2@ja zlu+Z=i9@YMr#I8ib2u`~OMPVpVijhHRd8v2lRwYv2zYbm7p8qIr>3LOQ(W!{msUEx z13i-C@(#9pV<1Dc(@7O3zWs zswk7ul_D?e*ak$p*Zsjt>$l>{A<6)du)B%{VH{R-2sT(`_qUmYeBtd#r4+LK$|MIER#4z99pw zY)5veNIZF>iVJ*YUMr_5%adih4dp#6^*pfPC=V*{OFO3FKuXyCT#a% zD?LqRsl4={?et`%djd{ZmKBitOequz+Uag*h9#p_j#~z2c_cGUse!h#y>_m{YO(Ab z%Ti;#F3a}jS%Z`#)9K0jy~}OqXNuDSU=Uz9J% z?Q)ykDxZ>@la1b==d~@DR~31jnGU6D z6Qa_y`L^4YVHes3wzJmCbUBr6S1P~l$n<+$dA72Oy(-TZ%eE>C94bLaMax$u{g;2f z{bSu(t$)X|j%f4VbH2_Gn=rp#z2ob-$I)qPH!Lo5#8?06ok`#9`3E?*zvFwm%h72{ z>htFrufE8~P1b}}6g2|pe-*w%^nB%8b@AgVQ1giO!gukgF~rmod?u_T`mV5=n4JW* z4xfS5#0==?RQ%U?OneLhyM>qrRq(Em-zU!%ed6c-Z5q|8fF}6|k>0#Eo+MPuUx+0j z{)qYrQ3Hc;_Qq51bU2BqJcmc!L{x1drnV6@p^j^K8;^<+QM0JCo+2h;Vyer8B@&Lm zE#dg95{@60aQrz5$B!j|OCxHX{ z$?L?dpb1Om1X=p|Ot3t}lp^0MWn?dWo!RPsV%9-oI(%2yr1QidR-59FSWgg3JQGvf ziK?|kO{nAl3HTAwbHa9_)>kf2M;*R%)o|B0af;Ol0;-6J$#)mC4Sa`SZ#?zx z-NMbxJ|~>{JN>QtzN^BiKFw@RC#+!k!lz%)^B7vJ z9etj4o*9g^(-~>qnGC{yOq(P3Jil^S0Q1?xr^?4-zrU@UV zNFKqVpLN`%>oO+LtvZvTj-L**tq;*H#dJuq3H?$W|GN~&|D1%qQXGFJ0Va>m*H4NW zs`II#=Gm6w_%W$W(&*y&OHvsBM-p`WC8>{pLt1dBKtXp3O9u`K56Z={0rd!7xE;^nMTVwp`8}1@Emph^VB;zOyHdLTttg?H!XeVpIS!E zY0pz>Nr80*Epjv68dN&S&9uwSOqH9dmYeC2rOcM4c$0ZNax*h}V3>Muz+B1JoWC~!fTj)PPoADCjDYmG*JFVgzB(Yc4VJr-UnK1&x-ThRNVnr!BBn2w z6I1sQQ-1{wx~*o+rV&ewH8EYD&TGagWh>J560K+6LUr#LYx_n@pYN-Sms6A)M-#?~ z=x?US%lxJehZ)$TBt+{kJwsfs1YfZB(jzXw`C* zk^d$qbS+-> zCy2kI<#??>SUGg7FhO-0MV5!rDw`tp7~M+ns2|g2#(5>|t^*WupT}J+S8;?DR z7I}ms)t_$lhh*Oh=~h0vRTf36)!bWP`fAOfTXiS(zdn6YHV!q^&`NE;=vJ4}t!~7j z!RP}&$EQl^R#T`n<1&wK)9=S=?bTWJ*w!W?ImTKC>mB1hvb~nAd*v*xgGGqyZ>Gmf z_eI{qVa9d_Bdr)C)%`@|$3(2jR9f9hy?q4^qZ{h)wTDWpoNjA8K_ho-nb1YI)lQ|> zRm^y5o%v>>*2U=asFiAJ{6Whmrf#L%$|XyE6Nj-)&Y)V$NlDo!COBR8bi#QNlaZ!Or;Yu zxbzw^%OcadgqYz~ZxfY2Q}IM-$oEqMW#R6K85~+stVJeOfx1QFwYV7T}Gy4Q!R(;G1hWhN_OiVKiyW{=j6D_ zQP5+izmXmv-FA5chZ)OsiqtWR)ICJx86sAIOlyXzJF4cArDa9)efE>7G;RMQJ|i<| ze%V0G8bPM@Av10fBTvjBVoi;|smAEG#~(KIUDL-TPtx?<&`E83(sXn?QDd9cc2sTW z(tPKBViKpiFYhrn<0QSd1`#y0F~tYoM?l>`z{(^bpCw>r6Ho^eq2@7$#-|xxl4WSI zro#cE8fWB5d};ztBhzVH*^78gsPkwW6=&ki6mg%O~CpJ0c(8{?vB4~AQO-7 zzaG;|@#t|(*}rwURv`iF>jbQC5wPw`LNOjQ*7p%m zI|*2m30U(9SnrF!tbT|`e}fc%J#QH|#9ua$Dofjx&sSeEuc2LY=$04bZ);wr>6@%( zfa+wT8cB)r(2H$vq5KlSoh5NdB9l8ACme=K(XedVK#2kQi&iqHiH8 ziT_zjD3KCeQWAe#O5!g_3B^)Eb|M}>CMEHB>f4y_(}!oCGd_vg22$Vf-wgG4|8IeW z2^fAlIKfAi!fANuFA1dRy5S32CUzM)d8B?Xd#OH+XKI~ZLz361eFP1iPw_CLhbQ&z z6fZi0!<3=qJS= z^&5V!+pTraETTq#*LCP;t%HY%r1;u@H9Wr^C1C@3FE)Vpm^U%*y*7~d{G9qe=M9s3 zecx~T@5Ikr{(0;T@8!M0@n7T6@~TWAAd?8F8lv(bL8IHgL6-6nk-t-{{6u9ZMJi0S z%Ai^;AR^x+D94NprR|hHZKGGEMCCEEdh^xMtm^1gbyTZ50;-N7s*a(mj!~+P4pm33 zs-r%crk|@+9g*Za{l2YFJgVEL>rR#%V0C|Lu8#v*Uv-$ujTt5KIP_WjxkimGL*kjFWMe)jG-K3fEvvv z^swSc`JppGv%UwiLz+p~7 zYAou^=?Z<4&OqWXegfhvA-)q62eW=yN14i_$o?80)kcwAhFet-Iaiu~Z}2jYR+T|S z72-JUxsJP-K1A7>}yu0Ht&CG!nBBi}exM~*39%i>1}YS8_&K0#ED zGg9NctYdBb>3u| z=PECmo+zV-fHjP2do$JYhWVXdbJc6sgXA9!Ju6+;rOUsa34QaaI>skquBtPj=}4!w z+LYCpq$~PeDt%!xKGa&xrS>*MKT>G}bp5K1vHy#5hh3oD$<}Iau~ze_wVID5!_@Oq z{p`Smx2S!zTDyp(LhA^fI&Pki5Ha%qB<7niK?|$pPBv+gT0L#b@}!IVvglR9LtG0wzJ&QI+LGq`nRdP z)~5}wPgZqI?A>cn$Mod$7*)p@USz0zn27w0k@5^9<$DB7e0;(ds_mht!4^gu`$-+G z2IlI!uX|ok!g%Oe1wG&G1KXhI=_K3*2Hu38?aBDti7>txdcF+t`JmI|g%F<$JsY6s zS?KA3o-aT=J^4F*+r|4aztdq)3`|{LPL^{8Xwdh<^*juwZK-yyN|fJoAX&#Yh+hKn zeCTOU_CeRFLHFlR(DQsEjQf*q>4ErCh+mhi`)PQ`2R-*e&-x^^CF+jf3h_@s&*R4X z?>`u7U@rmr39b5_I0=}rj#eH>#JLj#<~N%etvzOIFV7MoAd8dnU^2Xk06UXupGwF8 zQcgfVO+fPcfY+xZC782kw0y;Ex zK0rwdWCjVCNr{1E`Kk8FZIt)+OV@jti0PXiOWnsy;`b{b4zn+C4&B;bZgke06KO`? zA56^h(W>*CeHh=ONIgJ{Y>XeZ?jTFur1jwVQ}PU1@&mGr-SxKkQQ4)>>@f&<8`K;2 zb0)6;w1@sapuMq3DM$mz5m0VWJHgrx_HM8bf_)quYr(M@LVD zgq#TEY=@k^kaHMvPD1W($UO+T$02Vk_?Ce0Aoz}h-v|B>__u?9FZd6G|2X7(AwLB9 zJ0X8R6m&pA3<_35!9gfE4uxJQ3_(#g6h)wD2NWHE;zdx>3Z)HD+6ARcp>z$DZi3Ps zP`VFFk3*Rk$__waEd-80-~{yB2>rH0c?Xoop!^tAv_i#nsMrVnmqPzF5VRp!3c&^l zc0e!&!4(kdfY2_eTn?3cVL&GgSOf!B!hj7BE{AX(gjYbM0V4AtvK%7oAhHD_yC8A^ zA}3*>4+idlf%{}2Vek?dyc!1YhQSA+suil%Le*xd+6mQ5 zpn5Y@>-c`CX@HszsEI+%3aHrxH9Mf@0MxcZ?G~ur1+@pDZWGjt9c3mVoy!xm^<1dS`93252|O?#l}5Hy{DXf{O4A=(Vl z@K)?8I0?I@nd299%x?=?K_}-A6#+(CLDndFLbPgjt$VU4JLKKq&+Y> z22+;6l%vpTLuV;;Hb7?=bS{O?^)NL8Q}@B8>tR|OOzVPaOJUk3n6?9^AA;#8;IeGE zECQFc!Hi~@(GD}#z>K3X(}tPrVdhqtxf{C1Lf2gAS_WMQpz9dgPb#xk!|V{uUJJ92 zU=AG5SqpPE!g z-3PZFh0iU6&#i^eZHCY7gmo)n-3GXQ3EaLK?pOqO9ECf#!TM$J`DVCl9^ADW?%D`n z*adgj!QIp0?j`WWI{4B~*mxK=o`f&&gs*7W51X=KQyqM5I(+RgeC;IM>w|l%lB}l? zzOJDezEKC?Tnk%HzX2TS3>b?}|l@STnDovrZQvGCowuss6Xcfdm(@X&F1xDdW~0v_pvM;5^& z$KX*nJX#KqHp8Qx@aQ7={yNxM4m-EO56a;O+u?^1_~AkL(FWMH4IXcR$2Y?hbK!}V z@Pv-+VJvzP)_H2PY zyI{`|(2l{M+5u1d;OSlP^Z|JK82q#je%cN{od`r)gKRmYrp4$Y^?SNmbg@F4SsVHe!C8Sy9Iu`3x0PHes>%Wdf{LQe%}SZUkblp z1Haz{&o6>M)WIK)!XYml+6;$w!V7iqLOZ-L4_;UbFRXzVHo*%!;KjA@;#Tag$Z|Nc4qlGH%lqJ!-SC$sa5M(59)MSm!D}1gwe9fQ zUij-WI93YB_Q2m(!|O44{V=?-72enlZybcbkA*jP!#~!;iFxo=IlR>jZ*{_3hvA?5 z;ba4x+z0Py-D4}nw;>!vWCbGY5w!$Ss}Z#kQQHx<7qO}kYYk#|A@(7}K7lyaAjALNw<;oQY5_rN$)_s%aDvtB(oXGJcwjUbj z?a08r$iTzMphd`_-N@j1$lz^Al^3ZBAyutN)pVq42~xEhsdgjPkEj?~UWYL_E*ok-mxq;4fL#ElGDiww1qq3e;Mn~|a0k@`hQ!!o3C5z@FE zX*`BBEkl}4AW=6GosLAeAkCdf^M0gdIWnvr8FmmE-ii#LjtpOdw3Z{SZAj~JWW-Tq zyIWnpl8Fc^|bpmNyhm2m1T(lIqXgzY#R%FZyWXyVG%vNM<2QoH>j9r6_)z3ST zvHOvWmmn9fM#i-x;|?L?P9WpgAmcY7<98tK(~?k*;#2Ydg}l7nwC3nY9U-wF8;851DlYnGG^~ zBQkqCGJ7vF`!F*5Br?Z`%&9`=oIvI-Lf%)3yibQmkjp_XFGMb{LoT0-T)qUkd^K|U zM&$DC$mM&H%a0-5ZlrrF(!Cq$K8SQ5N9GkG^IDO4(~)^gka>HMD}2ZmRmc@fkSkUr zR~$m-S0VGqBJ<}W^OqnCe8_?hWI+sBunSpm7+G)A#&3;pt;9YF4{L+)=!?w^O; ze+b#S4%vDb*?JQBA0P5Rdyxl1$OEm&1DlWswjmGfLcZOGe0wGG?RChvHzD8NhHUd9 z+d{~;J;=5L$b;?3gPV{Ck0Rfhj(le`^4&t@yBm=05oG&bh3tqRJGLQ@v?GsnA&(qI9^H?8zYY2RUSwxGvhxV?gYC!+-IaTM9T5!rnL`SC&ICmWET97CQ2 zd2$}|~$l1HzLpYkY_d`KXW5LTZ8;O8~J$z z`FR`i^DgA)$B=z)WM4V5uNm3bj_jL<>|2iPTZcT`fIQoQJR3uvU4cBi9(i^v^6YNp zxkBW*I^?;1$S;;4zc`5O??is-Mt->!`BfeAt3AlCS0le(j~vKG4wNGYwjjT$Lw>Ux z`R!8Vw=0p~u0ww3MSiy*Ik+DAeFXXa9_052kmuJTe`rPiumbtRdgKp>kwc4+Lnn|I zvXK`e$P1g07v~}`Zbx3+i@bOk`Qsksa4B-Q0Xe)8`I8&@({$uddytph$V-LDOA+Ly zMaWCLk(Ul4f8LAy`5ycNtBCqa7UOkAsdK7tWC-T=;fh^*zWNZO9vYkv9$_ZyZOC z+sN@H$nn+4@r}sw6Ug5;B5zh9|0qZPu?{(5BPUiMCk`TSwIOe9K>j%vc{_x>eGoa> zfSg>0oZOGR(}ujW3+d@VdUhi5RwRA`B|emdP|}K$y(l#nrFNsN2+G=uvKvr#2g;72 z>=h_SIm*$Da&)2`i%^c`D91XKV++c$3+0?{JZLNDYLs&$%DElo+>3G^M!A|%u1=Ke zD9XJWBZwTexgz|1fWi+EQwxcq)p|ZWG>{3*A6)Jl( zDrXTYw;Ywb4VAYAEEzRKZSE!Cq9sK~%v}RN)d-;R;mY z4piYjRMA*e(H>NBIjXoBRosax-is<(iz+#cDmjTN^`T1lp~^z2vQ|{tW>ndBRM~D+ z*?v^OhYEyHfd*7yEGn=G71)95w+Gel0IIwlRlW&TeiT(P9aXUh)xQGt|RAdcmU?FNy1T|QKNRFMjb?rI*w{< zN43pEwVgnXUW*!i0(H?6)RR`i6>AUJ5ZBWq9&a{O!9x= z;Qy(v>h6i%|Nry*^P#J&PoFw<>eM-P9(`vCX!66L$uEK?Zv#!<4LWNy=&Yrnv(|#n zo&Y-gMbH!vG-Uy3%68B>^FZeg1f4q^bna--xf4L=&H$ae6Ljt#(0SdU^VWdQ+Xy;u zJLtSUps9mFQ%8WN)`6x@1x+o2rY;0c?Ey_)51P6eG<7HFd=+&5FwpsRp!2h!^SeRk z_khmt1)aYgG))Cf8w#4{fu_}ire#6X=7FXy22EQFn$`=NwiPsO7ifAZX!x z5ui*RC^Hq5DS|Q!L75&Gqa$X^FT8fgJ!M;&Flru z+zOhx3)EN&Y8(b?90h7@05!IO8oNP_OF@n6K#dzgjoU$udqCO2pzH`xwhok?3d$Bi z*@d9&T2OW)D7zDsD+T37fO7SqTpK925Y&_fH4g(dcYs=KP|FTb>k`lfLqQij0lHup zXx0qStc{?y22k4)(CjQ|_7+h4R8adaP<{cZV<4zwKB!|G=)$F-3wMAzr-C|nfeNLd z!Z1)_6sXVuDzt$L-Jrr!P+=XYun|<)4l3*c73)F89#GdnP}dSr*LqObHqb>4po_ME z=G24ctO3m}1I^t4x_A-jlF^_`CV(y-0=jfAXkI;N-d51OU7*WU&}D-`mvw_K_du7| zgD%g4E}sXwd@<g@UA_x+MJectVW2BUfv#u(UC{=*q8oHY59o?s&=uQ3 z^HtFNVW9bSp!r$Q{BF?v9?<+=(0u-U59rFlpesj!uB-!HITdte5p?B3(3L%)E7yar z+zh&MC+I2_bk$JMRUYW7deBu_&{gw5S1krzwH9<$FX*c6psQ8T)x$tn*MY9ig0Aic zUEKq^x)*fyc2Ktp>K+E_9tG-d0Cl&4y1PN$OF`Z1K;0Wb-5hQY=$gTxYes;ssRLaz z74)+apq~S@U=(OU186}TXhAn*uZvidd0lIAg=(Z)G+e<;WF9+TJFzEIdLAP%M-ToEm z4ij`o8R!lhbjN7W9TPxz%mCfd0lMP}(2~KRCBr~V)`EV~2D)=N=*~5uyUIX!Ed<@Q z6|}SxwDd*L(k-B+J3vc!gYF&(x_db2?n=HcF;Y$K+9CnvcaHb!$8YC(6TzvvIfwyENEE~w5%JnY%yqA4`|ss(6V08 zvdy4n+d<2AftIVF<%2=Xhk=%RpyhR-j2xYzM8_ z1zM?sRt^TO90pqHfmYUmRyKfEWt=bG)wH>r-7pO-C^$Z5} z3C*|P|q&VY8AA4FlhBK&}t8~ zx(>9u0kk>`T3rOK?gp)13|id-TD=amx)-#1Gidd8(CS^FdsWcAgF*KW1KsO^?yUpe z+W@+^1$1u@=)Pf~`?iDD^nmUk1-gF`=$DnC2Zn+km=9W84|;F}=)r}cUv+~Xss}x^ z3G{F&=;1}6M<#$Cc>?t72GFA(=+Swgbw$u)LqU%%20gYD^qV5+aU1mbV$c&KKu>G~ zJvkioI~eqCCFtF4pe@5dTRhN~7SNV; zpe>t0TXuo|I3M)hK+t0m-`wKwtZv?%+6STDy zw6y`Wbt!1;deGLbpshPWADEyIhJij94f;`=}0`%c1(1#tM59fnE zTm<@XJ?O(7ppR70M`fUoDnTDj0DUwM^wAp7M;k!fvY>5?K_9E2kB5Oio(KAPA?V|W z|M!2N3)I^`IX% z^S?6y1{(}*V3-GnhrzIo{|QJiWfYk51eme~OxX=aL%^sGj2ggb0T`_Vqh2uj3XB1a z4FqFlV5}aDO$B3ZU~C>3TL{LMg0Zz=Y&{s;2*!4UsV0~@1WX+cruKqqUx67#Fk=Il zIS|Yo1!hhKGdF=*L&2=&VAe)3Yb#h{AXs7)SfU;*F&C_43Rp=CSP5_UfR(HRE9nI* z*$h^)9jtUdSiiYo{WpO1-vriw57>ZuumMZJ2J8VFI2>$XCD_0=uz^d!2Ce}cxEXBV zcCdlFzy_&cgKV%tqrnDE02?#|Y)}W-p!r~f7J&^~4mRjvut8hF2JHkJvA*v?cV~ne-GIH+rSPO z3UF&J!w4K`vq*m0x4j;jYdZYtPuZD7aE13PXP*vO?|BR7E^Uj}ykLa^gE zgW1Eu>=|J8axi-bm}7%EbHSYTV9rJ`XDgU%g1IeV?gB7(EttC%ENO!!mxCoYfO$5U zw;0UZ4VKD+rMkgV>%mgnz{)GZ$~(Zyw}Vv-1*<56RqO<-tOTo^3Rd|dSd|G@H43b% z2zJ6iuoISooj4He#Iax}&IdbjIoOH2!A4C08?^`QBpd9c31BB}2RnHz*vV_aPF@do ziVAj$2X;yW*eP?tPT2%DdKB2`C19hsgH;a!tDXl|y&bG(C|FGgSj`%+n%!WvW5H@$ zz-l*x)$RhTYXGY&f~5z7rL$n^^W_~*#Ts}Amw=tR7VOjwV5e>dJ9RhMX+yzI zTL^YqFW6~2!0JbX)z1a1UkFy;3s%1ktbPyJ>1AN2j{-Y=3fSpIu+tZTouPuAF$(OA zjbP(#u<;FG;}?L9Ukf&V6WD|@un7yn&KwSQ<}R>_L%=3_U=yc+O)P><+z2*t2iT-C zut^@+q%~lZdch{`0c&UgYv=%L*a0?K1)DqpY;qge$e2flb{FcK%SX z^GAc7p9MRA0oXJTY}!JwX=}lzt6kP2g4zSi2!7i8rcEMV(Sq)&b zc7wG|0GmA*tbHR`eizt<0P7qMRwx52)`4|3fL#Qzi#CJJSq?ULEZDroU{~~j&0hm{ z&ENR1NhZc9&tqRq3x0KS7(C1YaA(OKP=nu^9IBiZ{pKY9ZA$)2mi+$~!r!7K7&u4v zGaQT=vaQ0xrLxWcW@fi+>llceW!r#<6|!yO7`!dp7LLLXvR#7x75*0)_&=rCUpY~> z`{4xTOxf;_gOuyRpr{sr<;rT=R~iJihbxV+179nJt*5c%IF2z zHqb(!%C?CHHeR+Z)U#ExU4jwpOW7{P2=!pu?uVi}Mz;IIQ=h79ZEh{LUXsg}Wi!Q0 zS!2HA;?CCQmSWlcWv=bG$GNtX8d28Jk}Eqse@SawTc*sdTdlnK`lSsIqi6 z*Iwvo&CSYn&d#*AmsOAXZ^-`z)lw{WoN)Z{bLPw$*(gwtY|PL8-@Wy%jk)$hE?d^s zp3QZZ6)4 zk00;XqYkZTMk|VF#U;ogi!x-9K@l00p%Hm>;9_(JP%S8;4ELi9E^Ih(ahz9u1T!o{F`zz+9A+bfPRv3X@@V@1;8rd2=tM{Gf4&ZaUn5Z)yx)nu#QtMA&iOHz ziHRt~Q7A(?7?pFZ1FgtmRxm?OMSH;iYK-|m;rzei;?hw>2Ts88I39C?e@6zZ*%?vI z@AH`b{|mN0kcnI{6Cs~MmiT&c{tB5JkB$JQEReSLKvMU9lS}ADKU!rckRHAw92b|? zVgRxCTncCmc0dP;C}3nDC2bfPyw!~3F&;knAMpVN+8aMS23NH9{wFae_>)rvhGBR~ zVT!6~imn)nsaSYHNhl>ssnSpBuMEIUWuP)h*+l@ZEu%1GsS z#a0}}Rgwz->!CR%rIafbcu}cTs+1Fy6O~cQNqAW~Svdu-D5I5XrADb$>XfwND`S+g z$~fgzn=%_Cm3Aesbl`a9LZwqFC`F}9 zxk#C#%vCPNC$N=EluMO)aFolG%atpX`O1~bRm#;$w{ng0Gv(*X0_9reI^}va!BrMw zlX8P{qjHn72yZAiE4L`ODvOodl-tp)+@UN{exclnx0Jh-rOMsPJ<2j=xw1l8sjO0Z zl-0_;%6-Zj<$mRtxLJ7s4=HPv2k|hH%CD4%l!x(Gc*-M4DZf@8Rn{qwDZf!3SDsLw zRDO$c^Z2bEr^ymFJZ|C@&~4DlaK7E3YUUl~%opP@?mT=@bgC_9zEDt}YHRK8OFjuSBoUnu{;Q_9!MF6E!fzm$I~yOsYa-zeYW zBxR5C9sZ(xulztDg^2$ZW70?`gG{n0K_yg5{kTD({xpCF(jeN0_NBp?Mf=hIbN~&Z z1L+{N(ZMv74xvMF0UbtVbT}PBKcQi0rz7bo%%-1WISr?yk)~tlSQW&BlMIo$}N{7g8q`s7PIO5zV2wbTM5*m*O;3F-Hg-e7P^%d(`|G+-9bxm2K|EWq`PP- z-Hq{d4=tnRw1QUBD(a!tbT8dUYv_LZB|SiE@h5r^6X;j;5Iszf(64bOJxc57G5QTX zPEXL2^jmt0*3;AU4E>Ha(6g9}iMW`4PtQ>=J&#N25A*`PNH5XL^a|$DMtYTAqt|f> zZK5~mO?rzq)7$h8y-Qo@kMthBPh05&`j9@NZCF7c<1+e${zTjH2qw{==`Zvt?V!)_ zH#E@a^abt2Wcn-pjlQI>=OD0oJD)+JNh1f#vb~Cfhmj_ z!?jFh8q;w$GnmONmS82Ul=Wl%*#I_>4PyJSec52PAKRZDz=p5`*+J}JHWX8EIXi?M z$_~SPR)#Ct;p_2;1!7^+nYh+oLV@<4?wXjxp0h`6z z*lgC$@~neh$U0ep6}TxfYyrEL zUB|9x3)v0qMs^ch#BOG{uv^(;b{o5$-NBZyU$8sbU2G}4o87~fvE^(9Tgg_j9=4j@ z%kE=q*!}F6>;blxJ;;8=9%2u(N7%2~qih{}jQxf^&YoaTvfr|&*n0LfdxrgvZD7x` z-?QgfFMFQ-fxW<9WG}Io*(+=#dzHP$UT2%w8|+Q?7Te6;X78|f*%tOk_8xnmZDk*@ z57|d-8~d1j!v4gzvp=)Huus_z_8I$}eZh9Jzp}rvFWFb@@9ZD!YqpF1ll_bRo9$-* zVc)QC*&g;C`=0%vLRC~!nX0Oqs;h=-s+O8iOVm=epW0s?pbk_Asr#t=s)N=2)cyJ2 zbx{vg4^j_ShpLCDhpLCEW$NMT5$aFWVd|0UQR+|C;p)-qG3v4E2=zF1qO^&t+MrHW&r;7;r>N(s=c?zaQ`Pg;Y3g)!hMG}ls*P$^&8balv)ZDzsu!rU z)HZdt+OFo+4)sE{Q!S`PwM)H7oukfGFIF#6FIDHMm#LSlSE%#VE7hyitJQAx8ue%D z&(#I$wd!^1_3A?P2K7euCUuc|vw92e#y#q->SFaa^>+0Rb&2{5^-lFJb*Xx{dXKtH zU9PTBSE{Sj9(A>PuX>-lM!jGCrTT!nR((+YmHLqSu=_v&+Mull_D2lWN@MfD~1W%U(xqx!1)n)YSHDnqs()4g zrhch@rT$(0hx)a;OZ}(%FZJK*ZuLLvH|n?Q9`!r*d-Vqmnxc`$G*#0yT{AROv$TX( zqLpg>wEo%vZJ;(t+eh118?5c8?XMl64bcwN4$=NzKzzTDexCRcck*3EGL;DD5QeWbG7fv{tRv zXti3Mmezc2j5byqr=6;urqyewYiDTVwF%mp+C*)V)}T$+&eG1-rfBDA=W6F^Q?>K8 zY1(vchL+K0YK>Y}%V|wov(}=uY8Pm;v^H(F)~@BX4(&p%Q!8jitxLN|o1@LuF4iv5 zF4g8~muZ)4S7`IKE48b%tF>+vv!MitF~CX zO}kyYLtCQ#Lc3GDOIxblt=*$7)0S&1w3XT_tw&p}-K*WFtpnrwqAQ$dq(@6wn2MV`@Qy@)~h|Q{Xu&{dr^By zds%x$+o-*&y{5gcZPMP*-qhaGHfwKd?`ZF8TeLrF?`iLATeT0g54Df9ZQ94$C)%I1 z?b@HUzi6LoJG9TV&$TbKo!VcuziD4;Uul2W{-J%X?b80K{Y(3|wp;s;_Ko(fwnzI; z`(FD&hpy1F!i`Vsn1^kMpu`ce8%_2K%_`Z4;k`Uw3veWZT8ZtITj>Pg+xQ+l~x zp;ziv`U(1p`Y8P*{bc6hu3>sRRW^(*zO^sDu5{Tlse`p@+R`nCFX z`t|xk{RaI;{U&{pezSgyeyhG%zfHegze8W5|3bf0ze``L->u)HFVmOnEA*B6D!oTv zt>3HPr?1iP*MF%$ps&>*)PJQvq(7`bqW@ZdR9~k*rvFBNTz^7;Qva>~l)henT7O3W zoxVYTR{y>JoZhQHum3@RL4Q$yNq<>?Mc=5us=ubcu5Z%c(BIVG(l_gG>+k6A>Ra?b z>hJ0A>s$2?^bhrq^lkdb`X~CI^zHhe^}pz!>O1t$^w0G#^qu-&^}pdR{Y(8T{qOoe z^sn_@`aku5>HpSu>;KWe(ZALA=-=tz>pvJU6oU+AsD@_fhGCe7Wh9IeqtxhU^fv|= z1C2q(KE}SrU}HaHf8zjSh;g8Cka4gv)HuXA)Huv2GY&V7Fn(eTGmbQlGJa|dH;y)r zF^)Ax7{?hSjpGg5a17T-8lI6d%8d%6(x@^{Fitc^87CPh8>bkfjcTLDs5R=0wBZ|L zjIqWz<5c4`quw~(IKvokOfb$gCK{8B24k{umT|T*#W=?}*Er9ZYMgIOGo~9ejEphU zXf(1$&S)~4jTWQTxWJfYv>CIFb|Y_e7#A9yM!_f=UB*Sm9AmC=v2lrUsWH#E%(&dR z!kBMdX8H6lM&niE zHRE+-lktY}rty}s*?8M{$9UJ+V*Jr~&v@V1YJ6aPXnbUBGd?yxG5%z1H~wt=#rV|N zVSHwMZhT?vH2!M*&G^#z%J{qS594cNm+?>IU&gxmN0`T%BhBMY+jLCVOq!mVGRw^hv(l_GPcTn3 zN0}#?C!433qs?lw#;i5#%(Us7W6ZJUIP+BVG_&43-8{n_Z%#1J#J(7e{jfg{zz`gW zgK#j0niI`QW`jA|Jj*=WoMN71o@<_GPBqUrrm@=rMb%NF;|=Sn)jJ&&=05JIsDwb-~1&G!2t6CJOCA|pqpzk2uENgG$e2+ z_Awtce`P*|8uMZE5%brWh8Z{+qs>Rnb>?H{Z_LNdC(I|!-rsMI^J()L^LOS3 z^I7xv=5u%yzcza@(0tzfgZYB_qWO~fviXX+5%=Slcm}`2^H_(+@EbgiUh`G+HS=|I zllg}Erumk+*?il4$9&h^f^Iww!~CQ99_}^YH@BJ}m>-%SncK{d%}>lfncK}jn}0Ds z#Wm&*^E2~v^9ysQ`B(FA=9lJI=HJbKm|vT_%zv8yGXHJvHveOOV}6U<%{{me8S^{y zdpu$OV8K!>vY4f!%+f3!hvPQOz%5vc!>|}VmWeMd%SzxY++>wlrB*+yzcs)bXbrOV zvG%nFTl-o2TL)M}tOKostb?tg)*;rR)?rqeb+~ne^%E?Ci9evfH4L{}N8(Pb#xJa+ zte;xLt)s1DtYfVa)^XNI>v+qy9Lu$mmS?4`a;w6sw5qHVtP`zK)=AdM)+yF#tJiPj{m!J2HHWu0wJvCgs1wa&AqTIXBS ztm)PaD`U;H8u6r+wQ^RI)r{%jzaeB{0j|e&_!$=BYOBR+wJtz4uEOuFSyr1h+iJJ+ zR)=+=)oB&1qSa+xWX-YWS{GZFSeIJ!tjny+tt+hg)|J*(*40+Gb&d5i>*v-2>ssqN z>w0UUb%S-Ib(6Koy4kwLy46~2-Dcfx-C-@Ueqr5d-DNGc?zZl+mRZZK71l~?mDOXd zw(hm=v({MmTfej(u+~}+TEDU$vL3b`v3_kmYOS*#vwmYeZarZ=Y5mrE%35zdZ9QZC z&e~u-YyIAO&g!+ExBg(gV7+L)WW8*?Vr{fuwO+Gcw>DXCSZ`WyS(~l5t#_<l5ow)^_X9)?choaf7u3@8e_ZGwXBf3u~wKSL<)qm)2L- z->rXGUt7EIA-3Q~Y(*_Tvi@oP3-4hYKENNXe_Ok)|5)Ex-&%XD@2u~w9}-9?2}-bp zn$Qw@!bq42E0IW)BuW$g68#ec5(5*168j|fO$<)#m)JjXKw?PZz{Ej`gA+p&ha?V7 z9F{0c9G*BL@sq@`#F2@k5Y1Ini*iO+d#jVKPK#?zxxCu)>dLFfueMWLC+@3*dna98EAQod)s^zTI)HcW0FUj| z1^8{(4dG;eT8>j4jAOfYaCK|T>x}Bzna0k1yHTBQ&bQ}gC8|4H+nY0uUB!T8+f7y* z)#>=&NlQ`%3MXw#k}I9kfb>ddWT7A)+OC%j=yNLF{+#!*&u0hZ7-4DYZ^|v zCPWb~Qn`_q%uWkti)mHKMXHnpR#yf6t``c4oJfsei<6dcA$~{RS4lScl1){fJ|>t^ z$(WegrDGcNvu9@nyAxyfBH4DT#Co}&M3wf`u`@HBf*vPbGB!pec<%;dRaXc>tgfi6 z<5Iw{u@pFdIgLA29~bQd+o|;hN?WqX4Y@4Wsy67iUAx*CCs{UbFO~(Yv7M?4eO$4% zEt@Mjb#KaS*Apn5bYr}~ywH11OEZc6fPOpz-z)2@-OY8f*s@7-oQpS>U zd_kv^PD=Vcxs+9M$!e?hGXnhm#U&Jf{fs`tc-5t6^chAl)(aTxq=gXJj$g^r?agMo zy_qvsE>Bg!ZQH2|xE<~iA>XbmXmMS)|M$~CG?h)PTT#)w{*2PXF9uP zw`IEIYDHQrZH$-F5N!OEq%9@6o))w?Y03S{@{;j|woIWVT4E>diD#}WM^4FkrR0hV zjcdDJwLUR;O`jMnRq4bZEs^aya;hoG0!JtmR}A6SmV10J@N2MS`XnI<;u1;%pGkE^ zWlhPXSb$3>{b(#FT`tEems75id%n_F8)jxY^@d2EY$t@N5NvTBNna?W<#G|qC7VLy zQZ8|Z`ld2qjqOxRy(5g5?RuU*xvvCCo#9CEItgAU)RI6F#acS)bh_W<|B?*XDK{odiJ071Kh!wdWNydw$$@qd16RmRFO042dMW+v zU`a~Oj(KmLoo&r^<_fI^{p{w>j4<48ZG~7{$FC?kCk7UHeNR6p0=1o*fFDlUmpdgX z#li{ME&DyGGyF>ZTp=0a5=utm+`W{uldh78gwC~{nt-9z71hCE!FH>p-4N?w-FDqTn4ENtT=iOsy;f3F8(?wLwUT9aDv{f3 zo=&TQu!JLzOyX0V+4?scrGeE@Yq-zH%uw3w4l%6%eF z&TfU&PN5Ml_w{z6<;5k^810#ke4*Hx?`X;C?R`k~YD(Mxo77;LowOHTLmpSLTzj*a zjx<$nMYzx9{;x{+&+nzIBzQ{C_mzx55}mX-7dmNS#htXU@=iLm;?l~yQX9Fh`+V$}gNpMU`F?kEfkNFE)R9BR8T_9Z8ue=7Wuie7)h+{ilBt;h0Ny# zUFu>-s7^x(6u26#es?y48tt&XUc14QRNmoeyDgqa7ZOGTkT76Ei)FpG`wY26$=hr#Wq13IF z%D|O}2B*d^xj24FY$HFVUmU$+J0ce4qv7zYu-G28WQ)-=79HBE0z2tTTBWTBBaZKtv-YF0UM)00gekBFK) z6wx>!ib^yFfeC@8syu?Kj*z>Rw(J$ITkx)I276w-Tf@gyGb0O)RwkHs& zqE;xYR%4*gMiv@N8XI$2UNz5`qR*+G&mun1NAy)zhD|qF%SXzNEHvu5VhbNooa!Um z9Zrgs4MLVtrya{*DqadZUZ7MctF}|gM-Wozb6lcX%K=o*GE4Y4K`RtUOC0V)XxHU} z(m(e3B`SafU3O(s-};m1|v#0 zfxjg^g=m;m44aC19;|M_2G@&eu8DZ+)J09V$_2Rvt3E~+$71eME=!H@o7 zzw2V66X`;WDFN)Q=_o~)%Bw|f${#;HmpMft3 zcNb!iP~dDQn6lLtoH6+XX2(F0q`Bq1sq!H#=?WAY2Su$=6ZP-o7X+Z8ViFwpI7bKc zbr7PVyl_uC>1Z$5j?d?<=Xm(Iu|!;AW9C-yJt1^x(2O5BwOrX)?V)~F^ZZsi5{1S= zQ7a@|tawGRKZIi;DYKnAK1%=me+eA-HX`!tIH6*ab+MwUizihV@!JiQW@-LMa>|{N za7;H4SwT}W9;B8ptCjze!19GL11}{eA;iRemAE(5Cfs9*dIMuQa4)|lB*W=zGlMsz z0~5U*STQkeVM#@RDjc3WF(EQH#kGVbT$zBQu~QQ~2-ixW^WqoXK21IwEze(2J7OwA zHrs)N(`Xj?NteT17>yo?p2`)HC7hg~6^iG8zAjGmjuW%Kj{>iV$q8(tSf+qpl^;?p z>B1Bm2Su$=%&bB!<4v`T)6o?walxbD z{A&qsCL*qmi$(vg|Jq)*>u~g?T|eF@PF*yXQx_hXx#JU~jHeUWBdcrgEtBSZ(G1+7 zXx@P`7CiDp9&x`Y1_&9$y`zzZ#({e|Na5J7Blfv)lY-vJT$q8A6!2wlS+59I@S+Gu zWjLzs28Skf4u45_O`KVM94F49$ae~$`c9R5P$5<)I3cP04fSFUd2zTn{rmV-9N)!1 z;<%F*=LX?s#rQ(2&z-HX*G)zPx=zS3+x2376R33c5>A2ixC)JfqE@s~E(teEzt{nj zgK!@#8ZS6LNXg{O9)yP+k>|D@k@vP85&yLv5&yMakp-|_QORJtVRA)8?Oi*JW5~(| zS7iQdCkzV9q_!&}LAEQB+IC9h=j@csFQ#OEF(vZywkMKrwkP5zwkMNso{W!pGE3k| zr_z(zDNlO)o~)SgWcI;xM8MSJo_RaRCxXqMBfMKr#<@IEO<;R6spiQ%s3(IQp3L%i z(o6Paa^90cWlv^hJrUKnJy!%)JP~)YJz1sT$s~^_onudAMQl%0cGzCX2N9>YJsI`) zB;P#AH&4dpJQ3-&Jy9KDdotDG$?^?P#=ksU^1+sT5E**g6WIsblk4EgIG-mgJv-Abgz{wa(UWmjPsT|-8NKvma>|p*DNn}VJQ>9IWF*~_k#tX{ zXgnGC^<>h^lZjGKhUh#QS@&eHC>8Qq29-P+*Y#wo$CE)MPs+C^<=c}%3Qx+bCyP8% z;rhrVswX4=p4>m4+&`Y&Kc38=cp|@Idos@K$t=Dn;-|JJBlez%&)S~M!+SDn<;kd( zC!%bI*Yuk?aAD^Cv)eXEHd##KGybRwTvf=OFWs~^nAIl zzKBD5zKBbDzKCO{0_w?P8&A|L*q(@2+n&tUdNSJO$yA^xi)*~3lxq=*w>?>V z;K|stCo4ldnMd%Fl0QkQM`SX~lT}DwQu0kEy*yd-^?@?`SN6LloECo%@MCo=|~tSj+knT#hhFP_ZEc(P8y^CW#TwC$zBd4zO} z=&2{_C~Qy0p*@*>^kn?plgT?z#<@L_{kA<3MYKIp%VB#m1 zPej9QFD>nah=bdn%(-|n=iU0C z^y0Y%(Ii1bst*nEEWCJbf%7Y2`>-Sih&^a8aMJ~B?1Ou89M_8iy<9y;M8*!X=k=Le zOj#=CLwU@d$Tj6UGeTA#Prf{+w>(~!*h}?d*VK!hTQBx|ydbC}CR7pQ4SX)q8+#L8 zRZK%w3>!q>By3CrFJBCM<7vie2rrJFq+&0{i_#uk>qZ#jw1*eD-CX@f08#pdE8(~| zCNc;G3nJslbSg@a*k0_odr`2QYvu@9Z7hgER9+yfjn}v~7MLKuCIRB*jsjv_Q%88C zC>YnqP{!3G|zpf`3_y}%chy)j-t z#_LDiNd?)c05%opk5X|)Cnb^q+zm?wk!abB@TTHqNh;2eq@o}b*YY8~sUY?tFvy4k z$LmBqOGVKeuJq&AVtU<(lc^wT79jJ2w4!YGfsHZ5LC91bgiHl_m%znLR`^<%q$JnJ$W6iw`KCOZ?(S;tXyQ<7elZB@hP>V;%z}P7OL!xgsgg6-nuzB;~mxDgBeAIA1uv ztVH)^MU*eUBJgF^oiF?n#~0@c#~1#I{-EQFVg<*q z49?MxFTYOkg+Ji@r7UG_`wCm&Mq=EQaw#T*UE(U*q^9 zKH~Vozj1sa$Br+~$&N4lZO4~i1o^VM))#RM$CveKzAW zHFG7TWpi!CjFFQn=n}4i_`_nLf?Bx>niZ&^wm=1meO*&a?Oimt)yNAy#5!B@;z_Nm z6#`{c%yb!DQW3^&J*lMh zq>|E;N=nZwDI+^c>6s-(g`J(05uT)sz$B#ym6VZ~r1Yec(vwQcNK8_CP{~j-L}HD7+a=F2*8U)F*9@>@1v z)(`ojSlaPLS-InjQZmOEWxS3rYCj!cly^D4DC>26QO4!?vfkX6pIi8{V$K&4A;%XU zo#TthkmC!_&hdqXaeT3EjxQoXjxXz}eGw6Id|C15i%6j33y?$Esih0_wZ%?oG&6~jxQo+ zjxWFB@nsdKFTcp~Wd)`$B1w)f>)U-%@#y$s|2e*hWIDe5#?hDG3;6OIBVX2-`XW-{ z`0`U4UzRxf@^cwqmM!`sa_#sc^5pokT+tU1D90E3-SNeKcYF~Eb$qcO9bfEE#}_9N z#}|=j#}|~10)5RJ zfy(BGSE{RH-^KQT57XBq1Vt0lDnt{H zo#bTfBqw9fI9U;SEXj%}nvjgM-pSZ=OU9mCGO8}%HX|A>_UDqZ@0Sc}c*HuyE@Lt% zw2-}#CzK5G!?HK>&XZA!ms^@>wAlAc`cb$c8M}eW*bPkjkzbpPeZQn1&e-wo5HB}E zatLmR;$}!Bw?=VqNF=vOac}7Oa?2F;Mr*5XCx+?YkLMQ$rMX>o5%q!SMjIkVinMX-_daU&P?Ms6!N zb#ZTu*NyQ;Q5A0XV%V7UiWoME0&x= zTgMn69xVzfaWfeKL@`rtEaTpIh$v>tt!4}m4-v&dx%rF$D&m2o-OcT21Q6{)ZcXFf zc;ILkaQ9s>9*F@_~s?K&iu%Hp~=X%=Ynf-PH=A(TRL+=kJ*&( z>g12irq+uDOrdoy@30EFi*oHjE7#iGQVf9FTP30ZbFoS1h>J}+$6IVN1=?bh5n$z4 zj~Csl3b+j9X;Ev3P1M7vPJXCd3A0r~Pq(3)+}&kpzzG&nzaL-K<+1wTZK z^CN)c{0QI#KZ0g}RsaV42wn-M+TJz0GZ-Ui@G*Epj=`H^4AJ6a1aN$e08We%G{qPJ zU@!)61^lyxd*|B1y>o5h-nq7L?_68BcdjkmJJ%NOoofsC&b38A%(X>8%(Z2J(3S~N zTNYf{!o75D;fA@kaKl_%xHqmX+#A;x?uTnvR1L_@ZEVZT&gSQ|k8I2oa)U1H$`$yp z-$y-S22OeZ_O978`R}?n2YaGlpW9-S0P?B_^zG&Qj*E{i;!mzE;&rZFneIQcGtHQ(oZw*a>6=|$7XT%iTARB%a~!aL+~hlt zbB2TU>(gCq8qoJHUufE=xvRCUEjOE&s!Lw&8+FCA4ZsSm?agg_g9TkNn3ZYI7jtd7 zRvC{9CuUb93LTlo+{mWROb~Z>ZCP?+3&+g0MTpn6MM&4RMM&4RMX1-cMd;U0i%_v^ zSNm$Zt5c{CyQbRYKU~A7UE0{y*_mr^yqMo4viY{QOrU*B0zs+vdAG^mk2xO|rc!xx)MqS1>@mK?m;#7!xun9Ff6bl6o> z9XIRZW);U24O?u|`KZMvOAL}PH1&&z;j;(_;?zb%aeXWXi@N!6@l9Rdo2uZZUpy#h zQ!s3}$s7@iab2gXUu%0)YkO<);y?rgUbs#wk-M-f(-ug7Vs>kLS3&5&jyBmcviaid zOtHnx&F&~(T*w6<{<^k^wY#?P=v`OVB-tV-@7nT%JG-Jr4#4-19Dp~)0Kq29baZs) z=L$0Ng{JgnxWX5Y0I`Y zHSznBj$CIb%L6)coyC@XS0U4$<(|bbmp^Njlqy5otZ4BAb=`#&7Lj( zqDQ!hw#an2c13mnzT7G{_3OhdF1vzP{2&ofT5L*$oGLaA*o#rcrjm$HL0ht^*klA; zDmInIOe!|@>%*gBlPP9VY$}O3RBS4V7*uTHiZtR+u_+O=E4HOB(SbUuYV%H%Isq#XJ#rAy@dm z6nx<#+J`fI=)Sz+!%6ON3^9NBUCbdaxO?%4(-v_lc-ogwe0aerK71cu1+RtN;x`e$ zIA9-+aarPj#br)cN3ivss)|H#AJ_reRcQrX+{nwGD$&F3hwLdAJu~yg7SZbJ$VzAt zCUhN|N#LLB|()e92!*VD- zk&+NPXiIp$Y<=F4DxkVTobhZ|7MHr=j|j+Ahbxl3)fKYH+Lgtst}HflWs#XHi&tG) zyz0s#G&f2Di{jR#EFwH-7(K=a%o0O&?Da*K$vV1Hl z%M+8bygDh%Hz&FzPi*l{|KI}! zK8N7hJ}vqDtjx^(MRAuH+^OmN?p`-u-zU|=uIeonXsc2btWCPnG4QzuIqlTNu6%~Y;d zs^4Cdl|;%!oh;!?%2L3jEDcV|QsJabpw!9I$)qg(P0B=Aoh+qH%FBBAf z0yU?PyDCq$9NsHAD07{(GCu|URX8Mi2e`C?9_?Y?Oz1@w>9>st<;Z^2|)3Q&UD| zJ18vvPY}k2qnWDl43E zo1Ho%rK*5)PP5f%DP4yx%yLEy%$~oa$N~H#dxVWt<)~`ocMy)Sy zp^1xoX5!+GvbeZ+FxDMvGcN9*iHqAiV*Q}njEh^ZV!fMrGuFF^Hsi8m`N53xqTwH# z1yx1V9cGA!#IPJY+j=r%XIoEZ>}=~b@}2GSDmT5hzO${@ymz*DB5XX2S2P+%J!Z?f z#hvYH(F5ZY*=>f!(sNjBDhZ2CC1J6tBrG4f8S~wZH!FzvlI${~(># zYYm1JVM8(`H_1&?5@Ie9a^$I)pC5f~I!9k?=>+C0bE(uT)K{nA{(UmFT5}3VfN%=r zP7_4qQyL`*eIK0kf6=vq2hUIAn*8>jFuE1T35og9Mo`z~Df$ z`vOc(M-;vsfVF;ia?zLzqG5FKPU14x87CA5gT#e?>QLw+*G*F@H7Fm!#X;g05`_&6 z-$3M-gM{9v<8e-5ZjfXS1&U#F$X!M5YUX5VnmS;3Y07{Ml6z??pvGxL!D{6r3U)9^ zz-B(wneVu63PvWt;>=|(9ZCDprx>C$$4{`cXb82oOQ9anF&%^9$ql;&*7|;u4V?TS zO<3wu=-*1f@EojEk+T4s!%W~!h^b9e=P<*3Mu9Lt2lMbg7(*~Ju-gJ=IK@KF2gAn} zIiy&2=w~THvQQPW!6!5GB#8XBTN!(npEUlQPQ~yTkN~V!Mx!yyu_2VDh=bMy>OjA; z57b&L4|Nvvr$mRfL4uL1s!c~~qR%jYGCx;~64zmF+I9sjaA}$mjPg*xA_pU*6q>-qGP0#cbuU*mhHB2D`8j>}Ft|Y^qZlP!h7jLNEd#*C&QysE)G2 zi6mxpJAozU(+K974|5Fc%%>R``QMk94YEjlf1Js)bq_xFoR?Dp=eQ&*o`CaQ8c0{U zG?8B5vWE0~Tv|w<95)rPQ8kaT3a_-K zZJdvijZ`(l=Coy=4&LJQiYo6VPQZws?$Ka)&+O@_C#!!`50mgZ>&h+Td|SX}PJ49s zlo|mE@~(g@ymO%^;Oe(Q!3c(30oz=fWVJ;*bQe1>n5`S*@h;nCIZX~792S{BxoQ~a z&$R_~IgnMbT41#l1ZD&8-nhdk?TxzvUOf(`9i0YP%tsW34EuY3KY3)*8g(9->$T@o zAIHE(K*vm>S)73tJlT~p3Wlc#do##J3~E6>8YEx_xdXKz!!hW|I60#ftaTRWU57y< zh{0?@BT%_y^jVoO%!Pp!WN3T4m4p3Ms$i|>`1nwTXl0{;9_5bnN(Ed)8&FEYUN3CG zdR+mpDK#{hPbrPrE@p{q)rh^|W(k ztY{gAZv1*tf}m`g3?I)=8m?^0>zvUJS}i_EXfN%^j&aTt@J6K`Oso5qTA|CRConr4 zx?UM_B2k~itKOK>9y-go`wR?NK?gdXfIyiG9k8@6Iv1lo+F{+Ij3Ji|tL0aoTGsd5 zU2*qWj`3Z*5ABBIOOJIOcdEVJv?ybQ#wd*%WBpyUJQlI2M^)ur4&=PkhzT*WbPnl#}n{V#31uFVvtD?gG`E;z!Pv6G041w z7-W8i7-Zf>Oza8xIbx9c1!9oN5Q9vP7~d0ch!|vsh(TtA7-a5oxK^3@J_>N%6YxvL zz2OP?mGY-+9`ro{zvl2-h5ii+3jJHfA^JVVA@p|~dKL8dC@AP36o=6F6^GCdIJ{m# zKSV)6A1Dr?A1Mx@AM;1EmRWvz@;zwWgWB5Qlk$-x2-$l~{&kQ@!}v=IhW`5fz9e=3 zAEQC9O>ELeq2GMF5i~Yun0>*r8-*&bzg53xw`(t$N;U6)u}aR6=BKlyPKZrr+mbB% zUyy$FuXHsM$~EKReggf6iL8x6xsK9jjZcYT^&bvzCkRQ?H0?LjM%1`8)3Tql>}LD1 War7s!{wz%rN_!OQ*CO@X^#2EvSW`a$ literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf b/scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..821a43d7fd25967a72ebe7b828fd8d1491767de6 GIT binary patch literal 437824 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 z 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 literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/FiraSans.license b/scripts/developer/utilities/fonts/FiraSans.license new file mode 100644 index 0000000000..d444ea92b6 --- /dev/null +++ b/scripts/developer/utilities/fonts/FiraSans.license @@ -0,0 +1,94 @@ +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/scripts/developer/utilities/fonts/Raleway-Bold.ttf b/scripts/developer/utilities/fonts/Raleway-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..38c099cc857f5c21ed7289d757f2f96ccd483552 GIT binary patch literal 179244 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 literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/Raleway-Light.ttf b/scripts/developer/utilities/fonts/Raleway-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..91aa0c701f04f5bd804362b583b44f0b4a1f9acb GIT binary patch literal 182376 zcmbrm2Yg%A^#FX%eNWT#X@11wwz2}^J_6;Ba za0tLcX~&}8?vW)UKL+wt5&(SN!$XTcM#oyfL%#!fQtVzd()OFKUt9#_@y`L6uAxO$ zkz4LLzZd|o1b~T^>nAtOyXdlw0EH(5D1Nu{2Pg0?1=hmxyz!aXFaZBLfTC^v@)h-!Qp; z$~AucJAiNX02K0@HXeV%PxrT80ro&?@DYsRP0$Y0&`#RHN>)NWUI`)m8bX8vKPdwv zv4e}GAWqESBl96jy1`B1;bG{)FTsg-LMMI+aeM;=rVXme^-xSMhf%T%MDjF@l2tHD z7Q!fb4n%SQM&Uyk#kZl9oCc$$6GoX$Fv=)klza>#Sr4P+|3D-4MVQu#r^| zAW0a6=V1_D&7McJFo+B+WG;b0dYueIKz?o&1aJff@gVS+gmTgky`&V3j0g1if4~tN zaQIi?;d5w&1CWN#p%y=c4jKRdgb5M=5&sMkVupHh71-ciScV@%7(GzWG(!#E4mHFF ze$oPiqzc;QYv(`=6%fOhVLtv4+_)9o@>-@~gbaX#;u=f9jA{_@5eO3>%wwz&##6vT zuQ6Rvjc0(H2|$oOi!XvxrU9kH^-zpS2+8gFP?f(1pFo^>H2X(#JNRV!P#VpA;X`o3 zhp-Sn1O`3?8`%fKEPW`A=6vxnXqSIeI?er3I;CNhxM5JH38l*sU*(rWJ42A%S6N~^hF8*pS949YFV1${roM-hbO{&i3U z??SEIr@TseW=;ziLnMDq#v#2=`FRZlWcus_LFO@vH@b%Z)>8hbeE1zLoDX&Ky#p{R zuk!<_CP^rS53}#U^Vt{R!|Y$+`Rp6;A=u%0D4}$rc%gfVJPV_EBMj0#1;)DYXnVB1nXsNuQ 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 Jcpr{+0 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

eix7GX z?VqQ{3qA^e`hioSW`|idJA6b2xEj6}L;*Lgv7pxx$matq z(a*F4{zS|#1tgwJ2)xYzttCg9dR^dTm2)qOoXA=kk>-j#uZ3D4W>i}~QmvBC za|)cm^*`ki8NXWoms2mJPxzE_RwkcJk4O$KF_!xma!z>+SG!M#Pbhzq?|U>AL4PYb zhupBI2Xty*F)cz^i`JllREJdGSqcv5_~?j28_GCUdSEI23?y=(g3ZPAB00YEVD)57 z{y5PpKa-AEuDPc4#jCCe`INsU_viDasAEY99#xQ?v1qnj*3IkBp6*t03Y~4V}av>5{KtptzHGt4)ZH3xuCWhJ`H%3t* z9Q6C#F;9%ML02c_!Y*T{XuaAwLDDW;*vdGfiK?tJ*<`2gz0QPfAZ~X=LLs|yzW$3J z*OjL|sbuEt^jvhfm>(v>oL+A%7!Br7IZncg5C3reTjdFfV@9fJuM`WUt5l(U2RT6N zOT<?h08Y=cxZKwsKH=qamvN4ft;`x*84Lbbh978}NAs{5F3=;A}Ke0UNDn z1^VpN5&W;p;dN>O%F35;iCU+`SZG>{3;kR9LGaXl{g_C7vlr85rysb!1|bGk0_~w@!a6n7(PNz!>sDzElMgt|TCHE( z=AEix;yBL81~U$@OCT-ffK($xX(x>Mn|~Vq%vJDd|)Jk0h&GxBiw(8%zXf{Mz92TL~sf@AAk?$x!jwnBtWt_xGnVbSL zJSf&E8vH!O0IDUqmyY80cnac&ZmZuOy9#VoUmsO+Z>NVUEb`3`s)$ew@N?v`?TD?g z$z!?z!)g!&+beoto)UmyktcSU^&>W{%$$chTR7@VW0T{X-&f@8UMJshmg=YD%0)SSRW z|5EJ=npqr;E5E@*!O~b%94o?s7iBk|C2t{*UL-e72bt!kqn+GzFU5J$+;lc~#hr^i zg{-O5v+->E^l+aj*4!(WO89i^u9IUOHLUv54TEDh9jx?(uv%;Pz_W4S)w^R0OK7ty z4;&M4v1maaETgJG+MRxrFtX(SJY0eLBytY9z&`eSq&^n}r~DWI$D3|P<>)0|;C56; z<8XwxIhw9_DJA;73u2J4@h$R6#)`bOo7Z5gO8X>0ZX4Pp=rOCq?3w}V5YinqU|^$b zFw&vjxh&`6I1k5pY+wcADk~4l_|&sK%ZsY4i6mMXz_Q(VX~#`_bD2Fi&&oS)+LOud zxoKLKn@1;Oue(hiJ~kPPPaPeaW3s!ho0_<8F|RpwiYe^Aeq!pnojK;3cQT2I!_Avt zqhsO|S2mi5ClU<8h((B8NB1-EEVl3=`VRyhJ_PHgon)}cFe1hi&ph2!eu4*@|Nb9C zctH6HIj4LaPb&8-{|z^k&*LNbG_@ETGvq@(kJ}j(?4w~5^Q6}PL%_;2gGN^TFW?Sn|XL7zX~ih|PK_J{93KT>rb<7gFIZ)`f_!<>2k zyo{q|9F;kKx}>SXAE08{i5t3o(*2~J6u5+-#;%*;g2;&& z5E<3v*s%E{*WMl(+F$wU|HkHz<|i^vM|!gO5pquX$;~H=yBiU5|N7hg`B70E&HE8U zW6m#7j|BavD7v^zY|_-R?QDAqTh0TQG~ z99<5L3ku6N9|@9Qp1;C}+v%)`z+=RJ!vl5chSSgoaODdJ-Lmgh1EJ zMecv$d-n#QcjJzh;Ty@LD2-aJ5vu4!5kXb!1~UZCoK#mt*hB<7dQM(9)W4aH(3Sx7 zoWRR<5y84p6*?k@Jp~Xe!DG3D?O}VyQEyEN!)xsvqr3s%q)E=MPDI9sD~`1Anv;9) zI+!gk-J#>tqe(tijoM0kuN%%*R~L)ca5?UoIyiRnuGZ8&Yb`on8_zL+LLNgtlm~nR za1$N$PiI;6Z0u8uY6#T&(x=X(gs|P#DcIA3@|dCf^|2`KUB~tTD2>LrTq_Yz`ftifhZucPuC$BIlHk?7ZV(p?2)v zUHe{hq>N9`-m)i~-*@vg{kr!Scmp7kxajT*Kplw|BQ0nv(qk%&JuUe5sdXeYCW2NF zXaEf)IgVxB8G#cS(E$mrQ6kG6L+i!>iIVa6{^h@qJUqE8(%dKiLjG8ymG`;Qqp45g zgz^L~^4HBI=Nr-WCb{2}X-0+NoF5S+Zajs5KsY3!Ci;6d&FkTvR1$#2`8d(AF|5;s zKs|Tff8l>ZI_>bj(T`ne@sb(}140v3$KZb-Q^^Dd{kh?b78}tnClzD1hrK(N`_|+CF#}{Lx1z)7G zSWF*??w?H@$U06QI&!T`YtlG9Bz9xHdE94&RQ229d}!a+AM4-H7>#bm`^;(R8K>H~dIu46fCfjmJ+KzRZb5nj zt6%M@jVze4!Jt_|6twAJWDb2_v1?yLNedMVP;oLx-}&R&?BVR|Hjf}GaQ6JKdOcym zv)DGCBH&pfFdiYhj?wBk%!2d;gLGO(w+2yG2k=5H>jx5*<|xu=Vw$!i7LP?c{>B07 z3Ia!`cuPZsE|BvD3fWA*?An)Ke|50zw*@5k;@;&Y`Cvk((9L%yZn^RLn~mnY)o^%e z`LLK!KHjm$__q|tF@R6S9ZZD*3hP#Ep??;qPfB})@F7tpD_-=Pq@=p73`(SS2j^$$Rio5ome2tKHREEbR6Q^dA8ho?z zdM4LCJuFPM>h^a-9c^pvo~gdDxwyDm%?@9;w*+xB%&xfcENPO*Pywot3froXXedt~ zH@aDc1a((bWVOGJu-n{XYZ)PacKYn;qaJxzy|FSb#wS-Ae{r)v_v$?>X9D&8gN=hj zq4>n%!Rc$WWO3*2$!IR(GMj_hR-v$?;JG?gs83CcrI^ob_NSWJ;=Jrj0q2t2m?3{o zkprrapv4Sg_8^_Ei@CCdL8!Yg91e%y;irn9AZ_c<)a6kv#awwR_7Ud<*2=IP?+}7s zx6?3yU$&B8e>_i+@*gIHE12-+87?t-%{#AtaQ*a;{{HWOM6Q0#_3yiNj;fvqHlD-Z zp-hv(RyB(?S_5V@ypvF!1`T3}hJnt6G$FiYC}Tn*o{hqMJ5<<`vgm;&w53_l*8UBH z{?&=2XGX^s_C!YyROVkEOnI&vNsbqMFI&rG4jtPwRXf0wn-k?Lc8~5GFrS*s@2rQ$ zDv?~>l^%-iTF&oi4UeQLBa-5G%zem$+~AKLRs!iaJ@lNw_aK6xqtY74f~q)%U)x5# zR^(7n6}3kVpj4w8=?ryWgQDLmCJt^BEX2^p zQ^ZPsfC6f*9fcU@1AYS13lw_ok#l3X4YHugxQ2DX`*rfz>ddI_s$O?*0t2)F9Pd7U zvpH~NsKi4 zfdzfH=)sTM;gHjTQA!G>!|8y}5p)K*0c6K^h@jMx8mQQyZzOVV8jvSMkyrl&31S}4 z1@eMD9?!}ysTO|b2Yk$HEo2`4tSjLku=?Vz&l5c_7QFFk&OBWV$qAn5e*vwLq{g}5 zK*@$P7T~@Bwq-X$_->-_^@gBUG;l#HdiMs%)ImEx0`=|ojpM{g^vH(XfX#2+DI5M77uE^jwe`>&<4Q4g*U1yKHPKiDC z?sq?iKXmIKzSGmmPQd$VyvyW(uEskUw*&y z%j|d!;}2-^*NFk~sMeC52BJm47ey@AYLIr-Xn@0K0FqQRgg^-KhzAgn4y6f@L^mZW z)MeHI)z4y8WJQN`U&zqSzR%7KMfn|F1}7vR)X~>vz?~X4;b!V}dX)4~`^Dc`4_CGZw7YXNVpdwq-Q} z7tdWUHyiFKS}h6qn4Xts1FXPMMj-O z7SC}!Jq34?oobSk)q7Kd&t%0y`BPR)I9-cnaIk&P+Ur1sz%N^W8vnKOAl|R+BUBRtX6cti zk4*I0J3>~FgA4TK;AnoumvI0ISycy<@5ZC0lJc2S2}gds{`C3ta5c5cAVFEUv|^`Q zlS-Gi$`Ph`;nteot(M`1XIY%QWczaCW%Mpr*Y=Y{uU4pb!(v$2^ytz>MFkNOyPSZZ zEGb_p;Wy)NC^7Zzc5h_JP^X6C{+1yg(=*#R#sP?DDe5csE6{IS@|F2o2ScT`Gu?G+Ew$JTw-ibI=5#u?v~1d4*)Bu zQ}L=04#lB9E8yQ&pGBvgjz$bH@OW$s2EMf}peRkP_*<{;dP@*?LLCFGF`%28zEPZM$L+iTZ{()6J)H*HK(Uc_dm>hkFXa4j zTFRCUDcJ@)M|l|&;hoQ zxS+=@i;u#)M8Q#nNZa2M0s6h?#Xq&&vgWcB5bt8*xQB#Sd+0cHa)XnMOeMc1eC^oD znS?ZZa-=+Ra#l*roE$5cbISTxEtaoh1^@!Id*e9qQ+q~p z(ONYZt(tc23Zj|97v!R8h_t(eeWk^$a*XJe7;O5--reaY@l764zh=>04h$?n}7pyGPk?*&GNTO-ABjYSbv&capO4o zH#+8!S=6yQRroQWlHaIosh?HHql-^;FG$O%tAcvn#oYQEH?K{H1`z~JOuR&otjJBX z=m^n}s#`+{e!W8i^5eE`z~vlp+uR(Nh|ny04~zyTsG}3k@c(}2&ZFM^Sp0(@_{Q1M zp`o!m@%$CL5+hkR{zg_2XDXHH-ynv1M2UJt8}dSS7S2zQ6NZBlSXHf-taMzjo%6Uj zuiXnw9veVX4w>)W8;)yI_ujipXWQz{@%u`pr$>jHV`qu}6YBkme*Ni;dVfN_=3mnL z^MDxiVc)>Q>-4npleX33v|D&9PZI&|EqAWJ@U9=+ddJS)Ad37g{x#uH5~A>cpD-80 zy+!r32*)AnXCt8=?w!O*wU5CIaqrD~F{hQBkB&F87Re$NWKU{#FiMnv!<;5una$-7 z2V=gI3&Tez#Ms0UgDsK|*?kGGS!nLerKGvRXr|(jC-Mu&%JT7@lzq8-<0Y$w z#OU5)ZD~x5x0dDdzL6MnRjKqge`zX}nJM`L@{Uw`y6D6H!7Inb)ZB^Y=!qSP*u<5C zza;u!cq;pvVPR-*xw3C4EDY^K1VNGapU~aogA6k?X{W(rm*&|E7;QG2&*qJC94EoP z?DnFCU`b@fcvS_uUGm?{6Q0~i;=h;fdTSFeob_b{dqe&w)6Q{daJv5V7ryY!_iUk* zw=@AKU#QrW$P+aGSweTV%%vj1I!JpEXb}ry%rQEo3=F9bdKhgzkb&kh#j9f!xZV8h z1wXdj^1{)rkl%iI>n0sG8I>12yaBlTpE$tX+8B*q<{=J$=70@pI^*#*S^=L%RdnA+ z5^=)nK!-7~xYWv7umR~vF_mX?;*Z_O-RHCR7Bm(I)`uW1KJZs%ZR zz!!I!1BIvqNAvA^I9%UJ&%L^h-S}zp1j?cJwgx00VTb`^MvoDOHiWLlrB;H)T0Pbn zph|}xG(g1r|7q__;HxUG|G#sRyzDDU2npb06%=ANKoD&}*%U#8fFOz?c|bHIm;_O4 zX|1glx4O3ewAE^D)w)x6)T*^gT`I+eeKG7yNC-)QuzdfYnS1YhFAGV4V6pvw-{;*s z_ujcPXSQ?BoLO$N)-KF`d7X8?KE*7JGnLKHcPJzvRAx1J%krx$TaZhCw9pB;kzeC& z%9QM=Gy57joN#)to_eG{sFB?-)-o$uQycA-0!F7zOi=qf^%>aNJt#gUx=(zEUR`2; zG_uEe89hTY#*E3Rs7RhOa>}Kh-Gllh#>RJx3X4hUm7uy^eRY?N3;G<{FPHVX>Z(3R zMo%caPD?P$HnR!=2*rrkETg&Av=XdwOxt$eS!YU$R=JGI=C!Fi_ouwB4F*QN^;*?8 z^f-6OSYyzUc`*|Y7@Lk>-L_91c6fPIqy$LM9@3m?yoYZYw&CTcb@ux?|1nvo1*+I1y92tNJ^GBKjI&OU>=W64 z@UYO-i*qwGuD&RBcxH#JGxa?BzWv7y?iSIhcXC|URJYzO_B7V1wq?oeGAFE0pYFYT4$e&K)-f(DEWUG}(@r1K zyF*`hO4qIt$$dL_>>M8*8j(DUXRy1ZG;@&FAJtkLx8q9;X|8Og=4D4p^}3GT>gwn zTRuW8#m?F>$vh9#qg;NErer6#F!j5GJ)9K~n;9F`Z(6_744YB>Oj85lLXOAnX1A!0 zn4TRLsGOOlRxWgcGTT6y#q+*lqRzUicSL|o1xkSC4wff~eljIHAwFIqzGHmH!~`?n zw1euPm5X5gZ4G;;18W}@Ojl-`HebQ{&gz^5jvU*ftj#aduY5kcVv3%koP`kDTCGU;1aKo^|djn^VYPV~0*@I(NKt!@1+} z9g>qeq{OGh#_HXg?YZL#-E>ju2^g9#Gj-gu;3bStR~^zH9X0v#k)I!_NS7E*&7%^s ze7QwR(2;{@T4X3Q)~sseyu14O z3kFm$^vA)Hy}tCwLqOoIO?}zHOqr4$VWywQ#wK(R)gMVbI-8E|p+5f6s2=C0_X^Fp z@WPCWicWJzO}R8f1zde~=kyVMj_k9T@u86uN=uH^*xdMY(@JA-dA8m-6fPCuaiB5za7wnGAsicLO<6Y#+TX0Vy~nvjhWjjg^I|40^BVUo z32{JHArz4ql^qcoAqdoJARMaVO#WH@4twHvioS`!TN~V*@`f=fYwMhELinJ}j=?_j z>EQFa`x^=Pa7UfZA_I5?MRQCpk)|ZrW zg-4FQ$hKo#)+13V74WEIbG3V&>N5#NxaosCv(t>M#Fbh`G?<;1si(5&*;hRhder<$ zcf$XiE}=(ysI`ap=^pr1&?DQ|BiQVBV>Z{e7dDy+Pu7A2YsdX=gEABJTv1i%I{nBa zney?=>kgawa$3&cFHbiUhNI*-);}kV@hZjD{mAZg33+_U5wqJGH;>F$3y+L8vr8j*rgSl5KWAq52{vCbwJe5OOyNpB-^+BGy1K^3#&*+R zqtxp$GIbPY>&O7}rQ{y}RMfuVr9M$NU|3dyEj>-&Nz z(S3OB4!~`C(T8yd`uPdMivhRW_gzR1)Zc^B{)3Sdc!})}!OXxXZFi`jJ1j6UD8#-W zjtfG&+U^MS3!P!RBb7V!9@`y-tgshtcMPJ!%58Tn!osS~FP?j2Nx`hyW$r$Cecc&p z>1po%`jpwveQ|DCnfv0rF-4w|BF~NPK67%*%ChGc+~6rJom=9`%}>oMp3}FV`;y!l zg~jeMbLQq27Uq@|xcd}1&g@xpatjJ=Z#l*JB?YsJ-6Q9Dif+m+EXdDw_nGY}EG*70 znd!Y{{JQ5Cl+AYMcuGAb*L(8aBa4g5+~acRc--A{atl54b8mFc?y;Ki9M7zIg}Eh~ zS}(Ev3{hU1`q`2D;vV9*!?MB{Vv;<`Q&L(`T;$G7O-oCgb&k8NY-aAfvf|kVMP=?j z*Qcir=w!w!8l*bG*Twp5^X;fx9rbtjOJeraSM(l0tX?`R-Bf{(0{H zm%F<=)b=;j;(QciE^b5#3NQ<^Q3f~qAP;@vMh4Q5jx@N@-+PsbesJSr@y%>2I zgCclPVvaYO_vhHpvoRM1xB(s%q7-vc0uOSLk5uHL7<16qgmwvXF$0Ath8trr2Xm2& zLKGs`P^IZ9XmU3jvrH@nC~Op34vLX)r$>i467%3e5pFV}79bzFCd}D}DjjP!N-(n- zUp^|`n2!RKVK&^zfd{1~z1PEod=o=4icD^dLoVjP12?)O$HeEseB|QBCf9C^_2#$^ zaTey;DR%On@jf)L%+^lhc16Q^i!+MGcn1euoML*ZEj>D6=~)- z3+KRXN`EGDF%M-Z#%vVWInW2!BOR$2U}{i*6vBnfP_AR(;a#SGU%|jY4oYNQ*;b%Q>$@ z(&4u)|1Aof_K@NCb^$K(aywuCjKM5Jv!+<*mFA~9cddNZY4z2-eB+*LYP#l^x?HRh zawydKrnyKyiZLHWhD&L_sr_mWT84Rsm+D-ffnu986{FDjDK%xU>xeJSg*H99Y}_cq zJj17S3(%ZdmxzALieFQ&<8r96=*=@Rmf0LZ`_Z)PaCJ@eQKZAtWoB`EEhV%+i{I-s zdr)R5(>zq?i`C|I96A?tzUesfY^tpKp=*zp2s&h6P17Ok_%-GF4gIvxgsx?grb*|3 zE(a}p3Jm?e5}Si!bH|NY@EB>N>Cy4)klNO!G%dQUbWZ7*%FG?za*EL(vruBnM$3!q zjC^U18r|Y7PO53wIi}OD0RE z>h~-@;7Btq<9%VYET1nk?N_IAq*umGFtL=GwyWj2Q?qqR=vu6E+u|Ja?DniVzf+?p zU<}5>jq!#z>0I-LtR;^xy4AS;Kf8YI1Qsat*I@^1)w*>-sqo!*Hpo zGi65dHO!Y%yDrW(WtwXEn$|RQotcHRFdic@_PE|@$k}~bfLI*^zJ?6DkI(?}2SAD5 zR}O*ZE04h#h!DJkQ2iBhL?9ATh(-)z5r+{0rML6JKE|{*9L~3stxe-{Nb0gW1@L3M|AmD8RLt zgF+PH4=BcUhHsT(9+smF*JD0*;0D};8}VcO1UKVNJb|BL0e*&CunW8KwhC7fDiW(z zl#0d%6@$Y#qGDB?>VP#W9>jMFDnTWxjw(rYQpqYsbyi(eS9O|lt8S{h>Y;k7Uf7QV zs<%2_^-+D*8R|^cPxV)+>MWI}(p84aR9R|(8mI=Tv(;cVM4h9Cs&mzO>PISD4O7F_ z`RW2SLXA|TP>zjiv>Kx>R2QkS>S8rcjaQebOI41Vpe|Dr)g-J}lkqZMQJ1SJYO1T&f4^@Ms-{ZT!o{-pk_o>tGOXVqWS zbLx5Zf_hQCq+V99s730p>Q(icdR@JNN7b9^E%mlqtlm-Ys`u32)cfiK^`ZK^`bhml zeXKrFOVmHrr|L8Hx%xu=OMR)9s(-6x>MQlN`bK@Lma7$NrCOy{t2J1Jzv6YgfsgPi zUc*1|b9{(j;W>Pa_wYBhR;^R()duyQDpwoTCbd~@QCrnEwO#E{JJl{#p>|`Rs#H~K zkE&LCRgJ1ub+`+Ut9@#}I-u&+L3KzSR!0;?FR>InECF}~|A$Hmlpy>G_v3eX8o$Pa zcnEKaOM)dtLM2SXB|;)4N}?r3VkJ&GNW3ISqI8rb=_JXLBAum+bd}S@E#0KM^pKv? zOM1)c(ntEr8FHrdlm3z_XGxl*ONL}hmJE=AGDyyr!7@b7k)d*~oF_k$Y#AoQ<$Sq7 zM#xARC8K4GTqqaGSh-ln$#}U$E|naaAeYHRnIx0ta+xAit(*&AUDcQ@?*JKej*Fxr}8toMSd=~ z$}i-Xa+~~0ZkL5}hukT5$=z~~{95jn`{aIkKpvEbNeiTUJ~WSzP2vEt)sSQ=+e;%jOsRKaDP%UE=Y39z4tn zH8|HgyN1mu@m%k5<(gCQu;N+8MV@PebFFju`FRB;dGqGXEcDzEp67Fiou6M^mYb(( z3d{34T^Ho#mJ}Dc^35sK98+@(_5G6K+%i|bIR%ffDe%}7jIb#1m{ZsYZ*XBAuQPar zO_#?yyGB?sdCVz%l#jCTSw45zC~p8^v%JoTQF+C4=Hyz`hx@rBX8B!&kM@NVKHKLG z96ckqByjeO+!EKAvVy{VkE_6(g2&jYDzH;E#!6Lzm9JxL`U|Xc*cdN4GUh@lxF-BU zUlifj_}n4+#bt$_($Z@pF7hKT;@Somvr0UkqQcyw{DM5!*xbB%Wgb_dIYo^1_gCn5 z;TmgYV4*n$j?FJF3oOhpE_02u-Y>G=ALsWW(9bPW(AM8^QPF&oAFlO6q{4z_}TM{X62U5n^TxOuPn0I|H_qPkyB!kljBE0 zM2X*pE5{~p5;GApn$a|*mnmwTBm z_lZ`y&$G&XqMf#RcG@OdX`5$GK@&>~ie?4P)5pk({wa%`=YJJE(XJo!taJEeAD!Xz z{oGUh+&B8%uBldvZ!)K_sovTZc9Yi`G$C*H{9G$_=V#gH0rq*IeI8_=&$iEl?ej4E zJlsB?A3WZsxY(h*s30wUWV-cyq@9Z+GhL%B%4S)V4bwScIdi?v;9(=ot>9dbIfsug zEzB*QZMlnm?$BZRGYV&whkIHRuJ9LEO zKh)#6qDD0E66I-d89K)C7h2%BqQ*4v5>?RPGIYG-FSOWkMU8LZC91f=WoVA$FSNvQ zMddW`5>?XRGIXNjFLa*cikjHKOVqpumnK6p(yemMNVm#0Bi$<3jP&6_rQX_+VV8R5 zV5^p74zqk`4nIHig8bsL8J@!8`I<2qM`*s+HQMW%?YP3mdFx+Tk=GfT<2(;7@wz5> zU8P>vWnNdA<8n!*4Ruh7ArJF|VXpSI&&I;ij5pq^D?tW@Mxf4wyN8X28tp1pzas z7Y5CoK6843ITi+#PA?10NiEF_v#2R7nl~rfa(YP)oRC_Y7dR%hG%skrR-=M$)W^UP zsik=_y4v_BA=KQ^p+p&%FObW$caskPTrxMb_rQs%rFo%7r!<$tQ%m!r%%v}gNt%So zCh`k4Nt5;UHRk#veSNt;oUad4^pisKWURiPsw3BRvO(nLhK?;LS9^^z*WTz{=4M9V z#X5j-sik?*TEX=rUYEW_>`3ipypHoa9Z=9HeGJH(UKThiwKOl*Dj~l&!>l_x>gdvf z8~h)I=xhBTQailF1YV#+FVo?MS#{0Oov&|%=nAGU1BYokF3~>c=?8(M_4TExrFn+y zW~EuuH7m`Mu32do7tTtv_-a;~#f7udEa{q+cE0tV&7HH-F0iki_bi6>L$!?dh)JN|ShTqis`oOC;!3_F|*JDdzVoQzB>{tQbVWMx=dLso_z zZibz%44b|TJ6#!ex-#r^W!Uj&*zsrB@n_iaXWH?nIcJ-WG@Fhzn~rq*oMzLLX48{y zU#Hvj*itSl-Ht!g4lmOVFVhYu(|#}04ky!2SEe0Krk$=#J6)M}x-y+`?Q~_@>B_Xz zm1(Cd%T7<09en1{{TDw0e1WY?Dz-R@ei=$A7ICC>(p7cPMtN_ zj(@Nn|8V)Z5`E8_nV@%r(>6&#Sf_F* z>8Jgw*ub2?y8`czE)V=&;FEz%gU$#_3tABLlxvc!%=H`B^R5qFYh2Z?L&2%RXGfPu zmj{mvo)&#?@Pdf@V=(e>6ZCc^g%e?2B5rfc{|5fb@%M8AluB5v02MEpGBu88}s zUra>A!!Z%oo00ED*GHE}-{Jp{SQZ%)c}C<=^BW#HHgas_q{wNJGb86lULX0U6;tGU zk)KB|HNSHE_nXLN(Z7jY5xpR~CZ=ml*XUowM3_+TjjlJY-$Xwjy(s#l=udU7M3+Zz zi{2ewV}A9~^)ZNXX}V*&#-zoh#SDxY8Z$g*Y|PY{t7C48c`)YVn5x+1*wL{$v9n`; z9{W^md0a?bQQTc|i{jpldoS*zxZUw}9pXD&)nRsr>pMKt;k|@=I;`nX9`BAH7k_*F zJ@H@1*To-72urv;;huyC6FyAXl$e@0E%A=TrxO2_Sk-ZO$D5Nfk}^6z((%=fJCY)j zGLp_tx+dwtPBBS~lHN&LmsHcq)hVV^OsB+7X`P05x}?*jPKBKoK`FhXm`m>+VrF!Oe(R${Awm}axR_KN{Xv_BOSf0oE*_^e-xuLx|A2aO{pqsD&x8YZ~9Sd;90zk#rP2a#Ao;dOR)@J;TtT+Dy+pi zY(P0SVGFil2X>(XyHSZM>_IhZun+Y(q^BvVAQh~_w1rsPhgFaKbjdv9NL zrs}WGQt2www(t(tc3d?^U8F8iIocwt^3_Z=Tm8aVQtz;Bs1K>%+BVbQtH;$J)t_uD z=?m&5^}2e?*gsdOHEM^dRP_Q0kRW4A43%(+l9;2~4^NZsem28?k}7G&R_Is?&yn+F zm~9apYuf=WE8tYgm3*(YPh0xt8Y`c+>1li3FXbL%xqDE4tF3g1!Vs>*P}X27H>(b; zR(Eit1aX_VxJkmfP2yNC9k^NIxm^-iF3J2(2C-a!BqEZvNZ@XyuntpMjm4}$J;HDZJyZ^B z)a|U1Al8YCdnA;5B#PA%&D|2mT1jAyB(p}+SSJ%%C39FMw{n*}&b@jCJnPT_i@5{! z=!Qc`Ryo|SZZ|3XKmu4N@mwK;xK_^NA7wP(m0Z?H0hh}h?w7gTDy7^n3t1<3vPSM> zEkcpVYINi-BylS`@mqA}chZ|%C6%isixo1EJJ1jD3`GK$BaxNp$Q?-HMs(uup;Mf~ zN_6E$OyyoI=9j2P0uCWn<*-uS&eiG;zM<~o4hi4}JKZ%B%3Tu0T@uZ=CCnI(!5(?-qo~h zH>u0!29$Dzbl?sIm~!mQU6RTQgkT82)a4>B?zL-vm2}_+NnoWUa}&ZeEf~sbOyxmL z;{lbzC2BBh#KnU;9*O4x8N`DK#IrnrH+TSt5T!cs0D2>UI}pwq#Pd}ounvjbh>l!` zB(6j!ES6!qe6Oyzn^<0?GM-FSm5u$ccsJ)&_4T~rF!s2pxpxAP5E&vJE` z`QK&~J9Kt|^ zA%L3^&%dD)|Arx~HN0Ulcc~P9p>F4XiRbe&h;Jhd&$1kE@JZC;OdP^s)sOG0v$v{jp{I0s3ZJ0x*>q;5YBCg=OQF<1roUf9l0GzEJr8)70FzI6mCZsQ=)6oi%U%l zna2GnMF<{YEuQ5Xyuo*|fwibdG7ce2#j#fP;}Qhm4em!h+`6?R5Rb49i&=*a ztW$BULq~MxP7LAen97xEFyB)-tdk&a5f_(BD61u$|CBg>B^~&cB=9Rq=9e-SK{CO# z`Ym!f-;*o&nJnPHp>BMNUJ7;mEo>Txj+;Tjx4Zxw`K1mGO5 z#5icEh)NN8J z+@)^k9t2_t_hT`)s1(EJDoiM~=C}_Ei>bebFb-#_APj=S5FL+1bBno~s)EcYdjhv3 zk$cdQ)kxxIbmH%j%pK^;H4@D?;6fs6k;F|#GIi!w>CGxhWjRj65H7}0ZpJuF!c;E9 zG;YBoT#Lp078|%0`}my#>s1i0QgK|XI`CUHm>;Peey48dDhc2U3F2~baixTFg+y_! z#BrH);O7!=O61>?#4VD{FC>Kal_KDvtGPFqB%$z0!euB;JIz+wh`m>FkJ%DMf)^%1~td|a~kW3yzFcP`T&Rxxuv`qL`dK><@ z)|AyAQyx>)V15FHap()B2D3tc>I1!yjlLL$B#cA^#v%e2BLd?Qfn0Qk-dXyedSMwN z)a!^;Zy{2xML$GhG;44XYcP>DxSad&2N8bjk7QevB*WDdL1tH7F=pAG7yL;bVoFjwGXuxnTFn2h~ajc(`i?*8chAgnjyoitf3x{(g(P!_q;RWrG3B6Z zzy~IVBn04IL}|&OW+KYur`A)(VF3yd&$n5gt$5bA`6|6V4!R=gvgJFuPL8;!XR5?7NWW|g z)U#0PeU_^aSfviKMjc{}A}Qcu(cha1CFmB$mV)2HB<^WsI}ZL;XEL5+$#yJmSpahL99a!O+m#Veg=k=AuLq@B&dNbI zc_b>u=-71#LX>%@3fZib-mH^UZq^H`jJEO#dU30cL*n^@4B`^ad5p}{TIx0o zO5t{iH>uP7-Qu~LuP?_?9zZtN=yFymTyIhu&T5HcmC-AcSS!igCS7<)2C)XA2w*v) zSc`ZrMK4xkDC<-TDC7$ofATC8GBYndSB}gKv96~>p!d0pttF@+~Zs$4)Fq%!h#Pf3#i|!ZbQr(21+>dON z+d7@~4Jg$btv{u^B!Ja6rC*x5I!y1Kse6bjg;l2X>-2YlogRQn;lJz}u;13GG?(As zATK^gFO%O+UTBHM}cPp-ufK8tMLk3ufP94^ImT!x$Y3Vy<+Dur*T zHT+Vo630JF0{<+@e9ZJ0bSdrDYgt)`crB1bs=w7^`h_|#H=~1TC(&GMc3!>h1`xg z+>YzG9X~PJl&&xTP;0nJtu-}#pM-OX=^MmxsU+}AN#=WqG`+JZZb3ZPVTjR{zSBKg zrFFSD{arpjW$I=U_enDMX}f`u;QJAdc-F~z+$W>CM{>De3Ro+1cu?kYyOi*tl=6Vw z$vU}@`w?Q(ycyXnmkInvE@!P=!SzOOzm4A_4$*uEJ-Gted`%|sZJEe&xt#CI64g2IV*2v>L2$xJ`h0I~4 zEZ}yzl^f+YZj;Bk6JfgdDChB)GMZn>SniWatd(37`^Rz(_sLv-EO+t%LS!`SWC9P! zL>`bytT#D#jmf!s<0D?zOgWDa%V?7i>*Xre%hlX0xqLth_@>O^Co-20NeN$)Qa&mR z_@>;#_vBW-Cb#ijS;$A^PTni`@gaGfuV_uxaLsaLvsTXIYciVUGM2k#0@uqVu9hpf z&csr{)p8B1WG=VKW2`{1Oyp|0iU(y5x5@%m%B|cXx3N+l=RUX)ZFs~kWOJn~;2yb+ zRq{Bi5s7GSKu>Pf`n`;1txVvzGKrOPIqOYq1t!J1RF=st+%LCrxi@d>?YucCSJ?TZ z%kNIsBUDDSMkbhit+z{cyWGNqa;phrm&rjT58}s&u*-I@OyXX-g4HIcow6i^6&Ar;9 zW@`RET_d#(M&|N>EZ}}Sz59&cAVeF

{kPbKv3J>G`niMBm>CP}U?8CjBftZ^X6khQGCP&% z{OUj1fZCTi8g2A~aQOTGjALPL`U=VcIL3qHex;Bwo?8%wz{Gr5q*+k%#q|v6VD%#I z6JCh4bhaF4v4z+Yv3BM~c)N;Z=I!Y|Jbhbnmn)fuhV2J8u5;_`ZF|q2)MSci8-lIcR?7@L^a7Pry2E#GJqz#D%H}Em)R)K`*Hh;hU4Hsrd$lb4K?PMdkH{*h;FqiA_AoqdOR2C*R>1>)`Dxh? z9#CairKW7~c$h|bDC1dXR(O}!YtC7!$bg~&d5p-)(qa#mi$^L6;b4>`lGvtJ_=SLq1>cgrz%r?0pzuV=4Uc23_c;WpI02QUQC<7!!W-CA54jC@a zxj~8t<9No`xXO}Z?Z!bxg=oWnWQZWeHX_h@d9IK9a zd|q!X7H_7p4_x&0sbzk%Vz()2YNQpvVphKQL8~4n_M_ayUX;;$K~E;!RE^SH7SH=E z9_*6HPlzXTSw2`Q1~ri&rq1yBn)f{XopIu8$16)EuiLrX4z?}kcRx2tsyzhCm3K6? zW&~oE!+J|5x@UKd#M^Xp4EikLfPD8zO&E#!zAFExF@5-(^9CQ}A;=uk6`vy^tkv!SZW1+^*<|il~V@nMXz072{Ja2F9X53)3jn z>FMdx0?e^#%I9y@v&GvkUL}Whfh^HaxN$uBWBQUpfB*KX(9r1KHZwnSpIr~r-^7CMrW@zZ zQ)c96Ac8SH3zMbwBZMC6hGY$o#yOWJ$RZ(M$kSAervbGYkMkOVZ>esa07fw>9i*HCQY) z;o0$3SH^JfX8ephwz$i6$@+&u{M4t+;}5UD#MQN!4)rv7-D2q&pH`RG1Bi%z zFU=rBj!YjbajH=}Wsl&zzuhal8ud)4x@^^|Wola`pBL= zA4#=K%@WJ}@t;2mCG)UZohRtwjN0TWKKa!ri=HMm6V`=!UorFMZEFNQoC@+X-w<8{ zUdV!XO}K%V`Cuxn3u~C(pD;ZH>LH!PLlhDujii|*Ne9WXwHinklt8i&49E$ zX;V$7>G#t{0fzGf1-)8CB8$;ok4RV6+A4flYk~!Xo`GT^kB}sBzy2^Nz+k|o+N1Dl z8X+_aBYy^bc?NW(8D32n@)`PFy$arbriN{MoQEifgm*Jo77WD8Eq&+U!FLXFBSJ1TW=#A=@Jq^6ijGi!`7{xg1I;>{esc&(qP}L zobGxXLj46B_i}t+tLOYC)uZh3h|p`62h87R_&XtJ3)p3$=NvG5!W$y<^Z^d&-2a|y zOLHr^ADTTpt&ZMsmgICOnP$3)zT%e5*b4I#mn8mU?insmlc+1apZB_+yofqS*hCffxbR#64QbI-k{KYziTxv^04rAIFN%;jfBM9tz&d0d}!2np0k zmM~-r?KD$D*0cvos9TWSoFr1o&7nkEloCk(Bypa7;>S}F8Fp@lQ1=Q&iGSgixwAHW zEF!q0_orN?wkj>+)>rm z3>peX0O^0^18@oT&|b)D3_V3j&$QD_JBNKhwl%2w1FATV+#V29h`)L_^w3h#m!~K; zL>$NNN^UCY8K3xrxL>_hovYre`r|8C)+gToVbS&Nna|El-JgQA7X z-WG@3161|rz}^@OyJx_88{pv$+i7DkqVlegTi&sehW&7xHO3s1pROa15Tew^F~tY9 zX@gkMaZuPGHbX(hC2*Q??4fzRfd6}7>PP~b4WY7xOD5VOUo6B`O-0Q~JI(0%5*idm zK@|h>yq@oYv#qgR1nYq8hzIKj*6r{K-O*cDUNyrGK;e|*D%m*@aKw1$$6Md^T4O6j zU0tOz9}e^7QkP5i2;3;)1dlxZEst-7+ZqL)0uQmeAz!`-WRX%{IJ<5dHlZw zw`H!#A?t~7GoXZ8pQ<%lcH7Mn zyB%V7x2y<;BEQcV0Fi-xf?av`rv7=d3^#&i6!>`rFCX5sy8fb~;p9Hndf z@6$LN-vnq-9n>U}kzI{`bIZXU)$)#m2Y1lQj)U-!ztJUUP(U=pCn)gH)8jb@cRU6A z6v2nX$apDc=P404iIR5IpdfEj%z`gofS?`FRJmrfS@7lc;G{x_vBK2YI=pr3Fu(P< z0p($|Sbv{&RK)3jsNMpS_hP}V)rwiJu%ZxCE=PB4>Y9<3HFxP&)_D~U){ z(m>LL#7h||kPARQnUFvXsJSe%-FArkK=lBi2)G$ExN^;#YYcjW=8&qtk~D`zqf!xu zM=R!#@MijHbLi<*v7o=1Ui0RfD-CW~!%_|nOMTZI8m+)E9Vw)rhT*4l{r8y~uf*tO zi3F!gIoyEq44nzRImPWyQK3nTNPL2qB3cuu{hRwKF<&t+G+#Mey!N82Blc`Q zXNz2Y(Y4~)V5H*E7B2<8-e4)-2Juv(zyG;c%vWIMD-YgbfAZd+T^vm$q8I<{-Y4z1 zS?g8&lVA{$xXB#SLzWN%)@%}80#Pf0Qd_Py)JFRk4~Us5Cd1u;mUSA(rd)y&qx@Cw z#%%|-4N(&FnNRp)J{Uav;EvG>;yPFEEqXZ4HQVhEYG}MM*vFOo2JK}}%Miq>L*@v- zcC9(GHnK8uAOb_%4s7cjqLqnys{i()Rm+Zp4U*UAn(Y=v%Lrt!?^fAf_IT;b=16r2 zVl=WAVrwIj1CfeA(N5Wnu@V05N)jw<=x_-wQT+qgQ9S&{I zjHDDu&RcQKp650XXJl7c0YjllvpU{SMQ#+r34XknuPP2XIz8RG}cbm@! zom6%wHV*CToPF-l%2o5{W;C|Jn1+&P>xB^UHo+hr%xZAzW>K3~w27*>1-B*^cQVDY z5vaGItnco`j5=gaoI0ltSrpaZj{Ydr7c$QYg{}_ug+QWrhx$TShv=aB&G9Z;Q|X`+ zQ)$ZfvV*h1E2BROh2RV9gOK??y_;2n^NIRgBB5=|f|`CAjUVG^Brt9~!0b%o0hL)e z;3po0pdnJgh0il&Ms?#D_vtW@XP`AK_t-Y#6PxWdQF zVV6Q*vOB7)Q5}Rdw;rypcG|4^C9EHPf~M4enr2v`Vo986?c_G;OG@~pmgk-Z1p1QV z3RmYcSay!>6b<1nw5K`=7MvW`PjQviPn&=(D+;zI*rxTn3+QOY=i;r5)$vp#YId#i1 zfO!CnqFoo`(9mT-C{J=d^&Ak>g-_ZdcusBwYn}XdNY!i5LQvKKr8i|gp zOA9{nlr7qXNz@cG2x}jDbnc~<3k*-{>HL{(!*mUT$`^)#~$UM z7JfriLhKanHzxO^X3$jrq3YXIQIw}~Cc=tBf1~7;rxpIk)wio}vq$R{{S7N);lS## zNBPTZb)IB|j+L&ehHKv{)wiw6>2DPJ5Vn9VQH3g20W3Hne@40ob%z8!f0A*Z=c7NzJgt5gO5GOQD6yX6jq)_C{c8~!JL!7fwpO+lO-2NxX_lU z2G=+=C&Mu5Ep+NuE%Z34l^RXS+G%5Y(|iY@sXzxB2zi*;(S!7DGf3>J<+8m@w%H3) z$Ke*`x#tvRwbB^Ihj62^S~>X*+&OJT;L{&eyjB4mKJC~9nT;1hn~)%*Td)QZO0-$5 zGn5l}{~9H)n45m3(3`h>jK-0?ou%!n+oeaT5AfE;Wa=1-Juhs=a8Ne`4J%0?lW%WC}Rx8Ty<5_|kAww$hdJU0CWT(5`kPrvy% z%YXdM^!@n3v=`LcAx`o2M0GIJ2%qlrT79@5PU0Z$UGoUBoPL<+50b4Ji*{`u=T1Bj z)YRhXY!H|3bA%nccRRw4eGa@krlnu5v${OVs1&|)>W?NWY4{)`#VLJ3esCtEUzn80 zQmR;*74@_RlndF>GXf3FtLnGJnM!VWKb>n(ztfyz*E< zBtk!ljr$D&J7Aey4ehlp@q;R%v9n0#=c{E%>v}($AXK-f)AU}{hxF^Z`Ey#y&!>h_ z=r>x&YS9*j zvFF5o!5H`b9v{qJCe|7^+z`sd4&@0(L9zya>UhKJa7B(hSEYYY4@l; zdpIFM)6?I+3m!sBL@}q(070aI5RzamHUsis*=B3`;S8WpVa@puw--z3_D6^Le0Dfs085|&F1#IPfo5I33)~=Is=KoCa=MJ|!UZp;Llw;SM^Tq1_WAFB2Y3AnU{mncyJe zSxrEH+o4W$k44`SbRJ;|7;fq0&~x^rx2$}vElLD~L%Q%JPgkt>1an#7E47+fy`6|_ zTgD7g5e(+R69o^rAv5XoCWw~X&Kb}Sz0d2H@2JaF-$k# zYu^|yha20$VZK+(0*AE-9JMU-J@`#{WBb+Zjp0w2FEelJ+$X|~?N_&N3_tqlcn;(+ z$9#DrXL6r47>{xWv*7fPlSa-N(rHmsU%mLwJ1@Sn+c3JX#3%Tw+yCWGc%@P? zXLdF;HgX#tZ|+>#*}1Z_`SD@&DH_KqKl3)c^Z7fMKlRk|JDwxzhnS4Gz0kcG}`ImF&KnE^zi4*U;NijMGuDp zjf3iLkiHV8y4r5O`SVvt9^T{G7xZ?t^)y9is6J}rxSnM_5o*8S<1cP0efdjYd?e$@ zsEJG{(;M@0dS1Wu;N5{xSXV-W%FUZVykz}|`OPg?bqLGK17$7T#JfdVN-i(XRrrOD zT;cj3eP&0>@8Rs3v?JpS+Sl&d#%M(%pd8eLo)GAxH$`WyvQ0M=WCBj1kk14&Q66RN-K$Ghs*kf$!%TO87hYMh>*7^QmaNGQ833*4ZoB<+>&M>= z-cfslYZ;?Q5sB~y@sT(SlA~v|0Mb8&d`XlvK9*v0VF}8a1uwx_h!M0-D3TZnipGIA zx~-Tn-ESQDC_D(Sz=PH2BI+$)inK&_p09FOse8>#^_ZF2tEzk9XVeWp+e^!DZQpd$ z*D&bJ*KXRh{jHb(_(wXYCGw?P)JQ}2RhIPV3;tlN!w~5aM{2d6c4zUr|MjexsuJnNOCAsgj;4 zMIlJrR$Q>Y`;7yirMoA40e8a{=Gx7(9e&qN@67v;UZ|>{fR{kNXid@K7s9D%ob#qX zeFubWP*F3B_M6*(x$G6V;->3A+k461&-u>BdMj6AKTVTfJ=x7aNc4rO>(E8sMGn8K zfBsK*HxD$w30~hiuS@YO)M3uL_l+#PcgC(oiSpT>dvTZlofp1z{nqjqFJW^x_V$<| zDGZsr+H_=|2uapMJc!S`H}(YJ zDlwP`upO8}qYcpHADw|1xo8LLIVhBRKp2`?9(a6M@EMYe=RBhM-)6NS$U}BF_1F)M zIw?4Y>~4{M6F8H1bJS_Lz4Q~q0~KK?Um1A3xI0b7cWiAtMdn|j~;-M@$onUngKC$1csn&R?Ok)&vb;nH}J|4%(b4);Yo)YIx_hl zSZ%S%OfUxW$C>xKG1yn`8wBfS?9>STtjD>}&|?>HsU%A7dJ6|MT`Tp76Q${+UCXs-F4sSE1iAZ>t=$a9VwKugc=)U0M8y8x2OnW*072mw}xid;j zTAP@dWYitOh7`F1z)9|4qP;tF@t0YC#qD>P-{5wP7l?NCw)br5TYclo^K)_b@su}K zaZCSVnoJjtEV!5Q$wWpJL`l>$1-+=_87P!6G(r!c6P-kkn3uh~sQ)GN`0V+uHF0_^Jjl&`}+lM8`b>4dwCD%rnW+`vwca+MIi3K zFThO7<>p_wyhKfCYnsqit!!u#pj-bzVEOS7?e!oc?}t%u&&d~CyUm9R+A5} zCIRtjK8Et)v{WBe#1coV;zLX{e3CTy<);+IlI}jG6cqY~qEs6dH2Nn%R*#K{PjhcF zne(Z%cOnXcEqU`4X)yh1wNb&k3d&Q8VhN_7VwE!ewPf%HNu!6A74xc{>w<1(^2xYR zWI~w?$roo@|8Yee+eUnGHnt0^u;%mv!5|8m!TkDao)_b;?pX~2=l~B=e%uJas$aUG*?hL`lYJ*Di9$21 zZ2M#%UrrRvgQJzf!`$J8!rhqA3t-TA%65%RVTj*@l?I=DJz`R`qnj%T476vJRXC^hWZQiZIX$P1aQvcKFb3u?#o$EzPOJXV+4N% z@+V>l#7dy^6x#2M5}uqe43Qi+IHQUoR*e(58YgAHvq+hpUd56qp_Oz%4YorDZ+a%6 zYC)uVqQGt_r{fCwOmRB$2&8lV!iM>0cCWqQBf{;!I;&|-N8z%iO`04IT)A-DgW=G_ zU)cIDdpFF6UYK!k$0)OF;wn21a-VLnw=CD?zK>kcq)6M=Wjn9yh6dWd-EHH0&w-}B_Z{%iFue8ns<$~z9yRlj?iRCoOtz^=+$EQ%*DGQF4eowGr9nzMFQeZypc#5z$B%hx zn3Ws$7{&?qfq+*w=S#$g1cL<7Pn@~d;4~*$_#1TQ(vVMO4!IeLIg8YSZlYr=I!s`6 z$kMobXO!p4TZgwQtut1lDHz_le_rpiXA*7P&@Un@X0$}A>z+OItbHbXd~sDctYt?EyfQE z$#a?@KYw|MpSl1)5J093-=LF1MoeVTB%bkcdIsgarDBP-K+$imm<<+tA#B~B$MFeA;3CQP(MG$&y+WI*hrs8YDC)GkY|$H})qeL??Nf?+2eesy z4c9jC+~UCirGdf49N%zlL!-yL*XwBtVg^mcE)Gz-xRox#ykL`uJM!0jRXaz=Zez4? zn#qm47(gO}u^13<^n8zi0wEL;V7yyUMJdV$qaucqLZ{`7n2h0yO_h3}kk4R8? z@rO%7E$M(Rg2YL@C`z2$3zEI%Lhmkq^|@=0+_k)a@v9SbH;XmXMYc>vngKKz$QRLW zV1g6!<+4#eh_P}C`AiSwGnk#}fs)FW6)r7JY@;|xlZG`IhXXk$^f?KrsI&wt91Z{U zimW+2R2~Y4(ydyF*BfT0S~K2QOinj-1ZN39zVoJv5Ka0EswdWF%(m-X7kutxsf&lc z{*i5(If5H5_){C^&JG3jwoLBayB5uQcGCeXUJW&J%jbS?-ul7t4Iga_E)=q{LNevA z8lvQ}`RLNmhNIr4%VOCx8@he4Hg(amcxw5AfVN@zy^o*K*3w^~Mxj4+XMdsLrd>1A z^Y?7O_)?4vkG!Q7hgl-s7&Cg@2@<{4*<2U%IvW#|*}8=`Hedp}_|YKl<9Z>UEtZfN z8sFuZ)hLG7su@+sQ7(x*x)flei6c5OTx~IrTJR^M!uku0JAW+93U)N5)y{p7pL22 z^Ok?5Ns?>9*WGYtHnwc3HyS?goTb!f^GIUV@TZc6SXNjVZ2Ra9;lcIuzBhMycH@Cd zFTP>nne)@}^{dVgWS8F=vPP|C=FCs;7M5?&0t=R>;>(zh?ekoj@#6%1Cj}hl%F_c3 z3nRzBb#g%A@pU;KBY6%XkZr-`l1eeUd=m$rLz%NIm6EwW&F&fC89=Chyqdi4ji z!;~*>diK_mN)sUq<^R7Enrk;Rq@ zBA%WG2kjGm%IiH8z3|afAsL@Rk?^!$Y5b{B5UxMC10C2I&I0R+Ia0&f+PfVGk@Y$i zDnbt3EhaFRRxHf5S!i9eTR`4fBr;h_2&_5E#k1}_@22zCTx)L$g~DNH>QnGr2+Um7NlSb>CZa^tG z4KT9})SEKrZ=_QEC6%(E6Ue8sz&(t@L3OER6=;>k$OedGQ4nr(J6#T&!@=8?6>8V- z=Cy5H(7Aj5&~39Dw2&5B*D&YxInQmp{oi*Odq+Qc^LOX`sx!2%Vd(~~A+^*vf5oHU z+}ZWpxypcg_A&?Mc{}y`=}R;3ZHz|F2nW|_X+PL!1w&eK_R|0U!|g4@t-%XsHfhbN zGkyZz5nmAI_SUISb}EqyP;3%Wj%*H`@K3*)G-H zG=p!Lvq)Jaa?sLvK|{7PC;6RGE;;Kg@EOb3+gCQ1bB${UHw2t2CoWPJ&1v9gG`ZET zY^UGe=uXhx|1tmp$uVca9Cs7viRsRyUm8EJSU)Y>_z!VFq!VMToAgBl4&1s0ZX;?x`0GZ4xxE);}_ z=J3z$^h%0L<1W3wL}gKGo!#nCIW81#3_6^%3hfI8L6-cq3+DWdILqJKkn+xXD4+qU zCwbrkr(kP~G;yk9exD@Dv~>TaoaRy_xi!`1acB`iJfnSfjMoAW&GDuhTK%)czcIhv zMg5X22n*W_+?;x<2=R9&A>z3LVS0Ba?x1eqEshlR)oA*F0g|;K({XEjuogoL<%~t~ z+y$4wz$afdfAl%?=E?K(ZN}Dz7Ov=9G4m!^^OEh*U3-VN45hEQnBTPi zOn2lCv--|IZh4U3LvL9pID`MNo!7aU_pQ3H|B){_^weF4E)UGPzSqHEyJXDZ{z)X3 zoSR7k<6P1g$6!@>_-46(dhGlzNM}s*@E95U!RH?m-ZlTUWXU1(r&T-sUub#l`Il=l z#wQqUdJe8pB8hmO|CPs^n9&JJ(PF$`B<9b5*Vypao>Sq*-kh zAl~o>oT<@N!`)4OpM3Xq*P6e0qES_o4L^Z9q3Me@4DgKYm0+@6|^-N$d9JD=gl9rn#X1^xlMVDh^UKlk_IxL5I)c7l?3tx5GTHT zJ59K0z{{94)D;wvZA5a}j}qY`6R_jowTg1w1KxS(#WpUj-XN&vd$U%5;`vXkp2b%N z@@9GeEBnoIejt0!h25Fozi8`R*=c+6_nGbs&v`a>-aM~&=|-3ZGpU-pYJG3-`m1u) zx6D`a1Gwr2@-x;x^tZ?EJpe*PQPFNvRU+nz1NR>L+lSWTemC}~u^UC3u$%EWK}{0T z;$0FukTw%hR4%db+`c5 ztuCoqz5DLSj8@02=UbbaU4<7~T#o3TX{B15?!LRJb!r)EO#6&#_?feHvho>`sa3Z+ zT+R318+AISl(G0ZhF20PkWJI&k<2I$-A}B4mV^y*Q{<83GB!)ruQA)8I7Br&naFm1rt@(c(~FNN!oOIC|#dSZv9Q-#YtHO$rJ9`2pkOR~+QyOcMFg zLw_@`CWeeTf}ud8J4ELv<(5Q8uYSvu8r)DXj8x|oR<$kYzISGzeD>K5bE-zUTrY$i zC|q%%XO1O-Jae8UO0z4zh$q4=D+SK!DJSpRxv=X%OqFfQ1l3DBM`7!^^BBMil2$@yI^ zO_USpk`{Le6u%a*Exst4idHMx6$5$bx1^K&x(m*I=|$MYxRIy(3+BkYzj^Vt`V^J&Q47zhO&5G(W>)Cgr~#5qo+XP32hE)&;--3!`Q z73QeRbNPV@@nk4=-Z|y6#qVI;$wL3UGe5ak7`R*u%;`CB#l{0&3wPd?EccufC@te6 zo`_Ge_fN=gnXH@P7LUiKs$~@nchC+Are~FyR7(u_SomA(FUV>5j~#DJ*o^|a8V{Fm z7iwGq8W7>3ivk2Kh^gW@Tle&osm|x7V*@qHWdo-jdvc0t-#CdJtF1o|*j0~{r$gNH z{|pSBK<7#Mwn#{xbfJ73eZ80>oykye&AE9CiD(YbcRc8kp476%5~gTvJV6yZm`$FD zK1j?k*y0eaKf))D)6xN-iX2k8TxHX47fvo#To;$!boaEm zW&-?qXVUVyFTJ>=hPXEVG-#VdnL59Y>t;h+U1*_dRQh04ts(XVAI<2|W=0t?U&~Ul z=DsJ1YBK;v=*KtHd>ql9*mN9Hlr}e9^zg-0%0}!=VrMgJiIgJpS<{^e0rCk>^9_w_KcosAWq~s`uIx1Xi~NjOk#8 zF7MSqh0SX~o(|fEB7?pL4E_ z4;C}JRMay$4BH2i7=?g_Cj@4RT2OOS4}Pv^bP0d4bPp6zm6z0*?R*q+S}~)s5@Jwy z1G3Wztg?s|G73<`(0-yOA>WCzMT`MkWM(XqRY|a<1$9)cOYJm+$2#iDN}7a%O#Dm| zwNgS|D7qa+3rsL1T$5E=v;bI{t6y#=pNI#*;S zMtAc#AMH@UAfdPe2URhsPWJ-g7E+H$1p!2_TTl3CkmEuebvZ$_yQ#w=0`*YfI6<^Y zz=@nlIVb1wIz&4s3E)vVTV4`C0y)BSVNQ@F3ZlSsPKB53K~YFG#6?kZag?)zOX89q zLFVlaMR0R=mtEjo9-9MvUK`j2n~jS<!sh6u{|_savG712|C-Y@8Hx@FAbT^T6?L zu6>p$3SOG932spes#K!9$8Gb9`!13Mo^lSm2yF`GWbgtfNs<7R^T~2tq@3Ty^DY|= z0&u`Ja6oyHhCN7?P@7!@&f!+6=(X83Q4lGWT`DIu+8i#Q;E6~ng$hoI3SmJ6PPMt4 z{Q^fRZ>J)FN(D{eWC|PwyGWfbMFLctCnQ-xg}jTW2t05cNNu7=5~vX38U)V9NrHnq zZITV}$0Io$;P&wWQR2ZSfn5>=!S0eop_!8?$7|Hbaemq1~oM?ISF(BTI;h4YIb z*}WWf@J>;}siF|@2rj!*6evh;f%Dkiyi7TfQibxIq%>0A>xGk?e9Uiw4;(I#Y@%pW zs0LIJH1Nt)lqe6JJ;Vu4jN~df927tRN6M5Gjvi zBxs%n!Dg3by8vzvCkAn1JucoOgai>B=%C=2C~xO^2)dlm03MqgTppeZl3n6?aPT1T zlvjD7fwyzOQ_1GyDJN4;7$~)aTN1o>o)blv$hmC*EANv4yrO7xLd3^ACFy&5X`D zbLPx@-uHQ*$7ZD#4v+&BD90IeMP{%Gr838JRHU3B8LN4Y+KNQI!Jy}4#Q=hySF8pd zFBEZBYBK8eqNt;KD=+Awh^OWvgHEIX)Tk52ud4bI$59bP6P8xb=@2BsabOd`AW)rP z=Y$fSj?)!U1IJrAUf_%obA_$M;^f6rJ604i{YIxq8JRu=-0DrFwb)^7^Dw}?xb(I8vp!7Eup66ih8S6{q+xo+xHtR zwp^^?o$Q)GU>9bB(uX(S2{(r3Uh|;lSn_#_DvKT--N|iOV8<{xzQEYLMdO4oC3TqD z9q`3{h{R)mQ${t59M9BBow>~uH2u{yPsRyl{PdWD{@DzQjOHHF>G4$F_2mu*;oUQB z;QaePC(^==0%2HBCpuwp(uBNZHce|OBJ8(Ss0w3>_e>U^`5<0R}NK$l4BmhmZ02YYsiuGz=6>k%6D^Ic*XQ zWuv%w{{-R5CuCC>^fxo%59sgOB#?BLs9w#bGJ=-eNIDIe)RFGmq>*apHK>^#y8yXO z&{dF|=%7advunistOp$m24Jm_4-KMU!N5EYIA3(++DPEkdtl2gKmB>0(2TQ?L<`TtE3@Bb zN1)h`plJGdgz<#iNE4Y&=8%tTrsX*tDq!nL{2Q&a7O$+;bm&3WWb*@194O!_764OG2;ZD_xoYHjm`10QU!rmLo z1FpJS7-U~+_M~;<7Tu8WA@Py9WCzao7(a^W;n}n;%pu&E5q)$*BKKvEHid-|auVg7 zD?zkuc5R#qF`pD8X<&4L4!el+;R+BQFMFk|y4J&aixjcB+EU^+RdBwtmr84@%Wf;n z&MAATtU6SFTUpsFr8P5;;;vYI+saEXTlvz;b?eq#e(9=LR?XOkRCU=aWnQkr6=-_$~qcvAP z1nJ{%gZRwwuM=gK*P;ILn>vmTF6s2VN+{`_Nb4GfG;tv-KtQ7_O0pyj?OA8oc>#P7 zirf4)hwyRpyuq>b;Jjw|nBjahMeCIMzWO13Uj5LXUbp^=E7o%*aI-c>tGm0^mGEdq z0B%-y2iPz?@sEkL$T1)EayceZxmqb{ou>Uv4&ZuRJo`w^Q-NW>+s6WA}{g!3+NM)&1z121g>msV>r^gaqHrcwg~q|!lA`mH);!z`hC(0Hzx^{ zhhOy5(R7xK7^uKYyqoJ!XaD&vT12&%q+8u%uku?{q8_g9;-P8QvM{LxEODYbWZzn=2Em3OO|6dXIu@tOv#_TH!$Kxl4g#*F? zjDcVV5__d;nRtjBVB1>e1CBRL)nsxz|9$>=;lRCnuiZNS@$R>d-+K`~+t_Y38?*PX z*fw}%DW~u3OReh6{)@Y^JXivE89S^dqq?ngPv5$BI&bTpd+*)K=`Xtb_-}V-?>CyP z?M8aevZI4LmX3eixhmDyN#_*@%e|%QHlxYfVT8Nd*Y)k`%>K*foJNM03xavh^E8bN zhKpnRE0ZsCzYSR~*n4rxm7wKu&dghLp_PV$I)qE7?MC%KjI%6SR4$!vuI5tJ&1$+J zyEZ+k?TOMEP+V5c#C_6IlMzacc5G{;VHhKLN1LlDDTweWOmG$RhtC|gP zS}wc7&^6ybJ@l-_=vZt^)1EzrLH)D%fTwfi5~IAj0JQs-iam|HP4B79gFZ9A!j6{qhk zJm3{}8r-6h^p50{q!sS>Gxxw0J2j5kI%2`+Uig@JNE=y7Hj-WB03iZ_rGv1?sJd09%|Y@Ayo1C1YBcado^O&zb2qpMzXeBAKBY=p|MC3Osk|weBI@Hy61Lvy)kc~CGb9cS*&r*3M}kd z)U$t2?~Su9dYm_Ivv@3mzoD+9bx~@`vWCXqN}8V1u1onF&fV~2`U=HV73|sHCYN$L zdPnny)|PdP=FaV~hs%m5NGN{cdC4Y!c$VyNRa;GZ$-HZpCm5)wm5YP=*?}sDv((+z z-o0v3d4a!n3r3xkU?aZgb9IU&MVCW|VL8N!xfJFV(`u{L7;!hjP|yOQWYpzMvZNZ; zSa`e>Ie4{yER7!<+!hN3H9vaZM;%Gb3g|g=X_kb`$*c0J#xfy@htY5x z+E|H90Ov6M%$vz^jdcO>!kT|RlCZIu!qoQ6w)vmlp80#z@r;_zcY(xv!8$5{Pkp0K z+nWB}^sP@jvha#H-DP+L0pVtoynt}iaS_7eDb86ke`!fL5IteFKpiI z@oe7gfdkJz+t&8%vu)gOb9=J)=2p0WVduV)z;os2`vv70G7`afpz>nQV#+nS7F>54r((gJOP8=`0-yx_ROb zYM6SO24eV;!JPdjOQz;C*OBCGZb`Ge|CrI|wO#!r53_X?{*|qX6|Z8)oq& zmjMn$IJL(#9Y*xSVGgYpgvhB#Y9=Mh)3Ns@4(^=Jg`5Y74%1;I?$rx-wkn1O`(XQJ z|2nYm-*4LS-77ZK^(^z~sfp@r(N`b7^Wp1vwl9|S0aqf@v8H5;jekkatD5(+h>rK{ z1(n|l&A$G_qkEn|)Y5c7MKhvL>#Ts~j7AKeci!G#kt3;AZPqyA1V?9c@qkVgCN_ z4h}qd@T|HO%ghemDClgFmmj?2!D|QGuyW3LQ~T=T&BeB-3iEU?Usw59s2M{4zUrRK z7R~P8|Anq?cY6h+RBv-B9qW$1asQPMy}!1ta_`!Tra8M;E^JaaZ@p_WnOB&^y}L+& ztYl*$n`>7hBpF?lE|18ewZro6&`;BeBpn*AA00Lf#m@B7B6tVGoM!lhAR70_{SLn) z>WEIc*R&4HweRh%S+TG_(z~+GUPNn+Rpt_dVR2V$yvLtvi}(5m*Qp<`KDPbJO-_fo z`mw&o*@3p@%Yto}4R%$xv{YBr*H<(|;F5GYl}@Js8RI8YsG(!&A|=>eAMW;BC{&2$ z7LT)n+S*pE-W6+KbJoyHsnqb=v-fl5CG`#r>Qqq*HB**3@-|| zt%#~Ay!Hs4VQllnJCW8c*AX&{%p?6|7q%9vrZKf^X0s%ci2%cR=Fr(p_)hd|nra~o zjA^}vF=BZ*MQb+H17ID%g#-sFisSRhPW-V0zbbR;^vjgiFUkx^Ig(K{| z{e^{{%YHrt_aDA`@zSPw^P7$Yd))EL&cRe|Z%L!Qu6=!?W#@*ZWC_`4Tjz3CZ+zgw zm5KSg4{|%-cw@)wukWDmRLz^)lU{z-%F8cW+26LH_i(sRu1(ccHSs^Vz3;9>S8847 zjb|;qXhCbL!&f?cTgx>E`$E3f^TOM=_r=EVbjLPzl+3DXbcIc`D3z+3&u*Q+v$dSt zwd>cv-u26zpB1?vOr(s|v)M9}M-^QOOlYdIOSCdfV;wZ&0kCPK9Ht04e6dsBdYGl3 z-gEo1S~L1yYnL55dT3d#wxG3xN5|4QHu34Be+s%kVRXnMNlozRe44`vGPt8b4IiMs-PuK(}o0phmy~}chfGUwLjrVu8f~?@3@)wj$tZT-m)86 zPo@Str;B%aXe(v-fItE%%7`fOb(AGGAT~Dl0vE}qu9K;*P4%;3@Y>l6E{Os}FIh1A z>#%Tk-R4E=bsLRy>e>@709T^DZjNz-`t{0=3sx=@GIP%1TE^dHIcn~v;6Jw1Ha0ai z*6#mp2-d8)C9004#K!U}S*|K?6jL7**WT8-d|(s1=a1`%u#4pwBBmI5G*D-dq0k~u z+{URZj!-tAY;6Re!;k89PB>frE}R3~SJA$$+rPGzzgc~%cTMMNN0Isz1%O4=Ub|p> z=OeFhH;?u)?s6b{;+`>&l%`F{JmGccer;! z*WrTb#+Bz?c=<~NNcDt6_h;cv=KVo-LMcsj$JmJ1E=oKft^g-_l{uQ1UV#COVq(zc|BLgl@_^Wx4F7Z9Vjyx zoJAha6Es?FMw`w~B?&g3?oc>(nnMo(sY89@oq>2@S0DfwJ*)$ANRp^sXEWNY#-NAu z6gdqB=1nxaWp`02SH|giEAOCEHU8GAhpGc*r#bY{1gQ(CcZ8<6LNwepD#T*+XUS9! z_oTtAB*K8%@(dG$dd2xjYW|2kY7nd}92N@N^6K({_~a#nP^2wBK2KK~35(~oZL->X z?mBF@*3-@Go9qj0L3795@I}Rc@*2PLMP$u_U9j}Sn}8j#gytlokHaB%gH-BPuM(EE zEjwJ@v#f28#MGnd3v98MeX1FC?6>9RzX9EM@gg^UsD20gHOrM{xx``h_$H(^C(&F&3{dKeFwf_vZy!tBi7I1+H zmf};$z&?b#;XSyUPv7wV^+PW#j`VNn?c5dA>2G)+=#}B4) zGT2EAW~)urVzLggV3n75ehOOyd^%5q!>;4jt1qelxM#5cTz_R*eSG^tUi-e|M&KUN2My=<0+f8&d- zuuyRekHC$3Ug3UfFCN=pLWMFbSA8B7S&F&Yl3Zfb8`Y-GG&d(8Jw-BYulUoFZwiRx{|q?pF!(TAy}nX^d*$0%HsAr^pak-CURw znaSj@gvZR-iY?7F=g!6JXO_k?%{k09%lA~s3bHuZCtAbmD_V&K@Z0Sx*_ zmM@Rc?xLVsF^0p7+l*B@n@v|`Y+GEo9u6B7vp}B$+jTv+{r)heuWhDuGtR70$4-kq z=}9puMO_WSr^TCmr#PT|llkIErkDo_I2|??;ou0z;y`K|RUosBW0q#j3J|DM-=IX3 z1;>C?b2Xo;ZgyBOvXsVf2aJGsl9M)jKGdnJv#dvqG_z0!hM&w9b%2F4G`o^%%UMY^ z*~sRU*!n23i;*S|xN_Mab{4^OMRA^#L>dW+PO+L`NPy)?vpa`(5C0HzkCW4ghtg5S zt?Y^+b7f@9l972AUVHf33+HtkYm900JLa^p#@L0>36$cicx1y-N=u5ZW`lX`!q7~zFxvuyiuiQlF>9D|3e`{e8zld zh`kF$mPXlyM^W^$A4MDo%B7ZkJX&+rgS20gp`S60jxeRo5rYBF zF}=>>^jE!=^q60V`fuLSaddELM+L^|XOuC-v{~>)+B$_*j^@}W&R9l+I$|g@sP`EQ z3i~N#9Fedl2K7FZNs?98#?Y^*ADp3(d5kd2>lMj5(mxgT(%O!NgOa*(V2%@w03jYr zI=x9}IiPzPE5stLY&e>>9Sp?~r|RJ+!7o}koDUwkZ2ahDM~VV11KrM+`9mW^3uc!L z!~Efr!K2>ho@VdTfu(FYuN8nd>bnP80!3;j2X*-sgWVsz?C{~sx(^+_XoDrz{epdK zd(Y5NPy1H;3mp{$0~H;qql4?qYjHHFEnkle9aCG~`znodDq^*YWy3{B4{>kiKrcDF zC*Ky!rYyarT_@V?ytk?y!oX4yA}$shV^4(5?(`<&EMI{ob7<%eB#d-u->}INGF>uw z#n%?h)@Z69cq{1E8EtKT%xm*ioB;ia3Lmcf+iXUiJNVWExNG);p^+hE{tm{1sgBJK zb?@=F-#$KUfAbcEaZpdylEEdidI9rr9+8&}E~)ZR)FHd&P5Ut0d4pqfN6*lZ7JJU& z>CB{*WrOh?EN^KnG(@0J? zypc<793CSA(a>R|AeSyWBa;rFPR&vLS=n=3>T@Q{eXayKEryrM+4hy} zPP5D~@M)8JVntg*ThHa5=+Z+ysZ`G=AByDY;20S^DyH5(o*LeWteQbLpFYmb8W~d4 z+05Y4qr5@=;oDy1*`%YW0>#rV5 zM2pVU**Xta@QzwrB+dfM3IKJELN$IsmUe|`RE{oc&_BJ;SG zw~zLEq1}%=P``T8Oq*OoYcIcdqF|jXSTEdvruF|D$KykCy0T3#GxD@z-53cMDO8ys z&7Z9N@5!~v3l{9lPJR99YyVRRs;B#zsgj+%4arTBZrv>O7r>{{d-*BP%v0po(gc~Z!uA4SldHZ%Rd(z`!z@0-Ax zaH_g_g5-N4yOjk`o3=XDHzCzr4Vmg@M2G(m_0iAhQRBDqX)g}g-mx_6S6oJeo%L%5 zH=ERKl$i(FcyRncS?CqVVM4) zhWpg)J!Cm*~08)aDocA&ff4L-8a=Z{x|RD{Aw{TPZsPAnFo$ zms3oG`nEbUno@r~56z$ckyL6V)9>}BGnus4+n>R0W*E(bKnm3^1UJx>H|0&KBL>Of zg^^Kj#;Y$*7wf$l?}K;zGg-#{JYOy?p2+Y&1}*y`;sSmO6g0JyuEa8FKX<*lPx~!+4Gy1n zH(jPx0jmPn11ec!MeqVxvzfcG-!3Cxf~hPy8=5BcAQ+NnCwm*O8%Xui?H#{OqS7=lh@3v3w~xN zIMdx`*IWi>KFZ;JB`o8n@^jumIR8xd1jsUI;G-PglhfakGc`WfaE9j8#u1idWnp=3 zGuVtYETJ87DB9Q&>i|Z$lY0xJtML*bi4J&uQR z%Mhj)=xsOSFekP31UGf@$TW)Y8ZFljF(8PwWOzM|G%IJ%*>!$&;Z0GRR_f3MWQA*o zs1S+OL8UzkBN*RiSM3@bQOrF1`LT>y5&B0odaDs`$Z8$2T7hh0Or;vrF4sTh;8w<0 zGG}#vzt@}d*Ab1!RwOPGnzD27tx(7qdkO+G$A$4VMQZ^wwnn;;i*FnAGL32;<#8-5 z_u@1#BWo8<(!pQ4DkFv2H+)dSuR(1MfRDr&_zBzL>| zCTiI-McY#pd-;(9aoq2nLZYB?-J)%YId6s0st&4YW3fp)1K#3xL3+mN58%j9kDBfo z!Vo`uo23SiHdl}K3~}i*d_hxq{7?_gAT)rz9*+)stDCjMPqQEU$*JX*Xn}Jf(XLHr z^6o7x_opAgkyA=M)B|ZO_Zhz6GuhP465|O&J!jaD<<^tbM2c~58HkOs$KmtWn#;#v zfv`j*pLvmAq9>81Voc^_}vd7WIab4WX(wMZPHdB`7Mh`(~!qF%)* zk}EiiNiA&3{hmo(TzZWar2Akbt@awvh=Z)-L zov1Kjk~2FDKafdQJ^vcbm(28%@VRRu>+nq=L1h?XOwF%g-NiCVbd`)C7QvRS5b59) zyD0Jg$}q2qX~bhm6wuJz>KJNv(sW7ts`e86pkJC?edh2bHFque#)4yYmmE%QK5|Xp zLw(mA*_;|}4_q?`$9@u%?{kISAcwlF=^g0;mS=HUWYWl~4 zOCNF+6*(TdblufU8YHP<$}m$_F! zz0441kwFYcei4H)_))CdG%n&#E(rWo{b@j7>@I24mt6bMwI%vlkz&=zo@=^< zEnvyEM?O%;KX_!@wnshy{)0!}ok0f#FJ5;0?U$7_>h;C$o-JE?+{M;Lc$q!k>;g-& zDxQX?=PpB2g-H;G^?jsGGhxGAmcB#u9h29_y+m|7&%NmNZ)P z)za%5OD?^zBxGT4jTY&bJ_JdY+1lK;a zVvg>38viiR%i*VH(`)%PY2qZcWDQ!G8XU-9DcTToLK&w5vWpjn4KY$EAZ-R(0UA#= zLuj&exFmzU=5q*LPF?!p>-##lKD6o4cRxCjJaA(hWQ}T-J!@Dhk zl2XaZ?e@3W#w66f;QwxG!JziutPqj~{$ju6^OUV?G3b>5eb;Yy)U^jYlFE=tu*!DK zkIL6wAVs8>M96%y2cJWo=twB+6XLp1JQxZa{FNf2!(2|6!x@bzacm@q^Z!?~aH%I> zc=6lcc>NdLAOC!ZT@jki5hd)d_t!gJZe`n(I~99v)1{9-e0_uO_OWmLx7vypXRPNv z(+`jTSbxd)E>xSJzPMpjXW+_o#iF7s;(6}3EpdbHgpG>d+n|587XI?zYe${r)1IF|=Ot0;qSJYmjC_MEjkDk=myu*zb2_Jy(XBQVWG5nSs$t@0 zaV7sZVkcFow!^ecu>{ObdGN$NNrxWH$3Q-eneww3Y0@=_{A_Nf6;@#DTm+Obd?TpRhv6?FmTg zXO}pJ+zTdUMDJ-*ak*L}84mAq(llfF(ai1gnvi;tqUg+(b@4Kt-mc?HXx$yDH}0E$ z41D>-!|>dEWS~J4U7-Yl;Pccyn8mTI<<5f#n@u**yWy6vE?8k6n{k|avg`+sGFx@x zlZi)l*9xP=NU8~e251D%<`TG&0Tjk_8({iMNd9V<;!W#8!B1*x)Y*$fv=Cq-JCPQy76@^&-pb&QahtCaN%0uC+yla8 z*|e=%Fgi=K8K>VU+XZ5_mdX~9|H>HgQ^D_~snYstBTb8nRHI?{v>aJV1k#KQNj3xc zv3z6*%^wL0AX47b{NWzD}dpZ@`79@;qi-&M~6qZ4AU7 zFNW~J#JgCTluY^RhLx|^4Mu51f{D1m1TRRr3r=#81rdQU-hDL^B^|?i2 zYjV!g+K`QH7PGVXr`cj5`|OXcFHzsVB3M`5G0$DHK86$b*!mJKHnpx=+!eNxKyBNK z+|Iln4QiN6#7%-^4mq3bAbZKx`MaD;EpXahI9X->hln$%z4w{HC`=|Pgph%(6Bv(2 z5`|qrL_QD3DC7bW!6rxwgWVRKe8DByJUDl00rih3e-xgYAV#yP$Y211w{Jw#bs8uj*fOq(dOfeuw&aj#mhlJLpXXm&yKJ zyENQ6L5hkee-I24g!Khri|AD9vpmWqrbaGBZXsCV@XP97NOk%CKpb=r?<^Vdy;aO2FkiA*q)kA;R&VIvx1{U(tp zOq4K3q0P(;NXkA0ux5&_A6kpq2eeg$7SxAolEu~!Esm>}w?@uxpHt^wXqHXp2h4(g z1ZMTze^nn8=T9i63lp1K+e)3TRVB8HfYPw?Hh*bLV{NLuXqc|R6K z|C za|$?o3{cE#gdI8&)0Q>P4qlALxhwy9yjah12BYQ6s+#`sGuMOt2I|mr9H%e25#Zp{ zKcj!jsvI9%e%A6>YfUsPId`}ND|cLQUDJ|vOOxDt4?Z|vYcM(N#U~#GKUg1nhYuP| z22<@j52+uiZ_)=}DlL;!gL6B>9ll^wsHk*fpnT50EzO%+Tk6_;Jz9Sg5I@FUMJmbs z&r>Ji%yr^EXPw^9sysKnPCdIWxNhE-t&923sM0TADs6yMYt*%4ZcBFvD?}&82@!_{ zeA~DP2_SCWiLMvc1A^?`<%>AEH1uSN`nc{ROHs*qI@ppW!A`5CsDw)gTR0NzWc-7C zymCp|IH|9xtXxvYllmGhH{vZeehy6LGy73^Ky*}!5@qhbsf2SB6UwCyG(u&lGHyfe z5M0k;Pr?!NL|V9r=|#-N zw>gMxSYpL7;9%;n42jNYq@a+eR3IegEcTqe9AF@mh!ZU5VOj>iL%s9Fa5B+m8Z_}SMbGKZ7 z@u9fYRA#cq4_$oymbn_pg{EkF?B>qJPjioF$(o0+KG3(wE$Vcldr{wks~=vY4TL!x ziA?fl_;EaR`E0%^?1P4QICWd=6zJb9H16Ws>y3Fj(?a@W8VaayxB}oOih-O=BUm=Q zsVjxzAZ(G2Elu+z174=?$N($_>&wSjSW3X`A&mL;YoANmcrnH><)cJI28O)PD3GJO z#DsgFV>*~N8OMbB++&T(!THP~(HBc3F$>G(q#Bx>`+y@m*{g~3 z4nFL;u(5TqPwy8^kz%8F$((s|Z9Ue_S5YL>eh>}#TozAwS!_%s4O4XkJ6f!qPQ=MY zBjEI6at+I$OjIEvWrP{0P<-bTy?g9bQq!WrRFpCctJVKd-{*9aA!Rd-8m+Luzvl$3 z0ztC#nw1LaPt-fU-P5mr!D<}k4Jk1090NF? zk_ZLsaOvZG3Wtzo59nTfKz-r~b6IKg!#`7>_?i0e`1vJ%{Jd|qw$;+HtiYw3y}t1U z+%xzG3wjqV`o8vF%g1qWz#)NTA{H_*#{OWX$mWL52(i-1@DBIIZHl742vJ4ZhO@X9 zMS_Y3^`K#!r!Ma!gIOH zZBrD8sxPvFaPw#WK9&lLrWNx=^+i^Y&-#79`sb=%fzkkm8TIE`{d2Wp*VZZtGaCT3 z7MNLBnArgNF^R>0C))to_eDcavA{K>3|zx0_0n#_OsD?`tPy73FuLzF_aMb`XKXl& zg``jMA%%}$5u)*c;tPR~69W98b^OLgy4CsPXU&f}VUUOIk?aAB+AO5g*?-OckbC5@ z?4RC=$8S{sv=z2c@00Mx$<6oQ&-$-vBBlFJW_J?s8K~kDg@EEyd`TZD!rSUU#^1`$ zUjQ}b@HKe1du(9~|4eXfp^!fLg8C5@!PeXEyAM`E4R%=UFIL7MEMnGWejLhC6E}j6 z_f~~8Uq&uAg#5f7a1~6Ib8}3bbfO;)f&F!0>wqM(^fRj`!v+;@n_bVFjc4yucdIdV z_r9|Y60f(*67)Ouddt?iAKjrD*DdppzJ7Fmi?(scM{~DY^m-@sOEUj1gCdNNs3T52 zHJp9(gAd+(wt;G2+7;{84F~P?T4t?(rE>3lL_yBqTlp2XBYT85<#IO}?G2$h;iB24+-3}YiAf=k%nKx${c+eZiT_cY7u1sTBMGqxe!T+PCTnd)ZD%RJpW=gse( z`o3Td+mgjNQR^+w4LP$MNHACcXgFoNup9-~o-7Ycl>y$IEKb2{Ubhu(9+8xiI7V9Y zewqM^dos`m(~dw1_Cz2^!%!6pirRiBFT2t^-o_awW`eAin= zAe+->J6s`b`_>=Tx9^e+M%nx`*!Zf*zAzR+MIl>|mc?KB9xOD2-JCYdQ1sSaW}Dr7 z7gYT5TiXOM8rfd)RrP_NnPsDadvPX4GXMT6V%#QPelm2by-Jv95t~b#q8{-C!m28K zUa!?^vz($RkiAo0EJI3>l|VKfQ1k}Ek;Ft?_k!?K!Vv}gltGw!Ti_tAxq%b0V5OLI z)l>lLEG1n|J5Qi3`>gsb?4W~+q8^nKa`vdApy~~G!}#97&cLDOp^@f;fdF?yU}xYU zZX62mZR)dG$K%Lx4xjG|D z*_1=CH;ovqkjhlcHaDc?4jEFV+*bqWC6(=#Oc6~70u_*UI@L4=_+jGYM4C4V1bdsp z6814oADweZiQkG@V`wWTya@TqR9BU%8M#ANGj5w)ol!GV(TLe#5Qrj;-?!MSrkzem zR|EqzU6hgRN^XvrvjwVfUY?gzniSx1GPmHg$M8|QEobL6{9LoQV4D)-wiP~UA5gT& z&=zR;dG6r56z-bBr)g^3*AXjmXvjEli3mhzlnP9?*}&P*O49U!PQk_9ek|7953fl! z^*1)NWCOoV9iv`#G&{u-ktWyVt^GoF%7Q7?G2qv|N_ z-&odDcC4&y;|w0KDZ8-*vC%oKrKqdOD=8%z-S(+t7E_+`GP3>bpR|Uc&RgVClQ}d4 zsND~v?qH~<9FJoyN1aHrPiqU?Y^odq%;84UIRtFztds=JMUhN|C~}Z#TQd>u+y~IF zDC&qORK4$qSD)MLGd^gvh&m@%KNx=K#%hzvO@q^#>)X(eBSAlgQbt0Z=k#BGUfYwu zGjWDu*t{>+I8tj9Xr{1;Ih+%Y|CH#6Ogt=x0yeM_YZ!89!^AWzI}HRAZB)W}3t)w( zfDR#(PQ!}qzfTbAQGdgLi6Wj=ADQ313f0^u3 zGfJ1DW?ZtZnx?CdDH^uZj5yEfcaA&TU!kT-OCeL?_h-G+fS`p9b84Bi;UYIke0G^^ z)!B5lO?E*_=~5u&+I!|Q!B_l#e+6VpOVw0``m4`hCWaQ*Lg5J)d}f(aczwV2TfZ)h ze@<^AdS5|P+OTc2?_-oScLw)TVLP$;C-)B_jd}F}ms4i}N%U6|R82&8RVxJZTBog$ zAWR|LY0*NY0up~9hcMFW`*bdC6&=ltSBme%C?xlapEDH+yjdwO^;L$HKdJY3o`Znd zF3QctLT#Q4=ZwaX@zv?`3SsjH5j>Kp;RsAIC#NgG;qaKE>aK9 zdf^JWs-nzcH4d;C6H}1!ovvPfl(%VCxM zrS&zlTNl?He#P@0vm#56>neSc2{GtW6ru;3VBRjrIiWU7bhk>)H{A;HK;FT z42pSZ_&%q)8t)CjwZ;5lzW_5B$ZdL8pKSlLAWscy!s9J1lvg!74w7n zNOnFGkCr~qZGZlNnu7b(L;rb69RVp8?*{*TIKKS;UI4hzr~ZQRn!oXYSbV%#{MxGzip9r^Y;@!mto>uY zn{aXddckP4Uhfvpg6-#u#fOT;&2awNg8O=_(I{-V5D&Sv^4pROtD#PP9e7ke`$jsQ z&b|)y>Kh;c@bG9l?M+E?_E>Q-9mpOlmW*_OVW~9FGOV+hO~vXl7%0|0O=gSwQ0@Sn z-!@MW{v#nxqGTcC8FHc^jKqr$f4nl}@Y^bbb&!lklD25jZwuBz+!aa2qmD#09(8y) zE*9o18S!YOLx&p@APZ@Sj=x#HWADXgF}nQXEBfy0sl7{Hs61bBVMK4$8O=*Cd_Cp6 ztFQX56_*dRzv`)9(6%nJLa%QLb~nulH+hr=B~@*aMRjvTp|!HBzBO1SbLsCcEjxO{ zf?e|)o&3ZYjFSm?DhfvcD!Ly482^}lG%i-Oo}0a=s=2Dfq@(ILffGztcV!s<>5KYY zMje3qA^@kCToqwv_i20*xg1H1>$?QZrYUgUM}0hTN^ne)vJW*^Q|}}#gqJ7qrX;BY zlG9t=JjVE*kmZ5d;8WMFCe36a+Da~;4axSWUD{@MVh-@9(WTF%GZ#)sl3MMQx(kca z{5;Ntu&)%-Pt08Bt0X5DIs5EXX_2QYi=9U!oB)lA0=ElR(f)K#5Zyr?vcFf6F49K` zL{T!yFWPk?XxvNr>5~@VU{P=Z1;7%WfYJ^~Wa5we9H6s+1Ls+B1(h2@eldzmC93cb zerur#B?9^Eheq`Wh>lP*=!wfP{7OcWx$f-Ku-jxnF*%d`-la6D-mJ3}Ne0J1UsFey zH2&|#CFR_{pl+1xB}Vazy^ZAJ3vT*Kg+?9iax7;!~NRMU*ap;>~?-1wTxPgRe<;*=&Zavba<0^V!ppT&9EY_bS>;{s=_Dvqdy9)p>{htJxk zqo=>sytmM^fK&Z6>);4XmL-*SS;(-B34-4Mk>vi<)q09lAO1c`wSW3m?RA&0zh$ca zGi!O~_FzHQ$rpXZsmy4fncI9uE~tR&J$-A?kr{QK)*4eD7);S;4~x9#bWH(!Cci&p z1F$|Xyp(&^=OPL?z^H6lip?`b;khGv37>ERQT7<53 zt+9?p-I4j(d(Tkmzqp%w_Ri}F7t0}wH4t2No|QU!>j$s7<^25*c+|QFfr@&$qc5}n zcb$Wa_bg4UIbEHT9sADjYqILa-6C(^yVg~9^Laate2+Hn*#nP@#e&sjmRr_5lif4< zyie9W$q>*}b^r8nZbtQ#Piv0PQTJC0>-VEiX$U@7`LVB`uJ+?It0_cJ+aAo%J(1R> zgf#QRZp`0xrkZ|A4yRxjoermn@+bI*e9XY)jM1^I(GYe}{Ewh`5vgwT6bF~qSL%xG66*)(S0Fm%JoliXu}@-dSVSN}|4UD~H;0>`%0xsUdbGVfS+N&%9pZWZ4b|i?4A}*sa*h zibR9KE&IBg28v6nf^Pr*Woz&5vMsIpLaN0Ove;~4j?1@1_757h7Hf~k+Se`LBiV~} zf$C+!VozIjq{5-t+v-ELfi~HnU(3Pouty`wSR#g6PnZM}ff$qP^Ld$`Uykt7%la88eldiK z+D?}viUP0)*w`>e=nw%3MjttNX$`NQw1N~S6%D) zuAy9V%GJTr)+<{}gTbN!Qqd`B7rFK>e`~d)7+N)&5QeO(Kv&S1>$}NDr<-6 zDK|EW%0ZRoV2?0mU{U8~T?A>uA(`+pN>qq)Hopy};G;^u?`i!E`(EHQJ(PPPhn9cf_MFTPpQnodc7$;D*=xhY>7zS`t=R75;g<$ZJ?qr{O!`v-0o0W zd1&6kDw(6%ku_`R%Wi31%hOr+(=F@GZnw0q^(p!;TOW6CyKJk}7$_TD0N*VO%$pl5 zD+|t@7bt@j8{(0$S-$}|xzqzyKcDM_24{CT+nzwfQia<0PSn=qJKr~)jYT$nO+PrzM&Cjm=)5WblI)_8o z(>nAQTo>(jv8Q#2m(<eC-Wcc4Md~Cp2vFdB7Lek*%2s?!eRARA9dEj zLBt#)hUgmMA4I{7f6!?&=%f+}+4p*YY1Gtyg}?3e5|O9Q>Y z%iV+!p90@6mL-X~rwFQH5d;UPb72yE64)Ma0^3T2APxzHdruF(9CB1VE$c=7!DkHy zz4e(2g-eRIfAJ{lc>sdl`?M_T4eB_2N&oA@2bAOBHN)7SNwtubck3X#Nz&XU_N~h!$yZ) zYXD$vwini@vieOS41KCgeHhllAJuQFGS{xYto|N4)pvHOzh+wVfnEJjhDvbiJN%pK z@6}g8Qva_0P5l9sbBEL)sDFo9L}VOphnPaRg($hw_z}4)#K9&yd?6I4^x4cH1{6UI zC?FcB2mwXpxRGo-_Z=9!-4B;>BjazU;Jt`rUj(NtOD}lj$p- zeDaDkyjorU&GKsY@y&~S#}4;id~q*-N$Mz24~4l9>Q5xA1jJNujrzUuPAB6F zOE~_vjTN&SubL0vc{dp0K9-g&DtzHyD-Vy>@R^YV|khZppv>?K~E{5zT) zb?B^5x>pPJb-r=+u74h}ILv}b4St8)z?D}vS9uPefc;SOX! zb5DKQW%D+q_4;G<@>0J+-`FG?E8S&&gIHds*Zaq1_jz*{*=IF!Hod(v?(curYPkJ& zU1c-(^n+@#Cst-V6f7MwmDiNU43X#ee`BG$!Q-(Mh2_B7@KSpR(;L-d)p|CHwvhFj zns$&$A19J5HJqirD~Q-es}_xVmxn5`L@=cDhAhA|6R}|vD1a#F(9%a^m~%N@Jk9~+ zQw*-2zN$K?3$0qLUpG9+(PYE?o4;$H8>;{E!}Y;j1Vf5I~L3A182g z%=YJpI_g`iVkJg^335UYLP`9*?yKt7etFBhYvKOF_FM9l6I|6bF1YE3FyC0eW?)Up zSJh3kFCLsjVHV$5Sbdlnn@DkjjxYwCoPI+NQ8DQnqaRt#>itHuWK{1l>kalCb03hP zRZSa>khUrc&td^%8dhU$f^dS6!E5I5AQ;kN6vSF`9yn=s@;VNy88+e7VT+kplraX9 z=0}58NE?l6+KP4q>O_r+gcsN~nRmuv*Rc$)TtcM}RU2e!%sZn{bQF{7rha3y#A=Yk z_m1f@xoe`Y4DHNGFHk&|K!utN7GXxI=+%-@y;r*sNoEQ2sN zO+u|we*tQ0|x+e4jz2g>-ALv2g2XqIdY4~Q&~Bu zDm6E{Y4?HW_{-auEa^U4LoY;=jNH%H5pibO|NsEYDM}%kvVu+Fn47A~!I0uJ|IN>*5m&@yf z6JDp&>lz=cZEIcA*2b?$H7sdc({{M6uC@&phg0;MJJaJ^(z_OjCbPKkoY&7;D4Ia4KtZh@W+rp{eE1c8;(Gv@)1QF~|1x>I3{z?eO;!z$c;?f1hgv$v* z9Ct*W%b7@aaBUETSg3;w#?UDNA#^|JL>(%8us2;W5yai>#px7v&SWAM4|5@%%kB?@ zE|ds{f;v&>L1Br6i1K_1SHy{;x9HLVHp(YEID935CLbc|LO~2gCp!eE3zIS=^n@Ua z&n{6mBs%dBybl)8X`n@RvWGenp)dk%Tu%Hot)MI}n!s03v;&-g<#9M&5m6V72v{Rt zdsBsCVZbW8oGyDO#Lye%m%u4X)a67II+6en#lm2z@eR+!xg?I&ooBB&YyxI*$5{bI zoy)_CcD$wsTpsjhF&|eDOV7MpTr!cw21zEOj24FdK6)bXM>uTX|3lk*$H!6J{p0hQ zZCCfo-rZi)ov!Vvm#gYJtJsz-+p^qcYzr{1fE&2saxR1x8!%u~42T{usG(l%$;muAn^S0!)VKFxvjG^pU=A}B9OBnH-a=p3fI}k z;r)6o%SqfBtV!q8FzQV#%Q1`~@T`Rei~%z<)2zTSSO6{Px)9N`!Yp```E8MP>4#4axvnauU$6>^n=k}3uHd__j9 zJXM2%*Vv0$%(EODuHs5q+mEzn#_!XViB(b7$OB{3Rc*MqLe?8FIJCT-kukPlhbav0 zQ*yU4dR~he9mD7uxC3h~Jg4P&%!p-Ht^Tmiz=#6IBCDz6jEqUEq#j$vgmBzjbZ17&gv*_rE(oC0fli!d@j30u;&@PN zv|RATB>Ju~(hhjTlG_W|)8y%Ni95K z`#@viIE@a2S;uI|?Z)bjR;S73F&F8ALOEA+zRlKp`voPKt=v=Tp}#jj-qS8Gj25&xrl>tc=5 z?r-&aCE&)LV<=|jOSGn{62{b6TjlJ~m^GNw3JJ4mqN3reTHWMuV%!J?OE>&-Qhu-3rptifPcz{W8~QyK3xIP|6t z(W2#D8opR$_=?21sO5=7cTnpzJBo;N_~KND?aIWeXZtTIw?mPq?ADHj>sK#pe06s1 zgc6K{5g&j?G8AzUaYlOlmT?ofKyAonjTF1|`tAt^f86KMn?`x&1S27$ViZMHD27_l zEP~XDC`^bX(xZ-ej8UR&fJD>fy!CKYiHaZ;bBaJ}I0y%$5DJRe zZlmfm#DSfd|1s2Fhw?}B23CA17$%m-l%y7q5fwMqVI>-F>~+zGIg@Lb`n+XU(^cgi zCE*Hpb^WUQ2RgDV+m-HFO?&$t#l7R=(`w6NMX~rl@9p}*$~IW>?yWnPPVTx=J@NQT zb8le=I5Goo#-^t#oO-7qn9Xj>WM?4g%v7f5R{2|3b~Vpyiilx{Xe)`viz_ROn<~%P z85w`!Rkyy|YhL*{a94IsUb-Vcqn;o$G?rB{vW0z@C;CsVsDm(gQllzvM4^O$`pGAe zlu=*}6<6bR1f~%R1O*;Mpa??>bP|}98<@XFIIlfdC;NE_$-clR4jf_9)u;;`U50c|AG2X$#&HYVGMSz7lpGA&PCO*=FyJ;7nRYbW z6{V=GDB}5hm%2s$rNv>daM*NO)#DPhjvj7Ddg1cr!yj6p9(H~;Mwj=BA62QNiuL3i zzFA?l&>$nUd6Mg;t#~*l=ChzD=LQw`aSC|nvTkLFrAgpnGK4)OOI*kpGvcY0s81DvFoXnE`bzf$WklKxTDd=c7A!J_^T5>dIl}F7+If)vc(XR<*TN zfmv}|O>omL^D^{pkCo@1c*qJ|8mK*$k zGur51U2om0UYzY+r5>Y4!(@n+NnHsH46mX`@~T=x#>`bJ)yjjx-c_sMrBla|e@E@a zoi73{ppeE*o*Ie;5gc-OOdZ8=u)u67sxFz;>sCxF?{ib(QM)dAeLWhFyxo2FAs1gv+;{B426E*liYS>MYRY;NWDg?HJ;Xh z@mM%Q-Ce1>dn!zu$wVfDfN^Onoc(*M?h*C*!%KfPviRV~JFWr-lm+U=#|{vy*0s-o z^@a+IH85-5-s9JL+X*CyPDJ=zp>-vgNrYE`i0Loy$s$1H-P-&79N+D z`lr0I_S)ln<5s^|f|x>#IG-mjFQ5Wxpfm6_Z2alkzieiV;00bh_6^P`?&Fje&l5kX zyD9Gu&@ffYpqWj$n`nUMwJfNYQSrziKfn#4HiEE1NV9*~rT^Z?WIfRs?A2adVb@wx0#&>hA73FYAWUrPx|lAhtrrNwR{vgV0K zjp8eIvo&e^)0#m-_E+*7=69q19;1to9wpqAk&$8HTDA-Qfa2>(KZ|rg;(qLqeOQDL z$1BxP#RwuR+o+iY3Hp!{995_SO~eO&AWa89_?TF_g^gAL5$_^*umQFEP{FV%9GwhBrf}kl=MvyaOv-x`K$2l3DQ!;_TvewYr z3Hw&hce-?;bC>RJ;u+Rd23CWEdTAi_H7Q$wmIs5_>ZM-r3KY6rYRbYzBjUR%f*a zIA^G{+~ndpiD65}wL6`0L)Ucy+*GJ1P#g}10_POX;%O}JrcS4o@E5Y%Fa zq<3R5a29`{Au(6cw*;>Fko3=d~=|s53DPFbrVMq|N*8-Y1y3bC8bKdevwqT86eE z6gk-^CSPRQJ(e9QnRF{jCr|c4qzb|U&&obv)2VR8CKC2F;jCKIsW9mf`UohFs5}WG zVYd1(CWuSAgOnoh`A%homQ|6aK$LWD^Idd&huszmPO&?z9n&t*XpLf#VDX8*hb#ZM za>caj>R&Hkxe)Z)L3L#BJL>-vwSxeA-+>4y-B&%S=G6DqfBtsI71?`XZuhuKmKRMt zf5q!nm6ezib%y#gIxd*uk~HPA>=0~oTAgJq=XN&1%-Qj%HkNX0yy2FX`)7M=41VuL z{}>LAH;L{*u(Q~6lhMO*dZS5V0-L?}2i=*gMFVCqZftH{YZUb?Yi(GD7cRJ{PId^Ia=CTD$hn=)QqDMaAh*`z zw#GbthdVlxR^DG%&ASVFg?W6!8l*)M@m?qN{%8xNeI(|I1!8a<2D6~xq{YEn+4BxQ z^NWL*KOGD`t=^P-@!@+Q%qAaxG4~LJ?+GqgF#C(EuKI#&Rz1V&nPlm$9U(Y-t`ykfuHnV&|J)jK9^4Sp86%Y6&L*WG100qR&;NjUTq6a>8aQ` z2n=Q{MRnb4$9pYOX=7_^t;xKpi??-luUfsk!`0Q>KWF;*l*z=+a|?27vcZq#Dcky* zeO6!?=9)_dxv@&YwTMOb5ybwDBS;c6vQgd=ZDmnwwq^i(z(W2a_EC2u_HS#a)vLp~ zPo}M9Uq4Yc`nPr(GiBOZ@U+cbuYL~3^)uUG{0JI>i6dy_hwbe%)~_Fv-*TY{`EpX; z4TW}}Y&7R79pLyD(iEF5n1YTPR_0AX@BMECD!k_#yg?8CHzL(na@U1pJsF2Ssq9Bl z=7E^Q`mM(*8P!2@fTwIti7V(>5&5sNz3?$YX%wwGXeBPAd3RHFx$x}VJg$wh{+3b z5&mF|bTOh*z#bqhDv23c+@QXC^nm)Gn|^(tWz${|j%@wyh1ksSx;}haR%MN zzf7x8X6o4=hRUPHV&9I&Wu9|Ai5`7@%+zG+7`XY5Zyg_-KVo+Lj@PK4O9S<9-JAN= z;|5{AbHLf2cqsk<(hq?G9@sWEg*2*@z-4J4*oN7BSL`G}tQC@Dr}Js0B8a32BSYZq zqZ5`CDlBBPkE@UUd{DH$!SFh*QT||bY!wGZE37xUWp#aF^cb+T6c7Deee7|oh|g{V zUT4nAnhEnyP8}yb%ZD%EY@~eS{Lu;3Wdz$3qSZ>?7lbIMnp|h1#wa(_w?Ub*ag0+hWL&|spDjCKKn*( z&J*b>NTg_#r4f?xm>i%jm;!Vq?XU?lVbBJ6A;_BmL?{O)9%Dih5zGZ28|MNFKKJ}v zvKgZ!G)$h{AV|hc_LlS6xngj%%w+!a<|p;5JYMyfdv4{x z{Gyw0E}B13HOCFbtXLiE3d3{5+6!PXlc^3kUD)EZV3#vcoyiCe#uTpzSHw+>Ll_RP z3j1oVtx;cB%4(cW0y~9Q;TXJ1AgHV{;Ij8-^8GHV^VCOizvN{ly~KPLsT#ObljIpB zz~)w<;z;>PqJKxKLq9}LO%_D(coRtJ6hs(~`=n+1{QK*K8I9GGO=dw@%kFdz4?}91`aJ$(TJxEK z#(V7U##yP#yO!VSl*z;$No{X)b&n|t^(oCXvisz%PPu7js&a7IAXz0{aa)?7+F03T zN~yo7)2PRnK_ihI_)1-0N`2Z+!-#;T;1ORB1($eYJ4_-uqYtnxpDy8JEnGU%0%JiW z%rSo;_)PMwwzjjXeqL=T)76zQnUcD6>F`iVU2~-R;V9!3y^_;zvpXfP=w(13YW*tK z(>k z?XcUhAf=KCRLnZ8W=zCu6l}JpP;oeAHDe`Q%<|Z5b!=;gmB08qr{PQ*58I=DSXCy8 zlJwG~Z3YX^m<+ueex&}jP$m@XmcjIAuL1osUAmiP4ZKxwFs&;8F|b>=uUf`jwD8sc z`CH@g?Qkyie7a}Pr|Mz#TJ1UE+i2$wIf$wp0qX$z4V zVurG%-s3uNX%-Nm?CAfE-qJ6#rQSxq(OddOw$#fbHJjJ78$mh5jQPvUd=fjk?5OW@ zR-5O}llFq-pbtt~;vBJb!A&ee*sOM&AUOm|PgK$p2|%XOk%DF{@PD_m_p7g~cdD=7 z&suSdBjI3s9VZ4^1Dm^`ypC^eXuvwHX~?A2;f98B`q}D34hK8H8d!D!Kc@bob6scW zx=v_%SP-zeN}~<}yd1pgoN!mCqD~d{dc9tRpD3MO$}1Nw)l_L<06-l?fX*Aqa@XWB zEg+F3g`^-%avEtLSmhQbO(tuJP#iPQ*iv4aF_x$!56*9hm3Or6ezGibb^nIyRI;wY zn+Z+P?Zxf6X1yLi-3iY?$rUEk%8%7wbT)r*%}cXIF?x2x4=i7hdT8ZHmc5!M8XYx6 z^E8sE;z`O@WQcVO5shRLl#xx+$}~-oPB8%?M3jm1>kwc$8zKp7!h}u{dAmfqP;aMO zfcdRxirVVU?Tk5)T(WX{s(RAd=foRU%u8PwY+0Tuo93>vl{e2#M5eittKhcFc1`N3 z9p71->7SRWouK}0aMzz3!gITKf~DARuX0@b!o=2|-#p{030KQih8m2;aNYdIx-%L} zE$+ku=K98qxAa8=jptM?S<;sXca&)PD=n#HpS-s3##CE|HYZNjUxeoxL{n&{#6dvM3I)xR*k3GM5M_>WWP*rLriqY^ z5|w1);!U-4qYBZ(Bgt=4Q}cEk8;^yPiD(Oi$JAcoV%EVP{zqgppyp^xnxS^J} zs;?!wlgV!Qd9pi^=uVy(zbL%p;nwF!VI<}LgT!|p-X2QC#z*`-IG=eIoPsY5i@%|s zfYoMGON+_O^R>17Z@LqSh?3}!kbNflYR8BBdGJ(563Omltd_H@&k6mJ@wK4_lc#9U z^Uv=ocA4sro~-fm70;eMpN?Lqd>hw99h*o!Pjo7X@G`wlHFWGXLruQwO2a zPjW&v_Qx%3(~T>A73EFEZtl~2@B5T@`5`{G=?wdg#$?iHg;8i^P*Y-_Y>#<25xNIL8^*3E``&yWG zTAUvr@w7}`wQ{QZXPd`k+pwu`&FWroN?xy&dS}yCo5w3%rWsAcKRI*)CN|Az%KguS!%xGN zF!98ppA7GOx@kreQ@4)5c5(;)=Zh1EK&KurZ)_~b=N|mWKkvV^;WqW(hfaL?AQ+k( z)PIyUHkOUeR}vi*6d_jPV&dk{RI|#?{(9Zd4aW1oy zEgE~LXigcqHHdv5aY&1d)PJl9MW{{=`D_JT5VC+JZei^4q(rnR0?9zc60%UA=+Wtk zFXldii5I~QFTM0qAGYWI1{2kvk%AksE%y;jP>;Zbi`e&vOYxE1-(aORE1WOyI2#Zm~&ndiLhm;%!^*`N@{<_D5e!H*aC&u~!gxWcy8Ex4^XQJTlJJ zg5e2fO2a}vx2yDJ2`>Y~6XD^XmA)*&7hk=;I#fEM6<*>I+JPQJ&!d;oTj)>dFX#jG zF(Qbnl#h{pSQfER#f1pM)hGDDA!0!xr%FjCII7UDGsOgv4-NUuM3h7elke%1jx^~z zm@r>Z~bpIqG`=zsR)o3>^6pk4tz|$ z#hI1`(&`i$A=-lDAVkSRDJ~0;w40z6v(HYt?Cd4u$^-M7I%_r_2v;3CMl zR|tO2%J2XnXe>-^f(am$$1vzu9RK;eCzXE_pas=1p$l4z0yy zF+Bosm!tZs>U6cPqnzt&sYsXE>^i3*#*|cspqaA>BCiv)tYC6mtHrJJ%q1PIMH4iJ z;$nxv@t@7!ic(il4C%`?0xq38d|0fjurTHSi5^L5Jw>t$Z@j2EqkdU)UKiZPgzDpU ztYDuy&Z~9~@VZKa^qOB+%4`Ho{w-vx$FDzgV%_p|voGChjvRR4vFpynET`onLXpAe ziZ}x9*3upm*mY)qx5HT9Y{%~8{H-_GSobQ2*(5W|MTb$xau|%omWab*axf)k_fH3F z!$HR8G+U*LE_bn+5shJg#_K96!Fto{oLyt$bsUEo7Rr4Aca>+lR$J)>=z)a`?cu0g zX{ncbOxonEyPhp)v^uSn67<6}+~xjMRUKEUXTpY`)TpnTKrrbw0+eH;fG@CFz>wQK z-N4rZ&^_n--c}xQe@8M(q4~tGfXhE>l-fpN?SxI3rf_Ql2PG+@RJuio$4E~c(kY;A zBLWK~nIeKqqf$M2Og6=$*$O?CWTJ&5@VypdYe2T<*(*88x2Ai0hSTUx0%(FO&We@J zE*A_Hl1)xlJBw=FqShiaCSKH`o=`}h|CqutZuJi@6JHno>sdHAP*WQV7Pf`2$ z`hDv*6}zX5n_vr77ki76n_pG`roO7a|J!V|v2RjewIp_jntkC4&G!0=`^)X&neEfl z(U>GUg0-xHx9N(#48sOIf?-#+Xwn%foHmVM!$wxe@(ebKCJWCRpxRMc>770UN*WqU z0B$;GRl;T&H#q~)+|>e1u&Q*!%Xg}O`T4nPe+k~fx%X^dJtbM{oXm%sP(Rv$5SXwC(NQ{cT1mBnEbunj5o=`_S%?xms-F?6aTTPg zG${#nq=+97X@HV2e_AFDuxcjlCz&1}Fg9KwDooKdL9?2eXe(|3nT812s=@ufaSzNi zuj-n)VQ#0RYMf!eJ`#y6jrjK8_JrYjLu6@pr0Dv={kQG+byRr9_ivclv(_-wTFj`}qEiGbgSx&-(E=!}a>eQYAuG#8&c)-OI=?UO#xful>ku)2gnS8_(*tRiC(S z=EemRycHdEmHd9mt{#}FU(3pqFVN5YX?x*#^T*)eW2Z=K&Bwbkr(LBgBTEI@G6;d7Y6y8k2l_blP2Zg3vFv(X@&?|k0fuRuB5Lqkj zBU!q1jFY1fv2Y+WQASS7z*#^R$WM?6V&@_8A5hd#4=~UXn#VQ~k zvs>^UkZrb#a-oB5Z=dF5{S4n@-!57@ux7C)>cbc~x9qg)Sl}c2hU!IF*QVFHSQaxb zFXKvN3|lzX_zEK!6ray6i!3k!TTNK9;3rzIIPnF3B-hQpx%lBlzgt}Snp%aM)#JCM zN_OmR2+WxJS*u2;VZ8yi>wyUiubOG{M|5!A@NqF$B^WsZ)HW?I$5j}bp^>%0^NgU; z+KRX&UNU8&3A31;<9x*9yG#o~tk)1sppFv+*1}sb&zQ|29AX(AfWeMq^;~S4mrr1* zg<~e8Y%(yi$;~h+orn=Q>p~5 zMsKp>NNrJAu-JJvd*WCB=07(AW>Z?=$pH^9y&c|g;l*2ax%|=VmdUOfe zkM2P~MMEc9O8G!=A{FPpDp5{ALd3txemcjB2&a_8Nju!H&Hw+szLXad3s|6-s9k2s zfIHSOe&6!p!L|i;C3vu8zd!NV6dbvmu0gH+DEokFWNnMHedhbBVi7drTkpa-*>67X=mX2BXJ6C``fa*#HRYV-SM-WGR6!JNx zRx}kYL@UuY>Js=r=;!Da^bYz2jerUKPz^+-?es{bJncoTf_1NK>RTocom^pz&e3;Ho*)dJyu1oN zb&TJ++3^2i-7!0(ansC*nH}N=XzvecNzaM&ZASrsFc!x|!#{~sjJ;ERtAP4b-}2V= zdf$Up?|FOc)WJOP?=AJM;pZsiFRNxL0XeMhK zK}(WW5NYGkJ_*n!PNB);11`o|3CklCBmt&SFqvqO3b*Lv5jJkZ^{e&x;8PpcoSt!ggP_s`us>$M-Rdu_^!rtX{8 zPFc~^bztq%^}XE(R<7&qzIi3#gpD9P#3RaAwef=FpkJJ{lt0y&5Ae{Mg_St$9&(3q z<-#>H_uaQ|CiCgl&qRh_prXsk$TL@GKfn3r&qwnpr?^mlggCHp(Mm9q8<>|GF6e?# zHDezzS)9#fGx*Wm_}qBzc-WuIc-y?Wj6YnZ;2}qa0}m-x^I<;T{K0BfRdEi5nk;J8 zY=*3*Da4?XHW83UGlIl6^81uKts(X6C>M+Hr`r(XBJ?;o(iVzV0v8>fC&$I{!DvK@ z7A6V@7$Jf#kyK2kA70J}m>LFU;9B)u^<3^ZZ(W0nS7o{)gTTd25FHWDX0pKBaQ|307Fzv z6(*KS$8jKtlLOqm+qcepxUcx`jgu~# z(LfB+$UPj5W%^JARiJTb0`>Gc?Mq1FKjgqkY@rG>p=3N}w-rWQP)P<-)RZf)@M zn3x=D0VZG%jLpuyrtXHV7Y<&zBHBG;@`HD*Kl8}ro3XBABHRSmZO`6$%MV^^xm@2> zyIQZZamk%O z50=3Bo9fy?H+i(5CFHdwJt#_e^rHw4%A6-{`8*~rN_ww(9j3e*QQC$=g!L9ws=>k$ zus;>8MSRtj&tG}v^SRx7mwG%)Cy(>{ukW$<*^1XqSjxQm(AI4aJ+y7>L;KW!J*G}F zJhf}%qptVi;;9Ra4x&Y%Kl&KxSwGqS$`en#x|c8W@9&wM@oNH_rY`24tq(o4b=#ps z+a6c{tvgwIgzl)Xc%=$Opz0!o4Gq!D?a@ zI2r_NCS7*Y>4=bfNLgtN>D80>jyhT7WBKuzgZ=%Q!PTn=Rr3XXbqidHs-_JtXS})3 zVe4at^I@_3ZPzSZdZP~J?tAUEeb@dkepf3^YEj>~mr|ksv*)?pyBD3an<*V!y=H3f zYW2Ch*EZDHY|eOd(*|dN!{_B=WH)r4vEheHhF`mG-)q0VR(%2@>)|)+@4Z(YT(o=l zb9;6ZW$}?&{6BdH8IccFq9!znDkL#Ng!0>3aN6O4sK}UrA*kC_ItqjZ1-u|L61f7v zGm)r7kdhq9gb5-iC`=@pW+G_)NUu_W9a7_Sfh z1?o5Nc}tzYKiJpVWU;_?{**xy}x$57irrLJTW#cfv|o{(#xxU=FpaKRjxHMSd@fZH@|8N_|GXE;1!#3pyM+D>D(! zefs0+>J_$Gb8npAZZrbpF`1h4&qzj-f95U7MbIImstZzpsUqfmyl}FFLPiQ?R>D!H zQTjYLq7kGPAdiPkU=?s|!L9`hcI{xkn2Vj-9MU>5$Iv3xDh{j~Ts4eV4Xzpxtvly? zm&v!E#h|lpmzR0x?}V*ny9ICz&e2GcCg;k}A~h>ov&3dIn;%+5$j;vhcP!YpZGk#} zCwmH)Q`raoBYsHyvvERAw`;ncYoSiM5={GH!;=;Tm_L~E9u zz?aAKhr4LZd9wjphO;~8lat7hlgQ+Ur%oa-HcL)LEvA@KHL802PlQ?if8k z6eh`IYI#agZ3(I`oJf=E=j1R&h#>@lUKn!66t@}!UD%}#xxzY7V{S!)y?>^|XUH&1 zB;d1>;(iA9N{ai>u(v;*{U9T@WnydU+UKvUHs!)p>l~`Dk^{J zv>XtOFP7E@wdJ-Vjc1A8^HGU?cbPHn3TXnHjUlj9%UzSIg^15zripYk8%pP$mIwk; zzfx@liL``?2b;hM0SiO}mOxrc2Uw*3+6l7CRqXMpuR*m_{Qyo>?D0V*`|I4Je)UYB z`iT#!@dO{->H~`pA!I=a{ZNb83y_E+)Umz^O++)$S?FxE8f`E5=r&SC+Auq=8%M1x(rK6YQ!l! zWGW&}8+GIu5Y108X0sWLI;|**VAMLGOm8r1%o-!;^t@KoYqcjnve~eREfy@!al5fb zE6Z99xF2)5^g3*}W1W71EMtSwZZ{eR>~<{jTANMFi?CgN$8OgNW^A=$v!GibNqUVH zo6Xp&(Vu0tVw;4`W}`-HfXkjWnM^hjMA2k3oh^!HhZzh8Fgr}Y6|HV7@Vo)*w0eyo zVs`P}7Y_g3X!XtqJqP``2eWW8yX3ZPsv{#?0p)hrfYN&}#)F zoSWUM)o#sd$G`G|R`>iXS~UiL``5>M{m1_@aKryJ8vi+L^ndtovsU=`hrCvG;Pcd7 z{}%Mtf5T?0eyUpWPmNysC;Udz7pwd~?Dl`aajnsqv)~U^{E5ya>OTQhFN!|Z_L1If z)_(*a8O&x?^B1GlYFu+6-prV^0;jR&uD$RsY&9}FWnEDHa>#M_XqzD)2Q?xORU1X9 zIGncIC_JPY9RGcer9#vMazw`+|1M6Q_Z&3%-TV7rd2fkze2n@nmFORPOGJ|H# zxG#?pxo^hsePd>zY|IQ>*14`Tn_n;6xejSaEQcrG0tvZM2rWQoqYF_MU5XHi%bg~5 zBny@Ru}h`^aFV_SnkgdzTwbu}mt2P(Tuwj2@D=b zc$(WM)H-~C0hE$}vr#=R7=YEeOO{k>O&HHyb?Mf=n_?vuLT$SIAzN2DkJJ?@QUC$h|`bSfDqfpsY^ zQTaZGH$jL*=$R00*oC4>l!+(5^C~YJf9I`Pfx#>T9Fx8E&hhGR`p@Ptndk9UYp%i^ zuq?*h+5O++iZR(0xfSqdo7=2$GC{5C!Pl)=p?2Hcb~{(B#ev*AT0d{MyKV5uihO%z z%riRu`<*|bC4`7@C&>U~KZM9UlfMW8Y0{DuLp9KgA~D~2{!j_7NlQ2#2N+n)3CxNf z2z3lS-L8Jny@WL|7z4}em-nb|cRc>o_qYTfE?<6|AZb{h6}0Sa%a?-%+$&bxDo8BD z@_NIqD^{qVssw&FMw2}Mj@D6J^7nWG=oLuDV|nlGs1hRTjS#XB#TkOI`tEZsh6(d8 z>nUrW+TB{yr(SgiaO*cD{Brq9dopf9F50>P#H?2 zZmOi74B5G4sHiZufA@U}5g~O8P{uL=9;8!JGER&TaiRH)vjnq9{+Oo!TJ>eKD#E*0 zXs&+yYK{Hu>{LhavE`E{EuX|@$NUH1Rexo(#}WRudWXj~{k-$0yF9HhIh%E>ZtB5E z?iIz~j(Pv;Q4dA1eUB#)9QM3JZS^U8iF68L>6DqU;)uYCnM%M!W5oHh3P_2KmVD=( zg^z4D4QtTfy_1A>ciwG=!+vS|c5}*R=PZjBSvb4(agS~GY->uvQX(N?$@V?&K2xP} zmvA^~tG~A1mb8+#D8>1W zxlVch!1uXIr^ST0(W^!kFXOTAycC!^4Xbp>oJ%f?s8#<1TJ87xd@ye#8Awqe(=|>3f}73t_SXLE;m>EAh5Z2OI(;LN$=^LX>3VQx2IBC8hkj zWMT9>&lmc5Ra(`5vzk} zz~LrsrZgdd=P^ct2n2>SHq6JpdCr;Resz0wZ=ZMEvPEkLW_!Tnp0jb&)O*+Mx&76{ zhn{Eq zL;reh=+5z!5$c|h@t3U!vgiA-Y5E%_LYeBYf z5wH-pe%@^_X(6f#r0e`UJWoBOKK$g9OdQWsKUWV;2DAF9`so!gC3hG5(v#}LV9edc z#Dl{x*(>bBF9m~4++Ja4;z3xco)1gj32)y%{1)sz{LT*^dE}A#@4yoEeD#y&}ZZwG7fI_H0|4dTcMkr8@X=dZ3pa|gr zSnW0*Xs4MV6!NeyB5_WIN=V#}5I^(CuTU`WouyfM*+=)VCg#Khz}$TwoqvYm&I=b# zo&?c{?gr-_aQwv|ZN6-Yxz*4D z$F+6!t!&+NA0Dpy<)%A70Nr2iI{(pBw0!OD4L3e^oBGimyi@&j)1I?!UE;X*RI;P2 zqpz={?8@~U_nc`CR~RyF@%qku+3u5dGQD?sJy62*Nt6D^SBVVaVnHTqX^>VD=_qeT z#px&?j0)D`6!nqi$`f(d<&KEpiu!Ut7 zJ=Nd;l$S@}fD#t_$wntWqkA~0?#ewu3qW}{zp>`2gZbUj*Z|Sh{SQ&6fK%WmYdCG; z5mAmQZXqH6C}9B$V}9#-Sop>t)ITiFd)O{k|L})5VBzyP`$&OL(eudLu>DKFI$Ws^ zzE8vvh@`^%Fi;7s|4VfnxsHI0BZ&WuN9b&Xq?9!stF;LtOTi?RS`UPPPXe21LMtKR zUqTWz(S>w^sAu@{>*6Z58kD%B)~AuJn5B|7lIC~MaG)v4)CIV%iLs@VTg>LD*W@vZ zy3)!r(YQ1^#U?@2Zo6$T5M@}$RIhhQMV}=3gSP6x+-VaW_NFc;TU=IKDjG#WS5i5( zwxhhpD*^Midj7}}_3+;=#{1rcP1^x$;)~Z`f8E^^Vo|f-Vvg@zv&dKEstve#eywG^ z+f%c$*#Faqt5ydCkqH*dT5)1gQQb{PGL?Q?z+z5rUcY(OlIhJBi;*b`w#9n87cbp0 zLCvX)-oN$>=*zc(=<{Yk9#n#Q(R_3++K4VgHz35>l`t`mNIPV~0fIvo6mweU1%gl~ z>`Eb-N=H*^ImHNsV8#>Zj?4$6X(dWf+vL$COViO*Ocuy)z)n^mt3^{`WEP@iSu#O3 zNRv(IR?(z`MPo=hY@W1plEgz`@XYd8)mxS~6jhA7_ASe}+#jbqJoRUtRqvDfLY$^y zxq8d1b>l2=T|2H~(+8sXSAYAF`u>{48Ht+y`XlZBzl!1qfwm)!b80Hit*DvPc%)4& z8&^kGS3>p6VSqKCRqt_34~P0BU%jI~q>vw}8~1A%0OKX^slQO~R)6u{C6~MhP0$Zb z?>+PlFUjII{+0WKwXymiRm?JAi?=BeI1D!)4%F3o7p*!^{cG_4SNJwC%&PcNeGJd* zEt^%=d&cD3+pVAJbe~z$L&2>X~X(iW%t&V)dlW9@!;hj~3thP3Zhn`78mMQ9bHJ%g|ba zZj9JSrZ^sB3S&n)$%jT63U;FQPX<05k0lcX7)B-DNxDml(=SMfv~@UQHqcBcw((>r zkq%KC0a6ji?V&tF1V)oFsnab_@%Z^G&RQJqo;*3M+&!f})--EfV}(+>x}>A0{Mf)0 zPi^hweqCh3Wf)(^z;U0FOlU*eWy}xRrZ6yO7IRjAosvt@dAk4Lr?6|I>STWVq~9Z4q>SzOs3GC$Uy5jnrJLSs6As?)1g&-A2WXO%41s2gJ1 zjrP8G@r8Xhr@#6_2JoAaRHNd=zYnKVk#I6K{i~2>#G{T8#6QN9%%PdaG0#Qo33DbC zBz_7E`8tsa@@5cVa$Yrtvzr4!3QbOujzr#BJsy)|5F)7hXq-qjMMz+V2-(JyB(pCh zi5!2Nx5w?o8q8vg7ZO~wL4v2>b<6$x8=D$8Z(a|^aJhN!=8|aTgjusDRI1l?ZaRP5 zBkipd7e4XBfxffgk+)g)Z5Gd;u%x9wR;0m#lea4a{Ga%Prh0Ma?B?93Q|cRfr#3b? z7A-x8IitDn>Pz6I=MB2@(rpjP8YSv4mF>RD>GkTXuKE?-cQvu4Gtcv~&U>d_ain_q ziORY7%mu-~yxdK5fAWiHNz=fbMp(#V{)wJcsC4rata{B(R=i;L?1siUqZ~Dg`=mb9 zS_m<`5M@GOiI3*$P8vp(f^OB#PFvYc8$dV*zcKcPV;g*~K37w52GpsN`WSQh*xQ6r z{Rm=z$s<%mb&M!-o)<95f>EwgUQ?1#Qdl#o{tJ>KROT!%dPD-vM7~-f;EH&RWxCf) zZHl)f|5FJbJ7@D@(XNc|C~2NxUOfnZKcIeoOQzi}b6nUSuRrrpwx=h1=&3{5o`lY* zl1hpSxy;{_Yo}#Q8Zo0OeV{MYv2MmVn_u5( zV|5tUY%p@H#@ba1EX&CF_fo*tV0N?^u7L8UwzNIfFlGGNy$#&-b}?Z9j)OJ7I=6g{ z$yRLlV_qBwBiS~wl4x9A=&h*qcq=R5lhX_CV{cTyJTRr3 zVRWnoZ~OfV;J+8VckKEg*LvY^XFq&iWcNS7_mADXKSwa4jv#^PM-z8rq90AE{t+U- zMqPBYKvcb`>NEddfFD7eN3`gTYU4kwexp{BnSm3psTW2V9OSbmi;er2v*b7`GHbXa z>YFkv1Z*&$4Go`tyI5KxF+-$VittE|{-y!BQSn!Pl^VN|Y)RoaK>|(-V}CdInfki5 zNYqLWwIsqYAwC;YU--lE#n8(vRD-8}{SEbqo&NeSo)k-?HfG3vT;$4!pScWg8~)Q* z>YW6w69^426b$G4wQOlL9+UB6ks^zqB5O}qT@rDq);e;Ki#Rx@s;BhuUw!=YX%pHm_eDz-Hw+Oc?(OHS-1PGGc~`cKNM#A~ z__b3Q77yuLh}cZq;^r#&3Y%<)I-GA@153wn^=ZjN4lO?T@z|BrpMEVr*fNskpW?FU zVuZK?0*%&^=~R-W>Znknow3P2>PdIn8c|CkMHG>Vx;X7u$7A_^96_DiC1NKOAa#+H zh?37GZCaeR2Hh{ex8f(26%ST8-NA|ma{#~?$<0@c019Pv9&x3iL{R(x+u4fp%9Wqzg^^B~L4J+I}FK{~f^5JRg?K%M$`P>z>uj3ravMQHF z6$M=jNU^o$Cr;8FHWN4qbEB*0#)?IU83( z4Bl~tx%RH24Dc>}@=BIJy*s2tPhnKQlRGraXd*fO@MlzVV%!v?cx z-q5i1!7W?n2<8p-TOQm}zrifb*}@zf+is$GM%s6@plZ~Dde9uS2(3j3(GW0=_R=Ip zIt4P(05nl$hEpB6IMI8L`9Y!?bcHyL`N3h6Nvi(jTq^$*Q&pL00dGT7>-0lJ<@I8+ z!-hL;HLi2-uF%i3H6UeGL}lcK5|<|N=h9kbOxht zo>r@K>-u$X>7Dw1olfh~&eIlKMe0a8ApY3uwOYN_{qxAGI$gict4l0D^Zz?qDhJ{W(+1sDGN!V9i|@%YtOUsWGu zv)|CcJu&fx6U^LW&~A9SXY;MMZti*6pgw+VE_33AT_x)4ozZ9~l$9XrRY$r$T=pcV zfH;>fqY;MN(INC0sU7lnIB!iIqu!*X-Wr`J*rl=abLpkJD za`aPy5wlFrW$@5&mTaWBaYk`7NQQL5-kjjhMq`ycLSBTB!zK{K5F3S15)^AI$Urnn z1v2Iz>5ix?_YK~mHXc#;Jq*h?SKl$X53W*{cSqD!AHvlNJJ7vcQCIC7yrX(EUE>Hm zLsq#u(!C<0uKWPP%A_2{#s2I`bVut8M!fJ$c<8a$^osC-;36(?e$4ml;q ze7J>6^MaKSO`}ShNs`Qe!NWl!Qk4W7P(Z8NE$NhlS+?!awrz*D!N0fm&)v3dZvWPI zGgD9eXnJG$yb1H-bGxgDt9Oo;$6+%&u%<1V@2DAOQ+0YK@$*wojrBw zh2xe@Ke5qO7G=!Lf_C(dw z<(@~>{25+vmi^A_mZ*O^ygF1|9bXOO0c$}0@tRn5ad^#P@GQA5lJH<1gCCi=c=5zs zx5<+rIL$>PS^hu)KTotI5LiN%fF)#+(u99+PlE*l0!hP4O!jK*zxwLjiCHlIO~$KE zQ6GKtO?AzA>=bnh93p=?jmmgV{N>Fz+53j|>XbL%WPbpG{PR0a{epXtHy{TpN3CcI zI)~I!m|SYwfXerPsi?J(helJa%jwz2)NW8ewuB@Dr?HlWjE|46oFTiI zdg0!9#4X-eEpnDn4Xk@%ipHDk=NcR8)E{U(r7*dnM9V1nCZ@=wKHKgDxk~i;pnFS9 z>y6ax;_TS{m^(xuhl8Yaa`my)>o(D@ z1N&rq%wBGRXq!iH;Ax9(mN|G<$WuPwqzhSdPd*p5>3U2W%-bB*C2-EcHeRyGe;_({ z#5;%NbFwFM?fF(>2vtxYoq#1kTX>{WAT7PIe}q`$AOXUF#U^}3&LNOwkxDZ9Im*=F zkc#k_zhRVB5(=L^j`Z9MZY8^__seYWDnMkT5tPj`h;En9$&cpdv%?u?C@*l#W=;$R z{0jT~6BMh;X0nJyWymPJ&Sfc+p`KuN!iBfiZc7KNfDpV%L7D*ms5lwb?Jh*L9 z1Genb?Sc)Eg$=uO`&7ODA$6Ntr*3;luea>i9mOnmWA>pn1PZ@%@`o3&)cM_+vLQL-XJMv9Xl zycOXqS*cbu2~9_5qZQ~PgjnkT<2dP4H;R}3zGI?SnOC5X5syBiTusXe_}X4jGcy;; zPuJmt>?DGZfEVaU&5sy@n3yy=_lL;qPvSVuzH`|` zPm+Q#X!#^~fzGJ;QDN>I3v*eLeJ^C<@d(`vhJb#GXfH**iy2L zSm9DQHjTOH|Hs^S$46D=eV=p7+$ouQXXYl8naT7?og`C}kTMAnN`M5A-a?0f5C~Nf zhK_=+AYwtviUm?mq<)wQy^i~ERcLD%(J+~&ILE|ARO{rt|Ign+oa&-1>2yn(rM z@45BdIraDZ{=VOwE=xA6@|t`qKCp4~+{fDI#IiM*<+$d%LM@*y**Sf^ky+waK*>(7qL zXE1J6rvIUKTltqA0h?HGUr!spTLCEF5UQpz3Qk5L&`CaM4Edd$YF_h!X?Z0$}N?}W@992a*`sN|l@sXgnf5cgp z)R?@566YzY_ZOFsVV|zKVgJGUk$28%_F>PaH9^nlS8@su+;aNWFIorZ<=<2_=94F% z8LF?_oM#ND69@0u*m3lQC+?fL+F$e}^NO+l$n)fH2 zQY=^_R)Ctzfq?Nm?Du*EHj;=~rO1^vNO<-pU6kdr*sKd1sx(RRcLpc0{$8VP#o(=v zVc!41ya$*&2ew>)55~L70@cB>jaF&s;tl(l9p%O4p~ko#cc$vC|2XPB#p~}*4U3+m zMOlfW!x)eM7M0qiPOQSgxVCvR89JeHrGqfc`t(|6gCTdt)H#DCpT+5NYi{-6RkPX# z#HI7iZ~=JyUbKS*{K-_S#tSf8Z#)6aY}f#n%0wU-0dz`4 zA%NN7(y%)-!akraH5;vXM=gfYnM$xT=BzSENjk-ByE*5=q;bU+u0cW06DuCc;3#Ln zrPv&h9MMvp3S*zcDFhrt?@?OCT$M3@oF`jwSY0Y((KXJ6cEQ1@cu}cTTErqo$yyVy z3yWD>j?=Dk=1xl#dJDE|RaTRsg0%_}RwuoyvRm`=b8{@YYP+>0HmJh(I;Z7A*c_DX zky5>q@j0BzfMdwbIzciTD_Bt-<@D0NilP`RIr97of1dUFon5=1zHMD`xOnN(;&Ac0 z+n(OtwUef;DhY?$+Ct%yRgi`^T~<&hxvb7=mg7}|f*b0xI>QC|d4>6pk_&IW_2!#c zai~J!o1JB~xop8A%<>#ItGQwgSI!!hNs}wCv$y4L9fnc2bl0Y z-MncUtHoGME{IZDer$x}ZJ>r;wCwPnxpVg%UbaXk!d|rauA8P!yXmgQi*|9kzEwun zi>Gx)jf_-1xB-nrGf*2^f^I-Jp}PT{0h}Aa8*BBO=?V`-4MwV75ixrCjE@)U1(Yi= zGr>5Pf^veiP*GoRrVPj65HLt#qYh^=y!%q0?x)J|Vj>dr#xfrqp(rW1UF-*5JzVK? zR2z*ocAw(gq-d@?KYCX4v}r?2s-5-qI9ZTzSaL0nY)?UDakVexSBiFPnN(OjD3Zih ze?fU&U8pFKpFec&oS}u>KkE;W*T_S}Oo+m53v@r)wx_La4`yy1G;zY9Ti$mdwAlUGBJF3LO7Qg&ipgtwtbSDr;W~DI&=zoG7y=7hyOmm*sM0` z43^wte1P>z{`g(%ca#N~*WjjYN<8+= z8FEBbF|lH3C3$j(VMJ+^Jh_?ib!AnI7*WCfy<)@&=nG7}?Hz+ONQW%Qj=U&XLfa=A zBT@pJb(|;QwRnSq+vt`Ok+9$5HNu791Ev#s>K;i%q)1GPBrNV&A`G??Cll{UG5^<~j;TJ|GqC>dvMTb29E;6Zk1?MmnHrOKl~*yw zk3PC%_ipm12Iil0)~@w<%EO*${)Ux4Z+W@*FWJc(ZgA)Li~KpU{Pin*Rn5C6U$@D& zC8ufq<~pHJpO17pIUs0ZjGY^r!Vtsnq*s2_ZS_t@pg_Su5 z6;}9lv%OV0+APd#{7y(Ta|)(`eD}^f)zzDC>c?PKZFGo%{0}c8j82?@`l;!ypBf|~ zFRDVL(IT`N9Y9CXar9P3$tq*Z@tYN1ArbEf%msaIJbp@wBd`iQ^}^xdwFgC}9xD~Y%!~<0;#ZaYaE;Jb%p03{Wv~Q~(hk=M=ptS_y!L>ZUSw1j_rr_W z2Es)g)ke6;r`n+!dT4{loFBp$2Hi$RBj)>rrI&T0e@Ap?2pl9MZ2b+nl8`V2fI%zGsg?#WPDcaqUX28n;(uPSGy= z;VIa_8So=mry;EjuM)B7wc-UD34eZBR}6NL%=lG}^eBu5qj6{wT8NgR?P#yu4|_eq z7=XjQu*megnQoVcjM5Q4;8LL5O~i4+8`HCqOsJy_xZ-ICECjvAh%pXCgwTUiqPk#) z?J;p_l1+Dj8woB4_=I2}82JHbrlQ6ox+RmtUWuPsqzFgO|FL0!&lRX@F!dibJXBWS zKbTkM7?o!l+&Z!>f`ek~dQ-?)TO1hTDs^QQ;v4l^SE*XPagVLSP`YOiv#2D0P%@_6 zw8!Tf9jPJ3p@vYXfqlFzJhgRkU7~GvKSSl9BD2JwV=kXftRCq1s?Ipa&N$nzK1XZS z+1%}}K(Mi@K3gXl@^VZ|3j77wyLhW*sdDabuJJiFD}?atIony6vw{@ha2|OK|JP^N zRYogH)7R(Rp{c0Hufd&5$sd-~B{wZiRVVW2=80mdjyZPO562?iMI?NufEq6WD*`r2 z&?AD)Hpqvg)P@5S1Z)K=5nxM;gSJ&I2l5k8|AApeaDoNdDk-cre;O7g$vvlT#~2w5 z{l>WFauFp~pL<-LtGq^u)z6FJQR8cZ-@K%(XsJ-Hc`1hPRp%<1N60;IMu)ZSxxMW% z*O-0=!;ra(q&io1{)m!Mx2kiMKXrKuC*OADyX|*k-Y%LUxXmn@)=$9;lngb&aeeY( zMFBJdEH}LmA5meLL+BWbfd;11+$G!rHemv!|G&)`Cue0y`k(Bzg->sua@WK%uCphj zw=>^AP_wuO_lNxb>x@30$sGOzb8h_dx)}>2Bt?>P#@D}q4b#az+~L;$G~>`tgHIww z^&ezzs{|l>{6^Z6Qu`8!IsUtC><$KkZiT>8r%Pw^4 zcRhUuca{li@-wx-E;i{}r#5tVHcX`sK^$w;kI2W#{1N&_9MhQ&GStFCWc5N8ut5`lC_*gH!_}!(CELk%*vy0kl9!rd?qjFmmz$b(cKA zkA#883%V;S^J5qhZtakc)s^p&KVic=p3!qhRTx$nHV)o#?Acoe>`*CID%9P5;URP8 z{18KePhJ}yQDnu|U%Z12s@#IXCD$4ZjYZ|p?z-dkvcg6|rDBWz9m=FH|E~@-UTGd+ zN>1bFd4P)m^%0eKrKQ~jP!S2NDg7{nud)>2Rm;T;$nBwc7-(C8@`8$LQ^>c$6!%43 zh<$g#)Vk|t)GV0ZdTdz!%CoYxs?ihSlDGof zPhLj=N=Z4JWuLMafp6AofcPD=9)rIfD~d256l2i@&N$Wca3Ze4L2OYBI5G8$d2019 z)i(9~^!@(WI~P$hIlA z(1+yjQ|^6t1s@K2{0&q3`52ac_)Z@@GLU|`_&l>f=o8Cn=?xfrEA|B(#=okt}t0lTxPvB2fLEcGfU_bW_YxobAf13hW;CqZ_o`q^K{6hw-=D0;&-z>^7>f5}iXS1;Xfj z3U@NelmcByai}}RB$;HovsX(6IK?!`fULk-A*)0gOumTd2Hg<1G0d4*#CY1s@AiE_ z4xBuRr+@GQ%dc8^UmAUYr=MiDq(57@>Li|y@5R$krqMp~yEf)t7M&yqE_=4To@axu z0%{mkvmgeL3k1kPS3#dwKtaRm^j5V^eU`L#GDBbmzrWgGwBRRoCOHph$Z(619@TS@ zd`!@k(Pt76Hwm@E2vTyg5=RX)Aw>`rnR^LEytWoMR_Bt6! z2n6W>lFw4Bol&135B$~b{pODt7Or%bYh3-tuNu{Qbk2wSj*YCyy+-fA8_C7nzTY-( z=g;SlyLIlks(yu4w$>X*b_D81jT=9-Lc>0`c*K}8oMm-#>uq*vXn7->RCpZ)xmxw4 zzwUa)AD`B;u6c`n&=A8MC%@?25lRy``|) zl_!<-o8M?KF1n9nr9w?^2|u&kf-OL>2AuRVP7C--5e7_PFe;nB!;;r3B_L3N_HC4r zmUUn&bP5m4>cXWHI_|u0Ui-3;(rYd7B`Ss$F1T}E zU-T9J>d^+Z)^BID8pcUy*>c4x-#$*E^^|JFu zP9%RP?~=by9C;Id@QQJP{QG5|5m@X|HkR+sWS$0dGUC>wW6Vwrcck~B!C&;=+!L4G z5t9sTwFjZP^RkDb?LGv7^N2=BW}{;2jdFVebpYa47@%$hBY_}~-GWu(C|N$l1VEXg z;{_KoAQxzwC4$g>f-?#k5X{x6q;14)aR)PNK!z3xGZ)Ak`QGdk^@BH^II*eY@k7s> zD)AERBCeV9Ej)i>Q+3Tzz1pg`cuhyAoWM$4P0o{B$ob~RdUC+zeqHK5e4L!e!ttfE zZ={e%oWf6z`ApW|b(^tf((L0n)#&QVJ3-E!*!h<+b-QtD)7;x%!^#ucq+5#WG!D#7 z+py^brq{*7@#&A&%^*d#`#!+}UW$dpvw>(J1#WXYX)n(7jWqTde7||92)OQg{Ik9u ze{2s)7OSADQvi*>q&*CR6+I9wN|t4ef>#p4xFoU1cgx9sRmWi7D|NR?UVbniaB=}> z;J@wWbjobEo0*guKLU>0G-_&VO6AN|9mBbJEY3ZqnlE8ZAKxsKg;SElA(50b6k-$WB3Lg5XD|-F+Yyg)w6oNs+LXe>Ut(H~7L~ zAM=tAE2Zv2SZ8;PCm%n0jQr{`iTyPsbT1o^gO6_d?&v(+5%z5~Zv2G&;=zBA1v6iS zy_<|1Kf&dPzsI-FJmCv7zio^}8Y5%JUK95E!aq6u7&&#UXMOHtf5n@;;W1+#B)|A{ zBUYad`{))f|8yhy$LTP{J7_KU*`L$z{J!7ry_2z+E67_N{;aH`0prGxau|ecgPyYwsBtAH_*w2omD0_O zjE{QA9aRpm$Z|a9D2gu~Gu3`wjicbus1X}qRWOQBLI2uj|DaI^YMKMOsYkl+T-<*9 z$J`e3oCW`^e?@nDi?T3>5d?Pg3^GB@<7uCGyTA86u*0Uy9^q=4k&Kgl1$8^`JMs`_ zipqwW%3~Vd>51A!j$=g8XSZ3iL)!-CbvU!K81+d;(8Y$_Gt%QuX3aBZc|Mzvn7zg} z)LDC-9-o}wGCTc(QDIoOXy@#~GlncAjr!WDQ<8f~_e+ZkE3p>F_mu09j*Dz4PWjsr zj%45{v@`Q&dOzss{6D%U?gyh26AZXrK<-XQ51_kY<=ieHVXwua(QRanztBCj;ojrV z@7R4<`wm|dsjO4m;=yUmuTSa@_oTne)rKKG7A#NTYx7DJdOI^Vy)XTfF?^0uQQ~x# zC`^)~7;nWQGh-Z|ZRA7F&U1({?0@?AZ@&76qX(0XtCyDz?(f@vWx}v$e(`3FGRwr& z)p2^Qvij#Ay#MnWrB27YUGcH~edhwe`Fi>lzLifQ2kIvy5dlFFqvCkI(0J+! zr3%G5VEm)tX_)$2D350*euF(jwI~m^lW*yYNr&Ix`qgHf+Wgg4QU(xA(62PKAEYbn zt;7In_}lh_U6jb1PwGsYzrsVhZ{7OUW|NMUC-vxHJKGK@#LRCMaRtZqC$fyCrV5XHU=0wI(dg@P-&U7i+L4EO~V=#~RjdYwdc!b=$U9uB>$%^UPAX z3M|NlSba2FAG=_+ehq0~_kORqJ62yGBXca4rwZ$teV5MOM#m|cF&u+b6yfL2#cudV zX_k9_7#KUVw~>!;JBt(K1Q|?D-~?XBv>jQ|om_F`$O^V|#S#1}6YRc&L){2hF%Miy zKLTY!0!$O-N*s>Hpjl`EYDde_^=Jdyiguvg=q_{s9YPPHBj{1|1bP9zgkC|fp_9~} zFR;*%$xE*%=vKgoHu=Cs7t1W;2{8&y9q7eD+vbkLhc;`12p|nuVmJ0;cRUPzhaiI1 zLBbeR2-q$8-3kw|bPC=CizS>8-8jxiu-hnES$6{KaU>>Kjb=DcGA4`?F2#Z|5mflS zykt=^{-BW;B3KejnLrI@13?uNV@0osg*r?X>@--4E0N9o9-Cu+g>`4=7)ZM@Y9vdH zHp#=iV$NYtnsai^KgXUAIFDpA;T?v!0pDVRy}yuL!V6+fcMxwTM}9(%;CZIP?n#(= zpWzkEi5Ij6<}g|F5>rTiZzyIS!(7tnw04t^>hMZKJsE?CE4$lyJeF+dbSAtjN#5D_ z%Avy?RzB>!3m1I;IrrYn3U;L-ecOlRzi%X0zFyt<1vBT%K8_!n621vn7wi z<1vSQdb~ib%ywHW7K=MukwxytZmU*DPH=hM@8KC_zk#)LDm72;WLW%jJn2;>gFD}R z)6jK|f*;U4AFIiGNphq8D4S8!HuKMF= zN^)-KTTIrOFN(0#eV%m9Z(Ha=M3Uj2K9LN9ooP6DVBl#W9{q1iX z@q9Ih^*BF$&nQ;5mr#Cw;H5*f#p<;}`hz`Mp8%G7b|dpOZhdxR_un@@%f0`2GDPg5 zWPJ%ce&fq{&V`0eFTJ$M_Y{5zc*co2)L(9QHYyN*15#5(@B)M|hgcZE_#$E6D#1q3 zgs=(uP=Ey5@zq+xc1FgzTCb0%U9k^t>O2c!OYpa?>>te^4Ikz_pN#O^)q|+ zoO%7>HS1!TpcC&8_NER!-Wzdr~ELZe3ej*8`RH zYfTp17Xf9fS z7NZWd5?znhq0Q(Kr8&tElPKYw-RySsiVHg{l42R1LI z|1;}d&-pvr z@eI+kPS&S#>TK35Mqj*$3yT5w|`Iygt>n-x@j*i`Z{{O^N>ehKe9{6b8 zA&)2IE}a_kgy1u!)Dz-9@Llmo9%=5lJgKAEciA;}cXW84-5@_LzQI?Z;<0EckJJ^a zt;KnvQUPnsmTZMps=|6!!zviHR091z=q+|A5q~q~V<^00E_=1$Ia!I84mhSAIJ1BM z8J6rnbKt-ke5S7C+(#vKbtU+*;w1B3vKT*BQir#}zWs1u`;z@!#f1~ab#=x309gL? zr^R)^rw$IOd?n&eBSg84czG)62?@P^7unRDQA>p}1@Pkc(izEv4VhVr+MFreTpn7) z`8}B1{mYN{kGcE0rSs-4U3KT^yMOlnfmt7o;azs6&Qd*_e7|n<7h7@e$yFcj-?@3q z{S)VGUO&w_*J#c&{?~!31vO!%-jdVr@u@Epu97|e?(4hueUO;EYV)R5lM~P0weR_+ z8qOhFblI`-3zz+R%X`=`Zu^6Ww~xDi_Oz7WX*P{8A9&wi?6>H}-2OwlUh+Hi8D3=2 zEzd<>RD{OSw_XHVDxd^JpQE;4{)6M<+zYs$0wg#eT_nR_1cEulOV z1b$1foalR??o^>n!q#vC_i*h0PxH*9KvcXf5DnZWMgt;7Kwpj0xBahkE$+g8$S?WL zE-?@lFCr1H=jmfy`496hT)cP@DKVcy3{}g_LIz|;0fa;q>kf);73221Svs)y%Pw=J87yi zbtess4yR0RF6CxXdMDKlznQz}3Qo--$W&_VMrJdIjHM<9L7b&{5ea`% zAT$Ksfes?XgLz&EQo87Wy-3Kxt2Ai!Y70MQoX#9%WC0IgjDQTN1?W0KM}ak7I`7}z z5?lOy3_2%46r*Bl;^@()xM}ogF)IG(0uK6D`$u0W$y^GKO8(Mlb{?bB+8CvdInBmj z!ky?P{_X8>5MC3W!Q14+Ds_#G zyg`0r5=A)RUtEN<$sCzI^^cC1f#0(~T7i&TEX7#VW1wmQYn421R0y)nqAC)uWdWT9 zTGmR4@`_U!1a#iDY$6zehE{HDfj`9xOatIafQH&CLh3+Occ~nq zk+F%twlc5&(m2rPDt0ccUg#`#`34$)`Kpln>rr(R3Jth3m4q;+WQqxMj8bG6QOR&7 z6)OmwTWM38g)ENC@p^J{Jl-6R%M#2=o6^k*0;}piwECu-R@W@OanW?!C&^@%IlrQ^ zu=dtMe{HS5@YdSG%8LAv&0o0J9sCLHH!rAEJVL|JWYi83DLMvdVFJ`)LQSFGJ_c|w zPRKFaPDXM^z#^KUzIN~`gIUEvO{Nm~oNyS(`>C`#HM{5I_z!ID%5>I%4KK|7>7NW) z&CP>a7x{B9qJh2U@L|KUuYa0KX{APNnOW>$P{)|hoB^H-WT)Nc#-(EJY-rV;PhsVW%Wd!Y?{i|2Q6s%YC~?Y$3mW4 zvM3M@c{RtTcbcN6^sT%BFR^<0#+MWxtHq<(RbgU+ zbIDH@E4^ZgX8mglZ?T78MkdT9XKL3kZt?kA7O$^8Ll~q`v0VDF$;3=#Ot}`Elb&t1 z+06KN?Oy!I&b^-+%?w{aMlnatwpP^~1&xW~e$WXYzs1$bej2ikvF#qVUB#T?C^qfg^7SsgxQl#a0&kIgR$qT8ut;9g0)fH<1}7ck z2{F_WEP>YxjEE8W*^q(nv<2u5$cD9(_I~)yhkGYY+WX=1ckaP!Nf+2O({sUHB)g~h zRKP}L*ph;*zvrFh^3ib8TD+EC=0fUHUNSaW`u-5Ak>lG;7BdonE&0b@VJv_slr9*6 z_Cs<)t3g{5LDBQjZ0*itDqE}|65njpy4Ps?tK>*NxFtcV$yZB_WiY>?jjohxd7Nb{x^Ap z-!2gpdg*~PHKeBz%X9{bURL3_>++Yt|NED4nw(x6ovpH|%hXske=+^x0yf|UFzGh8 zjm_+sSh*kX+W)_NOHd5n+8!%4uDYXr3$^a|{5T7yW_HZ1SiANIZxJCL+6+Oh zFrf-mi<;0VG!6PuMsc;K0|+f-tN-PV2$T>hE?E(d8-fZ08>R!20QEd$BiQ7OIE)Mk zBEeu-q99r8|F)-3J40k(;-%)sh=cE)eE8v$@8MwgZK+hMvt#bvchBvhj%MckjVo8) z$Rv+LRXQ+^zAUL0`^{D<5R0M&_`?tmBZ%aq71W6pmzA_(b=Exc-LtZUKZuK3LaT7LRg%YL3`cF{zFxO+e5?)|ts_1XO_*1Z$^bn9_)p6xu2 zh0pG1$#?I>KIK~b*2rmpPCY}qZH|v$R?I#0*~+co+^(1FV6yK~L#L@ah)G8dngcl( z9;A!I-IBxkOI+t)wTqnZ7O-$!P9d-OSM5UF#lK|y8$(eGnvCZCi+31Q{Og9dr(psL zWw~0)WshPV5&;90zTPrt5UdK2gX*ai@CsezpHF}O{POKTXqfk&zd_2u+UL(azw78* znOccb5YCT< zKlK*{Ct}xRljEO0NWR%6>UVv;WiK`zHON2P{gdT$ z-V(*P~=X{mvElM2JgqDI|aolmeJwK-ycJ0quq4OVabUUK;&<^Wk3HXJo;| zGNVHIi{cP7zFS}KXw&O9MiPL1jU*_f(1E>{h%w_{kMIwB!(lI3{d4E*5xEy&Q6Tiz?aE_`uQu1*Mkqm~|rcIB$F?T;U90`nC@yOf(TO4Yi#%V1K z`*kXP(L}*Duccj*7`bcw;m3?^O%eTynZYBp?pF6UC zc(NjRThYv-QA5JKdSBk;-{FbQ`gx;wjjV0BP+K=TJa*pl`K6D(Lef7k9#vMPvQK37 zqZVA-W0$^8f%q+`2-O0s2$I=DdKeCZfrP9XW~Hb^m|{T04*ZLR*#hK{+HDD-%d_<|4BWpI!IP{bz^IP6n`*FR_`$$N zqemjO5eHEb%vcicnA_-%xqI+txX-$&2YW_oq<~7wZ3L(i} z^E?7LHGEQ(IOa~egL9=aYYaWCBJBc@Geg;B}S==<{^XM=pl_B9L2Yz_AeBE?sbl9K6H?5A% zUOsDD|9oRjO-+rlbr=Z3fNvxv{FCM{f`EOnCx2k!(gXQwDHX{p1z;P9e87@Q=g9(k zFyQ0?0+xsSX4LAUY{PW$bt#`upI522skA!P`SU8BR<%t9D_5kXEl>OXqb<^98NM42 zz1u9>9d?_)H^1r6fBYhsF8j1U9`lc8FJ=C^>x_!rkUQ>&yl1edGOGlF-_(+U>dP@O zmY!nh?nTsKr0BE-E}{$QBBDkhCb{R-o;|1dv0ofWCv5=+n97nErn;1ij96jsp5%cq z0yY9B%FNsf+A%9dyRZ?9TX0+4Dk$qgcPs)naupW63e?$2{+z%=$ZWEg>?O1DkOcX2 zXD3FuKfVt4CureE3Ph5fsm|_B7QS$28nLJ=iF?`?8OI5IjThQy4hG4BWTihPjil3!A%B8=m9e*5~Kz-{zm& zz@|38aG{gxE8+KniV6NM>F3Dzrgi(r?%yMp1o!XJ9sTiV`BK&uO{UMVM3x;*LKMnX zA4`^F#jnC+rTcEcALv+i35eee-f7?~jTpVy3z}N69tPHR@L0LUi0HOJg$0y_fYNKX zD99UsBX29WroSF&DK54QWDb6+_?+24NGvWgzx%-l?EbEu+~V#TAAArru}e(FA9TON z#y%)Eb^pW^yllLwL3)Tr=*w^JHeShTegR#ItQEu62*hNnHhyqvwAP%_{4M4+D zH&$R1&c%Kl#?^Qb9*L*og?J@?0>6Sk!oSC9CJP}R_;$dol89S*ux5iAaxkDs&~-|3 zqL7aPfI-}fBOWTk4cI5SSB*yli4YcQ87Ib8!D_L}SLFOUOv!l?0hqI9mQi{BD#d`f zMRgwJP@_>?aeLi?Pq5GZB6dt z8&-^DzEg?-(y@%XK&{tH190sUyUU_943(-_mf-|Gx4bNze_d(KoSiqC3#0DZEM_#0&8QyZ z!@R&T3}&mOAtu4%vM;V4l&v#r3RRdh6l-~Vz{51_RLZRJF|~lrCY#qT>D;zljaq5f zO5}UhC?}U|H@il7bF}@PTArtTXe%_vktmeQaUxwc9!%W1GP42Pf0X5yvA zSxTd-%7I6+#sR^C)#G{ZhInMGR^op4`i%RhDu7&9}Q939r8RMsco ze;;G+AeXHZF{{@X>Qs4*A?w{I-(Xt#@v9001C6YDY$U#6yTLE0aztwb&qXYK*2m}8 ztF&Hs=vtm14uPy0cJw%az?S)S?d6KbWNh8CQ7Utv> zlriky(N?AvI;Mae$q$Z^f`U+)mP6@{Ctv@V@4 zIoqID-TsaOCCpxa*o~NtYT&U0+X4M<(*DU6ABA&2-4F+x&O@h+Av6^8v z-oI@5{r4|lMgk0jb5{sDtYHWDf1VpZUc{{Vno+!-d9&Zj9Hqi!*zI68NZOmN zm)4@fm=W;A!az`=)Ryx~1rHjNSYr(u%<&XD_VZH!-qo+MJOs)sZ{{ z%NU%|$k2Y*Bw#jliECPpLILi6vIEqK%D6FNg z{UOWpQiH)|FyQOkn!FA=eRp_A(zwB1D*a#5=B&=JW^yfqR`XB%5O1D&tbH1uQjId1Gu-@7?66Me=9a7B^+%#wqgJu9GLb zZ(%4aA*IRfi5a8uQ7n?E2MOj`5u^8tR}rI*N$LW=lx(c;mSfxxl2okeARNZhgAYRBkvvY%JX3D( zGs#xED<8petN z7dT%i$jAsa)opRd+`NT~A;*j{uf-2D8^E|4BcN|<0p?x!2j5V?-4-QErAVp^krY@+ zc!Yr~7tAFJluC8U-vr@QcZ#IgR2ng z)UXr-wG2*>`GGGY70iQSb}HL{A{qUNalqwxDOUiXx|BB~$UoB@;=Z}`S|WZriIcMm zD!%TR7s^=-PKFl*GdmT{E94|aV3EQp7R*9`X1a({X_UHj$9tO)@L zJ*TjgMp!-4gArvzj8dPb)M9jd6p|Z+ zRs{}qw*spRpUkfSmGl(8K_7lDJPNx=tDIVq-`!dXv8gVE zUHKL4!ETh_YJU!7jp5NMpqzrfu*^HCLD?vX>d`f57LBazB^!*Jd)BQHD-T4^FsrnH zB%{k81HSDj5NO9htT6y_zf6LLr^SGqGZ6Fyylx23x-y(eIFKhP)py;cR!Ul@#Aa>Z z&T6pKHUFz&{THr|Z7V3mgPFHy&R%%kbqikSyYmqZ2SjOS-4g-Cmro?#UE zEv?I1Tk;j$E%AXotLz_2G_aU3L)iFb+(ML_hVnB4pMed9P%V@I9X4Bi(Lm4`2T>l% zf)O?OTpXss+B6E)#6{c?ecB5Ql3@qz#I{YFm>HYe+VG@(>Z zJb-ok_K{)Rzki_hUh?bbA11#!GW(%FvWm;HL(81ZGXi6^ehBeb3>dEbxd2svX>>(7 z`Ff!Nij=7B>I5Swm(+@>sSRCpG{7Yrrjk_ezJqk20Ew+|SmqRN_@#rV;@X4MmI@b3 zO{K?9mCGnnLfZ{E)flQlW6-r=hXD&5@VFa$ZMzwSjN2H(5DqN6nkmb7&mmlo?M(Kj zP|#pJEIBzKprLwxpd<$gicXSZ(RpY=5q?@%m(S2q*abRFVp{X-bi_ij1%I&2STn9$*@G%lSrk24K3ar0&^ZR|o#HEJ4E& z!UjgLntG5>(5A?ti3U?5z+56q%9zV>EgN&2os8rJZ8RNgaYsV{DvZYY)Q1NTeki{a zIvi~6-R9+($(x4X+R@mJ8ar+sE=rOJTU^f;pCVmkaa$W%OuA^+=mPV2XImTIiTO)u z>1xNiC%)UX>ANS^IRtmUTey5PQV!@4~^nX*3B0G0RphRW*V7UzGQ6;F!@jdRMOe>P8RVG5ppj)RDoJvW&VlQAG zOggz5%wTPvs`8fTgyN#2;tA1~@+yyw<+`tyI^)t=Nt2F7AE$JtWMbaf@yVu=dZ*p) ztS@OwjvqTOakVtS!StNe$4-qbm72eO28#Mjj-Ibh9wAxlHx3iHMx>yp$59};&?D%V^X$&dZC)8 zhJ!j)sKHeq=9SmfS2pyU=gD==+M&Hx(cY3yU9*t9JM89}8eXw|S~N76OEtw(Q_A`` zgve;;Bk+Bu)Jr}J)&V*=r@)7w@)i68l3h3C*DINZQ0ltKa2}_^o_M+NlUe_WRFYxY zr7i8tufh34=A4;%GoH4=G7##TjFD?qAXJWkYztlsOg=pdOAe+Px4_GRHn8(a;O8}1GyV@&|FO)`&r;=(Y#K~8r)wXGvh zlxE&M{|@Ca-3=qtE!EfhNGh_YZAAFynUa{try4@(cE$jqpXqNeqW2XLJmuewgcJT+ z%=)3^0Od4q$?%FK!1c(|y>cACKwUC4f{5}gLWDNYl^;7)C)Ez&NmtvRJ#9;hhfdnl z7Aj$u;hk-J7LFy4PX5W>Lrz~q$Y#c)%Ik0v*2rgeQ<1??7dD%4tJC-U^one2tf|D$ z=+bmX%1CEJix-X>f=3s{n_}eMZ9aJSmC=Er0C_ugb9sz+E*}_B?>V){Xy4e&wp$7Hc>Xz_D6lzd!(kg8hzcrjx9n>XQ<2hwhEWbhbX0oZR zsqKxrqB-429HSXn%-j=eTI((+ABAcgL+`)eSgafwD;#X3n(?&k(fOc{a^HomPz^I< z!W!)FX=dE;Bft+5jYqIC8pN_e3;1J!xDZ~gg)(}$DPkfsD}ZVZd0DR9+`5`Y zKBjs_dkaamw39E>pS83xCjHf4Q#i=uN%`e(spcfBpZ8jR{l9-Hj$v;|n@ z;1VV^DZheGs>69?V8hgajVU*1aZR=Z0OPiR0#%fE|Lwq=WM4~rd&{w(w70lcK9t%z zvw5zorTu&-p1E%wtBnS1E^o-37jOk^#k%6EihRAk)8U`m;IajT{n}9O>$X53Qzt2o zupTX=ZI;C>iC!S9k@-$-*nu-etG8~}VyK@oF$wGKv&x1rcGDmw8qe?KB#4d%HC$-M zasR&*ZXs?~WTcdFriUbCEv!~po9@jB%Cs2C=``sM{4bh=;19;Nvh1WjC~XLHEx5gP#_59Uiu@Yr3z8EP%}udZ zrYg~#+PmNrW}s!9uyyL`W!I8hlOyG(aQ+=$#@n{%LMF}(pd%#J$M5Z@Dzekj2C#rh zeX|%d(oz%&Tl1h?fguw%1dl>b$p&cwlsq~%!%!)AAJG6dOQHqv?}?0VPNrA`DjvFB zc!QomP^LSN)5(<{gU^~*R+ru^jj?PWpPtpW=P$-RZ7mz^#yzL@RLlQpc zp}lqGc$C=|YS?Np6q)SgGg$XIajVH3uETS!+36Jn7l+O=64*%7DMsfnX}a)-co7~w zWYi?`b|5q`S_wU(ZyR|xMs38@<|sVPA(TVMkkr`Ni>&Ky4Z~Jmw1OqV69{U6zsnQU zU@EQ?48%m47!;_8ph19$C3b?SCBHUlw`xW5Us}f@rH3FNmZZWGqQL9-k_o>Q!v)06(S*|s8pQ0xho3zVyCQ;p8r`4#9SNdUKOJhjnKzJJgGddR-r;vCC3>63Aiy5j!T)m1ldb! zuhbeK3&IFi<_bp%l{9ww0+iO&#aTI1wfmau?`;?yeNU-Uig%ioukJPJWQ2PlRXb+J zm?4T1a*BNW`ts$kV*@V62D;y)YUDx|{60d*)2O z&8KGL%U>toUU5CrM0S&>zP;s^Z}G4mS4!V}m!L_q+7u2a;-wJ8r^h;8X4|4w$eIA- zRuJS~V7vg@!2iKvKX^4)_>h<>cg@pjN)#r8hU4_+T&G_gHluZ@f1tsj(HoR8t)4X$ z$3~Uxe(hB@>#lh^b&1mWZw|ff^;d&eWPbVb*VFg)`ymoB4%5Mn$XY%41p_6w}ObJqP zk`Pqkgo+I&Bo!90fSEJU(4||MgNIuO6Bj=73i+Hl$Q(?!9&R0s&k)xu*xgD}%o#AQ z!VY>EB0W6LR3zDG1QX;706TyTE2Zbw(F7qDNle6PH zTgh20<&RrOs@P)u2B{){#nSlBRxFXT`QzAOSIOivSdXRgFSlX|PE3(1(tzK93Rh(@DHC`DOL?Gp^#Jw6rgxnv2Z&(KM4d@yH73e_~6c|X#tYSU*WbK7g-m%jGLfDaghhdgCnIV&zapp}}M4SRr1Qn%fmAcifsEA^Bm7w13`;GN-8 zp1!!fqP&7FXDJrrQ%|m** zlL|@(4;t1lr^uRB$Xf>%+Ug1l3bU+5`q={7T2u#VW~)(kJA-NvB`Ym0AI>0Ld6b8% zgmMOe&3+{=p0ZyFj{4ygf4kC*@?tT=R{SqR$oDPXxOC}8s51>3IlxrDc70dBegj4h zGTAD}&E8gbbFIy0w2ijC7@cMtZ8O?zFV^2QXI$lkeaSQX_CXq5)AvYIE{T+ucAw43 z7YYpdm4mXf3WWTeVI!+#YyHhNI)T_!jpV+1t6Vh_vLJ0AQiGG1o@1)blRPIRNEWF~ z%_p)`7YCJ7ww(;G!O(udOGb8%C;RXguNbpv^QXy|o_s3#(uvJWTIfr|2f}S-<70FILJwRNS* zwK%SWYXs)YzM}j= z3Zus5mIRAKSLU}mq2;}wWH(1k-m`ov!EdY+Mi#=`09%{8zbR>_zpm}>xgG#s;&Kky zWAlV^gPrytF>vICTfC#;XG1FB6L~zf!*E(%-S$=M;oBQ(sWeCgsHM&JWLrshGL!qh zyw(bKo>uWUoo|_<{jO#Aew#=>iIVkXd!H5$zdo(J1kHR|j)Vte=jP;DL1JSdxGuP~ z0uQ`l=VezzMFXlT9S1oYiYU8MZ8*E(4$od4&b|vocCT6y-p8ApW4jWHAcL*)=)3Bp zceMxpkl~&!DJU#2wU?*EGGlzxRwtKyP+GO|#$|MipX*=1TSiVkwjl$of(RKCC%^s# zdbH(BRi zcQ|<@`F!%o;p?tD43*FZm4`pROb0_Z6qX}9C9~;xL+9G{i^cA}Qs|lui$}fr7|lwz zm`Wq}6pu5R`PTFREi2+JS5$IS{<1NhOT%I(jyw1S*fP?@?6kDVj-qiUvoO}u*=V%1 zO!;Vi8pSGDCVs{WzpgJs^hcNJvaroa{!;?BM$|@1@$?(O*|oBAUIND;BiQ%`u6z)c zGss=M(1eu=CdUUyWVPMdZZ=0PL%viU8>E6Mb#o2r z<^myaQDgentlYX8gX@+}DjVHo1kP$3TsZ2{YbWoy|Mrf4Lk;7G&G+_8zx4(%LOD<8 zK5!)Yc@KeM-)(?7Fdl|3O@3zOGG|8Vus@74n0X$AnFFP~8q*8ohE8kjCmHK1C_iEl zm9i`b&NjK6&w5yUWXGPk0O#g{LJulCNIZLyqq9u(3qGhY06HJga#iAv`;g znX;>8aivo>Hg)VS0(%k7%Ai(Cf4Sq@sY8ZLy;k!MJeNHDE3fxgFyy)0F6>!1a^$)_ z7nZC$2ohw0ba36egURocr<30wOn$WE0*r+jF!sU@@2(TcWb*4|^29Ejq9q*3NuCx@ zu|72edl#V^Dp1hPkX^z?M_{0%np&w;M6)EE#KBL~5|NaYR#<_rsD@^~K^A#YY8LYb zHL&dt^zCh5UbS^iVb=|}_Jdch>1bccOQnU<&^hhbtsnoRKmT-m_J!=6n#JShhcjva z3CYFDZ)Z;(cry9j{OMIAx*mOcPwT4W-`{THM|n5jx97Q~;CM-Ds-7`u{J?u7$wTg3 zsj!Jtf@`h?t8eq1BEzuOVP$vyKAF6J)RO5#7EC{p{4l*TSTl0eYbTQ5{ORt}{IWOS zTexE1ZP!efMf3AqR?+XZ@uGy3V0YEyp8m_uTIQxEuX?{D^ht)(-t`A+4A(#2lsAObZ`Q$*~2}4)qs6`gQJMcD=XjfYFp!=YActYmCe(- zq9$kZ>zdY9{v_1bw6@kfeJCS2l;#YX)^N?#;vu6;2j-fxa^{X2Hm#{{U?v=D6%s9T z8@sOWxW~CL+jx5MQ^lZn319^M=aNp6WK*>T4lXK&`T6I?iaL4+`*SIkp})wC5`t;KCM!<6}D z8T8Fw5PFl}uUT-*{ML=m$-~5owxu^r855t{RFGLRdYU?JLf2KzrMc1v?rB$r{quy3 z>dLCL-}&gGkeTdn7ylh%dj@dSHex+D5 zd)wkUH!httxWAEJH>Oyowz63b{YG^KXVuy#ExoF=``&rOt84}CVT}*aoZ-&i{Vg~a zI*`*;d|QFkAhPn=6|q|dJXKA=FR)?ZxDu^gML<+`h#BB8C)>;s?6!fkf6 zg|%LNC^7I7`QZLOlo77z(w6|HcI@N&vwu0)@?Y*}`dU3 zWiK|YTpuw&;<8dp)K7)`Qw?!e_q#mV|1Wjc>OcMRg2K;%-ZL|BHCuyb6J-|<6vI8s z7k7>0nPa%;I?tB#e<3(IMKW?srIFZ`aZ8y87=;f3qr z32S*_QuEGh@rlB6ZH$e_<#}l&N8792&^tVCOYQV8W77s~7!^BO2PI>h*&fHyx57@S zN*+osNFJgD$919%yfMN5Y&*f}+;f7Ze6m~Z8ygd=4=MEo=B zqsrKt6n56Y#np$sjU!%}(K~9NTH#%yZ})f9;R;Ui9h2#%{*~w0-b&h{?Z70J{V(hV zZ968%&ICKRzq0>LEGH#E`1ehPrknbg7Xm57Q?JSkTl$|r%GSIWa{INzu=?M`^6cNw zzM0M$h-hHfiVyTCi&1cUF=A04%gTR88 z9p_Ca__LPtrVseD=eqf`ADlP!U1OI?1`;{d-$?j@&6YHSLz`f~G$u7MT#D-oGEu3P z?961bWUyps!f}Z|c}ej6PJ>8ER<^|;CP`MdNU|;GT5=3MgwM7J`*RF{zz<`%9%9Nq z*J8=$fS9s{{g!O}>4$R{10-w~ahG=JcZ}#R zR3{%we(-qK6OASgtmbr^P+~1Btf?7Sv8a37Zm4)1ucS$hb@cLG%}y`XN7_=Sb*6lr zN65{w4ZyR@99IGkVhnO*lmi>AWfj6PTe;j(j@Kv%4eTB!ya=TTE?cwDlm6sA?`&H? zzh8d!o!1O)8bA7N@VxU5%)|<}O?fSOu6B%&p3idvm}nZ6YH|nX7n$#Q_TuyjeKu9y zUI9R2>!}+eZ%wu@Up({5V7X}6dJ3{mCAaQQe(<>A$#GUgZYJ;>dSc~5 z5bs$3|7d4yZpy$34! zdl9BrB|pGeHikBdyUX zA>3d#ppGxDz23$8KpQ+-b_JeYu4n<5-E=@;z);FWP`ggZOVXxj*fx>Q_`Grv7Ef4xBzw! z96Pc0`i;w{=9ny#VE^r+KmlGX|4cM+Y5i!ILlS86%e>inY1TGmp5I?GJ6h1xR1lqA zvV8f2#lv$Orj%J@*G^0rlIyK$AT5|@1>kv;02>l%+>Czxt}tKt-8>_3T$)G?icQK% z-fT5e<2>x62oGX}j#8ZIqrN3(38g{aIX3-x%J2Cy`MJ?3;_5MjHYcl%nTn)`eGB${ z+0$b*GD>~^=n5`@=Svbo=Mn<@wFjwR?!j&QBCzI=`8f596G_M(+xL$6c-s}y!f*P- zrF7s73opfsLc~642;(DQoDTOXf3=Vxp;R8k#WeIWznCBej2^}(h@Iur(|_nA9$GyF&*R3*Pfm)g+xzJijNe&M93oc z=yhP}nk-u|55D7lX);Xb>e9)`l{$SE&n0>;uykEcsr*P6pOlProR(A^(&|l1X!^l4F`?Ur z#?vsK5DT9m)9|4QGK?lJhErvrj@bK;b<_Dz)iuQ%<4@<2#r2UxiVos1yacgG2{KH> z?fG6v^mHRW)=l@9p`2)fxI{t(e56Fr1(v4O*^+ucg+$MJF+uWwSZ1pJ5+P}r#@=;Z zCfGKm_>%~6q~dwfbDk$XI3C=aemS_0?#j6Jgz#L?1>^_I5eRAQ#YvDtd?cbhA|cwN z%TUkPkJX`%4X126MJE;J32DVRj`WG#S4 z!vZ1fw^v_2F+LSe;b6EI*7a*3Jv|0OvN0_sUo1-?J!dgaYnQb)lC_nIp6?B$=PNC( z=d6MB`~&l(-i;KW8lEPjRGEEwLi|)-!*^sVmW|=d$q8wp{t-XLV~XFtco=uN2kGLI z;v-eA^sE-Ir?LJG=?R)HiTIpWUJ73#J>QFj={g5#Nrc$+^08m&lTU+@XNiz9J#TNi z9zQF^E8_kyf42YVzlh8r+sPpq3lZ2&2_3}^;@0yM`Gfp9VU+NQa6z0Sz9RXg3x+v{ z?S|vViN>AAq-mDv7So63D)WxC*0fb=2P_WD63au@R_o4mTl&=WM=}; zvMRF@+4dZovn=QN+??EyE#J1qb|J4OZ*AWGywmxG`R@D=3l!OK8Zw#m&uztWR11=QT7l(>>7N05^ zRdQp=%OxL`I!f1j!pcs`!4&bI$zy0 zbw}#w)!$P8uI!L^$X`2VI9_X**KnqBV^eWcsOk9;;)pq;-J_pw&S)Odys`Q0m1|ov zTAEu{jhQ!Q@7VrhH;sL0?8$Mn#wA;~j~~%yYg^TJa>Bd`FHc-F@${t0ll+r5O?qh3 z%ahJbuAJO9**kgf6n@IQDc?+uOnrBnZ`%FSGp64*{q$9ltM<>xn&F#qYUZMucg#FK zD}PqktZ(MrIQNZtv*tZNKW%>F{EhSfxS;<6|AJ>0l7&MS&RMu_;m(C$FKS-2cF`+~ z&Muy{c=wW`C8L%kmL!+9EPV|Bm*p?pwCodS+w#igkGLkgwz$4=&v8HCe%n**x!JqS z`z!BvN|kbllJr&ko@+O>uW5hUZ}V^T9}3XG*ueV0D=YXF^(z*wIMk8W5$brl<4n*U zyfb*Zv$)gWxuf$y$PiiF47ZL5Flfg7uCeB`Fen{K;#&dpnHKD5ogEx7H>Et_w(-5S01`CCtIZ`^+OPrkVA zvD=s2vHYh??)>_$>boAg>+KzBJ2vk){j+61d+qKKcOSWD)IGcIxo~gSz4zaD{Qj{& z&-wXn59BE9>4?I%z$i_!r{>8kV^Bxr+edN(2kF`B^^l{(g z_dovET{CuVdZO`(HBX$}UA|j=vh>MKPbHrEa8K5rU3-o{z2)iCzw|#-`pnJG7C*cD z*At&B|IOLoT7Ub+-syV}yfF2J=l4zBciX-rFFy6+!55SJ8~5*hY4S^VzjWwj-^(BV zZq6&CUU}oyqF3*I_1)L2USIV3Q*T(`xaG}*2Qm(9ev5x={ac6Me&zQo4q6XxIrz;V zTK};959j{qe<$so``;b=?ni%W`_ryNIftenTFd^Qey{MoJKj5Wc*)@p-?zO#`TfoB ze|W@pWW=9m{rRz@-lMyZo;}ulY}2vVj(zu0%||;vF8sLdYKKfPVS6jXw_4RlE*!&IsX2(B^|2gBIH~;g*8T*+nXHI+@`u2`*k9>RfZ1jKr z*FHGuDq4VJgxaVAyIGx(mfn^!le|kf0z5XsIJK+6Kx|~04pU+!st$9cnylAho|KcP zbXXvR$YC88i46w_7)^;h02w-LAo=jL4jV}h9MEAi83G^au$7FW1|5Eb*l4Q`ze#H7 zA{{t;9vTh(e0V1mYqg;w7s| zF|m^xcCS}8DJEk`kOWC_AFLP)DI`V|5@pz4Qcc=On1qN*#*mdPElfIzLS_+#w39dq z5*LZ;rN_t!Qv7f7V~SR~{omv${sGN-jEfivu=0yZJ*j3-O)n++-%y%Cf@%gGJv?jdS#sXh`W(LOjBMrk0eC~*-lQAj6~K?f-&E~2vd0CAIe zA1WadW+4xgpeEBOqjITKFQ+xsr%EDZ1Q||-_m=OvL>twN-~acV!%2_?7&jqSWZ~o{i_AXPx0VOw+tz-+iiQGbN1rG4EDiI_wfDue!hBUB%71GI# zWINdg8ITECkPSJI3pU7ud?Ko|sNP!1JP34>t>423Ef1~}VZ z1GQj>I;aO39MAxb&;%o3B#eU5&APf<>npnwK z!~#)>feLZxf|aleR>K;&2G+v0unw++1pElr!v@$0*TW|GF>Hn#U<+)88{sCn8MeVK za4T$wpTKQ!JKO<3g*)Lc*a1I-yWt+V7w&`m;pgxGJO~fL!|(|F0(Qcq@EAM}yWk1f z4Nt;Tum_%oU&1r+Ec^<74bQ=E;Cc8h?1dL#AG`?r;U#z(eh06>tMD4U4sXDlZ~)$d zx8e725dHvvgm>Uw_!At0_uw$R4@ckw_z?aKN8uQJ1Ruk3_zV0M{sy1Gr*Hy3gOl(% zd;x!lQ}896hOgjj_y>Fg|AaH}Eu4k_g74saI0xt90(3(XdMKelDdi|n1u9aB8mN() zsF|iw3$@a8nn5#Z7R{zPG?&_F9x0{yw15`UezZTmf)>#Mw3wFAQaX?hqGhz4R?td1 zm=2*sX%!tttLboBLu;v>*3o(@QwMFJjkJl5pd;xhI+`}qD`^WIL&wr_w3UvhZFB;i zNGH+BbPAnHr_t&3DmsJCq_gO3I)~1s^XPoKfG(tq=wiBrE~U$;lP;$&>L%|}5A{-o z`e-}#(*RvTJ7|!0(hv>P2)&v{X^g5gPP^zzx{9u*Yv?s}Exnemqu0>{{SjSHH_(mr zdb)}Jm~N&w&@FT;y^-ETZ>HPmE%a8po&JR0MsKHg(4W#f>0NXO{TaQR-b3%D_tE?5 z&*=m7LHZDVm_9;(L3h$e>0|V9x{E$Rche{7Q*;k~n*NeLL!YI;qQ9ok(cjSL>2K*? z`U2fYU!?o#OY~*>JNgQJmA*z_r*F_V=>hr{eVhKC9;APuf28lwcj=$#A^ILYOy8$R z=m+#e`e%BS9-|-8kLhvx7y4KFH~I3`Ah==by-Jx?#tZknV$9N~bY9LMpTz=@p188{=tcXW^_|I+wv^a#>t9 zm&4_9HZG6L=L)z&t{>N*yMim?25`k(30KMu2@|iW|mNbHlkB zu9mZNbzD6sa}KV7Yvh`^5!^^_6gQe{=C0&gxG~&VZXDOjjpy393EV_(5;vKf!cFC- zanrf0xEb6`ZWcG2o5RiJ=5h161>8bz5x1CI!Y$>NaZYYI=i=O)hx2j@=OedC@lc?q zW=swG_L`cMU#o}hx?iXJ^|~+XzC-sLbiYyen{S`NUYDJ>&{245hkI9)-N zR|B029}T;_Y2NV4P%!NBVzeO@5aSVy69OT3c$GO4bgg!J0#Q#;5u-{(aj8;N@kN!G z-+-(zg2Aw-gZBkp?IyqC@<#mOkPg@f@<#ToYb%sPk#7i3I^Ik&Y&>V=0M1+gj5Yrhgn{$ z&*f22YR;~JR|!jzfJco-6)~cOJb|F8(-m2`TKR=T2Ii_aBPdqaj)G><|TBCdE$;bUqzBKg8m%$~-wrvi+U9uSlj zibqZJ_?50`SgW}u6<}2`MuPE}6Ai=E83^g1Su-LQErmOnZ@D_I#MD4I#6reE$QRbo zVxFj?gkt`%YSGa&t1yN;bjaj(g;Jm^8V#>xk~C`|ri6BXjE2^gX!a=VR)e1A~0c0UvXS_>^ssWEHn5l>T;b>q@IHbCQMz<^K^!Sm8 zx-y`uN>md(8X1~B3#Dlm?~E#HG|Y7@WbUlRZV%W$U z62B|xGqcu3Yf~iDemJgLf`L$n;tgmTmLl<(KN1L8lvSz{4Y`6&OlD0;AS9~MaKyjb z+#XQoFzi;ul~E<+@e8Ue))5nZfuO2HjqYeb@p)V^#e|lt zy(dC@G#rocC`-W;49C5qTXA(LQO*-rc~3a9+7xj`nEeDIe9YCQm{2=TchD8;kfKUB z>Q$mN9;D%*C8kCL9g6CYhU4viV?5+lqQO8&5mc8us0f{|_JBuFqj67%F%rO5PKl}3 zUWkc3qdgpM4=T>yHo)8`Lg);Kl+`AWE2^lhrUng+NAx%pt67USfU0!5 zB8GUUJE{bOE+OKIsfsCx&9~DX54sJ?Dv#e4YFDgG#EcE>y3(|uW~mZ(rOr;TIi@PA zKOFOfBZ?sw52&ay0~!^UD0;#^pQ7--aM){MJtgZ-unO*YAm|N*+7142EQ0-x(begW z2VEhLB6cd?j(}?RAxlcsxk6ESx1vNvKa)G}tMMtB-f-NFJ#PqAfWpkWBu2BpOQPbD zOOeq2Oc(LZ8mPCZj4ZaO48W|CSBZ6~;fNS?MbKl0qNa6*-S`WDy^U$Qy)%0=T^$dr z8f#_^)bt#S1VSMtDr$L!s1gaTHt9`)E2w7lZ2~bOy-zcUVUw~dg0HBi-C)oaiLrb_ ztTPZ)1Yb0~GQ@Q%eyQEnsYF~}Lx-}O*@XdrOCXw+0jz0JqKem`D$&kB$Q9)AmxGZp zAmfp-T(!|9<8%rFFo&xh9gEq!S1pH8=F9=gLm2+n#_HA7IQ2fQKB(VG!RjZ zvAA1zjCY>LHwa3#{2;#=(VOg8jYJw?4q2?Dm4&l zj|XCYB`QY4o(=^&o>d-iC^OaZuoi$B$R#nFfm{-W4V2#1GbGkP`PI&#%zI+7I?)yK z_`^|?)~cc)St}Y-Rx8;`Fc^r$0ZPv09ga1dOa%M~HXU)!I#3mycoWgd?sP_H3Ggq@@6-8jfJ@22P1b zxpsGii^sfNAQa_RL{@XrxSQ*UuH@XR2Y)6j#@=@}gSA6$G>nMfWx*^ zXuus;m6+{cqp(_*R5WXYGcO5YI`6Ejt4BvpTOE$8akt*J=>dLKAk=O|ht;n)4+>NA zM#B+zc$Folx;!1J#>*H8#Z*^&)YU2af&ouQlyiAQysx&Q*6I$Z?l_8`(Gt~or#l!m zYaWYA4~9eSde??BxAY0eBYjiRt}^l<9b(k!?6v9y zTiG{nTWu@Lfv9zQk*(}&x2?97eeJf@wj%L*q*0Hh)?=ylSZX~>K-792bvzat(UH+{pwoa(BRWk&mlBG{c&CgeAtNmr zO+rSKkkKS$Gzl3^LPnF2Yq1bJ7Gg&XGzJ-sK}KVc(HLYj1{sY(Mq`lC7-TdC8I3_k zW027pWNg0VI>e|$j5@?X8<6V|qaHEp5u+Y4Q1vpZUPjf+sCpSyFQe+^dc=?s1NAPW z-euIgjCz+*?=tFLM!n0ZcNz6AquyoIyNr65QSY(?F&v12N|zmo;Xn*W6YsM-YS2N9 z20KECfl8NA>2d>NG#~~lT}GwLsB{^XE~C2ddtIs(0w^fxS_Co$Oei0}a4| f2H?OZ!GX5qK>a&V{|?l@qqd$9nEUH{mlN{eMPu(E literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/hifi-glyphs.ttf b/scripts/developer/utilities/fonts/hifi-glyphs.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8733349227646b207ec15315e9eab9ee7ae9e252 GIT binary patch literal 29160 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 Wk?wovI=$BCKkvW)rUBpIIs6AkCfWV~ literal 0 HcmV?d00001 From 89682a2e2c0d86f989d57a6fbd0db9ca2ea53738 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 20 Sep 2017 10:18:25 -0700 Subject: [PATCH 44/45] SImple first steps to apply jittering correctly in stereo --- .../render-utils/src/AntialiasingEffect.cpp | 39 +++++++++++++++---- .../render-utils/src/RenderDeferredTask.cpp | 3 +- libraries/render-utils/src/taa.slf | 3 +- libraries/render-utils/src/taa.slh | 27 ++++++++++--- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 27a3689889..dfd5225a9f 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -510,20 +510,43 @@ void JitterSample::run(const render::RenderContextPointer& renderContext, Jitter auto viewFrustum = renderContext->args->getViewFrustum(); auto projMat = viewFrustum.getProjection(); auto theNear = viewFrustum.getNearClip(); - + + auto jit = jitterBuffer.get().offsets[(current < 0 ? SampleSequence::SEQUENCE_LENGTH : current)]; - auto width = (float) renderContext->args->_viewport.z; - auto height = (float) renderContext->args->_viewport.w; + auto width = (float)renderContext->args->_viewport.z; + auto height = (float)renderContext->args->_viewport.w; auto jx = 2.0 * jit.x / width; auto jy = 2.0 * jit.y / height; - projMat[2][0] += jx; - projMat[2][1] += jy; + + bool isStereo = renderContext->args->isStereo(); + if (!isStereo) { + projMat[2][0] += jx; + projMat[2][1] += jy; + + viewFrustum.setProjection(projMat); + renderContext->args->pushViewFrustum(viewFrustum); + + } + else { + + mat4 projMats[2]; + renderContext->args->_context->getStereoProjections(projMats); + + auto sjx = jx * 2.0f; + + + for (int i = 0; i < 2; i++) { + projMats[i][2][0] += sjx; + projMats[i][2][1] += jy; + } + + renderContext->args->_context->setStereoProjections(projMats); + + } + - viewFrustum.setProjection(projMat); - - renderContext->args->pushViewFrustum(viewFrustum); jitterBuffer = _jitterBuffer; } diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 06dc0cc1f8..14f2cddd19 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -78,11 +78,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren fadeEffect->build(task, opaques); + const auto jitterBuffer = task.addJob("JitterCam"); + // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); const auto lightingModel = task.addJob("LightingModel"); - const auto jitterBuffer = task.addJob("JitterCam"); // GPU jobs: Start preparing the primary, deferred and lighting buffer const auto primaryFramebuffer = task.addJob("PreparePrimaryBuffer"); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 670851d956..08e757906e 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -23,7 +23,8 @@ void main() { - vec2 texelSize = getInvWidthHeight(); + vec2 texelSize = taa_getTexelSize(); + vec2 fragJitterPix = taa_getCurrentJitterSample(); if (taa_unjitter()) { fragUV -= fragJitterPix * texelSize; diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 856247de6e..5b8bc7f97c 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -164,9 +164,25 @@ float taa_fetchDepth(vec2 uv) { #define ZCMP_GT(a, b) (a > b) +vec2 taa_getImageSize() { + vec2 imageSize = getWidthHeight(0); + if (isStereo()) { + imageSize.x *= 2.0; + } + return imageSize; +} + +vec2 taa_getTexelSize() { + vec2 texelSize = getInvWidthHeight(); + if (isStereo()) { + texelSize.x *= 0.5; + } + return texelSize; +} + vec3 taa_findClosestFragment3x3(vec2 uv) { - vec2 dd = abs(getInvWidthHeight()); + vec2 dd = abs(taa_getTexelSize()); vec2 du = vec2(dd.x, 0.0); vec2 dv = vec2(0.0, dd.y); @@ -215,7 +231,7 @@ float Luminance(vec3 rgb) { #define MINMAX_3X3_ROUNDED 1 mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { - vec2 texelSize = getInvWidthHeight(); + vec2 texelSize = taa_getTexelSize(); vec2 du = vec2(texelSize.x, 0.0); @@ -269,8 +285,8 @@ mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelo } mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { - vec2 imageSize = getWidthHeight(0); - vec2 texelSize = getInvWidthHeight(); + vec2 imageSize = taa_getImageSize(); + vec2 texelSize = taa_getTexelSize(); vec3 cmin, cmax, cavg; #if MINMAX_3X3_ROUNDED @@ -453,7 +469,8 @@ vec3 taa_getVelocityColorAboveThreshold(float velocityPixLength) { vec3 taa_evalFXAA(vec2 fragUV) { - vec2 texelSize = getInvWidthHeight(); + // vec2 texelSize = getInvWidthHeight(); + vec2 texelSize = taa_getTexelSize(); // filter width limit for dependent "two-tap" texture samples float FXAA_SPAN_MAX = 8.0; From 328d900533da34beb4e1117f39aadc037f797365 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 5 Oct 2017 00:57:17 -0700 Subject: [PATCH 45/45] Trying a simpler technique to find the best velocity candidate and cleaning default config --- .../render-utils/src/AntialiasingEffect.h | 4 +- libraries/render-utils/src/taa.slf | 12 +++-- libraries/render-utils/src/taa.slh | 44 +++++++++++++++++- .../lib/styles-uit/HifiConstants.qmlc | Bin 51304 -> 51304 bytes 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 09468e7942..957d14a9bb 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -115,8 +115,8 @@ public: bool constrainColor{ true }; bool covarianceClipColor{ true }; float covarianceGamma{ 1.0f }; - bool clipExactColor{ true }; - bool feedbackColor{ true }; + bool clipExactColor{ false }; + bool feedbackColor{ false }; float debugX{ 0.0f }; float debugFXAAX{ 1.0f }; diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 08e757906e..9334d2a5e7 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -37,8 +37,12 @@ void main() { return; } - vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); - vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); + // vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); + // vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); + + vec3 fragVelAndZ = taa_fetchVelocityMapBest(fragUV); + vec2 fragVel = fragVelAndZ.xy; + float fragDepth = fragVelAndZ.z; vec3 sourceColor; vec3 historyColor; @@ -47,8 +51,8 @@ void main() { vec3 nextColor = sourceColor; if (taa_constrainColor()) { - // clamp history to neighbourhood of current sample - historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, nearFragUV.z, fragJitterPix, historyColor); + // clamp history to neighbourhood of current sample + historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, fragDepth, fragJitterPix, historyColor); } if (taa_feedbackColor()) { diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 5b8bc7f97c..4e5f0e76ba 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -213,6 +213,48 @@ vec3 taa_findClosestFragment3x3(vec2 uv) return vec3(uv + dd.xy * dmin.xy, dmin.z); } +vec3 taa_fetchVelocityMapBest(vec2 uv) { + vec2 dd = abs(taa_getTexelSize()); + vec2 du = vec2(dd.x, 0.0); + vec2 dv = vec2(0.0, dd.y); + + vec2 dtl = taa_fetchVelocityMap(uv - dv - du); + vec2 dtc = taa_fetchVelocityMap(uv - dv); + vec2 dtr = taa_fetchVelocityMap(uv - dv + du); + + vec2 dml = taa_fetchVelocityMap(uv - du); + vec2 dmc = taa_fetchVelocityMap(uv); + vec2 dmr = taa_fetchVelocityMap(uv + du); + + vec2 dbl = taa_fetchVelocityMap(uv + dv - du); + vec2 dbc = taa_fetchVelocityMap(uv + dv); + vec2 dbr = taa_fetchVelocityMap(uv + dv + du); + + vec3 best = vec3(dtl, dot(dtl,dtl)); + + float testSpeed = dot(dtc,dtc); + if (testSpeed > best.z) { best = vec3(dtc, testSpeed); } + testSpeed = dot(dtr,dtr); + if (testSpeed > best.z) { best = vec3(dtr, testSpeed); } + + testSpeed = dot(dml,dml); + if (testSpeed > best.z) { best = vec3(dml, testSpeed); } + testSpeed = dot(dmc,dmc); + if (testSpeed > best.z) { best = vec3(dmc, testSpeed); } + testSpeed = dot(dmr,dmr); + if (testSpeed > best.z) { best = vec3(dmr, testSpeed); } + + testSpeed = dot(dbl,dbl); + if (testSpeed > best.z) { best = vec3(dbl, testSpeed); } + testSpeed = dot(dbc,dbc); + if (testSpeed > best.z) { best = vec3(dbc, testSpeed); } + testSpeed = dot(dbr,dbr); + if (testSpeed > best.z) { best = vec3(dbr, testSpeed); } + + + return vec3(best.xy, taa_fetchDepth(uv)); +} + vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, vec2 fragJitterPix, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; @@ -399,7 +441,7 @@ vec3 taa_clampColor(vec3 colorMin, vec3 colorMax, vec3 colorSource, vec3 color) if (r.z < rmin.z - eps) r *= (rmin.z / r.z); - return p + r; + return clamp(p + r, vec3(0.0), vec3(1.0)); } else { // note: only clips towards aabb center (but fast!) vec3 p_clip = 0.5 * (colorMax + colorMin); diff --git a/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc b/scripts/developer/utilities/lib/styles-uit/HifiConstants.qmlc index a11d8cf029dcb2a16ad80b66aa3ac76475f0233e..f63d5ef412f27aa5e3e93bafa0ca9a0b8d39ee01 100644 GIT binary patch delta 106 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))8-j<4bv85nG;85r(*Nh(g_lnb2PyUJbg zlK7pCIzK8kLm3zt(ik!sau`w>tQhpcFd5A9V8{f^1TmyC6fopZ_N;2(e5GoNF92hS B9n1g# delta 104 zcmaDcf%(M*W}U(^ljM}dl0-oU1_nk>R))Potmk4G85nG;85nAuW^T0qCvEb_ZFTsZ z_rd2k>inow4Q60qNMp!k$YDrjuwu{$!(=eaogtH

XDCG$Cn90yW2!TvHc6kUO~pBDt)WIi`>J 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 literal 0 HcmV?d00001 diff --git a/scripts/developer/utilities/fonts/Raleway-Regular.ttf b/scripts/developer/utilities/fonts/Raleway-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e570a2d5c39b2841b5753350a3822bd2b685e771 GIT binary patch literal 178520 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