From c60bfe2b655a18911609b07c63b6bd8acbf3b13e Mon Sep 17 00:00:00 2001 From: samcake Date: Sat, 10 Jun 2017 18:42:57 -0700 Subject: [PATCH 001/267] 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 002/267] 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 003/267] 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 004/267] 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 005/267] 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 006/267] 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 007/267] 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 008/267] 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 009/267] 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 010/267] 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 011/267] 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 012/267] 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 013/267] 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 014/267] 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 015/267] 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 016/267] 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 017/267] 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 018/267] 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 019/267] 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 020/267] 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 021/267] 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 022/267] 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 023/267] 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 024/267] 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 025/267] 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 026/267] 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 027/267] 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 028/267] 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 029/267] 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 030/267] 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 031/267] 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 032/267] 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 033/267] 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 034/267] 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 035/267] 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 036/267] 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 037/267] 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 038/267] 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 039/267] 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 040/267] 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 041/267] 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 042/267] 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 043/267] 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 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 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 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 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 044/267] 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 045/267] 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 Date: Thu, 7 Dec 2017 10:35:53 +0100 Subject: [PATCH 046/267] Fixed TAA debug script --- .../developer/utilities/render/antialiasing.js | 2 +- .../developer/utilities/render/antialiasing.qml | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/scripts/developer/utilities/render/antialiasing.js b/scripts/developer/utilities/render/antialiasing.js index b6c146caac..e915d75e93 100644 --- a/scripts/developer/utilities/render/antialiasing.js +++ b/scripts/developer/utilities/render/antialiasing.js @@ -13,7 +13,7 @@ (function() { var TABLET_BUTTON_NAME = "TAA"; - var QMLAPP_URL = Script.resolvePath("./Antialiasing.qml"); + var QMLAPP_URL = Script.resolvePath("./antialiasing.qml"); var onLuciScreen = false; diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 1c58cf8437..566f7ee01a 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -12,9 +12,8 @@ import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 -import "../lib/styles-uit" -import "../lib/controls-uit" as HifiControls - +import "qrc:///qml/styles-uit" +import "qrc:///qml/controls-uit" as HifiControls import "configSlider" import "../lib/plotperf" @@ -129,7 +128,7 @@ Rectangle { } } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Covariance gamma") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -145,7 +144,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Source blend") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -172,7 +171,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] = checked } } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Region <") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -186,7 +185,7 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Velocity Threshold [pix]") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -194,7 +193,7 @@ Rectangle { max: 50 min: 0.0 } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Orb Zoom") integral: false config: Render.getConfig("RenderMainView.Antialiasing") From 1b8821c64933eef8acf66d561ebed8004452d29f Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 7 Dec 2017 10:54:48 +0100 Subject: [PATCH 047/267] Added option to disable automatic head rotation in HMD simulator --- .../hmd/DebugHmdDisplayPlugin.cpp | 23 ++++++++++++++----- .../hmd/DebugHmdDisplayPlugin.h | 2 ++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp index 6e397efbe5..2cce1403b7 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp @@ -7,6 +7,8 @@ // #include "DebugHmdDisplayPlugin.h" +#include + #include #include @@ -41,6 +43,13 @@ bool DebugHmdDisplayPlugin::beginFrameRender(uint32_t frameIndex) { } bool DebugHmdDisplayPlugin::internalActivate() { + _isAutoRotateEnabled = _container->getBoolSetting("autoRotate", true); + _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), tr("Auto Rotate"), + [this](bool clicked) { + _isAutoRotateEnabled = clicked; + _container->setBoolSetting("autoRotate", _isAutoRotateEnabled); + }, true, _isAutoRotateEnabled); + _ipd = 0.0327499993f * 2.0f; _eyeProjections[0][0] = vec4{ 0.759056330, 0.000000000, 0.000000000, 0.000000000 }; _eyeProjections[0][1] = vec4{ 0.000000000, 0.682773232, 0.000000000, 0.000000000 }; @@ -63,10 +72,12 @@ bool DebugHmdDisplayPlugin::internalActivate() { } void DebugHmdDisplayPlugin::updatePresentPose() { - float yaw = sinf(secTimestampNow()) * 0.25f; - float pitch = cosf(secTimestampNow()) * 0.25f; - // Simulates head pose latency correction - _currentPresentFrameInfo.presentPose = - glm::mat4_cast(glm::angleAxis(yaw, Vectors::UP)) * - glm::mat4_cast(glm::angleAxis(pitch, Vectors::RIGHT)); + if (_isAutoRotateEnabled) { + float yaw = sinf(secTimestampNow()) * 0.25f; + float pitch = cosf(secTimestampNow()) * 0.25f; + // Simulates head pose latency correction + _currentPresentFrameInfo.presentPose = + glm::mat4_cast(glm::angleAxis(yaw, Vectors::UP)) * + glm::mat4_cast(glm::angleAxis(pitch, Vectors::RIGHT)); + } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h index cd6fdd44b9..f2b1f36419 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.h @@ -28,5 +28,7 @@ protected: bool isHmdMounted() const override { return true; } bool internalActivate() override; private: + static const QString NAME; + bool _isAutoRotateEnabled{ true }; }; From 291711ee24bf79f3da31c2079e756b7901e77fb3 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 7 Dec 2017 13:41:36 +0100 Subject: [PATCH 048/267] Fixed weird black pixel bugs in TAA due to sqrt in TAA shader with very slightly negative number when computing color variance --- libraries/render-utils/src/taa.slf | 8 ++++---- libraries/render-utils/src/taa.slh | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 9334d2a5e7..b4ad713a7a 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -31,11 +31,11 @@ void main() { } // Debug region before debug or fxaa region X - float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; +/* float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; if (distToRegionFXAA > 0.0) { outFragColor = vec4(taa_evalFXAA(fragUV), 1.0); return; - } + }*/ // vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); // vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); @@ -46,13 +46,13 @@ void main() { vec3 sourceColor; vec3 historyColor; - vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, fragJitterPix, sourceColor, historyColor); + vec2 prevFragUV = taa_fetchSourceAndHistory(fragUV, fragVel, sourceColor, historyColor); vec3 nextColor = sourceColor; if (taa_constrainColor()) { // clamp history to neighbourhood of current sample - historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, fragDepth, fragJitterPix, historyColor); + historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, fragDepth, historyColor); } if (taa_feedbackColor()) { diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 4e5f0e76ba..d276f2870d 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -255,7 +255,7 @@ vec3 taa_fetchVelocityMapBest(vec2 uv) { return vec3(best.xy, taa_fetchDepth(uv)); } -vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, vec2 fragJitterPix, out vec3 sourceColor, out vec3 historyColor) { +vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; vec2 prevFragUV = fragUV - fragVelocity; @@ -272,7 +272,7 @@ float Luminance(vec3 rgb) { #define MINMAX_3X3_ROUNDED 1 -mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { +mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe) { vec2 texelSize = taa_getTexelSize(); @@ -317,7 +317,7 @@ mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelo vec3 mu = sumSamples / vec3(9.0); - vec3 sigma = sqrt(sumSamples2 / vec3(9.0) - mu * mu); + vec3 sigma = sqrt(max(sumSamples2 / vec3(9.0) - mu * mu, vec3(0))); float gamma = params.covarianceGamma; vec3 cmin = mu - gamma * sigma; @@ -326,7 +326,7 @@ mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelo return mat3(cmin, cmax, mu); } -mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe, vec2 fragJitterPix) { +mat3 taa_evalNeighbourColorRegion(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe) { vec2 imageSize = taa_getImageSize(); vec2 texelSize = taa_getTexelSize(); vec3 cmin, cmax, cavg; @@ -463,13 +463,13 @@ vec3 taa_clampColor(vec3 colorMin, vec3 colorMax, vec3 colorSource, vec3 color) //} } -vec3 taa_evalConstrainColor(vec3 sourceColor, vec2 sourceUV, vec2 sourceVel, float sourceZe, vec2 sourceJitterPix, vec3 candidateColor) { +vec3 taa_evalConstrainColor(vec3 sourceColor, vec2 sourceUV, vec2 sourceVel, float sourceZe, vec3 candidateColor) { mat3 colorMinMaxAvg; if (taa_covarianceClipColor()) { - colorMinMaxAvg = taa_evalNeighbourColorVariance(sourceColor, sourceUV, sourceVel, sourceZe, sourceJitterPix); + colorMinMaxAvg = taa_evalNeighbourColorVariance(sourceColor, sourceUV, sourceVel, sourceZe); } else { - colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, sourceUV, sourceVel, sourceZe, sourceJitterPix); + colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, sourceUV, sourceVel, sourceZe); } // clamp history to neighbourhood of current sample From 1c3b4b0c9b791bbd153cb49126a73aff0fd75602 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 7 Dec 2017 17:54:58 -0800 Subject: [PATCH 049/267] Merging and adding Olivier's fixes to taa --- libraries/render-utils/src/taa.slh | 2 +- scripts/developer/utilities/render/antialiasing.js | 2 +- .../developer/utilities/render/antialiasing.qml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 4e5f0e76ba..83f4d8a893 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -317,7 +317,7 @@ mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelo vec3 mu = sumSamples / vec3(9.0); - vec3 sigma = sqrt(sumSamples2 / vec3(9.0) - mu * mu); + vec3 sigma = sqrt(max(sumSamples2 / vec3(9.0) - mu * mu, vec3(0.0))); float gamma = params.covarianceGamma; vec3 cmin = mu - gamma * sigma; diff --git a/scripts/developer/utilities/render/antialiasing.js b/scripts/developer/utilities/render/antialiasing.js index b6c146caac..e915d75e93 100644 --- a/scripts/developer/utilities/render/antialiasing.js +++ b/scripts/developer/utilities/render/antialiasing.js @@ -13,7 +13,7 @@ (function() { var TABLET_BUTTON_NAME = "TAA"; - var QMLAPP_URL = Script.resolvePath("./Antialiasing.qml"); + var QMLAPP_URL = Script.resolvePath("./antialiasing.qml"); var onLuciScreen = false; diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 1c58cf8437..e88be0f9bf 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -12,8 +12,8 @@ import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 -import "../lib/styles-uit" -import "../lib/controls-uit" as HifiControls +import "qrc:///qml/styles-uit" +import "qrc:///qml/controls-uit" as HifiControls import "configSlider" @@ -129,7 +129,7 @@ Rectangle { } } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Covariance gamma") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -145,7 +145,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Source blend") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -172,7 +172,7 @@ Rectangle { onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] = checked } } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Region <") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -186,7 +186,7 @@ Rectangle { checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked } } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Velocity Threshold [pix]") integral: false config: Render.getConfig("RenderMainView.Antialiasing") @@ -194,7 +194,7 @@ Rectangle { max: 50 min: 0.0 } - HifiControls.ConfigSlider { + ConfigSlider { label: qsTr("Debug Orb Zoom") integral: false config: Render.getConfig("RenderMainView.Antialiasing") From 92e1fe8e5ced10a08e0b899e5bf12c80fdb79347 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 8 Dec 2017 18:02:27 +0100 Subject: [PATCH 050/267] Removed jitter samples from shader and added name to batches in DEBUG mode to ease render debug --- interface/src/Application.cpp | 10 +- interface/src/Application_render.cpp | 2 +- interface/src/SecondaryCamera.cpp | 4 +- interface/src/ui/ApplicationOverlay.cpp | 2 +- .../hmd/DebugHmdDisplayPlugin.cpp | 6 +- .../display-plugins/hmd/HmdDisplayPlugin.cpp | 12 ++ .../display-plugins/hmd/HmdDisplayPlugin.h | 6 +- libraries/gpu/src/gpu/Batch.cpp | 12 +- libraries/gpu/src/gpu/Batch.h | 7 +- libraries/gpu/src/gpu/Context.cpp | 4 +- libraries/gpu/src/gpu/Context.h | 4 +- .../src/AmbientOcclusionEffect.cpp | 4 +- .../render-utils/src/AntialiasingEffect.cpp | 110 ++++++++---------- .../render-utils/src/AntialiasingEffect.h | 37 +++--- .../render-utils/src/BackgroundStage.cpp | 2 +- libraries/render-utils/src/BloomEffect.cpp | 8 +- .../render-utils/src/DebugDeferredBuffer.cpp | 2 +- .../src/DeferredFrameTransform.cpp | 2 +- .../src/DeferredLightingEffect.cpp | 2 +- libraries/render-utils/src/DrawHaze.cpp | 2 +- .../render-utils/src/HighlightEffect.cpp | 10 +- .../render-utils/src/RenderDeferredTask.cpp | 27 +++-- .../render-utils/src/RenderForwardTask.cpp | 8 +- .../render-utils/src/RenderShadowTask.cpp | 2 +- .../render-utils/src/StencilMaskPass.cpp | 2 +- .../render-utils/src/SubsurfaceScattering.cpp | 8 +- .../render-utils/src/SurfaceGeometryPass.cpp | 4 +- .../render-utils/src/ToneMappingEffect.cpp | 2 +- .../render-utils/src/VelocityBufferPass.cpp | 2 +- libraries/render-utils/src/ZoneRenderer.cpp | 2 +- libraries/render-utils/src/taa.slf | 13 +-- libraries/render-utils/src/taa.slh | 36 +----- libraries/render-utils/src/taa_blend.slf | 29 +---- libraries/render/src/render/BlurTask.cpp | 4 +- .../render/src/render/DrawSceneOctree.cpp | 4 +- libraries/render/src/render/DrawStatus.cpp | 2 +- libraries/render/src/render/DrawTask.cpp | 6 +- libraries/render/src/render/ResampleTask.cpp | 2 +- .../utilities/render/antialiasing.qml | 15 --- tests/gpu-test/src/TestWindow.cpp | 10 +- tests/gpu-test/src/main.cpp | 2 +- tests/render-perf/src/main.cpp | 2 +- tests/render-texture-load/src/main.cpp | 4 +- 43 files changed, 178 insertions(+), 256 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d7fb88f42e..5aa69a485b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5070,10 +5070,10 @@ void Application::update(float deltaTime) { { QMutexLocker viewLocker(&_viewMutex); // adjust near clip plane to account for sensor scaling. - auto adjustedProjection = glm::perspective(_viewFrustum.getFieldOfView(), - _viewFrustum.getAspectRatio(), - DEFAULT_NEAR_CLIP * sensorToWorldScale, - _viewFrustum.getFarClip()); + auto adjustedProjection = glm::perspective(glm::radians(_fieldOfView.get()), + getActiveDisplayPlugin()->getRecommendedAspectRatio(), + DEFAULT_NEAR_CLIP * sensorToWorldScale, + DEFAULT_FAR_CLIP); _viewFrustum.setProjection(adjustedProjection); _viewFrustum.calculate(); } @@ -5095,7 +5095,7 @@ void Application::update(float deltaTime) { resizeGL(); } - this->updateCamera(appRenderArgs._renderArgs); + updateCamera(appRenderArgs._renderArgs); appRenderArgs._eyeToWorld = _myCamera.getTransform(); appRenderArgs._isStereo = false; diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index 1231e5834b..d1a315e398 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -93,7 +93,7 @@ void Application::paintGL() { _gpuContext->beginFrame(HMDSensorPose); // Reset the gpu::Context Stages // Back to the default framebuffer; - gpu::doInBatch(_gpuContext, [&](gpu::Batch& batch) { + gpu::doInBatch("Application_render::gpuContextReset", _gpuContext, [&](gpu::Batch& batch) { batch.resetStages(); }); } diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index 4cfa4d6156..a4fd89e576 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -107,7 +107,7 @@ public: args->_displayMode = RenderArgs::MONO; args->_renderMode = RenderArgs::RenderMode::SECONDARY_CAMERA_RENDER_MODE; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("SecondaryCameraJob::run", args->_context, [&](gpu::Batch& batch) { batch.disableContextStereo(); batch.disableContextViewCorrection(); }); @@ -196,7 +196,7 @@ public: args->_displayMode = cachedArgs->_displayMode; args->_renderMode = cachedArgs->_renderMode; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("EndSecondaryCameraFrame::run", args->_context, [&](gpu::Batch& batch) { batch.restoreContextStereo(); batch.restoreContextViewCorrection(); }); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index a99fe002ee..dade3a714f 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -64,7 +64,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { } // Execute the batch into our framebuffer - doInBatch(renderArgs->_context, [&](gpu::Batch& batch) { + doInBatch("ApplicationOverlay::render", renderArgs->_context, [&](gpu::Batch& batch) { PROFILE_RANGE_BATCH(batch, "ApplicationOverlayRender"); renderArgs->_batch = &batch; batch.enableStereo(false); diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp index 2cce1403b7..e01a205a3c 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp @@ -51,6 +51,7 @@ bool DebugHmdDisplayPlugin::internalActivate() { }, true, _isAutoRotateEnabled); _ipd = 0.0327499993f * 2.0f; + // Would be nice to know why the left and right projection matrices are slightly dissymetrical _eyeProjections[0][0] = vec4{ 0.759056330, 0.000000000, 0.000000000, 0.000000000 }; _eyeProjections[0][1] = vec4{ 0.000000000, 0.682773232, 0.000000000, 0.000000000 }; _eyeProjections[0][2] = vec4{ -0.0580431037, -0.00619550655, -1.00000489, -1.00000000 }; @@ -59,8 +60,9 @@ bool DebugHmdDisplayPlugin::internalActivate() { _eyeProjections[1][1] = vec4{ 0.000000000, 0.678060353, 0.000000000, 0.000000000 }; _eyeProjections[1][2] = vec4{ 0.0578232110, -0.00669418881, -1.00000489, -1.000000000 }; _eyeProjections[1][3] = vec4{ 0.000000000, 0.000000000, -0.0800003856, 0.000000000 }; - _eyeInverseProjections[0] = glm::inverse(_eyeProjections[0]); - _eyeInverseProjections[1] = glm::inverse(_eyeProjections[1]); + // No need to do so here as this will done in Parent::internalActivate + //_eyeInverseProjections[0] = glm::inverse(_eyeProjections[0]); + //_eyeInverseProjections[1] = glm::inverse(_eyeProjections[1]); _eyeOffsets[0][3] = vec4{ -0.0327499993, 0.0, 0.0149999997, 1.0 }; _eyeOffsets[1][3] = vec4{ 0.0327499993, 0.0, 0.0149999997, 1.0 }; _renderTargetSize = { 3024, 1680 }; diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 1d7fee38eb..c99fafff89 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -57,6 +57,18 @@ QRect HmdDisplayPlugin::getRecommendedHUDRect() const { return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT; } +glm::mat4 HmdDisplayPlugin::getEyeToHeadTransform(Eye eye) const { + return _eyeOffsets[eye]; +} + +glm::mat4 HmdDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4& baseProjection) const { + return _eyeProjections[eye]; +} + +glm::mat4 HmdDisplayPlugin::getCullingProjection(const glm::mat4& baseProjection) const { + return _cullingProjection; +} + #define DISABLE_PREVIEW_MENU_ITEM_DELAY_MS 500 bool HmdDisplayPlugin::internalActivate() { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index d2d30df093..78d5904c7d 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -26,9 +26,9 @@ public: ~HmdDisplayPlugin(); bool isHmd() const override final { return true; } float getIPD() const override final { return _ipd; } - glm::mat4 getEyeToHeadTransform(Eye eye) const override final { return _eyeOffsets[eye]; } - glm::mat4 getEyeProjection(Eye eye, const glm::mat4& baseProjection) const override { return _eyeProjections[eye]; } - glm::mat4 getCullingProjection(const glm::mat4& baseProjection) const override { return _cullingProjection; } + glm::mat4 getEyeToHeadTransform(Eye eye) const override final; + glm::mat4 getEyeProjection(Eye eye, const glm::mat4& baseProjection) const override; + glm::mat4 getCullingProjection(const glm::mat4& baseProjection) const override; glm::uvec2 getRecommendedUiSize() const override final; glm::uvec2 getRecommendedRenderSize() const override final { return _renderTargetSize; } bool isDisplayVisible() const override { return isHmdMounted(); } diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index c432e19368..6a07b2bb61 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -37,7 +37,14 @@ size_t Batch::_dataMax { BATCH_PREALLOCATE_MIN }; size_t Batch::_objectsMax { BATCH_PREALLOCATE_MIN }; size_t Batch::_drawCallInfosMax { BATCH_PREALLOCATE_MIN }; -Batch::Batch() { +Batch::Batch(const char* name) { +#ifdef DEBUG + if (name) { + _name = name; + } +#else + (void*)name; +#endif _commands.reserve(_commandsMax); _commandOffsets.reserve(_commandOffsetsMax); _params.reserve(_paramsMax); @@ -48,6 +55,9 @@ Batch::Batch() { Batch::Batch(const Batch& batch_) { Batch& batch = *const_cast(&batch_); +#ifdef DEBUG + _name = batch_._name; +#endif _commands.swap(batch._commands); _commandOffsets.swap(batch._commandOffsets); _params.swap(batch._params); diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index fca220c224..4f328747ac 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -91,7 +91,7 @@ public: void captureDrawCallInfo(); void captureNamedDrawCallInfo(std::string name); - Batch(); + Batch(const char* name = nullptr); Batch(const Batch& batch); ~Batch(); @@ -482,6 +482,11 @@ public: bool _enableSkybox { false }; protected: + +#ifdef DEBUG + std::string _name; +#endif + friend class Context; friend class Frame; diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index 24128524da..a33f375614 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -108,7 +108,7 @@ void Context::executeFrame(const FramePointer& frame) const { consumeFrameUpdates(frame); _backend->setStereoState(frame->stereoState); { - Batch beginBatch; + Batch beginBatch("Context::executeFrame::begin"); _frameRangeTimer->begin(beginBatch); _backend->render(beginBatch); @@ -117,7 +117,7 @@ void Context::executeFrame(const FramePointer& frame) const { _backend->render(batch); } - Batch endBatch; + Batch endBatch("Context::executeFrame::end"); _frameRangeTimer->end(endBatch); _backend->render(endBatch); } diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 7b7575e9ed..6358c17108 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -274,8 +274,8 @@ protected: typedef std::shared_ptr ContextPointer; template -void doInBatch(std::shared_ptr context, F f) { - gpu::Batch batch; +void doInBatch(const char* name, std::shared_ptr context, F f) { + gpu::Batch batch(name); f(batch); context->appendFrameBatch(batch); } diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 83753131c8..1dfe793576 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -385,7 +385,7 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte auto firstHBlurPipeline = getHBlurPipeline(); auto lastVBlurPipeline = getVBlurPipeline(); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("AmbientOcclusionEffect::run", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); _gpuTimer->begin(batch); @@ -518,7 +518,7 @@ void DebugAmbientOcclusion::run(const render::RenderContextPointer& renderContex auto debugPipeline = getDebugPipeline(); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("DebugAmbientOcclusion::run", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(sourceViewport); diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index a0935d76d9..ec91de263c 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -24,7 +24,10 @@ #include "ViewFrustum.h" #include "GeometryCache.h" #include "FramebufferCache.h" -/* + +#define ANTIALIASING_USE_TAA 1 + +#if !ANTIALIASING_USE_TAA #include "fxaa_vert.h" #include "fxaa_frag.h" #include "fxaa_blend_frag.h" @@ -110,7 +113,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("Antialiasing::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); @@ -167,17 +170,14 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, texCoordTopLeft, texCoordBottomRight, color, _geometryId); }); } -*/ +#else #include "taa_frag.h" #include "fxaa_blend_frag.h" #include "taa_blend_frag.h" - - 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 +209,6 @@ 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)); @@ -259,7 +258,6 @@ 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)); @@ -285,7 +283,6 @@ void Antialiasing::configure(const Config& config) { _params.edit().blend = config.blend; _params.edit().covarianceGamma = config.covarianceGamma; - _params.edit().setUnjitter(config.unjitter); _params.edit().setConstrainColor(config.constrainColor); _params.edit().setCovarianceClipColor(config.covarianceClipColor); _params.edit().setClipExactColor(config.clipExactColor); @@ -301,7 +298,6 @@ void Antialiasing::configure(const Config& config) { _params.edit().setDebugCursor(config.debugCursorTexcoord); _params.edit().setDebugOrbZoom(config.debugOrbZoom); - _params.edit().setShowJitterSequence(config.showJitterSequence); _params.edit().setShowClosestFragment(config.showClosestFragment); } @@ -313,10 +309,9 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const RenderArgs* args = renderContext->args; auto& deferredFrameTransform = inputs.get0(); - auto& jitterBuffer = inputs.get1(); - auto& sourceBuffer = inputs.get2(); - auto& linearDepthBuffer = inputs.get3(); - auto& velocityBuffer = inputs.get4(); + auto& sourceBuffer = inputs.get1(); + auto& linearDepthBuffer = inputs.get2(); + auto& velocityBuffer = inputs.get3(); int width = sourceBuffer->getWidth(); int height = sourceBuffer->getHeight(); @@ -343,7 +338,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const int nextFrame = (_currentFrame++) % 2; int prevFrame = (nextFrame + 1) % 2; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("Antialiasing::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); @@ -356,7 +351,6 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); - batch.setUniformBuffer(AntialiasingPass_JitterBufferSlot, jitterBuffer); batch.setFramebuffer(_antialiasingBuffer[nextFrame]); batch.setPipeline(getAntialiasingPipeline()); @@ -376,7 +370,6 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); - batch.setUniformBuffer(AntialiasingPass_JitterBufferSlot, nullptr); batch.setResourceTexture(AntialiasingPass_DepthMapSlot, nullptr); batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, nullptr); @@ -387,7 +380,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const void JitterSampleConfig::setIndex(int current) { - _index = (current) % JitterSample::SampleSequence::SEQUENCE_LENGTH; + _index = (current) % JitterSample::SEQUENCE_LENGTH; emit dirty(); } @@ -446,11 +439,11 @@ int JitterSampleConfig::play() { return _state; } - - -template class Halton { +template +class Halton { public: - float eval(int index) { + + float eval(int index) const { float f = 1.0f; float r = 0.0f; float invB = 1.0f / (float)B; @@ -458,12 +451,14 @@ public: while (index > 0) { f = f * invB; - r = r + f * (float) (index % B); + r = r + f * (float)(index % B); index = index / B; + } return r; } + }; @@ -474,9 +469,6 @@ JitterSample::SampleSequence::SampleSequence(){ for (int i = 0; i < SEQUENCE_LENGTH; i++) { offsets[i] = glm::vec2(genX.eval(i), genY.eval(i)); - } - - for (int i = 0; i < SEQUENCE_LENGTH; i++) { offsets[i] -= vec2(0.5f); } offsets[SEQUENCE_LENGTH] = glm::vec2(0.0f); @@ -486,68 +478,60 @@ void JitterSample::configure(const Config& config) { _freeze = config.freeze; if (config.stop || _freeze) { auto pausedIndex = config.getIndex(); - if (_jitterBuffer->currentIndex != pausedIndex) { - _jitterBuffer.edit().currentIndex = pausedIndex; + if (_sampleSequence.currentIndex != pausedIndex) { + _sampleSequence.currentIndex = pausedIndex; } } else { - if (_jitterBuffer->currentIndex < 0) { - _jitterBuffer.edit().currentIndex = config.getIndex(); + if (_sampleSequence.currentIndex < 0) { + _sampleSequence.currentIndex = config.getIndex(); } } _scale = config.scale; } -void JitterSample::run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer) { - auto& current = _jitterBuffer.edit().currentIndex; + +void JitterSample::run(const render::RenderContextPointer& renderContext) { + auto& current = _sampleSequence.currentIndex; if (!_freeze) { if (current >= 0) { - current = (current + 1) % SampleSequence::SEQUENCE_LENGTH; - } - else { + current = (current + 1) % SEQUENCE_LENGTH; + } else { current = -1; } } - auto viewFrustum = renderContext->args->getViewFrustum(); - auto projMat = viewFrustum.getProjection(); - auto theNear = viewFrustum.getNearClip(); + auto args = renderContext->args; + auto viewFrustum = args->getViewFrustum(); + auto jit = _sampleSequence.offsets[(current < 0 ? SEQUENCE_LENGTH : current)]; + auto width = (float)args->_viewport.z; + auto height = (float)args->_viewport.w; - 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 = 2.0f * jit.x / width; + auto jy = 2.0f * jit.y / height; - auto jx = 2.0 * jit.x / width; - auto jy = 2.0 * jit.y / height; + if (!args->isStereo()) { + auto projMat = viewFrustum.getProjection(); - - bool isStereo = renderContext->args->isStereo(); - if (!isStereo) { projMat[2][0] += jx; projMat[2][1] += jy; viewFrustum.setProjection(projMat); - renderContext->args->pushViewFrustum(viewFrustum); - - } - else { - + viewFrustum.calculate(); + args->setViewFrustum(viewFrustum); + } else { mat4 projMats[2]; - renderContext->args->_context->getStereoProjections(projMats); + args->_context->getStereoProjections(projMats); + + jx *= 2.0f; - auto sjx = jx * 2.0f; - - for (int i = 0; i < 2; i++) { - projMats[i][2][0] += sjx; - projMats[i][2][1] += jy; + auto& projMat = projMats[i]; + projMat[2][0] += jx; + projMat[2][1] += jy; } - renderContext->args->_context->setStereoProjections(projMats); - + args->_context->setStereoProjections(projMats); } - - - - jitterBuffer = _jitterBuffer; } +#endif \ No newline at end of file diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 957d14a9bb..1362a7c7b3 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -57,27 +57,27 @@ private: class JitterSample { public: - struct SampleSequence { - SampleSequence(); - static const int SEQUENCE_LENGTH{ 16 }; - glm::vec2 offsets[SEQUENCE_LENGTH + 1]; - int sequenceLength{ SEQUENCE_LENGTH }; - int currentIndex{ 0 }; - + enum { + SEQUENCE_LENGTH = 16 }; - using JitterBuffer = gpu::StructBuffer; - using Config = JitterSampleConfig; - using JobModel = render::Job::ModelO; + using JobModel = render::Job::Model; void configure(const Config& config); - void run(const render::RenderContextPointer& renderContext, JitterBuffer& jitterBuffer); - + void run(const render::RenderContextPointer& renderContext); private: - JitterBuffer _jitterBuffer; + struct SampleSequence { + SampleSequence(); + + glm::vec2 offsets[SEQUENCE_LENGTH + 1]; + int sequenceLength{ SEQUENCE_LENGTH }; + int currentIndex{ 0 }; + }; + + SampleSequence _sampleSequence; float _scale{ 1.0 }; bool _freeze{ false }; }; @@ -88,7 +88,6 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float blend MEMBER blend 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 covarianceClipColor MEMBER covarianceClipColor NOTIFY dirty) Q_PROPERTY(bool clipExactColor MEMBER clipExactColor NOTIFY dirty) @@ -102,7 +101,6 @@ class AntialiasingConfig : public render::Job::Config { 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: @@ -111,7 +109,6 @@ public: float blend{ 0.1f }; - bool unjitter{ false }; bool constrainColor{ true }; bool covarianceClipColor{ true }; float covarianceGamma{ 1.0f }; @@ -126,7 +123,6 @@ public: bool debug { false }; bool showCursorPixel { false }; - bool showJitterSequence{ false }; bool showClosestFragment{ false }; signals: @@ -146,9 +142,6 @@ struct TAAParams { 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(flags.y, 0, enabled); } - bool isUnjitter() const { return (bool)GET_BIT(flags.y, 0); } - void setConstrainColor(bool enabled) { SET_BIT(flags.y, 1, enabled); } bool isConstrainColor() const { return (bool)GET_BIT(flags.y, 1); } @@ -173,16 +166,14 @@ struct TAAParams { void setDebugOrbZoom(float orbZoom) { pixelInfo.z = orbZoom; } float getDebugOrbZoom() const { return pixelInfo.z; } - void setShowJitterSequence(bool enabled) { SET_BIT(flags.x, 2, enabled); } void setShowClosestFragment(bool enabled) { SET_BIT(flags.x, 3, enabled); } - }; using TAAParamsBuffer = gpu::StructBuffer; class Antialiasing { public: - using Inputs = render::VaryingSet5 < DeferredFrameTransformPointer, JitterSample::JitterBuffer, gpu::FramebufferPointer, LinearDepthFramebufferPointer, VelocityFramebufferPointer > ; + using Inputs = render::VaryingSet4 < DeferredFrameTransformPointer, gpu::FramebufferPointer, LinearDepthFramebufferPointer, VelocityFramebufferPointer > ; using Config = AntialiasingConfig; using JobModel = render::Job::ModelI; diff --git a/libraries/render-utils/src/BackgroundStage.cpp b/libraries/render-utils/src/BackgroundStage.cpp index 2d2c0ed150..f246ab7e60 100644 --- a/libraries/render-utils/src/BackgroundStage.cpp +++ b/libraries/render-utils/src/BackgroundStage.cpp @@ -93,7 +93,7 @@ void DrawBackgroundStage::run(const render::RenderContextPointer& renderContext, PerformanceTimer perfTimer("skybox"); auto args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawBackgroundStage::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.enableSkybox(true); diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index 9d9367a6d5..07af501de3 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -75,7 +75,7 @@ void BloomThreshold::run(const render::RenderContextPointer& renderContext, cons glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("BloomThreshold::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(viewport); @@ -135,7 +135,7 @@ void BloomApply::run(const render::RenderContextPointer& renderContext, const In const auto blur2FB = inputs.get3(); const glm::ivec4 viewport{ 0, 0, framebufferSize.x, framebufferSize.y }; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("BloomApply::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(frameBuffer); @@ -180,7 +180,7 @@ void BloomDraw::run(const render::RenderContextPointer& renderContext, const Inp _pipeline = gpu::Pipeline::create(program, state); } - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("BloomDraw::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(frameBuffer); @@ -238,7 +238,7 @@ void DebugBloom::run(const render::RenderContextPointer& renderContext, const In _pipeline = gpu::Pipeline::create(program, state); } - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DebugBloom::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(frameBuffer); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index f9d8c4af38..9f1b5e0fd3 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -416,7 +416,7 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I auto& ambientOcclusionFramebuffer = inputs.get3(); auto& velocityFramebuffer = inputs.get4(); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DebugDeferredBuffer::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); diff --git a/libraries/render-utils/src/DeferredFrameTransform.cpp b/libraries/render-utils/src/DeferredFrameTransform.cpp index cee5786847..d6dc9e1372 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.cpp +++ b/libraries/render-utils/src/DeferredFrameTransform.cpp @@ -42,7 +42,7 @@ void DeferredFrameTransform::update(RenderArgs* args) { args->getViewFrustum().evalProjectionMatrix(frameTransformBuffer.projectionMono); - // Running in stero ? + // Running in stereo ? bool isStereo = args->isStereo(); if (!isStereo) { frameTransformBuffer.projection[0] = frameTransformBuffer.projectionMono; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 646b19198b..a2e29f57d3 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -407,7 +407,7 @@ void PrepareDeferred::run(const RenderContextPointer& renderContext, const Input outputs.edit0() = _deferredFramebuffer; outputs.edit1() = _deferredFramebuffer->getLightingFramebuffer(); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("PrepareDeferred::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); diff --git a/libraries/render-utils/src/DrawHaze.cpp b/libraries/render-utils/src/DrawHaze.cpp index 4431c1bbc3..59cdc2dbf4 100644 --- a/libraries/render-utils/src/DrawHaze.cpp +++ b/libraries/render-utils/src/DrawHaze.cpp @@ -155,7 +155,7 @@ void DrawHaze::run(const render::RenderContextPointer& renderContext, const Inpu auto sourceFramebufferSize = glm::ivec2(inputBuffer->getDimensions()); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawHaze::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(outputBuffer); diff --git a/libraries/render-utils/src/HighlightEffect.cpp b/libraries/render-utils/src/HighlightEffect.cpp index 7c58e5ba66..6fa50fbb68 100644 --- a/libraries/render-utils/src/HighlightEffect.cpp +++ b/libraries/render-utils/src/HighlightEffect.cpp @@ -161,7 +161,7 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c // Clear the framebuffer without stereo // Needs to be distinct from the other batch because using the clear call // while stereo is enabled triggers a warning - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawHighlightMask::run::begin", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(ressources->getDepthFramebuffer()); batch.clearDepthStencilFramebuffer(1.0f, 0); @@ -174,7 +174,7 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c render::ItemBounds itemBounds; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawHighlightMask::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; auto maskPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder); @@ -212,7 +212,7 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c _boundsBuffer->setData(itemBounds.size() * sizeof(render::ItemBound), (const gpu::Byte*) itemBounds.data()); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawHighlightMask::run::end", args->_context, [&](gpu::Batch& batch) { // Setup camera, projection and viewport for all items batch.setViewportTransform(args->_viewport); batch.setProjectionTransform(projMat); @@ -279,7 +279,7 @@ void DrawHighlight::run(const render::RenderContextPointer& renderContext, const shaderParameters._size.y = size; } - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawHighlight::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(destinationFrameBuffer); @@ -352,7 +352,7 @@ void DebugHighlight::run(const render::RenderContextPointer& renderContext, cons assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DebugHighlight::run", args->_context, [&](gpu::Batch& batch) { batch.setViewportTransform(args->_viewport); batch.setFramebuffer(highlightRessources->getColorFramebuffer()); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 60fdc75e5e..3aa931aba7 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -92,7 +92,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren fadeEffect->build(task, opaques); - const auto jitterBuffer = task.addJob("JitterCam"); + task.addJob("JitterCam"); // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); @@ -238,6 +238,10 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawOverlayInFrontTransparentBounds", overlaysInFrontTransparent); } + // AA job to be revisited + const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); + task.addJob("Antialiasing", antialiasingInputs); + // Debugging stages { // Debugging Deferred buffer job @@ -268,11 +272,6 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawZoneStack", deferredFrameTransform); } - // AA job to be revisited - const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, jitterBuffer, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); - - task.addJob("Antialiasing", antialiasingInputs); - // Composite the HUD and HUD overlays task.addJob("HUD"); @@ -297,13 +296,13 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren void BeginGPURangeTimer::run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer) { timer = _gpuTimer; - gpu::doInBatch(renderContext->args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("BeginGPURangeTimer::run", renderContext->args->_context, [&](gpu::Batch& batch) { _gpuTimer->begin(batch); }); } void EndGPURangeTimer::run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer) { - gpu::doInBatch(renderContext->args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("EndGPURangeTimer::run", renderContext->args->_context, [&](gpu::Batch& batch) { timer->end(batch); }); @@ -323,7 +322,7 @@ void DrawDeferred::run(const RenderContextPointer& renderContext, const Inputs& RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawDeferred::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; // Setup camera, projection and viewport for all items @@ -370,7 +369,7 @@ void DrawStateSortDeferred::run(const RenderContextPointer& renderContext, const RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawStateSortDeferred::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; // Setup camera, projection and viewport for all items @@ -434,14 +433,14 @@ void DrawOverlay3D::run(const RenderContextPointer& renderContext, const Inputs& // Needs to be distinct from the other batch because using the clear call // while stereo is enabled triggers a warning if (_opaquePass) { - gpu::doInBatch(args->_context, [&](gpu::Batch& batch){ + gpu::doInBatch("DrawOverlay3D::run::clear", args->_context, [&](gpu::Batch& batch){ batch.enableStereo(false); batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, false); }); } // Render the items - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawOverlay3D::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); @@ -473,7 +472,7 @@ void CompositeHUD::run(const RenderContextPointer& renderContext) { } // Grab the HUD texture - gpu::doInBatch(renderContext->args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("CompositeHUD::run", renderContext->args->_context, [&](gpu::Batch& batch) { if (renderContext->args->_hudOperator) { renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture, renderContext->args->_renderMode == RenderArgs::RenderMode::MIRROR_RENDER_MODE); } @@ -499,7 +498,7 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer // Blit primary to blit FBO auto primaryFbo = srcFramebuffer; - gpu::doInBatch(renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("Blit::run", renderArgs->_context, [&](gpu::Batch& batch) { batch.setFramebuffer(blitFbo); if (renderArgs->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index c83251c605..6aaeae7bcc 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -84,7 +84,7 @@ void PrepareFramebuffer::run(const RenderContextPointer& renderContext, } auto args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("PrepareFramebuffer::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); @@ -104,7 +104,7 @@ void Draw::run(const RenderContextPointer& renderContext, const Inputs& items) { RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderForward::Draw::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; // Setup projection @@ -141,7 +141,7 @@ const gpu::PipelinePointer Stencil::getPipeline() { void Stencil::run(const RenderContextPointer& renderContext) { RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderForward::Stencil::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.enableStereo(false); @@ -158,7 +158,7 @@ void DrawBackground::run(const RenderContextPointer& renderContext, const Inputs& background) { RenderArgs* args = renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderForward::DrawBackground::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.enableSkybox(true); diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index 7a6e3dc74f..5557b1af59 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -153,7 +153,7 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con args->popViewFrustum(); args->pushViewFrustum(adjustedShadowFrustum); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderShadowMap::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.enableStereo(false); diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index f71111b64e..54811937fd 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -81,7 +81,7 @@ void PrepareStencil::run(const RenderContextPointer& renderContext, const gpu::F return; } - doInBatch(args->_context, [&](gpu::Batch& batch) { + doInBatch("PrepareStencil::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(args->_viewport); diff --git a/libraries/render-utils/src/SubsurfaceScattering.cpp b/libraries/render-utils/src/SubsurfaceScattering.cpp index 1786898e57..ef1fdcaa78 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.cpp +++ b/libraries/render-utils/src/SubsurfaceScattering.cpp @@ -322,7 +322,7 @@ void diffuseProfileGPU(gpu::TexturePointer& profileMap, RenderArgs* args) { auto makeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("diffuseProfile")); makeFramebuffer->setRenderBuffer(0, profileMap); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("SubsurfaceScattering::diffuseProfileGPU", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(glm::ivec4(0, 0, width, height)); @@ -359,7 +359,7 @@ void diffuseScatterGPU(const gpu::TexturePointer& profileMap, gpu::TexturePointe auto makeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("diffuseScatter")); makeFramebuffer->setRenderBuffer(0, lut); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("SubsurfaceScattering::diffuseScatterGPU", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(glm::ivec4(0, 0, width, height)); @@ -396,7 +396,7 @@ void computeSpecularBeckmannGPU(gpu::TexturePointer& beckmannMap, RenderArgs* ar auto makeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("computeSpecularBeckmann")); makeFramebuffer->setRenderBuffer(0, beckmannMap); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("SubsurfaceScattering::computeSpecularBeckmannGPU", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(glm::ivec4(0, 0, width, height)); @@ -537,7 +537,7 @@ void DebugSubsurfaceScattering::run(const render::RenderContextPointer& renderCo // const auto light = DependencyManager::get()->getLightStage()->getLight(0); const auto light = lightStage->getLight(0); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("DebugSubsurfaceScattering::run", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); diff --git a/libraries/render-utils/src/SurfaceGeometryPass.cpp b/libraries/render-utils/src/SurfaceGeometryPass.cpp index c4eea7ce7f..740a6978f2 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.cpp +++ b/libraries/render-utils/src/SurfaceGeometryPass.cpp @@ -174,7 +174,7 @@ void LinearDepthPass::run(const render::RenderContextPointer& renderContext, con auto halfViewport = depthViewport >> 1; float clearLinearDepth = args->getViewFrustum().getFarClip() * 2.0f; - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("LinearDepthPass::run", args->_context, [=](gpu::Batch& batch) { _gpuTimer->begin(batch); batch.enableStereo(false); @@ -466,7 +466,7 @@ void SurfaceGeometryPass::run(const render::RenderContextPointer& renderContext, _diffusePass.getParameters()->setLinearDepthPosFar(args->getViewFrustum().getFarClip()); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("SurfaceGeometryPass::run", args->_context, [=](gpu::Batch& batch) { _gpuTimer->begin(batch); batch.enableStereo(false); diff --git a/libraries/render-utils/src/ToneMappingEffect.cpp b/libraries/render-utils/src/ToneMappingEffect.cpp index 72d692c5b2..ff036df3dd 100644 --- a/libraries/render-utils/src/ToneMappingEffect.cpp +++ b/libraries/render-utils/src/ToneMappingEffect.cpp @@ -62,7 +62,7 @@ void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& ligh init(); } auto framebufferSize = glm::ivec2(lightingBuffer->getDimensions()); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("ToneMappingEffect::render", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(destinationFramebuffer); diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp index 26dc1c6848..7553d16271 100644 --- a/libraries/render-utils/src/VelocityBufferPass.cpp +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -118,7 +118,7 @@ void VelocityBufferPass::run(const render::RenderContextPointer& renderContext, auto fullViewport = args->_viewport; - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("VelocityBufferPass::run", args->_context, [=](gpu::Batch& batch) { _gpuTimer->begin(batch); batch.enableStereo(false); diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp index 3d1fe33267..7a94f5d570 100644 --- a/libraries/render-utils/src/ZoneRenderer.cpp +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -170,7 +170,7 @@ void DebugZoneLighting::run(const render::RenderContextPointer& context, const I } - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("DebugZoneLighting::run", args->_context, [=](gpu::Batch& batch) { batch.setViewportTransform(args->_viewport); auto viewFrustum = args->getViewFrustum(); diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index b4ad713a7a..57334e8ab5 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -20,22 +20,13 @@ layout(location = 0) out vec4 outFragColor; void main() { vec2 fragUV = varTexCoord0; - - - - vec2 texelSize = taa_getTexelSize(); - - vec2 fragJitterPix = taa_getCurrentJitterSample(); - if (taa_unjitter()) { - fragUV -= fragJitterPix * texelSize; - } // Debug region before debug or fxaa region X -/* float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; + float distToRegionFXAA = fragUV.x - taa_getRegionFXAA().x; if (distToRegionFXAA > 0.0) { outFragColor = vec4(taa_evalFXAA(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 d276f2870d..6d5addba49 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -13,31 +13,6 @@ <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> -const int SEQUENCE_LENGTH = 16; -const int INFO_INDEX = SEQUENCE_LENGTH / 2; -struct JitterSequence { - vec4 offsets[INFO_INDEX + 1]; -}; -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)); -} - -int taa_getJitterSequenceLength() { - return floatBitsToInt(sequence.offsets[INFO_INDEX].z); -} - -int taa_getCurrentJitterIndex() { - return floatBitsToInt(sequence.offsets[INFO_INDEX].w); -} - -vec2 taa_getCurrentJitterSample() { - return taa_getJitterSample(taa_getCurrentJitterIndex()); -} - <@include gpu/Color.slh@> uniform sampler2D depthMap; @@ -67,27 +42,22 @@ bool taa_showDebugCursor() { return GET_BIT(params.flags.x, 1); } -bool taa_showJitterSequence() { - return GET_BIT(params.flags.x, 2); -} - bool taa_showClosestFragment() { return GET_BIT(params.flags.x, 3); } - -bool taa_unjitter() { - return GET_BIT(params.flags.y, 0); -} bool taa_constrainColor() { return GET_BIT(params.flags.y, 1); } + bool taa_covarianceClipColor() { return GET_BIT(params.flags.y, 2); } + bool taa_clipExactColor() { return GET_BIT(params.flags.y, 3); } + bool taa_feedbackColor() { return GET_BIT(params.flags.y, 4); } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 3d040af9db..8b32ee2fb0 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -28,10 +28,6 @@ void main(void) { vec2 imageSize = getWidthHeight(0); vec2 texelSize = getInvWidthHeight(); - vec2 fragJitterPix = taa_getCurrentJitterSample(); - - - vec2 pixPos = varTexCoord0 * imageSize; vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); @@ -44,7 +40,7 @@ void main(void) { vec2 cursorUVRaw = taa_getDebugCursorTexcoord(); vec2 cursorPosRaw = floor(cursorUVRaw * imageSize) + vec2(0.5); vec3 cursorFrag = taa_findClosestFragment3x3(cursorUVRaw); - vec2 cursorUV = cursorUVRaw - fragJitterPix * texelSize; + vec2 cursorUV = cursorUVRaw; vec2 cursorPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; vec2 cursorPrevUV = cursorUV - cursorVelocity; @@ -117,29 +113,6 @@ void main(void) { } } - 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))))) { - - float niceDotR2 = 4.0; - - //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); - float distToSample2 = dot(pixToSampleVec, pixToSampleVec); - if (distToSample2 < radius2) { - outFragColor = vec4(mix( outFragColor.rgb, colorRamp(float(s) / float(sequenceLength)), 1.0 - distToSample2 / radius2), 1.0); - return; - } - } - - } - } - // Debug region before debug or fxaa region X float distToRegionDebug = varTexCoord0.x - taa_getRegionDebug().x; float distToRegionFXAA = varTexCoord0.x - taa_getRegionFXAA().x; diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index 2be6f8fad2..eb01835a8c 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -286,7 +286,7 @@ void BlurGaussian::run(const RenderContextPointer& renderContext, const gpu::Fra _parameters->setWidthHeight(blurredFramebuffer->getWidth(), blurredFramebuffer->getHeight(), args->isStereo()); _parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, viewport)); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("BlurGaussian::run", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(viewport); @@ -401,7 +401,7 @@ void BlurGaussianDepthAware::run(const RenderContextPointer& renderContext, cons _parameters->setDepthPerspective(args->getViewFrustum().getProjection()[1][1]); _parameters->setLinearDepthPosFar(args->getViewFrustum().getFarClip()); - gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { + gpu::doInBatch("BlurGaussianDepthAware::run", args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); batch.setViewportTransform(sourceViewport); diff --git a/libraries/render/src/render/DrawSceneOctree.cpp b/libraries/render/src/render/DrawSceneOctree.cpp index 36663a454a..f663c2bb82 100644 --- a/libraries/render/src/render/DrawSceneOctree.cpp +++ b/libraries/render/src/render/DrawSceneOctree.cpp @@ -94,7 +94,7 @@ void DrawSceneOctree::run(const RenderContextPointer& renderContext, const ItemS std::static_pointer_cast(renderContext->jobConfig)->numFreeCells = (int)scene->getSpatialTree().getNumFreeCells(); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawSceneOctree::run", args->_context, [&](gpu::Batch& batch) { glm::mat4 projMat; Transform viewMat; args->getViewFrustum().evalProjectionMatrix(projMat); @@ -201,7 +201,7 @@ void DrawItemSelection::run(const RenderContextPointer& renderContext, const Ite RenderArgs* args = renderContext->args; auto& scene = renderContext->_scene; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawItemSelection::run", args->_context, [&](gpu::Batch& batch) { glm::mat4 projMat; Transform viewMat; args->getViewFrustum().evalProjectionMatrix(projMat); diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index 148e104453..6c636de382 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -163,7 +163,7 @@ void DrawStatus::run(const RenderContextPointer& renderContext, const ItemBounds } // Allright, something to render let's do it - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawStatus::run", args->_context, [&](gpu::Batch& batch) { glm::mat4 projMat; Transform viewMat; args->getViewFrustum().evalProjectionMatrix(projMat); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 0f4137e38d..088b641162 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -143,7 +143,7 @@ void DrawLight::run(const RenderContextPointer& renderContext, const ItemBounds& RenderArgs* args = renderContext->args; // render lights - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawLight::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; renderItems(renderContext, inLights, _maxDrawn); args->_batch = nullptr; @@ -191,7 +191,7 @@ void DrawBounds::run(const RenderContextPointer& renderContext, _drawBuffer->setData(numItems * sizeOfItemBound, (const gpu::Byte*) items.data()); - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawBounds::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; // Setup projection @@ -262,7 +262,7 @@ void DrawFrustum::run(const render::RenderContextPointer& renderContext, const I } // Render the frustums in wireframe - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("DrawFrustum::run", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); diff --git a/libraries/render/src/render/ResampleTask.cpp b/libraries/render/src/render/ResampleTask.cpp index 65c0ff45b9..07f7367582 100644 --- a/libraries/render/src/render/ResampleTask.cpp +++ b/libraries/render/src/render/ResampleTask.cpp @@ -66,7 +66,7 @@ void HalfDownsample::run(const RenderContextPointer& renderContext, const gpu::F const auto bufferSize = resampledFrameBuffer->getSize(); glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("HalfDownsample::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(resampledFrameBuffer); diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 566f7ee01a..26b9e09c09 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -85,21 +85,6 @@ Rectangle { onClicked: { Render.getConfig("RenderMainView.JitterCam").next(); } } } - Row { - spacing: 10 - 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 {} Column { spacing: 10 diff --git a/tests/gpu-test/src/TestWindow.cpp b/tests/gpu-test/src/TestWindow.cpp index 9ae78527cc..f5fc1cea85 100644 --- a/tests/gpu-test/src/TestWindow.cpp +++ b/tests/gpu-test/src/TestWindow.cpp @@ -114,14 +114,14 @@ void TestWindow::beginFrame() { // the rest of the renderDeferred inputs can be omitted #else - gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("TestWindow::beginFrame", _renderArgs->_context, [&](gpu::Batch& batch) { batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLORS, { 0.0f, 0.1f, 0.2f, 1.0f }); batch.clearDepthFramebuffer(1e4); batch.setViewportTransform({ 0, 0, _size.width() * devicePixelRatio(), _size.height() * devicePixelRatio() }); }); #endif - gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("TestWindow::beginFrame", _renderArgs->_context, [&](gpu::Batch& batch) { batch.setViewportTransform(_renderArgs->_viewport); batch.setStateScissorRect(_renderArgs->_viewport); batch.setProjectionTransform(_projectionMatrix); @@ -131,7 +131,7 @@ void TestWindow::beginFrame() { void TestWindow::endFrame() { #ifdef DEFERRED_LIGHTING RenderArgs* args = _renderContext->args; - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("TestWindow::endFrame::begin", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; auto deferredFboColorDepthStencil = _prepareDeferredOutputs.get0()->getDeferredFramebufferDepthColor(); batch.setViewportTransform(args->_viewport); @@ -144,7 +144,7 @@ void TestWindow::endFrame() { _renderDeferred.run(_renderContext, _renderDeferredInputs); - gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("TestWindow::endFrame::blit", _renderArgs->_context, [&](gpu::Batch& batch) { PROFILE_RANGE_BATCH(batch, "blit"); // Blit to screen auto framebufferCache = DependencyManager::get(); @@ -154,7 +154,7 @@ void TestWindow::endFrame() { }); #endif - gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("TestWindow::endFrame::finish", _renderArgs->_context, [&](gpu::Batch& batch) { batch.resetStages(); }); _glContext.swapBuffers(this); diff --git a/tests/gpu-test/src/main.cpp b/tests/gpu-test/src/main.cpp index d37be7c790..8aa70ce22f 100644 --- a/tests/gpu-test/src/main.cpp +++ b/tests/gpu-test/src/main.cpp @@ -146,7 +146,7 @@ class MyTestWindow : public TestWindow { return; } - gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { + gpu::doInBatch("main::renderFrame", _renderArgs->_context, [&](gpu::Batch& batch) { batch.setViewTransform(_camera); _renderArgs->_batch = &batch; _currentTest->renderTest(_currentTestId, _renderArgs); diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index c70a74cd7f..f964a01dab 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -921,7 +921,7 @@ private: void render(RenderArgs* renderArgs) { auto& gpuContext = renderArgs->_context; gpuContext->beginFrame(); - gpu::doInBatch(gpuContext, [&](gpu::Batch& batch) { + gpu::doInBatch("QTestWindow::render", gpuContext, [&](gpu::Batch& batch) { batch.resetStages(); }); PROFILE_RANGE(render, __FUNCTION__); diff --git a/tests/render-texture-load/src/main.cpp b/tests/render-texture-load/src/main.cpp index 67b80d9ba8..3dbb4987a4 100644 --- a/tests/render-texture-load/src/main.cpp +++ b/tests/render-texture-load/src/main.cpp @@ -561,12 +561,12 @@ private: void render() { auto& gpuContext = _renderThread._gpuContext; gpuContext->beginFrame(); - gpu::doInBatch(gpuContext, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderThread::render::begin", gpuContext, [&](gpu::Batch& batch) { batch.resetStages(); }); auto framebuffer = DependencyManager::get()->getFramebuffer(); - gpu::doInBatch(gpuContext, [&](gpu::Batch& batch) { + gpu::doInBatch("RenderThread::render", gpuContext, [&](gpu::Batch& batch) { batch.enableStereo(false); batch.setFramebuffer(framebuffer); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(1, 0, 0, 1)); From f4f0bb9c1c52382c6a8fd04d28030ca36bf1dd0a Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 18 Dec 2017 16:26:05 +0100 Subject: [PATCH 051/267] Fixed assert in Buffer update when switching to HMD simulator --- libraries/gpu/src/gpu/Buffer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/gpu/src/gpu/Buffer.cpp b/libraries/gpu/src/gpu/Buffer.cpp index 7ed2411c71..02e6c552cf 100644 --- a/libraries/gpu/src/gpu/Buffer.cpp +++ b/libraries/gpu/src/gpu/Buffer.cpp @@ -98,8 +98,8 @@ Buffer::Update::Update(const Buffer& parent) : buffer(parent) { void Buffer::Update::apply() const { // Make sure we're loaded in order - ++buffer._applyUpdateCount; - assert(buffer._applyUpdateCount.load() == updateNumber); + auto applyUpdateCount = ++buffer._applyUpdateCount; + assert(applyUpdateCount == updateNumber); const auto pageSize = buffer._pages._pageSize; buffer._renderSysmem.resize(size); buffer._renderPages.accommodate(size); From 9bc02ec564666ba55ef2a79866fa969e6c58283d Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 10 Jan 2018 21:01:26 -0800 Subject: [PATCH 052/267] simple changes to try debugging the stereo rendering --- interface/src/Application_render.cpp | 2 +- .../src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index 1231e5834b..49748b7d0a 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -216,7 +216,7 @@ void Application::runRenderFrame(RenderArgs* renderArgs) { // Make sure the WorldBox is in the scene // For the record, this one RenderItem is the first one we created and added to the scene. - // We could meoee that code elsewhere but you know... + // We could move that code elsewhere but you know... if (!render::Item::isValidID(WorldBoxRenderData::_item)) { auto worldBoxRenderData = std::make_shared(); auto worldBoxRenderPayload = std::make_shared(worldBoxRenderData); diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp index 6e397efbe5..9d73c21288 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp @@ -52,8 +52,8 @@ bool DebugHmdDisplayPlugin::internalActivate() { _eyeProjections[1][3] = vec4{ 0.000000000, 0.000000000, -0.0800003856, 0.000000000 }; _eyeInverseProjections[0] = glm::inverse(_eyeProjections[0]); _eyeInverseProjections[1] = glm::inverse(_eyeProjections[1]); - _eyeOffsets[0][3] = vec4{ -0.0327499993, 0.0, 0.0149999997, 1.0 }; - _eyeOffsets[1][3] = vec4{ 0.0327499993, 0.0, 0.0149999997, 1.0 }; + _eyeOffsets[0][3] = vec4{ -0.0327499993, 0.0, -0.0149999997, 1.0 }; + _eyeOffsets[1][3] = vec4{ 0.0327499993, 0.0, -0.0149999997, 1.0 }; _renderTargetSize = { 3024, 1680 }; _cullingProjection = _eyeProjections[0]; // This must come after the initialization, so that the values calculated @@ -63,10 +63,13 @@ bool DebugHmdDisplayPlugin::internalActivate() { } void DebugHmdDisplayPlugin::updatePresentPose() { + Parent::updatePresentPose(); +/* float yaw = sinf(secTimestampNow()) * 0.25f; float pitch = cosf(secTimestampNow()) * 0.25f; // Simulates head pose latency correction _currentPresentFrameInfo.presentPose = glm::mat4_cast(glm::angleAxis(yaw, Vectors::UP)) * glm::mat4_cast(glm::angleAxis(pitch, Vectors::RIGHT)); +*/ } From b7b478f640a04bcd6cc7bc4b862356946a6b829e Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 25 Jan 2018 17:33:18 +0100 Subject: [PATCH 053/267] Using proper inverse projection matrix in velocity buffer computation to reproject to world pos --- .../src/display-plugins/stereo/StereoDisplayPlugin.cpp | 1 + .../src/display-plugins/stereo/StereoDisplayPlugin.h | 2 +- libraries/plugins/src/plugins/DisplayPlugin.cpp | 7 ++++++- libraries/plugins/src/plugins/DisplayPlugin.h | 4 +--- libraries/render-utils/src/AntialiasingEffect.h | 6 +++--- libraries/render-utils/src/DeferredFrameTransform.cpp | 2 ++ libraries/render-utils/src/DeferredFrameTransform.h | 2 ++ libraries/render-utils/src/DeferredTransform.slh | 10 ++++++++++ .../render-utils/src/velocityBuffer_cameraMotion.slf | 6 +++--- 9 files changed, 29 insertions(+), 11 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp index ae8f9ec039..cfdfb1fc21 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp @@ -101,3 +101,4 @@ void StereoDisplayPlugin::internalDeactivate() { float StereoDisplayPlugin::getRecommendedAspectRatio() const { return aspect(Parent::getRecommendedRenderSize()); } + diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h index 3b481dce97..c4205ea1db 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h @@ -26,7 +26,7 @@ public: // the IPD at the Application level, the way we now allow with HMDs. // If that becomes an issue then we'll need to break up the functionality similar // to the HMD plugins. - // virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; + //virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; protected: virtual bool internalActivate() override; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.cpp b/libraries/plugins/src/plugins/DisplayPlugin.cpp index 2a8a72f594..47503e8f85 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.cpp +++ b/libraries/plugins/src/plugins/DisplayPlugin.cpp @@ -42,4 +42,9 @@ std::function Displa hudOperator = _hudOperator; } return hudOperator; -} \ No newline at end of file +} + +glm::mat4 HmdDisplay::getEyeToHeadTransform(Eye eye) const { + static const glm::mat4 xform; + return xform; +} diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 2c717f629c..e95084df52 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -93,9 +93,7 @@ class HmdDisplay : public StereoDisplay { public: // HMD specific methods // TODO move these into another class? - virtual glm::mat4 getEyeToHeadTransform(Eye eye) const { - static const glm::mat4 transform; return transform; - } + virtual glm::mat4 getEyeToHeadTransform(Eye eye) const; // returns a copy of the most recent head pose, computed via updateHeadPose virtual glm::mat4 getHeadPose() const { diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 1362a7c7b3..d201be3f73 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -58,7 +58,7 @@ class JitterSample { public: enum { - SEQUENCE_LENGTH = 16 + SEQUENCE_LENGTH = 128 }; using Config = JitterSampleConfig; @@ -106,12 +106,12 @@ class AntialiasingConfig : public render::Job::Config { public: AntialiasingConfig() : render::Job::Config(true) {} - float blend{ 0.1f }; + float blend{ 0.075f }; bool constrainColor{ true }; bool covarianceClipColor{ true }; - float covarianceGamma{ 1.0f }; + float covarianceGamma{ 0.9f }; bool clipExactColor{ false }; bool feedbackColor{ false }; diff --git a/libraries/render-utils/src/DeferredFrameTransform.cpp b/libraries/render-utils/src/DeferredFrameTransform.cpp index d6dc9e1372..34d3a56d23 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.cpp +++ b/libraries/render-utils/src/DeferredFrameTransform.cpp @@ -48,6 +48,7 @@ void DeferredFrameTransform::update(RenderArgs* args) { frameTransformBuffer.projection[0] = frameTransformBuffer.projectionMono; frameTransformBuffer.stereoInfo = glm::vec4(0.0f, (float)args->_viewport.z, 0.0f, 0.0f); frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / args->_viewport.z, 1.0f / args->_viewport.w, 0.0f, 0.0f); + frameTransformBuffer.invProjection[0] = glm::inverse(frameTransformBuffer.projection[0]); } else { mat4 projMats[2]; @@ -59,6 +60,7 @@ void DeferredFrameTransform::update(RenderArgs* args) { // Compose the mono Eye space to Stereo clip space Projection Matrix auto sideViewMat = projMats[i] * eyeViews[i]; frameTransformBuffer.projection[i] = sideViewMat; + frameTransformBuffer.invProjection[i] = glm::inverse(sideViewMat); } frameTransformBuffer.stereoInfo = glm::vec4(1.0f, (float)(args->_viewport.z >> 1), 0.0f, 1.0f); diff --git a/libraries/render-utils/src/DeferredFrameTransform.h b/libraries/render-utils/src/DeferredFrameTransform.h index a90effe053..0b5cb6a989 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.h +++ b/libraries/render-utils/src/DeferredFrameTransform.h @@ -45,6 +45,8 @@ protected: glm::vec4 stereoInfo{ 0.0 }; // Mono proj matrix or Left and Right proj matrix going from Mono Eye space to side clip space glm::mat4 projection[2]; + // Inverse proj matrix or Left and Right proj matrix going from Mono Eye space to side clip space + glm::mat4 invProjection[2]; // THe mono projection for sure glm::mat4 projectionMono; // Inv View matrix from eye space (mono) to world space diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index 25d352387f..eef32917d8 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -31,6 +31,7 @@ struct DeferredFrameTransform { vec4 _depthInfo; vec4 _stereoInfo; mat4 _projection[2]; + mat4 _invProjection[2]; mat4 _projectionMono; mat4 _viewInverse; mat4 _view; @@ -128,6 +129,15 @@ vec3 evalEyePositionFromZeye(int side, float Zeye, vec2 texcoord) { return vec3(Xe, Ye, Zeye); } +vec3 evalEyePositionFromZdb(int side, float Zdb, vec2 texcoord) { + // compute the view space position using the depth + vec3 clipPos; + clipPos.xy = texcoord.xy * 2.0 - 1.0; + clipPos.z = Zdb * 2.0 - 1.0; + vec4 eyePos = frameTransform._invProjection[side] * vec4(clipPos.xyz, 1.0); + return eyePos.xyz / eyePos.w; +} + ivec2 getPixelPosTexcoordPosAndSide(in vec2 glFragCoord, out ivec2 pixelPos, out vec2 texcoordPos, out ivec4 stereoSide) { ivec2 fragPos = ivec2(glFragCoord.xy); diff --git a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf index 7488f42535..d908ea24da 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -26,14 +26,14 @@ 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); -/* if (Zeye <= -getPosLinearDepthFar()) { +/* float Zeye = evalZeyeFromZdb(Zdb); + 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); + vec3 eyePos = evalEyePositionFromZdb(stereoSide.x, Zdb, texcoordPos); vec3 worldPos = (frameTransform._viewInverse * cameraCorrection._correction * vec4(eyePos, 1.0)).xyz; vec3 prevEyePos = (cameraCorrection._prevCorrectionInverse * frameTransform._prevView * vec4(worldPos, 1.0)).xyz; From 9cb5c95fe3058bb03c6b85220ab809c801ab78f1 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 26 Jan 2018 15:05:46 +0100 Subject: [PATCH 054/267] Added velocity buffer to deferredLighting.qml --- libraries/render-utils/src/DeferredTransform.slh | 3 +-- scripts/developer/utilities/render/deferredLighting.qml | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index eef32917d8..f1765978eb 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -132,8 +132,7 @@ vec3 evalEyePositionFromZeye(int side, float Zeye, vec2 texcoord) { vec3 evalEyePositionFromZdb(int side, float Zdb, vec2 texcoord) { // compute the view space position using the depth vec3 clipPos; - clipPos.xy = texcoord.xy * 2.0 - 1.0; - clipPos.z = Zdb * 2.0 - 1.0; + clipPos.xyz = vec3(texcoord.xy, Zdb) * 2.0 - 1.0; vec4 eyePos = frameTransform._invProjection[side] * vec4(clipPos.xyz, 1.0); return eyePos.xyz / eyePos.w; } diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 1da7871172..189d23c44f 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -200,6 +200,7 @@ Rectangle { 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 0f07d0b49378ae578fd653876d2e48e00b2baada Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 23 Jan 2018 11:43:29 -0300 Subject: [PATCH 055/267] Add bottom bar and address dialog (Android) --- android/app/build.gradle | 2 +- .../resources/icons/+android/backward.svg | 70 ++ .../resources/icons/+android/forward.svg | 71 ++ interface/resources/icons/+android/go-a.svg | 40 + interface/resources/icons/+android/go-i.svg | 40 + interface/resources/icons/+android/goto-a.svg | 28 + interface/resources/icons/+android/goto-i.svg | 28 + interface/resources/icons/+android/hide.svg | 947 ++++++++++++++++++ interface/resources/icons/+android/home.svg | 82 ++ .../resources/icons/+android/show-up.svg | 8 + .../qml/+android/AddressBarDialog.qml | 230 +++++ .../qml/hifi/+android/HifiConstants.qml | 54 + .../qml/hifi/+android/WindowHeader.qml | 113 +++ .../qml/hifi/+android/bottomHudOptions.qml | 89 ++ .../resources/qml/hifi/+android/bottombar.qml | 135 +++ .../resources/qml/hifi/+android/button.qml | 230 +++++ interface/src/Application.cpp | 2 + libraries/ui/src/QmlFragmentClass.cpp | 88 ++ libraries/ui/src/QmlFragmentClass.h | 45 + libraries/ui/src/ui/OffscreenQmlSurface.cpp | 13 +- scripts/+android/defaultScripts.js | 3 +- scripts/system/bottombar.js | 159 +++ scripts/system/goto-android.js | 96 ++ 23 files changed, 2570 insertions(+), 3 deletions(-) create mode 100644 interface/resources/icons/+android/backward.svg create mode 100644 interface/resources/icons/+android/forward.svg create mode 100755 interface/resources/icons/+android/go-a.svg create mode 100644 interface/resources/icons/+android/go-i.svg create mode 100755 interface/resources/icons/+android/goto-a.svg create mode 100644 interface/resources/icons/+android/goto-i.svg create mode 100644 interface/resources/icons/+android/hide.svg create mode 100644 interface/resources/icons/+android/home.svg create mode 100644 interface/resources/icons/+android/show-up.svg create mode 100644 interface/resources/qml/+android/AddressBarDialog.qml create mode 100644 interface/resources/qml/hifi/+android/HifiConstants.qml create mode 100644 interface/resources/qml/hifi/+android/WindowHeader.qml create mode 100644 interface/resources/qml/hifi/+android/bottomHudOptions.qml create mode 100644 interface/resources/qml/hifi/+android/bottombar.qml create mode 100644 interface/resources/qml/hifi/+android/button.qml create mode 100644 libraries/ui/src/QmlFragmentClass.cpp create mode 100644 libraries/ui/src/QmlFragmentClass.h create mode 100644 scripts/system/bottombar.js create mode 100644 scripts/system/goto-android.js diff --git a/android/app/build.gradle b/android/app/build.gradle index a2f008beef..97267258e2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,7 +23,7 @@ android { '-DRELEASE_NUMBER=' + RELEASE_NUMBER, '-DRELEASE_TYPE=' + RELEASE_TYPE, '-DBUILD_BRANCH=' + BUILD_BRANCH, - '-DDISABLE_QML=ON', + '-DDISABLE_QML=OFF', '-DDISABLE_KTX_CACHE=OFF' } } diff --git a/interface/resources/icons/+android/backward.svg b/interface/resources/icons/+android/backward.svg new file mode 100644 index 0000000000..ae0893fc66 --- /dev/null +++ b/interface/resources/icons/+android/backward.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/icons/+android/forward.svg b/interface/resources/icons/+android/forward.svg new file mode 100644 index 0000000000..d03c4097d7 --- /dev/null +++ b/interface/resources/icons/+android/forward.svg @@ -0,0 +1,71 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/icons/+android/go-a.svg b/interface/resources/icons/+android/go-a.svg new file mode 100755 index 0000000000..faecb15292 --- /dev/null +++ b/interface/resources/icons/+android/go-a.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/go-i.svg b/interface/resources/icons/+android/go-i.svg new file mode 100644 index 0000000000..0f1298d573 --- /dev/null +++ b/interface/resources/icons/+android/go-i.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/goto-a.svg b/interface/resources/icons/+android/goto-a.svg new file mode 100755 index 0000000000..5fb3e52e4c --- /dev/null +++ b/interface/resources/icons/+android/goto-a.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/goto-i.svg b/interface/resources/icons/+android/goto-i.svg new file mode 100644 index 0000000000..7613beb9e7 --- /dev/null +++ b/interface/resources/icons/+android/goto-i.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/hide.svg b/interface/resources/icons/+android/hide.svg new file mode 100644 index 0000000000..e09d517b08 --- /dev/null +++ b/interface/resources/icons/+android/hide.svg @@ -0,0 +1,947 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/home.svg b/interface/resources/icons/+android/home.svg new file mode 100644 index 0000000000..414c179e79 --- /dev/null +++ b/interface/resources/icons/+android/home.svg @@ -0,0 +1,82 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/icons/+android/show-up.svg b/interface/resources/icons/+android/show-up.svg new file mode 100644 index 0000000000..0736b9a794 --- /dev/null +++ b/interface/resources/icons/+android/show-up.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/interface/resources/qml/+android/AddressBarDialog.qml b/interface/resources/qml/+android/AddressBarDialog.qml new file mode 100644 index 0000000000..e07af24b8d --- /dev/null +++ b/interface/resources/qml/+android/AddressBarDialog.qml @@ -0,0 +1,230 @@ +// +// AddressBarDialog.qml +// +// Created by Austin Davis on 2015/04/14 +// 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 Hifi 1.0 +import QtQuick 2.4 +import "../controls" +import "../styles" +import "../hifi" as QmlHifi +import "../hifi/toolbars" +import "../styles-uit" as HifiStyles +import "../controls-uit" as HifiControls + +Item { + QmlHifi.HifiConstants { id: android } + + width: parent ? parent.width - android.dimen.windowLessWidth : 0 + height: parent ? parent.height - android.dimen.windowLessHeight : 0 + z: android.dimen.windowZ + anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom } + + id: bar + property bool isCursorVisible: false // Override default cursor visibility. + property bool shown: true + + onShownChanged: { + bar.visible = shown; + sendToScript({method: 'shownChanged', params: { shown: shown }}); + if (shown) { + updateLocationText(false); + } + } + + function hide() { + shown = false; + sendToScript ({ type: "hide" }); + } + + Component.onCompleted: { + updateLocationText(false); + } + + HifiConstants { id: hifi } + HifiStyles.HifiConstants { id: hifiStyleConstants } + + signal sendToScript(var message); + + AddressBarDialog { + id: addressBarDialog + } + + + Rectangle { + id: background + gradient: Gradient { + GradientStop { position: 0.0; color: android.color.gradientTop } + GradientStop { position: 1.0; color: android.color.gradientBottom } + } + anchors { + fill: parent + } + + QmlHifi.WindowHeader { + id: header + iconSource: "../../../icons/goto-i.svg" + titleText: "GO TO" + } + + HifiStyles.RalewayRegular { + id: notice + text: "YOUR LOCATION" + font.pixelSize: hifi.fonts.pixelSize * 2.15; + color: "#2CD7FF" + anchors { + bottom: addressBackground.top + bottomMargin: 45 + left: addressBackground.left + leftMargin: 60 + } + + } + + property int inputAreaHeight: 210 + property int inputAreaStep: (height - inputAreaHeight) / 2 + + ToolbarButton { + id: homeButton + y: 280 + imageURL: "../../icons/home.svg" + onClicked: { + addressBarDialog.loadHome(); + bar.shown = false; + } + anchors { + leftMargin: 75 + left: parent.left + } + size: 150 + } + + ToolbarButton { + id: backArrow; + imageURL: "../../icons/backward.svg"; + onClicked: addressBarDialog.loadBack(); + anchors { + left: homeButton.right + leftMargin: 70 + verticalCenter: homeButton.verticalCenter + } + size: 150 + } + ToolbarButton { + id: forwardArrow; + imageURL: "../../icons/forward.svg"; + onClicked: addressBarDialog.loadForward(); + anchors { + left: backArrow.right + leftMargin: 60 + verticalCenter: homeButton.verticalCenter + } + size: 150 + } + + HifiStyles.FiraSansRegular { + id: location; + font.pixelSize: addressLine.font.pixelSize; + color: "gray"; + clip: true; + anchors.fill: addressLine; + visible: addressLine.text.length === 0 + z: 1 + } + + Rectangle { + id: addressBackground + x: 780 + y: 280 + width: 1440 + height: 150 + color: "#FFFFFF" + } + + TextInput { + id: addressLine + focus: true + x: 870 + y: 450 + width: 1350 + height: 120 + inputMethodHints: Qt.ImhNoPredictiveText + //helperText: "Hint is here" + anchors { + verticalCenter: homeButton.verticalCenter + } + font.pixelSize: hifi.fonts.pixelSize * 3.75 + onTextChanged: { + //filterChoicesByText(); + updateLocationText(addressLine.text.length > 0); + if (!isCursorVisible && text.length > 0) { + isCursorVisible = true; + cursorVisible = true; + } + } + + onActiveFocusChanged: { + //cursorVisible = isCursorVisible && focus; + } + } + + + + function toggleOrGo() { + if (addressLine.text !== "") { + addressBarDialog.loadAddress(addressLine.text); + } + bar.shown = false; + } + + Keys.onPressed: { + switch (event.key) { + case Qt.Key_Escape: + case Qt.Key_Back: + clearAddressLineTimer.start(); + event.accepted = true + bar.shown = false; + break + case Qt.Key_Enter: + case Qt.Key_Return: + toggleOrGo(); + clearAddressLineTimer.start(); + event.accepted = true + break + } + } + + } + + Timer { + // Delay clearing address line so as to avoid flicker of "not connected" being displayed after entering an address. + id: clearAddressLineTimer + running: false + interval: 100 // ms + repeat: false + onTriggered: { + addressLine.text = ""; + isCursorVisible = false; + } + } + + function updateLocationText(enteringAddress) { + if (enteringAddress) { + notice.text = "Go to a place, @user, path or network address"; + notice.color = "#ffffff"; // hifiStyleConstants.colors.baseGrayHighlight; + location.visible = false; + } else { + notice.text = AddressManager.isConnected ? "YOUR LOCATION:" : "NOT CONNECTED"; + notice.color = AddressManager.isConnected ? hifiStyleConstants.colors.turquoise : hifiStyleConstants.colors.redHighlight; + // Display hostname, which includes ip address, localhost, and other non-placenames. + location.text = (AddressManager.placename || AddressManager.hostname || '') + (AddressManager.pathname ? AddressManager.pathname.match(/\/[^\/]+/)[0] : ''); + location.visible = true; + } + } + +} \ No newline at end of file diff --git a/interface/resources/qml/hifi/+android/HifiConstants.qml b/interface/resources/qml/hifi/+android/HifiConstants.qml new file mode 100644 index 0000000000..ee6d92ed38 --- /dev/null +++ b/interface/resources/qml/hifi/+android/HifiConstants.qml @@ -0,0 +1,54 @@ +// +// HifiAndroidConstants.qml +// interface/resources/qml/+android +// +// Created by Gabriel Calero & Cristian Duarte on 23 Oct 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.4 + +Item { + + id: android + + readonly property alias dimen: dimen + readonly property alias color: color + + Item { + id: dimen + readonly property real windowLessWidth: 126 + readonly property real windowLessHeight: 64 + + readonly property real windowZ: 100 + + readonly property real headerHeight: 276 + + readonly property real headerIconPosX: 90 + readonly property real headerIconPosY: 108 + readonly property real headerIconWidth: 111 + readonly property real headerIconHeight: 111 + readonly property real headerIconTitleDistance: 151 + + readonly property real headerHideWidth: 150 + readonly property real headerHideHeight: 150 + readonly property real headerHideRightMargin: 110 + readonly property real headerHideTopMargin: 90 + readonly property real headerHideIconWidth: 70 + readonly property real headerHideIconHeight: 45 + readonly property real headerHideTextTopMargin: 36 + + readonly property real botomHudWidth: 366 + readonly property real botomHudHeight: 180 + + } + + Item { + id: color + readonly property color gradientTop: "#4E4E4E" + readonly property color gradientBottom: "#242424" + } +} diff --git a/interface/resources/qml/hifi/+android/WindowHeader.qml b/interface/resources/qml/hifi/+android/WindowHeader.qml new file mode 100644 index 0000000000..4ec0a0c6e6 --- /dev/null +++ b/interface/resources/qml/hifi/+android/WindowHeader.qml @@ -0,0 +1,113 @@ +// +// WindowHeader.qml +// interface/resources/qml/android +// +// Created by Gabriel Calero & Cristian Duarte on 23 Oct 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 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 +import Qt.labs.settings 1.0 +import "." +import "../styles" as HifiStyles +import "../styles-uit" +import "../controls-uit" as HifiControlsUit +import "../controls" as HifiControls +import ".." + + +// header +Rectangle { + id: header + + // properties + property string iconSource: "" + property string titleText: "" + property var extraItemInCenter: Item {} + + HifiStyles.HifiConstants { id: hifiStylesConstants } + + /*property var mockRectangle: Rectangle { + anchors.fill: parent + color: "#44FFFF00" + }*/ + color: "#00000000" + //color: "#55FF0000" + width: parent.width + height: android.dimen.headerHeight + anchors.top : parent.top + + Image { + id: windowIcon + source: iconSource + x: android.dimen.headerIconPosX + y: android.dimen.headerIconPosY + width: android.dimen.headerIconWidth + height: android.dimen.headerIconHeight + } + + /*HifiStylesUit.*/FiraSansSemiBold { + id: windowTitle + x: windowIcon.x + android.dimen.headerIconTitleDistance + anchors.verticalCenter: windowIcon.verticalCenter + text: titleText + color: "#FFFFFF" + font.letterSpacing: 2 + font.pixelSize: hifiStylesConstants.fonts.headerPixelSize * 2.15 + } + Item { + height: 60 + anchors { + left: windowTitle.right + right: hideButton.left + verticalCenter: windowIcon.verticalCenter + } + children: [ extraItemInCenter/*, mockRectangle */] + } + + Rectangle { + id: hideButton + height: android.dimen.headerHideWidth + width: android.dimen.headerHideHeight + color: "#00000000" + //color: "#CC00FF00" + anchors { + top: parent.top + right: parent.right + rightMargin: android.dimen.headerHideRightMargin + topMargin: android.dimen.headerHideTopMargin + } + Image { + id: hideIcon + source: "../../../icons/hide.svg" + width: android.dimen.headerHideIconWidth + height: android.dimen.headerHideIconHeight + anchors { + horizontalCenter: parent.horizontalCenter + } + } + /*HifiStyles.*/FiraSansRegular { + anchors { + top: hideIcon.bottom + horizontalCenter: hideIcon.horizontalCenter + topMargin: android.dimen.headerHideTextTopMargin + } + text: "HIDE" + color: "#FFFFFF" + font.pixelSize: hifiStylesConstants.fonts.pixelSize * 2.15 + } + + MouseArea { + anchors.fill: parent + onClicked: { + hide(); + } + } + } +} \ No newline at end of file diff --git a/interface/resources/qml/hifi/+android/bottomHudOptions.qml b/interface/resources/qml/hifi/+android/bottomHudOptions.qml new file mode 100644 index 0000000000..860298149f --- /dev/null +++ b/interface/resources/qml/hifi/+android/bottomHudOptions.qml @@ -0,0 +1,89 @@ +// +// bottomHudOptions.qml +// interface/resources/qml/android +// +// Created by Cristian Duarte & Gabriel Calero on 24 Nov 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 Hifi 1.0 +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 +import Qt.labs.settings 1.0 +import "../../styles" as HifiStyles +import "../../styles-uit" +import "../../controls-uit" as HifiControlsUit +import "../../controls" as HifiControls +import ".." +import "." + +Item { + id: bottomHud + + property bool shown: false + + signal sendToScript(var message); + + HifiConstants { id: android } + + onShownChanged: { + bottomHud.visible = shown; + } + + function hide() { + shown = false; + } + + Rectangle { + anchors.fill : parent + color: "transparent" + Flow { + id: flowMain + spacing: 0 + flow: Flow.LeftToRight + layoutDirection: Flow.LeftToRight + anchors.fill: parent + anchors.margins: 12 + + Rectangle { + id: hideButton + height: android.dimen.headerHideWidth + width: android.dimen.headerHideHeight + color: "#00000000" + anchors { + horizontalCenter: parent.horizontalCenter + } + Image { + id: hideIcon + source: "../../../icons/show-up.svg" + width: android.dimen.headerHideIconWidth + height: android.dimen.headerHideIconHeight + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + sendToScript ({ method: "showUpBar" }); + } + } + } + } + } + + Component.onCompleted: { + width = android.dimen.botomHudWidth; + height = android.dimen.botomHudHeight; + x=Window.innerWidth - width; + y=Window.innerHeight - height; + } + +} diff --git a/interface/resources/qml/hifi/+android/bottombar.qml b/interface/resources/qml/hifi/+android/bottombar.qml new file mode 100644 index 0000000000..2a34b7fe19 --- /dev/null +++ b/interface/resources/qml/hifi/+android/bottombar.qml @@ -0,0 +1,135 @@ +// +// bottomHudOptions.qml +// interface/resources/qml/android +// +// Created by Gabriel Calero & Cristian Duarte on 19 Jan 2018 +// Copyright 2018 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 Hifi 1.0 +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 +import Qt.labs.settings 1.0 +import "../../styles" as Styles +import "../../styles-uit" +import "../../controls-uit" as HifiControlsUit +import "../../controls" as HifiControls +import ".." +import "." + +Item { + id: bar + x:0 + + property bool shown: true + + signal sendToScript(var message); + + onShownChanged: { + bar.visible = shown; + } + + function hide() { + //shown = false; + sendToScript({ method: "hide" }); + } + + Styles.HifiConstants { id: hifi } + HifiConstants { id: android } + + Rectangle { + id: background + anchors.fill : parent + color: "#FF000000" + border.color: "#FFFFFF" + anchors.bottomMargin: -1 + anchors.leftMargin: -1 + anchors.rightMargin: -1 + Flow { + id: flowMain + spacing: 10 + anchors.fill: parent + anchors.topMargin: 12 + anchors.bottomMargin: 12 + anchors.rightMargin: 12 + anchors.leftMargin: 72 + } + + + Rectangle { + id: hideButton + height: android.dimen.headerHideWidth + width: android.dimen.headerHideHeight + color: "#00000000" + anchors { + right: parent.right + rightMargin: android.dimen.headerHideRightMargin + top: parent.top + topMargin: android.dimen.headerHideTopMargin + } + + Image { + id: hideIcon + source: "../../../icons/hide.svg" + width: android.dimen.headerHideIconWidth + height: android.dimen.headerHideIconHeight + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + } + } + FiraSansRegular { + anchors { + top: hideIcon.bottom + horizontalCenter: hideIcon.horizontalCenter + topMargin: 12 + } + text: "HIDE" + color: "#FFFFFF" + font.pixelSize: hifi.fonts.pixelSize * 2.5; + } + + MouseArea { + anchors.fill: parent + onClicked: { + hide(); + } + } + } + } + + Component.onCompleted: { + // put on bottom + width = Window.innerWidth; + height = 255; + y = Window.innerHeight - height; + } + + function addButton(properties) { + var component = Qt.createComponent("button.qml"); + if (component.status == Component.Ready) { + var button = component.createObject(flowMain); + // copy all properites to button + var keys = Object.keys(properties).forEach(function (key) { + button[key] = properties[key]; + }); + return button; + } else if( component.status == Component.Error) { + console.log("Load button errors " + component.errorString()); + } + } + + function urlHelper(src) { + if (src.match(/\bhttp/)) { + return src; + } else { + return "../../../" + src; + } + } + +} diff --git a/interface/resources/qml/hifi/+android/button.qml b/interface/resources/qml/hifi/+android/button.qml new file mode 100644 index 0000000000..ec7af2ab92 --- /dev/null +++ b/interface/resources/qml/hifi/+android/button.qml @@ -0,0 +1,230 @@ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 + +Item { + id: button + property string icon: "icons/edit-icon.svg" + property string hoverIcon: button.icon + property string activeIcon: button.icon + property string activeHoverIcon: button.activeIcon + property int stableOrder: 0 + + property int iconSize: 165 + property string text: "." + property string hoverText: button.text + property string activeText: button.text + property string activeHoverText: button.activeText + + property string bgColor: "#ffffff" + property string hoverBgColor: button.bgColor + property string activeBgColor: button.bgColor + property string activeHoverBgColor: button.bgColor + + property real bgOpacity: 0 + property real hoverBgOpacity: 1 + property real activeBgOpacity: 0.5 + property real activeHoverBgOpacity: 1 + + property string textColor: "#ffffff" + property int textSize: 54 + property string hoverTextColor: "#ffffff" + property string activeTextColor: "#ffffff" + property string activeHoverTextColor: "#ffffff" + property int bottomMargin: 30 + + property bool isEntered: false + property double sortOrder: 100 + + property bool isActive: false + + signal clicked() + + onIsActiveChanged: { + if (button.isEntered) { + button.state = (button.isActive) ? "hover active state" : "hover state"; + } else { + button.state = (button.isActive) ? "active state" : "base state"; + } + } + + function editProperties(props) { + for (var prop in props) { + button[prop] = props[prop]; + } + } + + + width: 300 + height: 300 + + Rectangle { + id: buttonBg + color: bgColor + opacity: bgOpacity + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + anchors.top: parent.top + anchors.topMargin: 0 + } + Image { + id: icon + width: iconSize + height: iconSize + anchors.bottom: text.top + anchors.bottomMargin: 6 + anchors.horizontalCenter: parent.horizontalCenter + fillMode: Image.Stretch + source: urlHelper(button.icon) + } + FontLoader { + id: firaSans + source: "../../../fonts/FiraSans-Regular.ttf" + } + Text { + id: text + color: "#ffffff" + text: button.text + font.family: "FiraSans" + //font.bold: true + font.pixelSize: textSize + anchors.bottom: parent.bottom + anchors.bottomMargin: bottomMargin + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + } + MouseArea { + anchors.fill: parent + hoverEnabled: true + enabled: true + onClicked: { + console.log("Bottom bar button clicked!!"); + /*if (tabletButton.inDebugMode) { + if (tabletButton.isActive) { + tabletButton.isActive = false; + } else { + tabletButton.isActive = true; + } + }*/ + button.clicked(); + /*if (tabletRoot) { + tabletRoot.playButtonClickSound(); + }*/ + } + onEntered: { + button.isEntered = true; + if (button.isActive) { + button.state = "hover active state"; + } else { + button.state = "hover state"; + } + } + onExited: { + button.isEntered = false; + if (button.isActive) { + button.state = "active state"; + } else { + button.state = "base state"; + } + } + } + states: [ + State { + name: "hover state" + + PropertyChanges { + target: buttonBg + //color: "#cfcfcf" + //opacity: 1 + color: button.hoverBgColor + opacity: button.hoverBgOpacity + } + + PropertyChanges { + target: text + //color: "#ffffff" + color: button.hoverTextColor + text: button.hoverText + } + + PropertyChanges { + target: icon + source: urlHelper(button.hoverIcon) + } + }, + State { + name: "active state" + + PropertyChanges { + target: buttonBg + //color: "#1fc6a6" + //opacity: 1 + color: button.activeBgColor + opacity: button.activeBgOpacity + } + + PropertyChanges { + target: text + //color: "#333333" + color: button.activeTextColor + text: button.activeText + } + + PropertyChanges { + target: icon + source: urlHelper(button.activeIcon) + } + }, + State { + name: "hover active state" + + PropertyChanges { + target: buttonBg + //color: "#ff0000" + //opacity: 1 + color: button.activeHoverBgColor + opacity: button.activeHoverBgOpacity + } + + PropertyChanges { + target: text + //color: "#333333" + color: button.activeHoverTextColor + text: button.activeHoverText + } + + PropertyChanges { + target: icon + source: urlHelper(button.activeHoverIcon) + } + }, + State { + name: "base state" + + PropertyChanges { + target: buttonBg + //color: "#9A9A9A" + //opacity: 0.1 + color: button.bgColor + opacity: button.bgOpacity + } + + PropertyChanges { + target: text + //color: "#ffffff" + color: button.textColor + text: button.text + } + + PropertyChanges { + target: icon + source: urlHelper(button.icon) + } + } + ] +} \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 48c15439ab..00c0dd8387 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -138,6 +138,7 @@ #include #include #include +#include #include #include #include @@ -5863,6 +5864,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe scriptEngine->registerFunction("OverlayWebWindow", QmlWebWindowClass::constructor); #endif scriptEngine->registerFunction("OverlayWindow", QmlWindowClass::constructor); + scriptEngine->registerFunction("QmlFragment", QmlFragmentClass::constructor); scriptEngine->registerGlobalObject("Menu", MenuScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("DesktopPreviewProvider", DependencyManager::get().data()); diff --git a/libraries/ui/src/QmlFragmentClass.cpp b/libraries/ui/src/QmlFragmentClass.cpp new file mode 100644 index 0000000000..ff67022305 --- /dev/null +++ b/libraries/ui/src/QmlFragmentClass.cpp @@ -0,0 +1,88 @@ +// +// Created by Gabriel Calero & Cristian Duarte on Aug 25, 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 "QmlFragmentClass.h" + +#include +#include +#include + +#include + +#include "OffscreenUi.h" + + +std::mutex QmlFragmentClass::_mutex; +std::map QmlFragmentClass::_fragments; + +QmlFragmentClass::QmlFragmentClass(QString id) : + qml(id) { +} +// Method called by Qt scripts to create a new bottom menu bar in Android +QScriptValue QmlFragmentClass::constructor(QScriptContext* context, QScriptEngine* engine) { + + std::lock_guard guard(_mutex); + auto qml = context->argument(0).toVariant().toMap().value("qml"); + if (qml.isValid()) { + // look up tabletId in the map. + auto iter = _fragments.find(qml.toString()); + if (iter != _fragments.end()) { + //qDebug() << "[QML-ANDROID] QmlFragmentClass menu already exists"; + return iter->second; + } + } else { + qWarning() << "QmlFragmentClass could not build instance " << qml; + return QScriptValue(); + } + + auto properties = parseArguments(context); + auto offscreenUi = DependencyManager::get(); + QmlFragmentClass* retVal = new QmlFragmentClass(qml.toString()); + Q_ASSERT(retVal); + if (QThread::currentThread() != qApp->thread()) { + retVal->moveToThread(qApp->thread()); + BLOCKING_INVOKE_METHOD(retVal, "initQml", Q_ARG(QVariantMap, properties)); + } else { + retVal->initQml(properties); + } + connect(engine, &QScriptEngine::destroyed, retVal, &QmlWindowClass::deleteLater); + QScriptValue scriptObject = engine->newQObject(retVal); + _fragments[qml.toString()] = scriptObject; + return scriptObject; +} + +void QmlFragmentClass::close() { + QmlWindowClass::close(); + _fragments.erase(qml); +} + +QObject* QmlFragmentClass::addButton(const QVariant& properties) { + QVariant resultVar; + Qt::ConnectionType connectionType = Qt::AutoConnection; + + if (QThread::currentThread() != _qmlWindow->thread()) { + connectionType = Qt::BlockingQueuedConnection; + } + bool hasResult = QMetaObject::invokeMethod(_qmlWindow, "addButton", connectionType, + Q_RETURN_ARG(QVariant, resultVar), Q_ARG(QVariant, properties)); + if (!hasResult) { + qWarning() << "QmlFragmentClass addButton has no result"; + return NULL; + } + + QObject* qmlButton = qvariant_cast(resultVar); + if (!qmlButton) { + qWarning() << "QmlFragmentClass addButton result not a QObject"; + return NULL; + } + + return qmlButton; +} + +void QmlFragmentClass::removeButton(QObject* button) { +} diff --git a/libraries/ui/src/QmlFragmentClass.h b/libraries/ui/src/QmlFragmentClass.h new file mode 100644 index 0000000000..87c18a49ad --- /dev/null +++ b/libraries/ui/src/QmlFragmentClass.h @@ -0,0 +1,45 @@ +// +// Created by Gabriel Calero & Cristian Duarte on Aug 25, 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_ui_QmlFragmentClass_h +#define hifi_ui_QmlFragmentClass_h + +#include "QmlWindowClass.h" + +class QmlFragmentClass : public QmlWindowClass { + Q_OBJECT +public: + QmlFragmentClass(QString id); + static QScriptValue constructor(QScriptContext* context, QScriptEngine* engine); + + /**jsdoc + * Creates a new button, adds it to this and returns it. + * @function QmlFragmentClass#addButton + * @param properties {Object} button properties + * @returns {TabletButtonProxy} + */ + Q_INVOKABLE QObject* addButton(const QVariant& properties); + + /* + * TODO - not yet implemented + */ + Q_INVOKABLE void removeButton(QObject* tabletButtonProxy); +public slots: + Q_INVOKABLE void close(); + +protected: + QString qmlSource() const override { return qml; } + + static std::mutex _mutex; + static std::map _fragments; +private: + QString qml; + +}; + +#endif diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index db3df34dc5..a22a5e5a5f 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -28,7 +28,7 @@ #include #include #include - +#include #include #include #include @@ -1136,6 +1136,17 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even } break; } + case QEvent::InputMethod: + case QEvent::InputMethodQuery: { + if (_quickWindow && _quickWindow->activeFocusItem()) { + event->ignore(); + if (QCoreApplication::sendEvent(_quickWindow->activeFocusItem(), event)) { + return event->isAccepted(); + } + return false; + } + break; + } #endif default: break; diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js index 54c899d1da..a85b7e2208 100644 --- a/scripts/+android/defaultScripts.js +++ b/scripts/+android/defaultScripts.js @@ -13,7 +13,8 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/progress.js", - "system/touchscreenvirtualpad.js"/*, + "system/touchscreenvirtualpad.js", + "system/bottombar.js"/*, "system/away.js", "system/controllers/controllerDisplayManager.js", "system/controllers/handControllerGrabAndroid.js", diff --git a/scripts/system/bottombar.js b/scripts/system/bottombar.js new file mode 100644 index 0000000000..064025f392 --- /dev/null +++ b/scripts/system/bottombar.js @@ -0,0 +1,159 @@ +"use strict"; +// +// bottombar.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on Jan 18, 2018 +// Copyright 2018 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() { // BEGIN LOCAL_SCOPE + +var bottombar; +var bottomHudOptionsBar; +var gotoBtn; + +var gotoScript = Script.require('./goto-android.js'); + +var logEnabled = false; + +function printd(str) { + if (logEnabled) { + print("[bottombar.js] " + str); + } +} + +function init() { + gotoScript.init(); + gotoScript.setOnShownChange(function (shown) { + if (shown) { + showAddressBar(); + } else { + hideAddressBar(); + } + }); + + setupBottomBar(); + setupBottomHudOptionsBar(); + + raiseBottomBar(); + +} + +function shutdown() { +} + +function setupBottomBar() { + bottombar = new QmlFragment({ + qml: "hifi/bottombar.qml" + }); + + bottombar.fromQml.connect(function(message) { + switch (message.method) { + case 'hide': + lowerBottomBar(); + break; + default: + print('[bottombar.js] Unrecognized message from bottomHud.qml:', JSON.stringify(message)); + } + }); + + + gotoBtn = bottombar.addButton({ + icon: "icons/goto-i.svg", + activeIcon: "icons/goto-a.svg", + bgOpacity: 0, + hoverBgOpacity: 0, + activeBgOpacity: 0, + activeHoverBgOpacity: 0, + height: 240, + width: 300, + iconSize: 108, + textSize: 45, + text: "GO TO" + }); + + gotoBtn.clicked.connect(function() { + if (!gotoScript.isVisible()) { + showAddressBar(); + } else { + hideAddressBar(); + } + }); + + // TODO: setup all the buttons or provide a dynamic interface + + raiseBottomBar(); + + +} + +var setupBottomHudOptionsBar = function() { + var bottomHud = new QmlFragment({ + qml: "hifi/bottomHudOptions.qml" + }); + + bottomHudOptionsBar = { + show: function() { + bottomHud.setVisible(true); + }, + hide: function() { + bottomHud.setVisible(false); + }, + qmlFragment: bottomHud + }; + bottomHud.fromQml.connect( + function(message) { + switch (message.method) { + case 'showUpBar': + printd('[bottombar.js] showUpBar message from bottomHudOptions.qml: ', JSON.stringify(message)); + raiseBottomBar(); + break; + default: + print('[bottombar.js] Unrecognized message from bottomHudOptions.qml:', JSON.stringify(message)); + } + } + ); +} + +function lowerBottomBar() { + if (bottombar) { + bottombar.setVisible(false); + } + if (bottomHudOptionsBar) { + bottomHudOptionsBar.show(); + } +} + +function raiseBottomBar() { + print('[bottombar.js] raiseBottomBar begin'); + if (bottombar) { + bottombar.setVisible(true); + } + if (bottomHudOptionsBar) { + bottomHudOptionsBar.hide(); + } + print('[bottombar.js] raiseBottomBar end'); +} + +function showAddressBar() { + gotoScript.show(); + gotoBtn.isActive = true; +} + +function hideAddressBar() { + gotoScript.hide(); + gotoBtn.isActive = false; +} + + + +Script.scriptEnding.connect(function () { + shutdown(); +}); + +init(); + +}()); // END LOCAL_SCOPE diff --git a/scripts/system/goto-android.js b/scripts/system/goto-android.js new file mode 100644 index 0000000000..e917455128 --- /dev/null +++ b/scripts/system/goto-android.js @@ -0,0 +1,96 @@ +"use strict"; +// +// goto-android.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on 12 Sep 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 +// + +var window; + + +var logEnabled = false; +function printd(str) { + if (logEnabled) + print("[goto-android.js] " + str); +} + +function init() { +} + +function fromQml(message) { // messages are {method, params}, like json-rpc. See also sendToQml. + switch (message.method) { + case 'shownChanged': + if (notifyShownChange) { + notifyShownChange(message.params.shown); + } ; + break; + case 'hide': + module.exports.hide(); + module.exports.onHidden(); + break; + default: + print('[goto-android.js] Unrecognized message from AddressBarDialog.qml:', JSON.stringify(message)); + } +} + +function sendToQml(message) { + window.sendToQml(message); +} + +var isVisible = false; +var notifyShownChange; +module.exports = { + init: function() { + window = new QmlFragment({ + qml: "AddressBarDialog.qml", + visible: false + }); + }, + show: function() { + Controller.setVPadEnabled(false); + if (window) { + window.fromQml.connect(fromQml); + window.setVisible(true); + isVisible = true; + } + }, + hide: function() { + Controller.setVPadEnabled(true); + if (window) { + window.fromQml.disconnect(fromQml); + window.setVisible(false); + } + isVisible = false; + }, + destroy: function() { + if (window) { + window.close(); + window = null; + } + }, + isVisible: function() { + return isVisible; + }, + width: function() { + return window ? window.size.x : 0; + }, + height: function() { + return window ? window.size.y : 0; + }, + position: function() { + return window && isVisible ? window.position : null; + }, + setOnShownChange: function(f) { + notifyShownChange = f; + }, + onHidden: function() { } + + +}; + +init(); From a7c77a5247987b93de35f683e63eafa4d693a80f Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 25 Jan 2018 12:36:56 -0300 Subject: [PATCH 056/267] Fix undefined color in address bar --- interface/resources/qml/+android/AddressBarDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/+android/AddressBarDialog.qml b/interface/resources/qml/+android/AddressBarDialog.qml index e07af24b8d..0b12301561 100644 --- a/interface/resources/qml/+android/AddressBarDialog.qml +++ b/interface/resources/qml/+android/AddressBarDialog.qml @@ -220,7 +220,7 @@ Item { location.visible = false; } else { notice.text = AddressManager.isConnected ? "YOUR LOCATION:" : "NOT CONNECTED"; - notice.color = AddressManager.isConnected ? hifiStyleConstants.colors.turquoise : hifiStyleConstants.colors.redHighlight; + notice.color = AddressManager.isConnected ? hifiStyleConstants.colors.blueHighlight : hifiStyleConstants.colors.redHighlight; // Display hostname, which includes ip address, localhost, and other non-placenames. location.text = (AddressManager.placename || AddressManager.hostname || '') + (AddressManager.pathname ? AddressManager.pathname.match(/\/[^\/]+/)[0] : ''); location.visible = true; From 8093ed7c5ca92954f51d66f4e08b5d70cad644cc Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 26 Jan 2018 17:49:08 -0300 Subject: [PATCH 057/267] Add audio bar to mute/unmute the mic --- .../resources/icons/+android/mic-mute-a.svg | 18 +++++ .../resources/icons/+android/mic-mute-i.svg | 21 ++++++ .../resources/icons/+android/mic-unmute-a.svg | 70 ++++++++++++++++++ .../resources/icons/+android/mic-unmute-i.svg | 22 ++++++ .../resources/qml/hifi/+android/AudioBar.qml | 71 +++++++++++++++++++ scripts/+android/defaultScripts.js | 5 +- scripts/system/+android/audio.js | 67 +++++++++++++++++ scripts/system/{ => +android}/bottombar.js | 2 +- .../{goto-android.js => +android/goto.js} | 0 .../{ => +android}/touchscreenvirtualpad.js | 2 +- 10 files changed, 274 insertions(+), 4 deletions(-) create mode 100644 interface/resources/icons/+android/mic-mute-a.svg create mode 100644 interface/resources/icons/+android/mic-mute-i.svg create mode 100644 interface/resources/icons/+android/mic-unmute-a.svg create mode 100644 interface/resources/icons/+android/mic-unmute-i.svg create mode 100644 interface/resources/qml/hifi/+android/AudioBar.qml create mode 100644 scripts/system/+android/audio.js rename scripts/system/{ => +android}/bottombar.js (98%) rename scripts/system/{goto-android.js => +android/goto.js} (100%) rename scripts/system/{ => +android}/touchscreenvirtualpad.js (93%) diff --git a/interface/resources/icons/+android/mic-mute-a.svg b/interface/resources/icons/+android/mic-mute-a.svg new file mode 100644 index 0000000000..73555ce21b --- /dev/null +++ b/interface/resources/icons/+android/mic-mute-a.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/mic-mute-i.svg b/interface/resources/icons/+android/mic-mute-i.svg new file mode 100644 index 0000000000..56e33eab6b --- /dev/null +++ b/interface/resources/icons/+android/mic-mute-i.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/mic-unmute-a.svg b/interface/resources/icons/+android/mic-unmute-a.svg new file mode 100644 index 0000000000..bb28dc0f2b --- /dev/null +++ b/interface/resources/icons/+android/mic-unmute-a.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/icons/+android/mic-unmute-i.svg b/interface/resources/icons/+android/mic-unmute-i.svg new file mode 100644 index 0000000000..76f98d7f0c --- /dev/null +++ b/interface/resources/icons/+android/mic-unmute-i.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/interface/resources/qml/hifi/+android/AudioBar.qml b/interface/resources/qml/hifi/+android/AudioBar.qml new file mode 100644 index 0000000000..f524595ef5 --- /dev/null +++ b/interface/resources/qml/hifi/+android/AudioBar.qml @@ -0,0 +1,71 @@ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 +import Qt.labs.settings 1.0 +import "../../styles-uit" +import "../../controls-uit" as HifiControlsUit +import "../../controls" as HifiControls +import ".." + +Item { + id: bar + x:0 + y:0 + width: 300 + height: 300 + z: -1 + + signal sendToScript(var message); + signal windowClosed(); + + property bool shown: true + + onShownChanged: { + bar.visible = shown; + } + + Rectangle { + anchors.fill : parent + color: "transparent" + Flow { + id: flowMain + spacing: 10 + flow: Flow.TopToBottom + layoutDirection: Flow.TopToBottom + anchors.fill: parent + anchors.margins: 4 + } + } + + Component.onCompleted: { + // put on bottom + x = 0; + y = 0; + width = 300; + height = 300; + } + + function addButton(properties) { + var component = Qt.createComponent("button.qml"); + if (component.status == Component.Ready) { + var button = component.createObject(flowMain); + // copy all properites to button + var keys = Object.keys(properties).forEach(function (key) { + button[key] = properties[key]; + }); + return button; + } else if( component.status == Component.Error) { + console.log("Load button errors " + component.errorString()); + } + } + + function urlHelper(src) { + if (src.match(/\bhttp/)) { + return src; + } else { + return "../../../" + src; + } + } + +} diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js index a85b7e2208..2a4af9afbf 100644 --- a/scripts/+android/defaultScripts.js +++ b/scripts/+android/defaultScripts.js @@ -13,8 +13,9 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/progress.js", - "system/touchscreenvirtualpad.js", - "system/bottombar.js"/*, + "system/+android/touchscreenvirtualpad.js", + "system/+android/bottombar.js", + "system/+android/audio.js" /*, "system/away.js", "system/controllers/controllerDisplayManager.js", "system/controllers/handControllerGrabAndroid.js", diff --git a/scripts/system/+android/audio.js b/scripts/system/+android/audio.js new file mode 100644 index 0000000000..b4f156d4bf --- /dev/null +++ b/scripts/system/+android/audio.js @@ -0,0 +1,67 @@ +"use strict"; +// +// audio.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on Jan 16, 2018 +// Copyright 2018 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() { // BEGIN LOCAL_SCOPE + +var audiobar; +var audioButton; + +var logEnabled = true; + +function printd(str) { + if (logEnabled) + print("[audio.js] " + str); +} + +function init() { + audiobar = new QmlFragment({ + qml: "hifi/AudioBar.qml" + }); + + audioButton = audiobar.addButton({ + icon: "icons/mic-unmute-a.svg", + activeIcon: "icons/mic-mute-a.svg", + text: "", + bgOpacity: 0.0, + activeBgOpacity: 0.0, + bgColor: "#FFFFFF" + }); + + onMuteToggled(); + + audioButton.clicked.connect(onMuteClicked); + Audio.mutedChanged.connect(onMuteToggled); +} + +function onMuteClicked() { + printd("On Mute Clicked"); + //Menu.setIsOptionChecked("Mute Microphone", !Menu.isOptionChecked("Mute Microphone")); + Audio.muted = !Audio.muted; + onMuteToggled(); +} + +function onMuteToggled() { + printd("On Mute Toggled"); + audioButton.isActive = Audio.muted; // Menu.isOptionChecked("Mute Microphone") + printd("Audio button is active: " + audioButton.isActive); +} + +Script.scriptEnding.connect(function () { + if(audioButton) { + audioButton.clicked.disconnect(onMuteClicked); + Audio.mutedChanged.connect(onMuteToggled); + } +}); + +init(); + +}()); // END LOCAL_SCOPE diff --git a/scripts/system/bottombar.js b/scripts/system/+android/bottombar.js similarity index 98% rename from scripts/system/bottombar.js rename to scripts/system/+android/bottombar.js index 064025f392..e58840ad6f 100644 --- a/scripts/system/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -15,7 +15,7 @@ var bottombar; var bottomHudOptionsBar; var gotoBtn; -var gotoScript = Script.require('./goto-android.js'); +var gotoScript = Script.require('./goto.js'); var logEnabled = false; diff --git a/scripts/system/goto-android.js b/scripts/system/+android/goto.js similarity index 100% rename from scripts/system/goto-android.js rename to scripts/system/+android/goto.js diff --git a/scripts/system/touchscreenvirtualpad.js b/scripts/system/+android/touchscreenvirtualpad.js similarity index 93% rename from scripts/system/touchscreenvirtualpad.js rename to scripts/system/+android/touchscreenvirtualpad.js index e6f9204d4d..fa41a2b5e0 100644 --- a/scripts/system/touchscreenvirtualpad.js +++ b/scripts/system/+android/touchscreenvirtualpad.js @@ -1,6 +1,6 @@ "use strict"; // -// android.js +// touchscreenvirtualpad.js // scripts/system/ // // Created by Gabriel Calero & Cristian Duarte on Jan 16, 2018 From 917cbd73b19622933ae7cc16ca871d4f90b4c75a Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 26 Jan 2018 17:50:16 -0300 Subject: [PATCH 058/267] Don't show help on android. Hide menu bar --- interface/src/Application.cpp | 2 ++ .../src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 00c0dd8387..6fec6f1d72 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2826,7 +2826,9 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { // If this is a first run we short-circuit the address passed in if (firstRun.get()) { +#if !defined(Q_OS_ANDROID) showHelp(); +#endif if (sandboxIsRunning) { qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home."; DependencyManager::get()->goToLocalSandbox(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index f1fefc9425..1a1714ad56 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -72,6 +72,9 @@ void Basic2DWindowOpenGLDisplayPlugin::uncustomizeContext() { bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { _framerateActions.clear(); +#if defined(Q_OS_ANDROID) + _container->setFullscreen(nullptr, true); +#endif _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), FULLSCREEN, [this](bool clicked) { if (clicked) { From d5e101c2e8f4ae35c52f75a410a3932521fdb646 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 24 Jan 2018 12:29:58 -0300 Subject: [PATCH 059/267] Add mode selector (my view / radar), not finished --- .../resources/icons/+android/myview-a.svg | 56 ++++++ .../resources/icons/+android/myview-hover.svg | 54 +++++ .../resources/icons/+android/myview-i.svg | 56 ++++++ .../resources/icons/+android/radar-a.svg | 1 + .../resources/icons/+android/radar-hover.svg | 1 + .../resources/icons/+android/radar-i.svg | 1 + .../resources/qml/hifi/+android/modesbar.qml | 73 +++++++ scripts/+android/defaultScripts.js | 3 +- scripts/system/+android/modes.js | 187 ++++++++++++++++++ 9 files changed, 431 insertions(+), 1 deletion(-) create mode 100755 interface/resources/icons/+android/myview-a.svg create mode 100755 interface/resources/icons/+android/myview-hover.svg create mode 100755 interface/resources/icons/+android/myview-i.svg create mode 100755 interface/resources/icons/+android/radar-a.svg create mode 100755 interface/resources/icons/+android/radar-hover.svg create mode 100755 interface/resources/icons/+android/radar-i.svg create mode 100644 interface/resources/qml/hifi/+android/modesbar.qml create mode 100644 scripts/system/+android/modes.js diff --git a/interface/resources/icons/+android/myview-a.svg b/interface/resources/icons/+android/myview-a.svg new file mode 100755 index 0000000000..307b559c95 --- /dev/null +++ b/interface/resources/icons/+android/myview-a.svg @@ -0,0 +1,56 @@ + + + +image/svg+xmlAsset 3 \ No newline at end of file diff --git a/interface/resources/icons/+android/myview-hover.svg b/interface/resources/icons/+android/myview-hover.svg new file mode 100755 index 0000000000..49656ad294 --- /dev/null +++ b/interface/resources/icons/+android/myview-hover.svg @@ -0,0 +1,54 @@ + + + +image/svg+xmlAsset 3 \ No newline at end of file diff --git a/interface/resources/icons/+android/myview-i.svg b/interface/resources/icons/+android/myview-i.svg new file mode 100755 index 0000000000..574f51c615 --- /dev/null +++ b/interface/resources/icons/+android/myview-i.svg @@ -0,0 +1,56 @@ + + + +image/svg+xmlAsset 3 \ No newline at end of file diff --git a/interface/resources/icons/+android/radar-a.svg b/interface/resources/icons/+android/radar-a.svg new file mode 100755 index 0000000000..e4b157f827 --- /dev/null +++ b/interface/resources/icons/+android/radar-a.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/interface/resources/icons/+android/radar-hover.svg b/interface/resources/icons/+android/radar-hover.svg new file mode 100755 index 0000000000..e4b157f827 --- /dev/null +++ b/interface/resources/icons/+android/radar-hover.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/interface/resources/icons/+android/radar-i.svg b/interface/resources/icons/+android/radar-i.svg new file mode 100755 index 0000000000..3994a775d3 --- /dev/null +++ b/interface/resources/icons/+android/radar-i.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/interface/resources/qml/hifi/+android/modesbar.qml b/interface/resources/qml/hifi/+android/modesbar.qml new file mode 100644 index 0000000000..8ce455c2c1 --- /dev/null +++ b/interface/resources/qml/hifi/+android/modesbar.qml @@ -0,0 +1,73 @@ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 +import Qt.labs.settings 1.0 +import "../../styles-uit" +import "../../controls-uit" as HifiControlsUit +import "../../controls" as HifiControls +import ".." + +Item { + id: modesbar + y:60 + Rectangle { + anchors.fill : parent + color: "transparent" + Flow { + id: flowMain + spacing: 0 + flow: Flow.TopToBottom + layoutDirection: Flow.TopToBottom + anchors.fill: parent + anchors.margins: 4 + } + } + + Component.onCompleted: { + width = 330; + height = 330; + x=Window.innerWidth - width; + } + + function addButton(properties) { + var component = Qt.createComponent("button.qml"); + console.log("load button"); + if (component.status == Component.Ready) { + console.log("load button 2"); + var button = component.createObject(flowMain); + // copy all properites to button + var keys = Object.keys(properties).forEach(function (key) { + button[key] = properties[key]; + }); + return button; + } else if( component.status == Component.Error) { + console.log("Load button errors " + component.errorString()); + } + } + + function removeButton(name) { + } + + function urlHelper(src) { + if (src.match(/\bhttp/)) { + return src; + } else { + return "../../../" + src; + } + } + + function fromScript(message) { + switch (message.type) { + case "allButtonsShown": + modesbar.height = flowMain.children.length * 100 + 10; + break; + case "inactiveButtonsHidden": + modesbar.height = 100 + 10; + break; + default: + break; + } + } + +} diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js index 2a4af9afbf..a61c205980 100644 --- a/scripts/+android/defaultScripts.js +++ b/scripts/+android/defaultScripts.js @@ -15,7 +15,8 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/progress.js", "system/+android/touchscreenvirtualpad.js", "system/+android/bottombar.js", - "system/+android/audio.js" /*, + "system/+android/audio.js" /, + "system/+android/modes.js"*, "system/away.js", "system/controllers/controllerDisplayManager.js", "system/controllers/handControllerGrabAndroid.js", diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js new file mode 100644 index 0000000000..0be53c2fc4 --- /dev/null +++ b/scripts/system/+android/modes.js @@ -0,0 +1,187 @@ +"use strict"; +// +// modes.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on Jan 23, 2018 +// Copyright 2018 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() { // BEGIN LOCAL_SCOPE + +var modesbar; +var modesButtons; +var currentSelectedBtn; + +var SETTING_CURRENT_MODE_KEY = 'Android/Mode'; +var MODE_VR = "VR", MODE_RADAR = "RADAR", MODE_MY_VIEW = "MY VIEW"; +var DEFAULT_MODE = MODE_RADAR; +var logEnabled = true; + +function printd(str) { + if (logEnabled) { + print("[modes.js] " + str); + } +} + +function init() { + setupModesBar(); +} + +function shutdown() { + +} + +function setupModesBar() { + + var bar = new QmlFragment({ + qml: "hifi/modesbar.qml" + }); + var buttonRadarMode = bar.addButton({ + icon: "icons/radar-i.svg", + activeIcon: "icons/radar-a.svg", + hoverIcon: "icons/radar-a.svg", + activeBgOpacity: 0.0, + hoverBgOpacity: 0.0, + activeHoverBgOpacity: 0.0, + text: "RADAR", + height:240, + bottomMargin: 6, + textSize: 45 + }); + var buttonMyViewMode = bar.addButton({ + icon: "icons/myview-i.svg", + activeIcon: "icons/myview-a.svg", + hoverIcon: "icons/myview-a.svg", + activeBgOpacity: 0.0, + hoverBgOpacity: 0.0, + activeHoverBgOpacity: 0.0, + text: "MY VIEW", + height: 240, + bottomMargin: 6, + textSize: 45 + }); + + modesButtons = [buttonRadarMode, buttonMyViewMode]; + + var mode = getCurrentModeSetting(); + + var buttonsRevealed = false; + bar.sendToQml({type: "inactiveButtonsHidden"}); + + modesbar = { + restoreMyViewButton: function() { + switchModeButtons(buttonMyViewMode); + saveCurrentModeSetting(MODE_MY_VIEW); + }, + sendToQml: function(o) { bar.sendToQml(o); }, + qmlFragment: bar + }; + + buttonRadarMode.clicked.connect(function() { + //if (connections.isVisible()) return; + saveCurrentModeSetting(MODE_RADAR); + printd("Radar clicked"); + onButtonClicked(buttonRadarMode, function() { + //radar.startRadarMode(); + }); + }); + buttonMyViewMode.clicked.connect(function() { + //if (connections.isVisible()) return; + saveCurrentModeSetting(MODE_MY_VIEW); + printd("My View clicked"); + onButtonClicked(buttonMyViewMode, function() { + if (currentSelectedBtn == buttonRadarMode) { + //radar.endRadarMode(); + } + }); + }); + + var savedButton; + if (mode == MODE_MY_VIEW) { + savedButton = buttonMyViewMode; + } else { + savedButton = buttonRadarMode; + } + printd("[MODE] previous mode " + mode); + + savedButton.clicked(); +} + +function saveCurrentModeSetting(mode) { + Settings.setValue(SETTING_CURRENT_MODE_KEY, mode); +} + +function getCurrentModeSetting(mode) { + return Settings.getValue(SETTING_CURRENT_MODE_KEY, DEFAULT_MODE); +} + +function showAllButtons() { + for (var i=0; i Date: Wed, 31 Jan 2018 15:12:44 -0300 Subject: [PATCH 060/267] Fix +android/defaultScripts array of filenames. --- scripts/+android/defaultScripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js index a61c205980..a8f6bf42a1 100644 --- a/scripts/+android/defaultScripts.js +++ b/scripts/+android/defaultScripts.js @@ -15,8 +15,8 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/progress.js", "system/+android/touchscreenvirtualpad.js", "system/+android/bottombar.js", - "system/+android/audio.js" /, - "system/+android/modes.js"*, + "system/+android/audio.js" , + "system/+android/modes.js"/*, "system/away.js", "system/controllers/controllerDisplayManager.js", "system/controllers/handControllerGrabAndroid.js", From b6ce3409d8619615907d1c2c9a37377f4752e6cf Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 31 Jan 2018 15:33:14 -0300 Subject: [PATCH 061/267] Android - Make it possible to use the touchpad for walk/fly (and orientate/see) when not in independent camera mode (allowing first person and third person). --- .../resources/controllers/touchscreenvirtualpad.json | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/interface/resources/controllers/touchscreenvirtualpad.json b/interface/resources/controllers/touchscreenvirtualpad.json index 9f65994e98..8c21044c3b 100644 --- a/interface/resources/controllers/touchscreenvirtualpad.json +++ b/interface/resources/controllers/touchscreenvirtualpad.json @@ -1,15 +1,12 @@ { "name": "TouchscreenVirtualPad to Actions", "channels": [ - { "from": "TouchscreenVirtualPad.LY", "when": "Application.CameraFirstPerson", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.TranslateZ" }, - { "from": "TouchscreenVirtualPad.LX", "when": "Application.CameraFirstPerson", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.TranslateX" }, + { "from": "TouchscreenVirtualPad.LY", "when": "!Application.CameraIndependent", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.TranslateZ" }, + { "from": "TouchscreenVirtualPad.LX", "when": "!Application.CameraIndependent", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.TranslateX" }, - { "from": "TouchscreenVirtualPad.RX", "when": "Application.CameraFirstPerson", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.Yaw" }, + { "from": "TouchscreenVirtualPad.RX", "when": "!Application.CameraIndependent", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.Yaw" }, - { "from": "TouchscreenVirtualPad.RY", - "when": "Application.CameraFirstPerson", - "to": "Actions.Pitch" - } + { "from": "TouchscreenVirtualPad.RY", "when": "!Application.CameraIndependent", "to": "Actions.Pitch" } ] } From e8312c72be21906f833a0a29f3fec71139223f34 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 2 Feb 2018 12:57:41 -0300 Subject: [PATCH 062/267] Android - Radar mode implemented. --- scripts/system/+android/modes.js | 37 +- scripts/system/+android/radar.js | 1212 ++++++++++++++++++++++++ scripts/system/+android/uniqueColor.js | 46 + 3 files changed, 1293 insertions(+), 2 deletions(-) create mode 100644 scripts/system/+android/radar.js create mode 100644 scripts/system/+android/uniqueColor.js diff --git a/scripts/system/+android/modes.js b/scripts/system/+android/modes.js index 0be53c2fc4..b29548094f 100644 --- a/scripts/system/+android/modes.js +++ b/scripts/system/+android/modes.js @@ -20,6 +20,9 @@ var MODE_VR = "VR", MODE_RADAR = "RADAR", MODE_MY_VIEW = "MY VIEW"; var DEFAULT_MODE = MODE_RADAR; var logEnabled = true; +var radar = Script.require('./radar.js'); +var uniqueColor = Script.require('./uniqueColor.js'); + function printd(str) { if (logEnabled) { print("[modes.js] " + str); @@ -27,7 +30,10 @@ function printd(str) { } function init() { + radar.setUniqueColor(uniqueColor); + radar.init(); setupModesBar(); + radar.isTouchValid = isRadarModeValidTouch; } function shutdown() { @@ -85,7 +91,7 @@ function setupModesBar() { saveCurrentModeSetting(MODE_RADAR); printd("Radar clicked"); onButtonClicked(buttonRadarMode, function() { - //radar.startRadarMode(); + radar.startRadarMode(); }); }); buttonMyViewMode.clicked.connect(function() { @@ -94,7 +100,7 @@ function setupModesBar() { printd("My View clicked"); onButtonClicked(buttonMyViewMode, function() { if (currentSelectedBtn == buttonRadarMode) { - //radar.endRadarMode(); + radar.endRadarMode(); } }); }); @@ -177,6 +183,33 @@ function onButtonClicked(clickedButton, whatToDo, hideAllAfter) { } } +function isRadarModeValidTouch(coords) { + var qmlFragments = [modesbar.qmlFragment]; + var windows = []; + for (var i=0; i < qmlFragments.length; i++) { + var aQmlFrag = qmlFragments[i]; + if (aQmlFrag != null && aQmlFrag.isVisible() && + coords.x >= aQmlFrag.position.x * 3 && coords.x <= aQmlFrag.position.x * 3 + aQmlFrag.size.x * 3 && + coords.y >= aQmlFrag.position.y * 3 && coords.y <= aQmlFrag.position.y * 3 + aQmlFrag.size.y * 3 + ) { + printd("godViewModeTouchValid- false because of qmlFragments!? idx " + i); + return false; + } + } + + for (var i=0; i < windows.length; i++) { + var aWin = windows[i]; + if (aWin != null && aWin.position() != null && + coords.x >= aWin.position().x * 3 && coords.x <= aWin.position().x * 3 + aWin.width() * 3 && + coords.y >= aWin.position().y * 3 && coords.y <= aWin.position().y * 3 + aWin.height() * 3 + ) { + printd("godViewModeTouchValid- false because of windows!?"); + return false; + } + } + printd("godViewModeTouchValid- true by default "); + return true; +} Script.scriptEnding.connect(function () { shutdown(); diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js new file mode 100644 index 0000000000..9fa07178f6 --- /dev/null +++ b/scripts/system/+android/radar.js @@ -0,0 +1,1212 @@ +"use strict"; +// +// radar.js +// scripts/system/+android/ +// +// Created by Cristian Duarte & Gabriel Calero on 31 Jan 2018 +// Copyright 2018 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 +// + +var radarModeInterface = {}; + +var logEnabled = true; +function printd(str) { + if (logEnabled) + print("[radar.js] " + str); +} + +var radar = false; +var radarHeight = 10; // camera position meters above the avatar +var tablet; + +var RADAR_CAMERA_OFFSET = -1; // 1 meter below the avatar +var ABOVE_GROUND_DROP = 2; +var MOVE_BY = 1; + +// Swipe/Drag vars +var PINCH_INCREMENT_FIRST = 0.4; // 0.1 meters zoom in - out +var PINCH_INCREMENT = 0.4; // 0.1 meters zoom in - out +var RADAR_HEIGHT_MAX_PLUS_AVATAR = 40; +var RADAR_HEIGHT_MIN_PLUS_AVATAR = 2; +var RADAR_CAMERA_DISTANCE_TO_ICONS = 0.5; // Icons are near the camera to prevent the LOD manager dismissing them +var RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE = 1; // How much above the avatar base should the icon appear +var AVATAR_DISPLAY_NAME_HEIGHT = 38; +var AVATAR_DISPLAY_NAME_CHAR_WIDTH = 18; +var lastDragAt; +var lastDeltaDrag; + +var uniqueColor; + +function moveTo(position) { + if (radar) { + MyAvatar.position = position; + Camera.position = Vec3.sum(MyAvatar.position, {x:0, y: radarHeight, z: 0}); + } +} + +function keyPressEvent(event) { + if (radar) { + switch(event.text) { + case "UP": + moveTo(Vec3.sum(MyAvatar.position, {x:0.0, y: 0, z: -1 * MOVE_BY})); + break; + case "DOWN": + moveTo(Vec3.sum(MyAvatar.position, {x:0, y: 0, z: MOVE_BY})); + break; + case "LEFT": + moveTo(Vec3.sum(MyAvatar.position, {x:-1 * MOVE_BY, y: 0, z: 0})); + break; + case "RIGHT": + moveTo(Vec3.sum(MyAvatar.position, {x:MOVE_BY, y: 0, z: 0})); + break; + } + } +} + +function actionOnObjectFromEvent(event) { + var rayIntersection = findRayIntersection(Camera.computePickRay(event.x, event.y)); + if (rayIntersection && rayIntersection.intersects && rayIntersection.overlayID) { + printd("found overlayID touched " + rayIntersection.overlayID); + if (entitiesByOverlayID[rayIntersection.overlayID]) { + var entity = Entities.getEntityProperties(entitiesByOverlayID[rayIntersection.overlayID], ["sourceUrl"]); + App.openUrl(entity.sourceUrl); + return true; + } + } + if (rayIntersection && rayIntersection.intersects && rayIntersection.entityID && rayIntersection.properties) { + printd("found " + rayIntersection.entityID + " of type " + rayIntersection.properties.type) ; + if (rayIntersection.properties.type == "Web") { + printd("found web element to " + rayIntersection.properties.sourceUrl); + App.openUrl(rayIntersection.properties.sourceUrl); + return true; + } + } + return false; +} + +function mousePress(event) { + if (!isTouchValid(coords)) { + currentTouchIsValid = false; + return; + } else { + currentTouchIsValid = true; + } + mousePressOrTouchEnd(event); +} + +function mousePressOrTouchEnd(event) { + if (!currentTouchIsValid) { + return; + } + if (radar) { + if (actionOnObjectFromEvent(event)) return; + } +} + +function toggleRadarMode() { + if (radar) { + endRadar(); + } else { + startRadar(); + } +} + +function fakeDoubleTap(event) { + // CLD - temporarily disable toggling mode through double tap + // * As we have a new UI for toggling between modes, it may be discarded completely in the future. + // toggleRadarMode(); + teleporter.dragTeleportUpdate(event); + teleporter.dragTeleportRelease(event); +} + +var currentTouchIsValid = false; // Currently used to know if touch hasn't started on a UI overlay + +var DOUBLE_TAP_TIME = 300; +var fakeDoubleTapStart = Date.now(); +var touchEndCount = 0; + +/* Counts touchEnds and if there were 2 in the DOUBLE_TAP_TIME lapse, it triggers a fakeDoubleTap and returns true. + Otherwise, returns false (no double tap yet) */ +function analyzeDoubleTap(event) { + var fakeDoubleTapEnd = Date.now(); + var elapsed = fakeDoubleTapEnd - fakeDoubleTapStart; + if (elapsed > DOUBLE_TAP_TIME) { + touchEndCount = 0; + } + + // if this is our first "up" then record time so we can + // later determine if second "up" is a double tap + if (touchEndCount == 0) { + fakeDoubleTapStart = Date.now(); + } + touchEndCount++; + + if (touchEndCount >= 2) { + var fakeDoubleTapEnd = Date.now(); + var elapsed = fakeDoubleTapEnd - fakeDoubleTapStart; + printd("-- fakeDoubleTapEnd:" + fakeDoubleTapEnd + "-- elapsed:" + elapsed) + if (elapsed <= DOUBLE_TAP_TIME) { + touchEndCount = 0; + fakeDoubleTap(event); + return true; // don't do the normal touch end processing + } + + touchEndCount = 0; + } + return false; +} + +function touchEnd(event) { + printd("touchEnd received " + JSON.stringify(event)); + // Clean up touch variables + lastDragAt = null; + lastDeltaDrag = null; + touchStartingCoordinates = null; // maybe in special cases it should be setup later? + startedDraggingCamera = false; + prevTouchPinchRadius = null; + draggingCamera = false; + + if (movingCamera) { + // if camera was indeed moving, we should not further process, it was just dragging + movingCamera = false; + dragModeFunc = null; + return; + } + + // teleport release analysis + if (teleporter && teleporter.dragTeleportUpdate == dragModeFunc) { + teleporter.dragTeleportRelease(event); + dragModeFunc = null; + return; + } + dragModeFunc = null; + + // if pinching or moving is still detected, cancel + if (event.isPinching) { printd("touchEnd fail because isPinching");return;} + if (event.isPinchOpening) { printd("touchEnd fail because isPinchingOpening");return;} + if (event.isMoved) { printd("touchEnd fail because isMoved");return;} + + // if touch is invalid, cancel + if (!currentTouchIsValid) { printd("touchEnd fail because !currentTouchIsValid");return;} + + if (analyzeDoubleTap(event)) return; // double tap detected, finish + + if (radar) { + mousePressOrTouchEnd(event); + } +} + +/** +* Polyfill for sign(x) +*/ +if (!Math.sign) { + Math.sign = function(x) { + // If x is NaN, the result is NaN. + // If x is -0, the result is -0. + // If x is +0, the result is +0. + // If x is negative and not -0, the result is -1. + // If x is positive and not +0, the result is +1. + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return Number(x); + } + return x > 0 ? 1 : -1; + }; +} + +/******************************************************************************************************** + * Line and Plane intersection methods + ********************************************************************************************************/ + +/** +* findLinePlaneIntersection +* Given points p {x: y: z:} and q that define a line, and the plane +* of formula ax+by+cz+d = 0, returns the intersection point or null if none. +*/ +function findLinePlaneIntersection(p, q, a, b, c, d) { + return findLinePlaneIntersectionCoords(p.x, p.y, p.z, q.x, q.y, q.z, a, b, c, d); +} + +/** +* findLineToHeightIntersection +* Given points p {x: y: z:} and q that define a line, and a planeY +* value that defines a plane paralel to 'the floor' xz plane, +* returns the intersection to that plane or null if none. +*/ +function findLineToHeightIntersection(p, q, planeY) { + return findLinePlaneIntersection(p, q, 0, 1, 0, -planeY); +} + +/** +* findLinePlaneIntersectionCoords (to avoid requiring unnecessary instantiation) +* Given points p with px py pz and q that define a line, and the plane +* of formula ax+by+cz+d = 0, returns the intersection point or null if none. +*/ +function findLinePlaneIntersectionCoords(px, py, pz, qx, qy, qz, a, b, c, d) { + var tDenom = a*(qx-px) + b*(qy-py) + c*(qz-pz); + if (tDenom == 0) return null; + + var t = - ( a*px + b*py + c*pz + d ) / tDenom; + + return { + x: (px+t*(qx-px)), + y: (py+t*(qy-py)), + z: (pz+t*(qz-pz)) + }; +} + +/** +* findLineToHeightIntersection +* Given points p with px py pz and q that define a line, and a planeY +* value that defines a plane paralel to 'the floor' xz plane, +* returns the intersection to that plane or null if none. +*/ +function findLineToHeightIntersectionCoords(px, py, pz, qx, qy, qz, planeY) { + return findLinePlaneIntersectionCoords(px, py, pz, qx, qy, qz, 0, 1, 0, -planeY); +} + +function findRayIntersection(pickRay) { + // Check 3D overlays and entities. Argument is an object with origin and direction. + var result = Overlays.findRayIntersection(pickRay); + if (!result.intersects) { + result = Entities.findRayIntersection(pickRay, true); + } + return result; +} + +/** + * Given a 2d point (x,y) this function returns the intersection (x, y, z) + * of the computedPickRay for that point with the plane y = py + */ +function computePointAtPlaneY(x,y,py) { + var ray = Camera.computePickRay(x, y); + var p1=ray.origin; + var p2=Vec3.sum(p1, Vec3.multiply(ray.direction, 1)); + return findLineToHeightIntersectionCoords(p1.x, p1.y, p1.z, + p2.x, p2.y, p2.z, py); +} + +/******************************************************************************************************** + * + ********************************************************************************************************/ + +function isTouchValid(coords) { + // TODO: Extend to the detection of touches on new menu bars + var radarModeTouchValid = radarModeInterface.isTouchValid(coords); + + // getItemAtPoint does not exist anymore, look for another way to know if we are touching buttons + // is it still needed? + return /*!tablet.getItemAtPoint(coords) && */radarModeTouchValid; +} + +/******************************************************************************************************** + * + ********************************************************************************************************/ + +var touchStartingCoordinates = null; + +var KEEP_PRESSED_FOR_TELEPORT_MODE_TIME = 750; +var touchBeginTime; + +function touchBegin(event) { + var coords = { x: event.x, y: event.y }; + if (!isTouchValid(coords) ) { + printd("analyze touch - RADAR_TOUCH - INVALID"); + currentTouchIsValid = false; + touchStartingCoordinates = null; + } else { + printd("analyze touch - RADAR_TOUCH - ok"); + currentTouchIsValid = true; + touchStartingCoordinates = coords; + touchBeginTime = Date.now(); + } +} + +var startedDraggingCamera = false; // first time +var draggingCamera = false; // is trying +var movingCamera = false; // definitive + +var MIN_DRAG_DISTANCE_TO_CONSIDER = 100; // distance by axis, not real distance + +var prevTouchPinchRadius = null; + +function pinchUpdate(event) { + if (!event.isMoved) return; + if (event.radius <= 0) return; + + // pinch management + var avatarY = MyAvatar.position.y; + var pinchIncrement; + if (!!prevTouchPinchRadius) { + // no prev value + pinchIncrement = PINCH_INCREMENT * Math.abs(event.radius - prevTouchPinchRadius) * 0.1; + } else { + pinchIncrement = PINCH_INCREMENT_FIRST; + } + + if (event.isPinching) { + if (radarHeight + pinchIncrement > RADAR_HEIGHT_MAX_PLUS_AVATAR + avatarY) { + radarHeight = RADAR_HEIGHT_MAX_PLUS_AVATAR + avatarY; + } else { + radarHeight += pinchIncrement; + } + } else if (event.isPinchOpening) { + if (radarHeight - pinchIncrement < RADAR_HEIGHT_MIN_PLUS_AVATAR + avatarY) { + radarHeight = RADAR_HEIGHT_MIN_PLUS_AVATAR + avatarY; + } else { + radarHeight -= pinchIncrement; + } + } + var deltaHeight = avatarY + radarHeight - Camera.position.y; + Camera.position = Vec3.sum(Camera.position, {x:0, y: deltaHeight, z: 0}); + if (!draggingCamera) { + startedDraggingCamera = true; + draggingCamera = true; + } + + prevTouchPinchRadius = event.radius; +} + +function isInsideSquare(coords0, coords1, halfside) { + return Math.abs(coords0.x-coords1.x) <= halfside && Math.abs(coords0.y-coords1.y) <= halfside; +} + +function dragScrollUpdate(event) { + if (!event.isMoved) return; + + // drag management + var pickRay = Camera.computePickRay(event.x, event.y); + var dragAt = Vec3.sum(pickRay.origin, Vec3.multiply(pickRay.direction, radarHeight)); + + if (lastDragAt === undefined || lastDragAt === null) { + lastDragAt = dragAt; + return; + } + + var deltaDrag = {x: (lastDragAt.x - dragAt.x), y: 0, z: (lastDragAt.z-dragAt.z)}; + + lastDragAt = dragAt; + if (lastDeltaDrag === undefined || lastDeltaDrag === null) { + lastDeltaDrag = deltaDrag; + return; + } + + if (!draggingCamera) { + startedDraggingCamera = true; + draggingCamera = true; + } else { + if (!movingCamera) { + if (!isInsideSquare(touchStartingCoordinates, event, MIN_DRAG_DISTANCE_TO_CONSIDER)) { + movingCamera = true; + } + } + + if (movingCamera) { + if (Math.sign(deltaDrag.x) == Math.sign(lastDeltaDrag.x) && Math.sign(deltaDrag.z) == Math.sign(lastDeltaDrag.z)) { + // Process movement if direction of the movement is the same than the previous frame + // process delta + var moveCameraTo = Vec3.sum(Camera.position, deltaDrag); + // move camera + Camera.position = moveCameraTo; + } else { + // Do not move camera if it's changing direction in this case, wait until the next direction confirmation.. + } + lastDeltaDrag = deltaDrag; // save last + } + } +} + +/******************************************************************************************************** + * Teleport feature + ********************************************************************************************************/ + +function Teleporter() { + + var SURFACE_DETECTION_FOR_TELEPORT = true; // true if uses teleport.js similar logic to detect surfaces. false if uses plain teleport to avatar same height. + + var TELEPORT_TARGET_MODEL_URL = Script.resolvePath("../assets/models/teleport-destination.fbx"); + var TELEPORT_TOO_CLOSE_MODEL_URL = Script.resolvePath("../assets/models/teleport-cancel.fbx"); + + var TELEPORT_MODEL_DEFAULT_DIMENSIONS = { + x: 0.10, + y: 0.00001, + z: 0.10 + }; + + var teleportOverlay = Overlays.addOverlay("model", { + url: TELEPORT_TARGET_MODEL_URL, + dimensions: TELEPORT_MODEL_DEFAULT_DIMENSIONS, + orientation: Quat.fromPitchYawRollDegrees(0,180,0), + visible: false + }); + + var teleportCancelOverlay = Overlays.addOverlay("model", { + url: TELEPORT_TOO_CLOSE_MODEL_URL, + dimensions: TELEPORT_MODEL_DEFAULT_DIMENSIONS, + orientation: Quat.fromPitchYawRollDegrees(0,180,0), + visible: false + }); + + var TELEPORT_COLOR = { red: 0, green: 255, blue: 255}; + var TELEPORT_CANCEL_COLOR = { red: 255, green: 255, blue: 0}; + + var teleportLine = Overlays.addOverlay("line3d", { + start: { x: 0, y: 0, z:0 }, + end: { x: 0, y: 0, z: 0 }, + color: TELEPORT_COLOR, + alpha: 1, + lineWidth: 2, + dashed: false, + visible: false + }); + + // code from teleport.js + var TELEPORT_TARGET = { + NONE: 'none', // Not currently targetting anything + INVISIBLE: 'invisible', // The current target is an invvsible surface + INVALID: 'invalid', // The current target is invalid (wall, ceiling, etc.) + SURFACE: 'surface', // The current target is a valid surface + SEAT: 'seat', // The current target is a seat + } + + var TELEPORT_CANCEL_RANGE = 1; + var teleportTargetType = TELEPORT_TARGET.NONE; + + function parseJSON(json) { + try { + return JSON.parse(json); + } catch (e) { + return undefined; + } + } + + /* + * Enhanced with intersection with terrain instead of using current avatar y position if SURFACE_DETECTION_FOR_TELEPORT is true + */ + function computeDestination(touchEventPos, avatarPosition, cameraPosition, radarH) { + if (SURFACE_DETECTION_FOR_TELEPORT) { + var pickRay = Camera.computePickRay(touchEventPos.x, touchEventPos.y); + printd("newTeleportDetect - pickRay " + JSON.stringify(pickRay)); + var destination = Entities.findRayIntersection(pickRay, true, [], [], false, true); + printd("newTeleportDetect - destination " + JSON.stringify(destination)); + return destination; + } else { + var pickRay = Camera.computePickRay(touchEventPos.x, touchEventPos.y); + var pointingAt = Vec3.sum(pickRay.origin, Vec3.multiply(pickRay.direction, radarH)); + var destination = { x: pointingAt.x, y: avatarPosition.y, z: pointingAt.z }; + return destination; + } + } + + function renderTeleportOverlays(destination) { + var overlayPosition = findLineToHeightIntersection(destination, Camera.position, Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + printd("[newTeleport] TELEPORT ! render overlay at " + JSON.stringify(overlayPosition)); + + // CLD note Oct 11, 2017 + // Version of teleport.js 3c109f294f88ba7573bd1221f907f2605893c509 doesn't allow invisible surfaces, let's allow it for now + if (teleportTargetType == TELEPORT_TARGET.SURFACE || teleportTargetType == TELEPORT_TARGET.INVISIBLE) { + Overlays.editOverlay(teleportOverlay, { visible: true, position: overlayPosition }); + Overlays.editOverlay(teleportCancelOverlay, { visible: false }); + Overlays.editOverlay(teleportLine, { start: MyAvatar.position, end: destination, color: TELEPORT_COLOR, visible: true }); + } else if (teleportTargetType == TELEPORT_TARGET.INVALID) { + Overlays.editOverlay(teleportOverlay, { visible: false}); + Overlays.editOverlay(teleportCancelOverlay, { visible: true, position: overlayPosition }); + Overlays.editOverlay(teleportLine, { start: MyAvatar.position, end: destination, color: TELEPORT_CANCEL_COLOR, visible: true }); + } else { // TELEPORT_TARGET:NONE? + Overlays.editOverlay(teleportOverlay, { visible: false }); + Overlays.editOverlay(teleportCancelOverlay, { visible: false }); + Overlays.editOverlay(teleportLine, { visible: false }); + } + } + + var BORDER_DISTANCE_PX = 100; + var border_top = 0; + var border_left = 0; + var border_right = Window.innerWidth; + var border_bottom = Window.innerHeight; + + function moveOnBorders(event) { + var xDelta = 0; + var zDelta = 0; + + if (event.y <= border_top + BORDER_DISTANCE_PX) { + zDelta = -0.1; + } else if (event.y >= border_bottom - BORDER_DISTANCE_PX) { + zDelta = 0.1; + } + if (event.x <= border_left + BORDER_DISTANCE_PX) { + xDelta = -0.1; + } else if (event.x >= border_right - BORDER_DISTANCE_PX) { + xDelta = 0.1; + } + if (xDelta == 0 && zDelta == 0) { + draggingCamera = false; + return; + } + + Camera.position = Vec3.sum(Camera.position, {x:xDelta, y: 0, z: zDelta}); + draggingCamera = true; + } + + // When determininig whether you can teleport to a location, the normal of the + // point that is being intersected with is looked at. If this normal is more + // than MAX_ANGLE_FROM_UP_TO_TELEPORT degrees from <0, 1, 0> (straight up), then + // you can't teleport there. + const MAX_ANGLE_FROM_UP_TO_TELEPORT = 70; + function getTeleportTargetType(intersection) { + if (SURFACE_DETECTION_FOR_TELEPORT) { + if (!intersection.intersects) { + return TELEPORT_TARGET.NONE; + } + var props = Entities.getEntityProperties(intersection.entityID, ['userData', 'visible']); + var data = parseJSON(props.userData); + if (data !== undefined && data.seat !== undefined) { + return TELEPORT_TARGET.SEAT; + } + + if (!props.visible) { + return TELEPORT_TARGET.INVISIBLE; + } + + var surfaceNormal = intersection.surfaceNormal; + var adj = Math.sqrt(surfaceNormal.x * surfaceNormal.x + surfaceNormal.z * surfaceNormal.z); + var angleUp = Math.atan2(surfaceNormal.y, adj) * (180 / Math.PI); + + if (angleUp < (90 - MAX_ANGLE_FROM_UP_TO_TELEPORT) || + angleUp > (90 + MAX_ANGLE_FROM_UP_TO_TELEPORT) || + Vec3.distance(MyAvatar.position, intersection.intersection) <= TELEPORT_CANCEL_RANGE) { + return TELEPORT_TARGET.INVALID; + } else { + return TELEPORT_TARGET.SURFACE; + } + } else { + var destination = intersection; + if (Vec3.distance(MyAvatar.position, destination) <= TELEPORT_CANCEL_RANGE) { + return TELEPORT_TARGET.INVALID; + } else { + return TELEPORT_TARGET.SURFACE; + } + } + }; + + function moveToFromEvent(event) { + var destination = computeDestination(event, MyAvatar.position, Camera.position, radarHeight); + moveTo(SURFACE_DETECTION_FOR_TELEPORT? + Vec3.sum(destination.intersection, {y: 1}) + :destination); + return true; + } + + return { + dragTeleportBegin : function(event) { + printd("[newTeleport] TELEPORT began"); + var overlayDimensions = entityIconModelDimensions(); + //var destination = computeDestination(event, MyAvatar.position, Camera.position, radarHeight); + // Dimension teleport and cancel overlays (not show them yet) + Overlays.editOverlay(teleportOverlay, { dimensions: overlayDimensions }); + Overlays.editOverlay(teleportCancelOverlay, { dimensions: overlayDimensions }); + // Position line + Overlays.editOverlay(teleportLine, { visible: true, start: 0, end: 0 }); + }, + + dragTeleportUpdate : function(event) { + // if in border, move camera + moveOnBorders(event); + + var destination = computeDestination(event, MyAvatar.position, Camera.position, radarHeight); + + teleportTargetType = getTeleportTargetType(destination); + renderTeleportOverlays( SURFACE_DETECTION_FOR_TELEPORT? + destination.intersection: + destination); + }, + + dragTeleportRelease : function (event) { + printd("[newTeleport] TELEPORT released at " + JSON.stringify(event)); + // CLD note Oct 11, 2017 + // Version of teleport.js 3c109f294f88ba7573bd1221f907f2605893c509 doesn't allow invisible surfaces, let's allow it for now + if (teleportTargetType == TELEPORT_TARGET.SURFACE || teleportTargetType == TELEPORT_TARGET.INVISIBLE) { + moveToFromEvent(event); + } + teleportTargetType = TELEPORT_TARGET.NONE; + + Overlays.editOverlay(teleportOverlay, { visible: false }); + Overlays.editOverlay(teleportLine, { visible: false }); + Overlays.editOverlay(teleportCancelOverlay, { visible: false }); + } + }; + +} + +var teleporter = Teleporter(); + +/******************************************************************************************************** + * + ********************************************************************************************************/ + +var dragModeFunc = null; // by default is nothing + +function oneFingerTouchUpdate(event) { + if (dragModeFunc) { + dragModeFunc(event); + } else { + if (!isInsideSquare(touchStartingCoordinates, event, MIN_DRAG_DISTANCE_TO_CONSIDER)) { + dragModeFunc = dragScrollUpdate; + dragModeFunc(event); + } else { + var now = Date.now(); // check time + if (now - touchBeginTime >= KEEP_PRESSED_FOR_TELEPORT_MODE_TIME) { + teleporter.dragTeleportBegin(event); + dragModeFunc = teleporter.dragTeleportUpdate; + dragModeFunc(event); + } else { + // not defined yet, let's wait for time or movement to happen + } + } + } +} + +function touchUpdate(event) { + if (!currentTouchIsValid) { + return; // avoid moving and zooming when tap is over UI entities + } + if (event.isPinching || event.isPinchOpening) { + pinchUpdate(event); + } else { + oneFingerTouchUpdate(event); + } +} + +/******************************************************************************************************** + * Avatar cache structure for showing avatars markers + ********************************************************************************************************/ + +// by QUuid +var avatarsData = {}; +var avatarsIcons = []; // a parallel list of icons (overlays) to easily run through +var avatarsNames = []; // a parallel list of names (overlays) to easily run through + +function getAvatarIconForUser(uid) { + var color = uniqueColor.getColor(uid); + if (color.charAt(0) == '#' ) { + color = color.substring(1, color.length); + } + // FIXME: this is a temporary solution until we can use circle3d with lineWidth + return Script.resolvePath("assets/images/circle-"+color+".svg"); +} + +var avatarIconDimensionsVal = { x: 0, y: 0, z: 0.00001}; +function avatarIconPlaneDimensions() { + // given the current height, give a size + var xy = -0.003531 * radarHeight + 0.1; + avatarIconDimensionsVal.x = Math.abs(xy); + avatarIconDimensionsVal.y = Math.abs(xy); + // reuse object + return avatarIconDimensionsVal; +} + +function currentOverlayIconForAvatar(QUuid) { + if (avatarsData[QUuid] != undefined) { + return avatarsData[QUuid].icon; + } else { + return null; + } +} + +function currentOverlayNameForAvatar(QUuid) { + if (avatarsData[QUuid] != undefined) { + return avatarsData[QUuid].name; + } else { + return null; + } +} + +function saveAvatarData(QUuid) { + if (QUuid == null) return; + var avat = AvatarList.getAvatar(QUuid); + printd("avatar added save avatar " + QUuid); + + if (!avat) return; + + if (avatarsData[QUuid] != undefined) { + avatarsData[QUuid].position = avat.position; + } else { + var avatarIcon = Overlays.addOverlay("image3d", { + subImage: { x: 0, y: 0, width: 150, height: 142}, + url: getAvatarIconForUser(QUuid), + dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, + visible: false, + ignoreRayIntersection: false, + orientation: Quat.fromPitchYawRollDegrees(-90,0,0) + }); + + var needRefresh = !avat || !avat.displayName; + var displayName = avat && avat.displayName ? avat.displayName : "Unknown"; + var textWidth = displayName.length * AVATAR_DISPLAY_NAME_CHAR_WIDTH; + var avatarName = Overlays.addOverlay("text", { + width: textWidth, + height: AVATAR_DISPLAY_NAME_HEIGHT, + color: { red: 255, green: 255, blue: 255}, + backgroundAlpha: 0.0, + textRaiseColor: { red: 0, green: 0, blue: 0}, + font: {size: 68, bold: true}, + visible: false, + text: displayName, + textAlignCenter: true + }); + avatarsIcons.push(avatarIcon); + avatarsNames.push(avatarName); + avatarsData[QUuid] = { position: avat.position, icon: avatarIcon, name: avatarName, textWidth: textWidth, needRefresh: needRefresh }; + } +} + +function removeAvatarData(QUuid) { + if (QUuid == null) return; + + var itsOverlay = currentOverlayIconForAvatar(QUuid); + if (itsOverlay != null) { + Overlays.deleteOverlay(itsOverlay); + } + var itsNameOverlay = currentOverlayNameForAvatar(QUuid); + if (itsNameOverlay != null) { + Overlays.deleteOverlay(itsNameOverlay); + } + + var idx = avatarsIcons.indexOf(itsOverlay); + avatarsIcons.splice(idx, 1); + idx = avatarsNames.indexOf(itsNameOverlay); + avatarsNames.splice(idx, 1); + + delete avatarsData[QUuid]; +} + +function saveAllOthersAvatarsData() { + var avatarIds = AvatarList.getAvatarIdentifiers(); + var len = avatarIds.length; + for (var i = 0; i < len; i++) { + if (avatarIds[i]) { + saveAvatarData(avatarIds[i]); + } + } +} + + +function avatarAdded(QUuid) { + printd("avatar added " + QUuid);// + " at " + JSON.stringify(AvatarList.getAvatar(QUuid).position)); + saveAvatarData(QUuid); +} + +function avatarRemoved(QUuid) { + printd("avatar removed " + QUuid); + removeAvatarData(QUuid); +} + +/******************************************************************************************************** + * Avatar Icon/Markers rendering + ********************************************************************************************************/ +var myAvatarIcon; +var myAvatarName; + +function renderMyAvatarIcon() { + var iconPos = findLineToHeightIntersectionCoords( MyAvatar.position.x, + MyAvatar.position.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, + MyAvatar.position.z, + Camera.position.x, Camera.position.y, Camera.position.z, + Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + if (!iconPos) { printd("avatarmy icon pos null"); return;} + var iconDimensions = avatarIconPlaneDimensions(); + + var avatarPos = MyAvatar.position; + var cameraPos = Camera.position; + var commonY = Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS; + var borderPoints = [ + computePointAtPlaneY(0, 0, commonY), + computePointAtPlaneY(Window.innerWidth, Window.innerHeight, commonY) + ]; + + var p1 = findLineToHeightIntersectionCoords(avatarPos.x, avatarPos.y, avatarPos.z, + cameraPos.x, cameraPos.y, cameraPos.z, + commonY); + var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) / (borderPoints[1].x - borderPoints[0].x); + var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); + + if (!myAvatarIcon && MyAvatar.sessionUUID) { + myAvatarIcon = Overlays.addOverlay("image3d", { + subImage: { x: 0, y: 0, width: 150, height: 142}, + url: getAvatarIconForUser(MyAvatar.sessionUUID), + dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, + visible: false, + ignoreRayIntersection: false, + orientation: Quat.fromPitchYawRollDegrees(-90,0,0) + }); + } + + if (!myAvatarName) { + myAvatarName = Overlays.addOverlay("text", { + width: 40, + height: AVATAR_DISPLAY_NAME_HEIGHT, + textAlignCenter: true, + color: { red: 255, green: 255, blue: 255}, + backgroundAlpha: 0.0, + font: {size: 68, bold: true}, + textRaiseColor: { red: 0, green: 0, blue: 0}, + visible: false, + text: "Me" + }); + } + + if (myAvatarIcon) { + Overlays.editOverlay(myAvatarIcon, { + visible: true, + dimensions: iconDimensions, + position: iconPos + }); + + } + var textSize = (14 + (iconDimensions.y - 0.03) * 15 / 0.06); + + Overlays.editOverlay(myAvatarName, { + visible: true, + x: x - 18 + (iconDimensions.y - 0.03) * 2 / 0.06, + y: y + iconDimensions.y * 550, + font: {size: textSize, bold: true}, + }); + + +} + +function hideAllAvatarIcons() { + var len = avatarsIcons.length; + for (var i = 0; i < len; i++) { + Overlays.editOverlay(avatarsIcons[i], {visible: false}); + } + len = avatarsNames.length; + for (var j = 0; j < len; j++) { + Overlays.editOverlay(avatarsNames[j], {visible: false}); + } + if (myAvatarIcon) { + Overlays.editOverlay(myAvatarIcon, {visible: false}); + } + Overlays.editOverlay(myAvatarName, {visible: false}) +} + +function renderAllOthersAvatarIcons() { + var avatarPos; + var iconDimensions = avatarIconPlaneDimensions(); + var commonY = Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS; + var borderPoints = [ + computePointAtPlaneY(0, 0, commonY), + computePointAtPlaneY(Window.innerWidth, Window.innerHeight, commonY) + ]; + + for (var QUuid in avatarsData) { + if (avatarsData.hasOwnProperty(QUuid)) { + if (AvatarList.getAvatar(QUuid) != null) { + avatarPos = AvatarList.getAvatar(QUuid).position; + + var cameraPos = Camera.position; + var p1 = findLineToHeightIntersectionCoords(avatarPos.x, avatarPos.y, avatarPos.z, + cameraPos.x, cameraPos.y, cameraPos.z, + commonY); + + var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) / (borderPoints[1].x - borderPoints[0].x); + var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); + + if (avatarsData[QUuid].icon != undefined) { + var iconPos = findLineToHeightIntersectionCoords( avatarPos.x, avatarPos.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, avatarPos.z, + Camera.position.x, Camera.position.y, Camera.position.z, + Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + if (!iconPos) { print ("avatar icon pos bad for " + QUuid); continue; } + if (avatarsData[QUuid].needRefresh) { + var avat = AvatarList.getAvatar(QUuid); + if (avat && avat.displayName) { + Overlays.editOverlay(avatarsData[QUuid].name, { + width: avat.displayName.length * AVATAR_DISPLAY_NAME_CHAR_WIDTH, + text: avat.displayName, + textAlignCenter: true + }); + avatarsData[QUuid].needRefresh = false; + } + } + var textSize = (14 + (iconDimensions.y - 0.03) * 15 / 0.06); + Overlays.editOverlay(avatarsData[QUuid].icon, { + visible: true, + dimensions: iconDimensions, + position: iconPos + }); + Overlays.editOverlay(avatarsData[QUuid].name, { + visible: true, + x: x - avatarsData[QUuid].textWidth * 0.5, + y: y + iconDimensions.y * 550, + font: {size: textSize, bold: true} + }); + } + } + } + } +} + +function entityAdded(entityID) { + printd ("Entity added " + entityID); + var props = Entities.getEntityProperties(entityID, ["type"]); + printd ("Entity added " + entityID + " PROPS " + JSON.stringify(props)); + if (props && props.type == "Web") { + printd ("Entity Web added " + entityID); + saveEntityData(entityID, true); + } +} + +function entityRemoved(entityID) { + printd ("Entity removed " + entityID); + var props = Entities.getEntityProperties(entityID, ["type"]); + if (props && props.type == "Web") { + print ("Entity Web removed " + entityID); + removeEntityData(entityID); + } +} + +/******************************************************************************************************** + * Entities (to remark) cache structure for showing entities markers + ********************************************************************************************************/ + +var entitiesData = {}; // by entityID +var entitiesByOverlayID = {}; // by overlayID +var entitiesIcons = []; // a parallel list of icons (overlays) to easily run through + +var ICON_ENTITY_WEB_MODEL_URL = Script.resolvePath("../assets/images/web.svg"); +var ICON_ENTITY_IMG_MODEL_URL = Script.resolvePath("../assets/models/teleport-cancel.fbx"); // FIXME - use correct model&texture +var ICON_ENTITY_DEFAULT_DIMENSIONS = { + x: 0.10, + y: 0.00001, + z: 0.10 +}; + +var entityIconModelDimensionsVal = { x: 0, y: 0.00001, z: 0}; +function entityIconModelDimensions() { + // given the current height, give a size + var xz = -0.002831 * radarHeight + 0.1; + entityIconModelDimensionsVal.x = xz; + entityIconModelDimensionsVal.z = xz; + // reuse object + return entityIconModelDimensionsVal; +} +/* + * entityIconPlaneDimensions: similar to entityIconModelDimensions but using xy plane + */ +function entityIconPlaneDimensions() { + var dim = entityIconModelDimensions(); + var z = dim.z; + dim.z = dim.y; + dim.y = z; + return dim; +} + +function currentOverlayForEntity(QUuid) { + if (entitiesData[QUuid] != undefined) { + return entitiesData[QUuid].icon; + } else { + return null; + } +} + +function saveEntityData(QUuid, planar) { + if (QUuid == null) return; + var entity = Entities.getEntityProperties(QUuid, ["position"]); + printd("entity added save entity " + QUuid); + if (entitiesData[QUuid] != undefined) { + entitiesData[QUuid].position = entity.position; + } else { + var entityIcon = Overlays.addOverlay("image3d", { + subImage: { x: 0, y: 0, width: 150, height: 150}, + url: ICON_ENTITY_WEB_MODEL_URL, + dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, + visible: false, + ignoreRayIntersection: false, + orientation: Quat.fromPitchYawRollDegrees(-90,0,0) + }); + + + entitiesIcons.push(entityIcon); + entitiesData[QUuid] = { position: entity.position, icon: entityIcon}; + entitiesByOverlayID[entityIcon] = QUuid; + } +} + +function removeEntityData(QUuid) { + if (QUuid == null) return; + + var itsOverlay = currentOverlayForEntity(QUuid); + if (itsOverlay != null) { + Overlays.deleteOverlay(itsOverlay); + delete entitiesByOverlayID[itsOverlay]; + } + var idx = entitiesIcons.indexOf(itsOverlay); + entitiesIcons.splice(idx, 1); + + delete entitiesData[QUuid]; +} + +/******************************************************************************************************** + * Entities to remark Icon/Markers rendering + ********************************************************************************************************/ + +function hideAllEntitiesIcons() { + var len = entitiesIcons.length; + for (var i = 0; i < len; i++) { + Overlays.editOverlay(entitiesIcons[i], {visible: false}); + } +} + +function renderAllEntitiesIcons() { + var entityPos; + var entityProps; + var iconDimensions = entityIconModelDimensions(); + var planeDimensions = entityIconPlaneDimensions(); // plane overlays uses xy instead of xz + for (var QUuid in entitiesData) { + if (entitiesData.hasOwnProperty(QUuid)) { + entityProps = Entities.getEntityProperties(QUuid, ["position","visible"]); + if (entityProps != null) { + entityPos = entityProps.position; + if (entitiesData[QUuid].icon != undefined && entityPos) { + var iconPos = findLineToHeightIntersectionCoords( entityPos.x, entityPos.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, entityPos.z, + Camera.position.x, Camera.position.y, Camera.position.z, + Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + if (!iconPos) { printd ("entity icon pos bad for " + QUuid); continue; } + var dimensions = entitiesData[QUuid].planar? planeDimensions : iconDimensions; + Overlays.editOverlay(entitiesData[QUuid].icon, { + visible: entityProps.visible, + dimensions: dimensions, + position: iconPos + }); + } + } + } + } +} + +/******************************************************************************************************** + * + ********************************************************************************************************/ + +function startRadar() { + printd("avatar added my avatar is " + MyAvatar.sessionUUID); + saveAllOthersAvatarsData(); + Camera.mode = "independent"; + + Camera.position = Vec3.sum(MyAvatar.position, {x:0, y: radarHeight, z: 0}); + Camera.orientation = Quat.fromPitchYawRollDegrees(-90,0,0); + radar = true; + + connectRadarModeEvents(); +} + +function endRadar() { + printd("-- endRadar"); + Camera.mode = "first person"; + radar = false; + + disconnectRadarModeEvents(); + hideAllEntitiesIcons(); + hideAllAvatarIcons(); +} + +function onRadarModeClicked() { + startRadar(); +} + +function onMyViewModeClicked() { + endRadar(); +} + +radarModeInterface.startRadarMode = function () { + startRadar(); +}; + +radarModeInterface.endRadarMode = function () { + endRadar(); +}; + +radarModeInterface.init = function() { + init(); +} + +radarModeInterface.setUniqueColor = function(c) { + uniqueColor = c; +}; + +module.exports = radarModeInterface; + +function updateRadar() { + // Update avatar icons + if (startedDraggingCamera) { + hideAllAvatarIcons(); + hideAllEntitiesIcons(); + startedDraggingCamera = false; + } else if (!draggingCamera) { + renderMyAvatarIcon(); + renderAllOthersAvatarIcons(); + renderAllEntitiesIcons(); + } +} + +function valueIfDefined(value) { + return value !== undefined ? value : ""; +} + +function entitiesAnalysis() { + var ids = Entities.findEntitiesInFrustum(Camera.frustum); + var entities = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + var properties = Entities.getEntityProperties(id); + entities.push({ + id: id, + name: properties.name, + type: properties.type, + url: properties.type == "Model" ? properties.modelURL : "", + sourceUrl: properties.sourceUrl, + locked: properties.locked, + visible: properties.visible, + drawCalls: valueIfDefined(properties.renderInfo.drawCalls), + hasScript: properties.script !== "" + }); + } +} + +function connectRadarModeEvents() { + Script.update.connect(updateRadar); // 60Hz loop + Controller.keyPressEvent.connect(keyPressEvent); + Controller.mousePressEvent.connect(mousePress); // single click/touch + Controller.touchUpdateEvent.connect(touchUpdate); + MyAvatar.positionGoneTo.connect(positionGoneTo); +} + +function positionGoneTo() { + Camera.position = Vec3.sum(MyAvatar.position, {x:0, y: radarHeight, z: 0}); +} + +function disconnectRadarModeEvents() { + Script.update.disconnect(updateRadar); + Controller.keyPressEvent.disconnect(keyPressEvent); + Controller.mousePressEvent.disconnect(mousePress); + Controller.touchUpdateEvent.disconnect(touchUpdate); + MyAvatar.positionGoneTo.disconnect(positionGoneTo); +} + +function init() { + tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + + Controller.touchBeginEvent.connect(touchBegin); + Controller.touchEndEvent.connect(touchEnd); + + AvatarList.avatarAddedEvent.connect(avatarAdded); + AvatarList.avatarRemovedEvent.connect(avatarRemoved); + + Entities.addingEntity.connect(entityAdded); + Entities.deletingEntity.connect(entityRemoved); +} + + diff --git a/scripts/system/+android/uniqueColor.js b/scripts/system/+android/uniqueColor.js new file mode 100644 index 0000000000..c296b6c87d --- /dev/null +++ b/scripts/system/+android/uniqueColor.js @@ -0,0 +1,46 @@ +"use strict"; +// +// uniqueColor.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on 17 Oct 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 +// + +var colorsMap = {}; +var colorsCount = 0; + // 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'magenta' +var baseColors = [ '#EB3345', '#F0851F', '#FFCD29', '#94C338', '#11A6C5', '#294C9F', '#C01D84' ]; + +function getNextColor(n) { + var N = baseColors.length; + /*if (n < baseColors.length) { + return baseColors[n]; + } else { + var baseColor = baseColors[n % N]; + var d = (n / N) % 10; + var c2 = "" + Qt.lighter(baseColor, 1 + d / 10); + return c2; + }*/ + return baseColors[n%N]; +} + +function getColorForId(uuid) { + if (colorsMap == undefined) { + colorsMap = {}; + } + if (!colorsMap.hasOwnProperty(uuid)) { + colorsMap[uuid] = getNextColor(colorsCount); + colorsCount = colorsCount + 1; + } + return colorsMap[uuid]; +} + +module.exports = { + getColor: function(id) { + return getColorForId(id); + } +}; From bb4f57f982e41eefeb27320ae3c885462fd842a8 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 5 Feb 2018 20:51:26 -0300 Subject: [PATCH 063/267] Android - Avatar selection window accessible from the bottom bar. Only hardcoded avatars, no marketplace. --- .../resources/icons/+android/avatar-a.svg | 38 + .../resources/icons/+android/avatar-i.svg | 38 + .../resources/icons/+android/button-a.svg | 949 +++++++++++++++++ interface/resources/icons/+android/button.svg | 949 +++++++++++++++++ interface/resources/icons/+android/tick.svg | 950 ++++++++++++++++++ .../qml/controls-uit/+android/ImageButton.qml | 82 ++ .../qml/hifi/+android/AvatarOption.qml | 117 +++ .../qml/hifi/+android/HifiConstants.qml | 4 +- .../qml/hifi/+android/avatarSelection.qml | 175 ++++ interface/src/Application.cpp | 2 + interface/src/Application.h | 2 + scripts/system/+android/avatarSelection.js | 159 +++ scripts/system/+android/bottombar.js | 47 +- 13 files changed, 3509 insertions(+), 3 deletions(-) create mode 100755 interface/resources/icons/+android/avatar-a.svg create mode 100755 interface/resources/icons/+android/avatar-i.svg create mode 100644 interface/resources/icons/+android/button-a.svg create mode 100644 interface/resources/icons/+android/button.svg create mode 100644 interface/resources/icons/+android/tick.svg create mode 100644 interface/resources/qml/controls-uit/+android/ImageButton.qml create mode 100644 interface/resources/qml/hifi/+android/AvatarOption.qml create mode 100644 interface/resources/qml/hifi/+android/avatarSelection.qml create mode 100644 scripts/system/+android/avatarSelection.js diff --git a/interface/resources/icons/+android/avatar-a.svg b/interface/resources/icons/+android/avatar-a.svg new file mode 100755 index 0000000000..165b39943e --- /dev/null +++ b/interface/resources/icons/+android/avatar-a.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/interface/resources/icons/+android/avatar-i.svg b/interface/resources/icons/+android/avatar-i.svg new file mode 100755 index 0000000000..c1557487ea --- /dev/null +++ b/interface/resources/icons/+android/avatar-i.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/interface/resources/icons/+android/button-a.svg b/interface/resources/icons/+android/button-a.svg new file mode 100644 index 0000000000..d469154775 --- /dev/null +++ b/interface/resources/icons/+android/button-a.svg @@ -0,0 +1,949 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/button.svg b/interface/resources/icons/+android/button.svg new file mode 100644 index 0000000000..8c19332064 --- /dev/null +++ b/interface/resources/icons/+android/button.svg @@ -0,0 +1,949 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/tick.svg b/interface/resources/icons/+android/tick.svg new file mode 100644 index 0000000000..2c451c0994 --- /dev/null +++ b/interface/resources/icons/+android/tick.svg @@ -0,0 +1,950 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/qml/controls-uit/+android/ImageButton.qml b/interface/resources/qml/controls-uit/+android/ImageButton.qml new file mode 100644 index 0000000000..5ebf7cd3e9 --- /dev/null +++ b/interface/resources/qml/controls-uit/+android/ImageButton.qml @@ -0,0 +1,82 @@ +// +// ImageButton.qml +// interface/resources/qml/controls-uit +// +// Created by Gabriel Calero & Cristian Duarte on 12 Oct 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.Layouts 1.3 +import "../styles-uit" as HifiStyles + +Item { + id: button + + property string text: "" + property string source : "" + property string hoverSource : "" + property real fontSize: 10 + property string fontColor: "#FFFFFF" + property string hoverFontColor: "#000000" + + signal clicked(); + + Rectangle { + color: "transparent" + anchors.fill: parent + Image { + id: image + anchors.fill: parent + source: button.source + } + + HifiStyles.FiraSansRegular { + id: buttonText + anchors.centerIn: parent + text: button.text + color: button.fontColor + font.pixelSize: button.fontSize + } + + MouseArea { + anchors.fill: parent + onClicked: button.clicked(); + onEntered: { + button.state = "hover state"; + } + onExited: { + button.state = "base state"; + } + } + + + } + states: [ + State { + name: "hover state" + PropertyChanges { + target: image + source: button.hoverSource + } + PropertyChanges { + target: buttonText + color: button.hoverFontColor + } + }, + State { + name: "base state" + PropertyChanges { + target: image + source: button.source + } + PropertyChanges { + target: buttonText + color: button.fontColor + } + } + ] +} \ No newline at end of file diff --git a/interface/resources/qml/hifi/+android/AvatarOption.qml b/interface/resources/qml/hifi/+android/AvatarOption.qml new file mode 100644 index 0000000000..e7056baa36 --- /dev/null +++ b/interface/resources/qml/hifi/+android/AvatarOption.qml @@ -0,0 +1,117 @@ +// +// AvatarOption.qml +// interface/resources/qml/hifi/android +// +// Created by Cristian Duarte & Gabriel Calero on 12 Oct 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.Layouts 1.3 +import QtQuick 2.5 +import "../controls-uit" as HifiControlsUit + +ColumnLayout { + id: itemRoot + + property string type: ""; + + property string thumbnailUrl: ""; + property string avatarUrl: ""; + property string avatarName: ""; + property bool avatarSelected: false; + + property string methodName: ""; + property string actionText: ""; + + spacing: 4*3 + signal sendToParentQml(var message); + + Image { + id: itemImage + Layout.preferredWidth: 250*3 + Layout.preferredHeight: 140*3 + source: thumbnailUrl + asynchronous: true + fillMode: Image.PreserveAspectFit + + MouseArea { + id: itemArea + anchors.fill: parent + hoverEnabled: true + enabled: true + onClicked: { + if (type=="avatar") { + if (!avatarSelected) sendToParentQml({ method: "selectAvatar", params: { avatarUrl: avatarUrl } }); + } else { + sendToParentQml({ method: methodName, params: { } }); + } + } + } + + } + + Text { + id: itemName + text: avatarName + color: "#FFFFFF" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + anchors.horizontalCenter: itemImage.horizontalCenter + font.pointSize: 5*3 + wrapMode: Text.WordWrap + width: parent + MouseArea { + id: itemNameArea + anchors.fill: parent + hoverEnabled: true + enabled: true + onClicked: { + if (type=="avatar") { + if (!avatarSelected) sendToParentQml({ method: "selectAvatar", params: { avatarUrl: avatarUrl } }); + } else { + sendToParentQml({ method: methodName, params: { } }); + } + } + } + } + + HifiControlsUit.ImageButton { + width: 140*3 + height: 35*3 + text: type=="extra"? actionText: "CHOOSE" + source: "../../../../icons/button.svg" + hoverSource: "../../../../icons/button-a.svg" + fontSize: 18*3 + fontColor: "#2CD8FF" + hoverFontColor: "#FFFFFF" + anchors { + horizontalCenter: itemName.horizontalCenter + } + visible: !avatarSelected + onClicked: { + if (type=="avatar") { + if (!avatarSelected) sendToParentQml({ method: "selectAvatar", params: { avatarUrl: avatarUrl } }); + } else { + sendToParentQml({ method: methodName, params: { } }); + } + } + } + + Image { + id: tickImage + width: 35*3 + height: 35*3 + source: "../../../icons/tick.svg" + anchors { + horizontalCenter: itemName.horizontalCenter + } + visible: avatarSelected + } + + Component.onCompleted:{ + sendToParentQml.connect(sendToScript); + } +} \ No newline at end of file diff --git a/interface/resources/qml/hifi/+android/HifiConstants.qml b/interface/resources/qml/hifi/+android/HifiConstants.qml index ee6d92ed38..f74cc554aa 100644 --- a/interface/resources/qml/hifi/+android/HifiConstants.qml +++ b/interface/resources/qml/hifi/+android/HifiConstants.qml @@ -20,8 +20,8 @@ Item { Item { id: dimen - readonly property real windowLessWidth: 126 - readonly property real windowLessHeight: 64 + readonly property real windowLessWidth: 126*3 + readonly property real windowLessHeight: 64*3 readonly property real windowZ: 100 diff --git a/interface/resources/qml/hifi/+android/avatarSelection.qml b/interface/resources/qml/hifi/+android/avatarSelection.qml new file mode 100644 index 0000000000..3090204308 --- /dev/null +++ b/interface/resources/qml/hifi/+android/avatarSelection.qml @@ -0,0 +1,175 @@ +// +// avatarSelection.qml +// interface/resources/qml/android +// +// Created by Gabriel Calero & Cristian Duarte on 21 Sep 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.Layouts 1.3 +import Hifi 1.0 + +import "../../styles" +import "." +import ".." +import ".." as QmlHifi +import "../../styles-uit" as HifiStyles + + +Item { + + id: top + + HifiConstants { id: android } + width: parent ? parent.width - android.dimen.windowLessWidth : 0 + height: parent ? parent.height - android.dimen.windowLessHeight : 0 + z: android.dimen.windowZ + anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom } + + signal sendToScript(var message); + + property bool shown: true + + onShownChanged: { + top.visible = shown; + } + + + HifiConstants { id: hifi } + HifiStyles.HifiConstants { id: hifiStyleConstants } + + property int cardWidth: 250 *3; + property int cardHeight: 240 *3; + property int gap: 14 *3; + + property var avatarsArray: []; + property var extraOptionsArray: []; + + function hide() { + shown = false; + sendToScript ({ method: "hide" }); + } + + Rectangle { + + width: parent ? parent.width : 0 + height: parent ? parent.height : 0 + + gradient: Gradient { + GradientStop { position: 0.0; color: android.color.gradientTop } + GradientStop { position: 1.0; color: android.color.gradientBottom } + } + + QmlHifi.WindowHeader { + id: header + iconSource: "../../../../icons/avatar-i.svg" + titleText: "AVATAR" + } + + ListModel { id: avatars } + + ListView { + id: scroll + height: 250*3 + property int stackedCardShadowHeight: 10*3; + spacing: gap; + clip: true; + anchors { + left: parent.left + right: parent.right + top: header.bottom + topMargin: gap + leftMargin: gap + rightMargin: gap + } + model: avatars; + orientation: ListView.Horizontal; + delegate: QmlHifi.AvatarOption { + type: model.type; + thumbnailUrl: model.thumbnailUrl; + avatarUrl: model.avatarUrl; + avatarName: model.avatarName; + avatarSelected: model.avatarSelected; + methodName: model.methodName; + actionText: model.actionText; + } + highlightMoveDuration: -1; + highlightMoveVelocity: -1; + } + + } + + function escapeRegExp(str) { + return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + } + function replaceAll(str, find, replace) { + return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); + } + + function refreshSelected(selectedAvatarUrl) { + // URL as ID? + avatarsArray.forEach(function (avatarData) { + avatarData.avatarSelected = (selectedAvatarUrl == avatarData.avatarUrl); + console.log('[avatarSelection] avatar : ', avatarData.avatarName, ' is selected? ' , avatarData.avatarSelected); + }); + } + + function addAvatar(name, thumbnailUrl, avatarUrl) { + avatarsArray.push({ + type: "avatar", + thumbnailUrl: thumbnailUrl, + avatarUrl: avatarUrl, + avatarName: name, + avatarSelected: false, + methodName: "", + actionText: "" + }); + } + + function showAvatars() { + avatars.clear(); + avatarsArray.forEach(function (avatarData) { + avatars.append(avatarData); + console.log('[avatarSelection] adding avatar to model: ', JSON.stringify(avatarData)); + }); + extraOptionsArray.forEach(function (extraData) { + avatars.append(extraData); + console.log('[avatarSelection] adding extra option to model: ', JSON.stringify(extraData)); + }); + } + + function addExtraOption(showName, thumbnailUrl, methodNameWhenClicked, actionText) { + extraOptionsArray.push({ + type: "extra", + thumbnailUrl: thumbnailUrl, + avatarUrl: "", + avatarName: showName, + avatarSelected: false, + methodName: methodNameWhenClicked, + actionText: actionText + }); + } + + function fromScript(message) { + //console.log("[CHAT] fromScript " + JSON.stringify(message)); + switch (message.type) { + case "addAvatar": + addAvatar(message.name, message.thumbnailUrl, message.avatarUrl); + break; + case "addExtraOption": + //(showName, thumbnailUrl, methodNameWhenClicked, actionText) + addExtraOption(message.showName, message.thumbnailUrl, message.methodNameWhenClicked, message.actionText); + break; + case "refreshSelected": + refreshSelected(message.selectedAvatarUrl); + break; + case "showAvatars": + showAvatars(); + break; + default: + } + } +} \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6fec6f1d72..cbcd08c667 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5939,6 +5939,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe scriptEngine->registerGlobalObject("ContextOverlay", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Wallet", DependencyManager::get().data()); + scriptEngine->registerGlobalObject("App", this); + qScriptRegisterMetaType(scriptEngine.data(), OverlayIDtoScriptValue, OverlayIDfromScriptValue); DependencyManager::get()->registerMetaTypes(scriptEngine.data()); diff --git a/interface/src/Application.h b/interface/src/Application.h index 8f0690bda1..5161c62a65 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -389,6 +389,8 @@ public slots: const QString getPreferredCursor() const { return _preferredCursor.get(); } void setPreferredCursor(const QString& cursor); + Q_INVOKABLE bool askBeforeSetAvatarUrl(const QString& avatarUrl) { return askToSetAvatarUrl(avatarUrl); } + private slots: void showDesktop(); void clearDomainOctreeDetails(); diff --git a/scripts/system/+android/avatarSelection.js b/scripts/system/+android/avatarSelection.js new file mode 100644 index 0000000000..fd938236fb --- /dev/null +++ b/scripts/system/+android/avatarSelection.js @@ -0,0 +1,159 @@ +"use strict"; +// +// avatarSelection.js +// scripts/system/ +// +// Created by Gabriel Calero & Cristian Duarte on 21 Sep 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 +// + +var window; + +var logEnabled = true; +var isVisible = false; + +function printd(str) { + if (logEnabled) + print("[avatarSelection.js] " + str); +} + +function fromQml(message) { // messages are {method, params}, like json-rpc. See also sendToQml. + var data; + printd("fromQml " + JSON.stringify(message)); + switch (message.method) { + case 'selectAvatar': + // use this message.params.avatarUrl + printd("Selected Avatar: [" + message.params.avatarUrl + "]"); + App.askBeforeSetAvatarUrl(message.params.avatarUrl); + break; + case 'openAvatarMarket': + // good + App.openUrl("https://metaverse.highfidelity.com/marketplace?category=avatars"); + break; + case 'hide': + module.exports.onHidden(); + break; + default: + print('[avatarSelection.js] Unrecognized message from avatarSelection.qml:', JSON.stringify(message)); + } +} + +function sendToQml(message) { + if (!window) { + print("[avatarSelection.js] There is no window object"); + return; + } + window.sendToQml(message); +} + +function refreshSelected(currentAvatarURL) { + sendToQml({ + type: "refreshSelected", + selectedAvatarUrl: currentAvatarURL + }); + + sendToQml({ + type: "showAvatars" + }); +} + +function init() { + if (!window) { + print("[avatarSelection.js] There is no window object for init()"); + return; + } + var DEFAULT_AVATAR_URL = "http://mpassets.highfidelity.com/f14bf7c9-49a1-4249-988a-0a577ed78957-v1/beingOfLight.fst"; + sendToQml({ + type: "addAvatar", + name: "Being of Light Avatar", + thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/f14bf7c9-49a1-4249-988a-0a577ed78957/thumbnail/hifi-mp-f14bf7c9-49a1-4249-988a-0a577ed78957.jpg", + avatarUrl: DEFAULT_AVATAR_URL + }); + sendToQml({ + type: "addAvatar", + name: "Cody", + thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53/thumbnail/hifi-mp-8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53.jpg", + avatarUrl: "http://mpassets.highfidelity.com/8c859fca-4cbd-4e82-aad1-5f4cb0ca5d53-v1/cody.fst" + }); + sendToQml({ + type: "addAvatar", + name: "Mixamo Will", + thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73/thumbnail/hifi-mp-d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73.jpg", + avatarUrl: "http://mpassets.highfidelity.com/d029ae8d-2905-4eb7-ba46-4bd1b8cb9d73-v1/4618d52e711fbb34df442b414da767bb.fst" + }); + sendToQml({ + type: "addAvatar", + name: "Albert", + thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/1e57c395-612e-4acd-9561-e79dbda0bc49/thumbnail/hifi-mp-1e57c395-612e-4acd-9561-e79dbda0bc49.jpg", + avatarUrl: "http://mpassets.highfidelity.com/1e57c395-612e-4acd-9561-e79dbda0bc49-v1/albert.fst" + }); + /* We need to implement the wallet, so let's skip this for the moment + sendToQml({ + type: "addExtraOption", + showName: "More choices", + thumbnailUrl: "../../../images/moreAvatars.png", + methodNameWhenClicked: "openAvatarMarket", + actionText: "MARKETPLACE" + }); + */ + var currentAvatarURL = Settings.getValue('Avatar/fullAvatarURL', DEFAULT_AVATAR_URL); + printd("Default Avatar: [" + DEFAULT_AVATAR_URL + "]"); + printd("Current Avatar: [" + currentAvatarURL + "]"); + if (!currentAvatarURL || 0 === currentAvatarURL.length) { + currentAvatarURL = DEFAULT_AVATAR_URL; + } + refreshSelected(currentAvatarURL); +} + +module.exports = { + init: function() { + window = new QmlFragment({ + qml: "hifi/avatarSelection.qml", + visible: false + }); + /*, + visible: false*/ + if (window) { + window.fromQml.connect(fromQml); + } + init(); + }, + show: function() { + if (window) { + window.setVisible(true); + isVisible = true; + } + }, + hide: function() { + if (window) { + window.setVisible(false); + } + isVisible = false; + }, + destroy: function() { + if (window) { + window.fromQml.disconnect(fromQml); + window.close(); + window = null; + } + }, + isVisible: function() { + return isVisible; + }, + width: function() { + return window ? window.size.x : 0; + }, + height: function() { + return window ? window.size.y : 0; + }, + position: function() { + return window && isVisible ? window.position : null; + }, + refreshSelectedAvatar: function(currentAvatarURL) { + refreshSelected(currentAvatarURL); + }, + onHidden: function() { } +}; diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js index e58840ad6f..db05b88b04 100644 --- a/scripts/system/+android/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -14,8 +14,10 @@ var bottombar; var bottomHudOptionsBar; var gotoBtn; +var avatarBtn; var gotoScript = Script.require('./goto.js'); +var avatarSelection = Script.require('./avatarSelection.js'); var logEnabled = false; @@ -34,6 +36,8 @@ function init() { hideAddressBar(); } }); + avatarSelection.init(); + App.fullAvatarURLChanged.connect(processedNewAvatar); setupBottomBar(); setupBottomHudOptionsBar(); @@ -43,6 +47,7 @@ function init() { } function shutdown() { + App.fullAvatarURLChanged.disconnect(processedNewAvatar); } function setupBottomBar() { @@ -60,6 +65,32 @@ function setupBottomBar() { } }); + avatarBtn = bottombar.addButton({ + icon: "icons/avatar-i.svg", + activeIcon: "icons/avatar-a.svg", + bgOpacity: 0, + height: 240, + width: 294, + hoverBgOpacity: 0, + activeBgOpacity: 0, + activeHoverBgOpacity: 0, + iconSize: 108, + textSize: 45, + text: "AVATAR" + }); + avatarBtn.clicked.connect(function() { + printd("Avatar button clicked"); + if (!avatarSelection.isVisible()) { + showAvatarSelection(); + } else { + hideAvatarSelection(); + } + }); + avatarSelection.onHidden = function() { + if (avatarBtn) { + avatarBtn.isActive = false; + } + }; gotoBtn = bottombar.addButton({ icon: "icons/goto-i.svg", @@ -69,7 +100,7 @@ function setupBottomBar() { activeBgOpacity: 0, activeHoverBgOpacity: 0, height: 240, - width: 300, + width: 294, iconSize: 108, textSize: 45, text: "GO TO" @@ -148,7 +179,21 @@ function hideAddressBar() { gotoBtn.isActive = false; } +function showAvatarSelection() { + avatarSelection.show(); + avatarBtn.isActive = true; +} +function hideAvatarSelection() { + avatarSelection.hide(); + avatarBtn.isActive = false; +} + +// TODO: Move to avatarSelection.js and make it possible to hide the window from there AND switch the button state here too +function processedNewAvatar(url, modelName) { + avatarSelection.refreshSelectedAvatar(url); + hideAvatarSelection(); +} Script.scriptEnding.connect(function () { shutdown(); From fe5075bff2695559cc7a4269ed50685824012cc9 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 6 Feb 2018 18:25:06 -0300 Subject: [PATCH 064/267] Android - Use the Wooden Mannequin avatar instead of being of light in the Avatar window --- scripts/system/+android/avatarSelection.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/system/+android/avatarSelection.js b/scripts/system/+android/avatarSelection.js index fd938236fb..be58f61ac2 100644 --- a/scripts/system/+android/avatarSelection.js +++ b/scripts/system/+android/avatarSelection.js @@ -65,11 +65,11 @@ function init() { print("[avatarSelection.js] There is no window object for init()"); return; } - var DEFAULT_AVATAR_URL = "http://mpassets.highfidelity.com/f14bf7c9-49a1-4249-988a-0a577ed78957-v1/beingOfLight.fst"; + var DEFAULT_AVATAR_URL = "http://mpassets.highfidelity.com/7fe80a1e-f445-4800-9e89-40e677b03bee-v3/mannequin.fst"; sendToQml({ type: "addAvatar", - name: "Being of Light Avatar", - thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/f14bf7c9-49a1-4249-988a-0a577ed78957/thumbnail/hifi-mp-f14bf7c9-49a1-4249-988a-0a577ed78957.jpg", + name: "Wooden Mannequin", + thumbnailUrl: "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/7fe80a1e-f445-4800-9e89-40e677b03bee/thumbnail/hifi-mp-7fe80a1e-f445-4800-9e89-40e677b03bee.jpg", avatarUrl: DEFAULT_AVATAR_URL }); sendToQml({ From 8d6d078ea2c46e20f34ccb0de5962e91e8d10ade Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 6 Feb 2018 22:52:29 -0300 Subject: [PATCH 065/267] Android - Make radar turn of the virtual pad --- scripts/system/+android/radar.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js index 9fa07178f6..baf4441749 100644 --- a/scripts/system/+android/radar.js +++ b/scripts/system/+android/radar.js @@ -1100,6 +1100,8 @@ function startRadar() { Camera.orientation = Quat.fromPitchYawRollDegrees(-90,0,0); radar = true; + Controller.setVPadEnabled(false); // this was done before in CompositeExtra in the DisplayPlugin (Checking for camera not independent, not radar mode) + connectRadarModeEvents(); } @@ -1108,6 +1110,8 @@ function endRadar() { Camera.mode = "first person"; radar = false; + Controller.setVPadEnabled(true); + disconnectRadarModeEvents(); hideAllEntitiesIcons(); hideAllAvatarIcons(); From 8c1a1eba02aa635e6085d2e5289cbef89de9fdae Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 7 Feb 2018 16:26:46 -0300 Subject: [PATCH 066/267] Android - Fix modes bar layout when expanded --- interface/resources/qml/hifi/+android/modesbar.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/hifi/+android/modesbar.qml b/interface/resources/qml/hifi/+android/modesbar.qml index 8ce455c2c1..fe71314ece 100644 --- a/interface/resources/qml/hifi/+android/modesbar.qml +++ b/interface/resources/qml/hifi/+android/modesbar.qml @@ -25,8 +25,8 @@ Item { } Component.onCompleted: { - width = 330; - height = 330; + width = 300 + 30; // That 30 is extra regardless the qty of items shown + height = 300 + 30; x=Window.innerWidth - width; } @@ -60,10 +60,10 @@ Item { function fromScript(message) { switch (message.type) { case "allButtonsShown": - modesbar.height = flowMain.children.length * 100 + 10; + modesbar.height = flowMain.children.length * 300 + 30; // That 30 is extra regardless the qty of items shown break; case "inactiveButtonsHidden": - modesbar.height = 100 + 10; + modesbar.height = 300 + 30; break; default: break; From 017f99837a7de2a728b72965489a9ae4495eee11 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 9 Feb 2018 17:27:55 -0300 Subject: [PATCH 067/267] Android - Sign in, Sign up and Sign out. Note: It's still desktop scaled, being some components small for a phone --- .../resources/icons/+android/login-a.svg | 990 ++++++++++++++++++ .../resources/icons/+android/login-i.svg | 990 ++++++++++++++++++ .../resources/qml/+android/LoginDialog.qml | 95 ++ .../LoginDialog/+android/LinkAccountBody.qml | 330 ++++++ .../qml/LoginDialog/+android/SignUpBody.qml | 297 ++++++ scripts/system/+android/bottombar.js | 39 + 6 files changed, 2741 insertions(+) create mode 100755 interface/resources/icons/+android/login-a.svg create mode 100755 interface/resources/icons/+android/login-i.svg create mode 100644 interface/resources/qml/+android/LoginDialog.qml create mode 100644 interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml create mode 100644 interface/resources/qml/LoginDialog/+android/SignUpBody.qml diff --git a/interface/resources/icons/+android/login-a.svg b/interface/resources/icons/+android/login-a.svg new file mode 100755 index 0000000000..8a7f097ed7 --- /dev/null +++ b/interface/resources/icons/+android/login-a.svg @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/+android/login-i.svg b/interface/resources/icons/+android/login-i.svg new file mode 100755 index 0000000000..6f011e1d13 --- /dev/null +++ b/interface/resources/icons/+android/login-i.svg @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/qml/+android/LoginDialog.qml b/interface/resources/qml/+android/LoginDialog.qml new file mode 100644 index 0000000000..4badd555fb --- /dev/null +++ b/interface/resources/qml/+android/LoginDialog.qml @@ -0,0 +1,95 @@ +// +// LoginDialog.qml +// +// Created by David Rowe on 3 Jun 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 Hifi 1.0 +import QtQuick 2.4 + +import "controls-uit" +import "styles-uit" +import "windows" + +import "LoginDialog" + +ModalWindow { + id: root + HifiConstants { id: hifi } + + property int scale: 3 + + objectName: "LoginDialog" + implicitWidth: 520 *scale + implicitHeight: 150 *scale + y:0 + destroyOnCloseButton: true + destroyOnHidden: true + visible: true + + property string iconText: "" + property int iconSize: 35 *scale + + property string title: "" + property int titleWidth: 0 + + keyboardOverride: true // Disable ModalWindow's keyboard. + + function tryDestroy() { + root.destroy() + } + + LoginDialog { + id: loginDialog + + Loader { + id: bodyLoader + source: loginDialog.isSteamRunning() ? "LoginDialog/+android/SignInBody.qml" : "LoginDialog/+android/LinkAccountBody.qml" + } + } + + Component.onCompleted: { + this.anchors.centerIn = undefined; + this.y=50 *scale; + this.x=150 *scale; + } + + Keys.onPressed: { + if (!visible) { + return + } + + if (event.modifiers === Qt.ControlModifier) + switch (event.key) { + case Qt.Key_A: + event.accepted = true + detailedText.selectAll() + break + case Qt.Key_C: + event.accepted = true + detailedText.copy() + break + case Qt.Key_Period: + if (Qt.platform.os === "osx") { + event.accepted = true + content.reject() + } + break + } else switch (event.key) { + case Qt.Key_Escape: + case Qt.Key_Back: + event.accepted = true + destroy() + break + + case Qt.Key_Enter: + case Qt.Key_Return: + event.accepted = true + break + } + } +} diff --git a/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml new file mode 100644 index 0000000000..3d8bcedb38 --- /dev/null +++ b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml @@ -0,0 +1,330 @@ +// +// LinkAccountBody.qml +// +// Created by Clement on 7/18/16 +// 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 Hifi 1.0 +import QtQuick 2.4 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 as OriginalStyles + +import "../../controls-uit" +import "../../styles-uit" + +Item { + id: linkAccountBody + + property int scale: 3 + + clip: true + height: 100 *scale + width: root.pane.width + property bool failAfterSignUp: false + function login() { + mainTextContainer.visible = false + toggleLoading(true) + loginDialog.login(usernameField.text, passwordField.text) + } + + property bool keyboardEnabled: false + property bool keyboardRaised: false + property bool punctuationMode: false + + onKeyboardRaisedChanged: d.resize(); + + QtObject { + id: d + readonly property int minWidth: 480 *scale + readonly property int maxWidth: 1280 *scale + readonly property int minHeight: 50 *scale + readonly property int maxHeight: 220 *scale + + function resize() { + var targetWidth = Math.max(titleWidth, form.contentWidth); + var targetHeight = hifi.dimensions.contentSpacing.y + mainTextContainer.height + + 4 * hifi.dimensions.contentSpacing.y + form.height + + hifi.dimensions.contentSpacing.y + buttons.height; + + if (additionalInformation.visible) { + targetWidth = Math.max(targetWidth, additionalInformation.width); + targetHeight += hifi.dimensions.contentSpacing.y + additionalInformation.height + } + + parent.width = root.width = Math.max(d.minWidth, Math.min(d.maxWidth, targetWidth)); + parent.height = 140 *scale; + /*root.height = Math.max(d.minHeight, Math.min(d.maxHeight, targetHeight)) + + (keyboardEnabled && keyboardRaised ? (200 + 2 * hifi.dimensions.contentSpacing.y) : hifi.dimensions.contentSpacing.y);*/ + } + } + + function toggleLoading(isLoading) { + linkAccountSpinner.visible = isLoading + form.visible = !isLoading + + if (loginDialog.isSteamRunning()) { + additionalInformation.visible = !isLoading + } + + leftButton.visible = !isLoading + buttons.visible = !isLoading + } + + BusyIndicator { + id: linkAccountSpinner + + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + topMargin: hifi.dimensions.contentSpacing.y + } + + visible: false + running: true + + width: 48 *scale + height: 48 *scale + } + + ShortcutText { + id: mainTextContainer + anchors { + top: parent.top + left: parent.left + margins: 0 + topMargin: hifi.dimensions.contentSpacing.y / 2 + } + + visible: false + + text: qsTr("Username or password incorrect.") + wrapMode: Text.WordWrap + color: hifi.colors.redAccent + lineHeight: 1 *scale + lineHeightMode: Text.ProportionalHeight + horizontalAlignment: Text.AlignHCenter + } + + Column { + id: form + anchors { + top: mainTextContainer.bottom + left: parent.left + margins: 0 + topMargin: 0 // hifi.dimensions.contentSpacing.y + } + spacing: hifi.dimensions.contentSpacing.y / 2 + + Row { + spacing: hifi.dimensions.contentSpacing.x + + TextField { + id: usernameField + anchors { + verticalCenter: parent.verticalCenter + } + width: 350 *scale + + placeholderText: qsTr("Username or Email") + } + + ShortcutText { + anchors { + verticalCenter: parent.verticalCenter + } + + text: "Forgot Username?" + + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + linkColor: hifi.colors.blueAccent + + onLinkActivated: loginDialog.openUrl(link) + } + } + Row { + spacing: hifi.dimensions.contentSpacing.x + + TextField { + id: passwordField + anchors { + verticalCenter: parent.verticalCenter + } + width: 350 *scale + + placeholderText: qsTr("Password") + echoMode: TextInput.Password + } + + ShortcutText { + anchors { + verticalCenter: parent.verticalCenter + } + + text: "Forgot Password?" + + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + linkColor: hifi.colors.blueAccent + + onLinkActivated: loginDialog.openUrl(link) + } + } + + } + + InfoItem { + id: additionalInformation + anchors { + top: form.bottom + left: parent.left + margins: 0 + topMargin: hifi.dimensions.contentSpacing.y + } + + visible: loginDialog.isSteamRunning() + + text: qsTr("Your steam account informations will not be exposed to other users.") + wrapMode: Text.WordWrap + color: hifi.colors.baseGrayHighlight + lineHeight: 1 *scale + lineHeightMode: Text.ProportionalHeight + horizontalAlignment: Text.AlignHCenter + } + + // Override ScrollingWindow's keyboard that would be at very bottom of dialog. + Keyboard { + raised: keyboardEnabled && keyboardRaised + numeric: punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: buttons.top + bottomMargin: keyboardRaised ? 2 * hifi.dimensions.contentSpacing.y : 0 + } + } + + Row { + id: leftButton + anchors { + left: parent.left + top: form.bottom + topMargin: hifi.dimensions.contentSpacing.y / 2 + } + + spacing: hifi.dimensions.contentSpacing.x + onHeightChanged: d.resize(); onWidthChanged: d.resize(); + + Button { + anchors.verticalCenter: parent.verticalCenter + + text: qsTr("Sign Up") + visible: !loginDialog.isSteamRunning() + + onClicked: { + bodyLoader.setSource("SignUpBody.qml") + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + } + } + + Row { + id: buttons + anchors { + right: parent.right + top: form.bottom + topMargin: hifi.dimensions.contentSpacing.y / 2 + } + spacing: hifi.dimensions.contentSpacing.x + onHeightChanged: d.resize(); onWidthChanged: d.resize(); + + Button { + id: linkAccountButton + anchors.verticalCenter: parent.verticalCenter + width: 200 *scale + + text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Login") + color: hifi.buttons.blue + + onClicked: { + Qt.inputMethod.hide(); + linkAccountBody.login(); + } + } + + Button { + anchors.verticalCenter: parent.verticalCenter + + text: qsTr("Cancel Pepe") + + onClicked: { + Qt.inputMethod.hide(); + root.destroy(); + } + } + } + + Component.onCompleted: { + root.title = qsTr("Sign Into High Fidelity") + root.iconText = "<" + keyboardEnabled = HMD.active; + d.resize(); + + if (failAfterSignUp) { + mainTextContainer.text = "Account created successfully." + mainTextContainer.visible = true + } + + //usernameField.forceActiveFocus(); + } + + Connections { + target: loginDialog + onHandleLoginCompleted: { + console.log("Login Succeeded, linking steam account") + + if (loginDialog.isSteamRunning()) { + loginDialog.linkSteam() + } else { + bodyLoader.setSource("../WelcomeBody.qml", { "welcomeBack" : true }) + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + } + onHandleLoginFailed: { + console.log("Login Failed") + mainTextContainer.visible = true + toggleLoading(false) + } + onHandleLinkCompleted: { + console.log("Link Succeeded") + + bodyLoader.setSource("../WelcomeBody.qml", { "welcomeBack" : true }) + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + onHandleLinkFailed: { + console.log("Link Failed") + toggleLoading(false) + } + } + + Keys.onPressed: { + if (!visible) { + return + } + + switch (event.key) { + case Qt.Key_Enter: + case Qt.Key_Return: + event.accepted = true + linkAccountBody.login() + break + } + } +} diff --git a/interface/resources/qml/LoginDialog/+android/SignUpBody.qml b/interface/resources/qml/LoginDialog/+android/SignUpBody.qml new file mode 100644 index 0000000000..b9f36c7ad7 --- /dev/null +++ b/interface/resources/qml/LoginDialog/+android/SignUpBody.qml @@ -0,0 +1,297 @@ +// +// SignUpBody.qml +// +// Created by Stephen Birarda on 7 Dec 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 Hifi 1.0 +import QtQuick 2.4 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 as OriginalStyles + +import "../../controls-uit" +import "../../styles-uit" + +Item { + id: signupBody + clip: true + height: root.pane.height + width: root.pane.width + + function signup() { + mainTextContainer.visible = false + toggleLoading(true) + loginDialog.signup(emailField.text, usernameField.text, passwordField.text) + } + + property bool keyboardEnabled: false + property bool keyboardRaised: false + property bool punctuationMode: false + + onKeyboardRaisedChanged: d.resize(); + + QtObject { + id: d + readonly property int minWidth: 480 + readonly property int maxWidth: 1280 + readonly property int minHeight: 100 + readonly property int maxHeight: 200 + + function resize() { + var targetWidth = Math.max(titleWidth, form.contentWidth); + var targetHeight = hifi.dimensions.contentSpacing.y + mainTextContainer.height + + 4 * hifi.dimensions.contentSpacing.y + form.height + + hifi.dimensions.contentSpacing.y + buttons.height; + + parent.width = root.width = Math.max(d.minWidth, Math.min(d.maxWidth, targetWidth)); + //parent.height = 650; + parent.height = root.height = Math.max(d.minHeight, Math.min(d.maxHeight, targetHeight)); + + } + } + + function toggleLoading(isLoading) { + linkAccountSpinner.visible = isLoading + form.visible = !isLoading + + leftButton.visible = !isLoading + buttons.visible = !isLoading + } + + BusyIndicator { + id: linkAccountSpinner + + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + topMargin: hifi.dimensions.contentSpacing.y + } + + visible: false + running: true + + width: 48 + height: 48 + } + + ShortcutText { + id: mainTextContainer + anchors { + top: parent.top + left: parent.left + margins: 0 + topMargin: hifi.dimensions.contentSpacing.y + } + + visible: false + + text: qsTr("There was an unknown error while creating your account.") + wrapMode: Text.WordWrap + color: hifi.colors.redAccent + horizontalAlignment: Text.AlignLeft + } + + Column { + id: form + anchors { + top: mainTextContainer.bottom + left: parent.left + margins: 0 + topMargin: 0; // 2 * hifi.dimensions.contentSpacing.y + } + spacing: hifi.dimensions.contentSpacing.y / 2 + + Row { + spacing: hifi.dimensions.contentSpacing.x + + TextField { + id: emailField + anchors { + verticalCenter: parent.verticalCenter + } + width: 350 + + placeholderText: "Email" + } + } + + Row { + spacing: hifi.dimensions.contentSpacing.x + + TextField { + id: usernameField + anchors { + verticalCenter: parent.verticalCenter + } + width: 350 + + placeholderText: "Username" + } + + ShortcutText { + anchors { + verticalCenter: parent.verticalCenter + } + + text: qsTr("No spaces / special chars.") + + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + + color: hifi.colors.blueAccent + } + } + + Row { + spacing: hifi.dimensions.contentSpacing.x + + TextField { + id: passwordField + anchors { + verticalCenter: parent.verticalCenter + } + width: 350 + + placeholderText: "Password" + echoMode: TextInput.Password + } + + ShortcutText { + anchors { + verticalCenter: parent.verticalCenter + } + + text: qsTr("At least 6 characters") + + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + + color: hifi.colors.blueAccent + } + } + + } + + // Override ScrollingWindow's keyboard that would be at very bottom of dialog. + Keyboard { + raised: keyboardEnabled && keyboardRaised + numeric: punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: buttons.top + bottomMargin: keyboardRaised ? 2 * hifi.dimensions.contentSpacing.y : 0 + } + } + + Row { + id: leftButton + anchors { + left: parent.left + top: form.bottom + topMargin: hifi.dimensions.contentSpacing.y / 2 + } + + spacing: hifi.dimensions.contentSpacing.x + onHeightChanged: d.resize(); onWidthChanged: d.resize(); + + Button { + anchors.verticalCenter: parent.verticalCenter + + text: qsTr("Existing User") + + onClicked: { + bodyLoader.setSource("LinkAccountBody-android.qml") + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + } + } + + Row { + id: buttons + anchors { + right: parent.right + top: form.bottom + topMargin: hifi.dimensions.contentSpacing.y / 2 + } + spacing: hifi.dimensions.contentSpacing.x + onHeightChanged: d.resize(); onWidthChanged: d.resize(); + + Button { + id: linkAccountButton + anchors.verticalCenter: parent.verticalCenter + width: 200 + + text: qsTr("Sign Up") + color: hifi.buttons.blue + + onClicked: signupBody.signup() + } + + Button { + anchors.verticalCenter: parent.verticalCenter + + text: qsTr("Cancel") + + onClicked: root.destroy() + } + } + + Component.onCompleted: { + root.title = qsTr("Create an Account") + root.iconText = "<" + keyboardEnabled = HMD.active; + d.resize(); + + emailField.forceActiveFocus(); + } + + Connections { + target: loginDialog + onHandleSignupCompleted: { + console.log("Sign Up Succeeded"); + + // now that we have an account, login with that username and password + loginDialog.login(usernameField.text, passwordField.text) + } + onHandleSignupFailed: { + console.log("Sign Up Failed") + toggleLoading(false) + + mainTextContainer.text = errorString + mainTextContainer.visible = true + + d.resize(); + } + onHandleLoginCompleted: { + bodyLoader.setSource("../WelcomeBody.qml", { "welcomeBack": false }) + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + onHandleLoginFailed: { + // we failed to login, show the LoginDialog so the user will try again + bodyLoader.setSource("LinkAccountBody.qml", { "failAfterSignUp": true }) + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } + } + + Keys.onPressed: { + if (!visible) { + return + } + + switch (event.key) { + case Qt.Key_Enter: + case Qt.Key_Return: + event.accepted = true + signupBody.signup() + break + } + } +} diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js index db05b88b04..72ba1c1e50 100644 --- a/scripts/system/+android/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -15,6 +15,7 @@ var bottombar; var bottomHudOptionsBar; var gotoBtn; var avatarBtn; +var loginBtn; var gotoScript = Script.require('./goto.js'); var avatarSelection = Script.require('./avatarSelection.js'); @@ -44,6 +45,8 @@ function init() { raiseBottomBar(); + GlobalServices.connected.connect(handleLogin); + GlobalServices.disconnected.connect(handleLogout); } function shutdown() { @@ -114,6 +117,23 @@ function setupBottomBar() { } }); + loginBtn = bottombar.addButton({ + icon: "icons/login-i.svg", + activeIcon: "icons/login-a.svg", + height: 240, + width: 294, + iconSize: 108, + textSize: 45, + text: Account.isLoggedIn() ? "LOG OUT" : "LOG IN" + }); + loginBtn.clicked.connect(function() { + if (!Account.isLoggedIn()) { + Account.checkAndSignalForAccessToken(); + } else { + Menu.triggerOption("Login / Sign Up"); + } + }); + // TODO: setup all the buttons or provide a dynamic interface raiseBottomBar(); @@ -195,8 +215,27 @@ function processedNewAvatar(url, modelName) { hideAvatarSelection(); } +function handleLogin() { + Script.setTimeout(function() { + if (Account.isLoggedIn()) { + MyAvatar.displayName=Account.getUsername(); + } + }, 2000); + if (loginBtn) { + loginBtn.editProperties({text: "LOG OUT"}); + } +} +function handleLogout() { + MyAvatar.displayName=""; + if (loginBtn) { + loginBtn.editProperties({text: "LOG IN"}); + } +} + Script.scriptEnding.connect(function () { shutdown(); + GlobalServices.connected.disconnect(handleLogin); + GlobalServices.disconnected.disconnect(handleLogout); }); init(); From 674af54a821b4b620ca48b18fad7934c7cab20cf Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 14 Feb 2018 16:57:24 -0300 Subject: [PATCH 068/267] Android - Scale up Sign In and Sign Up windows. --- .../resources/qml/+android/LoginDialog.qml | 12 +- .../LoginDialog/+android/LinkAccountBody.qml | 45 +-- .../qml/LoginDialog/+android/SignUpBody.qml | 20 +- .../resources/qml/controls-uit/Button.qml | 2 +- .../qml/styles-uit/+android/HifiConstants.qml | 358 ++++++++++++++++++ .../qml/styles-uit/HifiConstants.qml | 1 + 6 files changed, 396 insertions(+), 42 deletions(-) create mode 100644 interface/resources/qml/styles-uit/+android/HifiConstants.qml diff --git a/interface/resources/qml/+android/LoginDialog.qml b/interface/resources/qml/+android/LoginDialog.qml index 4badd555fb..c60864cd1d 100644 --- a/interface/resources/qml/+android/LoginDialog.qml +++ b/interface/resources/qml/+android/LoginDialog.qml @@ -21,18 +21,16 @@ ModalWindow { id: root HifiConstants { id: hifi } - property int scale: 3 - objectName: "LoginDialog" - implicitWidth: 520 *scale - implicitHeight: 150 *scale + implicitWidth: 1560 + implicitHeight: 450 y:0 destroyOnCloseButton: true destroyOnHidden: true visible: true property string iconText: "" - property int iconSize: 35 *scale + property int iconSize: 105 property string title: "" property int titleWidth: 0 @@ -54,8 +52,8 @@ ModalWindow { Component.onCompleted: { this.anchors.centerIn = undefined; - this.y=50 *scale; - this.x=150 *scale; + this.y=150; + this.x=450; } Keys.onPressed: { diff --git a/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml index 3d8bcedb38..8f76c6ed99 100644 --- a/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml @@ -19,10 +19,8 @@ import "../../styles-uit" Item { id: linkAccountBody - property int scale: 3 - clip: true - height: 100 *scale + height: 300 width: root.pane.width property bool failAfterSignUp: false function login() { @@ -39,10 +37,10 @@ Item { QtObject { id: d - readonly property int minWidth: 480 *scale - readonly property int maxWidth: 1280 *scale - readonly property int minHeight: 50 *scale - readonly property int maxHeight: 220 *scale + readonly property int minWidth: 1440 + readonly property int maxWidth: 3840 + readonly property int minHeight: 150 + readonly property int maxHeight: 660 function resize() { var targetWidth = Math.max(titleWidth, form.contentWidth); @@ -56,7 +54,7 @@ Item { } parent.width = root.width = Math.max(d.minWidth, Math.min(d.maxWidth, targetWidth)); - parent.height = 140 *scale; + parent.height = 420; /*root.height = Math.max(d.minHeight, Math.min(d.maxHeight, targetHeight)) + (keyboardEnabled && keyboardRaised ? (200 + 2 * hifi.dimensions.contentSpacing.y) : hifi.dimensions.contentSpacing.y);*/ } @@ -86,8 +84,8 @@ Item { visible: false running: true - width: 48 *scale - height: 48 *scale + width: 144 + height: 144 } ShortcutText { @@ -104,7 +102,7 @@ Item { text: qsTr("Username or password incorrect.") wrapMode: Text.WordWrap color: hifi.colors.redAccent - lineHeight: 1 *scale + lineHeight: 1 lineHeightMode: Text.ProportionalHeight horizontalAlignment: Text.AlignHCenter } @@ -127,7 +125,7 @@ Item { anchors { verticalCenter: parent.verticalCenter } - width: 350 *scale + width: 780 placeholderText: qsTr("Username or Email") } @@ -154,7 +152,7 @@ Item { anchors { verticalCenter: parent.verticalCenter } - width: 350 *scale + width: 780 placeholderText: qsTr("Password") echoMode: TextInput.Password @@ -191,7 +189,7 @@ Item { text: qsTr("Your steam account informations will not be exposed to other users.") wrapMode: Text.WordWrap color: hifi.colors.baseGrayHighlight - lineHeight: 1 *scale + lineHeight: 3 lineHeightMode: Text.ProportionalHeight horizontalAlignment: Text.AlignHCenter } @@ -220,16 +218,16 @@ Item { onHeightChanged: d.resize(); onWidthChanged: d.resize(); Button { - anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenter: parent.verticalCenter - text: qsTr("Sign Up") - visible: !loginDialog.isSteamRunning() + text: qsTr("Sign Up") + visible: !loginDialog.isSteamRunning() - onClicked: { - bodyLoader.setSource("SignUpBody.qml") - bodyLoader.item.width = root.pane.width - bodyLoader.item.height = root.pane.height - } + onClicked: { + bodyLoader.setSource("SignUpBody.qml") + bodyLoader.item.width = root.pane.width + bodyLoader.item.height = root.pane.height + } } } @@ -246,7 +244,6 @@ Item { Button { id: linkAccountButton anchors.verticalCenter: parent.verticalCenter - width: 200 *scale text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Login") color: hifi.buttons.blue @@ -260,7 +257,7 @@ Item { Button { anchors.verticalCenter: parent.verticalCenter - text: qsTr("Cancel Pepe") + text: qsTr("Cancel") onClicked: { Qt.inputMethod.hide(); diff --git a/interface/resources/qml/LoginDialog/+android/SignUpBody.qml b/interface/resources/qml/LoginDialog/+android/SignUpBody.qml index b9f36c7ad7..3a44a8d741 100644 --- a/interface/resources/qml/LoginDialog/+android/SignUpBody.qml +++ b/interface/resources/qml/LoginDialog/+android/SignUpBody.qml @@ -18,6 +18,7 @@ import "../../styles-uit" Item { id: signupBody + clip: true height: root.pane.height width: root.pane.width @@ -36,10 +37,10 @@ Item { QtObject { id: d - readonly property int minWidth: 480 - readonly property int maxWidth: 1280 - readonly property int minHeight: 100 - readonly property int maxHeight: 200 + readonly property int minWidth: 960 + readonly property int maxWidth: 2560 + readonly property int minHeight: 240 + readonly property int maxHeight: 1480 function resize() { var targetWidth = Math.max(titleWidth, form.contentWidth); @@ -113,7 +114,7 @@ Item { anchors { verticalCenter: parent.verticalCenter } - width: 350 + width: 780 placeholderText: "Email" } @@ -127,7 +128,7 @@ Item { anchors { verticalCenter: parent.verticalCenter } - width: 350 + width: 780 placeholderText: "Username" } @@ -154,7 +155,7 @@ Item { anchors { verticalCenter: parent.verticalCenter } - width: 350 + width: 780 placeholderText: "Password" echoMode: TextInput.Password @@ -193,7 +194,7 @@ Item { anchors { left: parent.left top: form.bottom - topMargin: hifi.dimensions.contentSpacing.y / 2 + topMargin: hifi.dimensions.contentSpacing.y// / 2 } spacing: hifi.dimensions.contentSpacing.x @@ -205,7 +206,7 @@ Item { text: qsTr("Existing User") onClicked: { - bodyLoader.setSource("LinkAccountBody-android.qml") + bodyLoader.setSource("LinkAccountBody.qml") bodyLoader.item.width = root.pane.width bodyLoader.item.height = root.pane.height } @@ -225,7 +226,6 @@ Item { Button { id: linkAccountButton anchors.verticalCenter: parent.verticalCenter - width: 200 text: qsTr("Sign Up") color: hifi.buttons.blue diff --git a/interface/resources/qml/controls-uit/Button.qml b/interface/resources/qml/controls-uit/Button.qml index 02c6181952..ba604a0404 100644 --- a/interface/resources/qml/controls-uit/Button.qml +++ b/interface/resources/qml/controls-uit/Button.qml @@ -22,7 +22,7 @@ Original.Button { property int colorScheme: hifi.colorSchemes.light property string buttonGlyph: ""; - width: 120 + width: hifi.dimensions.buttonWidth height: hifi.dimensions.controlLineHeight HifiConstants { id: hifi } diff --git a/interface/resources/qml/styles-uit/+android/HifiConstants.qml b/interface/resources/qml/styles-uit/+android/HifiConstants.qml new file mode 100644 index 0000000000..d5fab57501 --- /dev/null +++ b/interface/resources/qml/styles-uit/+android/HifiConstants.qml @@ -0,0 +1,358 @@ +// +// 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 + readonly property int faintGray: 2 + } + + 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: 120 + readonly property real controlLineHeight: 84 // 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: 20 + readonly property real scrollbarHandleWidth: scrollbarBackgroundWidth - 2 + readonly property real tabletMenuHeader: 90 + readonly property real buttonWidth: 360 + } + + Item { + id: fontSizes // In pixels + readonly property real overlayTitle: dimensions.largeScreen ? 54 : 42 + readonly property real tabName: dimensions.largeScreen ? 12 : 10 + readonly property real sectionName: dimensions.largeScreen ? 36 : 30 + readonly property real inputLabel: dimensions.largeScreen ? 14 : 10 + readonly property real textFieldInput: dimensions.largeScreen ? 48 : 36 + 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 ? 42 : 27 + 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 ? 45 : 33 + readonly property real shortcutText: dimensions.largeScreen ? 39 : 27 + 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 int none: 4 + readonly property int noneBorderless: 5 + readonly property int noneBorderlessWhite: 6 + readonly property int noneBorderlessGray: 7 + readonly property var textColor: [ colors.darkGray, colors.white, colors.white, colors.white, colors.white, colors.blueAccent, colors.white, colors.darkGray ] + readonly property var colorStart: [ colors.white, colors.primaryHighlight, "#d42043", "#343434", Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0) ] + readonly property var colorFinish: [ colors.lightGrayText, colors.blueAccent, "#94132e", colors.black, Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0), Qt.rgba(0, 0, 0, 0) ] + readonly property var hoveredColor: [ colorStart[white], colorStart[blue], colorStart[red], colorFinish[black], colorStart[none], colorStart[noneBorderless], colorStart[noneBorderlessWhite], colorStart[noneBorderlessGray] ] + readonly property var pressedColor: [ colorFinish[white], colorFinish[blue], colorFinish[red], colorStart[black], colorStart[none], colorStart[noneBorderless], colorStart[noneBorderlessWhite], colorStart[noneBorderlessGray] ] + 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: 15 + } + + 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" + readonly property string checkmark: "\ue020" + readonly property string leftRightArrows: "\ue021" + readonly property string hfc: "\ue022" + readonly property string home2: "\ue023" + readonly property string walletKey: "\ue024" + readonly property string lightning: "\ue025" + readonly property string securityImage: "\ue026" + readonly property string wallet: "\ue027" + readonly property string paperPlane: "\ue028" + readonly property string passphrase: "\ue029" + } +} diff --git a/interface/resources/qml/styles-uit/HifiConstants.qml b/interface/resources/qml/styles-uit/HifiConstants.qml index cf800cb62e..d676f032b7 100644 --- a/interface/resources/qml/styles-uit/HifiConstants.qml +++ b/interface/resources/qml/styles-uit/HifiConstants.qml @@ -165,6 +165,7 @@ Item { readonly property real scrollbarBackgroundWidth: 20 readonly property real scrollbarHandleWidth: scrollbarBackgroundWidth - 2 readonly property real tabletMenuHeader: 90 + readonly property real buttonWidth: 120 } Item { From 28c7ed761ef1d1e35b3cfbcc3dc7e039576832bc Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 15 Feb 2018 12:17:13 -0300 Subject: [PATCH 069/267] Add precision qualifier in fragment shaders for struct fields --- libraries/graphics/src/graphics/Light.slh | 10 ++++++- .../src/graphics/LightIrradiance.shared.slh | 12 ++++++--- .../src/graphics/LightVolume.shared.slh | 12 +++++++-- libraries/graphics/src/graphics/Material.slh | 17 +++++------- .../graphics/SphericalHarmonics.shared.slh | 26 ++++++++++++------- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/libraries/graphics/src/graphics/Light.slh b/libraries/graphics/src/graphics/Light.slh index e1202ed6a0..cda19aadfb 100644 --- a/libraries/graphics/src/graphics/Light.slh +++ b/libraries/graphics/src/graphics/Light.slh @@ -32,8 +32,16 @@ vec3 getLightIrradiance(Light l) { return lightIrradiance_getIrradiance(l.irradi // AMbient lighting needs extra info provided from a different Buffer <@include graphics/SphericalHarmonics.shared.slh@> // Light Ambient +#ifndef PRECISIONQ +#ifdef GL_ES +#define PRECISIONQ highp +#else +#define PRECISIONQ +#endif +#endif + struct LightAmbient { - vec4 _ambient; + PRECISIONQ vec4 _ambient; SphericalHarmonics _ambientSphere; }; diff --git a/libraries/graphics/src/graphics/LightIrradiance.shared.slh b/libraries/graphics/src/graphics/LightIrradiance.shared.slh index 13d6cf4b93..ff42f57fd9 100644 --- a/libraries/graphics/src/graphics/LightIrradiance.shared.slh +++ b/libraries/graphics/src/graphics/LightIrradiance.shared.slh @@ -12,11 +12,17 @@ #define LightIrradianceConstRef LightIrradiance - +#ifndef PRECISIONQ +#ifdef GL_ES +#define PRECISIONQ highp +#else +#define PRECISIONQ +#endif +#endif struct LightIrradiance { - vec4 colorIntensity; + PRECISIONQ vec4 colorIntensity; // falloffRadius, cutoffRadius, falloffSpot, spare - vec4 attenuation; + PRECISIONQ vec4 attenuation; }; diff --git a/libraries/graphics/src/graphics/LightVolume.shared.slh b/libraries/graphics/src/graphics/LightVolume.shared.slh index 3f0cb135f5..48249e766f 100644 --- a/libraries/graphics/src/graphics/LightVolume.shared.slh +++ b/libraries/graphics/src/graphics/LightVolume.shared.slh @@ -15,9 +15,17 @@ #define LightVolumeConstRef LightVolume +#ifndef PRECISIONQ +#ifdef GL_ES +#define PRECISIONQ highp +#else +#define PRECISIONQ +#endif +#endif + struct LightVolume { - vec4 positionRadius; - vec4 directionSpotCos; + PRECISIONQ vec4 positionRadius; + PRECISIONQ vec4 directionSpotCos; }; bool lightVolume_isPoint(LightVolume lv) { return bool(lv.directionSpotCos.w < 0.f); } diff --git a/libraries/graphics/src/graphics/Material.slh b/libraries/graphics/src/graphics/Material.slh index 36bee3fb71..bdb87ff014 100644 --- a/libraries/graphics/src/graphics/Material.slh +++ b/libraries/graphics/src/graphics/Material.slh @@ -14,17 +14,17 @@ // The material values (at least the material key) must be precisely bitwise accurate // to what is provided by the uniform buffer, or the material key has the wrong bits #ifdef GL_ES -precision highp float; #define BITFIELD highp int +#define PRECISIONQ highp #else #define BITFIELD int +#define PRECISIONQ #endif - -struct Material { - vec4 _emissiveOpacity; - vec4 _albedoRoughness; - vec4 _fresnelMetallic; - vec4 _scatteringSpare2Key; +struct Material { + PRECISIONQ vec4 _emissiveOpacity; + PRECISIONQ vec4 _albedoRoughness; + PRECISIONQ vec4 _fresnelMetallic; + PRECISIONQ vec4 _scatteringSpare2Key; }; uniform materialBuffer { @@ -70,8 +70,5 @@ const BITFIELD OCCLUSION_MAP_BIT = 0x00004000; const BITFIELD LIGHTMAP_MAP_BIT = 0x00008000; const BITFIELD SCATTERING_MAP_BIT = 0x00010000; -#ifdef GL_ES -precision lowp float; -#endif <@endif@> diff --git a/libraries/graphics/src/graphics/SphericalHarmonics.shared.slh b/libraries/graphics/src/graphics/SphericalHarmonics.shared.slh index 312824c5a3..72a505fa25 100644 --- a/libraries/graphics/src/graphics/SphericalHarmonics.shared.slh +++ b/libraries/graphics/src/graphics/SphericalHarmonics.shared.slh @@ -15,16 +15,24 @@ #define SphericalHarmonicsConstRef SphericalHarmonics +#ifndef PRECISIONQ +#ifdef GL_ES +#define PRECISIONQ highp +#else +#define PRECISIONQ +#endif +#endif + struct SphericalHarmonics { - vec4 L00; - vec4 L1m1; - vec4 L10; - vec4 L11; - vec4 L2m2; - vec4 L2m1; - vec4 L20; - vec4 L21; - vec4 L22; + PRECISIONQ vec4 L00; + PRECISIONQ vec4 L1m1; + PRECISIONQ vec4 L10; + PRECISIONQ vec4 L11; + PRECISIONQ vec4 L2m2; + PRECISIONQ vec4 L2m1; + PRECISIONQ vec4 L20; + PRECISIONQ vec4 L21; + PRECISIONQ vec4 L22; }; vec4 sphericalHarmonics_evalSphericalLight(SphericalHarmonicsConstRef sh, vec3 direction) { From 1b08ce6ac209bb1240d5bfb6189d4bf805c879b7 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 15 Feb 2018 15:31:02 -0300 Subject: [PATCH 070/267] Set default location to pikachu/160.45,-2.45,159.106 for non-stable branches --- libraries/networking/src/AddressManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 322ca7167a..65a5e0c837 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -32,7 +32,7 @@ #if USE_STABLE_GLOBAL_SERVICES const QString DEFAULT_HIFI_ADDRESS = "hifi://welcome/hello"; #else -const QString DEFAULT_HIFI_ADDRESS = "hifi://dev-welcome/hello"; +const QString DEFAULT_HIFI_ADDRESS = "hifi://pikachu/160.45,-2.45,159.106"; #endif const QString ADDRESS_MANAGER_SETTINGS_GROUP = "AddressManager"; From 82f9416b3f071b2a07e3b49ca7c9939e34f9a593 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 15 Feb 2018 17:39:01 -0300 Subject: [PATCH 071/267] Restore default precision qualifier (needed for pixel) --- libraries/graphics/src/graphics/Material.slh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/graphics/src/graphics/Material.slh b/libraries/graphics/src/graphics/Material.slh index bdb87ff014..f9f4144748 100644 --- a/libraries/graphics/src/graphics/Material.slh +++ b/libraries/graphics/src/graphics/Material.slh @@ -14,6 +14,7 @@ // The material values (at least the material key) must be precisely bitwise accurate // to what is provided by the uniform buffer, or the material key has the wrong bits #ifdef GL_ES +precision highp float; #define BITFIELD highp int #define PRECISIONQ highp #else @@ -70,5 +71,7 @@ const BITFIELD OCCLUSION_MAP_BIT = 0x00004000; const BITFIELD LIGHTMAP_MAP_BIT = 0x00008000; const BITFIELD SCATTERING_MAP_BIT = 0x00010000; - +#ifdef GL_ES +precision lowp float; +#endif <@endif@> From 5f1fc37684d1cc0da70a11deab3831195cba98ef Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 16 Feb 2018 18:29:22 -0300 Subject: [PATCH 072/267] Android - Support display with smaller resolution than 1440p for Go To window --- .../qml/+android/AddressBarDialog.qml | 40 +++++++++---------- .../qml/hifi/+android/HifiConstants.qml | 32 ++++++++------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/interface/resources/qml/+android/AddressBarDialog.qml b/interface/resources/qml/+android/AddressBarDialog.qml index 0b12301561..8033840f6c 100644 --- a/interface/resources/qml/+android/AddressBarDialog.qml +++ b/interface/resources/qml/+android/AddressBarDialog.qml @@ -75,33 +75,33 @@ Item { HifiStyles.RalewayRegular { id: notice text: "YOUR LOCATION" - font.pixelSize: hifi.fonts.pixelSize * 2.15; + font.pixelSize: (hifi.fonts.pixelSize * 2.15)*(android.dimen.atLeast1440p?1:.75); color: "#2CD7FF" anchors { bottom: addressBackground.top - bottomMargin: 45 + bottomMargin: android.dimen.atLeast1440p?45:34 left: addressBackground.left - leftMargin: 60 + leftMargin: android.dimen.atLeast1440p?60:45 } } - property int inputAreaHeight: 210 + property int inputAreaHeight: android.dimen.atLeast1440p?210:156 property int inputAreaStep: (height - inputAreaHeight) / 2 ToolbarButton { id: homeButton - y: 280 + y: android.dimen.atLeast1440p?280:210 imageURL: "../../icons/home.svg" onClicked: { addressBarDialog.loadHome(); bar.shown = false; } anchors { - leftMargin: 75 + leftMargin: android.dimen.atLeast1440p?75:56 left: parent.left } - size: 150 + size: android.dimen.atLeast1440p?150:150//112 } ToolbarButton { @@ -110,10 +110,10 @@ Item { onClicked: addressBarDialog.loadBack(); anchors { left: homeButton.right - leftMargin: 70 + leftMargin: android.dimen.atLeast1440p?70:52 verticalCenter: homeButton.verticalCenter } - size: 150 + size: android.dimen.atLeast1440p?150:150 } ToolbarButton { id: forwardArrow; @@ -121,10 +121,10 @@ Item { onClicked: addressBarDialog.loadForward(); anchors { left: backArrow.right - leftMargin: 60 + leftMargin: android.dimen.atLeast1440p?60:45 verticalCenter: homeButton.verticalCenter } - size: 150 + size: android.dimen.atLeast1440p?150:150 } HifiStyles.FiraSansRegular { @@ -139,24 +139,24 @@ Item { Rectangle { id: addressBackground - x: 780 - y: 280 - width: 1440 - height: 150 + x: android.dimen.atLeast1440p?780:585 + y: android.dimen.atLeast1440p?280:235 // tweaking by hand + width: android.dimen.atLeast1440p?1270:952 + height: android.dimen.atLeast1440p?150:112 color: "#FFFFFF" } TextInput { id: addressLine focus: true - x: 870 - y: 450 - width: 1350 - height: 120 + x: android.dimen.atLeast1440p?870:652 + y: android.dimen.atLeast1440p?300:245 // tweaking by hand + width: android.dimen.atLeast1440p?1200:900 + height: android.dimen.atLeast1440p?120:90 inputMethodHints: Qt.ImhNoPredictiveText //helperText: "Hint is here" anchors { - verticalCenter: homeButton.verticalCenter + //verticalCenter: addressBackground.verticalCenter } font.pixelSize: hifi.fonts.pixelSize * 3.75 onTextChanged: { diff --git a/interface/resources/qml/hifi/+android/HifiConstants.qml b/interface/resources/qml/hifi/+android/HifiConstants.qml index f74cc554aa..fbdf60dcb0 100644 --- a/interface/resources/qml/hifi/+android/HifiConstants.qml +++ b/interface/resources/qml/hifi/+android/HifiConstants.qml @@ -10,6 +10,7 @@ // import QtQuick 2.4 +import QtQuick.Window 2.2 Item { @@ -20,26 +21,27 @@ Item { Item { id: dimen - readonly property real windowLessWidth: 126*3 - readonly property real windowLessHeight: 64*3 + readonly property bool atLeast1440p: Screen.width >= 2560 && Screen.height >= 1440 + readonly property real windowLessWidth: atLeast1440p?378:284 + readonly property real windowLessHeight: atLeast1440p?192:144 readonly property real windowZ: 100 - readonly property real headerHeight: 276 + readonly property real headerHeight: atLeast1440p?276:207 - readonly property real headerIconPosX: 90 - readonly property real headerIconPosY: 108 - readonly property real headerIconWidth: 111 - readonly property real headerIconHeight: 111 - readonly property real headerIconTitleDistance: 151 + readonly property real headerIconPosX: atLeast1440p?90:67 + readonly property real headerIconPosY: atLeast1440p?108:81 + readonly property real headerIconWidth: atLeast1440p?111:83 + readonly property real headerIconHeight: atLeast1440p?111:83 + readonly property real headerIconTitleDistance: atLeast1440p?151:113 - readonly property real headerHideWidth: 150 - readonly property real headerHideHeight: 150 - readonly property real headerHideRightMargin: 110 - readonly property real headerHideTopMargin: 90 - readonly property real headerHideIconWidth: 70 - readonly property real headerHideIconHeight: 45 - readonly property real headerHideTextTopMargin: 36 + readonly property real headerHideWidth: atLeast1440p?150:112 + readonly property real headerHideHeight: atLeast1440p?150:112 + readonly property real headerHideRightMargin: atLeast1440p?110:82 + readonly property real headerHideTopMargin: atLeast1440p?90:67 + readonly property real headerHideIconWidth: atLeast1440p?70:52 + readonly property real headerHideIconHeight: atLeast1440p?45:33 + readonly property real headerHideTextTopMargin: atLeast1440p?36:27 readonly property real botomHudWidth: 366 readonly property real botomHudHeight: 180 From 67cfe783be90634200dbcb5f3d701e4b630cd0e6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 19 Feb 2018 12:17:31 +1300 Subject: [PATCH 073/267] Entity properties JSDoc --- .../entities/src/AmbientLightPropertyGroup.h | 8 + .../entities/src/AnimationPropertyGroup.cpp | 13 + .../entities/src/EntityItemProperties.cpp | 642 +++++++++++++++++- .../entities/src/EntityScriptingInterface.h | 8 + libraries/entities/src/EntityTypes.h | 39 ++ libraries/entities/src/HazePropertyGroup.h | 29 + .../entities/src/KeyLightPropertyGroup.h | 7 + libraries/entities/src/PolyVoxEntityItem.h | 19 + libraries/entities/src/ShapeEntityItem.cpp | 29 +- libraries/entities/src/ShapeEntityItem.h | 2 +- libraries/entities/src/SkyboxPropertyGroup.h | 7 + libraries/render-utils/src/GeometryCache.cpp | 26 - libraries/shared/src/PhysicsCollisionGroups.h | 18 + libraries/shared/src/RegisteredMetaTypes.cpp | 9 + libraries/shared/src/ShapeInfo.cpp | 29 +- tools/jsdoc/plugins/hifi.js | 1 - 16 files changed, 847 insertions(+), 39 deletions(-) diff --git a/libraries/entities/src/AmbientLightPropertyGroup.h b/libraries/entities/src/AmbientLightPropertyGroup.h index fbbc7c9900..591ea6a6fa 100644 --- a/libraries/entities/src/AmbientLightPropertyGroup.h +++ b/libraries/entities/src/AmbientLightPropertyGroup.h @@ -27,6 +27,14 @@ class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; +/**jsdoc + * Ambient light is defined by the following properties. + * @typedef {object} Entities.AmbientLight + * @property {number} ambientIntensity=0.5 - The intensity of the light. + * @property {string} ambientURL="" - A cube map image that defines the color of the light coming from each direction. If + * "" then the entity's {@link Entities.Skybox|Skybox} url property value is used, unless that also is "" in which + * case the entity's ambientLightMode property is set to "inherit". + */ class AmbientLightPropertyGroup : public PropertyGroup { public: // EntityItemProperty related helpers diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 2af56fb6b2..82af60ed1a 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -44,6 +44,19 @@ bool operator!=(const AnimationPropertyGroup& a, const AnimationPropertyGroup& b } +/**jsdoc + * The AnimationProperties are used to configure an animation. + * @typedef Entities.AnimationProperties + * @property {string} url="" - The URL of the FBX file that has the animation. + * @property {number} fps=30 - The speed in frames/s that the animation is played at. + * @property {number} firstFrame=0 - The first frame to play in the animation. + * @property {number} lastFrame=100000 - The last frame to play in the animation. + * @property {number} currentFrame=0 - The current frame being played in the animation. + * @property {boolean} running=false - If true then the animation should play. + * @property {boolean} loop=true - If true then the animation should be continuously repeated in a loop. + * @property {boolean} hold=false - If true then the rotations and translations of the last frame played should be + * maintained when the animation stops playing. + */ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index e2a5ddf8b5..fed3204245 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -406,6 +406,607 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { return changedProperties; } +/**jsdoc + * Different entity types have different properties: some common to all entities (listed below) and some specific to the type + * of entity (listed separately). The properties are accessed as an object of property names and values. + * + * @typedef {object} Entities.EntityProperties + * @property {Uuid} id - The ID of the entity. Read-only. + * @property {string} name="" - A name for the entity. Need not be unique. + * @property {Entities.EntityType} type - The entity type. You cannot change the type of an entity after it's created. + * Read-only. + * @property {boolean} clientOnly=false - If true then the entity is an avatar entity, otherwise it is a server + * entity. Read-only. + * @property {Uuid} owningAvatarID=Uuid.NULL - The session ID of the owning avatar if clientOnly is + * true, otherwise {@link Uuid|Uuid.NULL}. Read-only. + * + * @property {string} created - The UTC date and time that the entity was created, in ISO 8601 format as + * yyyy-MM-ddTHH:mm:ssZ. Read-only. + * @property {number} age - The age of the entity in seconds since it was created. Read-only. + * @property {string} ageAsText - The age of the entity since it was created, formatted as h hours m minutes s + * seconds. + * @property {number} lifetime=-1 - How long an entity lives for, in seconds, before being automatically deleted. A value of + * -1 means that the entity lives for ever. + * @property {number} lastEdited - When the entity was last edited, expressed as the number of microseconds since + * 1970-01-01T00:00:00 UTC. Read-only. + * @property {Uuid} lastEditedBy - The session ID of the avatar or agent that most recently created or edited the entity. + * Read-only. + * + * @property {boolean} locked=false - Whether or not the entity can be edited or deleted. If true then the + * entity's properties other than locked cannot be changed, and the entity cannot be deleted. + * @property {boolean} visible=true - Whether or not the entity is rendered. If true then the entity is rendered. + * + * @property {Vec3} position=0,0,0 - The position of the entity. + * @property {Quat} rotation=0,0,0,1 - The orientation of the entity with respect to world coordinates. + * @property {Vec3} registrationPoint=0.5,0.5,0.5 - The point in the entity that is set to the entity's position and is rotated + * about, {@link Vec3|Vec3.ZERO} – {@link Vec3|Vec3.ONE}. A value of {@link Vec3|Vec3.ZERO} is the entity's + * minimum x, y, z corner; a value of {@link Vec3|Vec3.ONE} is the entity's maximum x, y, z corner. + * + * @property {Vec3} naturalPosition=0,0,0 - The center of the entity's unscaled mesh model if it has one, otherwise + * {@link Vec3|Vec3.ZERO}. Read-only. + * @property {Vec3} naturalDimensions - The dimensions of the entity's unscaled mesh model if it has one, otherwise + * {@link Vec3|Vec3.ONE}. Read-only. + * + * @property {Vec3} velocity=0,0,0 - The linear velocity of the entity in m/s with respect to world coordinates. + * @property {number} damping=0.39347 - How much to slow down the linear velocity of an entity over time, 0.0 + * – 1.0. A higher damping value slows down the entity more quickly. The default value is for an + * exponential decay timescale of 2.0s, where it takes 2.0s for the movement to slow to 1/e = 0.368 of its + * initial value. + * @property {Vec3} angularVelocity=0,0,0 - The angular velocity of the entity in rad/s with respect to its axes, about its + * registration point. + * @property {number} angularDamping=0.39347 - How much to slow down the angular velocity of an entity over time, + * 0.01.0. A higher damping value slows down the entity more quickly. The default value + * is for an exponential decay timescale of 2.0s, where it takes 2.0s for the movement to slow to 1/e = 0.368 + * of its initial value. + * + * @property {Vec3} gravity=0,0,0 - The acceleration due to gravity in m/s2 that the entity should move with, in + * world coordinates. Set to { x: 0, y: -9.8, z: 0 } to simulate Earth's gravity. Gravity is applied to an + * entity's motion only if its dynamic property is true. If changing an entity's + * gravity from {@link Vec3|Vec3.ZERO}, you need to give it a small velocity in order to kick off + * physics simulation. + * The gravity value is applied in addition to the acceleration value. + * @property {Vec3} acceleration=0,0,0 - A general acceleration in m/s2 that the entity should move with, in world + * coordinates. The acceleration is applied to an entity's motion only if its dynamic property is + * true. If changing an entity's acceleration from {@link Vec3|Vec3.ZERO}, you need to give it a + * small velocity in order to kick off physics simulation. + * The acceleration value is applied in addition to the gravity value. + * @property {number} restitution=0.5 - The "bounciness" of an entity when it collides, 0.0 – + * 0.99. The higher the value, the more bouncy. + * @property {number} friction=0.5 - How much to slow down an entity when it's moving against another, 0.0 – + * 10.0. The higher the value, the more quickly it slows down. Examples: 0.1 for ice, + * 0.9 for sandpaper. + * @property {number} density=1000 - The density of the entity in kg/m3, 100 for balsa wood – + * 10000 for silver. The density is used in conjunction with the entity's collision volume to work out its + * mass in the application of physics. + * + * @property {boolean} collisionless=false - Whether or not the entity should collide with items per its + * collisionMask property. If true then the entity does not collide. + * @property {boolean} ignoreForCollisions=false - Synonym for collisionless. + * @property {Entities.CollisionMask} collisionMask=31 - What types of items the entity should collide with. + * @property {string} collidesWith="static,dynamic,kinematic,myAvatar,otherAvatar," - Synonym for collisionMask, + * in text format. + * @property {string} collisionSoundURL="" - The sound to play when the entity experiences a collision. Valid file formats are + * as per the {@link SoundCache} object. + * @property {boolean} dynamic=false - Whether or not the entity should be affected by collisions. If true then + * the entity's movement is affected by collisions. + * @property {boolean} collisionsWillMove=false - Synonym for dynamic. + * + * @property {string} href="" - A "hifi://" metaverse address that a user is taken to when they click on the entity. + * @property {string} description="" - A description of the href property value. + * + * @property {string} userData="" - Intended to be used to store extra data about the entity in JSON format. WARNING: Other + * apps such as the Create app can also use this property, so make sure you handle data stored by other apps. + * + * @property {string} script="" - The URL of the client entity script, if any, that is attached to the entity. + * @property {number} scriptTimestamp=0 - Intended to be used to indicate when the client entity script was loaded. Should be + * an integer number of milliseconds since midnight GMT on January 1, 1970. + * @property {string} serverScripts="" - The URL of the server entity script, if any, that is attached to the entity. + * + * @property {Uuid} parentID=Uuid.NULL - The ID of the entity or avatar that this entity is parented to. {@link Uuid|Uuid.NULL} + * if the entity is not parented. + * @property {number} parentJointIndex=65535 - The joint of the entity or avatar that this entity is parented to. Use + * 65535 or -1 to parent to the entity or avatar's position and orientation rather than a joint. + * @property {Vec3} localPosition=0,0,0 - The position of the entity relative to its parent if the entity is parented, + * otherwise the same value as position. If the entity is parented to an avatar and is clientOnly + * so that it scales with the avatar, this value remains the original local position value while the avatar scale changes. + * @property {Quat} localRotation=0,0,0,1 - The rotation of the entity relative to its parent if the entity is parented, + * otherwise the same value as rotation. + * @property {Vec3} localVelocity=0,0,0 - The velocity of the entity relative to its parent if the entity is parented, + * otherwise the same value as velocity. + * @property {Vec3} localAngularVelocity=0,0,0 - The angular velocity of the entity relative to its parent if the entity is + * parented, otherwise the same value as position. + * @property {Vec3} localDimensions - The dimensions of the entity. If the entity is parented to an avatar and is + * clientOnly so that it scales with the avatar, this value remains the original dimensions value while the + * avatar scale changes. + * + * @property {Entities.BoundingBox} boundingBox - The axis-aligned bounding box that tightly encloses the entity. + * Read-only. + * @property {AACube} queryAACube - The axis-aligned cube that determines where the entity lives in the entity server's octree. + * The cube may be considerably larger than the entity in some situations, e.g., when the entity is grabbed by an avatar: + * the position of the entity is determined through avatar mixer updates and so the AA cube is expanded in order to reduce + * unnecessary entity server updates. Scripts should not change this property's value. + * + * @property {string} actionData="" - Base-64 encoded compressed dump of the actions associated with the entity. This property + * is typically not used in scripts directly; rather, functions that manipulate an entity's actions update it. + * Read-only. + * @property {Entities.RenderInfo} renderInfo - Information on the cost of rendering the entity. Currently information is only + * provided for Model entities. Read-only. + * + * @property {string} itemName="" - Certifiable name of the Marketplace item. + * @property {string} itemDescription="" - Certifiable description of the Marketplace item. + * @property {string} itemCategories="" - Certifiable category of the Marketplace item. + * @property {string} itemArtist="" - Certifiable artist that created the Marketplace item. + * @property {string} itemLicense="" - Certifiable license URL for the Marketplace item. + * @property {number} limitedRun=4294967295 - Certifiable maximum integer number of editions (copies) of the Marketplace item + * allowed to be sold. + * @property {number} editionNumber=0 - Certifiable integer edition (copy) number or the Marketplace item. Each copy sold in + * the Marketplace is numbered sequentially, starting at 1. + * @property {number} entityInstanceNumber=0 - Certifiable integer instance number for identical entities in a Marketplace + * item. A Marketplace item may have identical parts. If so, then each is numbered sequentially with an instance number. + * @property {string} marketplaceID="" - Certifiable UUID for the Marketplace item, as used in the URL of the item's download + * and its Marketplace Web page. + * @property {string} certificateID="" - Hash of the entity's static certificate JSON, signed by the artist's private key. + * @property {number} staticCertificateVersion=0 - The version of the method used to generate the certificateID. + * + * @see The different entity types have additional properties as follows: + * @see Entities.EntityProperties-Box + * @see Entities.EntityProperties-Light + * @see Entities.EntityProperties-Line + * @see Entities.EntityProperties-Model + * @see Entities.EntityProperties-ParticleEffect + * @see Entities.EntityProperties-PolyLine + * @see Entities.EntityProperties-PolyVox + * @see Entities.EntityProperties-Shape + * @see Entities.EntityProperties-Sphere + * @see Entities.EntityProperties-Text + * @see Entities.EntityProperties-Web + * @see Entities.EntityProperties-Zone + */ + +/**jsdoc + * The "Box" {@link Entities.EntityType|EntityType} is the same as the "Shape" + * {@link Entities.EntityType|EntityType} except that its initial shape value is always set to "Cube" + * when the entity is created. This property value can subsequently be changed (i.e. so that the entity is no longer displayed + * as a cube). + * @typedef {object} Entities.EntityProperties-Box + */ + +/**jsdoc + * The "Light" {@link Entities.EntityType|EntityType} adds local lighting effects. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Light + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Entity surface outside these dimensions are not lit + * by the light. + * @property {Color} color=255,255,255 - The color of the light emitted. + * @property {number} intensity=1 - The brightness of the light. + * @property {number} falloffRadius=0.1 - The distance from the light's center at which intensity is reduced by 25%. + * @property {boolean} isSpotlight=false - If true then the light is directional, emitting along the entity's + * negative z-axis; otherwise the light is a point light which emanates in all directions. + * @property {number} exponent=0 - Affects the softness of the spotlight beam: the higher the value the softer the beam. + * @property {number} cutoff=1.57 - Affects the size of the spotlight beam: the higher the value the larger the beam. + * @example Create a spotlight pointing at the ground. + * Entities.addEntity({ + * type: "Light", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -4 })), + * rotation: Quat.fromPitchYawRollDegrees(-75, 0, 0), + * dimensions: { x: 5, y: 5, z: 5 }, + * intensity: 100, + * falloffRadius: 0.3, + * isSpotlight: true, + * exponent: 20, + * cutoff: 30, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "Line" {@link Entities.EntityType|EntityType} draws thin, straight lines between a sequence of two or more + * points. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Line + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Must be sufficient to contain all the + * linePoints. + * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's + * position. A maximum of 70 points can be specified. The property's value is set only if all the linePoints + * lie within the entity's dimensions. + * @property {number} lineWidth=2 - Currently not used. + * @property {Color} color=255,255,255 - The color of the line. + * @example Draw lines in a "V". + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 }, + * { x: 1, y: 1, z: 0 }, + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "Model" {@link Entities.EntityType|EntityType} displays an FBX or OBJ model. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Model + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. When adding an entity, if no dimensions + * value is specified then the model is automatically sized to its + * {@link Entityes.EntityProperties|naturalDimensions}. + * @property {Color} color=255,255,255 - Currently not used. + * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx". + * @property {string} textures="" - A JSON string of texture name, URL pairs used when rendering the model in place of the + * model's original textures. Only the texture names and URLs to be overridden need be specified; original textures are + * used where there are no overrides. You can use JSON.stringify() to convert a JavaScript object of name, URL + * pairs into a JSON string. + * @property {string} originalTextures="{}" - A JSON string of texture name, URL pairs used in the model. The property value is + * filled in after the entity has finished rezzing (i.e., textures have loaded). You can use JSON.parse() to + * parse the JSON string into a JavaScript object of name, URL pairs. Read-only. + * + * @property {ShapeType} shapeType="none" - The shape of the collision hull used if collisions are enabled. + * @property {string} compoundShapeURL="" - The OBJ file to use for the compound shape if shapeType is + * "compound". + * + * @property {Entities.AnimationProperties} animation - An animation to play on the model. + * + * @property {Quat[]} jointRotations=[]] - Joint rotations applied to the model; [] if none are applied or the + * model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative to + * each joint's parent.
+ * Joint rotations can be set by {@link Entities.setLocalJointRotation|setLocalJointRotation} and similar functions, or by + * setting the value of this property. If you set a joint rotation using this property you also need to set the + * corresponding jointRotationsSet value to true. + * @property {boolean[]} jointRotationsSet=[]] - true values for joints that have had rotations applied, + * false otherwise; [] if none are applied or the model hasn't loaded. The array indexes are per + * {@link Entities.getJointIndex|getJointIndex}. + * @property {Vec3[]} jointTranslations=[]] - Joint translations applied to the model; [] if none are applied or + * the model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative + * to each joint's parent.
+ * Joint translations can be set by {@link Entities.setLocalJointTranslation|setLocalJointTranslation} and similar + * functions, or by setting the value of this property. If you set a joint translation using this property you also need to + * set the corresponding jointTranslationsSet value to true. + * @property {boolean[]} jointTranslationsSet=[]] - true values for joints that have had translations applied, + * false otherwise; [] if none are applied or the model hasn't loaded. The array indexes are per + * {@link Entities.getJointIndex|getJointIndex}. + * @property {boolean} relayParentJoints=false - If true and the entity is parented to an avatar, then the + * avatar's joint rotations are applied to the entity's joints. + * + * @example Rez a Vive tracker puck. + * var entity = Entities.addEntity({ + * type: "Model", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -2 })), + * rotation: MyAvatar.orientation, + * modelURL: "http://content.highfidelity.com/seefo/production/puck-attach/vive_tracker_puck.obj", + * dimensions: { x: 0.0945, y: 0.0921, z: 0.0423 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "ParticleEffect" {@link Entities.EntityType|EntityType} displays a particle system that can be used to + * simulate things such as fire, smoke, snow, magic spells, etc. The particles emanate from an ellipsoid or part thereof. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-ParticleEffect + + * @property {boolean} isEmitting=true - If true then particles are emitted. + * @property {number} maxParticles=1000 - The maximum number of particles to render at one time. Older particles are deleted if + * necessary when new ones are created. + * @property {number} lifespan=3s - How long, in seconds, each particle lives. + * @property {number} emitRate=15 - The number of particles per second to emit. + * @property {number} emitSpeed=5 - The speed, in m/s, that each particle is emitted at. + * @property {number} speedSpread=1 - The spread in speeds at which particles are emitted at. If emitSpeed == 5 + * and speedSpread == 1, particles will be emitted with speeds in the range 4m/s – 6m/s. + * @property {vec3} emitAcceleration=0,-9.8,0 - The acceleration that is applied to each particle during its lifetime. + * @property {vec3} accelerationSpread=0,0,0 - The spread in accelerations that each particle is given. If + * emitAccelerations == {x: 0, y: -9.8, z: 0} and accelerationSpread == + * {x: 0, y: 1, z: 0}, each particle will have an acceleration in the range, {x: 0, y: -10.8, z: 0} + * – {x: 0, y: -8.8, z: 0}. + * @property {Vec3} dimensions - The dimensions of the particle effect, i.e., a bounding box containing all the particles + * during their lifetimes, assuming that emitterShouldTrail is false. Read-only. + * @property {boolean} emitterShouldTrail=false - If true then particles are "left behind" as the emitter moves, + * otherwise they stay with the entity's dimensions. + * + * @property {Quat} emitOrientation=-0.707,0,0,0.707 - The orientation of particle emission relative to the entity's axes. By + * default, particles emit along the entity's z-axis, and azimuthStart and azimuthFinish are + * relative to the entity's x-axis. The default value is a rotation of -90 degrees about the x-axis, i.e., the particles + * emit vertically. + * @property {vec3} emitDimensions=0,0,0 - The dimensions of the ellipsoid from which particles are emitted. + * @property {number} emitRadiusStart=1 - The starting radius within the ellipsoid at which particles start being emitted; + * range 0.01.0 for the ellipsoid center to the ellipsoid surface, respectively. + * Particles are emitted from the portion of the ellipsoid that lies between emitRadiusStart and the + * ellipsoid's surface. + * @property {number} polarStart=0 - The angle in radians from the entity's z-axis at which particles start being emitted + * within the ellipsoid; range 0Math.PI. Particles are emitted from the portion of the + * ellipsoid that lies between polarStart and polarFinish. + * @property {number} polarFinish=0 - The angle in radians from the entity's z-axis at which particles stop being emitted + * within the ellipsoid; range 0Math.PI. Particles are emitted from the portion of the + * ellipsoid that lies between polarStart and polarFinish. + * @property {number} azimuthStart=-Math.PI - The angle in radians from the entity's x-axis about the entity's z-axis at which + * particles start being emitted; range -Math.PIMath.PI. Particles are emitted from the + * portion of the ellipsoid that lies between azimuthStart and azimuthFinish. + * @property {number} azimuthFinish=Math.PI - The angle in radians from the entity's x-axis about the entity's z-axis at which + * particles stop being emitted; range -Math.PIMath.PI. Particles are emitted from the + * portion of the ellipsoid that lies between azimuthStart and azimuthFinish. + * + * @property {string} textures="" - The URL of a JPG or PNG image file to display for each particle. If you want transparency, + * use PNG format. + * @property {number} particleRadius=0.025 - The radius of each particle at the middle of its life. + * @property {number} radiusStart=0.025 - The radius of each particle at the start of its life. + * @property {number} radiusFinish=0.025 - The radius of each particle at the end of its life. + * @property {number} radiusSpread=0 - Currently not used. + * @property {Color} color=255,255,255 - The color of each particle at the middle of its life. + * @property {Color} colorStart=255,255,255 - The color of each particle at the start of its life. + * @property {color} colorFinish=255,255,255 - The color of each particle at the end of its life. + * @property {Color} colorSpread=0,0,0 - Currently not used. + * @property {number} alpha=1 - The alpha of each particle at the middle of its life. + * @property {number} alphaStart=1 - The alpha of each particle at the start of its life. + * @property {number} alphaFinish=1 - The alpha of each particle at the end of its life. + * @property {number} alphaSpread=0 - Currently not used. + * + * @property {ShapeType} shapeType="none" - Currently not used. Read-only. + * + * @example Create a ball of green smoke. + * particles = Entities.addEntity({ + * type: "ParticleEffect", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -4 })), + * lifespan: 5, + * emitRate: 10, + * emitSpeed: 0.02, + * speedSpread: 0.01, + * emitAcceleration: { x: 0, y: 0.02, z: 0 }, + * polarFinish: Math.PI, + * textures: "https://content.highfidelity.com/DomainContent/production/Particles/wispy-smoke.png", + * particleRadius: 0.1, + * color: { red: 0, green: 255, blue: 0 }, + * alphaFinish: 0, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "PolyLine" {@link Entities.EntityType|EntityType} draws textured, straight lines between a sequence of + * points. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-PolyLine + * @property {Vec3} dimensions=1,1,1 - The dimensions of the entity, i.e., the size of the bounding box that contains the + * lines drawn. + * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's + * position. A maximum of 70 points can be specified. Must be specified in order for the entity to render. + * @property {Vec3[]} normals=[]] - The normal vectors for the line's surface at the linePoints. The values are + * relative to the entity's orientation. Must be specified in order for the entity to render. + * @property {number[]} strokeWidths=[]] - The widths, in m, of the line at the linePoints. Must be specified in + * order for the entity to render. + * @property {number} lineWidth=2 - Currently not used. + * @property {Vec3[]} strokeColors=[]] - Currently not used. + * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for + * rendering. + * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG + * format. + * @property {boolean} isUVModeStretch=true - If true, the texture is stretched to fill the whole line, otherwise + * the texture repeats along the line. + * @example Draw a textured "V". + * var entity = Entities.addEntity({ + * type: "PolyLine", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * linePoints: [ + * { x: -1, y: 0.5, z: 0 }, + * { x: 0, y: 0, z: 0 }, + * { x: 1, y: 0.5, z: 0 } + * ], + * normals: [ + * { x: 0, y: 0, z: 1 }, + * { x: 0, y: 0, z: 1 }, + * { x: 0, y: 0, z: 1 } + * ], + * strokeWidths: [ 0.1, 0.1, 0.1 ], + * color: { red: 255, green: 0, blue: 0 }, // Use just the red channel from the image. + * textures: "http://hifi-production.s3.amazonaws.com/DomainContent/Toybox/flowArts/trails.png", + * isUVModeStretch: true, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "PolyVox" {@link Entities.EntityType|EntityType} displays a set of textured voxels. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}.
+ * If you have two or more neighboring PolyVox entities of the same size abutting each other, you can display them as joined by + * configuring their voxelSurfaceStyle and neighbor ID properties.
+ * PolyVox entities uses a library from Volumes of Fun. Their + * library documentation may be useful to read. + * @typedef {object} Entities.EntityProperties-PolyVox + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. + * @property {Vec3} voxelVolumeSize=32,32,32 - Integer number of voxels along each axis of the entity, in the range + * 1,1,1 to 128,128,128. The dimensions of each voxel is + * dimensions / voxelVolumesize. + * @property {string} voxelData="ABAAEAAQAAAAHgAAEAB42u3BAQ0AAADCoPdPbQ8HFAAAAPBuEAAAAQ==" - Base-64 encoded compressed dump of + * the PolyVox data. This property is typically not used in scripts directly; rather, functions that manipulate a PolyVox + * entity update it.
+ * The size of this property increases with the size and complexity of the PolyVox entity, with the size depending on how + * the particular entity's voxels compress. Because this property value has to fit within a High Fidelity datagram packet + * there is a limit to the size and complexity of a PolyVox entity, and edits which would result in an overflow are + * rejected. + * @property {Entities.PolyVoxSurfaceStyle} voxelSurfaceStyle=2 - The style of rendering the voxels' surface and how + * neighboring PolyVox entities are joined. + * @property {string} xTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's x-axis. JPG or PNG + * format. If no texture is specified the surfaces display white. + * @property {string} yTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's y-axis. JPG or PNG + * format. If no texture is specified the surfaces display white. + * @property {string} zTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's z-axis. JPG or PNG + * format. If no texture is specified the surfaces display white. + * @property {Uuid} xNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve x-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} yNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve y-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} zNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve z-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} xPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve x-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} yPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve y-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} zPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve z-axis direction, if you + * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @example Create a textured PolyVox sphere. + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); + * var texture = "http://public.highfidelity.com/cozza13/tuscany/Concrete2.jpg"; + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: position, + * dimensions: { x: 2, y: 2, z: 2 }, + * xTextureURL: texture, + * yTextureURL: texture, + * zTextureURL: texture, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setVoxelSphere(polyVox, position, 0.8, 255); + */ + +/**jsdoc + * The "Shape" {@link Entities.EntityType|EntityType} displays an entity of a specified shape. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Shape + * @property {Entities.Shape} shape="Sphere" - The shape of the entity. + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. + * @property {Color} color=255,255,255 - The color of the entity. + * @example Create a cylinder. + * var shape = Entities.addEntity({ + * type: "Shape", + * shape: "Cylinder", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * dimensions: { x: 0.4, y: 0.6, z: 0.4 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "Sphere" {@link Entities.EntityType|EntityType} is the same as the "Shape" + * {@link Entities.EntityType|EntityType} except that its initial shape value is always set to + * "Sphere" when the entity is created. This property value can subsequently be changed (i.e. so that the entity + * is no longer displayed as a sphere). + * @typedef {object} Entities.EntityProperties-Sphere + */ + +/**jsdoc + * The "Text" {@link Entities.EntityType|EntityType} displays a 2D rectangle of text in the domain. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Text + * @property {Vec3} dimensions=0.1,0.1,0.01 - The dimensions of the entity. + * @property {string} text="" - The text to display on the face of the entity. Text wraps if necessary to fit. New lines can be + * created using \n. Overflowing lines are not displayed. + * @property {number} lineHeight=0.1 - The height of each line of text (thus determining the font size). + * @property {Color} textColor=255,255,255 - The color of the text. + * @property {Color} backgroundColor=0,0,0 - The color of the background rectangle. + * @property {boolean} faceCamera=false - If true, the entity is oriented to face each user's camera (i.e., it + * differs for each user present). + * @example Create a text entity. + * var text = Entities.addEntity({ + * type: "Text", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * dimensions: { x: 0.6, y: 0.3, z: 0.01 }, + * lineHeight: 0.12, + * text: "Hello\nthere!", + * faceCamera: true, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "Web" {@link Entities.EntityType|EntityType} displays a browsable Web page. Each user views their own copy + * of the Web page: if one user navigates to another page on the entity, other users do not see the change; if a video is being + * played, users don't see it in sync. + * The entity has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Web + * @property {Vec3} dimensions=0.1,0.1,0.01 - The dimensions of the entity. + * @property {string} sourceUrl="" - The URL of the Web page to display. This value does not change as you or others navigate + * on the Web entity. + * @property {number} dpi=30 - The resolution to display the page at, in dots per inch + * @example Create a Web entity displaying at 1920 x 1080 resolution. + * var METERS_TO_INCHES = 39.3701; + * var entity = Entities.addEntity({ + * type: "Web", + * sourceUrl: "https://highfidelity.com/", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -4 })), + * rotation: MyAvatar.orientation, + * dimensions: { + * x: 3, + * y: 3 * 1080 / 1920, + * z: 0.01 + * }, + * dpi: 1920 / (3 * METERS_TO_INCHES), + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + +/**jsdoc + * The "Zone" {@link Entities.EntityType|EntityType} is a volume of lighting effects and avatar permissions. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Zone + * @property {Vec3} dimensions=0.1,0.1,0.1 - The size of the volume in which the zone's lighting effects and avatar permissions + * have effect. + * + * @property {ShapeType} shapeType="box" - The shape of the volume in which the zone's lighting effects and avatar + * permissions have effect. Reverts to the default value if set to "none", or set to "compound" + * and compoundShapeURL is "". + * @property {string} compoundShapeURL="" - The OBJ file to use for the compound shape if shapeType is + * "compound". + * + * @property {string} keyLightMode="inherit" - Configures the key light in the zone. Possible values:
+ * "inherit": The key light from any enclosing zone continues into this zone.
+ * "disabled": The key light from any enclosing zone and the key light of this zone are disabled in this + * zone.
+ * "enabled": The key light properties of this zone are enabled, overriding the key light of from any + * enclosing zone. + * @property {Entities.KeyLight} keyLight - The key light properties of the zone. + * + * @property {string} ambientLightMode="inherit" - Configures the ambient light in the zone. Possible values:
+ * "inherit": The ambient light from any enclosing zone continues into this zone.
+ * "disabled": The ambient light from any enclosing zone and the ambient light of this zone are disabled in + * this zone.
+ * "enabled": The ambient light properties of this zone are enabled, overriding the ambient light from any + * enclosing zone. + * @property {Entities.AmbientLight} ambientLight - The ambient light properties of the zone. + * + * @property {string} skyboxMode="inherit" - Configures the skybox displayed in the zone. Possible values:
+ * "inherit": The skybox from any enclosing zone is dislayed in this zone.
+ * "disabled": The skybox from any enclosing zone and the skybox of this zone are disabled in this zone.
+ * "enabled": The skybox properties of this zone are enabled, overriding the skybox from any enclosing zone. + * @property {Entities.Skybox} skybox - The skybox properties of the zone. + * + * @property {string} hazeMode="inherit" - Configures the haze in the zone. Possible values:
+ * "inherit": The haze from any enclosing zone continues into this zone.
+ * "disabled": The haze from any enclosing zone and the haze of this zone are disabled in this zone.
+ * "enabled": The haze properties of this zone are enabled, overriding the haze from any enclosing zone. + * @property {Entities.Haze} haze - The haze properties of the zone. + * + * @property {boolean} flyingAllowed=true - If true then visitors can fly in the zone; otherwise they cannot. + * @property {boolean} ghostingAllowed=true - If true then visitors with avatar collisions turned off will not + * collide with content in the zone; otherwise visitors will always collide with content in the zone. + + * @property {string} filterURL="" - The URL of a JavaScript file that filters changes to properties of entities within the + * zone. It is periodically executed for each entity in the zone. It can, for example, be used to not allow changes to + * certain properties.
+ *

+ * function filter(properties) {
+ *     // Test and edit properties object values,
+ *     // e.g., properties.modelURL, as required.
+ *     return properties;
+ * }
+ * 
+ * + * @example Create a zone that casts a red key light along the x-axis. + * var zone = Entities.addEntity({ + * type: "Zone", + * position: MyAvatar.position, + * dimensions: { x: 100, y: 100, z: 100 }, + * keyLightMode: "enabled", + * keyLight: { + * "color": { "red": 255, "green": 0, "blue": 0 }, + * "direction": { "x": 1, "y": 0, "z": 0 } + * }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool skipDefaults, bool allowUnknownCreateTime, bool strictSemantics) const { // If strictSemantics is true and skipDefaults is false, then all and only those properties are copied for which the property flag // is included in _desiredProperties, or is one of the specially enumerated ALWAYS properties below. @@ -465,7 +1066,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_DYNAMIC, dynamic, collisionsWillMove, getDynamic()); // legacy support COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FACE_CAMERA, faceCamera); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FACE_CAMERA, faceCamera); // Text only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData); @@ -486,7 +1087,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL); - // Boxes, Spheres, Light, Line, Model(??), Particle, PolyLine + // Light, Line, Model, ParticleEffect, PolyLine, Shape COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLOR, color); // Particles only @@ -534,12 +1135,15 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); } + + // FIXME: Shouldn't provide a shapeType property for Box and Sphere entities? if (_type == EntityTypes::Box) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, QString("Box")); } if (_type == EntityTypes::Sphere) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, QString("Sphere")); } + if (_type == EntityTypes::Box || _type == EntityTypes::Sphere || _type == EntityTypes::Shape) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape); } @@ -618,13 +1222,21 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool if (_type == EntityTypes::Line || _type == EntityTypes::PolyLine) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_COLORS, strokeColors); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals); // Polyline only. + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_COLORS, strokeColors); // Polyline only. + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths); // Polyline only. + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); // Polyline only. + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); // Polyline only. } + /**jsdoc + * The axis-aligned bounding box of an entity. + * @typedef Entities.BoundingBox + * @property {Vec3} brn - The bottom right near (minimum axes values) corner of the AA box. + * @property {Vec3} tfl - The top far left (maximum axes values) corner of the AA box. + * @property {Vec3} center - The center of the AA box. + * @property {Vec3} dimensions - The dimensions of the AA box. + */ if (!skipDefaults && !strictSemantics) { AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); @@ -646,6 +1258,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_ID, parentID); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_JOINT_INDEX, parentJointIndex); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_QUERY_AA_CUBE, queryAACube); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition); @@ -654,13 +1267,23 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLIENT_ONLY, clientOnly); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLIENT_ONLY, clientOnly); // Gettable but not settable + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID); // Gettable but not settable // Rendering info if (!skipDefaults && !strictSemantics) { QScriptValue renderInfo = engine->newObject(); + /**jsdoc + * Information on how an entity is rendered. Properties are only filled in for Model entities; other + * entity types have an empty object, {}. + * @typedef {object} Entities.RenderInfo + * @property {number} verticesCount - The number of vertices in the entity. + * @property {number} texturesCount - The number of textures in the entity. + * @property {number} textureSize - The total size of the textures in the entity, in bytes. + * @property {boolean} hasTransparent - Is true if any of the textures has transparency. + * @property {number} drawCalls - The number of draw calls required to render the entity. + */ // currently only supported by models if (_type == EntityTypes::Model) { renderInfo.setProperty("verticesCount", (int)getRenderInfoVertexCount()); // FIXME - theoretically the number of vertex could be > max int @@ -673,6 +1296,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(renderInfo, renderInfo); // Gettable but not settable } + // FIXME: These properties should already have been set above. properties.setProperty("clientOnly", convertScriptValue(engine, getClientOnly())); properties.setProperty("owningAvatarID", convertScriptValue(engine, getOwningAvatarID())); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index d1b321dbca..9a752cbc76 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -72,7 +72,15 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra /**jsdoc + * The Entities API provides facilities to create and interact with entities. Entities are 2D and 3D objects that are visible + * to everyone and typically are persisted to the domain. + * * @namespace Entities + * @property {number} currentAvatarEnergy - Deprecated + * @property {number} costMultiplier - Deprecated + * @property {Uuid} keyboardFocusEntity - Get or set the {@link Entities.EntityType|Web} entity that has keyboard focus. + * If no entity has keyboard focus, get returns null; set to null or {@link Uuid|Uuid.NULL} to + * clear keyboard focus. */ /// handles scripting of Entity commands from JS passed to assigned clients class EntityScriptingInterface : public OctreeScriptingInterface, public Dependency { diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 316bf2b813..6101c4608b 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -35,6 +35,45 @@ typedef EntityItemPointer (*EntityTypeFactory)(const EntityItemID& entityID, con class EntityTypes { public: + /**jsdoc + *

An entity may be one of the following types:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueDescriptionProperties
BoxA rectangular prism. This is identical to the Shape EntityType except + * that it is always created with an initial shape property value of "Cube".{@link Entities.EntityProperties-Box|EntityProperties-Box}
LightA local lighting effect.{@link Entities.EntityProperties-Light|EntityProperties-Light}
LineA sequence of one or more simple straight lines.{@link Entities.EntityProperties-Line|EntityProperties-Line}
ModelA mesh model from an FBX or OBJ file.{@link Entities.EntityProperties-Model|EntityProperties-Model}
ParticleEffectA particle system that can be used to simulate things such as fire, + * smoke, snow, magic spells, etc.{@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect}
PolyLineA sequence of one or more textured straight lines.{@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine}
PolyVoxA set of textured voxels.{@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox}
ShapeA basic entity such as a cube. + * See also, the Box and Sphere entity types.{@link Entities.EntityProperties-Shape|EntityProperties-Shape}
SphereA sphere. This is identical to the Shape EntityType except that it is + * always created with an initial shape property value of "Sphere".{@link Entities.EntityProperties-Sphere|EntityProperties-Sphere}
TextA pane of text oriented in space.{@link Entities.EntityProperties-Text|EntityProperties-Text}
WebA browsable Web page.{@link Entities.EntityProperties-Web|EntityProperties-Web}
ZoneA volume of lighting effects and avatar permissions.{@link Entities.EntityProperties-Zone|EntityProperties-Zone}
+ * @typedef {string} Entities.EntityType + */ typedef enum EntityType_t { Unknown, Model, diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index 939391caf9..1437a5fe12 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -40,6 +40,35 @@ static const float INITIAL_HAZE_BACKGROUND_BLEND{ 0.0f }; static const float INITIAL_KEY_LIGHT_RANGE{ 1000.0f }; static const float INITIAL_KEY_LIGHT_ALTITUDE{ 200.0f }; +// FIXME: Document hazeAttenuationKeyLight, hazeKeyLightRange, and hazeKeyLightAltitude once they're working and are provided +// in the Create app's UI. +/**jsdoc + * Haze is defined by the following properties. + * @typedef {object} Entities.Haze + * + * @property {number} hazeRange=1000 - The horizontal distance at which visibility is reduced to 95%; i.e., 95% of each pixel's + * color is haze. + * @property {Color} hazeColor=128,154,179 - The color of the haze when looking away from the key light. + * @property {boolean} hazeEnableGlare=false - If true then the haze is colored with glare from the key light; + * hazeGlareColor and hazeGlareAngle are used. + * @property {Color} hazeGlareColor=255,299,179 - The color of the haze when looking towards the key light. + * @property {number} hazeGlareAngle=20 - The angle in degrees across the circle around the key light that the glare color and + * haze color are blended 50/50. + * + * @property {boolean} hazeAltitudeEffect=false - If true then haze decreases with altitude as defined by the + * entity's local coordinate system; hazeBaseRef and
hazeCeiling are used. + * @property {number} hazeBaseRef=0 - The y-azis value in the entity's local coordinate system at which the haze density starts + * reducing with altitude. + * @property {number} hazeCeiling=200 - The y-axis value in the entity's local coordinate system at which the haze density has + * reduced to 5%. + * + * @property {number} hazeBackgroundBlend=0 - The proportion of the skybox image to show through the haze: 0.0 + * displays no skybox image; 1.0 displays no haze. + * + * @property {boolean} hazeAttenuateKeyLight=false - Currently not supported. + * @property {number} hazeKeyLightRange=1000 - Currently not supported. + * @property {number} hazeKeyLightAltitude=200 - Currently not supported. + */ class HazePropertyGroup : public PropertyGroup { public: // EntityItemProperty related helpers diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index f33ebb282d..dea18f4708 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -27,6 +27,13 @@ class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; +/**jsdoc + * A key light is defined by the following properties. + * @typedef {object} Entities.KeyLight + * @property {Color} color=255,255,255 - The color of the light. + * @property {number} intensity=1 - The intensity of the light. + * @property {Vec3} direction=0,-1,0 - The direction the light is shining. + */ class KeyLightPropertyGroup : public PropertyGroup { public: // EntityItemProperty related helpers diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 47d2a4b4e1..7843a929cb 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -59,6 +59,25 @@ class PolyVoxEntityItem : public EntityItem { virtual int getOnCount() const { return 0; } + /**jsdoc + *

A PolyVoxSurfaceStyle may be one of the following:

+ * + * + * + * + * + * + * + * + * + * + *
ValueTypeDescription
0Marching cubes.Chamfered edges. Open volume. + * Joins neighboring PolyVox entities reasonably well.
1Cubic.Square edges. Open volume. + * Joins neighboring PolyVox entities cleanly.
2Edged cubic.Square edges. Enclosed volume. + * Joins neighboring PolyVox entities cleanly.
3Edged marching cubes.Chamfered edges. Enclosed volume. + * Doesn't join neighboring PolyVox entities.
+ * @typedef {number} Entities.PolyVoxSurfaceStyle + */ enum PolyVoxSurfaceStyle { SURFACE_MARCHING_CUBES, SURFACE_CUBIC, diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index cbcfcaaa1d..7b8f97be36 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -20,6 +20,33 @@ #include "ShapeEntityItem.h" namespace entity { + + /**jsdoc + *

A Shape, Box, or Sphere {@link Entities.EntityType|EntityType} may display as + * one of the following geometrical shapes:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueDimensionsNotes
"Circle"2DA circle oriented in 3D.
"Cube"3D
"Cone"3D
"Cylinder"3D
"Dodecahedron"3D
"Hexagon"3DA hexagonal prism.
"Icosahedron"3D
"Octagon"3DAn octagonal prism.
"Octahedron"3D
"Quad"2DA square oriented in 3D.
"Sphere"3D
"Tetrahedron"3D
"Torus"3DNot implemented.
"Triangle"3DA triangular prism.
+ * @typedef {string} Entities.Shape + */ static const std::array shapeStrings { { "Triangle", "Quad", @@ -32,7 +59,7 @@ namespace entity { "Octahedron", "Dodecahedron", "Icosahedron", - "Torus", + "Torus", // Not implemented yet. "Cone", "Cylinder" } }; diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index 84ce1ce57e..184dfa4dd9 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -103,7 +103,7 @@ public: protected: - float _alpha { 1 }; + float _alpha { 1 }; // FIXME: This property is not used. rgbColor _color; entity::Shape _shape { entity::Shape::Sphere }; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 8298a7b74e..d7b422bf11 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -27,6 +27,13 @@ class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; +/**jsdoc + * A skybox is defined by the following properties. + * @typedef {object} Entities.Skybox + * @property {Color} color=0,0,0 - Sets the color of the sky if url is "", otherwise modifies the + * color of the cube map image. + * @property {string} url="" - A cube map image that is used to render the sky. + */ class SkyboxPropertyGroup : public PropertyGroup { public: // EntityItemProperty related helpers diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index a082a681c9..ccfe1f2caa 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -74,32 +74,6 @@ static std::array MAPPING GeometryCache::Cylinder, } }; -/**jsdoc -*

{@link Entities} and {@link Overlays} may have the following geometrical shapes:

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
ValueDescription
LineA 1D line oriented in 3 dimensions.
TriangleA triangular prism.
QuadA 2D square oriented in 3 dimensions.
HexagonA hexagonal prism.
OctagonAn octagonal prism.
CircleA 2D circle oriented in 3 dimensions.
CubeA cube.
SphereA sphere.
TetrahedronA tetrahedron.
OctahedronAn octahedron.
DodecahedronA dodecahedron.
IcosahedronAn icosahedron.
TorusA torus. Not implemented.
ConeA cone.
CylinderA cylinder.
-* @typedef {string} Shape -*/ static const std::array GEOCACHE_SHAPE_STRINGS{ { "Line", "Triangle", diff --git a/libraries/shared/src/PhysicsCollisionGroups.h b/libraries/shared/src/PhysicsCollisionGroups.h index 794f338dc5..0eb1d2021f 100644 --- a/libraries/shared/src/PhysicsCollisionGroups.h +++ b/libraries/shared/src/PhysicsCollisionGroups.h @@ -64,6 +64,24 @@ const int16_t BULLET_COLLISION_MASK_OTHER_AVATAR = BULLET_COLLISION_MASK_DEFAULT // COLLISIONLESS gets an empty mask. const int16_t BULLET_COLLISION_MASK_COLLISIONLESS = 0; +/**jsdoc + *

An entity may collide with the following types of items:

+ * + * + * + * + * + * + * + * + * + * + * + *
ValueDescription
1Static entities — non-dynamic entities with no velocity.
2Dynamic entities — entities that have their dynamic property set to + * true.
4Kinematic entities — non-dynamic entities with velocity.
8My avatar.
16Other avatars.
+ *

The values for the collision types that are enabled are added together to give the CollisionMask value.

+ * @typedef {number} Entities.CollisionMask + */ // The USER collision groups are exposed to script and can be used to generate per-object collision masks. // They are not necessarily the same as the BULLET_COLLISION_GROUPS, but we start them off with matching numbers. diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 7b455beae5..c597db6dc1 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -689,6 +689,15 @@ QScriptValue qColorToScriptValue(QScriptEngine* engine, const QColor& color) { return object; } +/**jsdoc + * An axis-aligned cube, defined as the bottom right near (minimum axes values) corner of the cube plus the dimension of its + * sides. + * @typedef {object} AACube + * @property {number} x - X coordinate of the brn corner of the cube. + * @property {number} y - Y coordinate of the brn corner of the cube. + * @property {number} z - Z coordinate of the brn corner of the cube. + * @property {number} scale - The dimensions of each side of the cube. + */ QScriptValue aaCubeToScriptValue(QScriptEngine* engine, const AACube& aaCube) { QScriptValue obj = engine->newObject(); const glm::vec3& corner = aaCube.getCorner(); diff --git a/libraries/shared/src/ShapeInfo.cpp b/libraries/shared/src/ShapeInfo.cpp index 8cdc4bcf14..968292da87 100644 --- a/libraries/shared/src/ShapeInfo.cpp +++ b/libraries/shared/src/ShapeInfo.cpp @@ -1,6 +1,6 @@ // // ShapeInfo.cpp -// libraries/physics/src +// libraries/shared/src // // Created by Andrew Meadows 2014.10.29 // Copyright 2014 High Fidelity, Inc. @@ -15,6 +15,33 @@ #include "NumericalConstants.h" // for MILLIMETERS_PER_METER +/**jsdoc + *

A ShapeType defines the shape used for collisions or zones.

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueDescription
"none"No shape.
"box"A cube.
"sphere"A sphere.
"capsule-x"A capsule (cylinder with spherical ends) oriented on the x-axis.
"capsule-y"A capsule (cylinder with spherical ends) oriented on the y-axis.
"capsule-z"A capsule (cylinder with spherical ends) oriented on the z-axis.
"cylinder-x"A cylinder oriented on the x-axis.
"cylinder-y"A cylinder oriented on the y-axis.
"cylinder-z"A cylinder oriented on the z-axis.
"hull"Not used.
"compound"A compound convex hull specified in an OBJ file.
"simple-hull"A convex hull automatically generated from the model.
"simple-compound"A compound convex hull automatically generated from the model, using + * sub-meshes.
"static-mesh"The exact shape of the model.
"plane"A plane.
+ * @typedef {string} ShapeType + */ // Originally within EntityItemProperties.cpp const char* shapeTypeNames[] = { "none", diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index bb556814e8..3897ebea07 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -27,7 +27,6 @@ exports.handlers = { '../../libraries/entities/src', '../../libraries/networking/src', '../../libraries/pointers/src', - '../../libraries/render-utils/src', '../../libraries/shared/src', '../../libraries/shared/src/shared', '../../libraries/script-engine/src', From 3e7e9fe2c6472a8e243fc0152234f2952e962031 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 19 Feb 2018 12:19:25 +1300 Subject: [PATCH 074/267] Overlay shape is different to Entities shape --- interface/src/ui/overlays/Shape3DOverlay.cpp | 30 ++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index 97342a80ab..aae0d7b094 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -67,6 +67,32 @@ Shape3DOverlay* Shape3DOverlay::createClone() const { } +/**jsdoc + *

A shape {@link Overlays.OverlayType|OverlayType} may display as one of the following geometrical shapes:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueDimensionsDescription
"Circle"2DA circle oriented in 3D.
"Cone"3D
"Cube"3D
"Cylinder"3D
"Dodecahedron"3D
"Hexagon"3DA hexagonal prism.
"Icosahedron"3D
"Line"1DA line oriented in 3D.
"Octagon"3DAn octagonal prism.
"Octahedron"3D
"Quad"2DA square oriented in 3D.
"Sphere"3D
"Tetrahedron"3D
"Torus"3DNot implemented.
"Triangle"3DA triangular prism.
+ * @typedef {string} Overlays.Shape + */ static const std::array shapeStrings { { "Line", "Triangle", @@ -80,7 +106,7 @@ static const std::array shapeStrings "Octahedron", "Dodecahedron", "Icosahedron", - "Torus", + "Torus", // Not implemented yet. "Cone", "Cylinder" } }; @@ -152,7 +178,7 @@ void Shape3DOverlay::setProperties(const QVariantMap& properties) { * * @property {Vec3} dimensions - The dimensions of the overlay. Synonyms: scale, size. * - * @property {Shape} shape=Hexagon - The geometrical shape of the overlay. + * @property {Overlays.Shape} shape=Hexagon - The geometrical shape of the overlay. * @property {number} borderSize - Not used. */ QVariant Shape3DOverlay::getProperty(const QString& property) { From 03bc1b05d91e2f4358dda9b5067ba5115a721e4b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 19 Feb 2018 12:21:07 +1300 Subject: [PATCH 075/267] Overlays JSDoc improvements --- interface/src/ui/overlays/Overlays.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 113ee92b80..f150f5715c 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -75,7 +75,8 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R * yourself and that aren't persisted to the domain. They are used for UI. * @namespace Overlays * @property {Uuid} keyboardFocusOverlay - Get or set the {@link Overlays.OverlayType|web3d} overlay that has keyboard focus. - * If no overlay is set, get returns null; set to null to clear keyboard focus. + * If no overlay has keyboard focus, get returns null; set to null or {@link Uuid|Uuid.NULL} to + * clear keyboard focus. */ class Overlays : public QObject { @@ -111,7 +112,7 @@ public slots: * @function Overlays.addOverlay * @param {Overlays.OverlayType} type - The type of the overlay to add. * @param {Overlays.OverlayProperties} properties - The properties of the overlay to add. - * @returns {Uuid} The ID of the newly created overlay. + * @returns {Uuid} The ID of the newly created overlay if successful, otherwise {@link Uuid|Uuid.NULL}. * @example Add a cube overlay in front of your avatar. * var overlay = Overlays.addOverlay("cube", { * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -3 })), @@ -126,7 +127,7 @@ public slots: * Create a clone of an existing overlay. * @function Overlays.cloneOverlay * @param {Uuid} overlayID - The ID of the overlay to clone. - * @returns {Uuid} The ID of the new overlay. + * @returns {Uuid} The ID of the new overlay if successful, otherwise {@link Uuid|Uuid.NULL}. * @example Add an overlay in front of your avatar, clone it, and move the clone to be above the * original. * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -3 })); @@ -557,7 +558,7 @@ public slots: * Set the Web3D overlay that has keyboard focus. * @function Overlays.setKeyboardFocusOverlay * @param {Uuid} overlayID - The ID of the {@link Overlays.OverlayType|web3d} overlay to set keyboard focus to. Use - * {@link Uuid|Uuid.NULL} or null to unset keyboard focus from an overlay. + * null or {@link Uuid|Uuid.NULL} to unset keyboard focus from an overlay. */ void setKeyboardFocusOverlay(const OverlayID& id); From 86a6f73fb410b161b89d6f780b10005942e5f2fb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 19 Feb 2018 12:21:21 +1300 Subject: [PATCH 076/267] Quat JSDoc improvement --- libraries/script-engine/src/Quat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/Quat.h b/libraries/script-engine/src/Quat.h index 23e8e3b896..68b4dcd408 100644 --- a/libraries/script-engine/src/Quat.h +++ b/libraries/script-engine/src/Quat.h @@ -35,7 +35,7 @@ * of gimbal lock. * @namespace Quat * @variation 0 - * @property IDENTITY {Quat} The identity rotation, i.e., no rotation. + * @property IDENTITY {Quat} The identity rotation, i.e., no rotation. Its value is { x: 0, y: 0, z: 0, w: 1 }. * @example Print the IDENTITY value. * print(JSON.stringify(Quat.IDENTITY)); // { x: 0, y: 0, z: 0, w: 1 } * print(JSON.stringify(Quat.safeEulerAngles(Quat.IDENTITY))); // { x: 0, y: 0, z: 0 } From 9e37230aa19610afaec0d772f47bd2c372878fe6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 19 Feb 2018 12:21:56 +1300 Subject: [PATCH 077/267] Miscellaneous code tidying --- libraries/entities-renderer/src/RenderableZoneEntityItem.cpp | 2 +- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 34703804cd..145ad9cea9 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -432,7 +432,7 @@ void ZoneEntityRenderer::setAmbientURL(const QString& ambientUrl) { _ambientTexture = textureCache->getTexture(_ambientTextureURL, image::TextureUsage::CUBE_TEXTURE); // keep whatever is assigned on the ambient map/sphere until texture is loaded -} + } } void ZoneEntityRenderer::updateAmbientMap() { diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 3e0770f386..6924bdc582 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -203,7 +203,7 @@ public: DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector, QVector()); - DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); + DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString, ""); DEFINE_PROPERTY_REF(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString, ""); DEFINE_PROPERTY_REF(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString, ""); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 4342f0e683..acfd1e41cb 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -528,7 +528,7 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& NestableType nestableType = nestable->getNestableType(); if (nestableType == NestableType::Overlay || nestableType == NestableType::Avatar) { qCWarning(entities) << "attempted edit on non-entity: " << id << nestable->getName(); - return QUuid(); // null UUID to indicate failure + return QUuid(); // null script value to indicate failure } } } From 18af60f3ebafe298fa4310ff8cc1fa1f390c5b15 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 19 Feb 2018 18:48:58 +0100 Subject: [PATCH 078/267] Added RingBuffer mechanism to gpu lib --- libraries/gpu/src/gpu/Batch.cpp | 21 +++++++ libraries/gpu/src/gpu/Batch.h | 13 +++- libraries/gpu/src/gpu/Framebuffer.h | 3 + libraries/gpu/src/gpu/ResourceRing.h | 62 +++++++++++++++++++ .../render-utils/src/AntialiasingEffect.cpp | 40 ++++++------ .../render-utils/src/AntialiasingEffect.h | 5 +- 6 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 libraries/gpu/src/gpu/ResourceRing.h diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index 6a07b2bb61..2c53d4a20c 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -320,6 +320,14 @@ void Batch::setResourceTexture(uint32 slot, const TextureView& view) { setResourceTexture(slot, view._texture); } +void Batch::setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex) { + ADD_COMMAND(setResourceFramebufferRingTexture); + + _params.emplace_back(_ringbuffers.cache(framebuffer)); + _params.emplace_back(slot); + _params.emplace_back(ringIndex); +} + void Batch::setFramebuffer(const FramebufferPointer& framebuffer) { ADD_COMMAND(setFramebuffer); @@ -327,6 +335,19 @@ void Batch::setFramebuffer(const FramebufferPointer& framebuffer) { } +void Batch::setFramebufferRing(const FramebufferRingPointer& framebuffer, unsigned int ringIndex) { + ADD_COMMAND(setFramebufferRing); + + _params.emplace_back(_ringbuffers.cache(framebuffer)); + _params.emplace_back(ringIndex); +} + +void Batch::advance(const RingBufferPointer& ringbuffer) { + ADD_COMMAND(advance); + + _params.emplace_back(_ringbuffers.cache(ringbuffer)); +} + void Batch::clearFramebuffer(Framebuffer::Masks targets, const Vec4& color, float depth, int stencil, bool enableScissor) { ADD_COMMAND(clearFramebuffer); diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 4f4ea33679..eb716b1926 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -187,11 +187,14 @@ public: void setResourceTexture(uint32 slot, const TexturePointer& texture); void setResourceTexture(uint32 slot, const TextureView& view); // not a command, just a shortcut from a TextureView - + void setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex); // not a command, just a shortcut from a TextureView // Ouput Stage void setFramebuffer(const FramebufferPointer& framebuffer); - + void setFramebufferRing(const FramebufferRingPointer& framebuffer, unsigned int ringIndex); + + void advance(const RingBufferPointer& ringbuffer); + // Clear framebuffer layers // Targets can be any of the render buffers contained in the currnetly bound Framebuffer // Optionally the scissor test can be enabled locally for this command and to restrict the clearing command to the pixels contained in the scissor rectangle @@ -299,12 +302,16 @@ public: COMMAND_setUniformBuffer, COMMAND_setResourceBuffer, COMMAND_setResourceTexture, + COMMAND_setResourceFramebufferRingTexture, COMMAND_setFramebuffer, + COMMAND_setFramebufferRing, COMMAND_clearFramebuffer, COMMAND_blit, COMMAND_generateTextureMips, + COMMAND_advance, + COMMAND_beginQuery, COMMAND_endQuery, COMMAND_getQuery, @@ -421,6 +428,7 @@ public: typedef Cache::Vector TransformCaches; typedef Cache::Vector PipelineCaches; typedef Cache::Vector FramebufferCaches; + typedef Cache::Vector RingBufferCaches; typedef Cache::Vector QueryCaches; typedef Cache::Vector StringCaches; typedef Cache>::Vector LambdaCache; @@ -475,6 +483,7 @@ public: TransformCaches _transforms; PipelineCaches _pipelines; FramebufferCaches _framebuffers; + RingBufferCaches _ringbuffers; QueryCaches _queries; LambdaCache _lambdas; StringCaches _profileRanges; diff --git a/libraries/gpu/src/gpu/Framebuffer.h b/libraries/gpu/src/gpu/Framebuffer.h index f470cc8aa9..b0cd898eea 100755 --- a/libraries/gpu/src/gpu/Framebuffer.h +++ b/libraries/gpu/src/gpu/Framebuffer.h @@ -12,6 +12,7 @@ #define hifi_gpu_Framebuffer_h #include "Texture.h" +#include "ResourceRing.h" #include class Transform; // Texcood transform util @@ -177,6 +178,8 @@ protected: Framebuffer() {} }; typedef std::shared_ptr FramebufferPointer; +typedef ResourceRing FramebufferRing; +typedef std::shared_ptr FramebufferRingPointer; } diff --git a/libraries/gpu/src/gpu/ResourceRing.h b/libraries/gpu/src/gpu/ResourceRing.h new file mode 100644 index 0000000000..c61f7a02f7 --- /dev/null +++ b/libraries/gpu/src/gpu/ResourceRing.h @@ -0,0 +1,62 @@ +// +// Created by Olivier Prat on 2018/02/19 +// Copyright 2013-2018 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_gpu_ResourceRing_h +#define hifi_gpu_ResourceRing_h + +#include +#include + +namespace gpu { + class RingBuffer { + public: + + RingBuffer(unsigned int size = 2U) : _size{ size } {} + virtual ~RingBuffer() {} + + void advance() { + _frontIndex = (_frontIndex + 1) % _size; + } + + unsigned int getSize() const { return _size; } + + protected: + unsigned int _size; + unsigned int _frontIndex{ 0U }; + + }; + typedef std::shared_ptr RingBufferPointer; + + template + class ResourceRing : public RingBuffer { + public: + + enum { + MAX_SIZE = 4 + }; + + using Type = R; + using TypePointer = std::shared_ptr; + + ResourceRing(unsigned int size = 2U) : RingBuffer{ size } {} + + void reset() { + for (auto& ptr : _resources) { + ptr.reset(); + } + } + + TypePointer& edit(unsigned int index) { return _resources[(index + _frontIndex) % _size]; } + const TypePointer& get(unsigned int index) const { return _resources[(index + _frontIndex) % _size]; } + + private: + + std::array _resources; + }; +} + +#endif diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index f6b4b4d9d8..9f2678770f 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -188,13 +188,13 @@ const int AntialiasingPass_NextMapSlot = 4; Antialiasing::Antialiasing() { + _antialiasingBuffers = std::make_shared(2U); } Antialiasing::~Antialiasing() { - _antialiasingBuffer[0].reset(); - _antialiasingBuffer[1].reset(); - _antialiasingTexture[0].reset(); - _antialiasingTexture[1].reset(); + _antialiasingBuffers.reset(); + _antialiasingTextures[0].reset(); + _antialiasingTextures[1].reset(); } const gpu::PipelinePointer& Antialiasing::getAntialiasingPipeline() { @@ -316,27 +316,26 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const int width = sourceBuffer->getWidth(); int height = sourceBuffer->getHeight(); - 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 (_antialiasingBuffers->get(0)) { + if (_antialiasingBuffers->get(0)->getSize() != uvec2(width, height)) {// || (sourceBuffer && (_antialiasingBuffer->getRenderBuffer(1) != sourceBuffer->getRenderBuffer(0)))) { + _antialiasingBuffers->edit(0).reset(); + _antialiasingBuffers->edit(1).reset(); + _antialiasingTextures[0].reset(); + _antialiasingTextures[1].reset(); } } - if (!_antialiasingBuffer[0]) { + if (!_antialiasingBuffers->get(0)) { // Link the antialiasing FBO to texture for (int i = 0; i < 2; i++) { - _antialiasingBuffer[i] = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); + auto& antiAliasingBuffer = _antialiasingBuffers->edit(i); + 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_LINEAR); - _antialiasingTexture[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); - _antialiasingBuffer[i]->setRenderBuffer(0, _antialiasingTexture[i]); + _antialiasingTextures[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); + antiAliasingBuffer->setRenderBuffer(0, _antialiasingTextures[i]); } } - int nextFrame = (_currentFrame++) % 2; - int prevFrame = (nextFrame + 1) % 2; gpu::doInBatch("Antialiasing::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); @@ -344,7 +343,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const // TAA step getAntialiasingPipeline(); - batch.setResourceTexture(AntialiasingPass_HistoryMapSlot, _antialiasingTexture[prevFrame]); + batch.setResourceFramebufferRingTexture(AntialiasingPass_HistoryMapSlot, _antialiasingBuffers, 0); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); batch.setResourceTexture(AntialiasingPass_DepthMapSlot, linearDepthBuffer->getLinearDepthTexture()); @@ -352,7 +351,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); - batch.setFramebuffer(_antialiasingBuffer[nextFrame]); + batch.setFramebufferRing(_antialiasingBuffers, 1); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); @@ -365,8 +364,9 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const } else { batch.setPipeline(getBlendPipeline()); } - batch.setResourceTexture(AntialiasingPass_NextMapSlot, _antialiasingTexture[nextFrame]); - batch.draw(gpu::TRIANGLE_STRIP, 4); + batch.setResourceFramebufferRingTexture(AntialiasingPass_NextMapSlot, _antialiasingBuffers, 1); + batch.draw(gpu::TRIANGLE_STRIP, 4); + batch.advance(_antialiasingBuffers); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, nullptr); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, nullptr); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index d201be3f73..f47a64c589 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -191,15 +191,14 @@ private: // Uniforms for AA gpu::int32 _texcoordOffsetLoc; - gpu::FramebufferPointer _antialiasingBuffer[2]; - gpu::TexturePointer _antialiasingTexture[2]; + gpu::FramebufferRingPointer _antialiasingBuffers; + gpu::TexturePointer _antialiasingTextures[2]; gpu::PipelinePointer _antialiasingPipeline; gpu::PipelinePointer _blendPipeline; gpu::PipelinePointer _debugBlendPipeline; TAAParamsBuffer _params; - int _currentFrame{ 0 }; }; From 779e45aae749185b350c60a4bb011a75f644299d Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 19 Feb 2018 16:12:41 -0300 Subject: [PATCH 079/267] Restore avatar overlays --- .../render-utils/src/RenderForwardTask.cpp | 2 + scripts/system/+android/radar.js | 51 ++++++++++--------- scripts/system/+android/uniqueColor.js | 10 +++- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index f587cccd1a..fa3c9c86ab 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -37,6 +37,7 @@ using namespace render; extern void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::BatchSetter& batchSetter, const render::ShapePipeline::ItemSetter& itemSetter); +extern void initOverlay3DPipelines(render::ShapePlumber& plumber, bool depthTest = false); void RenderForwardTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { auto items = input.get(); @@ -45,6 +46,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // Prepare the ShapePipelines ShapePlumberPointer shapePlumber = std::make_shared(); initForwardPipelines(*shapePlumber, fadeEffect->getBatchSetter(), fadeEffect->getItemUniformSetter()); + initOverlay3DPipelines(*shapePlumber); // Extract opaques / transparents / lights / metas / overlays / background const auto& opaques = items.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE]; diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js index baf4441749..9682962eda 100644 --- a/scripts/system/+android/radar.js +++ b/scripts/system/+android/radar.js @@ -31,10 +31,11 @@ var PINCH_INCREMENT_FIRST = 0.4; // 0.1 meters zoom in - out var PINCH_INCREMENT = 0.4; // 0.1 meters zoom in - out var RADAR_HEIGHT_MAX_PLUS_AVATAR = 40; var RADAR_HEIGHT_MIN_PLUS_AVATAR = 2; -var RADAR_CAMERA_DISTANCE_TO_ICONS = 0.5; // Icons are near the camera to prevent the LOD manager dismissing them +var RADAR_CAMERA_DISTANCE_TO_ICONS = 1.5; // Icons are near the camera to prevent the LOD manager dismissing them var RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE = 1; // How much above the avatar base should the icon appear var AVATAR_DISPLAY_NAME_HEIGHT = 38; var AVATAR_DISPLAY_NAME_CHAR_WIDTH = 18; +var AVATAR_DISPLAY_NAME_FONT_SIZE = 350; var lastDragAt; var lastDeltaDrag; @@ -734,14 +735,15 @@ function saveAvatarData(QUuid) { if (avatarsData[QUuid] != undefined) { avatarsData[QUuid].position = avat.position; } else { - var avatarIcon = Overlays.addOverlay("image3d", { - subImage: { x: 0, y: 0, width: 150, height: 142}, - url: getAvatarIconForUser(QUuid), - dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, - visible: false, - ignoreRayIntersection: false, - orientation: Quat.fromPitchYawRollDegrees(-90,0,0) - }); + var avatarIcon = Overlays.addOverlay("circle3d", { + color: uniqueColor.convertHexToRGB(uniqueColor.getColor(QUuid)), + dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, + rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), + innerRadius: 1.6, + outerRadius: 2, + isSolid: true, + visible: false + }); var needRefresh = !avat || !avat.displayName; var displayName = avat && avat.displayName ? avat.displayName : "Unknown"; @@ -752,7 +754,7 @@ function saveAvatarData(QUuid) { color: { red: 255, green: 255, blue: 255}, backgroundAlpha: 0.0, textRaiseColor: { red: 0, green: 0, blue: 0}, - font: {size: 68, bold: true}, + font: {size: AVATAR_DISPLAY_NAME_FONT_SIZE, bold: true}, visible: false, text: displayName, textAlignCenter: true @@ -833,15 +835,16 @@ function renderMyAvatarIcon() { var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) / (borderPoints[1].x - borderPoints[0].x); var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); - if (!myAvatarIcon && MyAvatar.sessionUUID) { - myAvatarIcon = Overlays.addOverlay("image3d", { - subImage: { x: 0, y: 0, width: 150, height: 142}, - url: getAvatarIconForUser(MyAvatar.sessionUUID), - dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, - visible: false, - ignoreRayIntersection: false, - orientation: Quat.fromPitchYawRollDegrees(-90,0,0) - }); + if (!myAvatarIcon && MyAvatar.SELF_ID) { + myAvatarIcon = Overlays.addOverlay("circle3d", { + color: uniqueColor.convertHexToRGB(uniqueColor.getColor(MyAvatar.SELF_ID)), + dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, + rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), + innerRadius: 1.6, + outerRadius: 2, + isSolid: true, + visible: false + }); } if (!myAvatarName) { @@ -851,7 +854,7 @@ function renderMyAvatarIcon() { textAlignCenter: true, color: { red: 255, green: 255, blue: 255}, backgroundAlpha: 0.0, - font: {size: 68, bold: true}, + font: {size: AVATAR_DISPLAY_NAME_FONT_SIZE, bold: true}, textRaiseColor: { red: 0, green: 0, blue: 0}, visible: false, text: "Me" @@ -907,13 +910,13 @@ function renderAllOthersAvatarIcons() { if (AvatarList.getAvatar(QUuid) != null) { avatarPos = AvatarList.getAvatar(QUuid).position; - var cameraPos = Camera.position; - var p1 = findLineToHeightIntersectionCoords(avatarPos.x, avatarPos.y, avatarPos.z, + var cameraPos = Camera.position; + var p1 = findLineToHeightIntersectionCoords(avatarPos.x, avatarPos.y, avatarPos.z, cameraPos.x, cameraPos.y, cameraPos.z, commonY); - var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) / (borderPoints[1].x - borderPoints[0].x); - var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); + var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) / (borderPoints[1].x - borderPoints[0].x); + var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); if (avatarsData[QUuid].icon != undefined) { var iconPos = findLineToHeightIntersectionCoords( avatarPos.x, avatarPos.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, avatarPos.z, diff --git a/scripts/system/+android/uniqueColor.js b/scripts/system/+android/uniqueColor.js index c296b6c87d..a2741642d2 100644 --- a/scripts/system/+android/uniqueColor.js +++ b/scripts/system/+android/uniqueColor.js @@ -41,6 +41,14 @@ function getColorForId(uuid) { module.exports = { getColor: function(id) { - return getColorForId(id); + return getColorForId(id); + }, + convertHexToRGB: function(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + red: parseInt(result[1], 16), + green: parseInt(result[2], 16), + blue: parseInt(result[3], 16) + } : null; } }; From 94a8aad7128957950f75ba31ad019adacf6638fc Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 19 Feb 2018 16:52:51 -0300 Subject: [PATCH 080/267] Avoid keyboard appearing on startup --- .../qml/desktop/+android/FocusHack.qml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 interface/resources/qml/desktop/+android/FocusHack.qml diff --git a/interface/resources/qml/desktop/+android/FocusHack.qml b/interface/resources/qml/desktop/+android/FocusHack.qml new file mode 100644 index 0000000000..db703bab52 --- /dev/null +++ b/interface/resources/qml/desktop/+android/FocusHack.qml @@ -0,0 +1,24 @@ +// +// FocusHack.qml +// +// Created by Bradley Austin Davis on 21 Jan 2015 +// 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 + +FocusScope { + id: root + objectName: "FocusHack" + + TextInput { + id: textInput; + focus: true + width: 10; height: 10 + onActiveFocusChanged: root.destroy() + } + +} From 12770142fa44cd26cbd56078d8c001d676c7b55d Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 12 Feb 2018 16:45:44 -0300 Subject: [PATCH 081/267] Add bubble button to android bottombar --- .../resources/icons/+android/bubble-a.svg | 1022 +++++++++++++++++ .../resources/icons/+android/bubble-i.svg | 1022 +++++++++++++++++ scripts/system/+android/bottombar.js | 20 + 3 files changed, 2064 insertions(+) create mode 100644 interface/resources/icons/+android/bubble-a.svg create mode 100644 interface/resources/icons/+android/bubble-i.svg diff --git a/interface/resources/icons/+android/bubble-a.svg b/interface/resources/icons/+android/bubble-a.svg new file mode 100644 index 0000000000..fccc9c07ff --- /dev/null +++ b/interface/resources/icons/+android/bubble-a.svg @@ -0,0 +1,1022 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/resources/icons/+android/bubble-i.svg b/interface/resources/icons/+android/bubble-i.svg new file mode 100644 index 0000000000..80c97d2704 --- /dev/null +++ b/interface/resources/icons/+android/bubble-i.svg @@ -0,0 +1,1022 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js index 72ba1c1e50..5f82886c8a 100644 --- a/scripts/system/+android/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -15,6 +15,7 @@ var bottombar; var bottomHudOptionsBar; var gotoBtn; var avatarBtn; +var bubbleBtn; var loginBtn; var gotoScript = Script.require('./goto.js'); @@ -117,6 +118,25 @@ function setupBottomBar() { } }); + bubbleBtn = bottombar.addButton({ + icon: "icons/bubble-i.svg", + activeIcon: "icons/bubble-a.svg", + bgOpacity: 0, + hoverBgOpacity: 0, + activeBgOpacity: 0, + activeHoverBgOpacity: 0, + height: 240, + width: 294, + iconSize: 108, + textSize: 45, + text: "BUBBLE" + }); + + bubbleBtn.clicked.connect(function() { + Users.toggleIgnoreRadius(); + bubbleBtn.editProperties({isActive: Users.getIgnoreRadiusEnabled()}); + }); + loginBtn = bottombar.addButton({ icon: "icons/login-i.svg", activeIcon: "icons/login-a.svg", From 247a1f576996c721311aae9d4cbee4d5822fcd16 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 20 Feb 2018 09:22:19 +0100 Subject: [PATCH 082/267] Working ring frame buffer with antialiasing but still issues with TAA on HMD --- libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 4 ++ libraries/gpu-gl/src/gpu/gl/GLBackend.h | 6 +++ .../gpu-gl/src/gpu/gl/GLBackendOutput.cpp | 20 ++++++++ .../gpu-gl/src/gpu/gl/GLBackendPipeline.cpp | 29 ++++++++++- libraries/gpu/src/gpu/Batch.cpp | 5 +- libraries/gpu/src/gpu/Batch.h | 2 +- libraries/render/src/render/Scene.cpp | 49 ++++++++++--------- 7 files changed, 88 insertions(+), 27 deletions(-) diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index 4518bca70a..de1e8f9359 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -99,12 +99,16 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::gl::GLBackend::do_setUniformBuffer), (&::gpu::gl::GLBackend::do_setResourceBuffer), (&::gpu::gl::GLBackend::do_setResourceTexture), + (&::gpu::gl::GLBackend::do_setResourceFramebufferRingTexture), (&::gpu::gl::GLBackend::do_setFramebuffer), + (&::gpu::gl::GLBackend::do_setFramebufferRing), (&::gpu::gl::GLBackend::do_clearFramebuffer), (&::gpu::gl::GLBackend::do_blit), (&::gpu::gl::GLBackend::do_generateTextureMips), + (&::gpu::gl::GLBackend::do_advance), + (&::gpu::gl::GLBackend::do_beginQuery), (&::gpu::gl::GLBackend::do_endQuery), (&::gpu::gl::GLBackend::do_getQuery), diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index feb9ae5bf7..505c26eb68 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -126,15 +126,19 @@ public: // Resource Stage virtual void do_setResourceBuffer(const Batch& batch, size_t paramOffset) final; virtual void do_setResourceTexture(const Batch& batch, size_t paramOffset) final; + virtual void do_setResourceFramebufferRingTexture(const Batch& batch, size_t paramOffset) final; // Pipeline Stage virtual void do_setPipeline(const Batch& batch, size_t paramOffset) final; // Output stage virtual void do_setFramebuffer(const Batch& batch, size_t paramOffset) final; + virtual void do_setFramebufferRing(const Batch& batch, size_t paramOffset) final; virtual void do_clearFramebuffer(const Batch& batch, size_t paramOffset) final; virtual void do_blit(const Batch& batch, size_t paramOffset) = 0; + virtual void do_advance(const Batch& batch, size_t paramOffset) final; + // Query section virtual void do_beginQuery(const Batch& batch, size_t paramOffset) final; virtual void do_endQuery(const Batch& batch, size_t paramOffset) final; @@ -245,6 +249,8 @@ protected: void setupStereoSide(int side); #endif + virtual void setResourceTexture(unsigned int slot, const TexturePointer& resourceTexture); + virtual void setFramebuffer(const FramebufferPointer& framebuffer); virtual void initInput() final; virtual void killInput() final; virtual void syncInputStateCache() final; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp index 358b90ed8b..e34330f9a1 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp @@ -37,6 +37,19 @@ void GLBackend::resetOutputStage() { void GLBackend::do_setFramebuffer(const Batch& batch, size_t paramOffset) { auto framebuffer = batch._framebuffers.get(batch._params[paramOffset]._uint); + setFramebuffer(framebuffer); +} + +void GLBackend::do_setFramebufferRing(const Batch& batch, size_t paramOffset) { + auto ringbuffer = batch._ringbuffers.get(batch._params[paramOffset]._uint); + if (ringbuffer) { + auto index = batch._params[paramOffset + 1]._uint; + FramebufferPointer framebuffer = static_cast(ringbuffer.get())->get(index); + setFramebuffer(framebuffer); + } +} + +void GLBackend::setFramebuffer(const FramebufferPointer& framebuffer) { if (_output._framebuffer != framebuffer) { auto newFBO = getFramebufferID(framebuffer); if (_output._drawFBO != newFBO) { @@ -47,6 +60,13 @@ void GLBackend::do_setFramebuffer(const Batch& batch, size_t paramOffset) { } } +void GLBackend::do_advance(const Batch& batch, size_t paramOffset) { + auto ringbuffer = batch._ringbuffers.get(batch._params[paramOffset]._uint); + if (ringbuffer) { + ringbuffer->advance(); + } +} + void GLBackend::do_clearFramebuffer(const Batch& batch, size_t paramOffset) { if (_stereo.isStereo() && !_pipeline._stateCache.scissorEnable) { qWarning("Clear without scissor in stereo mode"); diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp index 7ef64343ea..3ca3e0f306 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp @@ -253,6 +253,31 @@ void GLBackend::do_setResourceTexture(const Batch& batch, size_t paramOffset) { releaseResourceTexture(slot); return; } + setResourceTexture(slot, resourceTexture); +} + +void GLBackend::do_setResourceFramebufferRingTexture(const Batch& batch, size_t paramOffset) { + GLuint slot = batch._params[paramOffset + 1]._uint; + if (slot >= (GLuint)MAX_NUM_RESOURCE_TEXTURES) { + qCDebug(gpugllogging) << "GLBackend::do_setResourceFramebufferRingTexture: Trying to set a resource Texture at slot #" << slot << " which doesn't exist. MaxNumResourceTextures = " << getMaxNumResourceTextures(); + return; + } + + RingBufferPointer ringBuffer = batch._ringbuffers.get(batch._params[paramOffset + 0]._uint); + + if (!ringBuffer) { + releaseResourceTexture(slot); + return; + } + auto index = batch._params[paramOffset + 2]._uint; + auto renderBufferSlot = batch._params[paramOffset + 3]._uint; + FramebufferPointer resourceFramebuffer = static_cast(ringBuffer.get())->get(index); + TexturePointer resourceTexture = resourceFramebuffer->getRenderBuffer(renderBufferSlot); + + setResourceTexture(slot, resourceTexture); +} + +void GLBackend::setResourceTexture(unsigned int slot, const TexturePointer& resourceTexture) { // check cache before thinking if (_resource._textures[slot] == resourceTexture) { return; @@ -269,11 +294,11 @@ void GLBackend::do_setResourceTexture(const Batch& batch, size_t paramOffset) { glActiveTexture(GL_TEXTURE0 + slot); glBindTexture(target, to); - (void) CHECK_GL_ERROR(); + (void)CHECK_GL_ERROR(); _resource._textures[slot] = resourceTexture; - _stats._RSAmountTextureMemoryBounded += (int) object->size(); + _stats._RSAmountTextureMemoryBounded += (int)object->size(); } else { releaseResourceTexture(slot); diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index 2c53d4a20c..ca16284663 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -73,6 +73,7 @@ Batch::Batch(const Batch& batch_) { _transforms._items.swap(batch._transforms._items); _pipelines._items.swap(batch._pipelines._items); _framebuffers._items.swap(batch._framebuffers._items); + _ringbuffers._items.swap(batch._ringbuffers._items); _drawCallInfos.swap(batch._drawCallInfos); _queries._items.swap(batch._queries._items); _lambdas._items.swap(batch._lambdas._items); @@ -110,6 +111,7 @@ void Batch::clear() { _transforms.clear(); _pipelines.clear(); _framebuffers.clear(); + _ringbuffers.clear(); _objects.clear(); _drawCallInfos.clear(); } @@ -320,12 +322,13 @@ void Batch::setResourceTexture(uint32 slot, const TextureView& view) { setResourceTexture(slot, view._texture); } -void Batch::setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex) { +void Batch::setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex, unsigned int renderBufferSlot) { ADD_COMMAND(setResourceFramebufferRingTexture); _params.emplace_back(_ringbuffers.cache(framebuffer)); _params.emplace_back(slot); _params.emplace_back(ringIndex); + _params.emplace_back(renderBufferSlot); } void Batch::setFramebuffer(const FramebufferPointer& framebuffer) { diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index eb716b1926..e61946d575 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -187,7 +187,7 @@ public: void setResourceTexture(uint32 slot, const TexturePointer& texture); void setResourceTexture(uint32 slot, const TextureView& view); // not a command, just a shortcut from a TextureView - void setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex); // not a command, just a shortcut from a TextureView + void setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex, unsigned int renderBufferSlot = 0U); // not a command, just a shortcut from a TextureView // Ouput Stage void setFramebuffer(const FramebufferPointer& framebuffer); diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index aaf1d2f1c8..0b4ee2f11a 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -435,44 +435,47 @@ void Scene::queryTransitionItems(const Transaction::TransitionQueries& transacti void Scene::resetHighlights(const Transaction::HighlightResets& transactions) { auto outlineStage = getStage(HighlightStage::getName()); + if (outlineStage) { + for (auto& transaction : transactions) { + const auto& selectionName = std::get<0>(transaction); + const auto& newStyle = std::get<1>(transaction); + auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - for (auto& transaction : transactions) { - const auto& selectionName = std::get<0>(transaction); - const auto& newStyle = std::get<1>(transaction); - auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - - if (HighlightStage::isIndexInvalid(outlineId)) { - outlineStage->addHighlight(selectionName, newStyle); - } else { - outlineStage->editHighlight(outlineId)._style = newStyle; + if (HighlightStage::isIndexInvalid(outlineId)) { + outlineStage->addHighlight(selectionName, newStyle); + } else { + outlineStage->editHighlight(outlineId)._style = newStyle; + } } } } void Scene::removeHighlights(const Transaction::HighlightRemoves& transactions) { auto outlineStage = getStage(HighlightStage::getName()); + if (outlineStage) { + for (auto& selectionName : transactions) { + auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - for (auto& selectionName : transactions) { - auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - - if (!HighlightStage::isIndexInvalid(outlineId)) { - outlineStage->removeHighlight(outlineId); + if (!HighlightStage::isIndexInvalid(outlineId)) { + outlineStage->removeHighlight(outlineId); + } } } } void Scene::queryHighlights(const Transaction::HighlightQueries& transactions) { auto outlineStage = getStage(HighlightStage::getName()); + if (outlineStage) { + for (auto& transaction : transactions) { + const auto& selectionName = std::get<0>(transaction); + const auto& func = std::get<1>(transaction); + auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - for (auto& transaction : transactions) { - const auto& selectionName = std::get<0>(transaction); - const auto& func = std::get<1>(transaction); - auto outlineId = outlineStage->getHighlightIdBySelection(selectionName); - - if (!HighlightStage::isIndexInvalid(outlineId)) { - func(&outlineStage->editHighlight(outlineId)._style); - } else { - func(nullptr); + if (!HighlightStage::isIndexInvalid(outlineId)) { + func(&outlineStage->editHighlight(outlineId)._style); + } else { + func(nullptr); + } } } } From 4edfe6c9ab230917c7b37df088bd0023a919070f Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 20 Feb 2018 14:48:21 +0100 Subject: [PATCH 083/267] Trying to keep track of a better previous correction --- interface/src/Application.cpp | 3 ++- interface/src/Application.h | 1 + interface/src/Application_render.cpp | 4 +++- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 2 +- .../src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp | 2 +- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 10 ++++++---- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 1 + libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 7 ++++--- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 2 +- libraries/gpu/src/gpu/Context.cpp | 3 ++- libraries/gpu/src/gpu/Context.h | 2 +- libraries/gpu/src/gpu/Frame.h | 2 ++ 12 files changed, 25 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 07ca337878..a993b4c830 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5275,7 +5275,8 @@ void Application::update(float deltaTime) { editRenderArgs([this, deltaTime](AppRenderArgs& appRenderArgs) { PerformanceTimer perfTimer("editRenderArgs"); - appRenderArgs._headPose= getHMDSensorPose(); + appRenderArgs._prevHeadPose = appRenderArgs._headPose; + appRenderArgs._headPose = getHMDSensorPose(); auto myAvatar = getMyAvatar(); diff --git a/interface/src/Application.h b/interface/src/Application.h index d4041aa3be..75aed1e434 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -620,6 +620,7 @@ private: glm::mat4 _eyeOffsets[2]; glm::mat4 _eyeProjections[2]; glm::mat4 _headPose; + glm::mat4 _prevHeadPose; glm::mat4 _sensorToWorld; float _sensorToWorldScale { 1.0f }; bool _isStereo{ false }; diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index 868299537c..7532928491 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -62,6 +62,7 @@ void Application::paintGL() { RenderArgs renderArgs; glm::mat4 HMDSensorPose; + glm::mat4 HMDSensorPrevPose; glm::mat4 eyeToWorld; glm::mat4 sensorToWorld; @@ -79,6 +80,7 @@ void Application::paintGL() { } HMDSensorPose = _appRenderArgs._headPose; + HMDSensorPrevPose = _appRenderArgs._prevHeadPose; eyeToWorld = _appRenderArgs._eyeToWorld; sensorToWorld = _appRenderArgs._sensorToWorld; isStereo = _appRenderArgs._isStereo; @@ -90,7 +92,7 @@ void Application::paintGL() { { PROFILE_RANGE(render, "/gpuContextReset"); - _gpuContext->beginFrame(HMDSensorPose); + _gpuContext->beginFrame(HMDSensorPose, HMDSensorPrevPose); // Reset the gpu::Context Stages // Back to the default framebuffer; gpu::doInBatch("Application_render::gpuContextReset", _gpuContext, [&](gpu::Batch& batch) { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index fbae89fb70..31ed9572e9 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -361,7 +361,7 @@ void OpenGLDisplayPlugin::customizeContext() { auto presentThread = DependencyManager::get(); Q_ASSERT(thread() == presentThread->thread()); - getGLBackend()->setCameraCorrection(mat4(), true); + getGLBackend()->setCameraCorrection(mat4(), mat4(), true); for (auto& cursorValue : _cursorsData) { auto& cursorData = cursorValue.second; diff --git a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp index 4c89cf8821..40063652c8 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/DebugHmdDisplayPlugin.cpp @@ -85,6 +85,6 @@ void DebugHmdDisplayPlugin::updatePresentPose() { // Simulates head pose latency correction _currentPresentFrameInfo.presentPose = glm::mat4_cast(glm::angleAxis(yaw, Vectors::UP)) * - glm::mat4_cast(glm::angleAxis(pitch, Vectors::RIGHT)); + glm::mat4_cast(glm::angleAxis(pitch, Vectors::RIGHT)) ; } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 292e829771..22dd7823f6 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -330,6 +330,7 @@ void HmdDisplayPlugin::updateFrameData() { } } if (newFrameIndex != INVALID_FRAME) { + _previousPresentFrameInfo = _currentPresentFrameInfo; _currentPresentFrameInfo = _frameInfos[newFrameIndex]; } }); @@ -338,10 +339,11 @@ void HmdDisplayPlugin::updateFrameData() { updatePresentPose(); if (_currentFrame) { - auto batchPose = _currentFrame->pose; - auto currentPose = _currentPresentFrameInfo.presentPose; - auto correction = glm::inverse(batchPose) * currentPose; - getGLBackend()->setCameraCorrection(correction); + auto invBatchPose = glm::inverse(_currentFrame->pose); + auto invPrevBatchPose = glm::inverse(_currentFrame->prevPose); + auto correction = invBatchPose * _currentPresentFrameInfo.presentPose; + auto prevCorrection = invPrevBatchPose * _previousPresentFrameInfo.presentPose; + getGLBackend()->setCameraCorrection(correction, prevCorrection); } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 78d5904c7d..cbb5312871 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -78,6 +78,7 @@ protected: QMap _frameInfos; FrameInfo _currentPresentFrameInfo; + FrameInfo _previousPresentFrameInfo; FrameInfo _currentRenderFrameInfo; RateCounter<> _stutterRate; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index de1e8f9359..1d2bafc5db 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -760,10 +760,11 @@ void GLBackend::recycle() const { Texture::KtxStorage::releaseOpenKtxFiles(); } -void GLBackend::setCameraCorrection(const Mat4& correction, bool reset) { +void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevCorrection, bool reset) { auto invCorrection = glm::inverse(correction); - _transform._correction.prevCorrection = (reset ? correction : _transform._correction.correction); - _transform._correction.prevCorrectionInverse = (reset ? invCorrection : _transform._correction.correctionInverse); + auto invPrevCorrection = glm::inverse(prevCorrection); + _transform._correction.prevCorrection = (reset ? correction : prevCorrection); + _transform._correction.prevCorrectionInverse = (reset ? invCorrection : invPrevCorrection); _transform._correction.correction = correction; _transform._correction.correctionInverse = invCorrection; _pipeline._cameraCorrectionBuffer._buffer->setSubData(0, _transform._correction); diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index 505c26eb68..f8e084008b 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, bool reset = false); + void setCameraCorrection(const Mat4& correction, const Mat4& prevCorrection, bool reset = false); void render(const Batch& batch) final override; // This call synchronize the Full Backend cache with the current GLState diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index b5b067dcac..e6fa983310 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -53,11 +53,12 @@ const std::string& Context::getBackendVersion() const { return _backend->getVersion(); } -void Context::beginFrame(const glm::mat4& renderPose) { +void Context::beginFrame(const glm::mat4& renderPose, const glm::mat4& prevRenderPose) { assert(!_frameActive); _frameActive = true; _currentFrame = std::make_shared(); _currentFrame->pose = renderPose; + _currentFrame->prevPose = prevRenderPose; if (!_frameRangeTimer) { _frameRangeTimer = std::make_shared("gpu::Context::Frame"); diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 2082c175ad..2daf9da4ef 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -161,7 +161,7 @@ public: const std::string& getBackendVersion() const; - void beginFrame(const glm::mat4& renderPose = glm::mat4()); + void beginFrame(const glm::mat4& renderPose = glm::mat4(), const glm::mat4& prevRenderPose = glm::mat4()); void appendFrameBatch(Batch& batch); FramePointer endFrame(); diff --git a/libraries/gpu/src/gpu/Frame.h b/libraries/gpu/src/gpu/Frame.h index 1ed77a26b7..e5365541b4 100644 --- a/libraries/gpu/src/gpu/Frame.h +++ b/libraries/gpu/src/gpu/Frame.h @@ -30,6 +30,8 @@ namespace gpu { uint32_t frameIndex{ 0 }; /// The sensor pose used for rendering the frame, only applicable for HMDs Mat4 pose; + /// The sensor pose used for rendering the previous frame, only applicable for HMDs + Mat4 prevPose; /// The collection of batches which make up the frame Batches batches; /// The main thread updates to buffers that are applicable for this frame. From c19664e3ca8010113a28d450e0326c85775c0a70 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 20 Feb 2018 12:01:10 -0300 Subject: [PATCH 084/267] Remove the shrink cap in radar mode --- scripts/system/+android/radar.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js index 9682962eda..bd2299f27d 100644 --- a/scripts/system/+android/radar.js +++ b/scripts/system/+android/radar.js @@ -29,7 +29,7 @@ var MOVE_BY = 1; // Swipe/Drag vars var PINCH_INCREMENT_FIRST = 0.4; // 0.1 meters zoom in - out var PINCH_INCREMENT = 0.4; // 0.1 meters zoom in - out -var RADAR_HEIGHT_MAX_PLUS_AVATAR = 40; +var RADAR_HEIGHT_MAX_PLUS_AVATAR = 80; var RADAR_HEIGHT_MIN_PLUS_AVATAR = 2; var RADAR_CAMERA_DISTANCE_TO_ICONS = 1.5; // Icons are near the camera to prevent the LOD manager dismissing them var RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE = 1; // How much above the avatar base should the icon appear @@ -811,19 +811,23 @@ function avatarRemoved(QUuid) { ********************************************************************************************************/ var myAvatarIcon; var myAvatarName; - +function distanceForCameraHeight(h) { + if (h < 10) return 1; + if (h < 50) return 2; + return 5; +} function renderMyAvatarIcon() { + var commonY = Camera.position.y - distanceForCameraHeight(Camera.position.y); var iconPos = findLineToHeightIntersectionCoords( MyAvatar.position.x, MyAvatar.position.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, MyAvatar.position.z, Camera.position.x, Camera.position.y, Camera.position.z, - Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + commonY); if (!iconPos) { printd("avatarmy icon pos null"); return;} var iconDimensions = avatarIconPlaneDimensions(); var avatarPos = MyAvatar.position; var cameraPos = Camera.position; - var commonY = Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS; var borderPoints = [ computePointAtPlaneY(0, 0, commonY), computePointAtPlaneY(Window.innerWidth, Window.innerHeight, commonY) @@ -899,7 +903,7 @@ function hideAllAvatarIcons() { function renderAllOthersAvatarIcons() { var avatarPos; var iconDimensions = avatarIconPlaneDimensions(); - var commonY = Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS; + var commonY = Camera.position.y - distanceForCameraHeight(Camera.position.y); var borderPoints = [ computePointAtPlaneY(0, 0, commonY), computePointAtPlaneY(Window.innerWidth, Window.innerHeight, commonY) @@ -921,7 +925,7 @@ function renderAllOthersAvatarIcons() { if (avatarsData[QUuid].icon != undefined) { var iconPos = findLineToHeightIntersectionCoords( avatarPos.x, avatarPos.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, avatarPos.z, Camera.position.x, Camera.position.y, Camera.position.z, - Camera.position.y - RADAR_CAMERA_DISTANCE_TO_ICONS); + commonY); if (!iconPos) { print ("avatar icon pos bad for " + QUuid); continue; } if (avatarsData[QUuid].needRefresh) { var avat = AvatarList.getAvatar(QUuid); From 4839a8c72049a8968c13814ed42c8b61b9b27164 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 20 Feb 2018 12:59:06 -0300 Subject: [PATCH 085/267] Remove Forgot labels in login dialog --- .../LoginDialog/+android/LinkAccountBody.qml | 45 ++----------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml index 8f76c6ed99..7eced0c751 100644 --- a/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml @@ -117,62 +117,25 @@ Item { } spacing: hifi.dimensions.contentSpacing.y / 2 - Row { - spacing: hifi.dimensions.contentSpacing.x - TextField { id: usernameField anchors { - verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter } - width: 780 - + width: 1080 placeholderText: qsTr("Username or Email") } - ShortcutText { - anchors { - verticalCenter: parent.verticalCenter - } - - text: "Forgot Username?" - - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - linkColor: hifi.colors.blueAccent - - onLinkActivated: loginDialog.openUrl(link) - } - } - Row { - spacing: hifi.dimensions.contentSpacing.x - TextField { id: passwordField anchors { - verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter } - width: 780 + width: 1080 placeholderText: qsTr("Password") echoMode: TextInput.Password } - - ShortcutText { - anchors { - verticalCenter: parent.verticalCenter - } - - text: "Forgot Password?" - - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - linkColor: hifi.colors.blueAccent - - onLinkActivated: loginDialog.openUrl(link) - } - } - } InfoItem { From 5e3ad3fe9a3b05cb3e43a0f621c9f3d77d8510f8 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 20 Feb 2018 17:20:48 -0300 Subject: [PATCH 086/267] Disable VPAD on bottom bar tapping and modes bar tapping --- .../resources/qml/hifi/+android/bottombar.qml | 9 +++++++++ .../resources/qml/hifi/+android/button.qml | 4 ++++ .../resources/qml/hifi/+android/modesbar.qml | 6 ++++++ .../TouchscreenVirtualPadDevice.cpp | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/interface/resources/qml/hifi/+android/bottombar.qml b/interface/resources/qml/hifi/+android/bottombar.qml index 2a34b7fe19..e861d441d9 100644 --- a/interface/resources/qml/hifi/+android/bottombar.qml +++ b/interface/resources/qml/hifi/+android/bottombar.qml @@ -41,6 +41,15 @@ Item { Styles.HifiConstants { id: hifi } HifiConstants { id: android } + MouseArea { + anchors.fill: parent + onEntered: { + Controller.setVPadEnabled(false); + } + onExited: { + Controller.setVPadEnabled(true); + } + } Rectangle { id: background diff --git a/interface/resources/qml/hifi/+android/button.qml b/interface/resources/qml/hifi/+android/button.qml index ec7af2ab92..4822b6bf33 100644 --- a/interface/resources/qml/hifi/+android/button.qml +++ b/interface/resources/qml/hifi/+android/button.qml @@ -40,6 +40,8 @@ Item { property bool isActive: false signal clicked() + signal entered() + signal exited() onIsActiveChanged: { if (button.isEntered) { @@ -118,6 +120,7 @@ Item { } onEntered: { button.isEntered = true; + button.entered(); if (button.isActive) { button.state = "hover active state"; } else { @@ -126,6 +129,7 @@ Item { } onExited: { button.isEntered = false; + button.exited() if (button.isActive) { button.state = "active state"; } else { diff --git a/interface/resources/qml/hifi/+android/modesbar.qml b/interface/resources/qml/hifi/+android/modesbar.qml index fe71314ece..552ca80778 100644 --- a/interface/resources/qml/hifi/+android/modesbar.qml +++ b/interface/resources/qml/hifi/+android/modesbar.qml @@ -40,6 +40,12 @@ Item { var keys = Object.keys(properties).forEach(function (key) { button[key] = properties[key]; }); + button.entered.connect(function() { + Controller.setVPadEnabled(false); + }); + button.exited.connect(function() { + Controller.setVPadEnabled(true); + }); return button; } else if( component.status == Component.Error) { console.log("Load button errors " + component.errorString()); diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 8e1e6c2fba..53683870df 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -127,6 +127,10 @@ void TouchscreenVirtualPadDevice::debugPoints(const QTouchEvent* event, QString void TouchscreenVirtualPadDevice::touchBeginEvent(const QTouchEvent* event) { // touch begin here is a big begin -> begins both pads? maybe it does nothing debugPoints(event, " BEGIN ++++++++++++++++"); + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (!virtualPadManager.isEnabled()) { + return; + } KeyboardMouseDevice::enableTouch(false); QScreen* eventScreen = event->window()->screen(); _screenWidthCenter = eventScreen->size().width() / 2; @@ -138,6 +142,10 @@ void TouchscreenVirtualPadDevice::touchBeginEvent(const QTouchEvent* event) { } void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (!virtualPadManager.isEnabled()) { + return; + } // touch end here is a big reset -> resets both pads _touchPointCount = 0; KeyboardMouseDevice::enableTouch(true); @@ -148,6 +156,12 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { } void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (!virtualPadManager.isEnabled()) { + touchLeftEnd(); + touchRightEnd(); + return; + } _touchPointCount = event->touchPoints().count(); const QList& tPoints = event->touchPoints(); @@ -224,6 +238,10 @@ void TouchscreenVirtualPadDevice::touchRightEnd() { } void TouchscreenVirtualPadDevice::touchGestureEvent(const QGestureEvent* event) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (!virtualPadManager.isEnabled()) { + return; + } if (QGesture* gesture = event->gesture(Qt::PinchGesture)) { QPinchGesture* pinch = static_cast(gesture); _pinchScale = pinch->totalScaleFactor(); From bd9d8ac4f99b4ad8f8a8656d98745fec43958fbb Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 20 Feb 2018 19:07:41 -0300 Subject: [PATCH 087/267] Tune radar styles --- libraries/networking/src/AddressManager.cpp | 2 +- scripts/system/+android/radar.js | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 65a5e0c837..30ed20de68 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -107,7 +107,7 @@ void AddressManager::loadSettings(const QString& lookupString) { #if defined(USE_GLES) && defined(Q_OS_WIN) handleUrl(QUrl("hifi://127.0.0.0"), LookupTrigger::StartupFromSettings); #elif defined(Q_OS_ANDROID) - handleUrl(QUrl("hifi://dev-android"), LookupTrigger::StartupFromSettings); + handleUrl(QUrl(DEFAULT_HIFI_ADDRESS), LookupTrigger::StartupFromSettings); #else if (lookupString.isEmpty()) { handleUrl(currentAddressHandle.get(), LookupTrigger::StartupFromSettings); diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js index bd2299f27d..54e1e51945 100644 --- a/scripts/system/+android/radar.js +++ b/scripts/system/+android/radar.js @@ -33,9 +33,9 @@ var RADAR_HEIGHT_MAX_PLUS_AVATAR = 80; var RADAR_HEIGHT_MIN_PLUS_AVATAR = 2; var RADAR_CAMERA_DISTANCE_TO_ICONS = 1.5; // Icons are near the camera to prevent the LOD manager dismissing them var RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE = 1; // How much above the avatar base should the icon appear -var AVATAR_DISPLAY_NAME_HEIGHT = 38; -var AVATAR_DISPLAY_NAME_CHAR_WIDTH = 18; -var AVATAR_DISPLAY_NAME_FONT_SIZE = 350; +var AVATAR_DISPLAY_NAME_HEIGHT = 106; +var AVATAR_DISPLAY_NAME_CHAR_WIDTH = 48; +var AVATAR_DISPLAY_NAME_FONT_SIZE = 50; var lastDragAt; var lastDeltaDrag; @@ -739,7 +739,7 @@ function saveAvatarData(QUuid) { color: uniqueColor.convertHexToRGB(uniqueColor.getColor(QUuid)), dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), - innerRadius: 1.6, + innerRadius: 1.8, outerRadius: 2, isSolid: true, visible: false @@ -812,8 +812,9 @@ function avatarRemoved(QUuid) { var myAvatarIcon; var myAvatarName; function distanceForCameraHeight(h) { - if (h < 10) return 1; - if (h < 50) return 2; + if (h < 30) return 1; + if (h < 40) return 2; + if (h < 50) return 2.5; return 5; } function renderMyAvatarIcon() { @@ -844,7 +845,7 @@ function renderMyAvatarIcon() { color: uniqueColor.convertHexToRGB(uniqueColor.getColor(MyAvatar.SELF_ID)), dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), - innerRadius: 1.6, + innerRadius: 1.8, outerRadius: 2, isSolid: true, visible: false @@ -853,7 +854,7 @@ function renderMyAvatarIcon() { if (!myAvatarName) { myAvatarName = Overlays.addOverlay("text", { - width: 40, + width: 100, height: AVATAR_DISPLAY_NAME_HEIGHT, textAlignCenter: true, color: { red: 255, green: 255, blue: 255}, From 00958965bc2da6e56a86cc8608daf8140d41af2e Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 20 Feb 2018 19:25:41 -0300 Subject: [PATCH 088/267] Android- Center login dialog in both big (Pixel XL, Huawei Mate 9 Pro) and smaller screens (Pixel) --- interface/resources/qml/+android/LoginDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/+android/LoginDialog.qml b/interface/resources/qml/+android/LoginDialog.qml index c60864cd1d..9eb2c74147 100644 --- a/interface/resources/qml/+android/LoginDialog.qml +++ b/interface/resources/qml/+android/LoginDialog.qml @@ -53,7 +53,7 @@ ModalWindow { Component.onCompleted: { this.anchors.centerIn = undefined; this.y=150; - this.x=450; + this.x=(parent.width - this.width)/2; } Keys.onPressed: { From 093a1491cd6de20b344480cc7c337e33fee88537 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Wed, 21 Feb 2018 15:43:19 +0100 Subject: [PATCH 089/267] Renamed resourcering to resourceswapchain --- libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 4 ++-- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 4 ++-- .../gpu-gl/src/gpu/gl/GLBackendOutput.cpp | 10 ++++---- .../gpu-gl/src/gpu/gl/GLBackendPipeline.cpp | 10 ++++---- libraries/gpu/src/gpu/Batch.cpp | 24 +++++++++---------- libraries/gpu/src/gpu/Batch.h | 14 +++++------ libraries/gpu/src/gpu/Framebuffer.h | 6 ++--- .../{ResourceRing.h => ResourceSwapChain.h} | 16 ++++++------- .../render-utils/src/AntialiasingEffect.cpp | 8 +++---- .../render-utils/src/AntialiasingEffect.h | 2 +- 10 files changed, 49 insertions(+), 49 deletions(-) rename libraries/gpu/src/gpu/{ResourceRing.h => ResourceSwapChain.h} (75%) diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index 1d2bafc5db..103a104aa8 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -99,10 +99,10 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::gl::GLBackend::do_setUniformBuffer), (&::gpu::gl::GLBackend::do_setResourceBuffer), (&::gpu::gl::GLBackend::do_setResourceTexture), - (&::gpu::gl::GLBackend::do_setResourceFramebufferRingTexture), + (&::gpu::gl::GLBackend::do_setResourceFramebufferSwapChainTexture), (&::gpu::gl::GLBackend::do_setFramebuffer), - (&::gpu::gl::GLBackend::do_setFramebufferRing), + (&::gpu::gl::GLBackend::do_setFramebufferSwapChain), (&::gpu::gl::GLBackend::do_clearFramebuffer), (&::gpu::gl::GLBackend::do_blit), (&::gpu::gl::GLBackend::do_generateTextureMips), diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index f8e084008b..20259e7d4d 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -126,14 +126,14 @@ public: // Resource Stage virtual void do_setResourceBuffer(const Batch& batch, size_t paramOffset) final; virtual void do_setResourceTexture(const Batch& batch, size_t paramOffset) final; - virtual void do_setResourceFramebufferRingTexture(const Batch& batch, size_t paramOffset) final; + virtual void do_setResourceFramebufferSwapChainTexture(const Batch& batch, size_t paramOffset) final; // Pipeline Stage virtual void do_setPipeline(const Batch& batch, size_t paramOffset) final; // Output stage virtual void do_setFramebuffer(const Batch& batch, size_t paramOffset) final; - virtual void do_setFramebufferRing(const Batch& batch, size_t paramOffset) final; + virtual void do_setFramebufferSwapChain(const Batch& batch, size_t paramOffset) final; virtual void do_clearFramebuffer(const Batch& batch, size_t paramOffset) final; virtual void do_blit(const Batch& batch, size_t paramOffset) = 0; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp index e34330f9a1..59e77ebe90 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendOutput.cpp @@ -40,11 +40,11 @@ void GLBackend::do_setFramebuffer(const Batch& batch, size_t paramOffset) { setFramebuffer(framebuffer); } -void GLBackend::do_setFramebufferRing(const Batch& batch, size_t paramOffset) { - auto ringbuffer = batch._ringbuffers.get(batch._params[paramOffset]._uint); - if (ringbuffer) { +void GLBackend::do_setFramebufferSwapChain(const Batch& batch, size_t paramOffset) { + auto swapChain = batch._swapChains.get(batch._params[paramOffset]._uint); + if (swapChain) { auto index = batch._params[paramOffset + 1]._uint; - FramebufferPointer framebuffer = static_cast(ringbuffer.get())->get(index); + FramebufferPointer framebuffer = static_cast(swapChain.get())->get(index); setFramebuffer(framebuffer); } } @@ -61,7 +61,7 @@ void GLBackend::setFramebuffer(const FramebufferPointer& framebuffer) { } void GLBackend::do_advance(const Batch& batch, size_t paramOffset) { - auto ringbuffer = batch._ringbuffers.get(batch._params[paramOffset]._uint); + auto ringbuffer = batch._swapChains.get(batch._params[paramOffset]._uint); if (ringbuffer) { ringbuffer->advance(); } diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp index 3ca3e0f306..237b8bc1e9 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendPipeline.cpp @@ -256,22 +256,22 @@ void GLBackend::do_setResourceTexture(const Batch& batch, size_t paramOffset) { setResourceTexture(slot, resourceTexture); } -void GLBackend::do_setResourceFramebufferRingTexture(const Batch& batch, size_t paramOffset) { +void GLBackend::do_setResourceFramebufferSwapChainTexture(const Batch& batch, size_t paramOffset) { GLuint slot = batch._params[paramOffset + 1]._uint; if (slot >= (GLuint)MAX_NUM_RESOURCE_TEXTURES) { - qCDebug(gpugllogging) << "GLBackend::do_setResourceFramebufferRingTexture: Trying to set a resource Texture at slot #" << slot << " which doesn't exist. MaxNumResourceTextures = " << getMaxNumResourceTextures(); + qCDebug(gpugllogging) << "GLBackend::do_setResourceFramebufferSwapChainTexture: Trying to set a resource Texture at slot #" << slot << " which doesn't exist. MaxNumResourceTextures = " << getMaxNumResourceTextures(); return; } - RingBufferPointer ringBuffer = batch._ringbuffers.get(batch._params[paramOffset + 0]._uint); + SwapChainPointer swapChain = batch._swapChains.get(batch._params[paramOffset + 0]._uint); - if (!ringBuffer) { + if (!swapChain) { releaseResourceTexture(slot); return; } auto index = batch._params[paramOffset + 2]._uint; auto renderBufferSlot = batch._params[paramOffset + 3]._uint; - FramebufferPointer resourceFramebuffer = static_cast(ringBuffer.get())->get(index); + FramebufferPointer resourceFramebuffer = static_cast(swapChain.get())->get(index); TexturePointer resourceTexture = resourceFramebuffer->getRenderBuffer(renderBufferSlot); setResourceTexture(slot, resourceTexture); diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index ca16284663..3446bc7db7 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -73,7 +73,7 @@ Batch::Batch(const Batch& batch_) { _transforms._items.swap(batch._transforms._items); _pipelines._items.swap(batch._pipelines._items); _framebuffers._items.swap(batch._framebuffers._items); - _ringbuffers._items.swap(batch._ringbuffers._items); + _swapChains._items.swap(batch._swapChains._items); _drawCallInfos.swap(batch._drawCallInfos); _queries._items.swap(batch._queries._items); _lambdas._items.swap(batch._lambdas._items); @@ -111,7 +111,7 @@ void Batch::clear() { _transforms.clear(); _pipelines.clear(); _framebuffers.clear(); - _ringbuffers.clear(); + _swapChains.clear(); _objects.clear(); _drawCallInfos.clear(); } @@ -322,12 +322,12 @@ void Batch::setResourceTexture(uint32 slot, const TextureView& view) { setResourceTexture(slot, view._texture); } -void Batch::setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex, unsigned int renderBufferSlot) { - ADD_COMMAND(setResourceFramebufferRingTexture); +void Batch::setResourceFramebufferSwapChainTexture(uint32 slot, const FramebufferSwapChainPointer& framebuffer, unsigned int swapChainIndex, unsigned int renderBufferSlot) { + ADD_COMMAND(setResourceFramebufferSwapChainTexture); - _params.emplace_back(_ringbuffers.cache(framebuffer)); + _params.emplace_back(_swapChains.cache(framebuffer)); _params.emplace_back(slot); - _params.emplace_back(ringIndex); + _params.emplace_back(swapChainIndex); _params.emplace_back(renderBufferSlot); } @@ -338,17 +338,17 @@ void Batch::setFramebuffer(const FramebufferPointer& framebuffer) { } -void Batch::setFramebufferRing(const FramebufferRingPointer& framebuffer, unsigned int ringIndex) { - ADD_COMMAND(setFramebufferRing); +void Batch::setFramebufferSwapChain(const FramebufferSwapChainPointer& framebuffer, unsigned int swapChainIndex) { + ADD_COMMAND(setFramebufferSwapChain); - _params.emplace_back(_ringbuffers.cache(framebuffer)); - _params.emplace_back(ringIndex); + _params.emplace_back(_swapChains.cache(framebuffer)); + _params.emplace_back(swapChainIndex); } -void Batch::advance(const RingBufferPointer& ringbuffer) { +void Batch::advance(const SwapChainPointer& swapChain) { ADD_COMMAND(advance); - _params.emplace_back(_ringbuffers.cache(ringbuffer)); + _params.emplace_back(_swapChains.cache(swapChain)); } void Batch::clearFramebuffer(Framebuffer::Masks targets, const Vec4& color, float depth, int stencil, bool enableScissor) { diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index e61946d575..43fdb623e3 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -187,13 +187,13 @@ public: void setResourceTexture(uint32 slot, const TexturePointer& texture); void setResourceTexture(uint32 slot, const TextureView& view); // not a command, just a shortcut from a TextureView - void setResourceFramebufferRingTexture(uint32 slot, const FramebufferRingPointer& framebuffer, unsigned int ringIndex, unsigned int renderBufferSlot = 0U); // not a command, just a shortcut from a TextureView + void setResourceFramebufferSwapChainTexture(uint32 slot, const FramebufferSwapChainPointer& framebuffer, unsigned int swpaChainIndex, unsigned int renderBufferSlot = 0U); // not a command, just a shortcut from a TextureView // Ouput Stage void setFramebuffer(const FramebufferPointer& framebuffer); - void setFramebufferRing(const FramebufferRingPointer& framebuffer, unsigned int ringIndex); + void setFramebufferSwapChain(const FramebufferSwapChainPointer& framebuffer, unsigned int swapChainIndex); - void advance(const RingBufferPointer& ringbuffer); + void advance(const SwapChainPointer& swapChain); // Clear framebuffer layers // Targets can be any of the render buffers contained in the currnetly bound Framebuffer @@ -302,10 +302,10 @@ public: COMMAND_setUniformBuffer, COMMAND_setResourceBuffer, COMMAND_setResourceTexture, - COMMAND_setResourceFramebufferRingTexture, + COMMAND_setResourceFramebufferSwapChainTexture, COMMAND_setFramebuffer, - COMMAND_setFramebufferRing, + COMMAND_setFramebufferSwapChain, COMMAND_clearFramebuffer, COMMAND_blit, COMMAND_generateTextureMips, @@ -428,7 +428,7 @@ public: typedef Cache::Vector TransformCaches; typedef Cache::Vector PipelineCaches; typedef Cache::Vector FramebufferCaches; - typedef Cache::Vector RingBufferCaches; + typedef Cache::Vector SwapChainCaches; typedef Cache::Vector QueryCaches; typedef Cache::Vector StringCaches; typedef Cache>::Vector LambdaCache; @@ -483,7 +483,7 @@ public: TransformCaches _transforms; PipelineCaches _pipelines; FramebufferCaches _framebuffers; - RingBufferCaches _ringbuffers; + SwapChainCaches _swapChains; QueryCaches _queries; LambdaCache _lambdas; StringCaches _profileRanges; diff --git a/libraries/gpu/src/gpu/Framebuffer.h b/libraries/gpu/src/gpu/Framebuffer.h index b0cd898eea..fbbec50a28 100755 --- a/libraries/gpu/src/gpu/Framebuffer.h +++ b/libraries/gpu/src/gpu/Framebuffer.h @@ -12,7 +12,7 @@ #define hifi_gpu_Framebuffer_h #include "Texture.h" -#include "ResourceRing.h" +#include "ResourceSwapChain.h" #include class Transform; // Texcood transform util @@ -178,8 +178,8 @@ protected: Framebuffer() {} }; typedef std::shared_ptr FramebufferPointer; -typedef ResourceRing FramebufferRing; -typedef std::shared_ptr FramebufferRingPointer; +typedef ResourceSwapChain FramebufferSwapChain; +typedef std::shared_ptr FramebufferSwapChainPointer; } diff --git a/libraries/gpu/src/gpu/ResourceRing.h b/libraries/gpu/src/gpu/ResourceSwapChain.h similarity index 75% rename from libraries/gpu/src/gpu/ResourceRing.h rename to libraries/gpu/src/gpu/ResourceSwapChain.h index c61f7a02f7..7b46b35521 100644 --- a/libraries/gpu/src/gpu/ResourceRing.h +++ b/libraries/gpu/src/gpu/ResourceSwapChain.h @@ -5,18 +5,18 @@ // 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_gpu_ResourceRing_h -#define hifi_gpu_ResourceRing_h +#ifndef hifi_gpu_ResourceSwapChain_h +#define hifi_gpu_ResourceSwapChain_h #include #include namespace gpu { - class RingBuffer { + class SwapChain { public: - RingBuffer(unsigned int size = 2U) : _size{ size } {} - virtual ~RingBuffer() {} + SwapChain(unsigned int size = 2U) : _size{ size } {} + virtual ~SwapChain() {} void advance() { _frontIndex = (_frontIndex + 1) % _size; @@ -29,10 +29,10 @@ namespace gpu { unsigned int _frontIndex{ 0U }; }; - typedef std::shared_ptr RingBufferPointer; + typedef std::shared_ptr SwapChainPointer; template - class ResourceRing : public RingBuffer { + class ResourceSwapChain : public SwapChain { public: enum { @@ -42,7 +42,7 @@ namespace gpu { using Type = R; using TypePointer = std::shared_ptr; - ResourceRing(unsigned int size = 2U) : RingBuffer{ size } {} + ResourceSwapChain(unsigned int size = 2U) : SwapChain{ size } {} void reset() { for (auto& ptr : _resources) { diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 9f2678770f..06cf4f6675 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -188,7 +188,7 @@ const int AntialiasingPass_NextMapSlot = 4; Antialiasing::Antialiasing() { - _antialiasingBuffers = std::make_shared(2U); + _antialiasingBuffers = std::make_shared(2U); } Antialiasing::~Antialiasing() { @@ -343,7 +343,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const // TAA step getAntialiasingPipeline(); - batch.setResourceFramebufferRingTexture(AntialiasingPass_HistoryMapSlot, _antialiasingBuffers, 0); + batch.setResourceFramebufferSwapChainTexture(AntialiasingPass_HistoryMapSlot, _antialiasingBuffers, 0); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); batch.setResourceTexture(AntialiasingPass_DepthMapSlot, linearDepthBuffer->getLinearDepthTexture()); @@ -351,7 +351,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params); batch.setUniformBuffer(AntialiasingPass_FrameTransformSlot, deferredFrameTransform->getFrameTransformBuffer()); - batch.setFramebufferRing(_antialiasingBuffers, 1); + batch.setFramebufferSwapChain(_antialiasingBuffers, 1); batch.setPipeline(getAntialiasingPipeline()); batch.draw(gpu::TRIANGLE_STRIP, 4); @@ -364,7 +364,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const } else { batch.setPipeline(getBlendPipeline()); } - batch.setResourceFramebufferRingTexture(AntialiasingPass_NextMapSlot, _antialiasingBuffers, 1); + batch.setResourceFramebufferSwapChainTexture(AntialiasingPass_NextMapSlot, _antialiasingBuffers, 1); batch.draw(gpu::TRIANGLE_STRIP, 4); batch.advance(_antialiasingBuffers); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index f47a64c589..0dc57f97cd 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -191,7 +191,7 @@ private: // Uniforms for AA gpu::int32 _texcoordOffsetLoc; - gpu::FramebufferRingPointer _antialiasingBuffers; + gpu::FramebufferSwapChainPointer _antialiasingBuffers; gpu::TexturePointer _antialiasingTextures[2]; gpu::PipelinePointer _antialiasingPipeline; From dca7b7aabaf683120d85395bb53536f3a70d3291 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Wed, 21 Feb 2018 17:34:51 +0100 Subject: [PATCH 090/267] TAA is working on HMD! Still some issues when game rate is low --- .../display-plugins/hmd/HmdDisplayPlugin.cpp | 3 +- .../render-utils/src/DeferredTransform.slh | 6 +++- libraries/render-utils/src/taa.slf | 5 +--- libraries/render-utils/src/taa.slh | 29 +++++++++++++++++-- libraries/render-utils/src/taa_blend.slf | 10 +++---- .../src/velocityBuffer_cameraMotion.slf | 9 ++---- 6 files changed, 42 insertions(+), 20 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 22dd7823f6..405ee33a86 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -330,7 +330,6 @@ void HmdDisplayPlugin::updateFrameData() { } } if (newFrameIndex != INVALID_FRAME) { - _previousPresentFrameInfo = _currentPresentFrameInfo; _currentPresentFrameInfo = _frameInfos[newFrameIndex]; } }); @@ -344,6 +343,8 @@ void HmdDisplayPlugin::updateFrameData() { auto correction = invBatchPose * _currentPresentFrameInfo.presentPose; auto prevCorrection = invPrevBatchPose * _previousPresentFrameInfo.presentPose; getGLBackend()->setCameraCorrection(correction, prevCorrection); + + _previousPresentFrameInfo = _currentPresentFrameInfo; } } diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index f1765978eb..57e67c086b 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -89,7 +89,11 @@ mat4 getViewInverse() { } mat4 getView() { - return frameTransform._view * cameraCorrection._correctionInverse; + return cameraCorrection._correctionInverse * frameTransform._view; +} + +mat4 getPreviousView() { + return cameraCorrection._prevCorrectionInverse * frameTransform._prevView; } bool isStereo() { diff --git a/libraries/render-utils/src/taa.slf b/libraries/render-utils/src/taa.slf index 57334e8ab5..a5dce214c6 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -28,9 +28,6 @@ void main() { return; } - // vec3 nearFragUV = taa_findClosestFragment3x3(fragUV); - // vec2 fragVel = taa_fetchVelocityMap(nearFragUV.xy); - vec3 fragVelAndZ = taa_fetchVelocityMapBest(fragUV); vec2 fragVel = fragVelAndZ.xy; float fragDepth = fragVelAndZ.z; @@ -41,7 +38,7 @@ void main() { vec3 nextColor = sourceColor; - if (taa_constrainColor()) { + if (taa_constrainColor()) { // clamp history to neighbourhood of current sample historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, fragDepth, historyColor); } diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 232d1e9f70..3b3e275da1 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -225,12 +225,37 @@ vec3 taa_fetchVelocityMapBest(vec2 uv) { return vec3(best.xy, taa_fetchDepth(uv)); } +vec2 taa_fromFragUVToEyeUVAndSide(vec2 fragUV, out int stereoSide) { + vec2 eyeUV = fragUV; + stereoSide = 0; + if (isStereo()) { + if (eyeUV.x > 0.5) { + eyeUV.x -= 0.5; + stereoSide = 1; + } + eyeUV.x *= 2.0; + } + return eyeUV; +} + +vec2 taa_fromEyeUVToFragUV(vec2 eyeUV, int stereoSide) { + vec2 fragUV = eyeUV; + if (isStereo()) { + fragUV.x *= 0.5; + fragUV.x += stereoSide*0.5; + } + return fragUV; +} + vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { sourceColor = taa_fetchSourceMap(fragUV).xyz; + int stereoSide = 0; + vec2 eyeUV = taa_fromFragUVToEyeUVAndSide(fragUV, stereoSide); + vec2 prevEyeUV = eyeUV - fragVelocity; - vec2 prevFragUV = fragUV - fragVelocity; historyColor = sourceColor; - if (!(any(lessThan(prevFragUV, vec2(0.0))) || any(greaterThan(prevFragUV, vec2(1.0))))) { + vec2 prevFragUV = taa_fromEyeUVToFragUV(prevEyeUV, stereoSide); + if (!(any(lessThan(prevEyeUV, vec2(0.0))) || any(greaterThan(prevEyeUV, vec2(1.0))))) { historyColor = taa_fetchHistoryMap(prevFragUV).xyz; } return prevFragUV; diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index 8b32ee2fb0..bb81f4989f 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -32,7 +32,9 @@ void main(void) { vec2 pixVelocity = imageSize * texture(velocityMap, varTexCoord0).xy; float pixVelocityLength = length(pixVelocity); vec2 velocity = pixVelocity * texelSize; - vec2 prevTexCoord = varTexCoord0 - velocity; + int stereoSide = 0; + vec2 prevTexCoord = taa_fromFragUVToEyeUVAndSide(varTexCoord0, stereoSide) - velocity; + prevTexCoord = taa_fromEyeUVToFragUV(prevTexCoord, stereoSide); vec2 prevPix = prevTexCoord * imageSize; // Pixel Debugged @@ -43,7 +45,7 @@ void main(void) { vec2 cursorUV = cursorUVRaw; vec2 cursorPos = cursorUV * imageSize; vec2 cursorVelocity = texture(velocityMap, cursorUV).xy; - vec2 cursorPrevUV = cursorUV - cursorVelocity; + vec2 cursorPrevUV = taa_fromFragUVToEyeUVAndSide(cursorUV, stereoSide) - cursorVelocity; cursorVelocity *= imageSize; float cursorVelocityLength = length(cursorVelocity); vec2 cursorVelocityDir = cursorVelocity / cursorVelocityLength; @@ -143,13 +145,11 @@ void main(void) { if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { prevColor = texture(historyMap, prevTexCoord).xyz; } - outFragColor.xyz = prevColor; + outFragColor.xyz = mix(prevColor, vec3(1,0,1), clamp(distance(prevColor, nextColor) - 0.01, 0, 1)); if (pixVelocityLength > params.debugShowVelocityThreshold) { 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 d908ea24da..22a95b55d1 100644 --- a/libraries/render-utils/src/velocityBuffer_cameraMotion.slf +++ b/libraries/render-utils/src/velocityBuffer_cameraMotion.slf @@ -26,17 +26,12 @@ 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); - 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 = evalEyePositionFromZdb(stereoSide.x, Zdb, texcoordPos); - vec3 worldPos = (frameTransform._viewInverse * cameraCorrection._correction * vec4(eyePos, 1.0)).xyz; + vec3 worldPos = (getViewInverse() * vec4(eyePos, 1.0)).xyz; - vec3 prevEyePos = (cameraCorrection._prevCorrectionInverse * frameTransform._prevView * vec4(worldPos, 1.0)).xyz; + vec3 prevEyePos = (getPreviousView() * 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); From 6411d1b35b009ac97385fe78f5229259d5910d35 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 21 Feb 2018 16:52:57 -0300 Subject: [PATCH 091/267] Android - Avoid overlapping between hint and input in Go To by clearing text when closing the window --- interface/resources/qml/+android/AddressBarDialog.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/+android/AddressBarDialog.qml b/interface/resources/qml/+android/AddressBarDialog.qml index 8033840f6c..50552f0d3b 100644 --- a/interface/resources/qml/+android/AddressBarDialog.qml +++ b/interface/resources/qml/+android/AddressBarDialog.qml @@ -33,7 +33,8 @@ Item { bar.visible = shown; sendToScript({method: 'shownChanged', params: { shown: shown }}); if (shown) { - updateLocationText(false); + addressLine.text=""; + updateLocationText(addressLine.text.length > 0); } } @@ -43,7 +44,7 @@ Item { } Component.onCompleted: { - updateLocationText(false); + updateLocationText(addressLine.text.length > 0); } HifiConstants { id: hifi } @@ -130,7 +131,7 @@ Item { HifiStyles.FiraSansRegular { id: location; font.pixelSize: addressLine.font.pixelSize; - color: "gray"; + color: "lightgray"; clip: true; anchors.fill: addressLine; visible: addressLine.text.length === 0 From 2a597eb7154d99679da744c7282e2326371d1afc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Feb 2018 17:00:28 -0800 Subject: [PATCH 092/267] use QCoreApplication for oven when headless version is used --- tools/oven/src/BakerCLI.cpp | 19 +++++--- tools/oven/src/BakerCLI.h | 6 +-- tools/oven/src/DomainBaker.cpp | 6 +-- tools/oven/src/Oven.cpp | 62 +++++++------------------- tools/oven/src/Oven.h | 23 +++------- tools/oven/src/OvenCLIApplication.cpp | 49 ++++++++++++++++++++ tools/oven/src/OvenCLIApplication.h | 27 +++++++++++ tools/oven/src/OvenGUIApplication.cpp | 19 ++++++++ tools/oven/src/OvenGUIApplication.h | 33 ++++++++++++++ tools/oven/src/main.cpp | 13 ++++-- tools/oven/src/ui/BakeWidget.cpp | 5 +-- tools/oven/src/ui/DomainBakeWidget.cpp | 11 +++-- tools/oven/src/ui/ModelBakeWidget.cpp | 11 +++-- tools/oven/src/ui/SkyboxBakeWidget.cpp | 9 ++-- 14 files changed, 193 insertions(+), 100 deletions(-) create mode 100644 tools/oven/src/OvenCLIApplication.cpp create mode 100644 tools/oven/src/OvenCLIApplication.h create mode 100644 tools/oven/src/OvenGUIApplication.cpp create mode 100644 tools/oven/src/OvenGUIApplication.h diff --git a/tools/oven/src/BakerCLI.cpp b/tools/oven/src/BakerCLI.cpp index 5af65c4dc0..f5af5455fb 100644 --- a/tools/oven/src/BakerCLI.cpp +++ b/tools/oven/src/BakerCLI.cpp @@ -14,13 +14,14 @@ #include #include +#include "OvenCLIApplication.h" #include "ModelBakingLoggingCategory.h" -#include "Oven.h" #include "BakerCLI.h" #include "FBXBaker.h" #include "TextureBaker.h" -BakerCLI::BakerCLI(Oven* parent) : QObject(parent) { +BakerCLI::BakerCLI(OvenCLIApplication* parent) : QObject(parent) { + } void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& type) { @@ -50,14 +51,18 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& // create our appropiate baker if (isFBX) { - _baker = std::unique_ptr { new FBXBaker(inputUrl, []() -> QThread* { return qApp->getNextWorkerThread(); }, outputPath) }; - _baker->moveToThread(qApp->getNextWorkerThread()); + _baker = std::unique_ptr { + new FBXBaker(inputUrl, + []() -> QThread* { return Oven::instance().getNextWorkerThread(); }, + outputPath) + }; + _baker->moveToThread(Oven::instance().getNextWorkerThread()); } else if (isSupportedImage) { _baker = std::unique_ptr { new TextureBaker(inputUrl, image::TextureUsage::CUBE_TEXTURE, outputPath) }; - _baker->moveToThread(qApp->getNextWorkerThread()); + _baker->moveToThread(Oven::instance().getNextWorkerThread()); } else { qCDebug(model_baking) << "Failed to determine baker type for file" << inputUrl; - QApplication::exit(OVEN_STATUS_CODE_FAIL); + QCoreApplication::exit(OVEN_STATUS_CODE_FAIL); } // invoke the bake method on the baker thread @@ -81,5 +86,5 @@ void BakerCLI::handleFinishedBaker() { errorFile.close(); } } - QApplication::exit(exitCode); + QCoreApplication::exit(exitCode); } diff --git a/tools/oven/src/BakerCLI.h b/tools/oven/src/BakerCLI.h index 7d362eb898..4f5b6607b0 100644 --- a/tools/oven/src/BakerCLI.h +++ b/tools/oven/src/BakerCLI.h @@ -18,7 +18,7 @@ #include #include "Baker.h" -#include "Oven.h" +#include "OvenCLIApplication.h" static const int OVEN_STATUS_CODE_SUCCESS { 0 }; static const int OVEN_STATUS_CODE_FAIL { 1 }; @@ -27,10 +27,10 @@ static const int OVEN_STATUS_CODE_ABORT { 2 }; static const QString OVEN_ERROR_FILENAME = "errors.txt"; class BakerCLI : public QObject { - Q_OBJECT + Q_OBJECT public: - BakerCLI(Oven* parent); + BakerCLI(OvenCLIApplication* parent); void bakeFile(QUrl inputUrl, const QString& outputPath, const QString& type = QString::null); private slots: diff --git a/tools/oven/src/DomainBaker.cpp b/tools/oven/src/DomainBaker.cpp index edc2492e82..28ede982a0 100644 --- a/tools/oven/src/DomainBaker.cpp +++ b/tools/oven/src/DomainBaker.cpp @@ -201,7 +201,7 @@ void DomainBaker::enumerateEntities() { } QSharedPointer baker { new FBXBaker(modelURL, []() -> QThread* { - return qApp->getNextWorkerThread(); + return Oven::instance().getNextWorkerThread(); }, _contentOutputPath + subDirName + "/baked", _contentOutputPath + subDirName + "/original"), &FBXBaker::deleteLater }; @@ -214,7 +214,7 @@ void DomainBaker::enumerateEntities() { // move the baker to the baker thread // and kickoff the bake - baker->moveToThread(qApp->getNextWorkerThread()); + baker->moveToThread(Oven::instance().getNextWorkerThread()); QMetaObject::invokeMethod(baker.data(), "bake"); // keep track of the total number of baking entities @@ -285,7 +285,7 @@ void DomainBaker::bakeSkybox(QUrl skyboxURL, QJsonValueRef entity) { _skyboxBakers.insert(skyboxURL, skyboxBaker); // move the baker to a worker thread and kickoff the bake - skyboxBaker->moveToThread(qApp->getNextWorkerThread()); + skyboxBaker->moveToThread(Oven::instance().getNextWorkerThread()); QMetaObject::invokeMethod(skyboxBaker.data(), "bake"); // keep track of the total number of baking entities diff --git a/tools/oven/src/Oven.cpp b/tools/oven/src/Oven.cpp index 69d2ef84ce..e8d4c01f63 100644 --- a/tools/oven/src/Oven.cpp +++ b/tools/oven/src/Oven.cpp @@ -11,33 +11,15 @@ #include #include -#include #include -#include "ui/OvenMainWindow.h" #include "Oven.h" -#include "BakerCLI.h" -static const QString OUTPUT_FOLDER = "/Users/birarda/code/hifi/lod/test-oven/export"; +Oven* Oven::_staticInstance { nullptr }; -static const QString CLI_INPUT_PARAMETER = "i"; -static const QString CLI_OUTPUT_PARAMETER = "o"; -static const QString CLI_TYPE_PARAMETER = "t"; - -Oven::Oven(int argc, char* argv[]) : - QApplication(argc, argv) -{ - // parse the command line parameters - QCommandLineParser parser; - - parser.addOptions({ - { CLI_INPUT_PARAMETER, "Path to file that you would like to bake.", "input" }, - { CLI_OUTPUT_PARAMETER, "Path to folder that will be used as output.", "output" }, - { CLI_TYPE_PARAMETER, "Type of asset.", "type" } - }); - parser.addHelpOption(); - parser.process(*this); +Oven::Oven() { + _staticInstance = this; // enable compression in image library image::setColorTexturesCompressionEnabled(true); @@ -47,41 +29,27 @@ Oven::Oven(int argc, char* argv[]) : // setup our worker threads setupWorkerThreads(QThread::idealThreadCount()); - - // check if we were passed any command line arguments that would tell us just to run without the GUI - if (parser.isSet(CLI_INPUT_PARAMETER) || parser.isSet(CLI_OUTPUT_PARAMETER)) { - if (parser.isSet(CLI_INPUT_PARAMETER) && parser.isSet(CLI_OUTPUT_PARAMETER)) { - BakerCLI* cli = new BakerCLI(this); - QUrl inputUrl(QDir::fromNativeSeparators(parser.value(CLI_INPUT_PARAMETER))); - QUrl outputUrl(QDir::fromNativeSeparators(parser.value(CLI_OUTPUT_PARAMETER))); - QString type = parser.isSet(CLI_TYPE_PARAMETER) ? parser.value(CLI_TYPE_PARAMETER) : QString::null; - cli->bakeFile(inputUrl, outputUrl.toString(), type); - } else { - parser.showHelp(); - QApplication::quit(); - } - } else { - // setup the GUI - _mainWindow = new OvenMainWindow; - _mainWindow->show(); - } } Oven::~Oven() { - // cleanup the worker threads - for (auto i = 0; i < _workerThreads.size(); ++i) { - _workerThreads[i]->quit(); - _workerThreads[i]->wait(); + // quit and wait on the worker threads + for (auto& thread : _workerThreads) { + thread->quit(); + thread->wait(); } + + _staticInstance = nullptr; } void Oven::setupWorkerThreads(int numWorkerThreads) { + _workerThreads.reserve(numWorkerThreads); + for (auto i = 0; i < numWorkerThreads; ++i) { // setup a worker thread yet and add it to our concurrent vector - auto newThread = new QThread(this); + auto newThread = std::unique_ptr { new QThread }; newThread->setObjectName("Oven Worker Thread " + QString::number(i + 1)); - _workerThreads.push_back(newThread); + _workerThreads.push_back(std::move(newThread)); } } @@ -92,13 +60,13 @@ QThread* Oven::getNextWorkerThread() { // (for the FBX Baker Thread to have room), and cycle through them to hand a usable running thread back to our callers. auto nextIndex = ++_nextWorkerThreadIndex; - auto nextThread = _workerThreads[nextIndex % _workerThreads.size()]; + auto& nextThread = _workerThreads[nextIndex % _workerThreads.size()]; // start the thread if it isn't running yet if (!nextThread->isRunning()) { nextThread->start(); } - return nextThread; + return nextThread.get(); } diff --git a/tools/oven/src/Oven.h b/tools/oven/src/Oven.h index 928ba4eb11..443def5cb1 100644 --- a/tools/oven/src/Oven.h +++ b/tools/oven/src/Oven.h @@ -12,27 +12,15 @@ #ifndef hifi_Oven_h #define hifi_Oven_h -#include - -#include - #include -#if defined(qApp) -#undef qApp -#endif -#define qApp (static_cast(QCoreApplication::instance())) - -class OvenMainWindow; - -class Oven : public QApplication { - Q_OBJECT +class Oven { public: - Oven(int argc, char* argv[]); + Oven(); ~Oven(); - OvenMainWindow* getMainWindow() const { return _mainWindow; } + static Oven& instance() { return *_staticInstance; } QThread* getNextWorkerThread(); @@ -40,11 +28,12 @@ private: void setupWorkerThreads(int numWorkerThreads); void setupFBXBakerThread(); - OvenMainWindow* _mainWindow; - QList _workerThreads; + std::vector> _workerThreads; std::atomic _nextWorkerThreadIndex; int _numWorkerThreads; + + static Oven* _staticInstance; }; diff --git a/tools/oven/src/OvenCLIApplication.cpp b/tools/oven/src/OvenCLIApplication.cpp new file mode 100644 index 0000000000..38d9963eeb --- /dev/null +++ b/tools/oven/src/OvenCLIApplication.cpp @@ -0,0 +1,49 @@ +// +// OvenCLIApplication.cpp +// tools/oven/src +// +// Created by Stephen Birarda on 2/20/18. +// Copyright 2018 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 +#include + +#include "BakerCLI.h" + +#include "OvenCLIApplication.h" + +static const QString CLI_INPUT_PARAMETER = "i"; +static const QString CLI_OUTPUT_PARAMETER = "o"; +static const QString CLI_TYPE_PARAMETER = "t"; + +OvenCLIApplication::OvenCLIApplication(int argc, char* argv[]) : + QCoreApplication(argc, argv) +{ + // parse the command line parameters + QCommandLineParser parser; + + parser.addOptions({ + { CLI_INPUT_PARAMETER, "Path to file that you would like to bake.", "input" }, + { CLI_OUTPUT_PARAMETER, "Path to folder that will be used as output.", "output" }, + { CLI_TYPE_PARAMETER, "Type of asset.", "type" } + }); + + parser.addHelpOption(); + parser.process(*this); + + if (parser.isSet(CLI_INPUT_PARAMETER) && parser.isSet(CLI_OUTPUT_PARAMETER)) { + BakerCLI* cli = new BakerCLI(this); + QUrl inputUrl(QDir::fromNativeSeparators(parser.value(CLI_INPUT_PARAMETER))); + QUrl outputUrl(QDir::fromNativeSeparators(parser.value(CLI_OUTPUT_PARAMETER))); + QString type = parser.isSet(CLI_TYPE_PARAMETER) ? parser.value(CLI_TYPE_PARAMETER) : QString::null; + cli->bakeFile(inputUrl, outputUrl.toString(), type); + } else { + parser.showHelp(); + QCoreApplication::quit(); + } + +} diff --git a/tools/oven/src/OvenCLIApplication.h b/tools/oven/src/OvenCLIApplication.h new file mode 100644 index 0000000000..5d81166f69 --- /dev/null +++ b/tools/oven/src/OvenCLIApplication.h @@ -0,0 +1,27 @@ +// +// OvenCLIApplication.h +// tools/oven/src +// +// Created by Stephen Birarda on 2/20/18. +// Copyright 2018 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_OvenCLIApplication_h +#define hifi_OvenCLIApplication_h + +#include + +#include "Oven.h" + +class OvenCLIApplication : public QCoreApplication, public Oven { + Q_OBJECT +public: + OvenCLIApplication(int argc, char* argv[]); + + static OvenCLIApplication* instance() { return dynamic_cast(QCoreApplication::instance()); } +}; + +#endif // hifi_OvenCLIApplication_h diff --git a/tools/oven/src/OvenGUIApplication.cpp b/tools/oven/src/OvenGUIApplication.cpp new file mode 100644 index 0000000000..33dc375634 --- /dev/null +++ b/tools/oven/src/OvenGUIApplication.cpp @@ -0,0 +1,19 @@ +// +// OvenGUIApplication.cpp +// tools/src/oven +// +// Created by Stephen Birarda on 2/20/18. +// Copyright 2018 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 "OvenGUIApplication.h" + +OvenGUIApplication::OvenGUIApplication(int argc, char* argv[]) : + QApplication(argc, argv) +{ + // setup the GUI + _mainWindow.show(); +} diff --git a/tools/oven/src/OvenGUIApplication.h b/tools/oven/src/OvenGUIApplication.h new file mode 100644 index 0000000000..7f5bbf3eaf --- /dev/null +++ b/tools/oven/src/OvenGUIApplication.h @@ -0,0 +1,33 @@ +// +// OvenGUIApplication.h +// tools/oven/src +// +// Created by Stephen Birarda on 2/20/18. +// Copyright 2018 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_OvenGUIApplication_h +#define hifi_OvenGUIApplication_h + +#include + +#include "ui/OvenMainWindow.h" + +#include "Oven.h" + +class OvenGUIApplication : public QApplication, public Oven { + Q_OBJECT +public: + OvenGUIApplication(int argc, char* argv[]); + + static OvenGUIApplication* instance() { return dynamic_cast(QApplication::instance()); } + + OvenMainWindow* getMainWindow() { return &_mainWindow; } +private: + OvenMainWindow _mainWindow; +}; + +#endif // hifi_OvenGUIApplication_h diff --git a/tools/oven/src/main.cpp b/tools/oven/src/main.cpp index 788470b75e..062cc63a0d 100644 --- a/tools/oven/src/main.cpp +++ b/tools/oven/src/main.cpp @@ -8,7 +8,8 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -#include "Oven.h" +#include "OvenCLIApplication.h" +#include "OvenGUIApplication.h" #include @@ -19,6 +20,12 @@ int main (int argc, char** argv) { // init the settings interface so we can save and load settings Setting::init(); - Oven app(argc, argv); - return app.exec(); + // figure out if we're launching our GUI application or just the simple command line interface + if (argc > 1) { + OvenCLIApplication app { argc, argv }; + return app.exec(); + } else { + OvenGUIApplication app { argc, argv }; + return app.exec(); + } } diff --git a/tools/oven/src/ui/BakeWidget.cpp b/tools/oven/src/ui/BakeWidget.cpp index 9fb8f2f880..22e1b1aaf9 100644 --- a/tools/oven/src/ui/BakeWidget.cpp +++ b/tools/oven/src/ui/BakeWidget.cpp @@ -11,8 +11,7 @@ #include -#include "../Oven.h" -#include "OvenMainWindow.h" +#include "../OvenGUIApplication.h" #include "BakeWidget.h" @@ -28,7 +27,7 @@ BakeWidget::~BakeWidget() { auto it = _bakers.begin(); while (it != _bakers.end()) { auto resultRow = it->second; - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); resultsWindow->changeStatusForRow(resultRow, "Cancelled"); diff --git a/tools/oven/src/ui/DomainBakeWidget.cpp b/tools/oven/src/ui/DomainBakeWidget.cpp index 41452c7283..bf79319458 100644 --- a/tools/oven/src/ui/DomainBakeWidget.cpp +++ b/tools/oven/src/ui/DomainBakeWidget.cpp @@ -21,8 +21,7 @@ #include #include -#include "../Oven.h" -#include "OvenMainWindow.h" +#include "../OvenGUIApplication.h" #include "DomainBakeWidget.h" @@ -223,14 +222,14 @@ void DomainBakeWidget::bakeButtonClicked() { connect(domainBaker.get(), &DomainBaker::bakeProgress, this, &DomainBakeWidget::handleBakerProgress); // move the baker to the next available Oven worker thread - auto nextThread = qApp->getNextWorkerThread(); + auto nextThread = Oven::instance().getNextWorkerThread(); domainBaker->moveToThread(nextThread); // kickoff the domain baker on its thread QMetaObject::invokeMethod(domainBaker.get(), "bake"); // add a pending row to the results window to show that this bake is in process - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); auto resultsRowName = _domainNameLineEdit->text().isEmpty() ? fileToBakeURL.fileName() : _domainNameLineEdit->text(); auto resultsRow = resultsWindow->addPendingResultRow(resultsRowName, outputDirectory); @@ -250,7 +249,7 @@ void DomainBakeWidget::handleBakerProgress(int baked, int total) { auto resultRow = it->second; // grab the results window, don't force it to be brought to the top - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(false); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(false); int percentage = roundf(float(baked) / float(total) * 100.0f); @@ -269,7 +268,7 @@ void DomainBakeWidget::handleFinishedBaker() { if (it != _bakers.end()) { auto resultRow = it->second; - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); if (baker->hasErrors()) { auto errors = baker->getErrors(); diff --git a/tools/oven/src/ui/ModelBakeWidget.cpp b/tools/oven/src/ui/ModelBakeWidget.cpp index 7963b3f3c4..61eea55917 100644 --- a/tools/oven/src/ui/ModelBakeWidget.cpp +++ b/tools/oven/src/ui/ModelBakeWidget.cpp @@ -21,8 +21,7 @@ #include #include -#include "../Oven.h" -#include "OvenMainWindow.h" +#include "../OvenGUIApplication.h" #include "ModelBakeWidget.h" @@ -208,12 +207,12 @@ void ModelBakeWidget::bakeButtonClicked() { // everything seems to be in place, kick off a bake for this model now auto baker = std::unique_ptr { new FBXBaker(modelToBakeURL, []() -> QThread* { - return qApp->getNextWorkerThread(); + return Oven::instance().getNextWorkerThread(); }, bakedOutputDirectory.absolutePath(), originalOutputDirectory.absolutePath()) }; // move the baker to the FBX baker thread - baker->moveToThread(qApp->getNextWorkerThread()); + baker->moveToThread(Oven::instance().getNextWorkerThread()); // invoke the bake method on the baker thread QMetaObject::invokeMethod(baker.get(), "bake"); @@ -222,7 +221,7 @@ void ModelBakeWidget::bakeButtonClicked() { connect(baker.get(), &FBXBaker::finished, this, &ModelBakeWidget::handleFinishedBaker); // add a pending row to the results window to show that this bake is in process - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); auto resultsRow = resultsWindow->addPendingResultRow(modelToBakeURL.fileName(), outputDirectory); // keep a unique_ptr to this baker @@ -244,7 +243,7 @@ void ModelBakeWidget::handleFinishedBaker() { if (it != _bakers.end()) { auto resultRow = it->second; - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); if (baker->hasErrors()) { resultsWindow->changeStatusForRow(resultRow, baker->getErrors().join("\n")); diff --git a/tools/oven/src/ui/SkyboxBakeWidget.cpp b/tools/oven/src/ui/SkyboxBakeWidget.cpp index cbaaa5ec0a..369b06c39f 100644 --- a/tools/oven/src/ui/SkyboxBakeWidget.cpp +++ b/tools/oven/src/ui/SkyboxBakeWidget.cpp @@ -21,8 +21,7 @@ #include #include -#include "../Oven.h" -#include "OvenMainWindow.h" +#include "../OvenGUIApplication.h" #include "SkyboxBakeWidget.h" @@ -184,7 +183,7 @@ void SkyboxBakeWidget::bakeButtonClicked() { }; // move the baker to a worker thread - baker->moveToThread(qApp->getNextWorkerThread()); + baker->moveToThread(Oven::instance().getNextWorkerThread()); // invoke the bake method on the baker thread QMetaObject::invokeMethod(baker.get(), "bake"); @@ -193,7 +192,7 @@ void SkyboxBakeWidget::bakeButtonClicked() { connect(baker.get(), &TextureBaker::finished, this, &SkyboxBakeWidget::handleFinishedBaker); // add a pending row to the results window to show that this bake is in process - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); auto resultsRow = resultsWindow->addPendingResultRow(skyboxToBakeURL.fileName(), outputDirectory); // keep a unique_ptr to this baker @@ -211,7 +210,7 @@ void SkyboxBakeWidget::handleFinishedBaker() { if (it != _bakers.end()) { auto resultRow = it->second; - auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsWindow = OvenGUIApplication::instance()->getMainWindow()->showResultsWindow(); if (baker->hasErrors()) { resultsWindow->changeStatusForRow(resultRow, baker->getErrors().join("\n")); From d4061c172ef8cb795b4b8409312ae1d41865686b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Feb 2018 17:27:40 -0800 Subject: [PATCH 093/267] quit all threads before waiting on them (CR) --- tools/oven/src/Oven.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/oven/src/Oven.cpp b/tools/oven/src/Oven.cpp index e8d4c01f63..650683e1f0 100644 --- a/tools/oven/src/Oven.cpp +++ b/tools/oven/src/Oven.cpp @@ -32,9 +32,12 @@ Oven::Oven() { } Oven::~Oven() { - // quit and wait on the worker threads + // quit all worker threads and wait on them for (auto& thread : _workerThreads) { thread->quit(); + } + + for (auto& thread: _workerThreads) { thread->wait(); } From 79f5d0cee21161054b12d220b28d1d4bac546887 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Feb 2018 18:49:38 -0800 Subject: [PATCH 094/267] include memory for unique_ptr in Oven --- tools/oven/src/Oven.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/oven/src/Oven.h b/tools/oven/src/Oven.h index 443def5cb1..effebb472e 100644 --- a/tools/oven/src/Oven.h +++ b/tools/oven/src/Oven.h @@ -13,6 +13,7 @@ #define hifi_Oven_h #include +#include class Oven { From f2ce3d026874b2ae28f9fcc426e07c0ad9c5f6a3 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 21 Feb 2018 20:10:03 -0300 Subject: [PATCH 095/267] Fix focus hack. Add QML debug info --- interface/resources/qml/desktop/+android/FocusHack.qml | 2 ++ interface/resources/qml/windows/Frame.qml | 2 +- libraries/ui/src/OffscreenUi.cpp | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/desktop/+android/FocusHack.qml b/interface/resources/qml/desktop/+android/FocusHack.qml index db703bab52..38253fdec1 100644 --- a/interface/resources/qml/desktop/+android/FocusHack.qml +++ b/interface/resources/qml/desktop/+android/FocusHack.qml @@ -21,4 +21,6 @@ FocusScope { onActiveFocusChanged: root.destroy() } + function start() { + } } diff --git a/interface/resources/qml/windows/Frame.qml b/interface/resources/qml/windows/Frame.qml index c3b8399e01..52ca53b818 100644 --- a/interface/resources/qml/windows/Frame.qml +++ b/interface/resources/qml/windows/Frame.qml @@ -43,7 +43,7 @@ Item { Text { id: debugZ visible: DebugQML - text: window ? "Z: " + window.z : "" + text: (window ? "Z: " + window.z : "") + DebugQMLFile y: window ? window.height + 4 : 0 } diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 221f5013bf..287978bbd3 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -658,8 +658,10 @@ void OffscreenUi::createDesktop(const QUrl& url) { #ifdef DEBUG getSurfaceContext()->setContextProperty("DebugQML", QVariant(true)); + getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant(url.toString())); #else getSurfaceContext()->setContextProperty("DebugQML", QVariant(false)); + getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant("")); #endif load(url, [=](QQmlContext* context, QObject* newObject) { From 2d4bb3bad39c10f95590a9f25fc003df4bb035d8 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 21 Feb 2018 20:23:54 -0300 Subject: [PATCH 096/267] Change color to QML debug info --- interface/resources/qml/windows/Frame.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/resources/qml/windows/Frame.qml b/interface/resources/qml/windows/Frame.qml index 52ca53b818..4391c902ed 100644 --- a/interface/resources/qml/windows/Frame.qml +++ b/interface/resources/qml/windows/Frame.qml @@ -43,6 +43,7 @@ Item { Text { id: debugZ visible: DebugQML + color: "red" text: (window ? "Z: " + window.z : "") + DebugQMLFile y: window ? window.height + 4 : 0 } From aa46d166990b6b9890900c208ef9ec7cfb927181 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 22 Feb 2018 10:09:03 +0100 Subject: [PATCH 097/267] A bit of cleanup in TAA shaders --- libraries/render-utils/src/taa.slh | 17 +++++++++++++---- libraries/render-utils/src/taa_blend.slf | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index 3b3e275da1..bca0356949 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -38,6 +38,10 @@ layout(std140) uniform taaParamsBuffer { #define GET_BIT(bitfield, bitIndex) bool((bitfield) & (1 << (bitIndex))) +bool taa_isDebugEnabled() { + return GET_BIT(params.flags.x, 0); +} + bool taa_showDebugCursor() { return GET_BIT(params.flags.x, 1); } @@ -247,14 +251,19 @@ vec2 taa_fromEyeUVToFragUV(vec2 eyeUV, int stereoSide) { return fragUV; } -vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { - sourceColor = taa_fetchSourceMap(fragUV).xyz; +vec2 taa_computePrevFragAndEyeUV(vec2 fragUV, vec2 fragVelocity, out vec2 prevEyeUV) { int stereoSide = 0; vec2 eyeUV = taa_fromFragUVToEyeUVAndSide(fragUV, stereoSide); - vec2 prevEyeUV = eyeUV - fragVelocity; + prevEyeUV = eyeUV - fragVelocity; + return taa_fromEyeUVToFragUV(prevEyeUV, stereoSide); +} + +vec2 taa_fetchSourceAndHistory(vec2 fragUV, vec2 fragVelocity, out vec3 sourceColor, out vec3 historyColor) { + vec2 prevEyeUV; + vec2 prevFragUV = taa_computePrevFragAndEyeUV(fragUV, fragVelocity, prevEyeUV); + sourceColor = taa_fetchSourceMap(fragUV).xyz; historyColor = sourceColor; - vec2 prevFragUV = taa_fromEyeUVToFragUV(prevEyeUV, stereoSide); if (!(any(lessThan(prevEyeUV, vec2(0.0))) || any(greaterThan(prevEyeUV, vec2(1.0))))) { historyColor = taa_fetchHistoryMap(prevFragUV).xyz; } diff --git a/libraries/render-utils/src/taa_blend.slf b/libraries/render-utils/src/taa_blend.slf index bb81f4989f..aca934ca71 100644 --- a/libraries/render-utils/src/taa_blend.slf +++ b/libraries/render-utils/src/taa_blend.slf @@ -145,6 +145,7 @@ void main(void) { if (!(any(lessThan(prevTexCoord, vec2(0.0))) || any(greaterThan(prevTexCoord, vec2(1.0))))) { prevColor = texture(historyMap, prevTexCoord).xyz; } + outFragColor.xyz = mix(prevColor, vec3(1,0,1), clamp(distance(prevColor, nextColor) - 0.01, 0, 1)); if (pixVelocityLength > params.debugShowVelocityThreshold) { From ebe05d1f6f51b53d380a1bca4811c1a60dd49a49 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 22 Feb 2018 18:59:25 +0100 Subject: [PATCH 098/267] Still have to fix TAA when GPU is slower than game --- .../render-utils/src/DeferredTransform.slh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/render-utils/src/DeferredTransform.slh b/libraries/render-utils/src/DeferredTransform.slh index 57e67c086b..3332eeb662 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -43,13 +43,6 @@ uniform deferredFrameTransformBuffer { DeferredFrameTransform frameTransform; }; -DeferredFrameTransform getDeferredFrameTransform() { - DeferredFrameTransform result = frameTransform; - result._view = result._view * cameraCorrection._correctionInverse; - result._viewInverse = result._viewInverse * cameraCorrection._correction; - return result; -} - vec2 getWidthHeight(int resolutionLevel) { return vec2(ivec2(frameTransform._pixelInfo.zw) >> resolutionLevel); } @@ -96,6 +89,17 @@ mat4 getPreviousView() { return cameraCorrection._prevCorrectionInverse * frameTransform._prevView; } +mat4 getPreviousViewInverse() { + return frameTransform._prevViewInverse * cameraCorrection._prevCorrection; +} + +DeferredFrameTransform getDeferredFrameTransform() { + DeferredFrameTransform result = frameTransform; + result._view = getView(); + result._viewInverse = getViewInverse(); + return result; +} + bool isStereo() { return frameTransform._stereoInfo.x > 0.0f; } From c88f9a059d199b4b07d4c990479e41bcde86aa06 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Feb 2018 10:39:46 +1300 Subject: [PATCH 099/267] Fix up JSDoc comment blocks in TabletScriptingInterface --- libraries/ui/src/ui/TabletScriptingInterface.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/ui/src/ui/TabletScriptingInterface.h b/libraries/ui/src/ui/TabletScriptingInterface.h index 34827117f0..a8c8ddd9c8 100644 --- a/libraries/ui/src/ui/TabletScriptingInterface.h +++ b/libraries/ui/src/ui/TabletScriptingInterface.h @@ -78,7 +78,7 @@ public: QObject* getFlags(); signals: - /** jsdoc + /**jsdoc * Signaled when a tablet message or dialog is created * @function TabletProxy#tabletNotification * @returns {Signal} @@ -205,7 +205,7 @@ public: - /** jsdoc + /**jsdoc * Check if the tablet has a message dialog open * @function TabletProxy#isMessageDialogOpen */ @@ -291,7 +291,7 @@ signals: */ void screenChanged(QVariant type, QVariant url); - /** jsdoc + /**jsdoc * Signaled when the tablet becomes visible or becomes invisible * @function TabletProxy#isTabletShownChanged * @returns {Signal} From ae636105829877fba1c5703d803143c327afb466 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 22 Feb 2018 23:03:33 +0100 Subject: [PATCH 100/267] Added history of view to try to adjust for GPU slower than game --- interface/src/Application.cpp | 2 ++ interface/src/Application.h | 2 ++ interface/src/Application_render.cpp | 4 +++- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 4 +++- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 1 + libraries/gpu/src/gpu/Context.cpp | 5 ++++- libraries/gpu/src/gpu/Context.h | 3 ++- libraries/gpu/src/gpu/Frame.h | 4 ++++ 8 files changed, 21 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b63cbd2527..62deddacb0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5447,7 +5447,9 @@ void Application::update(float deltaTime) { { QMutexLocker viewLocker(&_viewMutex); + appRenderArgs._prevView = glm::inverse(_displayViewFrustum.getView()); _myCamera.loadViewFrustum(_displayViewFrustum); + appRenderArgs._view = glm::inverse(_displayViewFrustum.getView()); } { diff --git a/interface/src/Application.h b/interface/src/Application.h index 75aed1e434..77a0080db8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -617,6 +617,8 @@ private: struct AppRenderArgs { render::Args _renderArgs; glm::mat4 _eyeToWorld; + glm::mat4 _view; + glm::mat4 _prevView; glm::mat4 _eyeOffsets[2]; glm::mat4 _eyeProjections[2]; glm::mat4 _headPose; diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index 7532928491..0a26ddb9c0 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -64,6 +64,7 @@ void Application::paintGL() { glm::mat4 HMDSensorPose; glm::mat4 HMDSensorPrevPose; glm::mat4 eyeToWorld; + glm::mat4 prevEyeToWorld; glm::mat4 sensorToWorld; bool isStereo; @@ -92,7 +93,8 @@ void Application::paintGL() { { PROFILE_RANGE(render, "/gpuContextReset"); - _gpuContext->beginFrame(HMDSensorPose, HMDSensorPrevPose); + _gpuContext->beginFrame(_appRenderArgs._view, _appRenderArgs._prevView, + HMDSensorPose, HMDSensorPrevPose); // Reset the gpu::Context Stages // Back to the default framebuffer; gpu::doInBatch("Application_render::gpuContextReset", _gpuContext, [&](gpu::Batch& batch) { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 405ee33a86..f93178cf20 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -341,10 +341,12 @@ void HmdDisplayPlugin::updateFrameData() { auto invBatchPose = glm::inverse(_currentFrame->pose); auto invPrevBatchPose = glm::inverse(_currentFrame->prevPose); auto correction = invBatchPose * _currentPresentFrameInfo.presentPose; - auto prevCorrection = invPrevBatchPose * _previousPresentFrameInfo.presentPose; + auto prevCorrection = /*_currentFrame->prevView * glm::inverse(_prevRenderView) */ invPrevBatchPose * _previousPresentFrameInfo.presentPose; + getGLBackend()->setCameraCorrection(correction, prevCorrection); _previousPresentFrameInfo = _currentPresentFrameInfo; + _prevRenderView = _currentFrame->view; } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index cbb5312871..7c63536c7b 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -80,6 +80,7 @@ protected: FrameInfo _currentPresentFrameInfo; FrameInfo _previousPresentFrameInfo; FrameInfo _currentRenderFrameInfo; + mat4 _prevRenderView; RateCounter<> _stutterRate; bool _disablePreview { true }; diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index e6fa983310..e4d8a88499 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -53,12 +53,15 @@ const std::string& Context::getBackendVersion() const { return _backend->getVersion(); } -void Context::beginFrame(const glm::mat4& renderPose, const glm::mat4& prevRenderPose) { +void Context::beginFrame(const glm::mat4& renderView, const glm::mat4& prevRenderView, + const glm::mat4& renderPose, const glm::mat4& prevRenderPose) { assert(!_frameActive); _frameActive = true; _currentFrame = std::make_shared(); _currentFrame->pose = renderPose; _currentFrame->prevPose = prevRenderPose; + _currentFrame->view = renderView; + _currentFrame->prevView = prevRenderView; if (!_frameRangeTimer) { _frameRangeTimer = std::make_shared("gpu::Context::Frame"); diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 2daf9da4ef..3667121c4e 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -161,7 +161,8 @@ public: const std::string& getBackendVersion() const; - void beginFrame(const glm::mat4& renderPose = glm::mat4(), const glm::mat4& prevRenderPose = glm::mat4()); + void beginFrame(const glm::mat4& renderView = glm::mat4(), const glm::mat4& prevRenderView = glm::mat4(), + const glm::mat4& renderPose = glm::mat4(), const glm::mat4& prevRenderPose = glm::mat4()); void appendFrameBatch(Batch& batch); FramePointer endFrame(); diff --git a/libraries/gpu/src/gpu/Frame.h b/libraries/gpu/src/gpu/Frame.h index e5365541b4..ea8e70c9bc 100644 --- a/libraries/gpu/src/gpu/Frame.h +++ b/libraries/gpu/src/gpu/Frame.h @@ -28,6 +28,10 @@ namespace gpu { StereoState stereoState; uint32_t frameIndex{ 0 }; + /// The view matrix used for rendering the frame, only applicable for HMDs + Mat4 view; + /// The view matrix used for rendering the previous frame, only applicable for HMDs + Mat4 prevView; /// The sensor pose used for rendering the frame, only applicable for HMDs Mat4 pose; /// The sensor pose used for rendering the previous frame, only applicable for HMDs From 25b1e9f50b48991e791c08e1524c3296f21d8848 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Feb 2018 12:05:33 +1300 Subject: [PATCH 101/267] Fix PickRay JSDoc --- libraries/shared/src/RegisteredMetaTypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 25b2cec331..e46bdecc65 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -140,7 +140,7 @@ public: * * @typedef {object} PickRay * @property {Vec3} origin - The starting position of the PickRay. - * @property {Quat} direction - The direction that the PickRay travels. + * @property {Vec3} direction - The direction that the PickRay travels. */ class PickRay : public MathPick { public: From 63e2084395a1de52bcd83264598cd3dea71ceb61 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 22 Feb 2018 17:29:06 -0800 Subject: [PATCH 102/267] Add a Q_DECLARE_METATYPE in TextureCache. There was a missing declaration that was causing an assert in the Qt meta-object system on startup in debug builds: Q_DECLARE_METATYPE(QWeakPointer) Bug fixed by Clement. --- libraries/model-networking/src/model-networking/TextureCache.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h index ffa3150b43..f817c5eff9 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.h +++ b/libraries/model-networking/src/model-networking/TextureCache.h @@ -133,6 +133,8 @@ private: using NetworkTexturePointer = QSharedPointer; +Q_DECLARE_METATYPE(QWeakPointer) + /// Stores cached textures, including render-to-texture targets. class TextureCache : public ResourceCache, public Dependency { Q_OBJECT From 26404a6ce8fa11c1550a65e5517cc1fffad579e7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Feb 2018 19:27:13 +1300 Subject: [PATCH 103/267] Entities functions JSDoc bulk --- .../entities/src/EntityScriptingInterface.cpp | 19 + .../entities/src/EntityScriptingInterface.h | 1040 +++++++++++++++-- libraries/shared/src/RegisteredMetaTypes.h | 18 +- 3 files changed, 997 insertions(+), 80 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index acfd1e41cb..87c37c15b9 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1004,6 +1004,25 @@ QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, c QString faceName = ""; // handle BoxFace + /**jsdoc + *

A BoxFace specifies the face of an axis-aligned (AA) box. + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueDescription
"MIN_X_FACE"The minimum x-axis face.
"MAX_X_FACE"The maximum x-axis face.
"MIN_Y_FACE"The minimum y-axis face.
"MAX_Y_FACE"The maximum y-axis face.
"MIN_Z_FACE"The minimum z-axis face.
"MAX_Z_FACE"The maximum z-axis face.
"UNKNOWN_FACE"Unknown value.
+ * @typedef {string} BoxFace + */ + // FIXME: Move enum to string function to BoxBase.cpp. switch (value.face) { case MIN_X_FACE: faceName = "MIN_X_FACE"; diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 9a752cbc76..3bc197719f 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -52,6 +52,23 @@ private: QPointer _engine; }; +/**jsdoc + * The result of a {@link PickRay} search using {@link Entities.findRayIntersection|findRayIntersection} or + * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}. + * @typedef {object} Entities.RayToEntityIntersectionResult + * @property {boolean} intersects - true if the {@link PickRay} intersected an entity, otherwise + * false. + * @property {boolean} accurate - Is always true. + * @property {Uuid} entityID - The ID if the entity intersected, if any, otherwise null. + * @property {number} distance - The distance from the {@link PickRay} origin to the intersection point. + * @property {Vec3} intersection - The intersection point. + * @property {Vec3} surfaceNormal - The surface normal of the entity at the intersection point. + * @property {BoxFace} face - The face of the entity's axis-aligned box that the ray intersects. + * @property {object} extraInfo - Extra information depending on the entity intersected. Currently, only Model + * entities provide extra information, and the information provided depends on the precisionPicking parameter + * value that the search function was called with. + */ +// "accurate" is currently always true because the ray intersection is always performed with an Octree::Lock. class RayToEntityIntersectionResult { public: RayToEntityIntersectionResult(); @@ -73,7 +90,8 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra /**jsdoc * The Entities API provides facilities to create and interact with entities. Entities are 2D and 3D objects that are visible - * to everyone and typically are persisted to the domain. + * to everyone and typically are persisted to the domain. For Interface scripts, the entities available are those that + * Interface has displayed and so knows about. * * @namespace Entities * @property {number} currentAvatarEnergy - Deprecated @@ -115,52 +133,80 @@ public: public slots: /**jsdoc - * Returns `true` if the DomainServer will allow this Node/Avatar to make changes - * + * Check whether or not you can change the locked property of entities. Locked entities have their + * locked property set to true and cannot be edited or deleted. Whether or not you can change + * entities' locked properties is configured in the domain server's permissions. * @function Entities.canAdjustLocks - * @return {bool} `true` if the client can adjust locks, `false` if not. + * @returns {boolean} true if the client can change the locked property of entities, + * otherwise false. + * @example Set an entity's locked property to true if you can. + * if (Entities.canAdjustLocks()) { + * Entities.editEntity(entityID, { locked: true }); + * } else { + * Window.alert("You do not have the permissions to set an entity locked!"); + * } */ Q_INVOKABLE bool canAdjustLocks(); /**jsdoc + * Check whether or not you can rez (create) new entities in the domain. * @function Entities.canRez - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to rez new entities + * @returns {boolean} true if the domain server will allow this script to rez (create) new entities, + * otherwise false. */ Q_INVOKABLE bool canRez(); /**jsdoc + * Check whether or not you can rez (create) new temporary entities in the domain. Temporary entities are entities with a + * finite lifetime property value set. * @function Entities.canRezTmp - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to rez new temporary entities + * @returns {boolean} true if the domain server will allow this script to rez (create) new temporary + * entities, otherwise false. */ Q_INVOKABLE bool canRezTmp(); /**jsdoc - * @function Entities.canRezCertified - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to rez new certified entities - */ + * Check whether or not you can rez (create) new certified entities in the domain. Certified entities are entities that have + * PoP certificates. + * @function Entities.canRezCertified + * @returns {boolean} true if the domain server will allow this script to rez (create) new certified + * entities, otherwise false. + */ Q_INVOKABLE bool canRezCertified(); /**jsdoc - * @function Entities.canRezTmpCertified - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to rez new temporary certified entities - */ + * Check whether or not you can rez (create) new temporary certified entities in the domain. Temporary entities are entities + * with a finite lifetime property value set. Certified entities are entities that have PoP certificates. + * @function Entities.canRezTmpCertified + * @returns {boolean} true if the domain server will allow this script to rez (create) new temporary + * certified entities, otherwise false. + */ Q_INVOKABLE bool canRezTmpCertified(); /**jsdoc - * @function Entities.canWriteAssets - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to write to the asset server - */ + * Check whether or not you can make changes to the asset server's assets. + * @function Entities.canWriteAssets + * @returns {boolean} true if the domain server will allow this script to make changes to the to the asset + * server's assets, otherwise false. + */ Q_INVOKABLE bool canWriteAssets(); /**jsdoc - * Add a new entity with the specified properties. If `clientOnly` is true, the entity will - * not be sent to the server and will only be visible/accessible on the local client. - * + * Add a new entity with specified properties. * @function Entities.addEntity - * @param {EntityItemProperties} properties Properties of the entity to create. - * @param {bool} [clientOnly=false] Whether the entity should only exist locally or not. - * @return {EntityID} The entity ID of the newly created entity. The ID will be a null - * UUID (`{00000000-0000-0000-0000-000000000000}`) if the entity could not be created. + * @param {Entities.EntityProperties} properties - The properties of the entity to create. + * @param {boolean} [clientOnly=false] - If true, the entity is created as an avatar entity, otherwise it + * is created on the server. An avatar entity follows you to each domain you visit, rendering at the same world + * coordinates unless it's parented to your avatar. + * @returns {Uuid} The ID of the entity if successfully created, otherwise {@link Uuid|Uuid.NULL}. + * @example Create a box entity in front of your avatar. + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 0.5, y: 0.5, z: 0.5 } + * }); + * print("Entity created: " + entityID); */ Q_INVOKABLE QUuid addEntity(const EntityItemProperties& properties, bool clientOnly = false); @@ -170,29 +216,65 @@ public slots: const glm::vec3& position, const glm::vec3& gravity); /**jsdoc - * Return the properties for the specified {EntityID}. - * not be sent to the server and will only be visible/accessible on the local client. - * @param {EntityItemProperties} properties Properties of the entity to create. - * @param {EntityPropertyFlags} [desiredProperties=[]] Array containing the names of the properties you - * would like to get. If the array is empty, all properties will be returned. - * @return {EntityItemProperties} The entity properties for the specified entity. + * Get the properties of an entity. + * @function Entities.getEntityProperties + * @param {Uuid} entityID - The ID of the entity to get the properties of. + * @param {string[]} [desiredProperties=[]] - Array of the names of the properties to get. If the array is empty, + * all properties are returned. + * @returns {Entities.EntityProperties} The properties of the entity; {} if entityID is not the + * ID of an entity. + * @example Report the color of a new box entity. + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 0.5, y: 0.5, z: 0.5 } + * }); + * var properties = Entities.getEntityProperties(entityID, ["color"]); + * print("Entity color: " + JSON.stringify(properties.color)); */ Q_INVOKABLE EntityItemProperties getEntityProperties(QUuid entityID); Q_INVOKABLE EntityItemProperties getEntityProperties(QUuid identity, EntityPropertyFlags desiredProperties); /**jsdoc - * Updates an entity with the specified properties. - * + * Update an entity with specified properties. * @function Entities.editEntity - * @return {EntityID} The EntityID of the entity if the edit was successful, otherwise the null {EntityID}. + * @param {Uuid} entityID - The ID of the entity to edit. + * @param {Entities.EntityProperties} properties - The properties to update the entity with. + * @returns {Uuid} The ID of the entity if the edit was successful, otherwise null. + * @example Change the color of an entity. + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 0.5, y: 0.5, z: 0.5 } + * }); + * var properties = Entities.getEntityProperties(entityID, ["color"]); + * print("Entity color: " + JSON.stringify(properties.color)); + * + * Entities.editEntity(entityID, { + * color: { red: 255, green: 0, blue: 0 } + * }); + * properties = Entities.getEntityProperties(entityID, ["color"]); + * print("Entity color: " + JSON.stringify(properties.color)); */ Q_INVOKABLE QUuid editEntity(QUuid entityID, const EntityItemProperties& properties); /**jsdoc - * Deletes an entity. - * + * Delete an entity. * @function Entities.deleteEntity - * @param {EntityID} entityID The ID of the entity to delete. + * @param {Uuid} entityID - The ID of the entity to delete. + * @example Delete an entity a few seconds after creating it. + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 0.5, y: 0.5, z: 0.5 } + * }); + * + * Script.setTimeout(function () { + * Entities.deleteEntity(entityID); + * }, 3000); */ Q_INVOKABLE void deleteEntity(QUuid entityID); @@ -245,40 +327,98 @@ public slots: Q_INVOKABLE void callEntityClientMethod(QUuid clientSessionID, QUuid entityID, const QString& method, const QStringList& params = QStringList()); /**jsdoc - * finds the closest model to the center point, within the radius - * will return a EntityItemID.isKnownID = false if no models are in the radius - * this function will not find any models in script engine contexts which don't have access to models + * Find the entity with a position closest to a specified point and within a specified radius. * @function Entities.findClosestEntity - * @param {vec3} center point - * @param {float} radius to search - * @return {EntityID} The EntityID of the entity that is closest and in the radius. + * @param {Vec3} center - The point about which to search. + * @param {number} radius - The radius within which to search. + * @returns {Uuid} The ID of the entity that is closest to the center and within the radius if + * there is one, otherwise null. + * @example Find the closest entity within 10m of your avatar. + * var entityID = Entities.findClosestEntity(MyAvatar.position, 10); + * print("Closest entity: " + entityID); */ + /// this function will not find any models in script engine contexts which don't have access to models Q_INVOKABLE QUuid findClosestEntity(const glm::vec3& center, float radius) const; - /// finds models within the search sphere specified by the center point and radius + /**jsdoc + * Find all entities that intersect a sphere defined by a center point and radius. + * @function Entities.findEntities + * @param {Vec3} center - The point about which to search. + * @param {number} radius - The radius within which to search. + * @returns {Uuid[]} An array of entity IDs that were found that intersect the search sphere. + * @example Report how many entities are within 10m of your avatar. + * var entityIDs = Entities.findEntities(MyAvatar.position, 10); + * print("Number of entities within 10m: " + entityIDs.length); + */ /// this function will not find any models in script engine contexts which don't have access to models Q_INVOKABLE QVector findEntities(const glm::vec3& center, float radius) const; - /// finds models within the box specified by the corner and dimensions + /**jsdoc + * Find all entities whose axis-aligned boxes intersect a search axis-aligned box defined by its minimum coordinates corner + * and dimensions. + * @function Entities.findEntitiesInBox + * @param {Vec3} corner - The corner of the search AA box with minimum co-ordinate values. + * @param {Vec3} dimensions - The dimensions of the search AA box. + * @returns {Uuid[]} An array of entity IDs whose AA boxes intersect the search AA box. + */ /// this function will not find any models in script engine contexts which don't have access to models Q_INVOKABLE QVector findEntitiesInBox(const glm::vec3& corner, const glm::vec3& dimensions) const; - /// finds models within the frustum - /// the frustum must have the following properties: - /// - position - /// - orientation - /// - projection - /// - centerRadius + /**jsdoc + * Find all entities whose axis-aligned boxes intersect a search frustum. + * @function Entities.findEntitiesInFrustum + * @param {ViewFrustum} frustum - The frustum to search in. The position, orientation, + * projection, and centerRadius properties must be specified. + * @returns {Uuid[]} An array of entity IDs axis-aligned boxes intersect the frustum. + * @example Report the number of entities in view. + * var entityIDs = Entities.findEntitiesInFrustum(Camera.frustum); + * print("Number of entities in view: " + entityIDs.length); + */ /// this function will not find any models in script engine contexts which don't have access to entities Q_INVOKABLE QVector findEntitiesInFrustum(QVariantMap frustum) const; - /// finds entities of the indicated type within a sphere given by the center point and radius - /// @param {QString} string representation of entity type - /// @param {vec3} center point - /// @param {float} radius to search + /**jsdoc + * Find all entities of a particular type that intersect a sphere defined by a center point and radius. + * @function Entities.findEntitiesByType + * @param {Entities.EntityType} entityType - The type of entity to search for. + * @param {Vec3} center - The point about which to search. + * @param {number} radius - The radius within which to search. + * @returns {Uuid[]} An array of entity IDs of the specified type that intersect the search sphere. + * @example Report the number of Model entities within 10m of your avatar. + * var entityIDs = Entities.findEntitiesByType("Model", MyAvatar.position, 10); + * print("Number of Model entities within 10m: " + entityIDs.length); + */ /// this function will not find any entities in script engine contexts which don't have access to entities Q_INVOKABLE QVector findEntitiesByType(const QString entityType, const glm::vec3& center, float radius) const; + /**jsdoc + * Find the first entity intersected by a {@link PickRay}. Light and Zone entities are not + * intersected unless they've been configured as pickable using {@link Entities.setLightsArePickable|setLightsArePickable} + * and {@link Entities.setZonesArePickable|setZonesArePickable}, respectively.
+ * @function Entities.findRayIntersection + * @param {PickRay} pickRay - The PickRay to use for finding entities. + * @param {boolean} [precisionPicking=false] - If true and the intersected entity is a Model + * entity, the result's extraInfo property includes more information than it otherwise would. + * @param {Uuid[]} [entitiesToInclude=[]] - If not empty then the search is restricted to these entities. + * @param {Uuid[]} [entitiesToDiscard=[]] - Entities to ignore during the search. + * @param {boolean} [visibleOnly=false] - If true then only entities that are + * {@link Entities.EntityProperties|visible} are searched. + * @param {boolean} [collideableOnly=false] - If true then only entities that are not + * {@link Entities.EntityProperties|collisionless} are searched. + * @returns {Entities.RayToEntityIntersectionResult} The result of the search for the first intersected entity. + * @example Find the entity directly in front of your avatar. + * var pickRay = { + * origin: MyAvatar.position, + * direction: Quat.getFront(MyAvatar.orientation) + * }; + * + * var intersection = Entities.findRayIntersection(pickRay, true); + * if (intersection.intersects) { + * print("Entity in front of avatar: " + intersection.entityID); + * } else { + * print("No entity in front of avatar."); + * } + */ /// If the scripting context has visible entities, this will determine a ray intersection, the results /// may be inaccurate if the engine is unable to access the visible entities, in which case result.accurate /// will be false. @@ -291,9 +431,26 @@ public slots: const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly); + /**jsdoc + * Find the first entity intersected by a {@link PickRay}. Light and Zone entities are not + * intersected unless they've been configured as pickable using {@link Entities.setLightsArePickable|setLightsArePickable} + * and {@link Entities.setZonesArePickable|setZonesArePickable}, respectively.
+ * This is a synonym for {@link Entities.findRayIntersection|findRayIntersection}. + * @function Entities.findRayIntersectionBlocking + * @param {PickRay} pickRay - The PickRay to use for finding entities. + * @param {boolean} [precisionPicking=false] - If true and the intersected entity is a Model + * entity, the result's extraInfo property includes more information than it otherwise would. + * @param {Uuid[]} [entitiesToInclude=[]] - If not empty then the search is restricted to these entities. + * @param {Uuid[]} [entitiesToDiscard=[]] - Entities to ignore during the search. + * @param {boolean} [visibleOnly=false] - If true then only entities that are + * {@link Entities.EntityProperties|visible} are searched. + * @deprecated This function is deprecated and will soon be removed. Use + * {@link Entities.findRayIntersection|findRayIntersection} instead; it blocks and performs the same function. + */ /// If the scripting context has visible entities, this will determine a ray intersection, and will block in /// order to return an accurate result - Q_INVOKABLE RayToEntityIntersectionResult findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue()); + Q_INVOKABLE RayToEntityIntersectionResult findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking = false, + const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue()); Q_INVOKABLE bool reloadServerScripts(QUuid entityID); @@ -314,35 +471,337 @@ public slots: * @param {Object} thisObject The scoping "this" context that callback will be executed within. * @param {ResultCallback} callbackOrMethodName Executes thisObject[callbackOrMethodName](err, result) with the query results. */ - Q_INVOKABLE bool queryPropertyMetadata(QUuid entityID, QScriptValue property, QScriptValue scopeOrCallback, QScriptValue methodOrName = QScriptValue()); + Q_INVOKABLE bool queryPropertyMetadata(QUuid entityID, QScriptValue property, QScriptValue scopeOrCallback, + QScriptValue methodOrName = QScriptValue()); Q_INVOKABLE bool getServerScriptStatus(QUuid entityID, QScriptValue callback); + /**jsdoc + * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. Ray picks are + * done using {@link Entities.findRayIntersection|findRayIntersection}or + * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} + * APIs. + * @function Entities.setLightsArePickable + * @param {boolean} value - Set true to make ray picks intersect the bounding box of + * {@link Entities.EntityType|Light} entities, otherwise false. + */ // FIXME move to a renderable entity interface Q_INVOKABLE void setLightsArePickable(bool value); + + /**jsdoc + * Get whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. Ray picks are + * done using {@link Entities.findRayIntersection|findRayIntersection}or + * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} + * APIs. + * @function Entities.getLightsArePickable + * @returns {boolean} true if ray picks intersect the bounding box of {@link Entities.EntityType|Light} + * entities, otherwise false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool getLightsArePickable() const; + /**jsdoc + * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Zone} entities. Ray picks are + * done using {@link Entities.findRayIntersection|findRayIntersection}or + * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} + * APIs. + * @function Entities.setZonesArePickable + * @param {boolean} value - Set true to make ray picks intersect the bounding box of + * {@link Entities.EntityType|Zone} entities, otherwise false. + */ // FIXME move to a renderable entity interface Q_INVOKABLE void setZonesArePickable(bool value); + + /**jsdoc + * Get whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Zone} entities. Ray picks are + * done using {@link Entities.findRayIntersection|findRayIntersection}or + * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} + * APIs. + * @function Entities.getZonesArePickable + * @returns {boolean} true if ray picks intersect the bounding box of {@link Entities.EntityType|Zone} + * entities, otherwise false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool getZonesArePickable() const; + /**jsdoc + * Set whether or not {@link Entities.EntityType|Zone} entities' boundaries should be drawn. Currently not used. + * @function Entities.setDrawZoneBoundaries + * @param {boolean} value - Set to true if {@link Entities.EntityType|Zone} entities' boundaries should be + * drawn, false otherwise. + */ // FIXME move to a renderable entity interface Q_INVOKABLE void setDrawZoneBoundaries(bool value); + + /**jsdoc + * Get whether or not {@link Entities.EntityType|Zone} entities' boundaries should be drawn. Currently not used. + * @function Entities.getDrawZoneBoundaries + * @returns {boolean} true if {@link Entities.EntityType|Zone} entities' boundaries should be drawn, + * false otherwise. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool getDrawZoneBoundaries() const; + + /**jsdoc + * Set the values of all voxels in a spherical portion of a {@link Entities.EntityType|PolyVox} entity. + * @function Entities.setVoxelSphere + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} center - The center of the sphere of voxels to set, in world coordinates. + * @param {number} radius - If radius of the sphere of voxels to set, in world coordinates. + * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @example Create a PolyVox sphere. + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: position, + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 32, y: 32, z: 32 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setVoxelSphere(polyVox, position, 0.9, 255); + */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setVoxelSphere(QUuid entityID, const glm::vec3& center, float radius, int value); + + /**jsdoc + * Set the values of all voxels in a capsule-shaped portion of a {@link Entities.EntityType|PolyVox} entity. + * @function Entities.setVoxelCapsule + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} start - The center of the sphere of voxels to set, in world coordinates. + * @param {Vec3} end - The center of the sphere of voxels to set, in world coordinates. + * @param {number} radius - The radius of the capsule cylinder and spherical ends, in world coordinates. + * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @example Create a PolyVox capsule shape. + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: position, + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 32, y: 32, z: 32 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * var startPosition = Vec3.sum({ x: -0.5, y: 0, z: 0 }, position); + * var endPosition = Vec3.sum({ x: 0.5, y: 0, z: 0 }, position); + * Entities.setVoxelCapsule(polyVox, startPosition, endPosition, 0.5, 255); + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setVoxelCapsule(QUuid entityID, const glm::vec3& start, const glm::vec3& end, float radius, int value); + /**jsdoc + * Set the value of a particular voxels in a {@link Entities.EntityType|PolyVox} entity. + * @function Entities.setVoxel + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} position - The position relative to the minimum axes values corner of the entity. The + * position coordinates are rounded to the nearest integer to get the voxel coordinate. The minimum axes + * corner voxel is { x: 0, y: 0, z: 0 }. + * @param {number} value - If value % 256 == 0 then the voxel is cleared, otherwise the voxel is set. + * @example Create a cube PolyVox entity and clear the minimum axes corner voxel. + * var entity = Entities.addEntity({ + * type: "PolyVox", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 16, y: 16, z: 16 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setAllVoxels(entity, 1); + * Entities.setVoxel(entity, { x: 0, y: 0, z: 0 }, 0); + */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setVoxel(QUuid entityID, const glm::vec3& position, int value); - Q_INVOKABLE bool setAllVoxels(QUuid entityID, int value); - Q_INVOKABLE bool setVoxelsInCuboid(QUuid entityID, const glm::vec3& lowPosition, - const glm::vec3& cuboidSize, int value); + /**jsdoc + * Set the values of all voxels in a {@link Entities.EntityType|PolyVox} entity. + * @function Entities.setAllVoxels + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @example Create a PolyVox cube. + * var entity = Entities.addEntity({ + * type: "PolyVox", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 16, y: 16, z: 16 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setAllVoxels(entity, 1); + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE bool setAllVoxels(QUuid entityID, int value); + + /**jsdoc + * Set the values of all voxels in a cubic portion of a {@link Entities.EntityType|PolyVox} entity. + * @function Entities.setVoxelsInCuboid + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} lowPosition - The position of the minimum axes value corner of the cube of voxels to set, in voxel + * coordinates. + * @param {Vec3} cuboidSize - The size of the cube of voxels to set, in voxel coordinates. + * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @example Create a PolyVox cube and clear the voxels in one corner. + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 16, y: 16, z: 16 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setAllVoxels(polyVox, 1); + * var cuboidPosition = { x: 12, y: 12, z: 12 }; + * var cuboidSize = { x: 4, y: 4, z: 4 }; + * Entities.setVoxelsInCuboid(polyVox, cuboidPosition, cuboidSize, 0); + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE bool setVoxelsInCuboid(QUuid entityID, const glm::vec3& lowPosition, const glm::vec3& cuboidSize, int value); + + /**jsdoc + * Convert voxel coordinates in a {@link Entities.EntityType|PolyVox} entity to world coordinates. Voxel coordinates are + * relative to the minimum axes values corner of the entity with a scale of Vec3.ONE being the dimensions of + * each voxel. + * @function Entities.voxelCoordsToWorldCoords + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} voxelCoords - The voxel coordinates. May be fractional and outside the entity's bounding box. + * @returns {Vec3} The world coordinates of the voxelCoords if the entityID is a + * {@link Entities.EntityType|PolyVox} entity, otherwise {@link Vec3|Vec3.ZERO}. + * @example Create a PolyVox cube with the 0,0,0 voxel replaced by a sphere. + * // Cube PolyVox with 0,0,0 voxel missing. + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 16, y: 16, z: 16 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * Entities.setAllVoxels(polyVox, 1); + * Entities.setVoxel(polyVox, { x: 0, y: 0, z: 0 }, 0); + * + * // Red sphere in 0,0,0 corner position. + * var cornerPosition = Entities.voxelCoordsToWorldCoords(polyVox, { x: 0, y: 0, z: 0 }); + * var voxelDimensions = Vec3.multiply(2 / 16, Vec3.ONE); + * var sphere = Entities.addEntity({ + * type: "Sphere", + * position: Vec3.sum(cornerPosition, Vec3.multiply(0.5, voxelDimensions)), + * dimensions: voxelDimensions, + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE glm::vec3 voxelCoordsToWorldCoords(const QUuid& entityID, glm::vec3 voxelCoords); + + /**jsdoc + * Convert world coordinates to voxel coordinates in a {@link Entities.EntityType|PolyVox} entity. Voxel coordinates are + * relative to the minimum axes values corner of the entity, with a scale of Vec3.ONE being the dimensions of + * each voxel. + * @function Entities.worldCoordsToVoxelCoords + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} worldCoords - The world coordinates. May be outside the entity's bounding box. + * @returns {Vec3} The voxel coordinates of the worldCoords if the entityID is a + * {@link Entities.EntityType|PolyVox} entity, otherwise {@link Vec3|Vec3.ZERO}. The value may be fractional. + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE glm::vec3 worldCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 worldCoords); + + /**jsdoc + * Convert voxel coordinates in a {@link Entities.EntityType|PolyVox} entity to local coordinates relative to the minimum + * axes value corner of the entity, with the scale being the same as world coordinates. + * @function Entities.voxelCoordsToLocalCoords + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} voxelCoords - The voxel coordinates. May be fractional and outside the entity's bounding box. + * @returns {Vec3} The local coordinates of the voxelCoords if the entityID is a + * {@link Entities.EntityType|PolyVox} entity, otherwise {@link Vec3|Vec3.ZERO}. + * @example Get the world dimensions of a voxel in a PolyVox entity. + * var polyVox = Entities.addEntity({ + * type: "PolyVox", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), + * dimensions: { x: 2, y: 2, z: 2 }, + * voxelVolumeSize: { x: 16, y: 16, z: 16 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * var voxelDimensions = Entities.voxelCoordsToLocalCoords(polyVox, Vec3.ONE); + * print("Voxel dimensions: " + JSON.stringify(voxelDimensions)); + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE glm::vec3 voxelCoordsToLocalCoords(const QUuid& entityID, glm::vec3 voxelCoords); + + /**jsdoc + * Convert local coordinates to voxel coordinates in a {@link Entities.EntityType|PolyVox} entity. Local coordinates are + * relative to the minimum axes value corner of the entity, with the scale being the same as world coordinates. + * @function Entities.localCoordsToVoxelCoords + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. + * @param {Vec3} localCoords - The local coordinates. May be outside the entity's bounding box. + * @returns {Vec3} The voxel coordinates of the worldCoords if the entityID is a + * {@link Entities.EntityType|PolyVox} entity, otherwise {@link Vec3|Vec3.ZERO}. The value may be fractional. + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE glm::vec3 localCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 localCoords); + + /**jsdoc + * Set the linePoints property of a {@link Entities.EntityType|Line} entity. + * @function Entities.setAllPoints + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. + * @param {Vec3[]} points - The array of points to set the entity's linePoints property to. + * @returns {boolean} true if the entity's property was updated, false otherwise. The property + * may fail to be updated if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, + * one of the points is outside the entity's dimensions, or the number of points is greater than the maximum allowed. + * @example Change the shape of a Line entity. + * // Draw a horizontal line between two points. + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 0, z: 0 }, + * { x:1, y: -0, z: 0 } + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * // Change the line to be a "V". + * Script.setTimeout(function () { + * Entities.setAllPoints(entity, [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 }, + * { x: 1, y: 1, z: 0 }, + * ]); + * }, 2000); + */ Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); + + /**jsdoc + * Append a point to a {@link Entities.EntityType|Line} entity. + * @function Entities.appendPoint + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. + * @param {Vec3} point - The point to add to the line. The coordinates are relative to the entity's position. + * @returns {boolean} true if the point was added to the line, false otherwise. The point may + * fail to be added if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, the + * point is outside the entity's dimensions, or the maximum number of points has been reached. + * @example Append a point to a Line entity. + * // Draw a line between two points. + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 } + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * // Add a third point to create a "V". + * Entities.appendPoint(entity, { x: 1, y: 1, z: 0 }); + */ Q_INVOKABLE bool appendPoint(QUuid entityID, const glm::vec3& point); + /**jsdoc + * Dumps debug information about all entities in Interface's local in-memory tree of entities it knows about — domain + * and client-only — to the program log. + * @function Entities.dumpTree + */ Q_INVOKABLE void dumpTree() const; Q_INVOKABLE QUuid addAction(const QString& actionTypeString, const QUuid& entityID, const QVariantMap& arguments); @@ -351,43 +810,294 @@ public slots: Q_INVOKABLE QVector getActionIDs(const QUuid& entityID); Q_INVOKABLE QVariantMap getActionArguments(const QUuid& entityID, const QUuid& actionID); - // FIXME move to a renderable entity interface - Q_INVOKABLE glm::vec3 voxelCoordsToWorldCoords(const QUuid& entityID, glm::vec3 voxelCoords); - Q_INVOKABLE glm::vec3 worldCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 worldCoords); - Q_INVOKABLE glm::vec3 voxelCoordsToLocalCoords(const QUuid& entityID, glm::vec3 voxelCoords); - Q_INVOKABLE glm::vec3 localCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 localCoords); + /**jsdoc + * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * @function Entities.getAbsoluteJointTranslationInObjectFrame + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @returns {Vec3} The translation of the joint in the entity's coordinate frame if the entity is a + * {@link Entities.EntityType|Model} entity, the entity is loaded, and the joint index is valid; otherwise + * {@link Vec3(0)|Vec3.ZERO}. + */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); + + /**jsdoc + * Get the trannslation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * @function Entities.getAbsoluteJointRotationInObjectFrame + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @returns {Quat} The rotation of the joint in the entity's coordinate frame if the entity is a + * {@link Entities.EntityType|Model} entity, the entity is loaded, and the joint index is valid; otherwise + * {@link Quat(0)|Quat.IDENTITY}. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex); + + /**jsdoc + * Set the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * @function Entities.setAbsoluteJointTranslationInObjectFrame + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @param {Vec3} translation - The translation relative to the entity's coordinate frame to set the joint to. + * @returns {boolean} trueif the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the joint index is valid, and the translation is different to the joint's current translation; otherwise + * false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex, glm::vec3 translation); + + /**jsdoc + * Set the rotation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * @function Entities.setAbsoluteJointRotationInObjectFrame + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @param {Quat} rotation - The rotation relative to the entity's coordinate frame to set the joint to. + * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the joint index is valid, and the rotation is different to the joint's current rotation; otherwise false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex, glm::quat rotation); + + /**jsdoc + * Get the local translation of a joint in a {@link Entities.EntityType|Model} entity. + * @function Entities.getLocalJointTranslation + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @returns {Vec3} The local translation of the joint if the entity is a {@link Entities.EntityType|Model} entity, the + * entity is loaded, and the joint index is valid; otherwise {@link Vec3(0)|Vec3.ZERO}. + */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 getLocalJointTranslation(const QUuid& entityID, int jointIndex); + + /**jsdoc + * Get the local rotation of a joint in a {@link Entities.EntityType|Model} entity. + * @function Entities.getLocalJointRotation + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @returns {Quat} The local rotation of the joint if the entity is a {@link Entities.EntityType|Model} entity, the entity + * is loaded, and the joint index is valid; otherwise {@link Quat(0)|Quat.IDENTITY}. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE glm::quat getLocalJointRotation(const QUuid& entityID, int jointIndex); + + /**jsdoc + * Set the local translation of a joint in a {@link Entities.EntityType|Model} entity. + * @function Entities.setLocalJointTranslation + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @param {Vec3} translation - The local translation to set the joint to. + * @returns {boolean} trueif the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the joint index is valid, and the translation is different to the joint's current translation; otherwise + * false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointTranslation(const QUuid& entityID, int jointIndex, glm::vec3 translation); + + /**jsdoc + * Set the local rotation of a joint in a {@link Entities.EntityType|Model} entity. + * @function Entities.setLocalJointRotation + * @param {Uuid} entityID - The ID of the entity. + * @param {number} jointIndex - The integer index of the joint. + * @param {Quat} rotation - The local rotation to set the joint to. + * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the joint index is valid, and the rotation is different to the joint's current rotation; otherwise false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointRotation(const QUuid& entityID, int jointIndex, glm::quat rotation); + + /**jsdoc + * Set the local translations of joints in a {@link Entities.EntityType|Model} entity. + * @function Entities.setLocalJointTranslations + * @param {Uuid} entityID - The ID of the entity. + * @param {Vec3[]} translations - The local translations to set the joints to. + * @returns {boolean} trueif the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the model has joints, and at least one of the translations is different to the model's current translations; + * otherwise false. + */ + // FIXME move to a renderable entity interface + Q_INVOKABLE bool setLocalJointTranslations(const QUuid& entityID, const QVector& translations); + + /**jsdoc + * Set the local rotations of joints in a {@link Entities.EntityType|Model} entity. + * @function Entities.setLocalJointRotations + * @param {Uuid} entityID - The ID of the entity. + * @param {Quat[]} rotations - The local rotations to set the joints to. + * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the model has joints, and at least one of the rotations is different to the model's current rotations; otherwise + * false. + */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointRotations(const QUuid& entityID, const QVector& rotations); - Q_INVOKABLE bool setLocalJointTranslations(const QUuid& entityID, const QVector& translations); + + /**jsdoc + * Set the local rotations and translations of joints in a {@link Entities.EntityType|Model} entity. + * @function Entities.setLocalJointsData + * @param {Uuid} entityID - The ID of the entity. + * @param {Quat[]} rotations - The local rotations to set the joints to. + * @param {Vec3[]} translations - The local translations to set the joints to. + * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, + * the model has joints, and at least one of the rotations or translations is different to the model's current values; + * otherwise false. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointsData(const QUuid& entityID, const QVector& rotations, const QVector& translations); + + /**jsdoc + * Get the index of a named joint in a {@link Entities.EntityType|Model} entity. + * @function Entities.getJointIndex + * @param {Uuid} entityID - The ID of the entity. + * @param {string} name - The name of the joint. + * @returns {number} The integer index of the joint if the entity is a {@link Entities.EntityType|Model} entity, the entity + * is loaded, and the joint is present; otherwise -1. The joint indexes are in order per + * {@link Entities.getJointNames|getJointNames}. + */ // FIXME move to a renderable entity interface Q_INVOKABLE int getJointIndex(const QUuid& entityID, const QString& name); + + /**jsdoc + * Get the names of all the joints in a {@link Entities.EntityType|Model} entity. + * @function Entities.getJointNames + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Model} entity. + * @returns {string[]} The names of all the joints in the entity if it is a {@link Entities.EntityType|Model} entity and + * is loaded, otherwise []. The joint names are in order per {@link Entities.getJointIndex|getJointIndex}. + */ + // FIXME move to a renderable entity interface Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); + /**jsdoc + * Get the IDs of entities, overlays, and avatars that are directly parented to an entity. + * @function Entities.getChildrenIDs + * @param {Uuid} parentID - The ID of the entity to get the children IDs of. + * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID + * entity. Does not include children's children, etc. The array is empty if no children can be found, + * parentID cannot be found, or parentID is not an entity. + * @example Report the children of an entity. + * function createEntity(description, position, parent) { + * var entity = Entities.addEntity({ + * type: "Sphere", + * position: position, + * dimensions: Vec3.HALF, + * parentID: parent, + * lifetime: 300 // Delete after 5 minutes. + * }); + * print(description + ": " + entity); + * return entity; + * } + * + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 })); + * var root = createEntity("Root", position, Uuid.NULL); + * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root); + * var grandChild = createEntity("Grandchild", Vec3.sum(position, { x: 0, y: -2, z: 0 }), child); + * + * var children = Entities.getChildrenIDs(root); + * print("Children of root: " + JSON.stringify(children)); // Only the child entity. + */ Q_INVOKABLE QVector getChildrenIDs(const QUuid& parentID); + + /**jsdoc + * Get the IDs of entities, overlays, and avatars that are directly parented to an entity, overlay, or avatar model's joint. + * @function Entities.getChildrenIDsOfJoint + * @param {Uuid} parentID - The ID of the entity, overlay, or avatar to get the children IDs of. + * @param {number} jointIndex - Integer number of the model joint to get the children IDs of. + * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID + * entity, overlay, or avatar at the jointIndex joint. Does not include children's children, etc. The + * array is empty if no children can be found or parentID cannot be found. + * @example Report the children of your avatar's right hand. + * function createEntity(description, position, parent) { + * var entity = Entities.addEntity({ + * type: "Sphere", + * position: position, + * dimensions: Vec3.HALF, + * parentID: parent, + * lifetime: 300 // Delete after 5 minutes. + * }); + * print(description + ": " + entity); + * return entity; + * } + * + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 })); + * var root = createEntity("Root", position, Uuid.NULL); + * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root); + * + * Entities.editEntity(root, { + * parentID: MyAvatar.sessionUUID, + * parentJointIndex: MyAvatar.getJointIndex("RightHand") + * }); + * + * var children = Entities.getChildrenIDsOfJoint(MyAvatar.sessionUUID, MyAvatar.getJointIndex("RightHand")); + * print("Children of hand: " + JSON.stringify(children)); // Only the root entity. + */ Q_INVOKABLE QVector getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex); + + /**jsdoc + * Check whether an entity or overlay has a an entity as an ancestor (parent, parent's parent, etc.). + * @function Entities.isChildOfParent + * @param {Uuid} childID - The ID of the child entity or overlay to test for being a child, grandchild, etc. + * @param {Uuid} parentID - The ID of the parent entity to test for being a parent, grandparent, etc. + * @returns {boolean} true if the childID> entity or overlay has the parentID entity + * as a parent or grandparent etc. + * @example Check that a grandchild entity is a child of its grandparent. + * function createEntity(description, position, parent) { + * var entity = Entities.addEntity({ + * type: "Sphere", + * position: position, + * dimensions: Vec3.HALF, + * parentID: parent, + * lifetime: 300 // Delete after 5 minutes. + * }); + * print(description + ": " + entity); + * return entity; + * } + * + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 })); + * var root = createEntity("Root", position, Uuid.NULL); + * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root); + * var grandChild = createEntity("Grandchild", Vec3.sum(position, { x: 0, y: -2, z: 0 }), child); + * + * print("grandChild has root as parent: " + Entities.isChildOfParent(grandChild, root)); // true + */ Q_INVOKABLE bool isChildOfParent(QUuid childID, QUuid parentID); + /**jsdoc + * Get the type — entity, overlay, or avatar — of an in-world item. + * @function Entities.getNestableType + * @param {Uuid} id - The ID of the item to get the type of. + * @returns {string} The type of the item: "entity" if the item is an entity, "overlay" if the + * the item is an overlay, "avatar" if the item is an avatar; otherwise "unknown" if the item + * cannot be found. + * @example Print some nestable types. + * var entity = Entities.addEntity({ + * type: "Sphere", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 1, z: -2 })), + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * print(Entities.getNestableType(entity)); // "entity" + * print(Entities.getNestableType(Uuid.generate())); // "unknown" + */ Q_INVOKABLE QString getNestableType(QUuid id); + /**jsdoc + * Get the ID of the {@link Entities.EntityType|Web} entity that has keyboard focus. + * @function Entities.getKeyboardFocusEntity + * @returns {Uuid} The ID of the {@link Entities.EntityType|Web} entity that has focus, if any, otherwise null. + */ Q_INVOKABLE QUuid getKeyboardFocusEntity() const; + + /**jsdoc + * Set the {@link Entities.EntityType|Web} entity that has keyboard focus. + * @function Entities.setKeyboardFocusEntity + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Web} entity to set keyboard focus to. Use + * null or {@link Uuid|Uuid.NULL} to unset keyboard focus from an entity. + */ Q_INVOKABLE void setKeyboardFocusEntity(const EntityItemID& id); Q_INVOKABLE void sendMousePressOnEntity(const EntityItemID& id, const PointerEvent& event); @@ -406,49 +1116,180 @@ public slots: Q_INVOKABLE void emitScriptEvent(const EntityItemID& entityID, const QVariant& message); + /**jsdoc + * Check whether an axis-aligned box and a capsule intersect. + * @function Entities.AABoxIntersectsCapsule + * @param {Vec3} brn - The bottom right near (minimum axes values) corner of the AA box. + * @param {Vec3} dimensions - The dimensions of the AA box. + * @param {Vec3} start - One end of the capsule. + * @param {Vec3} end - The other end of the capsule. + * @param {number} radius - The radiues of the capsule. + * @returns {boolean} true if the AA box and capsule intersect, otherwise false. + */ Q_INVOKABLE bool AABoxIntersectsCapsule(const glm::vec3& low, const glm::vec3& dimensions, const glm::vec3& start, const glm::vec3& end, float radius); + /**jsdoc + * Get the meshes in a {@link Entities.EntityType|Model} or {@link Entities.EntityType|PolyVox} entity. + * @function Entities.getMeshes + * @param {Uuid} entityID - The ID of the Model or PolyVox entity to get the meshes of. + * @param {Entities~getMeshesCallback} callback - The function to call upon completion. + */ + /**jsdoc + * Called when {@link Entities.getMeshes} is complete. + * @callback Entities~getMeshesCallback + * @param {MeshProxy[]} meshes - If success< is true, a {@link MeshProxy} per mesh in the + * Model or PolyVox entity; otherwise undefined. + * @param {boolean} success - true if the {@link Entities.getMeshes} call was successful, false + * otherwise. The call may be unsuccessful if the requested entity could not be found. + */ // FIXME move to a renderable entity interface Q_INVOKABLE void getMeshes(QUuid entityID, QScriptValue callback); /**jsdoc - * Returns object to world transform, excluding scale - * + * Get the object to world transform, excluding scale, of an entity. * @function Entities.getEntityTransform - * @param {EntityID} entityID The ID of the entity whose transform is to be returned - * @return {Mat4} Entity's object to world transform, excluding scale + * @param {Uuid} entityID - The ID of the entity. + * @returns {Mat4} The entity's object to world transform excluding scale; i.e., translation and rotation, with scale of 1. + * @example Position and rotation in an entity's world transform. + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 1, z: -2 })); + * var orientation = MyAvatar.orientation; + * print("Position: " + JSON.stringify(position)); + * print("Orientation: " + JSON.stringify(orientation)); + * + * var entityID = Entities.addEntity({ + * type: "Sphere", + * position: position, + * rotation: orientation, + * dimensions: Vec3.HALF, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * var transform = Entities.getEntityTransform(entityID); + * print("Transform: " + JSON.stringify(transform)); + * print("Translation: " + JSON.stringify(Mat4.extractTranslation(transform))); // Same as position. + * print("Rotation: " + JSON.stringify(Mat4.extractRotation(transform))); // Same as orientation. + * print("Scale: " + JSON.stringify(Mat4.extractScale(transform))); // { x: 1, y: 1, z: 1 } */ Q_INVOKABLE glm::mat4 getEntityTransform(const QUuid& entityID); - /**jsdoc - * Returns object to world transform, excluding scale - * + * Get the object to parent transform, excluding scale, of an entity. * @function Entities.getEntityLocalTransform - * @param {EntityID} entityID The ID of the entity whose local transform is to be returned - * @return {Mat4} Entity's object to parent transform, excluding scale - */ + * @param {Uuid} entityID - The ID of the entity. + * @returns {Mat4} The entity's object to parent transform excluding scale; i.e., translation and rotation, with scale of 1. + * @example Position and rotation in an entity's local transform. + * function createEntity(position, rotation, parent) { + * var entity = Entities.addEntity({ + * type: "Box", + * position: position, + * rotation: rotation, + * dimensions: Vec3.HALF, + * parentID: parent, + * lifetime: 300 // Delete after 5 minutes. + * }); + * return entity; + * } + * + * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 })); + * + * var parent = createEntity(position, MyAvatar.orientation, Uuid.NULL); + * + * var childTranslation = { x: 0, y: -1.5, z: 0 }; + * var childRotation = Quat.fromPitchYawRollDegrees(0, 45, 0); + * var child = createEntity(Vec3.sum(position, childTranslation), Quat.multiply(childRotation, MyAvatar.orientation), parent); + * + * var transform = Entities.getEntityLocalTransform(child); + * print("Transform: " + JSON.stringify(transform)); + * print("Translation: " + JSON.stringify(Mat4.extractTranslation(transform))); // childTranslation + * print("Rotation: " + JSON.stringify(Quat.safeEulerAngles(Mat4.extractRotation(transform)))); // childRotation + * print("Scale: " + JSON.stringify(Mat4.extractScale(transform))); // { x: 1, y: 1, z: 1 } */ Q_INVOKABLE glm::mat4 getEntityLocalTransform(const QUuid& entityID); - /**jsdoc - * Return the Static Certificate JSON for the specified {EntityID}. - * @return {QByteArray} The Static Certificate JSON for the specified entity. + * Get the static certificate for an entity. The static certificate contains static properties of the item which cannot + * be altered. + * @function Entities.getStaticCertificateJSON + * @param {Uuid} entityID - The ID of the entity to get the static certificate for. + * @returns {string} The entity's static certificate as a JSON string. */ Q_INVOKABLE QString getStaticCertificateJSON(const QUuid& entityID); + + /**jsdoc + * Verify the entity's proof of provenance, i.e., that the entity's certificateID property was produced by + * High Fidelity signing the entity's static certificate JSON. + * @function Entities.verifyStaticCertificateProperties + * @param {Uuid} entityID - The ID of the entity to verify. + * @returns {boolean} true if the entity's certificateID property is present and its value + * matches the entity's static certificate JSON, otherwise false. + */ Q_INVOKABLE bool verifyStaticCertificateProperties(const QUuid& entityID); signals: void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); + /**jsdoc + * Triggered when your ability to change the locked property of entities changes. + * @function Entities.canAdjustLocksChanged + * @param {boolean} canAdjustLocks - true if the script can change the locked property of an + * entity, otherwise false. + * @returns {Signal} + * @example Report when your ability to change locks changes. + * function onCanAdjustLocksChanged(canAdjustLocks) { + * print("You can adjust entity locks: " + canAdjustLocks); + * } + * Entities.canAdjustLocksChanged.connect(onCanAdjustLocksChanged); + */ void canAdjustLocksChanged(bool canAdjustLocks); + + /**jsdoc + * Triggered when your ability to rez (create) entities changes. + * @function Entities.canRezChanged + * @param {boolean} canRez - true if the script can rez (create) entities, otherwise false. + * @returns {Signal} + */ void canRezChanged(bool canRez); - void canRezTmpChanged(bool canRez); - void canRezCertifiedChanged(bool canRez); - void canRezTmpCertifiedChanged(bool canRez); + + /**jsdoc + * Triggered when your ability to rez (create) temporary entities changes. Temporary entities are entities with a finite + * lifetime property value set. + * @function Entities.canRezTmpChanged + * @param {boolean} canRezTmp - true if the script can rez (create) temporary entities, otherwise + * false. + * @returns {Signal} + */ + void canRezTmpChanged(bool canRezTmp); + + /**jsdoc + * Triggered when your ability to rez (create) certified entities changes. Certified entities are entities that have PoP + * certificates. + * @function Entities.canRezCertifiedChanged + * @param {boolean} canRezCertified - true if the script can rez (create) certified entities, otherwise + * false. + * @returns {Signal} + */ + void canRezCertifiedChanged(bool canRezCertified); + + /**jsdoc + * Triggered when your ability to rez (create) temporary certified entities changes. Temporary entities are entities with a + * finite lifetime property value set. Certified entities are entities that have PoP certificates. + * @function Entities.canRezTmpCertifiedChanged + * @param {boolean} canRezTmpCertified - true if the script can rez (create) temporary certified entities, + * otherwise false. + * @returns {Signal} + */ + void canRezTmpCertifiedChanged(bool canRezTmpCertified); + + /**jsdoc + * Triggered when your ability to make changes to the asset server's assets changes. + * @function Entities.canWriteAssetsChanged + * @param {boolean} canWriteAssets - true if the script can change the ? property of an entity, + * otherwise false. + * @returns {Signal} + */ void canWriteAssetsChanged(bool canWriteAssets); + // TODO void mousePressOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); void mouseDoublePressOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); void mouseMoveOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); @@ -467,9 +1308,50 @@ signals: void enterEntity(const EntityItemID& entityItemID); void leaveEntity(const EntityItemID& entityItemID); + /**jsdoc + * Triggered when an entity is deleted. + * @function Entities.deletingEntity + * @param {Uuid} entityID - The ID of the entity deleted. + * @returns {Signal} + * @example Report when an entity is deleted. + * Entities.deletingEntity.connect(function (entityID) { + * print("Deleted entity: " + entityID); + * }); + */ void deletingEntity(const EntityItemID& entityID); + + /**jsdoc + * Triggered when an entity is added to Interface's local in-memory tree of entities it knows about. This may occur when + * entities are loaded upon visiting a domain, when the user rotates their view so that more entities become visible, and + * when a domain or client-only entity is added (e.g., by {@Entities.addEntity|addEntity}). + * @function Entities.addingEntity + * @param {Uuid} entityID - The ID of the entity added. + * @returns {Signal} + * @example Report when an entity is added. + * Entities.addingEntity.connect(function (entityID) { + * print("Added entity: " + entityID); + * }); + */ void addingEntity(const EntityItemID& entityID); + + /**jsdoc + * Triggered when you disconnect from a domain, at which time Interface's local in-memory tree of entities it knows about + * is cleared. + * @function Entities.clearingEntities + * @returns {Signal} + * @example Report when Interfaces's entity tree is cleared. + * Entities.clearingEntities.connect(function () { + * print("Entities cleared"); + * }); + */ void clearingEntities(); + + /**jsdoc + * @function Entities.debitEnergySource + * @param {number} value + * @returns {Signal} + * @deprecated This function is deprecated and will soon be removed. + */ void debitEnergySource(float value); void webEventReceived(const EntityItemID& entityItemID, const QVariant& message); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index e46bdecc65..3fc81a9c9e 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -321,13 +321,29 @@ namespace graphics { using MeshPointer = std::shared_ptr; - +/**jsdoc + * A handle for a mesh in an entity, such as returned by {@link Entities.getMeshes}. + * @class MeshProxy + */ class MeshProxy : public QObject { Q_OBJECT public: virtual MeshPointer getMeshPointer() const = 0; + + /**jsdoc + * Get the number of vertices in the mesh. + * @function MeshProxy#getNumVertices + * @returns {number} Integer number of vertices in the mesh. + */ Q_INVOKABLE virtual int getNumVertices() const = 0; + + /**jsdoc + * Get the position of a vertex in the mesh. + * @function MeshProxy#getPos3 + * @param {number} index - Integer index of the mesh vertex. + * @returns {Vec3} Local position of the vertex relative to the mesh. + */ Q_INVOKABLE virtual glm::vec3 getPos3(int index) const = 0; }; From 895c354257afd94cd1cfd1b9e2e1152e17694120 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Feb 2018 19:27:40 +1300 Subject: [PATCH 104/267] Entities properties JSDoc fixes --- .../entities/src/EntityItemProperties.cpp | 2 +- libraries/entities/src/EntityTypes.h | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index fed3204245..d8ac4ae7e1 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -809,7 +809,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { /**jsdoc * The "PolyVox" {@link Entities.EntityType|EntityType} displays a set of textured voxels. - * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}.
+ * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. * If you have two or more neighboring PolyVox entities of the same size abutting each other, you can display them as joined by * configuring their voxelSurfaceStyle and neighbor ID properties.
* PolyVox entities uses a library from Volumes of Fun. Their diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 6101c4608b..fa3af3e9bb 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -42,33 +42,33 @@ public: * ValueDescriptionProperties * * - * BoxA rectangular prism. This is identical to the Shape EntityType except + * "Box"A rectangular prism. This is identical to the Shape EntityType except * that it is always created with an initial shape property value of "Cube". * {@link Entities.EntityProperties-Box|EntityProperties-Box} - * LightA local lighting effect. + * "Light"A local lighting effect. * {@link Entities.EntityProperties-Light|EntityProperties-Light} - * LineA sequence of one or more simple straight lines. + * "Line"A sequence of one or more simple straight lines. * {@link Entities.EntityProperties-Line|EntityProperties-Line} - * ModelA mesh model from an FBX or OBJ file. + * "Model"A mesh model from an FBX or OBJ file. * {@link Entities.EntityProperties-Model|EntityProperties-Model} - * ParticleEffectA particle system that can be used to simulate things such as fire, + * "ParticleEffect"A particle system that can be used to simulate things such as fire, * smoke, snow, magic spells, etc. * {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} - * PolyLineA sequence of one or more textured straight lines. + * "PolyLine"A sequence of one or more textured straight lines. * {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} - * PolyVoxA set of textured voxels. + * "PolyVox"A set of textured voxels. * {@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox} - * ShapeA basic entity such as a cube. + * "Shape"A basic entity such as a cube. * See also, the Box and Sphere entity types. * {@link Entities.EntityProperties-Shape|EntityProperties-Shape} - * SphereA sphere. This is identical to the Shape EntityType except that it is + * "Sphere"A sphere. This is identical to the Shape EntityType except that it is * always created with an initial shape property value of "Sphere". * {@link Entities.EntityProperties-Sphere|EntityProperties-Sphere} - * TextA pane of text oriented in space. + * "Text"A pane of text oriented in space. * {@link Entities.EntityProperties-Text|EntityProperties-Text} - * WebA browsable Web page. + * "Web"A browsable Web page. * {@link Entities.EntityProperties-Web|EntityProperties-Web} - * ZoneA volume of lighting effects and avatar permissions. + * "Zone"A volume of lighting effects and avatar permissions. * {@link Entities.EntityProperties-Zone|EntityProperties-Zone} * * From 440c0aa0d9a7145dbfade9bb832b9509de25ccd8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Feb 2018 19:27:54 +1300 Subject: [PATCH 105/267] Overlays JSDoc improvements --- interface/src/ui/overlays/Overlays.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index f150f5715c..9da1e8b4c0 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -44,6 +44,8 @@ void OverlayPropertyResultFromScriptValue(const QScriptValue& object, OverlayPro const OverlayID UNKNOWN_OVERLAY_ID = OverlayID(); /**jsdoc + * The result of a {@link PickRay} search using {@link Overlays.findRayIntersection|findRayIntersection} or + * {@link Overlays.findRayIntersectionVector|findRayIntersectionVector}. * @typedef {object} Overlays.RayToOverlayIntersectionResult * @property {boolean} intersects - true if the {@link PickRay} intersected with a 3D overlay, otherwise * false. @@ -327,10 +329,8 @@ public slots: * @function Overlays.findRayIntersection * @param {PickRay} pickRay - The PickRay to use for finding overlays. * @param {boolean} [precisionPicking=false] - Unused; exists to match Entity API. - * @param {Array.} [overlayIDsToInclude=[]] - Whitelist for intersection test. If empty then the result isn't limited - * to overlays in the list. - * @param {Array.} [overlayIDsToExclude=[]] - Blacklist for intersection test. If empty then the result doesn't - * exclude overlays in the list. + * @param {Array.} [overlayIDsToInclude=[]] - If not empty then the search is restricted to these overlays. + * @param {Array.} [overlayIDsToExclude=[]] - Overlays to ignore during the search. * @param {boolean} [visibleOnly=false] - Unused; exists to match Entity API. * @param {boolean} [collidableOnly=false] - Unused; exists to match Entity API. * @returns {Overlays.RayToOverlayIntersectionResult} The closest 3D overlay intersected by pickRay, taking @@ -365,10 +365,8 @@ public slots: * @deprecated Use {@link Overlays.findRayIntersection} instead; it has identical parameters and results. * @param {PickRay} pickRay - The PickRay to use for finding overlays. * @param {boolean} [precisionPicking=false] - Unused; exists to match Entity API. - * @param {Array.} [overlayIDsToInclude=[]] - Whitelist for intersection test. If empty then the result isn't limited - * to overlays in the list. - * @param {Array.} [overlayIDsToExclude=[]] - Blacklist for intersection test. If empty then the result doesn't - * exclude overlays in the list. + * @param {Array.} [overlayIDsToInclude=[]] - If not empty then the search is restricted to these overlays. + * @param {Array.} [overlayIDsToExclude=[]] - Overlays to ignore during the search. * @param {boolean} [visibleOnly=false] - Unused; exists to match Entity API. * @param {boolean} [collidableOnly=false] - Unused; exists to match Entity API. * @returns {Overlays.RayToOverlayIntersectionResult} The closest 3D overlay intersected by pickRay, taking From 7432c8361e9b809640e9779135fa7733e8bd702f Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 09:11:17 +0100 Subject: [PATCH 106/267] Added some comments to try to help understand the correction pipeline --- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index f93178cf20..172a153f65 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -341,7 +341,10 @@ void HmdDisplayPlugin::updateFrameData() { auto invBatchPose = glm::inverse(_currentFrame->pose); auto invPrevBatchPose = glm::inverse(_currentFrame->prevPose); auto correction = invBatchPose * _currentPresentFrameInfo.presentPose; - auto prevCorrection = /*_currentFrame->prevView * glm::inverse(_prevRenderView) */ invPrevBatchPose * _previousPresentFrameInfo.presentPose; + // _currentFrame->prevView * glm::inverse(_prevRenderView) : this is to get the + // view matrix of the last rendered frame in the present thread + auto prevCorrection = _currentFrame->prevView * glm::inverse(_prevRenderView); + prevCorrection = prevCorrection * invPrevBatchPose * _previousPresentFrameInfo.presentPose; getGLBackend()->setCameraCorrection(correction, prevCorrection); From 4636f43728d899abe1710db2eb8e31646fc45dd4 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 10:19:05 +0100 Subject: [PATCH 107/267] Simplified camera view history and TAA is now working in all circumstances. --- interface/src/Application.cpp | 2 -- interface/src/Application.h | 2 -- interface/src/Application_render.cpp | 4 +--- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 16 ++++------------ .../src/display-plugins/hmd/HmdDisplayPlugin.h | 1 - libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 8 ++++---- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 6 +++--- .../gpu-gl/src/gpu/gl/GLBackendTransform.cpp | 2 +- libraries/gpu/src/gpu/Context.cpp | 5 +---- libraries/gpu/src/gpu/Context.h | 3 +-- libraries/gpu/src/gpu/Frame.h | 4 ---- .../render-utils/src/DeferredFrameTransform.cpp | 4 ---- .../render-utils/src/DeferredFrameTransform.h | 5 ----- libraries/render-utils/src/DeferredTransform.slh | 14 ++++++-------- 14 files changed, 21 insertions(+), 55 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 62deddacb0..b9efe2f3f6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5342,7 +5342,6 @@ void Application::update(float deltaTime) { editRenderArgs([this, deltaTime](AppRenderArgs& appRenderArgs) { PerformanceTimer perfTimer("editRenderArgs"); - appRenderArgs._prevHeadPose = appRenderArgs._headPose; appRenderArgs._headPose = getHMDSensorPose(); auto myAvatar = getMyAvatar(); @@ -5447,7 +5446,6 @@ void Application::update(float deltaTime) { { QMutexLocker viewLocker(&_viewMutex); - appRenderArgs._prevView = glm::inverse(_displayViewFrustum.getView()); _myCamera.loadViewFrustum(_displayViewFrustum); appRenderArgs._view = glm::inverse(_displayViewFrustum.getView()); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 77a0080db8..8eaab9f842 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -618,11 +618,9 @@ private: render::Args _renderArgs; glm::mat4 _eyeToWorld; glm::mat4 _view; - glm::mat4 _prevView; glm::mat4 _eyeOffsets[2]; glm::mat4 _eyeProjections[2]; glm::mat4 _headPose; - glm::mat4 _prevHeadPose; glm::mat4 _sensorToWorld; float _sensorToWorldScale { 1.0f }; bool _isStereo{ false }; diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index 0a26ddb9c0..d17c5dbef7 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -81,7 +81,6 @@ void Application::paintGL() { } HMDSensorPose = _appRenderArgs._headPose; - HMDSensorPrevPose = _appRenderArgs._prevHeadPose; eyeToWorld = _appRenderArgs._eyeToWorld; sensorToWorld = _appRenderArgs._sensorToWorld; isStereo = _appRenderArgs._isStereo; @@ -93,8 +92,7 @@ void Application::paintGL() { { PROFILE_RANGE(render, "/gpuContextReset"); - _gpuContext->beginFrame(_appRenderArgs._view, _appRenderArgs._prevView, - HMDSensorPose, HMDSensorPrevPose); + _gpuContext->beginFrame(_appRenderArgs._view, HMDSensorPose); // Reset the gpu::Context Stages // Back to the default framebuffer; gpu::doInBatch("Application_render::gpuContextReset", _gpuContext, [&](gpu::Batch& batch) { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 172a153f65..4e67ee3db8 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -338,18 +338,10 @@ void HmdDisplayPlugin::updateFrameData() { updatePresentPose(); if (_currentFrame) { - auto invBatchPose = glm::inverse(_currentFrame->pose); - auto invPrevBatchPose = glm::inverse(_currentFrame->prevPose); - auto correction = invBatchPose * _currentPresentFrameInfo.presentPose; - // _currentFrame->prevView * glm::inverse(_prevRenderView) : this is to get the - // view matrix of the last rendered frame in the present thread - auto prevCorrection = _currentFrame->prevView * glm::inverse(_prevRenderView); - prevCorrection = prevCorrection * invPrevBatchPose * _previousPresentFrameInfo.presentPose; - - getGLBackend()->setCameraCorrection(correction, prevCorrection); - - _previousPresentFrameInfo = _currentPresentFrameInfo; - _prevRenderView = _currentFrame->view; + auto batchPose = _currentFrame->pose; + auto correction = glm::inverse(_currentPresentFrameInfo.presentPose) * batchPose ; + getGLBackend()->setCameraCorrection(correction, _prevRenderView); + _prevRenderView = correction * _currentFrame->view; } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 7c63536c7b..098005aa0d 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -78,7 +78,6 @@ protected: QMap _frameInfos; FrameInfo _currentPresentFrameInfo; - FrameInfo _previousPresentFrameInfo; FrameInfo _currentRenderFrameInfo; mat4 _prevRenderView; RateCounter<> _stutterRate; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index 103a104aa8..b4e4656dc7 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -760,11 +760,11 @@ void GLBackend::recycle() const { Texture::KtxStorage::releaseOpenKtxFiles(); } -void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevCorrection, bool reset) { +void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView, bool reset) { auto invCorrection = glm::inverse(correction); - auto invPrevCorrection = glm::inverse(prevCorrection); - _transform._correction.prevCorrection = (reset ? correction : prevCorrection); - _transform._correction.prevCorrectionInverse = (reset ? invCorrection : invPrevCorrection); + auto invPrevView = glm::inverse(prevRenderView); + _transform._correction.prevView = (reset ? Mat4() : prevRenderView); + _transform._correction.prevViewInverse = (reset ? Mat4() : invPrevView); _transform._correction.correction = correction; _transform._correction.correctionInverse = invCorrection; _pipeline._cameraCorrectionBuffer._buffer->setSubData(0, _transform._correction); diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index 20259e7d4d..14a3d202f2 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, const Mat4& prevCorrection, bool reset = false); + void setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView, bool reset = false); void render(const Batch& batch) final override; // This call synchronize the Full Backend cache with the current GLState @@ -313,8 +313,8 @@ protected: struct CameraCorrection { mat4 correction; mat4 correctionInverse; - mat4 prevCorrection; - mat4 prevCorrectionInverse; + mat4 prevView; + mat4 prevViewInverse; }; struct TransformStageState { diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendTransform.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendTransform.cpp index f286a5cca9..72aaa5aa66 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendTransform.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendTransform.cpp @@ -105,7 +105,7 @@ void GLBackend::TransformStageState::preUpdate(size_t commandIndex, const Stereo if (_viewIsCamera && (_viewCorrectionEnabled && _correction.correction != glm::mat4())) { // FIXME should I switch to using the camera correction buffer in Transform.slf and leave this out? Transform result; - _view.mult(result, _view, _correction.correction); + _view.mult(result, _view, _correction.correctionInverse); if (_skybox) { result.setTranslation(vec3()); } diff --git a/libraries/gpu/src/gpu/Context.cpp b/libraries/gpu/src/gpu/Context.cpp index e4d8a88499..e1b68c88ca 100644 --- a/libraries/gpu/src/gpu/Context.cpp +++ b/libraries/gpu/src/gpu/Context.cpp @@ -53,15 +53,12 @@ const std::string& Context::getBackendVersion() const { return _backend->getVersion(); } -void Context::beginFrame(const glm::mat4& renderView, const glm::mat4& prevRenderView, - const glm::mat4& renderPose, const glm::mat4& prevRenderPose) { +void Context::beginFrame(const glm::mat4& renderView, const glm::mat4& renderPose) { assert(!_frameActive); _frameActive = true; _currentFrame = std::make_shared(); _currentFrame->pose = renderPose; - _currentFrame->prevPose = prevRenderPose; _currentFrame->view = renderView; - _currentFrame->prevView = prevRenderView; if (!_frameRangeTimer) { _frameRangeTimer = std::make_shared("gpu::Context::Frame"); diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 3667121c4e..2df7de2331 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -161,8 +161,7 @@ public: const std::string& getBackendVersion() const; - void beginFrame(const glm::mat4& renderView = glm::mat4(), const glm::mat4& prevRenderView = glm::mat4(), - const glm::mat4& renderPose = glm::mat4(), const glm::mat4& prevRenderPose = glm::mat4()); + void beginFrame(const glm::mat4& renderView = glm::mat4(), const glm::mat4& renderPose = glm::mat4()); void appendFrameBatch(Batch& batch); FramePointer endFrame(); diff --git a/libraries/gpu/src/gpu/Frame.h b/libraries/gpu/src/gpu/Frame.h index ea8e70c9bc..441e3c5b5d 100644 --- a/libraries/gpu/src/gpu/Frame.h +++ b/libraries/gpu/src/gpu/Frame.h @@ -30,12 +30,8 @@ namespace gpu { uint32_t frameIndex{ 0 }; /// The view matrix used for rendering the frame, only applicable for HMDs Mat4 view; - /// The view matrix used for rendering the previous frame, only applicable for HMDs - Mat4 prevView; /// The sensor pose used for rendering the frame, only applicable for HMDs Mat4 pose; - /// The sensor pose used for rendering the previous frame, only applicable for HMDs - Mat4 prevPose; /// The collection of batches which make up the frame Batches batches; /// The main thread updates to buffers that are applicable for this frame. diff --git a/libraries/render-utils/src/DeferredFrameTransform.cpp b/libraries/render-utils/src/DeferredFrameTransform.cpp index 34d3a56d23..d1c51bf46f 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.cpp +++ b/libraries/render-utils/src/DeferredFrameTransform.cpp @@ -31,10 +31,6 @@ 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 0b5cb6a989..8c2f0a7321 100644 --- a/libraries/render-utils/src/DeferredFrameTransform.h +++ b/libraries/render-utils/src/DeferredFrameTransform.h @@ -54,11 +54,6 @@ 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 3332eeb662..5fccbd6a99 100644 --- a/libraries/render-utils/src/DeferredTransform.slh +++ b/libraries/render-utils/src/DeferredTransform.slh @@ -17,8 +17,8 @@ struct CameraCorrection { mat4 _correction; mat4 _correctionInverse; - mat4 _prevCorrection; - mat4 _prevCorrectionInverse; + mat4 _prevView; + mat4 _prevViewInverse; }; uniform cameraCorrectionBuffer { @@ -35,8 +35,6 @@ struct DeferredFrameTransform { mat4 _projectionMono; mat4 _viewInverse; mat4 _view; - mat4 _prevViewInverse; - mat4 _prevView; }; uniform deferredFrameTransformBuffer { @@ -78,19 +76,19 @@ float getPosLinearDepthFar() { } mat4 getViewInverse() { - return frameTransform._viewInverse * cameraCorrection._correction; + return frameTransform._viewInverse * cameraCorrection._correctionInverse; } mat4 getView() { - return cameraCorrection._correctionInverse * frameTransform._view; + return cameraCorrection._correction * frameTransform._view; } mat4 getPreviousView() { - return cameraCorrection._prevCorrectionInverse * frameTransform._prevView; + return cameraCorrection._prevView; } mat4 getPreviousViewInverse() { - return frameTransform._prevViewInverse * cameraCorrection._prevCorrection; + return cameraCorrection._prevViewInverse; } DeferredFrameTransform getDeferredFrameTransform() { From d316b6e074d857e9578582cbf2a38f6c1d00735c Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 11:28:00 +0100 Subject: [PATCH 108/267] Fixed broken TAA on desktop... grrr. --- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 3 +++ .../src/display-plugins/OpenGLDisplayPlugin.h | 2 ++ .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 8 +++++--- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 31ed9572e9..db9b86b9dd 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -692,6 +692,9 @@ void OpenGLDisplayPlugin::present() { incrementPresentCount(); if (_currentFrame) { + auto correction = getViewCorrection(); + getGLBackend()->setCameraCorrection(correction, _prevRenderView); + _prevRenderView = correction * _currentFrame->view; { withPresentThreadLock([&] { _renderRate.increment(); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index bf06486095..bde7984ec0 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -118,6 +118,7 @@ protected: void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor, gpu::FramebufferPointer fbo); void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor); virtual void updateFrameData(); + virtual glm::mat4 getViewCorrection() { return glm::mat4(); } void withOtherThreadContext(std::function f) const; @@ -137,6 +138,7 @@ protected: gpu::FramePointer _currentFrame; gpu::Frame* _lastFrame { nullptr }; + mat4 _prevRenderView; gpu::FramebufferPointer _compositeFramebuffer; gpu::PipelinePointer _hudPipeline; gpu::PipelinePointer _mirrorHUDPipeline; diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 4e67ee3db8..2a32a7d5ce 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -336,12 +336,14 @@ void HmdDisplayPlugin::updateFrameData() { } updatePresentPose(); +} +glm::mat4 HmdDisplayPlugin::getViewCorrection() { if (_currentFrame) { auto batchPose = _currentFrame->pose; - auto correction = glm::inverse(_currentPresentFrameInfo.presentPose) * batchPose ; - getGLBackend()->setCameraCorrection(correction, _prevRenderView); - _prevRenderView = correction * _currentFrame->view; + return glm::inverse(_currentPresentFrameInfo.presentPose) * batchPose; + } else { + return glm::mat4(); } } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 098005aa0d..3639952524 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -59,6 +59,7 @@ protected: void customizeContext() override; void uncustomizeContext() override; void updateFrameData() override; + glm::mat4 getViewCorrection() override; std::array _eyeOffsets; std::array _eyeProjections; @@ -79,7 +80,6 @@ protected: QMap _frameInfos; FrameInfo _currentPresentFrameInfo; FrameInfo _currentRenderFrameInfo; - mat4 _prevRenderView; RateCounter<> _stutterRate; bool _disablePreview { true }; From c9a6d6bf148bd9c19365143c6199492ccdd51e2d Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 11:53:05 +0100 Subject: [PATCH 109/267] Added adjustable post sharpen filter --- .../render-utils/src/AntialiasingEffect.cpp | 4 ++++ .../render-utils/src/AntialiasingEffect.h | 9 ++++++--- libraries/render-utils/src/fxaa_blend.slf | 18 +++++++++++++++++- .../utilities/render/antialiasing.qml | 9 +++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 06cf4f6675..2cabba1243 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -246,6 +246,8 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { // Good to go add the brand new pipeline _blendPipeline = gpu::Pipeline::create(program, state); + _sharpenLoc = program->getUniforms().findLocation("sharpenIntensity"); + } return _blendPipeline; } @@ -280,6 +282,7 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { } void Antialiasing::configure(const Config& config) { + _sharpen = config.sharpen; _params.edit().blend = config.blend; _params.edit().covarianceGamma = config.covarianceGamma; @@ -363,6 +366,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setPipeline(getDebugBlendPipeline()); } else { batch.setPipeline(getBlendPipeline()); + batch._glUniform1f(_sharpenLoc, _sharpen); } batch.setResourceFramebufferSwapChainTexture(AntialiasingPass_NextMapSlot, _antialiasingBuffers, 1); batch.draw(gpu::TRIANGLE_STRIP, 4); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 0dc57f97cd..89209e5426 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -86,6 +86,7 @@ private: class AntialiasingConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float blend MEMBER blend NOTIFY dirty) + Q_PROPERTY(float sharpen MEMBER sharpen NOTIFY dirty) Q_PROPERTY(float covarianceGamma MEMBER covarianceGamma NOTIFY dirty) Q_PROPERTY(bool constrainColor MEMBER constrainColor NOTIFY dirty) @@ -106,8 +107,8 @@ class AntialiasingConfig : public render::Job::Config { public: AntialiasingConfig() : render::Job::Config(true) {} - float blend{ 0.075f }; - + float blend{ 0.05f }; + float sharpen{ 0.25f }; bool constrainColor{ true }; bool covarianceClipColor{ true }; @@ -134,7 +135,7 @@ signals: struct TAAParams { float nope{ 0.0f }; - float blend{ 0.1f }; + float blend{ 0.05f }; float covarianceGamma{ 1.0f }; float debugShowVelocityThreshold{ 1.0f }; @@ -199,6 +200,8 @@ private: gpu::PipelinePointer _debugBlendPipeline; TAAParamsBuffer _params; + float _sharpen{ 0.25f }; + int _sharpenLoc{ -1 }; }; diff --git a/libraries/render-utils/src/fxaa_blend.slf b/libraries/render-utils/src/fxaa_blend.slf index c38de8cb4e..7a10cecb94 100644 --- a/libraries/render-utils/src/fxaa_blend.slf +++ b/libraries/render-utils/src/fxaa_blend.slf @@ -18,7 +18,23 @@ in vec2 varTexCoord0; out vec4 outFragColor; uniform sampler2D colorTexture; +uniform float sharpenIntensity; void main(void) { - outFragColor = texture(colorTexture, varTexCoord0); + vec4 pixels[9]; + vec4 sharpenedPixel; + pixels[0] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(-1,-1), 0); + pixels[1] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(0,-1), 0); + pixels[2] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(1,-1), 0); + + pixels[3] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(-1,0), 0); + pixels[4] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy), 0); + pixels[5] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(1,0), 0); + + pixels[6] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(-1,1), 0); + pixels[7] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(0,1), 0); + pixels[8] = texelFetch(colorTexture, ivec2(gl_FragCoord.xy)+ivec2(1,1), 0); + + sharpenedPixel = pixels[4]*7.8 - (pixels[1]+pixels[3]+pixels[5]+pixels[7]) - (pixels[0]+pixels[2]+pixels[6]+pixels[8])*0.7; + outFragColor = mix(pixels[4], sharpenedPixel, sharpenIntensity); } diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 26b9e09c09..8487c9160a 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -137,6 +137,15 @@ Rectangle { max: 1.0 min: 0.0 } + + ConfigSlider { + label: qsTr("Post sharpen") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "sharpen" + max: 1.0 + min: 0.0 + } } Separator {} From 095f426f31b73835f148f567d47c6adcaed996bf Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 14:43:22 +0100 Subject: [PATCH 110/267] Adjusted default sharpen --- libraries/render-utils/src/AntialiasingEffect.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 89209e5426..1c4c0d56ce 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -108,7 +108,7 @@ public: AntialiasingConfig() : render::Job::Config(true) {} float blend{ 0.05f }; - float sharpen{ 0.25f }; + float sharpen{ 0.15f }; bool constrainColor{ true }; bool covarianceClipColor{ true }; @@ -200,7 +200,7 @@ private: gpu::PipelinePointer _debugBlendPipeline; TAAParamsBuffer _params; - float _sharpen{ 0.25f }; + float _sharpen{ 0.15f }; int _sharpenLoc{ -1 }; }; From 6a550e983f3c1b6720ce291dbca1ea34566d20cf Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 14:46:37 +0100 Subject: [PATCH 111/267] Disable sharpen with FXAA --- libraries/render-utils/src/AntialiasingEffect.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 2cabba1243..fab976b201 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -366,7 +366,8 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setPipeline(getDebugBlendPipeline()); } else { batch.setPipeline(getBlendPipeline()); - batch._glUniform1f(_sharpenLoc, _sharpen); + // Disable sharpen if FXAA + batch._glUniform1f(_sharpenLoc, _sharpen * _params.get().regionInfo.z); } batch.setResourceFramebufferSwapChainTexture(AntialiasingPass_NextMapSlot, _antialiasingBuffers, 1); batch.draw(gpu::TRIANGLE_STRIP, 4); From f9de255fa7d294c08452591b2c81fa1471d87bca Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Fri, 23 Feb 2018 20:07:09 +0300 Subject: [PATCH 112/267] FB12523 - HMD: Commerce specific disabled preview is not dismissed when user leaves page without entering credentials --- .../resources/qml/hifi/commerce/wallet/PassphraseModal.qml | 4 ++++ scripts/system/marketplaces/marketplaces.js | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml index f1692acb3d..1fa9054d69 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml @@ -69,6 +69,10 @@ Item { hoverEnabled: true; } + Component.onDestruction: { + sendSignalToParent({method: 'maybeEnableHmdPreview'}); + } + // This will cause a bug -- if you bring up passphrase selection in HUD mode while // in HMD while having HMD preview enabled, then move, then finish passphrase selection, // HMD preview will stay off. diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js index 631b5e97ac..bb31d718e2 100644 --- a/scripts/system/marketplaces/marketplaces.js +++ b/scripts/system/marketplaces/marketplaces.js @@ -115,13 +115,15 @@ var selectionDisplay = null; // for gridTool.js to ignore var filterText; // Used for updating Purchases QML var onWalletScreen = false; + var onCommerceScreen = false; + function onScreenChanged(type, url) { onMarketplaceScreen = type === "Web" && url.indexOf(MARKETPLACE_URL) !== -1; var onWalletScreenNow = url.indexOf(MARKETPLACE_WALLET_QML_PATH) !== -1; - onCommerceScreen = type === "QML" && (url.indexOf(MARKETPLACE_CHECKOUT_QML_PATH) !== -1 || url === MARKETPLACE_PURCHASES_QML_PATH + var onCommerceScreenNow = type === "QML" && (url.indexOf(MARKETPLACE_CHECKOUT_QML_PATH) !== -1 || url === MARKETPLACE_PURCHASES_QML_PATH || url.indexOf(MARKETPLACE_INSPECTIONCERTIFICATE_QML_PATH) !== -1); - if (!onWalletScreenNow && onWalletScreen) { // exiting wallet screen + if ((!onWalletScreenNow && onWalletScreen) || (!onCommerceScreenNow && onCommerceScreen)) { // exiting wallet or commerce screen if (isHmdPreviewDisabledBySecurity) { DesktopPreviewProvider.setPreviewDisabledReason("USER"); Menu.setIsOptionChecked("Disable Preview", false); @@ -129,6 +131,7 @@ var selectionDisplay = null; // for gridTool.js to ignore } } + onCommerceScreen = onCommerceScreenNow; onWalletScreen = onWalletScreenNow; wireEventBridge(onMarketplaceScreen || onCommerceScreen || onWalletScreen); From b1b62087e5715f1969664819d4b94c4fbacd0e0d Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 18:08:21 +0100 Subject: [PATCH 113/267] Forgot to reactivate deadlock detection --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a3fc55703f..efb78351ad 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -488,7 +488,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 } } From c935111c43af619ab2f2fabf9c0c2a516c9a812b Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 18:13:08 +0100 Subject: [PATCH 114/267] Some slight cleanup in Application_render --- interface/src/Application_render.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/Application_render.cpp b/interface/src/Application_render.cpp index d17c5dbef7..e1015ca5d1 100644 --- a/interface/src/Application_render.cpp +++ b/interface/src/Application_render.cpp @@ -62,9 +62,7 @@ void Application::paintGL() { RenderArgs renderArgs; glm::mat4 HMDSensorPose; - glm::mat4 HMDSensorPrevPose; glm::mat4 eyeToWorld; - glm::mat4 prevEyeToWorld; glm::mat4 sensorToWorld; bool isStereo; From 37fdf81f1bfd932ef471e7c5769e7f53376ed107 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 19:37:12 +0100 Subject: [PATCH 115/267] Fix warnings on mac and ubuntu --- libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp | 4 ++++ libraries/gpu/src/gpu/Batch.cpp | 2 -- libraries/gpu/src/gpu/Buffer.cpp | 5 +++-- libraries/render-utils/src/AntialiasingEffect.h | 3 --- libraries/render-utils/src/VelocityBufferPass.cpp | 1 - 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp index c67f8d7de8..560b7337c7 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexelFormat.cpp @@ -185,6 +185,8 @@ GLenum GLTexelFormat::evalGLTexelFormatInternal(const gpu::Element& dstFormat) { break; case gpu::NUINT32: case gpu::NINT32: + case gpu::NUINT2: + case gpu::NINT2_10_10_10: case gpu::COMPRESSED: case gpu::NUM_TYPES: // quiet compiler Q_UNREACHABLE(); @@ -663,6 +665,8 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E break; case gpu::NUINT32: case gpu::NINT32: + case gpu::NUINT2: + case gpu::NINT2_10_10_10: case gpu::COMPRESSED: case gpu::NUM_TYPES: // quiet compiler Q_UNREACHABLE(); diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index 3446bc7db7..e375a50ecc 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -42,8 +42,6 @@ Batch::Batch(const char* name) { if (name) { _name = name; } -#else - (void*)name; #endif _commands.reserve(_commandsMax); _commandOffsets.reserve(_commandOffsetsMax); diff --git a/libraries/gpu/src/gpu/Buffer.cpp b/libraries/gpu/src/gpu/Buffer.cpp index 02e6c552cf..ebb768e597 100644 --- a/libraries/gpu/src/gpu/Buffer.cpp +++ b/libraries/gpu/src/gpu/Buffer.cpp @@ -98,8 +98,9 @@ Buffer::Update::Update(const Buffer& parent) : buffer(parent) { void Buffer::Update::apply() const { // Make sure we're loaded in order - auto applyUpdateCount = ++buffer._applyUpdateCount; - assert(applyUpdateCount == updateNumber); + buffer._applyUpdateCount++; + assert(buffer._applyUpdateCount == updateNumber); + const auto pageSize = buffer._pages._pageSize; buffer._renderSysmem.resize(size); buffer._renderPages.accommodate(size); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 1c4c0d56ce..3c27e8f67c 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -189,9 +189,6 @@ public: private: - // Uniforms for AA - gpu::int32 _texcoordOffsetLoc; - gpu::FramebufferSwapChainPointer _antialiasingBuffers; gpu::TexturePointer _antialiasingTextures[2]; diff --git a/libraries/render-utils/src/VelocityBufferPass.cpp b/libraries/render-utils/src/VelocityBufferPass.cpp index e298110345..78471d48af 100644 --- a/libraries/render-utils/src/VelocityBufferPass.cpp +++ b/libraries/render-utils/src/VelocityBufferPass.cpp @@ -18,7 +18,6 @@ const int VelocityBufferPass_FrameTransformSlot = 0; const int VelocityBufferPass_DepthMapSlot = 0; -const int VelocityBufferPass_NormalMapSlot = 1; #include "velocityBuffer_cameraMotion_frag.h" From 65f3408458a37377c44d12e3c643b2e3a4e848b5 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 20:19:55 +0100 Subject: [PATCH 116/267] Fixed compilation error with GLES backend on Android --- libraries/gpu-gles/src/gpu/gl/GLBackend.cpp | 8 ++++++-- libraries/gpu-gles/src/gpu/gl/GLBackend.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp index fc1bc39929..fb1b460242 100644 --- a/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp @@ -749,9 +749,13 @@ void GLBackend::recycle() const { Texture::KtxStorage::releaseOpenKtxFiles(); } -void GLBackend::setCameraCorrection(const Mat4& correction) { +void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView) { + auto invCorrection = glm::inverse(correction); + auto invPrevView = glm::inverse(prevRenderView); + _transform._correction.prevView = (reset ? Mat4() : prevRenderView); + _transform._correction.prevViewInverse = (reset ? Mat4() : invPrevView); _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-gles/src/gpu/gl/GLBackend.h b/libraries/gpu-gles/src/gpu/gl/GLBackend.h index 3681fc0492..5635e5b532 100644 --- a/libraries/gpu-gles/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gles/src/gpu/gl/GLBackend.h @@ -65,7 +65,7 @@ public: virtual ~GLBackend(); - void setCameraCorrection(const Mat4& correction); + void setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView, bool reset = false); void render(const Batch& batch) final override; // This call synchronize the Full Backend cache with the current GLState From d3114cbc672f0d91fccb550e6d5db3c01d6caac5 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 23 Feb 2018 21:52:45 +0100 Subject: [PATCH 117/267] Android compilation fixes again --- libraries/gpu-gles/src/gpu/gl/GLBackend.cpp | 2 +- libraries/gpu-gles/src/gpu/gl/GLBackend.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp index fb1b460242..e8e89a1da6 100644 --- a/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gles/src/gpu/gl/GLBackend.cpp @@ -749,7 +749,7 @@ void GLBackend::recycle() const { Texture::KtxStorage::releaseOpenKtxFiles(); } -void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView) { +void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRenderView, bool reset) { auto invCorrection = glm::inverse(correction); auto invPrevView = glm::inverse(prevRenderView); _transform._correction.prevView = (reset ? Mat4() : prevRenderView); diff --git a/libraries/gpu-gles/src/gpu/gl/GLBackend.h b/libraries/gpu-gles/src/gpu/gl/GLBackend.h index 5635e5b532..33bec07854 100644 --- a/libraries/gpu-gles/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gles/src/gpu/gl/GLBackend.h @@ -303,6 +303,8 @@ protected: struct CameraCorrection { Mat4 correction; Mat4 correctionInverse; + Mat4 prevView; + Mat4 prevViewInverse; }; struct TransformStageState { From b56f755034bcd578cf4c2e6419531d6ef24a317c Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 23 Feb 2018 15:10:49 -0800 Subject: [PATCH 118/267] material reflection --- interface/src/ui/overlays/ModelOverlay.cpp | 4 + .../src/avatars-renderer/Avatar.cpp | 4 + .../src/RenderableModelEntityItem.cpp | 4 + .../src/RenderableShapeEntityItem.cpp | 8 +- libraries/gpu/src/gpu/Texture.cpp | 10 -- libraries/gpu/src/gpu/Texture.h | 7 +- libraries/graphics-scripting/CMakeLists.txt | 2 +- .../src/graphics-scripting/Forward.h | 43 +++++- .../src/graphics-scripting/ScriptableMesh.cpp | 58 ++++++++ .../graphics-scripting/ScriptableModel.cpp | 124 ++++++++++++++++++ .../src/graphics-scripting/ScriptableModel.h | 7 +- libraries/graphics/src/graphics/Material.h | 1 + .../src/model-networking/MaterialCache.cpp | 7 + .../src/model-networking/TextureCache.cpp | 4 +- .../render-utils/src/CauterizedModel.cpp | 2 + libraries/render-utils/src/Model.cpp | 8 ++ 16 files changed, 272 insertions(+), 21 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index ffcc18032c..47dd8f45f9 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -671,5 +671,9 @@ scriptable::ScriptableModelBase ModelOverlay::getScriptableModel() { } auto result = _model->getScriptableModel(); result.objectID = getID(); + { + std::lock_guard lock(_materialsLock); + result.appendMaterials(_materials); + } return result; } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 25ddfba670..db20f9144d 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1801,5 +1801,9 @@ scriptable::ScriptableModelBase Avatar::getScriptableModel() { } auto result = _skeletonModel->getScriptableModel(); result.objectID = getSessionUUID(); + { + std::lock_guard lock(_materialsLock); + result.appendMaterials(_materials); + } return result; } \ No newline at end of file diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index f3c99cde2d..5c95d1e556 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -970,6 +970,10 @@ scriptable::ScriptableModelBase render::entities::ModelEntityRenderer::getScript auto result = _model->getScriptableModel(); result.objectID = getEntity()->getID(); + { + std::lock_guard lock(_materialsLock); + result.appendMaterials(_materials); + } return result; } diff --git a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp index 22cd98b08a..e5cbfdb59d 100644 --- a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp @@ -169,8 +169,12 @@ scriptable::ScriptableModelBase ShapeEntityRenderer::getScriptableModel() { auto geometryCache = DependencyManager::get(); auto geometryShape = geometryCache->getShapeForEntityShape(_shape); glm::vec3 vertexColor; - if (_materials["0"].top().material) { - vertexColor = _materials["0"].top().material->getAlbedo(); + { + std::lock_guard lock(_materialsLock); + result.appendMaterials(_materials); + if (_materials["0"].top().material) { + vertexColor = _materials["0"].top().material->getAlbedo(); + } } if (auto mesh = geometryCache->meshFromShape(geometryShape, vertexColor)) { result.objectID = getEntity()->getID(); diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index 4a588c3c84..ed9505766b 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -868,16 +868,6 @@ void SphericalHarmonics::evalFromTexture(const Texture& texture) { // TextureSource -TextureSource::TextureSource() { -} - -TextureSource::~TextureSource() { -} - -void TextureSource::reset(const QUrl& url) { - _imageUrl = url; -} - void TextureSource::resetTexture(gpu::TexturePointer texture) { _gpuTexture = texture; } diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index ad3dc5fada..a03b894e0d 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -647,13 +647,11 @@ typedef std::vector TextureViews; // It provides the mechanism to create a texture using a customizable TextureLoader class TextureSource { public: - TextureSource(); - ~TextureSource(); + TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {} const QUrl& getUrl() const { return _imageUrl; } const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; } - - void reset(const QUrl& url); + int getType() const { return _type; } void resetTexture(gpu::TexturePointer texture); @@ -662,6 +660,7 @@ public: protected: gpu::TexturePointer _gpuTexture; QUrl _imageUrl; + int _type { 0 }; }; typedef std::shared_ptr< TextureSource > TextureSourcePointer; diff --git a/libraries/graphics-scripting/CMakeLists.txt b/libraries/graphics-scripting/CMakeLists.txt index ad8055b647..0f59fb41f8 100644 --- a/libraries/graphics-scripting/CMakeLists.txt +++ b/libraries/graphics-scripting/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME graphics-scripting) setup_hifi_library() -link_hifi_libraries(shared networking graphics fbx model-networking script-engine) +link_hifi_libraries(shared networking graphics fbx image model-networking script-engine) include_hifi_library_headers(gpu) diff --git a/libraries/graphics-scripting/src/graphics-scripting/Forward.h b/libraries/graphics-scripting/src/graphics-scripting/Forward.h index 94a96446a0..b07c25ee02 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/Forward.h +++ b/libraries/graphics-scripting/src/graphics-scripting/Forward.h @@ -6,9 +6,14 @@ #include #include #include +#include #include #include + +#include "graphics/Material.h" +#include "graphics/TextureMap.h" + namespace graphics { class Mesh; } @@ -31,6 +36,38 @@ namespace scriptable { using ModelProviderPointer = std::shared_ptr; using WeakModelProviderPointer = std::weak_ptr; + class ScriptableMaterial { + public: + ScriptableMaterial() {} + ScriptableMaterial(const graphics::MaterialLayer& materialLayer); + ScriptableMaterial(const ScriptableMaterial& material) { *this = material; } + ScriptableMaterial& operator=(const ScriptableMaterial& material); + + QString name; + QString model; + float opacity; + float roughness; + float metallic; + float scattering; + bool unlit; + glm::vec3 emissive; + glm::vec3 albedo; + QString emissiveMap; + QString albedoMap; + QString opacityMap; + QString metallicMap; + QString specularMap; + QString roughnessMap; + QString glossMap; + QString normalMap; + QString bumpMap; + QString occlusionMap; + QString lightmapMap; + QString scatteringMap; + quint16 priority; + }; + typedef QHash> MultiMaterialMap; + class ScriptableMeshBase : public QObject { Q_OBJECT public: @@ -55,6 +92,8 @@ namespace scriptable { WeakModelProviderPointer provider; QUuid objectID; // spatially nestable ID QVector meshes; + MultiMaterialMap materials; + QVector materialNames; ScriptableModelBase(QObject* parent = nullptr) : QObject(parent) {} ScriptableModelBase(const ScriptableModelBase& other) : QObject(other.parent()) { *this = other; } @@ -63,9 +102,11 @@ namespace scriptable { void append(const ScriptableMeshBase& mesh); void append(scriptable::WeakMeshPointer mesh); + void appendMaterial(const graphics::MaterialLayer& material, int shapeID, std::string materialName); + void appendMaterials(const std::unordered_map& materialsToAppend); + void appendMaterialNames(const std::vector& names); // TODO: in future containers for these could go here // QVariantMap shapes; - // QVariantMap materials; // QVariantMap armature; }; diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp index 76741947fd..7da69fcad2 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp @@ -554,6 +554,57 @@ namespace { qScriptValueToSequence(array, result); } + QScriptValue qVectorScriptableMaterialToScriptValue(QScriptEngine* engine, const QVector& vector) { + return qScriptValueFromSequence(engine, vector); + } + + void qVectorScriptableMaterialFromScriptValue(const QScriptValue& array, QVector& result) { + qScriptValueToSequence(array, result); + } + + QScriptValue scriptableMaterialToScriptValue(QScriptEngine* engine, const scriptable::ScriptableMaterial &material) { + QScriptValue obj = engine->newObject(); + obj.setProperty("name", material.name); + obj.setProperty("model", material.model); + obj.setProperty("opacity", material.opacity); + obj.setProperty("roughness", material.roughness); + obj.setProperty("metallic", material.metallic); + obj.setProperty("scattering", material.scattering); + obj.setProperty("unlit", material.unlit); + obj.setProperty("emissive", vec3toScriptValue(engine, material.emissive)); + obj.setProperty("albedo", vec3toScriptValue(engine, material.albedo)); + obj.setProperty("emissiveMap", material.emissiveMap); + obj.setProperty("albedoMap", material.albedoMap); + obj.setProperty("opacityMap", material.opacityMap); + obj.setProperty("metallicMap", material.metallicMap); + obj.setProperty("specularMap", material.specularMap); + obj.setProperty("roughnessMap", material.roughnessMap); + obj.setProperty("glossMap", material.glossMap); + obj.setProperty("normalMap", material.normalMap); + obj.setProperty("bumpMap", material.bumpMap); + obj.setProperty("occlusionMap", material.occlusionMap); + obj.setProperty("lightmapMap", material.lightmapMap); + obj.setProperty("scatteringMap", material.scatteringMap); + obj.setProperty("priority", material.priority); + return obj; + } + + void scriptableMaterialFromScriptValue(const QScriptValue &object, scriptable::ScriptableMaterial& material) { + // No need to convert from QScriptValue to ScriptableMaterial + } + + QScriptValue multiMaterialMapToScriptValue(QScriptEngine* engine, const scriptable::MultiMaterialMap& map) { + QScriptValue obj = engine->newObject(); + for (auto key : map.keys()) { + obj.setProperty(key, qVectorScriptableMaterialToScriptValue(engine, map[key])); + } + return obj; + } + + void multiMaterialMapFromScriptValue(const QScriptValue& map, scriptable::MultiMaterialMap& result) { + // No need to convert from QScriptValue to MultiMaterialMap + } + QVector metaTypeIds{ qRegisterMetaType("uint32"), qRegisterMetaType("scriptable::uint32"), @@ -562,6 +613,9 @@ namespace { qRegisterMetaType(), qRegisterMetaType(), qRegisterMetaType(), + qRegisterMetaType(), + qRegisterMetaType>(), + qRegisterMetaType() }; } @@ -570,11 +624,15 @@ namespace scriptable { qScriptRegisterSequenceMetaType>(engine); qScriptRegisterSequenceMetaType>(engine); qScriptRegisterSequenceMetaType>(engine); + qScriptRegisterSequenceMetaType>(engine); qScriptRegisterMetaType(engine, qVectorUInt32ToScriptValue, qVectorUInt32FromScriptValue); qScriptRegisterMetaType(engine, modelPointerToScriptValue, modelPointerFromScriptValue); qScriptRegisterMetaType(engine, meshPointerToScriptValue, meshPointerFromScriptValue); qScriptRegisterMetaType(engine, meshPartPointerToScriptValue, meshPartPointerFromScriptValue); + qScriptRegisterMetaType(engine, scriptableMaterialToScriptValue, scriptableMaterialFromScriptValue); + qScriptRegisterMetaType(engine, qVectorScriptableMaterialToScriptValue, qVectorScriptableMaterialFromScriptValue); + qScriptRegisterMetaType(engine, multiMaterialMapToScriptValue, multiMaterialMapFromScriptValue); return metaTypeIds.size(); } diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp index 8ceb7de6a2..9a4bfe60b6 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp @@ -14,14 +14,115 @@ #include +#include "graphics/Material.h" + +#include "image/Image.h" + // #define SCRIPTABLE_MESH_DEBUG 1 +scriptable::ScriptableMaterial& scriptable::ScriptableMaterial::operator=(const scriptable::ScriptableMaterial& material) { + name = material.name; + model = material.model; + opacity = material.opacity; + roughness = material.roughness; + metallic = material.metallic; + scattering = material.scattering; + unlit = material.unlit; + emissive = material.emissive; + albedo = material.albedo; + emissiveMap = material.emissiveMap; + albedoMap = material.albedoMap; + opacityMap = material.opacityMap; + metallicMap = material.metallicMap; + specularMap = material.specularMap; + roughnessMap = material.roughnessMap; + glossMap = material.glossMap; + normalMap = material.normalMap; + bumpMap = material.bumpMap; + occlusionMap = material.occlusionMap; + lightmapMap = material.lightmapMap; + scatteringMap = material.scatteringMap; + priority = material.priority; + + return *this; +} + +scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer& materialLayer) : + name(materialLayer.material->getName().c_str()), + model(materialLayer.material->getModel().c_str()), + opacity(materialLayer.material->getOpacity()), + roughness(materialLayer.material->getRoughness()), + metallic(materialLayer.material->getMetallic()), + scattering(materialLayer.material->getScattering()), + unlit(materialLayer.material->isUnlit()), + emissive(materialLayer.material->getEmissive()), + albedo(materialLayer.material->getAlbedo()), + priority(materialLayer.priority) +{ + auto map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::EMISSIVE_MAP); + if (map && map->getTextureSource()) { + emissiveMap = map->getTextureSource()->getUrl().toString(); + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::ALBEDO_MAP); + if (map && map->getTextureSource()) { + albedoMap = map->getTextureSource()->getUrl().toString(); + if (map->useAlphaChannel()) { + opacityMap = albedoMap; + } + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::METALLIC_MAP); + if (map && map->getTextureSource()) { + if (map->getTextureSource()->getType() == image::TextureUsage::Type::METALLIC_TEXTURE) { + metallicMap = map->getTextureSource()->getUrl().toString(); + } else if (map->getTextureSource()->getType() == image::TextureUsage::Type::SPECULAR_TEXTURE) { + specularMap = map->getTextureSource()->getUrl().toString(); + } + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::ROUGHNESS_MAP); + if (map && map->getTextureSource()) { + if (map->getTextureSource()->getType() == image::TextureUsage::Type::ROUGHNESS_TEXTURE) { + roughnessMap = map->getTextureSource()->getUrl().toString(); + } else if (map->getTextureSource()->getType() == image::TextureUsage::Type::GLOSS_TEXTURE) { + glossMap = map->getTextureSource()->getUrl().toString(); + } + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::NORMAL_MAP); + if (map && map->getTextureSource()) { + if (map->getTextureSource()->getType() == image::TextureUsage::Type::NORMAL_TEXTURE) { + normalMap = map->getTextureSource()->getUrl().toString(); + } else if (map->getTextureSource()->getType() == image::TextureUsage::Type::BUMP_TEXTURE) { + bumpMap = map->getTextureSource()->getUrl().toString(); + } + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::OCCLUSION_MAP); + if (map && map->getTextureSource()) { + occlusionMap = map->getTextureSource()->getUrl().toString(); + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::LIGHTMAP_MAP); + if (map && map->getTextureSource()) { + lightmapMap = map->getTextureSource()->getUrl().toString(); + } + + map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::SCATTERING_MAP); + if (map && map->getTextureSource()) { + scatteringMap = map->getTextureSource()->getUrl().toString(); + } +} + scriptable::ScriptableModelBase& scriptable::ScriptableModelBase::operator=(const scriptable::ScriptableModelBase& other) { provider = other.provider; objectID = other.objectID; for (const auto& mesh : other.meshes) { append(mesh); } + materials = other.materials; + materialNames = other.materialNames; return *this; } @@ -34,6 +135,8 @@ scriptable::ScriptableModelBase::~ScriptableModelBase() { m.strongMesh.reset(); } meshes.clear(); + materials.clear(); + materialNames.clear(); } void scriptable::ScriptableModelBase::append(scriptable::WeakMeshPointer mesh) { @@ -47,6 +150,27 @@ void scriptable::ScriptableModelBase::append(const ScriptableMeshBase& mesh) { meshes << mesh; } +void scriptable::ScriptableModelBase::appendMaterial(const graphics::MaterialLayer& material, int shapeID, std::string materialName) { + materials[QString::number(shapeID)].push_back(ScriptableMaterial(material)); + materials["mat::" + QString::fromStdString(materialName)].push_back(ScriptableMaterial(material)); +} + +void scriptable::ScriptableModelBase::appendMaterials(const std::unordered_map& materialsToAppend) { + auto materialsToAppendCopy = materialsToAppend; + for (auto& multiMaterial : materialsToAppendCopy) { + while (!multiMaterial.second.empty()) { + materials[QString(multiMaterial.first.c_str())].push_back(ScriptableMaterial(multiMaterial.second.top())); + multiMaterial.second.pop(); + } + } +} + +void scriptable::ScriptableModelBase::appendMaterialNames(const std::vector& names) { + for (auto& name : names) { + materialNames.append(QString::fromStdString(name)); + } +} + QString scriptable::ScriptableModel::toString() const { return QString("[ScriptableModel%1%2 numMeshes=%3]") .arg(objectID.isNull() ? "" : " objectID="+objectID.toString()) diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h index 4ed1cc9554..9dc4c6f1ca 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h @@ -19,6 +19,8 @@ namespace scriptable { Q_PROPERTY(QUuid objectID MEMBER objectID CONSTANT) Q_PROPERTY(uint32 numMeshes READ getNumMeshes) Q_PROPERTY(QVector meshes READ getMeshes) + Q_PROPERTY(scriptable::MultiMaterialMap materials READ getMaterials) + Q_PROPERTY(QVector materialNames READ getMaterialNames) ScriptableModel(QObject* parent = nullptr) : ScriptableModelBase(parent) {} ScriptableModel(const ScriptableModel& other) : ScriptableModelBase(other) {} @@ -28,7 +30,6 @@ namespace scriptable { Q_INVOKABLE scriptable::ScriptableModelPointer cloneModel(const QVariantMap& options = QVariantMap()); // TODO: in future accessors for these could go here // QVariantMap shapes; - // QVariantMap materials; // QVariantMap armature; QVector getMeshes(); @@ -37,6 +38,8 @@ namespace scriptable { return QPointer(qobject_cast(this)); } + scriptable::MultiMaterialMap getMaterials() { return materials; } + QVector getMaterialNames() { return materialNames; } // QScriptEngine-specific wrappers Q_INVOKABLE uint32 mapAttributeValues(QScriptValue callback); @@ -51,3 +54,5 @@ Q_DECLARE_METATYPE(scriptable::WeakMeshPointer) Q_DECLARE_METATYPE(scriptable::ScriptableModelPointer) Q_DECLARE_METATYPE(scriptable::ScriptableModelBase) Q_DECLARE_METATYPE(scriptable::ScriptableModelBasePointer) +Q_DECLARE_METATYPE(scriptable::ScriptableMaterial) +Q_DECLARE_METATYPE(scriptable::MultiMaterialMap) diff --git a/libraries/graphics/src/graphics/Material.h b/libraries/graphics/src/graphics/Material.h index 632cf99391..f34f68c04a 100755 --- a/libraries/graphics/src/graphics/Material.h +++ b/libraries/graphics/src/graphics/Material.h @@ -358,6 +358,7 @@ public: const std::string& getName() { return _name; } + const std::string& getModel() { return _model; } void setModel(const std::string& model) { _model = model; } protected: diff --git a/libraries/model-networking/src/model-networking/MaterialCache.cpp b/libraries/model-networking/src/model-networking/MaterialCache.cpp index 8d9d6571f8..85f2f43652 100644 --- a/libraries/model-networking/src/model-networking/MaterialCache.cpp +++ b/libraries/model-networking/src/model-networking/MaterialCache.cpp @@ -11,6 +11,8 @@ #include "QJsonDocument" #include "QJsonArray" +#include "RegisteredMetaTypes.h" + NetworkMaterialResource::NetworkMaterialResource(const QUrl& url) : Resource(url) {} @@ -39,6 +41,11 @@ bool NetworkMaterialResource::parseJSONColor(const QJsonValue& array, glm::vec3& color = glm::vec3(colorArray[0].toDouble(), colorArray[1].toDouble(), colorArray[2].toDouble()); return true; } + } else if (array.isObject()) { + bool toReturn; + isSRGB = true; + color = vec3FromVariant(array.toObject(), toReturn); + return toReturn; } return false; } diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 3a29139ee7..9b12c34f87 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -291,7 +291,7 @@ _type(), _sourceIsKTX(false), _maxNumPixels(100) { - _textureSource = std::make_shared(); + _textureSource = std::make_shared(url); _lowestRequestedMipLevel = 0; _loaded = true; } @@ -303,7 +303,7 @@ NetworkTexture::NetworkTexture(const QUrl& url, image::TextureUsage::Type type, _sourceIsKTX(url.path().endsWith(".ktx")), _maxNumPixels(maxNumPixels) { - _textureSource = std::make_shared(); + _textureSource = std::make_shared(url, (int)type); _lowestRequestedMipLevel = 0; _shouldFailOnRedirect = !_sourceIsKTX; diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 54dfd96a00..5685a85349 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -57,6 +57,7 @@ void CauterizedModel::createVisibleRenderItemSet() { Q_ASSERT(_modelMeshRenderItems.isEmpty()); _modelMeshRenderItems.clear(); + _modelMeshMaterialNames.clear(); _modelMeshRenderItemShapes.clear(); Transform transform; @@ -81,6 +82,7 @@ void CauterizedModel::createVisibleRenderItemSet() { for (int partIndex = 0; partIndex < numParts; partIndex++) { auto ptr = std::make_shared(shared_from_this(), i, partIndex, shapeID, transform, offset); _modelMeshRenderItems << std::static_pointer_cast(ptr); + _modelMeshMaterialNames.push_back(getGeometry()->getShapeMaterial(shapeID)->getName()); _modelMeshRenderItemShapes.emplace_back(ShapeInfo{ (int)i }); shapeID++; } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 6d735497c0..f55b3c598d 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -629,12 +629,20 @@ scriptable::ScriptableModelBase Model::getScriptableModel() { const FBXGeometry& geometry = getFBXGeometry(); int numberOfMeshes = geometry.meshes.size(); + int shapeID = 0; for (int i = 0; i < numberOfMeshes; i++) { const FBXMesh& fbxMesh = geometry.meshes.at(i); if (auto mesh = fbxMesh._mesh) { result.append(mesh); + + int numParts = (int)mesh->getNumParts(); + for (int partIndex = 0; partIndex < numParts; partIndex++) { + result.appendMaterial(graphics::MaterialLayer(getGeometry()->getShapeMaterial(shapeID), 0), shapeID, _modelMeshMaterialNames[shapeID]); + shapeID++; + } } } + result.appendMaterialNames(_modelMeshMaterialNames); return result; } From b81f69d97a7aabaf2f6dc50e573dad7cb065fd45 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 23 Feb 2018 18:40:16 -0800 Subject: [PATCH 119/267] WIP - recursive tests. --- tools/auto-tester/src/Test.cpp | 13 +++++++------ tools/auto-tester/src/Test.h | 1 + tools/auto-tester/src/ui/AutoTester.cpp | 4 ++++ tools/auto-tester/src/ui/AutoTester.h | 1 + tools/auto-tester/src/ui/AutoTester.ui | 21 +++++++++++++++++---- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 816eac7fbd..931a940760 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -319,11 +319,12 @@ void Test::createRecursiveScript() { return; } - QFile allTestsFilename(topLevelDirectory + "/" + "allTests.js"); + const QString recursiveTestsFilename("testRecursive.js"); + QFile allTestsFilename(topLevelDirectory + "/" + recursiveTestsFilename); if (!allTestsFilename.open(QIODevice::WriteOnly | QIODevice::Text)) { messageBox.critical(0, "Internal Error", - "Failed to create \"allTests.js\" in directory \"" + topLevelDirectory + "\"" + "Failed to create \"" + recursiveTestsFilename + "\" in directory \"" + topLevelDirectory + "\"" ); exit(-1); @@ -335,9 +336,6 @@ void Test::createRecursiveScript() { textStream << "var autoTester = Script.require(\"https://github.com/highfidelity/hifi_tests/blob/master/tests/utils/autoTester.js?raw=true\");" << endl; textStream << "autoTester.enableRecursive();" << endl << endl; - // The main will call each test after the previous test is completed - // This is implemented with an interval timer that periodically tests if a - // running test has increment a testNumber variable that it received as an input. QVector testPathnames; // First test if top-level folder has a test.js file @@ -371,7 +369,7 @@ void Test::createRecursiveScript() { } if (testPathnames.length() <= 0) { - messageBox.information(0, "Failure", "No \"test.js\" files found"); + messageBox.information(0, "Failure", "No \"" + TEST_FILENAME + "\" files found"); allTestsFilename.close(); return; } @@ -383,6 +381,9 @@ void Test::createRecursiveScript() { messageBox.information(0, "Success", "Script has been created"); } +void Test::createRecursiveScriptsRecursively() { +} + void Test::createTest() { // Rename files sequentially, as ExpectedResult_1.jpeg, ExpectedResult_2.jpg and so on // Any existing expected result images will be deleted diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 3177df4d47..3da5badb6d 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -26,6 +26,7 @@ public: void evaluateTests(bool interactiveMode, QProgressBar* progressBar); void evaluateTestsRecursively(bool interactiveMode, QProgressBar* progressBar); void createRecursiveScript(); + void createRecursiveScriptsRecursively(); void createTest(); void deleteOldSnapshots(); diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 2834ff81e0..18eef13e6e 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -30,6 +30,10 @@ void AutoTester::on_createRecursiveScriptButton_clicked() { test.createRecursiveScript(); } +void AutoTester::on_createRecursiveScriptsRecursivelyButton_clicked() { + test.createRecursiveScriptsRecursively(); +} + void AutoTester::on_createTestButton_clicked() { test.createTest(); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index 35f609a89d..d25969589b 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -24,6 +24,7 @@ private slots: void on_evaluateTestsButton_clicked(); void on_evaluateTestsRecursivelyButton_clicked(); void on_createRecursiveScriptButton_clicked(); + void on_createRecursiveScriptsRecursivelyButton_clicked(); void on_createTestButton_clicked(); void on_deleteOldSnapshotsButton_clicked(); void on_closeButton_clicked(); diff --git a/tools/auto-tester/src/ui/AutoTester.ui b/tools/auto-tester/src/ui/AutoTester.ui index d06255acf6..0d142ec43e 100644 --- a/tools/auto-tester/src/ui/AutoTester.ui +++ b/tools/auto-tester/src/ui/AutoTester.ui @@ -17,7 +17,7 @@ - 190 + 20 300 220 40 @@ -31,7 +31,7 @@ 360 - 130 + 210 220 40 @@ -112,7 +112,7 @@ 360 - 240 + 270 220 40 @@ -121,6 +121,19 @@ Delete Old Snapshots + + + + 360 + 140 + 220 + 40 + + + + Create Recursive Scripts Recursively + + @@ -145,4 +158,4 @@ - \ No newline at end of file + From a8e05824cdbd12df9b30bf566a49c720b58a5fd2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 25 Feb 2018 14:15:39 +1300 Subject: [PATCH 120/267] Entities octree sending functions JSDoc --- .../octree/src/OctreeScriptingInterface.h | 81 ++++++++++++++++++- tools/jsdoc/plugins/hifi.js | 1 + 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index c31da94532..c638c357b9 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -35,48 +35,125 @@ private slots: void cleanupManagedObjects(); public slots: + + /**jsdoc + * Set the maximum number of entity packets that the client send per second. + * @function Entities.setPacketsPerSecond + * @param {number} packetsPerSecond - Integer maximum number of entity packets that the client can send per second. + */ /// set the max packets per second send rate void setPacketsPerSecond(int packetsPerSecond) { return _packetSender->setPacketsPerSecond(packetsPerSecond); } + /**jsdoc + * Get the maximum number of entity packets that the client can send per second. + * @function Entities.getPacketsPerSecond + * @returns {number} Integer maximum number of entity packets that the client can send per second. + */ /// get the max packets per second send rate int getPacketsPerSecond() const { return _packetSender->getPacketsPerSecond(); } - /// does a particle server exist to send to + /**jsdoc + * Check whether servers exist for the client to send entity packets to. + * @function Entities.serversExist + * @returns {boolean} true if servers exist for the client to send entity packets to, false + * otherwise. + */ + /// does a server exist to send to bool serversExist() const { return _packetSender->serversExist(); } + /**jsdoc + * Check whether the client has entity packets waiting to be sent. + * @function Entities.hasPacketsToSend + * @returns {boolean} true if the client has entity packets waiting to be sent, false otherwise. + */ /// are there packets waiting in the send queue to be sent bool hasPacketsToSend() const { return _packetSender->hasPacketsToSend(); } + /**jsdoc + * Get the number of entity packets the client has waiting to be sent. + * @function Entities.packetsToSendCount + * @returns {number} Integer number of entity packets the client has waiting to be sent. + */ /// how many packets are there in the send queue waiting to be sent int packetsToSendCount() const { return (int)_packetSender->packetsToSendCount(); } + /**jsdoc + * Get the entity packets per second send rate of the client over its lifetime. + * @function Entities.getLifetimePPS + * @returns {number} Entity packets per second send rate of the client over its lifetime. + */ /// returns the packets per second send rate of this object over its lifetime float getLifetimePPS() const { return _packetSender->getLifetimePPS(); } + /**jsdoc + * Get the entity bytes per second send rate of the client over its lifetime. + * @function Entities.getLifetimeBPS + * @returns {number} Entity bytes per second send rate of the client over its lifetime. + */ /// returns the bytes per second send rate of this object over its lifetime float getLifetimeBPS() const { return _packetSender->getLifetimeBPS(); } + /**jsdoc + * Get the entity packets per second queued rate of the client over its lifetime. + * @function Entities.getLifetimePPSQueued + * @returns {number} Entity packets per second queued rate of the client over its lifetime. + */ /// returns the packets per second queued rate of this object over its lifetime float getLifetimePPSQueued() const { return _packetSender->getLifetimePPSQueued(); } + /**jsdoc + * Get the entity bytes per second queued rate of the client over its lifetime. + * @function Entities.getLifetimeBPSQueued + * @returns {number} Entity bytes per second queued rate of the client over its lifetime. + */ /// returns the bytes per second queued rate of this object over its lifetime float getLifetimeBPSQueued() const { return _packetSender->getLifetimeBPSQueued(); } + /**jsdoc + * Get the lifetime of the client from the first entity packet sent until now, in microseconds. + * @function Entities.getLifetimeInUsecs + * @returns {number} Lifetime of the client from the first entity packet sent until now, in microseconds. + */ /// returns lifetime of this object from first packet sent to now in usecs long long unsigned int getLifetimeInUsecs() const { return _packetSender->getLifetimeInUsecs(); } - /// returns lifetime of this object from first packet sent to now in usecs + /**jsdoc + * Get the lifetime of the client from the first entity packet sent until now, in seconds. + * @function Entities.getLifetimeInSeconds + * @returns {number} Lifetime of the client from the first entity packet sent until now, in seconds. + */ + /// returns lifetime of this object from first packet sent to now in secs float getLifetimeInSeconds() const { return _packetSender->getLifetimeInSeconds(); } + /**jsdoc + * Get the total number of entity packets sent by the client over its lifetime. + * @function Entities.getLifetimePacketsSent + * @returns {number} The total number of entity packets sent by the client over its lifetime. + */ /// returns the total packets sent by this object over its lifetime long long unsigned int getLifetimePacketsSent() const { return _packetSender->getLifetimePacketsSent(); } + /**jsdoc + * Get the total bytes of entity packets sent by the client over its lifetime. + * @function Entities.getLifetimeBytesSent + * @returns {number} The total bytes of entity packets sent by the client over its lifetime. + */ /// returns the total bytes sent by this object over its lifetime long long unsigned int getLifetimeBytesSent() const { return _packetSender->getLifetimeBytesSent(); } + /**jsdoc + * Get the total number of entity packets queued by the client over its lifetime. + * @function Entities.getLifetimePacketsQueued + * @returns {number} The total number of entity packets queued by the client over its lifetime. + */ /// returns the total packets queued by this object over its lifetime long long unsigned int getLifetimePacketsQueued() const { return _packetSender->getLifetimePacketsQueued(); } + /**jsdoc + * Get the total bytes of entity packets queued by the client over its lifetime. + * @function Entities.getLifetimeBytesQueued + * @returns {number} The total bytes of entity packets queued by the client over its lifetime. + */ /// returns the total bytes queued by this object over its lifetime long long unsigned int getLifetimeBytesQueued() const { return _packetSender->getLifetimeBytesQueued(); } diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 3897ebea07..5c5fae8795 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -25,6 +25,7 @@ exports.handlers = { '../../libraries/avatars/src', '../../libraries/controllers/src/controllers/', '../../libraries/entities/src', + '../../libraries/octree/src', '../../libraries/networking/src', '../../libraries/pointers/src', '../../libraries/shared/src', From 2d9d6035fcad73be20ec2061fcbbf8ab4a296454 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Feb 2018 10:20:31 +1300 Subject: [PATCH 121/267] Entities mouse and controller events JSDoc --- .../entities/src/EntityScriptingInterface.h | 173 +++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 3bc197719f..0a4beed0c3 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1100,18 +1100,87 @@ public slots: */ Q_INVOKABLE void setKeyboardFocusEntity(const EntityItemID& id); + + /**jsdoc + * Emit a {@link Entities.mousePressOnEntity|mousePressOnEntity} event. + * @function Entities.sendMousePressOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendMousePressOnEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.mouseMoveOnEntity|mouseMoveOnEntity} event. + * @function Entities.sendMouseMoveOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendMouseMoveOnEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.mouseReleaseOnEntity|mouseReleaseOnEntity} event. + * @function Entities.sendMouseReleaseOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendMouseReleaseOnEntity(const EntityItemID& id, const PointerEvent& event); + /**jsdoc + * Emit a {@link Entities.clickDownOnEntity|clickDownOnEntity} event. + * @function Entities.sendClickDownOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendClickDownOnEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.holdingClickOnEntity|holdingClickOnEntity} event. + * @function Entities.sendHoldingClickOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendHoldingClickOnEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.clickReleaseOnEntity|clickReleaseOnEntity} event. + * @function Entities.sendClickReleaseOnEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendClickReleaseOnEntity(const EntityItemID& id, const PointerEvent& event); + /**jsdoc + * Emit a {@link Entities.hoverEnterEntity|hoverEnterEntity} event. + * @function Entities.sendHoverEnterEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendHoverEnterEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.hoverOverEntity|hoverOverEntity} event. + * @function Entities.sendHoverOverEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendHoverOverEntity(const EntityItemID& id, const PointerEvent& event); + + /**jsdoc + * Emit a {@link Entities.hoverLeaveEntity|hoverLeaveEntity} event. + * @function Entities.sendHoverLeaveEntity + * @param {Uuid} entityID - The ID of the entity to emit the event for. + * @param {PointerEvent} event - The event details. + */ Q_INVOKABLE void sendHoverLeaveEntity(const EntityItemID& id, const PointerEvent& event); + /**jsdoc + * Check whether an entity wants hand controller pointer events. For example, a "Web" + * {@link Entities.EntityType|EntityType} does but a "Shape" {@link Entities.EntityType|EntityType} doesn't. + * @function Entities.wantsHandControllerPointerEvents + * @param {Uuid} entityID - The ID of the entity. + * @returns {boolean} true if the entity wants hand controller pointer events, false otherwise or + * if the entity cannot be found. + */ Q_INVOKABLE bool wantsHandControllerPointerEvents(QUuid id); Q_INVOKABLE void emitScriptEvent(const EntityItemID& entityID, const QVariant& message); @@ -1289,20 +1358,122 @@ signals: */ void canWriteAssetsChanged(bool canWriteAssets); - // TODO + + /**jsdoc + * Triggered when a mouse button is clicked while the mouse cursor is on an entity, or a controller trigger is fully + * pressed while its laser is on an entity. + * @function Entities.mousePressOnEntity + * @param {Uuid} entityID - The ID of the entity that was pressed. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + * @example Report when an entity is clicked with the mouse or laser. + * function onMousePressOnEntity(entityID, event) { + * print("Clicked on entity: " + entityID); + * } + * + * Entities.mousePressOnEntity.connect(onMousePressOnEntity); + */ void mousePressOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when a mouse button is double-clicked while the mouse cursor is on an entity. + * @function Entities.mousePressOnEntity + * @param {Uuid} entityID - The ID of the entity that was double-pressed. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void mouseDoublePressOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Repeatedly triggered while the mouse cursor or controller laser moves on an entity. + * @function Entities.mouseMoveOnEntity + * @param {Uuid} entityID - The ID of the entity that was moved on. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void mouseMoveOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when a mouse button is released after clicking on an entity or the controller trigger is partly or fully + * released after pressing on an entity, even if the mouse pointer or controller laser has moved off the entity. + * @function Entities.mouseReleaseOnEntity + * @param {Uuid} entityID - The ID of the entity that was originally pressed. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void mouseReleaseOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when a mouse button is clicked while the mouse cursor is not on an entity. + * @function Entities.mousePressOffEntity + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void mousePressOffEntity(); + + /**jsdoc + * Triggered when a mouse button is double-clicked while the mouse cursor is not on an entity. + * @function Entities.mouseDoublePressOffEntity + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void mouseDoublePressOffEntity(); + + /**jsdoc + * Triggered when a mouse button is clicked while the mouse cursor is on an entity. Note: Not triggered by controller. + * @function Entities.clickDownOnEntity + * @param {Uuid} entityID - The ID of the entity that was clicked. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void clickDownOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Repeatedly triggered while a mouse button continues to be held after clicking an entity, even if the mouse cursor has + * moved off the entity. Note: Not triggered by controller. + * @function Entities.holdingClickOnEntity + * @param {Uuid} entityID - The ID of the entity that was originally clicked. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void holdingClickOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when a mouse button is released after clicking on an entity, even if the mouse cursor has moved off the + * entity. Note: Not triggered by controller. + * @function Entities.clickReleaseOnEntity + * @param {Uuid} entityID - The ID of the entity that was originally clicked. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void clickReleaseOnEntity(const EntityItemID& entityItemID, const PointerEvent& event); + /**jsdoc + * Triggered when the mouse cursor or controller laser starts hovering on an entity. + * @function Entities.hoverEnterEntity + * @param {Uuid} entityID - The ID of the entity that is being hovered. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void hoverEnterEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Repeatedly triggered when the mouse cursor or controller laser moves while hovering over an entity. + * @function Entities.hoverOverEntity + * @param {Uuid} entityID - The ID of the entity that is being hovered. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void hoverOverEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when the mouse cursor or controller laser stops hovering over an entity. + * @function Entities.hoverLeaveEntity + * @param {Uuid} entityID - The ID of the entity that was being hovered. + * @param {PointerEvent} event - Details of the event. + * @returns {Signal} + */ void hoverLeaveEntity(const EntityItemID& entityItemID, const PointerEvent& event); void enterEntity(const EntityItemID& entityItemID); From c2d8c96463061da878774612e28c51a723a26f59 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Feb 2018 14:10:33 +1300 Subject: [PATCH 122/267] Entities collisions JSDoc --- .../entities/src/EntityScriptingInterface.h | 79 +++++++++++++++++++ libraries/shared/src/RegisteredMetaTypes.cpp | 9 +++ libraries/shared/src/RegisteredMetaTypes.h | 14 ++++ 3 files changed, 102 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 0a4beed0c3..00c4918f34 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1295,6 +1295,45 @@ public slots: Q_INVOKABLE bool verifyStaticCertificateProperties(const QUuid& entityID); signals: + /**jsdoc + * Triggered on the client that is the physics simulation owner during the collision of two entities. Note: Isn't triggered + * for a collision with an avatar. + * @function Entities.collisionWithEntity + * @param {Uuid} idA - The ID of one entity in the collision. For an entity script, this is the ID of the entity containing + * the script. + * @param {Uuid} idB - The ID of the other entity in the collision. + * @param {Collision} collision - The details of the collision. + * @returns {Signal} + * @example Change the color of an entity when it collides with another entity. + * var entityScript = (function () { + * function randomInteger(min, max) { + * return Math.floor(Math.random() * (max - min + 1)) + min; + * } + * + * this.collisionWithEntity = function (myID, otherID, collision) { + * Entities.editEntity(myID, { + * color: { + * red: randomInteger(128, 255), + * green: randomInteger(128, 255), + * blue: randomInteger(128, 255) + * } + * }); + * }; + * }); + * + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * dimensions: { x: 0.5, y: 0.5, z: 0.5 }, + * color: { red: 128, green: 128, blue: 128 }, + * gravity: { x: 0, y: -9.8, z: 0 }, + * velocity: { x: 0, y: 0.1, z: 0 }, // Kick off physics. + * dynamic: true, + * collisionless: false, // So that collision events are generated. + * script: "(" + entityScript + ")", // Could host the script on a Web server instead. + * lifetime: 300 // Delete after 5 minutes. + * }); + */ void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); /**jsdoc @@ -1476,9 +1515,49 @@ signals: */ void hoverLeaveEntity(const EntityItemID& entityItemID, const PointerEvent& event); + + /**jsdoc + * Triggered when an avatar enters an entity. + * @function Entities.enterEntity + * @param {Uuid} entityID - The ID of the entity that the avatar entered. + * @returns {Signal} + * @example Change the color of an entity when an avatar enters or leaves. + * var entityScript = (function () { + * this.enterEntity = function (entityID) { + * print("Enter entity"); + * Entities.editEntity(entityID, { + * color: { red: 255, green: 64, blue: 64 }, + * }); + * }; + * this.leaveEntity = function (entityID) { + * print("Leave entity"); + * Entities.editEntity(entityID, { + * color: { red: 128, green: 128, blue: 128 }, + * }); + * }; + * }); + * + * var entityID = Entities.addEntity({ + * type: "Sphere", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * dimensions: { x: 3, y: 3, z: 3 }, + * color: { red: 128, green: 128, blue: 128 }, + * collisionless: true, // So that avatar can walk through entity. + * script: "(" + entityScript + ")", // Could host the script on a Web server instead. + * lifetime: 300 // Delete after 5 minutes. + * }); + */ void enterEntity(const EntityItemID& entityItemID); + + /**jsdoc + * Triggered when an avatar leaves an entity. + * @function Entities.enterEntity + * @param {Uuid} entityID - The ID of the entity that the avatar left. + * @returns {Signal} + */ void leaveEntity(const EntityItemID& entityItemID); + /**jsdoc * Triggered when an entity is deleted. * @function Entities.deletingEntity diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index c597db6dc1..a3d312b9c1 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -774,6 +774,15 @@ void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay) { } } +/**jsdoc + * @typedef {object} Collision + * @property {ContactEventType} type - The contact type of the collision event. + * @property {Uuid} idA - The ID of one of the entities in the collision. + * @property {Uuid} idB - The ID of the other of the entities in the collision. + * @property {Vec3} penetration - The amount of penetration between the two entities. + * @property {Vec3} contactPoint - The point of contact. + * @property {Vec3} velocityChange - The change in relative velocity of the two entities, in m/s. + */ QScriptValue collisionToScriptValue(QScriptEngine* engine, const Collision& collision) { QScriptValue obj = engine->newObject(); obj.setProperty("type", collision.type); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 3fc81a9c9e..a7c9c0bee3 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -258,6 +258,20 @@ namespace std { }; } +/**jsdoc + *

The type of a collision contact event. + * + * + * + * + * + * + * + * + * + *
ValueDescription
0Start of the collision.
1Continuation of the collision.
2End of the collision.
+ * @typedef {number} ContactEventType + */ enum ContactEventType { CONTACT_EVENT_TYPE_START, CONTACT_EVENT_TYPE_CONTINUE, From 7982d8da58246836394fcd5278f68d4e198e170e Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 26 Feb 2018 13:06:22 -0300 Subject: [PATCH 123/267] Set bubble default state off for android. --- libraries/networking/src/NodeList.h | 4 ++++ scripts/system/+android/bottombar.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 2dd9d3c869..b419deba2f 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -172,7 +172,11 @@ private: tbb::concurrent_unordered_map _avatarGainMap; void sendIgnoreRadiusStateToNode(const SharedNodePointer& destinationNode); +#if defined(Q_OS_ANDROID) + Setting::Handle _ignoreRadiusEnabled { "IgnoreRadiusEnabled", false }; +#else Setting::Handle _ignoreRadiusEnabled { "IgnoreRadiusEnabled", true }; +#endif #if (PR_BUILD || DEV_BUILD) bool _shouldSendNewerVersion { false }; diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js index 5f82886c8a..51453ce9dd 100644 --- a/scripts/system/+android/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -132,6 +132,8 @@ function setupBottomBar() { text: "BUBBLE" }); + bubbleBtn.editProperties({isActive: Users.getIgnoreRadiusEnabled()}); + bubbleBtn.clicked.connect(function() { Users.toggleIgnoreRadius(); bubbleBtn.editProperties({isActive: Users.getIgnoreRadiusEnabled()}); From d288ebe79ebfa2c6dd4c58ca4280a3018cfc8978 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 26 Feb 2018 18:07:44 +0100 Subject: [PATCH 124/267] Moved velocity buffer job just before antialiasing job to be sure tablet model in HMD writes correct velocity and gets properly antialiased --- .../render-utils/src/AntialiasingEffect.cpp | 3 +- .../render-utils/src/AntialiasingEffect.h | 10 -- .../render-utils/src/RenderDeferredTask.cpp | 10 +- libraries/render-utils/src/taa.slf | 6 +- libraries/render-utils/src/taa.slh | 85 +++----------- .../utilities/render/antialiasing.qml | 104 +++++++----------- 6 files changed, 64 insertions(+), 154 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index fab976b201..8da42f8ff6 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -287,8 +287,6 @@ void Antialiasing::configure(const Config& config) { _params.edit().covarianceGamma = config.covarianceGamma; _params.edit().setConstrainColor(config.constrainColor); - _params.edit().setCovarianceClipColor(config.covarianceClipColor); - _params.edit().setClipExactColor(config.clipExactColor); _params.edit().setFeedbackColor(config.feedbackColor); _params.edit().debugShowVelocityThreshold = config.debugShowVelocityThreshold; @@ -349,6 +347,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const batch.setResourceFramebufferSwapChainTexture(AntialiasingPass_HistoryMapSlot, _antialiasingBuffers, 0); batch.setResourceTexture(AntialiasingPass_SourceMapSlot, sourceBuffer->getRenderBuffer(0)); batch.setResourceTexture(AntialiasingPass_VelocityMapSlot, velocityBuffer->getVelocityTexture()); + // This is only used during debug batch.setResourceTexture(AntialiasingPass_DepthMapSlot, linearDepthBuffer->getLinearDepthTexture()); batch.setUniformBuffer(AntialiasingPass_ParamsSlot, _params); diff --git a/libraries/render-utils/src/AntialiasingEffect.h b/libraries/render-utils/src/AntialiasingEffect.h index 3c27e8f67c..da9a0bd384 100644 --- a/libraries/render-utils/src/AntialiasingEffect.h +++ b/libraries/render-utils/src/AntialiasingEffect.h @@ -90,8 +90,6 @@ class AntialiasingConfig : public render::Job::Config { Q_PROPERTY(float covarianceGamma MEMBER covarianceGamma NOTIFY dirty) Q_PROPERTY(bool constrainColor MEMBER constrainColor 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) @@ -111,9 +109,7 @@ public: float sharpen{ 0.15f }; bool constrainColor{ true }; - bool covarianceClipColor{ true }; float covarianceGamma{ 0.9f }; - bool clipExactColor{ false }; bool feedbackColor{ false }; float debugX{ 0.0f }; @@ -146,12 +142,6 @@ struct TAAParams { void setConstrainColor(bool enabled) { SET_BIT(flags.y, 1, enabled); } bool isConstrainColor() const { return (bool)GET_BIT(flags.y, 1); } - void setCovarianceClipColor(bool enabled) { SET_BIT(flags.y, 2, enabled); } - bool isCovarianceClipColor() const { return (bool)GET_BIT(flags.y, 2); } - - 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/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 0059a5ab65..07293b0b34 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -146,11 +146,6 @@ 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); @@ -246,6 +241,11 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawOverlayInFrontTransparentBounds", overlaysInFrontTransparent); } + // Velocity + const auto velocityBufferInputs = VelocityBufferPass::Inputs(deferredFrameTransform, deferredFramebuffer).asVarying(); + const auto velocityBufferOutputs = task.addJob("VelocityBuffer", velocityBufferInputs); + const auto velocityBuffer = velocityBufferOutputs.getN(0); + // AA job to be revisited 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 a5dce214c6..8d172871d4 100644 --- a/libraries/render-utils/src/taa.slf +++ b/libraries/render-utils/src/taa.slf @@ -28,9 +28,7 @@ void main() { return; } - vec3 fragVelAndZ = taa_fetchVelocityMapBest(fragUV); - vec2 fragVel = fragVelAndZ.xy; - float fragDepth = fragVelAndZ.z; + vec2 fragVel = taa_fetchVelocityMapBest(fragUV).xy; vec3 sourceColor; vec3 historyColor; @@ -40,7 +38,7 @@ void main() { if (taa_constrainColor()) { // clamp history to neighbourhood of current sample - historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, fragDepth, historyColor); + historyColor = taa_evalConstrainColor(sourceColor, fragUV, fragVel, historyColor); } if (taa_feedbackColor()) { diff --git a/libraries/render-utils/src/taa.slh b/libraries/render-utils/src/taa.slh index bca0356949..583e2978c4 100644 --- a/libraries/render-utils/src/taa.slh +++ b/libraries/render-utils/src/taa.slh @@ -54,14 +54,6 @@ bool taa_constrainColor() { return GET_BIT(params.flags.y, 1); } -bool taa_covarianceClipColor() { - return GET_BIT(params.flags.y, 2); -} - -bool taa_clipExactColor() { - return GET_BIT(params.flags.y, 3); -} - bool taa_feedbackColor() { return GET_BIT(params.flags.y, 4); } @@ -187,7 +179,7 @@ vec3 taa_findClosestFragment3x3(vec2 uv) return vec3(uv + dd.xy * dmin.xy, dmin.z); } -vec3 taa_fetchVelocityMapBest(vec2 uv) { +vec2 taa_fetchVelocityMapBest(vec2 uv) { vec2 dd = abs(taa_getTexelSize()); vec2 du = vec2(dd.x, 0.0); vec2 dv = vec2(0.0, dd.y); @@ -225,8 +217,7 @@ vec3 taa_fetchVelocityMapBest(vec2 uv) { testSpeed = dot(dbr,dbr); if (testSpeed > best.z) { best = vec3(dbr, testSpeed); } - - return vec3(best.xy, taa_fetchDepth(uv)); + return best.xy; } vec2 taa_fromFragUVToEyeUVAndSide(vec2 fragUV, out int stereoSide) { @@ -276,7 +267,7 @@ float Luminance(vec3 rgb) { #define MINMAX_3X3_ROUNDED 1 -mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity, float fragZe) { +mat3 taa_evalNeighbourColorVariance(vec3 sourceColor, vec2 fragUV, vec2 fragVelocity) { vec2 texelSize = taa_getTexelSize(); @@ -412,69 +403,25 @@ 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; + // 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); - - 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 < 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 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); - 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); - //} + if (ma_unit > 1.0) + return p_clip + v_clip / ma_unit; + else + return q;// point inside aabb } -vec3 taa_evalConstrainColor(vec3 sourceColor, vec2 sourceUV, vec2 sourceVel, float sourceZe, vec3 candidateColor) { +vec3 taa_evalConstrainColor(vec3 sourceColor, vec2 sourceUV, vec2 sourceVel, vec3 candidateColor) { mat3 colorMinMaxAvg; - if (taa_covarianceClipColor()) { - colorMinMaxAvg = taa_evalNeighbourColorVariance(sourceColor, sourceUV, sourceVel, sourceZe); - } else { - colorMinMaxAvg = taa_evalNeighbourColorRegion(sourceColor, sourceUV, sourceVel, sourceZe); - } + colorMinMaxAvg = taa_evalNeighbourColorVariance(sourceColor, sourceUV, sourceVel); // clamp history to neighbourhood of current sample return taa_clampColor(colorMinMaxAvg[0], colorMinMaxAvg[1], sourceColor, candidateColor); diff --git a/scripts/developer/utilities/render/antialiasing.qml b/scripts/developer/utilities/render/antialiasing.qml index 8487c9160a..e8034c48bd 100644 --- a/scripts/developer/utilities/render/antialiasing.qml +++ b/scripts/developer/utilities/render/antialiasing.qml @@ -31,12 +31,11 @@ Rectangle { padding: 10 Column{ - spacing: 10 - + spacing: 10 Row { spacing: 10 - id: fxaaOnOff + id: fxaaOnOff property bool debugFXAA: false HifiControls.Button { text: { @@ -86,67 +85,44 @@ Rectangle { } } Separator {} - Column { - spacing: 10 - Row { - spacing: 10 - HifiControls.CheckBox { - boxSize: 20 - text: "Constrain color" - checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } - } - - Column { - spacing: 10 - HifiControls.CheckBox { - boxSize: 20 - text: "Covariance Min Max" - checked: Render.getConfig("RenderMainView.Antialiasing")["covarianceClipColor"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["covarianceClipColor"] = checked } - } - HifiControls.CheckBox { - boxSize: 20 - text: "Clip exact color" - checked: Render.getConfig("RenderMainView.Antialiasing")["clipExactColor"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["clipExactColor"] = checked } - } - } - } - 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" - checked: Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] - onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked } - } - - ConfigSlider { - label: qsTr("Source blend") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "blend" - max: 1.0 - min: 0.0 - } - - ConfigSlider { - label: qsTr("Post sharpen") - integral: false - config: Render.getConfig("RenderMainView.Antialiasing") - property: "sharpen" - max: 1.0 - min: 0.0 - } - + HifiControls.CheckBox { + boxSize: 20 + text: "Constrain color" + checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked } + } + 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" + checked: Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] + onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked } + } + + ConfigSlider { + label: qsTr("Source blend") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "blend" + max: 1.0 + min: 0.0 + } + + ConfigSlider { + label: qsTr("Post sharpen") + integral: false + config: Render.getConfig("RenderMainView.Antialiasing") + property: "sharpen" + max: 1.0 + min: 0.0 } Separator {} Row { From 12d7e89d7e23da7bc1dad7afaf94b7825501fe30 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 26 Feb 2018 18:13:41 +0100 Subject: [PATCH 125/267] Switched back velocity buffer job to original place while I try to get more info on how/where that tablet is rendered --- libraries/render-utils/src/RenderDeferredTask.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 07293b0b34..0059a5ab65 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -146,6 +146,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); @@ -241,11 +246,6 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DrawOverlayInFrontTransparentBounds", overlaysInFrontTransparent); } - // Velocity - const auto velocityBufferInputs = VelocityBufferPass::Inputs(deferredFrameTransform, deferredFramebuffer).asVarying(); - const auto velocityBufferOutputs = task.addJob("VelocityBuffer", velocityBufferInputs); - const auto velocityBuffer = velocityBufferOutputs.getN(0); - // AA job to be revisited const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, primaryFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); task.addJob("Antialiasing", antialiasingInputs); From 3e552e5739058255262a2288597c1d76916e20ce Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 23 Feb 2018 13:29:03 -0800 Subject: [PATCH 126/267] Fix warnings --- .../src/scripting/AssetMappingsScriptingInterface.cpp | 8 ++++---- libraries/networking/src/BaseAssetScriptingInterface.cpp | 2 +- libraries/render-utils/src/AnimDebugDraw.cpp | 1 - libraries/script-engine/src/AssetScriptingInterface.cpp | 8 ++++---- libraries/shared/src/shared/MiniPromises.h | 4 ++-- tools/ktx-tool/src/main.cpp | 7 ------- 6 files changed, 11 insertions(+), 19 deletions(-) diff --git a/interface/src/scripting/AssetMappingsScriptingInterface.cpp b/interface/src/scripting/AssetMappingsScriptingInterface.cpp index dc227c21ba..4bc8ec0bd3 100644 --- a/interface/src/scripting/AssetMappingsScriptingInterface.cpp +++ b/interface/src/scripting/AssetMappingsScriptingInterface.cpp @@ -140,7 +140,7 @@ void AssetMappingsScriptingInterface::deleteMappings(QStringList paths, QJSValue auto assetClient = DependencyManager::get(); auto request = assetClient->createDeleteMappingsRequest(paths); - connect(request, &DeleteMappingsRequest::finished, this, [this, callback](DeleteMappingsRequest* request) mutable { + connect(request, &DeleteMappingsRequest::finished, this, [callback](DeleteMappingsRequest* request) mutable { if (callback.isCallable()) { QJSValueList args { request->getErrorString() }; callback.call(args); @@ -156,7 +156,7 @@ void AssetMappingsScriptingInterface::getAllMappings(QJSValue callback) { auto assetClient = DependencyManager::get(); auto request = assetClient->createGetAllMappingsRequest(); - connect(request, &GetAllMappingsRequest::finished, this, [this, callback](GetAllMappingsRequest* request) mutable { + connect(request, &GetAllMappingsRequest::finished, this, [callback](GetAllMappingsRequest* request) mutable { auto mappings = request->getMappings(); auto map = callback.engine()->newObject(); @@ -179,7 +179,7 @@ void AssetMappingsScriptingInterface::renameMapping(QString oldPath, QString new auto assetClient = DependencyManager::get(); auto request = assetClient->createRenameMappingRequest(oldPath, newPath); - connect(request, &RenameMappingRequest::finished, this, [this, callback](RenameMappingRequest* request) mutable { + connect(request, &RenameMappingRequest::finished, this, [callback](RenameMappingRequest* request) mutable { if (callback.isCallable()) { QJSValueList args{ request->getErrorString() }; callback.call(args); @@ -195,7 +195,7 @@ void AssetMappingsScriptingInterface::setBakingEnabled(QStringList paths, bool e auto assetClient = DependencyManager::get(); auto request = assetClient->createSetBakingEnabledRequest(paths, enabled); - connect(request, &SetBakingEnabledRequest::finished, this, [this, callback](SetBakingEnabledRequest* request) mutable { + connect(request, &SetBakingEnabledRequest::finished, this, [callback](SetBakingEnabledRequest* request) mutable { if (callback.isCallable()) { QJSValueList args{ request->getErrorString() }; callback.call(args); diff --git a/libraries/networking/src/BaseAssetScriptingInterface.cpp b/libraries/networking/src/BaseAssetScriptingInterface.cpp index 3149bbc768..066331f927 100644 --- a/libraries/networking/src/BaseAssetScriptingInterface.cpp +++ b/libraries/networking/src/BaseAssetScriptingInterface.cpp @@ -233,7 +233,7 @@ Promise BaseAssetScriptingInterface::downloadBytes(QString hash) { QPointer assetRequest = assetClient()->createRequest(hash); Promise deferred = makePromise(__FUNCTION__); - QObject::connect(assetRequest, &AssetRequest::finished, assetRequest, [this, deferred](AssetRequest* request) { + QObject::connect(assetRequest, &AssetRequest::finished, assetRequest, [deferred](AssetRequest* request) { // note: we are now on the "Resource Manager" thread Q_ASSERT(QThread::currentThread() == request->thread()); Q_ASSERT(request->getState() == AssetRequest::Finished); diff --git a/libraries/render-utils/src/AnimDebugDraw.cpp b/libraries/render-utils/src/AnimDebugDraw.cpp index 12e8a97fb7..67d1e2e36e 100644 --- a/libraries/render-utils/src/AnimDebugDraw.cpp +++ b/libraries/render-utils/src/AnimDebugDraw.cpp @@ -9,7 +9,6 @@ #include "AnimDebugDraw.h" -#include #include #include diff --git a/libraries/script-engine/src/AssetScriptingInterface.cpp b/libraries/script-engine/src/AssetScriptingInterface.cpp index 1c811573fb..1a88fbe959 100644 --- a/libraries/script-engine/src/AssetScriptingInterface.cpp +++ b/libraries/script-engine/src/AssetScriptingInterface.cpp @@ -50,7 +50,7 @@ void AssetScriptingInterface::uploadData(QString data, QScriptValue callback) { jsCallback(handler, url, hash); }); - connect(upload, &AssetUpload::finished, upload, [this, deferred](AssetUpload* upload, const QString& hash) { + connect(upload, &AssetUpload::finished, upload, [deferred](AssetUpload* upload, const QString& hash) { // we are now on the "Resource Manager" thread (and "hash" being a *reference* makes it unsafe to use directly) Q_ASSERT(QThread::currentThread() == upload->thread()); deferred->resolve({ @@ -70,7 +70,7 @@ void AssetScriptingInterface::setMapping(QString path, QString hash, QScriptValu jsCallback(handler, error, result); }); - connect(setMappingRequest, &SetMappingRequest::finished, setMappingRequest, [this, deferred](SetMappingRequest* request) { + connect(setMappingRequest, &SetMappingRequest::finished, setMappingRequest, [deferred](SetMappingRequest* request) { Q_ASSERT(QThread::currentThread() == request->thread()); // we are now on the "Resource Manager" thread QString error = request->getErrorString(); @@ -102,7 +102,7 @@ void AssetScriptingInterface::downloadData(QString urlString, QScriptValue callb jsCallback(handler, result.value("data").toString(), { { "errorMessage", error } }); }); - connect(assetRequest, &AssetRequest::finished, assetRequest, [this, deferred](AssetRequest* request) { + connect(assetRequest, &AssetRequest::finished, assetRequest, [deferred](AssetRequest* request) { Q_ASSERT(QThread::currentThread() == request->thread()); // we are now on the "Resource Manager" thread Q_ASSERT(request->getState() == AssetRequest::Finished); @@ -128,7 +128,7 @@ void AssetScriptingInterface::setBakingEnabled(QString path, bool enabled, QScri Promise deferred = jsPromiseReady(makePromise(__FUNCTION__), thisObject(), callback); - connect(setBakingEnabledRequest, &SetBakingEnabledRequest::finished, setBakingEnabledRequest, [this, deferred](SetBakingEnabledRequest* request) { + connect(setBakingEnabledRequest, &SetBakingEnabledRequest::finished, setBakingEnabledRequest, [deferred](SetBakingEnabledRequest* request) { Q_ASSERT(QThread::currentThread() == request->thread()); // we are now on the "Resource Manager" thread diff --git a/libraries/shared/src/shared/MiniPromises.h b/libraries/shared/src/shared/MiniPromises.h index 5983f135b7..30b57ad7b8 100644 --- a/libraries/shared/src/shared/MiniPromises.h +++ b/libraries/shared/src/shared/MiniPromises.h @@ -103,7 +103,7 @@ public: return self(); } Promise fail(ErrorFunction errorOnly) { - return fail([this, errorOnly](QString error, QVariantMap result) { + return fail([errorOnly](QString error, QVariantMap result) { errorOnly(error); }); } @@ -122,7 +122,7 @@ public: } Promise then(SuccessFunction successOnly) { - return then([this, successOnly](QString error, QVariantMap result) { + return then([successOnly](QString error, QVariantMap result) { successOnly(result); }); } diff --git a/tools/ktx-tool/src/main.cpp b/tools/ktx-tool/src/main.cpp index f0996523b3..1ef03ba80b 100644 --- a/tools/ktx-tool/src/main.cpp +++ b/tools/ktx-tool/src/main.cpp @@ -70,13 +70,6 @@ void messageHandler(QtMsgType type, const QMessageLogContext& context, const QSt std::cout << message.toStdString() << std::endl; } -static inline glm::uvec2 evalMipDimension(uint32_t mipLevel, const glm::uvec2& dims) { - return glm::uvec2{ - std::max(dims.x >> mipLevel, 1U), - std::max(dims.y >> mipLevel, 1U), - }; -} - void processKtxFile(const QFileInfo& inputFileInfo) { const QString inputFileName = inputFileInfo.absoluteFilePath(); const QString compressedFileName = DEST_FOLDER.absoluteFilePath(inputFileInfo.fileName()); From 1fb02d15d70780c635893dad9cb9873671380bd8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 27 Feb 2018 14:12:20 +1300 Subject: [PATCH 127/267] Entities actions JSDoc --- interface/src/avatar/AvatarActionFarGrab.h | 17 ++++++ interface/src/avatar/AvatarActionHold.cpp | 20 +++++++ .../entities/src/EntityDynamicInterface.cpp | 43 ++++++++++++++ .../entities/src/EntityScriptingInterface.h | 59 +++++++++++++++++++ libraries/physics/src/ObjectActionOffset.cpp | 12 ++++ libraries/physics/src/ObjectActionTractor.cpp | 17 ++++++ .../src/ObjectActionTravelOriented.cpp | 11 ++++ .../src/ObjectConstraintBallSocket.cpp | 9 +++ .../physics/src/ObjectConstraintConeTwist.cpp | 15 +++++ .../physics/src/ObjectConstraintHinge.cpp | 16 +++++ .../physics/src/ObjectConstraintSlider.cpp | 25 ++++++++ libraries/physics/src/ObjectDynamic.cpp | 32 ++++++++++ libraries/physics/src/ObjectMotionState.h | 17 ++++++ .../developer/tests/dynamics/dynamicsTests.js | 2 +- tools/jsdoc/plugins/hifi.js | 3 +- 15 files changed, 296 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/AvatarActionFarGrab.h b/interface/src/avatar/AvatarActionFarGrab.h index bcaf7f2f3c..c93f243551 100644 --- a/interface/src/avatar/AvatarActionFarGrab.h +++ b/interface/src/avatar/AvatarActionFarGrab.h @@ -15,6 +15,23 @@ #include #include +/**jsdoc + * The "far-grab" {@link Entities.ActionType|ActionType} moves and rotates an entity to a target position and + * orientation, optionally relative to another entity, such that the entity doesn't collide with the user's avatar. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-FarGrab + * @property {Vec3} targetPosition=0,0,0 - The target position. + * @property {Quat} targetRotation=0,0,0,1 - The target rotation. + * @property {Uuid} otherID=null - If an entity ID, the targetPosition and targetRotation are + * relative to this entity's position and rotation. + * @property {number} linearTimeScale=3.4e+38 - Controls how long it takes for the entity's position to catch up with the + * target position. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the action + * is applied using an exponential decay. + * @property {number} angularTimeScale=3.4e+38 - Controls how long it takes for the entity's orientation to catch up with the + * target orientation. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the + * action is applied using an exponential decay. + */ class AvatarActionFarGrab : public ObjectActionTractor { public: AvatarActionFarGrab(const QUuid& id, EntityItemPointer ownerEntity); diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index d4fe8574ca..0d7129181b 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -416,6 +416,26 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "hold" {@link Entities.ActionType|ActionType} positions and rotates an entity relative to an avatar's hand, + * without collisions between the entity and the holding avatar. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-Hold + * @property {Uuid} holderID=MyAvatar.sessionUUID - The ID of the avatar holding the entity. + * @property {Vec3} relativePosition=0,0,0 - The target position relative to the avatar's hand. + * @property {Vec3} relativeRotation=0,0,0,1 - The target rotation relative to the avatar's hand. + * @property {number} timeScale=3.4e+38 - Controls how long it takes for the entity's position and rotation to catch up with + * the target. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the action is + * applied using an exponential decay. + * @property {string} hand=right - The hand holding the entity: "left" or "right". + * @property {boolean} kinematic=false - If true, the entity is made kinematic during the action; the entity won't + * lag behind the hand but constraint actions such as "hinge" won't act properly. + * @property {boolean} kinematicSetVelocity=false - If true and kinematic is true, the + * entity's velocity property will be set during the action, e.g., so that other scripts may use the value. + * @property {boolean} ignoreIK=false - If true, the entity follows the HMD controller rather than the avatar's + * hand. + */ QVariantMap AvatarActionHold::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&]{ diff --git a/libraries/entities/src/EntityDynamicInterface.cpp b/libraries/entities/src/EntityDynamicInterface.cpp index f424c02e6e..9ff39fe5b4 100644 --- a/libraries/entities/src/EntityDynamicInterface.cpp +++ b/libraries/entities/src/EntityDynamicInterface.cpp @@ -94,6 +94,49 @@ variables. These argument variables are used by the code which is run when bull #include "EntityDynamicInterface.h" +/**jsdoc +*

An entity action may be one of the following types:

+* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
ValueTypeDescriptionArguments
"far-grab"Avatar actionMoves and rotates an entity to a target position and orientation, optionally relative to another entity, such that +* the entity doesn't collide with the user's avatar.{@link Entities.ActionArguments-FarGrab}
"hold"Avatar actionPositions and rotates an entity relative to an avatar's hand, without collisions between the entity and the holding +* avatar.{@link Entities.ActionArguments-Hold}
"offset"Object actionMoves an entity so that it is a set distance away from a target point.{@link Entities.ActionArguments-Offset}
"tractor"Object actionMoves and rotates an entity to a target position and orientation, optionally relative to another entity.{@link Entities.ActionArguments-Tractor}
"travel-oriented"Object actionOrients an entity to align with its direction of travel.{@link Entities.ActionArguments-TravelOriented}
"hinge"Object constraintLets an entity pivot about an axis or connects two entities with a hinge joint.{@link Entities.ActionArguments-Hinge}
"slider"Object constraintLets an entity slide and rotate along an axis, or connects two entities that slide and rotate along a shared +* axis.{@link Entities.ActionArguments-Slider|ActionArguments-Slider}
"cone-twist"Object constraintConnects two entities with a joint that can move through a cone and can twist.{@link Entities.ActionArguments-ConeTwist}
"ball-socket"Object constraintConnects two entities with a ball and socket joint.{@link Entities.ActionArguments-BallSocket}
"spring"Synonym for "tractor". Legacy value.
+* @typedef {string} Entities.ActionType +*/ +// Note: The "none" action type is not listed because it's an internal "uninitialized" value and not useful for scripts. EntityDynamicType EntityDynamicInterface::dynamicTypeFromString(QString dynamicTypeString) { QString normalizedDynamicTypeString = dynamicTypeString.toLower().remove('-').remove('_'); if (normalizedDynamicTypeString == "none") { diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 00c4918f34..d4ae83087d 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -804,10 +804,69 @@ public slots: */ Q_INVOKABLE void dumpTree() const; + + /**jsdoc + * Add an action to an entity. An action is registered with the physics engine and is applied every physics simulation + * step. Any entity may have more than one action associated with it, but only as many as will fit in an entity's + * actionData property. + * @function Entities.addAction + * @param {Entities.ActionType} actionType - The type of action. + * @param {Uuid} entityID - The ID of the entity to add the action to. + * @param {Entities.ActionArguments} arguments - Configure the action. + * @returns {Uuid} The ID of the action added if successful, otherwise null. + * @example Constrain a cube to move along a vertical line. + * var entityID = Entities.addEntity({ + * type: "Box", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * dimensions: { x: 0.5, y: 0.5, z: 0.5 }, + * dynamic: true, + * collisionless: false, + * userData: "{ \"grabbableKey\": { \"grabbable\": true, \"kinematic\": false } }", + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * var actionID = Entities.addAction("slider", entityID, { + * axis: { x: 0, y: 1, z: 0 }, + * linearLow: 0, + * linearHigh: 0.6 + * }); + */ Q_INVOKABLE QUuid addAction(const QString& actionTypeString, const QUuid& entityID, const QVariantMap& arguments); + + /**jsdoc + * Update an entity action. + * @function Entities.updateAction + * @param (Uuid} entityID - The ID of the entity with the action to update. + * @param {Uuid} actionID - The ID of the action to update. + * @param {Entities.ActionArguments} arguments - The arguments to update. + * @returns {boolean} true if the update was successful, otherwise false. + */ Q_INVOKABLE bool updateAction(const QUuid& entityID, const QUuid& actionID, const QVariantMap& arguments); + + /**jsdoc + * Delete an action from an entity. + * @function Entities.deleteAction + * @param (Uuid} entityID - The ID of entity to delete the action from. + * @param {Uuid} actionID - The ID of the action to delete. + * @returns {boolean} true if the update was successful, otherwise false. + */ Q_INVOKABLE bool deleteAction(const QUuid& entityID, const QUuid& actionID); + + /**jsdoc + * Get the IDs of the actions that are associated with an entity. + * @function Entities.getActionIDs + * @param {Uuid} entityID - The entity to get the action IDs for. + * @returns {Uuid[]} An array of action IDs if any are found, otherwise an empty array. + */ Q_INVOKABLE QVector getActionIDs(const QUuid& entityID); + + /**jsdoc + * Get the arguments of an action. + * @function Entities.getActionArguments + * @param (Uuid} entityID - The ID of the entity with the action. + * @param {Uuid} actionID - The ID of the action to get the arguments of. + * @returns {Entities.ActionArguments} The arguments of the requested action if found, otherwise an empty object. + */ Q_INVOKABLE QVariantMap getActionArguments(const QUuid& entityID, const QUuid& actionID); diff --git a/libraries/physics/src/ObjectActionOffset.cpp b/libraries/physics/src/ObjectActionOffset.cpp index c1fb397e19..e90862266b 100644 --- a/libraries/physics/src/ObjectActionOffset.cpp +++ b/libraries/physics/src/ObjectActionOffset.cpp @@ -142,6 +142,18 @@ bool ObjectActionOffset::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "offset" {@link Entities.ActionType|ActionType} moves an entity so that it is a set distance away from a + * target point. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-Offset + * @property {Vec3} pointToOffsetFrom=0,0,0 - The target point to offset the entity from. + * @property {number} linearDistance=0 - The distance away from the target point to position the entity. + * @property {number} linearTimeScale=34e+38 - Controls how long it takes for the entity's position to catch up with the + * target offset. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the action + * is applied using an exponential decay. + */ QVariantMap ObjectActionOffset::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectActionTractor.cpp b/libraries/physics/src/ObjectActionTractor.cpp index 03e6533c87..bc68d6de73 100644 --- a/libraries/physics/src/ObjectActionTractor.cpp +++ b/libraries/physics/src/ObjectActionTractor.cpp @@ -307,6 +307,23 @@ bool ObjectActionTractor::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "tractor" {@link Entities.ActionType|ActionType} moves and rotates an entity to a target position and + * orientation, optionally relative to another entity. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-Tractor + * @property {Vec3} targetPosition=0,0,0 - The target position. + * @property {Quat} targetRotation=0,0,0,1 - The target rotation. + * @property {Uuid} otherID=null - If an entity ID, the targetPosition and targetRotation are + * relative to this entity's position and rotation. + * @property {number} linearTimeScale=3.4e+38 - Controls how long it takes for the entity's position to catch up with the + * target position. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the action + * is applied using an exponential decay. + * @property {number} angularTimeScale=3.4e+38 - Controls how long it takes for the entity's orientation to catch up with the + * target orientation. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the + * action is applied using an exponential decay. + */ QVariantMap ObjectActionTractor::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectActionTravelOriented.cpp b/libraries/physics/src/ObjectActionTravelOriented.cpp index 8ab24511d7..accade8695 100644 --- a/libraries/physics/src/ObjectActionTravelOriented.cpp +++ b/libraries/physics/src/ObjectActionTravelOriented.cpp @@ -146,6 +146,17 @@ bool ObjectActionTravelOriented::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "travel-oriented" {@link Entities.ActionType|ActionType} orients an entity to align with its direction of + * travel. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-TravelOriented + * @property {Vec3} forward=0,0,0 - The axis of the entity to align with the entity's direction of travel. + * @property {number} angularTimeScale=0.1 - Controls how long it takes for the entity's orientation to catch up with the + * direction of travel. The value is the time for the action to catch up to 1/e = 0.368 of the target value, where the + * action is applied using an exponential decay. + */ QVariantMap ObjectActionTravelOriented::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectConstraintBallSocket.cpp b/libraries/physics/src/ObjectConstraintBallSocket.cpp index 9dd85954a3..70613d46ae 100644 --- a/libraries/physics/src/ObjectConstraintBallSocket.cpp +++ b/libraries/physics/src/ObjectConstraintBallSocket.cpp @@ -181,6 +181,15 @@ bool ObjectConstraintBallSocket::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "ball-socket" {@link Entities.ActionType|ActionType} connects two entities with a ball and socket joint. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-BallSocket + * @property {Vec3} pivot=0,0,0 - The local offset of the joint relative to the entity's position. + * @property {Uuid} otherEntityID=null - The ID of the other entity that is connected to the joint. + * @property {Vec3} otherPivot=0,0,0 - The local offset of the joint relative to the other entity's position. + */ QVariantMap ObjectConstraintBallSocket::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectConstraintConeTwist.cpp b/libraries/physics/src/ObjectConstraintConeTwist.cpp index 49f926af81..86f1f21c63 100644 --- a/libraries/physics/src/ObjectConstraintConeTwist.cpp +++ b/libraries/physics/src/ObjectConstraintConeTwist.cpp @@ -261,6 +261,21 @@ bool ObjectConstraintConeTwist::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "cone-twist" {@link Entities.ActionType|ActionType} connects two entities with a joint that can move + * through a cone and can twist. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-ConeTwist + * @property {Vec3} pivot=0,0,0 - The local offset of the joint relative to the entity's position. + * @property {Vec3} axis=1,0,0 - The axis of the entity that moves through the cone. Must be a non-zero vector. + * @property {Uuid} otherEntityID=null - The ID of the other entity that is connected to the joint. + * @property {Vec3} otherPivot=0,0,0 - The local offset of the joint relative to the other entity's position. + * @property {Vec3} otherAxis=1,0,0 - The axis of the other entity that moves through the cone. Must be a non-zero vector. + * @property {number} swingSpan1=6.238 - The angle through which the joint can move in one axis of the cone, in radians. + * @property {number} swingSpan2=6.238 - The angle through which the joint can move in the other axis of the cone, in radians. + * @property {number} twistSpan=6.238 - The angle through with the joint can twist, in radians. + */ QVariantMap ObjectConstraintConeTwist::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index 52be64796a..99ddd45abd 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -245,6 +245,22 @@ bool ObjectConstraintHinge::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "hinge" {@link Entities.ActionType|ActionType} lets an entity pivot about an axis or connects two entities + * with a hinge joint. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-Hinge + * @property {Vec3} pivot=0,0,0 - The local offset of the joint relative to the entity's position. + * @property {Vec3} axis=1,0,0 - The axis of the entity that it pivots about. Must be a non-zero vector. + * @property {Uuid} otherEntityID=null - The ID of the other entity that is connected to the joint, if any. If none is + * specified then the first entity simply pivots about its specified axis. + * @property {Vec3} otherPivot=0,0,0 - The local offset of the joint relative to the other entity's position. + * @property {Vec3} otherAxis=1,0,0 - The axis of the other entity that it pivots about. Must be a non-zero vector. + * @property {number} low=-6.283 - The most negative angle that the hinge can take, in radians. + * @property {number} high=6.283 - The most positive angle that the hinge can take, in radians. + * @property {number} angle=0 - The current angle of the hinge. Read-only. + */ QVariantMap ObjectConstraintHinge::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectConstraintSlider.cpp b/libraries/physics/src/ObjectConstraintSlider.cpp index ded9ad47e6..c236afc10d 100644 --- a/libraries/physics/src/ObjectConstraintSlider.cpp +++ b/libraries/physics/src/ObjectConstraintSlider.cpp @@ -261,6 +261,31 @@ bool ObjectConstraintSlider::updateArguments(QVariantMap arguments) { return true; } +/**jsdoc + * The "slider" {@link Entities.ActionType|ActionType} lets an entity slide and rotate along an axis, or connects + * two entities that slide and rotate along a shared axis. + * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. + * + * @typedef {object} Entities.ActionArguments-Slider + * @property {Vec3} point=0,0,0 - The local position of a point in the entity that slides along the axis. + * @property {Vec3} axis=1,0,0 - The axis of the entity that slides along the joint. Must be a non-zero vector. + * @property {Uuid} otherEntityID=null - The ID of the other entity that is connected to the joint, if any. If non is + * specified then the first entity simply slides and rotates about its specified axis. + * @property {Vec3} otherPoint=0,0,0 - The local position of a point in the other entity that slides along the axis. + * @property {Vec3} axis=1,0,0 - The axis of the other entity that slides along the joint. Must be a non-zero vector. + * @property {number} linearLow=1.17e-38 - The most negative linear offset from the entity's initial point that the entity can + * have along the slider. + * @property {number} linearHigh=3.40e+38 - The most positive linear offset from the entity's initial point that the entity can + * have along the slider. + * @property {number} angularLow=-6.283 - The most negative angle that the entity can rotate about the axis if the action + * involves only one entity, otherwise the most negative angle the rotation can be between the two entities. In radians. + * @property {number} angularHigh=6.283 - The most positive angle that the entity can rotate about the axis if the action + * involves only one entity, otherwise the most positive angle the rotation can be between the two entities. In radians. + * @property {number} linearPosition=0 - The current linear offset the entity is from its initial point if the action involves + * only one entity, otherwise the linear offset between the two entities' action points. Read-only. + * @property {number} angularPosition=0 - The current angular offset of the entity from its initial rotation if the action + * involves only one entity, otherwise the angular offset between the two entities. Read-only. + */ QVariantMap ObjectConstraintSlider::getArguments() { QVariantMap arguments = ObjectDynamic::getArguments(); withReadLock([&] { diff --git a/libraries/physics/src/ObjectDynamic.cpp b/libraries/physics/src/ObjectDynamic.cpp index 3deadd6468..5bbb5981d1 100644 --- a/libraries/physics/src/ObjectDynamic.cpp +++ b/libraries/physics/src/ObjectDynamic.cpp @@ -93,6 +93,38 @@ bool ObjectDynamic::updateArguments(QVariantMap arguments) { return somethingChanged; } +/**jsdoc +* Different entity action types have different arguments: some common to all actions (listed below) and some specific to each +* {@link Entities.ActionType|ActionType} (linked to below). The arguments are accessed as an object of property names and +* values. +* +* @typedef {object} Entities.ActionArguments +* @property {Entities.ActionType} type - The type of action. +* @property {string} tag="" - A string that a script can use for its own purposes. +* @property {number} ttl=0 - How long the action should exist, in seconds, before it is automatically deleted. A value of +* 0 means that the action should not be deleted. +* @property {boolean} isMine=true - Is true if you created the action during your current Interface session, +* false otherwise. Read-only. +* @property {boolean} ::no-motion-state - Is present when the entity hasn't been registered with the physics engine yet (e.g., +* if the action hasn't been properly configured), otherwise undefined. Read-only. +* @property {boolean} ::active - Is true when the action is modifying the entity's motion, false +* otherwise. Is present once the entity has been registered with the physics engine, otherwise undefined. +* Read-only. +* @property {Entities.PhysicsMotionType} ::motion-type - How the entity moves with the action. Is present once the entity has +* been registered with the physics engine, otherwise undefined. Read-only. +* +* @see The different action types have additional arguments as follows: +* @see {@link Entities.ActionArguments-FarGrab|ActionArguments-FarGrab} +* @see {@link Entities.ActionArguments-Hold|ActionArguments-Hold} +* @see {@link Entities.ActionArguments-Offset|ActionArguments-Offset} +* @see {@link Entities.ActionArguments-Tractor|ActionArguments-Tractor} +* @see {@link Entities.ActionArguments-TravelOriented|ActionArguments-TravelOriented} +* @see {@link Entities.ActionArguments-Hinge|ActionArguments-Hinge} +* @see {@link Entities.ActionArguments-Slider|ActionArguments-Slider} +* @see {@link Entities.ActionArguments-ConeTwist|ActionArguments-ConeTwist} +* @see {@link Entities.ActionArguments-BallSocket|ActionArguments-BallSocket} +*/ +// Note: The "type" property is set in EntityItem::getActionArguments(). QVariantMap ObjectDynamic::getArguments() { QVariantMap arguments; withReadLock([&]{ diff --git a/libraries/physics/src/ObjectMotionState.h b/libraries/physics/src/ObjectMotionState.h index 0b91ede574..7f583ca9ca 100644 --- a/libraries/physics/src/ObjectMotionState.h +++ b/libraries/physics/src/ObjectMotionState.h @@ -29,6 +29,23 @@ enum PhysicsMotionType { MOTION_TYPE_KINEMATIC // keyframed motion }; +/**jsdoc + *

An entity's physics motion type may be one of the following:

+ * + * + * + * + * + * + * + * + * + *
ValueDescription
"static"There is no motion because the entity is locked — its locked + * property is set to true.
"kinematic"Motion is applied without physical laws (e.g., damping) because the entity is + * not locked and has its dynamic property set to false.
"dynamic"Motion is applied according to physical laws (e.g., damping) because the entity + * is not locked and has its dynamic property set to true.
+ * @typedef {string} Entities.PhysicsMotionType + */ inline QString motionTypeToString(PhysicsMotionType motionType) { switch(motionType) { case MOTION_TYPE_STATIC: return QString("static"); diff --git a/scripts/developer/tests/dynamics/dynamicsTests.js b/scripts/developer/tests/dynamics/dynamicsTests.js index e9262c9308..db089f09ee 100644 --- a/scripts/developer/tests/dynamics/dynamicsTests.js +++ b/scripts/developer/tests/dynamics/dynamicsTests.js @@ -186,7 +186,7 @@ var prevEntityID = null; for (var i = 0; i < 7; i++) { var newID = Entities.addEntity({ - name: "hinge test " + i, + name: "slider test " + i, type: "Box", color: { blue: 128, green: 40 * i, red: 20 }, dimensions: { x: 0.2, y: 0.1, z: 0.2 }, diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 5c5fae8795..9f8570b4f3 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -27,10 +27,11 @@ exports.handlers = { '../../libraries/entities/src', '../../libraries/octree/src', '../../libraries/networking/src', + '../../libraries/physics/src', '../../libraries/pointers/src', + '../../libraries/script-engine/src', '../../libraries/shared/src', '../../libraries/shared/src/shared', - '../../libraries/script-engine/src', ]; var exts = ['.h', '.cpp']; From 2eb7be26cfd7b26e8903aa1171a4e85d0323a963 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 27 Feb 2018 10:16:25 +0100 Subject: [PATCH 128/267] Merged with master and fixed tablet NoAA flag --- libraries/render-utils/src/AntialiasingEffect.cpp | 8 ++++---- libraries/render-utils/src/skin_model_dq.slv | 2 +- libraries/render-utils/src/skin_model_fade_dq.slv | 4 ++-- libraries/render-utils/src/skin_model_normal_map_dq.slv | 2 +- .../render-utils/src/skin_model_normal_map_fade_dq.slv | 6 ++++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/AntialiasingEffect.cpp b/libraries/render-utils/src/AntialiasingEffect.cpp index 8da42f8ff6..4a9b69c099 100644 --- a/libraries/render-utils/src/AntialiasingEffect.cpp +++ b/libraries/render-utils/src/AntialiasingEffect.cpp @@ -218,9 +218,9 @@ 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); + PrepareStencil::testNoAA(*state); // Good to go add the brand new pipeline _antialiasingPipeline = gpu::Pipeline::create(program, state); @@ -241,7 +241,7 @@ const gpu::PipelinePointer& Antialiasing::getBlendPipeline() { gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - PrepareStencil::testMask(*state); + PrepareStencil::testNoAA(*state); // Good to go add the brand new pipeline @@ -272,7 +272,7 @@ const gpu::PipelinePointer& Antialiasing::getDebugBlendPipeline() { gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - PrepareStencil::testMask(*state); + PrepareStencil::testNoAA(*state); // Good to go add the brand new pipeline diff --git a/libraries/render-utils/src/skin_model_dq.slv b/libraries/render-utils/src/skin_model_dq.slv index 96f9b4a713..6e369c7c82 100644 --- a/libraries/render-utils/src/skin_model_dq.slv +++ b/libraries/render-utils/src/skin_model_dq.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_fade_dq.slv b/libraries/render-utils/src/skin_model_fade_dq.slv index 4f8a923a03..232170d714 100644 --- a/libraries/render-utils/src/skin_model_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_fade_dq.slv @@ -2,7 +2,7 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -// skin_model_fade.vert +// skin_model_fade_dq.vert // vertex shader // // Created by Olivier Prat on 06/045/17. @@ -38,7 +38,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_dq.slv b/libraries/render-utils/src/skin_model_normal_map_dq.slv index 02b3742f6f..b34f68d291 100644 --- a/libraries/render-utils/src/skin_model_normal_map_dq.slv +++ b/libraries/render-utils/src/skin_model_normal_map_dq.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/skin_model_normal_map_fade_dq.slv b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv index 02b3742f6f..230077ba3b 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv @@ -2,7 +2,7 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -// skin_model_normal_map.vert +// skin_model_normal_map_fade_dq.vert // vertex shader // // Created by Andrzej Kapolka on 10/29/13. @@ -30,6 +30,7 @@ out vec3 _normal; out vec3 _tangent; out vec3 _color; out float _alpha; +out vec4 _worldPosition; void main(void) { vec4 position = vec4(0.0, 0.0, 0.0, 0.0); @@ -39,7 +40,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(); @@ -53,6 +54,7 @@ void main(void) { TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); <$transformModelToEyeAndClipPos(cam, obj, position, _position, gl_Position)$> + <$transformModelToWorldPos(obj, position, _worldPosition)$> <$transformModelToWorldDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> <$transformModelToWorldDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$> From 1dfdc0ce1b8ce3f3d37ebf12a03080a7b408f811 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 27 Feb 2018 16:25:04 -0300 Subject: [PATCH 129/267] Hide the selection cursor (android only) --- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index 32b68cd696..23a63c8f2a 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -1157,7 +1157,14 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even if (_quickWindow && _quickWindow->activeFocusItem()) { event->ignore(); if (QCoreApplication::sendEvent(_quickWindow->activeFocusItem(), event)) { - return event->isAccepted(); + bool eventAccepted = event->isAccepted(); + QInputMethodQueryEvent* imqEvent = static_cast(event); + // this block disables the selection cursor in android which appears in + // the top-left corner of the screen + if (imqEvent->queries() & Qt::ImEnabled) { + imqEvent->setValue(Qt::ImEnabled, QVariant(false)); + } + return eventAccepted; } return false; } From 483688a6e1625a201f6c51129086c2d039ee8ed0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Feb 2018 08:40:36 +1300 Subject: [PATCH 130/267] Web entity EventBridge functions JSDoc --- .../entities/src/EntityScriptingInterface.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index d4ae83087d..e0e699f7d4 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1242,6 +1242,14 @@ public slots: */ Q_INVOKABLE bool wantsHandControllerPointerEvents(QUuid id); + /**jsdoc + * Send a script event over a {@link Entities.EntityType|"Web"} entity's EventBridge to the Web + * page's scripts. + * @function Entities.emitScriptEvent + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|"Web"} entity. + * @param {string} message - The message to send. + * @todo This function is currently not implemented. + */ Q_INVOKABLE void emitScriptEvent(const EntityItemID& entityID, const QVariant& message); /**jsdoc @@ -1663,6 +1671,14 @@ signals: */ void debitEnergySource(float value); + /**jsdoc + * Triggered in when a script in a {@link Entities.EntityType|"Web"} entity's Web page script sends an event + * over the script's EventBridge. + * @function Entities.webEventReceived + * @param {Uuid} entityID - The ID of the entity that event was received from. + * @param {string} message - The message received. + * @returns {Signal} + */ void webEventReceived(const EntityItemID& entityItemID, const QVariant& message); protected: From 9f6f6a9b0d1b1868a8803747935a1df9200e2d8a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Feb 2018 10:31:34 +1300 Subject: [PATCH 131/267] Entities scripts JSDoc --- .../entities/src/EntityItemProperties.cpp | 3 +- .../entities/src/EntityScriptingInterface.h | 131 +++++++++++------- 2 files changed, 80 insertions(+), 54 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index d8ac4ae7e1..965b6ea6a8 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -499,7 +499,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * * @property {string} script="" - The URL of the client entity script, if any, that is attached to the entity. * @property {number} scriptTimestamp=0 - Intended to be used to indicate when the client entity script was loaded. Should be - * an integer number of milliseconds since midnight GMT on January 1, 1970. + * an integer number of milliseconds since midnight GMT on January 1, 1970 (e.g., as supplied by Date.now(). + * If you update the property's value, the script is re-downloaded and reloaded. * @property {string} serverScripts="" - The URL of the server entity script, if any, that is attached to the entity. * * @property {Uuid} parentID=Uuid.NULL - The ID of the entity or avatar that this entity is parented to. {@link Uuid|Uuid.NULL} diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index e0e699f7d4..9c819f033b 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -278,53 +278,41 @@ public slots: */ Q_INVOKABLE void deleteEntity(QUuid entityID); + /**jsdoc - * Call a method on an entity in the same context as this function is called. Allows a script - * to call a method on an entity's script. The method will execute in the entity script engine. - * If the entity does not have an entity script or the method does not exist, this call will - * have no effect. If it is running an entity script (specified by the `script` property) - * and it exposes a property with the specified name `method`, it will be called - * using `params` as the list of arguments. If this is called within an entity script, the - * method will be executed on the client in the entity script engine in which it was called. If - * this is called in an entity server script, the method will be executed on the entity server - * script engine. - * + * Call a method in a client entity script from a client script or client entity script. The entity script method must be + * exposed as a property in the target client entity script. * @function Entities.callEntityMethod - * @param {EntityID} entityID The ID of the entity to call the method on. - * @param {string} method The name of the method to call. - * @param {string[]} params The list of parameters to call the specified method with. + * @param {Uuid} entityID - The ID of the entity to call the method in. + * @param {string} method - The name of the method to call. + * @param [{string[]} parameters=[]] - The parameters to call the specified method with. */ Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method, const QStringList& params = QStringList()); /**jsdoc - * Call a server method on an entity. Allows a client entity script to call a method on an - * entity's server script. The method will execute in the entity server script engine. If - * the entity does not have an entity server script or the method does not exist, this call will - * have no effect. If the entity is running an entity script (specified by the `serverScripts` property) - * and it exposes a property with the specified name `method`, it will be called using `params` as - * the list of arguments. - * - * @function Entities.callEntityServerMethod - * @param {EntityID} entityID The ID of the entity to call the method on. - * @param {string} method The name of the method to call. - * @param {string[]} params The list of parameters to call the specified method with. - */ + * Call a method in a server entity script from a client script or client entity script. The entity script method must be + * exposed as a property in the target client entity script. Additionally, the target client entity script must include the + * method's name in an exposed property called remotelyCallable that is an array of method names that can be + * called. + * @function Entities.callEntityServerMethod + * @param {Uuid} entityID - The ID of the entity to call the method in. + * @param {string} method - The name of the method to call. + * @param [{string[]} parameters=[]] - The parameters to call the specified method with. + */ Q_INVOKABLE void callEntityServerMethod(QUuid entityID, const QString& method, const QStringList& params = QStringList()); /**jsdoc - * Call a client method on an entity on a specific client node. Allows a server entity script to call a - * method on an entity's client script for a particular client. The method will execute in the entity script - * engine on that single client. If the entity does not have an entity script or the method does not exist, or - * the client is not connected to the domain, or you attempt to make this call outside of the entity server - * script, this call will have no effect. - * - * @function Entities.callEntityClientMethod - * @param {SessionID} clientSessionID The session ID of the client to call the method on. - * @param {EntityID} entityID The ID of the entity to call the method on. - * @param {string} method The name of the method to call. - * @param {string[]} params The list of parameters to call the specified method with. - */ - Q_INVOKABLE void callEntityClientMethod(QUuid clientSessionID, QUuid entityID, const QString& method, const QStringList& params = QStringList()); + * Call a method in a specific user's client entity script from a server entity script. The entity script method must be + * exposed as a property in the target client entity script. + * @function Entities.callEntityClientMethod + * @param {Uuid} clientSessionID - The session ID of the user to call the method in. + * @param {Uuid} entityID - The ID of the entity to call the method in. + * @param {string} method - The name of the method to call. + * @param [{string[]} parameters=[]] - The parameters to call the specified method with. + */ + Q_INVOKABLE void callEntityClientMethod(QUuid clientSessionID, QUuid entityID, const QString& method, + const QStringList& params = QStringList()); + /**jsdoc * Find the entity with a position closest to a specified point and within a specified radius. @@ -452,29 +440,66 @@ public slots: Q_INVOKABLE RayToEntityIntersectionResult findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue()); + + /**jsdoc + * Reloads an entity's server entity script such that the latest version re-downloaded. + * @function Entities.reloadServerScripts + * @param {Uuid} entityID - The ID of the entity to reload the server entity script of. + * @returns {boolean} true if the reload request was successfully sent to the server, false + * otherwise. + */ Q_INVOKABLE bool reloadServerScripts(QUuid entityID); /**jsdoc - * Query additional metadata for "magic" Entity properties like `script` and `serverScripts`. - * - * @function Entities.queryPropertyMetadata - * @param {EntityID} entityID The ID of the entity. - * @param {string} property The name of the property extended metadata is wanted for. - * @param {ResultCallback} callback Executes callback(err, result) with the query results. + * Gets the status of server entity script attached to an entity + * @function Entities.getServerScriptStatus + * @property {Uuid} entityID - The ID of the entity to get the server entity script status for. + * @property {Entities~getServerScriptStatusCallback} callback - The function to call upon completion. + * @returns {boolean} true always. */ /**jsdoc - * Query additional metadata for "magic" Entity properties like `script` and `serverScripts`. - * - * @function Entities.queryPropertyMetadata - * @param {EntityID} entityID The ID of the entity. - * @param {string} property The name of the property extended metadata is wanted for. - * @param {Object} thisObject The scoping "this" context that callback will be executed within. - * @param {ResultCallback} callbackOrMethodName Executes thisObject[callbackOrMethodName](err, result) with the query results. + * Called when {@link Entities.getServerScriptStatus} is complete. + * @callback Entities~getServerScriptStatusCallback + * @param {boolean} success - true if the server entity script status could be obtained, otherwise + * false. + * @param {boolean} isRunning - true if there is a server entity script running, otherwise false. + * @param {string} status - "running" if there is a server entity script running, otherwise an error string. + * @param {string} errorInfo - "" if there is a server entity script running, otherwise it may contain extra + * information on the error. */ - Q_INVOKABLE bool queryPropertyMetadata(QUuid entityID, QScriptValue property, QScriptValue scopeOrCallback, + Q_INVOKABLE bool getServerScriptStatus(QUuid entityID, QScriptValue callback); + + /**jsdoc + * Get metadata for "magic" entity properties such as script and serverScripts. + * @function Entities.queryPropertyMetadata + * @param {Uuid} entityID - The ID of the entity to get the metadata for. + * @param {string} property - The property name to get the metadata for. + * @param {Entities~queryPropertyMetadataCallback} callback - The function to call upon completion. + * @returns {boolean} true if the request for metadata was successfully sent to the server, false + * otherwise. + * @throws Throws an error if property is not handled yet or callback is not a function. + */ + /**jsdoc + * Get metadata for "magic" entity properties such as script and serverScripts. + * @function Entities.queryPropertyMetadata + * @param {Uuid} entityID - The ID of the entity to get the metadata for. + * @param {string} property - The property name to get the metadata for. + * @param {object} scope - The "this" context that the callback will be executed within. + * @param {Entities~queryPropertyMetadataCallback} callback - The function to call upon completion. + * @returns {boolean} true if the request for metadata was successfully sent to the server, false + * otherwise. + * @throws Throws an error if property is not handled yet or callback is not a function. + */ + /**jsdoc + * Called when {@link Entities.queryPropertyMetadata} is complete. + * @callback Entities~queryPropertyMetadataCallback + * @param {string} error - undefined if there was no error, otherwise an error message. + * @param {object} result - The metadata for the requested entity property if there was no error, otherwise + * undefined. + */ + Q_INVOKABLE bool queryPropertyMetadata(QUuid entityID, QScriptValue property, QScriptValue scopeOrCallback, QScriptValue methodOrName = QScriptValue()); - Q_INVOKABLE bool getServerScriptStatus(QUuid entityID, QScriptValue callback); /**jsdoc * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. Ray picks are From 9c1fa7a8d268ad3114c4fec24348ac31dcb33877 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Feb 2018 11:44:03 +1300 Subject: [PATCH 132/267] Miscellaneous JSDoc tidying and fixes --- .../entities/src/EntityItemProperties.cpp | 31 +++--- .../entities/src/EntityScriptingInterface.h | 94 ++++++++++--------- .../octree/src/OctreeScriptingInterface.h | 6 +- 3 files changed, 68 insertions(+), 63 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 965b6ea6a8..d2c97dc23d 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -407,8 +407,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { } /**jsdoc - * Different entity types have different properties: some common to all entities (listed below) and some specific to the type - * of entity (listed separately). The properties are accessed as an object of property names and values. + * Different entity types have different properties: some common to all entities (listed below) and some specific to each + * {@link Entities.EntityType|EntityType} (linked to below). The properties are accessed as an object of property names and + * values. * * @typedef {object} Entities.EntityProperties * @property {Uuid} id - The ID of the entity. Read-only. @@ -529,6 +530,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * * @property {string} actionData="" - Base-64 encoded compressed dump of the actions associated with the entity. This property * is typically not used in scripts directly; rather, functions that manipulate an entity's actions update it. + * The size of this property increases with the number of actions. Because this property value has to fit within a High + * Fidelity datagram packet there is a limit to the number of actions that an entity can have. * Read-only. * @property {Entities.RenderInfo} renderInfo - Information on the cost of rendering the entity. Currently information is only * provided for Model entities. Read-only. @@ -550,18 +553,18 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {number} staticCertificateVersion=0 - The version of the method used to generate the certificateID. * * @see The different entity types have additional properties as follows: - * @see Entities.EntityProperties-Box - * @see Entities.EntityProperties-Light - * @see Entities.EntityProperties-Line - * @see Entities.EntityProperties-Model - * @see Entities.EntityProperties-ParticleEffect - * @see Entities.EntityProperties-PolyLine - * @see Entities.EntityProperties-PolyVox - * @see Entities.EntityProperties-Shape - * @see Entities.EntityProperties-Sphere - * @see Entities.EntityProperties-Text - * @see Entities.EntityProperties-Web - * @see Entities.EntityProperties-Zone + * @see {@link Entities.EntityProperties-Box|EntityProperties-Box} + * @see {@link Entities.EntityProperties-Light|EntityProperties-Light} + * @see {@link Entities.EntityProperties-Line|EntityProperties-Line} + * @see {@link Entities.EntityProperties-Model|EntityProperties-Model} + * @see {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} + * @see {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} + * @see {@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox} + * @see {@link Entities.EntityProperties-Shape|EntityProperties-Shape} + * @see {@link Entities.EntityProperties-Sphere|EntityProperties-Sphere} + * @see {@link Entities.EntityProperties-Text|EntityProperties-Text} + * @see {@link Entities.EntityProperties-Web|EntityProperties-Web} + * @see {@link Entities.EntityProperties-Zone|EntityProperties-Zone} */ /**jsdoc diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 9c819f033b..e665a3cca8 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -221,8 +221,7 @@ public slots: * @param {Uuid} entityID - The ID of the entity to get the properties of. * @param {string[]} [desiredProperties=[]] - Array of the names of the properties to get. If the array is empty, * all properties are returned. - * @returns {Entities.EntityProperties} The properties of the entity; {} if entityID is not the - * ID of an entity. + * @returns {Entities.EntityProperties} The properties of the entity if the entity can be found, otherwise an empty object. * @example Report the color of a new box entity. * var entityID = Entities.addEntity({ * type: "Box", @@ -285,7 +284,7 @@ public slots: * @function Entities.callEntityMethod * @param {Uuid} entityID - The ID of the entity to call the method in. * @param {string} method - The name of the method to call. - * @param [{string[]} parameters=[]] - The parameters to call the specified method with. + * @param {string[]} [parameters=[]] - The parameters to call the specified method with. */ Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method, const QStringList& params = QStringList()); @@ -297,7 +296,7 @@ public slots: * @function Entities.callEntityServerMethod * @param {Uuid} entityID - The ID of the entity to call the method in. * @param {string} method - The name of the method to call. - * @param [{string[]} parameters=[]] - The parameters to call the specified method with. + * @param {string[]} [parameters=[]] - The parameters to call the specified method with. */ Q_INVOKABLE void callEntityServerMethod(QUuid entityID, const QString& method, const QStringList& params = QStringList()); @@ -308,7 +307,7 @@ public slots: * @param {Uuid} clientSessionID - The session ID of the user to call the method in. * @param {Uuid} entityID - The ID of the entity to call the method in. * @param {string} method - The name of the method to call. - * @param [{string[]} parameters=[]] - The parameters to call the specified method with. + * @param {string[]} [parameters=[]] - The parameters to call the specified method with. */ Q_INVOKABLE void callEntityClientMethod(QUuid clientSessionID, QUuid entityID, const QString& method, const QStringList& params = QStringList()); @@ -333,7 +332,8 @@ public slots: * @function Entities.findEntities * @param {Vec3} center - The point about which to search. * @param {number} radius - The radius within which to search. - * @returns {Uuid[]} An array of entity IDs that were found that intersect the search sphere. + * @returns {Uuid[]} An array of entity IDs that were found that intersect the search sphere. The array is empty if no + * entities could be found. * @example Report how many entities are within 10m of your avatar. * var entityIDs = Entities.findEntities(MyAvatar.position, 10); * print("Number of entities within 10m: " + entityIDs.length); @@ -347,7 +347,8 @@ public slots: * @function Entities.findEntitiesInBox * @param {Vec3} corner - The corner of the search AA box with minimum co-ordinate values. * @param {Vec3} dimensions - The dimensions of the search AA box. - * @returns {Uuid[]} An array of entity IDs whose AA boxes intersect the search AA box. + * @returns {Uuid[]} An array of entity IDs whose AA boxes intersect the search AA box. The array is empty if no entities + * could be found. */ /// this function will not find any models in script engine contexts which don't have access to models Q_INVOKABLE QVector findEntitiesInBox(const glm::vec3& corner, const glm::vec3& dimensions) const; @@ -357,7 +358,8 @@ public slots: * @function Entities.findEntitiesInFrustum * @param {ViewFrustum} frustum - The frustum to search in. The position, orientation, * projection, and centerRadius properties must be specified. - * @returns {Uuid[]} An array of entity IDs axis-aligned boxes intersect the frustum. + * @returns {Uuid[]} An array of entity IDs axis-aligned boxes intersect the frustum. The array is empty if no entities + * could be found. * @example Report the number of entities in view. * var entityIDs = Entities.findEntitiesInFrustum(Camera.frustum); * print("Number of entities in view: " + entityIDs.length); @@ -371,7 +373,8 @@ public slots: * @param {Entities.EntityType} entityType - The type of entity to search for. * @param {Vec3} center - The point about which to search. * @param {number} radius - The radius within which to search. - * @returns {Uuid[]} An array of entity IDs of the specified type that intersect the search sphere. + * @returns {Uuid[]} An array of entity IDs of the specified type that intersect the search sphere. The array is empty if + * no entities could be found. * @example Report the number of Model entities within 10m of your avatar. * var entityIDs = Entities.findEntitiesByType("Model", MyAvatar.position, 10); * print("Number of Model entities within 10m: " + entityIDs.length); @@ -430,8 +433,6 @@ public slots: * entity, the result's extraInfo property includes more information than it otherwise would. * @param {Uuid[]} [entitiesToInclude=[]] - If not empty then the search is restricted to these entities. * @param {Uuid[]} [entitiesToDiscard=[]] - Entities to ignore during the search. - * @param {boolean} [visibleOnly=false] - If true then only entities that are - * {@link Entities.EntityProperties|visible} are searched. * @deprecated This function is deprecated and will soon be removed. Use * {@link Entities.findRayIntersection|findRayIntersection} instead; it blocks and performs the same function. */ @@ -445,8 +446,8 @@ public slots: * Reloads an entity's server entity script such that the latest version re-downloaded. * @function Entities.reloadServerScripts * @param {Uuid} entityID - The ID of the entity to reload the server entity script of. - * @returns {boolean} true if the reload request was successfully sent to the server, false - * otherwise. + * @returns {boolean} true if the reload request was successfully sent to the server, otherwise + * false. */ Q_INVOKABLE bool reloadServerScripts(QUuid entityID); @@ -475,8 +476,8 @@ public slots: * @param {Uuid} entityID - The ID of the entity to get the metadata for. * @param {string} property - The property name to get the metadata for. * @param {Entities~queryPropertyMetadataCallback} callback - The function to call upon completion. - * @returns {boolean} true if the request for metadata was successfully sent to the server, false - * otherwise. + * @returns {boolean} true if the request for metadata was successfully sent to the server, otherwise + * false. * @throws Throws an error if property is not handled yet or callback is not a function. */ /**jsdoc @@ -486,8 +487,8 @@ public slots: * @param {string} property - The property name to get the metadata for. * @param {object} scope - The "this" context that the callback will be executed within. * @param {Entities~queryPropertyMetadataCallback} callback - The function to call upon completion. - * @returns {boolean} true if the request for metadata was successfully sent to the server, false - * otherwise. + * @returns {boolean} true if the request for metadata was successfully sent to the server, otherwise + * false. * @throws Throws an error if property is not handled yet or callback is not a function. */ /**jsdoc @@ -553,7 +554,7 @@ public slots: * Set whether or not {@link Entities.EntityType|Zone} entities' boundaries should be drawn. Currently not used. * @function Entities.setDrawZoneBoundaries * @param {boolean} value - Set to true if {@link Entities.EntityType|Zone} entities' boundaries should be - * drawn, false otherwise. + * drawn, otherwise false. */ // FIXME move to a renderable entity interface Q_INVOKABLE void setDrawZoneBoundaries(bool value); @@ -562,7 +563,7 @@ public slots: * Get whether or not {@link Entities.EntityType|Zone} entities' boundaries should be drawn. Currently not used. * @function Entities.getDrawZoneBoundaries * @returns {boolean} true if {@link Entities.EntityType|Zone} entities' boundaries should be drawn, - * false otherwise. + * otherwise false. */ // FIXME move to a renderable entity interface Q_INVOKABLE bool getDrawZoneBoundaries() const; @@ -765,7 +766,7 @@ public slots: * @function Entities.setAllPoints * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. * @param {Vec3[]} points - The array of points to set the entity's linePoints property to. - * @returns {boolean} true if the entity's property was updated, false otherwise. The property + * @returns {boolean} true if the entity's property was updated, otherwise false. The property * may fail to be updated if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, * one of the points is outside the entity's dimensions, or the number of points is greater than the maximum allowed. * @example Change the shape of a Line entity. @@ -799,7 +800,7 @@ public slots: * @function Entities.appendPoint * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. * @param {Vec3} point - The point to add to the line. The coordinates are relative to the entity's position. - * @returns {boolean} true if the point was added to the line, false otherwise. The point may + * @returns {boolean} true if the point was added to the line, otherwise false. The point may * fail to be added if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, the * point is outside the entity's dimensions, or the maximum number of points has been reached. * @example Append a point to a Line entity. @@ -861,7 +862,7 @@ public slots: /**jsdoc * Update an entity action. * @function Entities.updateAction - * @param (Uuid} entityID - The ID of the entity with the action to update. + * @param {Uuid} entityID - The ID of the entity with the action to update. * @param {Uuid} actionID - The ID of the action to update. * @param {Entities.ActionArguments} arguments - The arguments to update. * @returns {boolean} true if the update was successful, otherwise false. @@ -871,7 +872,7 @@ public slots: /**jsdoc * Delete an action from an entity. * @function Entities.deleteAction - * @param (Uuid} entityID - The ID of entity to delete the action from. + * @param {Uuid} entityID - The ID of entity to delete the action from. * @param {Uuid} actionID - The ID of the action to delete. * @returns {boolean} true if the update was successful, otherwise false. */ @@ -888,7 +889,7 @@ public slots: /**jsdoc * Get the arguments of an action. * @function Entities.getActionArguments - * @param (Uuid} entityID - The ID of the entity with the action. + * @param {Uuid} entityID - The ID of the entity with the action. * @param {Uuid} actionID - The ID of the action to get the arguments of. * @returns {Entities.ActionArguments} The arguments of the requested action if found, otherwise an empty object. */ @@ -1050,7 +1051,7 @@ public slots: * @function Entities.getJointNames * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Model} entity. * @returns {string[]} The names of all the joints in the entity if it is a {@link Entities.EntityType|Model} entity and - * is loaded, otherwise []. The joint names are in order per {@link Entities.getJointIndex|getJointIndex}. + * is loaded, otherwise an empty array. The joint names are in order per {@link Entities.getJointIndex|getJointIndex}. */ // FIXME move to a renderable entity interface Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); @@ -1061,8 +1062,8 @@ public slots: * @function Entities.getChildrenIDs * @param {Uuid} parentID - The ID of the entity to get the children IDs of. * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID - * entity. Does not include children's children, etc. The array is empty if no children can be found, - * parentID cannot be found, or parentID is not an entity. + * entity. Does not include children's children, etc. The array is empty if no children can be found or + * parentID cannot be found. * @example Report the children of an entity. * function createEntity(description, position, parent) { * var entity = Entities.addEntity({ @@ -1127,7 +1128,7 @@ public slots: * @param {Uuid} childID - The ID of the child entity or overlay to test for being a child, grandchild, etc. * @param {Uuid} parentID - The ID of the parent entity to test for being a parent, grandparent, etc. * @returns {boolean} true if the childID> entity or overlay has the parentID entity - * as a parent or grandparent etc. + * as a parent or grandparent etc., otherwise false. * @example Check that a grandchild entity is a child of its grandparent. * function createEntity(description, position, parent) { * var entity = Entities.addEntity({ @@ -1153,7 +1154,7 @@ public slots: /**jsdoc * Get the type — entity, overlay, or avatar — of an in-world item. * @function Entities.getNestableType - * @param {Uuid} id - The ID of the item to get the type of. + * @param {Uuid} entityID - The ID of the item to get the type of. * @returns {string} The type of the item: "entity" if the item is an entity, "overlay" if the * the item is an overlay, "avatar" if the item is an avatar; otherwise "unknown" if the item * cannot be found. @@ -1167,7 +1168,7 @@ public slots: * print(Entities.getNestableType(entity)); // "entity" * print(Entities.getNestableType(Uuid.generate())); // "unknown" */ - Q_INVOKABLE QString getNestableType(QUuid id); + Q_INVOKABLE QString getNestableType(QUuid entityID); /**jsdoc * Get the ID of the {@link Entities.EntityType|Web} entity that has keyboard focus. @@ -1258,22 +1259,21 @@ public slots: Q_INVOKABLE void sendHoverLeaveEntity(const EntityItemID& id, const PointerEvent& event); /**jsdoc - * Check whether an entity wants hand controller pointer events. For example, a "Web" - * {@link Entities.EntityType|EntityType} does but a "Shape" {@link Entities.EntityType|EntityType} doesn't. + * Check whether an entity wants hand controller pointer events. For example, a {@link Entities.EntityType|Web} entity does + * but a {@link Entities.EntityType|Shape} entity doesn't. * @function Entities.wantsHandControllerPointerEvents * @param {Uuid} entityID - The ID of the entity. - * @returns {boolean} true if the entity wants hand controller pointer events, false otherwise or - * if the entity cannot be found. + * @returns {boolean} true if the entity entity can be found and it wants hand controller pointer events, + * otherwise false. */ Q_INVOKABLE bool wantsHandControllerPointerEvents(QUuid id); /**jsdoc - * Send a script event over a {@link Entities.EntityType|"Web"} entity's EventBridge to the Web - * page's scripts. + * Send a script event over a {@link Entities.EntityType|Web} entity's EventBridge to the Web page's scripts. * @function Entities.emitScriptEvent - * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|"Web"} entity. + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Web} entity. * @param {string} message - The message to send. - * @todo This function is currently not implemented. + * @todo This function is currently not implemented. */ Q_INVOKABLE void emitScriptEvent(const EntityItemID& entityID, const QVariant& message); @@ -1311,7 +1311,8 @@ public slots: * Get the object to world transform, excluding scale, of an entity. * @function Entities.getEntityTransform * @param {Uuid} entityID - The ID of the entity. - * @returns {Mat4} The entity's object to world transform excluding scale; i.e., translation and rotation, with scale of 1. + * @returns {Mat4} The entity's object to world transform excluding scale (i.e., translation and rotation, with scale of 1) + * if the entity can be found, otherwise a transform with zero translation and rotation and a scale of 1. * @example Position and rotation in an entity's world transform. * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 1, z: -2 })); * var orientation = MyAvatar.orientation; @@ -1338,7 +1339,8 @@ public slots: * Get the object to parent transform, excluding scale, of an entity. * @function Entities.getEntityLocalTransform * @param {Uuid} entityID - The ID of the entity. - * @returns {Mat4} The entity's object to parent transform excluding scale; i.e., translation and rotation, with scale of 1. + * @returns {Mat4} The entity's object to parent transform excluding scale (i.e., translation and rotation, with scale of + * 1) if the entity can be found, otherwise a transform with zero translation and rotation and a scale of 1. * @example Position and rotation in an entity's local transform. * function createEntity(position, rotation, parent) { * var entity = Entities.addEntity({ @@ -1372,7 +1374,7 @@ public slots: * be altered. * @function Entities.getStaticCertificateJSON * @param {Uuid} entityID - The ID of the entity to get the static certificate for. - * @returns {string} The entity's static certificate as a JSON string. + * @returns {string} The entity's static certificate as a JSON string if the entity can be found, otherwise an empty string. */ Q_INVOKABLE QString getStaticCertificateJSON(const QUuid& entityID); @@ -1381,8 +1383,8 @@ public slots: * High Fidelity signing the entity's static certificate JSON. * @function Entities.verifyStaticCertificateProperties * @param {Uuid} entityID - The ID of the entity to verify. - * @returns {boolean} true if the entity's certificateID property is present and its value - * matches the entity's static certificate JSON, otherwise false. + * @returns {boolean} true if the entity can be found an its certificateID property is present + * and its value matches the entity's static certificate JSON; otherwise false. */ Q_INVOKABLE bool verifyStaticCertificateProperties(const QUuid& entityID); @@ -1690,15 +1692,15 @@ signals: /**jsdoc * @function Entities.debitEnergySource - * @param {number} value + * @param {number} value - The amount to debit. * @returns {Signal} * @deprecated This function is deprecated and will soon be removed. */ void debitEnergySource(float value); /**jsdoc - * Triggered in when a script in a {@link Entities.EntityType|"Web"} entity's Web page script sends an event - * over the script's EventBridge. + * Triggered in when a script in a {@link Entities.EntityType|Web} entity's Web page script sends an event over the + * script's EventBridge. * @function Entities.webEventReceived * @param {Uuid} entityID - The ID of the entity that event was received from. * @param {string} message - The message received. diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index c638c357b9..4154911d08 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -55,8 +55,8 @@ public slots: /**jsdoc * Check whether servers exist for the client to send entity packets to. * @function Entities.serversExist - * @returns {boolean} true if servers exist for the client to send entity packets to, false - * otherwise. + * @returns {boolean} true if servers exist for the client to send entity packets to, otherwise + * false. */ /// does a server exist to send to bool serversExist() const { return _packetSender->serversExist(); } @@ -64,7 +64,7 @@ public slots: /**jsdoc * Check whether the client has entity packets waiting to be sent. * @function Entities.hasPacketsToSend - * @returns {boolean} true if the client has entity packets waiting to be sent, false otherwise. + * @returns {boolean} true if the client has entity packets waiting to be sent, otherwise false. */ /// are there packets waiting in the send queue to be sent bool hasPacketsToSend() const { return _packetSender->hasPacketsToSend(); } From 1bb8a0fb1842389d708154971af3dfcb555924e6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Feb 2018 12:54:49 +1300 Subject: [PATCH 133/267] Fix up entity script calling JSDoc --- libraries/entities/src/EntityScriptingInterface.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 0bd8172349..41002b9917 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -285,8 +285,10 @@ public slots: /**jsdoc - * Call a method in a client entity script from a client script or client entity script. The entity script method must be - * exposed as a property in the target client entity script. + * Call a method in a client entity script from a client script or client entity script, or call a method in a server + * entity script from a server entity script. The entity script method must be exposed as a property in the target client + * entity script. Additionally, if calling a server entity script, the server entity script must include the method's name + * in an exposed property called remotelyCallable that is an array of method names that can be called. * @function Entities.callEntityMethod * @param {Uuid} entityID - The ID of the entity to call the method in. * @param {string} method - The name of the method to call. @@ -296,7 +298,7 @@ public slots: /**jsdoc * Call a method in a server entity script from a client script or client entity script. The entity script method must be - * exposed as a property in the target client entity script. Additionally, the target client entity script must include the + * exposed as a property in the target server entity script. Additionally, the target server entity script must include the * method's name in an exposed property called remotelyCallable that is an array of method names that can be * called. * @function Entities.callEntityServerMethod From 428f4b7b9d625f2af340fc10a38acbe8ce6dbe38 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 27 Feb 2018 21:24:21 -0300 Subject: [PATCH 134/267] Android - Make the virtual pad (joystick) position fixed. Change assets. --- interface/resources/images/analog_stick.png | Bin 2713 -> 5098 bytes .../resources/images/analog_stick_base.png | Bin 2020 -> 11853 bytes .../Basic2DWindowOpenGLDisplayPlugin.cpp | 13 ++++- .../Basic2DWindowOpenGLDisplayPlugin.h | 1 + .../src/display-plugins/CompositorHelper.cpp | 5 +- .../src/display-plugins/CompositorHelper.h | 2 +- .../TouchscreenVirtualPadDevice.cpp | 52 +++++++++++++----- .../TouchscreenVirtualPadDevice.h | 6 ++ 8 files changed, 59 insertions(+), 20 deletions(-) diff --git a/interface/resources/images/analog_stick.png b/interface/resources/images/analog_stick.png index e9457c730798ae0a77d6b50c2de30494515b3c61..238c2c74f44532e9561d63dba428bcbaecbdfd9c 100644 GIT binary patch literal 5098 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 literal 2713 zcmb7GZBSI#8Gg>$ySsOn1@6knZt6Ph;z!gX(WXPT2@@6u1T-p2A~6uS8UbyVdW|;0 z#=zktIF3m$(KNBpiutn5hio(L4pRso(lXXIp_w$JYwgqv7^k+j1A%EYFxa_w*|3DB zNq+2{+2?)F^PcTx1aM5|)z>wEqHKJs`$-}~ zxiIlmZg@@0)7HT~7a8El z%F%i3RF6pP;k3JH*_2xCx(#w--@`hMUSY`W@mcE3cp=L>zm{OwRBq5%%pPB1FXbP{ z4@l+UI~vZT2keh2?JIh~cGFH$OSBz(MA+==wP)WgfivazSqFOO@ff7nD@(E=@8B1j z4ZW0i`QF*{k8hJ6sGpdtlLfR0?GJX{uws}j82DwUFhVujof4c@C1{6JOd;N35jKPR z=0dC#+3g#WrjnQ)KRRB2Ge>9V$!;hrX=C8oX1{^L>f$B~T$w0c1Vx4a zIq+;lU>$|o##dY5N<-;lZJ60hCVw)8*%EkAgv-raJQ~{3PW-n}-arC7MVO5|7)B2h zzl-ud1b!&OO!*ayrh|@V;y(^f5NOaVFRei7Qj8el?LF1m_DLQx8PzJYBUB;P-Jx>c(1O#eydy@W_caK`*fBQRDMW@jxIxRvkpB= z2ciZyx=fAio@@UX0)a z`T-zeYvwW%@<+0c4llFtM`NNK;Ku#~g8bV^{i0`1E<|a1lu=wB`>CC+b3~cQCpS)s zJQ&RZ2J!L>x$yVQHX7!u`<}qheIXSPeDrjZRUV5}o#RO_Hr2;l<%utif0dohv5x=a zDzid!&61^UNFnTB(G8g8qVn>o3Lv8*((f7feD3;NMJT;(cDnn;iZ~J&{es^$-dJqM z#pt$wG}xVrw%N#CQLl!*ow-`3!R=5 zfJg%g39RPxY1$sy-8^<#kPn5Y=~iUiuMcVil^>715~;5^k-eX!kLN20J)m!_w6dqe z(9aRttV6F_Sa!~9#dXJa|0Kn>Ll;57?ePLwXu z(ML>vCxuzmEn^X{(#=6Lk|YXqOkks^nM{TUuJ59)S$7{h<$Z=gwy4SJZfcB^9~Tgp z%HFrbdlqz9k>B6V)!l8qi)NpoJ>0 zS=0(LvUBBR3{gghjWAGew+Nd>eQ(~`5==f?w0|+u>v|x|s7@g41Zgi!y>4Z@%x6ld zPHqyF|44AA@?#IJ>7{C?`D`R$Re~dwo!7o*4%i&3ZP18L!VaYnCc%-_-d_TzSIHQm zC^zu_R=|VwIsqb4MvI#+5x%nV`0gIC^H4??!Y67Qk%O{H5fW90^1&qDA5U>=e%UIv zHbp?WQU9;8Nch$K@6SRzsrq3)SP3bcbc4Tv^d}^^P0H0Ku=S27-O6AS*cHb?r-s1s zln%ggczQj$RJowx$EMf6o%r?D`a9h4IVa`Vn`4F}U9GG3Tk*krLknk#`tu9TEOYp> v3)MGFpE0Me#XgfhV^04In{&JKo>|KXOnYOW8Mq_81^^24*5{teksJRDyY64- diff --git a/interface/resources/images/analog_stick_base.png b/interface/resources/images/analog_stick_base.png index 3b7b8aa8a9a6d8a83847680423a18d86ff182b84..ac8c1b9ae8baa098468a38411a5270fd17e3b187 100644 GIT binary patch literal 11853 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 Gh5rLpcxJKy literal 2020 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGNS3%plmzFem6RtIr7}3C zG&JWf&Pa7#JMDHZce=Ff=eQFt9K%C@?TEFftI3B2hWQ5~55; zC`Y&nn;3>W9pux$F|XL#_hZKC6^whXRnpAK=VIS!B6HJr*%Iv2A8;N>U|h3fwJqllwgXT36Y`ZAcmx~% z_A(gQFnrqq3Z#ZCmIHR;3~j6o)v*i`LJV)p!2wpv(O|0&3cUqfj2qswLW9zvX?-)p zn_8qGeei$Jf94zinMe+GXc!P1Nf<#k+@c$iI#5%>XaIo<5IlKwG=N4(0I6M+VQlyd zE|j1}y3XPE3`oV1&S_(YhFW;3^&DJkT~TECwwu8~h2h3)rUM%o66SM*>WLL@3~ve< z6Dk-s>}PFIWIAx~-GdUA_3bZTny?lVZ}F}z7 +#include #include #include #include @@ -25,10 +26,14 @@ static const QString FULLSCREEN = "Fullscreen"; void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { auto iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; auto image = QImage(iconPath); + qreal dpi = getFullscreenTarget()->physicalDotsPerInch(); + _virtualPadPixelSize = dpi * 512 / 534; // 534 dpi for Pixel XL and Mate 9 Pro + if (image.format() != QImage::Format_ARGB32) { image = image.convertToFormat(QImage::Format_ARGB32); } if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_virtualPadPixelSize, _virtualPadPixelSize, Qt::KeepAspectRatio); _virtualPadStickTexture = gpu::Texture::createStrict( gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), @@ -49,6 +54,8 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { image = image.convertToFormat(QImage::Format_ARGB32); } if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_virtualPadPixelSize, _virtualPadPixelSize, Qt::KeepAspectRatio); + _virtualPadStickBaseTexture = gpu::Texture::createStrict( gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), image.width(), image.height(), @@ -91,7 +98,8 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { auto& virtualPadManager = VirtualPad::Manager::instance(); if(virtualPadManager.getLeftVirtualPad()->isBeingTouched()) { // render stick base - auto stickBaseTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getFirstTouch()); + auto stickBaseTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getFirstTouch(), + _virtualPadPixelSize, _virtualPadPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); batch.setProjectionTransform(mat4()); @@ -103,7 +111,8 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { batch.draw(gpu::TRIANGLE_STRIP, 4); }); // render stick head - auto stickTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getCurrentTouch()); + auto stickTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getCurrentTouch(), + _virtualPadPixelSize, _virtualPadPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); batch.setProjectionTransform(mat4()); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index d9b942bd97..04568dcb27 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -44,4 +44,5 @@ private: gpu::TexturePointer _virtualPadStickTexture; gpu::TexturePointer _virtualPadStickBaseTexture; + qreal _virtualPadPixelSize; }; diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index 74225b5b39..fb53ca253f 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -458,9 +458,8 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const return result; } -glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point) const { +glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point, float sizeX, float sizeY) const { glm::mat4 result; - static const float PIXEL_SIZE = 512.0f; const auto canvasSize = vec2(toGlm(_renderingWidget->size()));; QPoint qPoint(point.x,point.y); vec2 position = toGlm(_renderingWidget->mapFromGlobal(qPoint)); @@ -469,7 +468,7 @@ glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point) const { position -= 1.0; position.y *= -1.0f; - vec2 size = PIXEL_SIZE / canvasSize; + vec2 size = vec2(sizeX / canvasSize.x, sizeY / canvasSize.y); result = glm::scale(glm::translate(glm::mat4(), vec3(position, 0.0f)), vec3(size, 1.0f)); return result; } diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 5b65315f45..234818c740 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -90,7 +90,7 @@ public: glm::vec2 getReticleMaximumPosition() const; glm::mat4 getReticleTransform(const glm::mat4& eyePose = glm::mat4(), const glm::vec3& headPosition = glm::vec3()) const; - glm::mat4 getPoint2DTransform(const glm::vec2& point = glm::vec2()) const; + glm::mat4 getPoint2DTransform(const glm::vec2& point = glm::vec2(), float sizeX = 512.0f, float sizeY = 512.0f) const; ReticleInterface* getReticleInterface() { return _reticleInterface; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 53683870df..40bc341fe2 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -22,6 +22,8 @@ #include #include "VirtualPadManager.h" +#include + const char* TouchscreenVirtualPadDevice::NAME = "TouchscreenVirtualPad"; bool TouchscreenVirtualPadDevice::isSupported() const { @@ -37,6 +39,21 @@ bool TouchscreenVirtualPadDevice::isSupported() const { return false; } +void TouchscreenVirtualPadDevice::initFromEvent(const QTouchEvent* event) { + QScreen* eventScreen = event->window()->screen(); + if (_screenDPI != eventScreen->physicalDotsPerInch()) { + _screenWidthCenter = eventScreen->size().width() / 2; + _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); + _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); + _screenDPI = eventScreen->physicalDotsPerInch(); + + _fixedPosition = true; // This should be config + _fixedRadius = _screenDPI * 256 / 534; + qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) + _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius ); + } +} + float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); } @@ -132,13 +149,7 @@ void TouchscreenVirtualPadDevice::touchBeginEvent(const QTouchEvent* event) { return; } KeyboardMouseDevice::enableTouch(false); - QScreen* eventScreen = event->window()->screen(); - _screenWidthCenter = eventScreen->size().width() / 2; - if (_screenDPI != eventScreen->physicalDotsPerInch()) { - _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); - _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); - _screenDPI = eventScreen->physicalDotsPerInch(); - } + initFromEvent(event); } void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { @@ -169,14 +180,13 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { bool rightTouchFound = false; for (int i = 0; i < _touchPointCount; ++i) { glm::vec2 thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); - if (thisPoint.x < _screenWidthCenter) { + if (_validTouchLeft) { + leftTouchFound = true; + touchLeftUpdate(thisPoint); + } else if (touchLeftBeginPointIsValid(thisPoint)) { if (!leftTouchFound) { leftTouchFound = true; - if (!_validTouchLeft) { - touchLeftBegin(thisPoint); - } else { - touchLeftUpdate(thisPoint); - } + touchLeftBegin(thisPoint); } } else { if (!rightTouchFound) { @@ -197,10 +207,24 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { } } +bool TouchscreenVirtualPadDevice::touchLeftBeginPointIsValid(glm::vec2 touchPoint) { + if (_fixedPosition) { + // inside circle + return pow(touchPoint.x - _fixedCenterPosition.x,2.0) + pow(touchPoint.y - _fixedCenterPosition.y, 2.0) < pow(_fixedRadius, 2.0); + } else { + // left side + return touchPoint.x < _screenWidthCenter; + } +} + void TouchscreenVirtualPadDevice::touchLeftBegin(glm::vec2 touchPoint) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (virtualPadManager.isEnabled()) { - _firstTouchLeftPoint = touchPoint; + if (_fixedPosition) { + _firstTouchLeftPoint = _fixedCenterPosition; + } else { + _firstTouchLeftPoint = touchPoint; + } _validTouchLeft = true; } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index fd74009ee8..fd2342bfec 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -74,15 +74,21 @@ protected: int _screenWidthCenter; std::shared_ptr _inputDevice { std::make_shared() }; + bool _fixedPosition; + glm::vec2 _fixedCenterPosition; + qreal _fixedRadius; + void touchLeftBegin(glm::vec2 touchPoint); void touchLeftUpdate(glm::vec2 touchPoint); void touchLeftEnd(); + bool touchLeftBeginPointIsValid(glm::vec2 touchPoint); void touchRightBegin(glm::vec2 touchPoint); void touchRightUpdate(glm::vec2 touchPoint); void touchRightEnd(); // just for debug private: void debugPoints(const QTouchEvent* event, QString who); + void initFromEvent(const QTouchEvent* event); }; From 55d52f92df2e2df7ee2d4169c07bb36baf06b9b1 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 28 Feb 2018 15:55:50 -0300 Subject: [PATCH 135/267] Android - Make Joystick appear always when possible (not in radar mode and when not hidden by some windows) --- .../resources/qml/hifi/+android/modesbar.qml | 6 ----- .../ControllerScriptingInterface.cpp | 5 ++++ .../scripting/ControllerScriptingInterface.h | 1 + .../Basic2DWindowOpenGLDisplayPlugin.cpp | 2 +- .../TouchscreenVirtualPadDevice.cpp | 27 +++++++++++++++---- .../TouchscreenVirtualPadDevice.h | 2 +- libraries/ui/src/VirtualPadManager.cpp | 16 +++++++++++ libraries/ui/src/VirtualPadManager.h | 6 +++++ scripts/system/+android/goto.js | 4 +-- .../system/+android/touchscreenvirtualpad.js | 1 + 10 files changed, 55 insertions(+), 15 deletions(-) diff --git a/interface/resources/qml/hifi/+android/modesbar.qml b/interface/resources/qml/hifi/+android/modesbar.qml index 552ca80778..fe71314ece 100644 --- a/interface/resources/qml/hifi/+android/modesbar.qml +++ b/interface/resources/qml/hifi/+android/modesbar.qml @@ -40,12 +40,6 @@ Item { var keys = Object.keys(properties).forEach(function (key) { button[key] = properties[key]; }); - button.entered.connect(function() { - Controller.setVPadEnabled(false); - }); - button.exited.connect(function() { - Controller.setVPadEnabled(true); - }); return button; } else if( component.status == Component.Error) { console.log("Load button errors " + component.errorString()); diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 95be7b29e9..38d5306a1c 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -89,6 +89,11 @@ void ControllerScriptingInterface::setVPadEnabled(const bool enable) { virtualPadManager.enable(enable); } +void ControllerScriptingInterface::setVPadHidden(const bool hidden) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + virtualPadManager.hide(hidden); +} + void ControllerScriptingInterface::emitKeyPressEvent(QKeyEvent* event) { emit keyPressEvent(KeyEvent(*event)); } void ControllerScriptingInterface::emitKeyReleaseEvent(QKeyEvent* event) { emit keyReleaseEvent(KeyEvent(*event)); } diff --git a/interface/src/scripting/ControllerScriptingInterface.h b/interface/src/scripting/ControllerScriptingInterface.h index 1f223814a3..bb5615f996 100644 --- a/interface/src/scripting/ControllerScriptingInterface.h +++ b/interface/src/scripting/ControllerScriptingInterface.h @@ -65,6 +65,7 @@ public slots: virtual glm::vec2 getViewportDimensions() const; virtual QVariant getRecommendedHUDRect() const; + virtual void setVPadHidden(bool hidden); // Call it when a window should hide it virtual void setVPadEnabled(bool enable); signals: diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 010572fcf2..85300833d8 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -96,7 +96,7 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { auto& virtualPadManager = VirtualPad::Manager::instance(); - if(virtualPadManager.getLeftVirtualPad()->isBeingTouched()) { + if(virtualPadManager.getLeftVirtualPad()->isShown()) { // render stick base auto stickBaseTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getFirstTouch(), _virtualPadPixelSize, _virtualPadPixelSize); diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 40bc341fe2..848174eb76 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -39,19 +39,28 @@ bool TouchscreenVirtualPadDevice::isSupported() const { return false; } -void TouchscreenVirtualPadDevice::initFromEvent(const QTouchEvent* event) { - QScreen* eventScreen = event->window()->screen(); +void TouchscreenVirtualPadDevice::init() { + _fixedPosition = true; // This should be config + + + QScreen* eventScreen = qApp->primaryScreen(); if (_screenDPI != eventScreen->physicalDotsPerInch()) { _screenWidthCenter = eventScreen->size().width() / 2; _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); _screenDPI = eventScreen->physicalDotsPerInch(); - _fixedPosition = true; // This should be config _fixedRadius = _screenDPI * 256 / 534; qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius ); } + + if (_fixedPosition) { + _firstTouchLeftPoint = _fixedCenterPosition; + auto& virtualPadManager = VirtualPad::Manager::instance(); + virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled + virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); + } } float clip(float n, float lower, float upper) { @@ -82,14 +91,21 @@ void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller /* Shared variables for stick rendering (clipped to the stick radius)*/ // Prevent this for being done when not in first person view - virtualPadManager.getLeftVirtualPad()->setBeingTouched(true); virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); virtualPadManager.getLeftVirtualPad()->setCurrentTouch( glm::vec2(clip(_currentTouchLeftPoint.x, -STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x, STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x), clip(_currentTouchLeftPoint.y, -STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y, STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y)) ); + virtualPadManager.getLeftVirtualPad()->setBeingTouched(true); + virtualPadManager.getLeftVirtualPad()->setShown(true); // If touched, show in any mode (fixed joystick position or non-fixed) } else { virtualPadManager.getLeftVirtualPad()->setBeingTouched(false); + if (_fixedPosition) { + virtualPadManager.getLeftVirtualPad()->setCurrentTouch(_fixedCenterPosition); // reset to the center + virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled + } else { + virtualPadManager.getLeftVirtualPad()->setShown(false); + } } if (_validTouchRight) { @@ -149,12 +165,13 @@ void TouchscreenVirtualPadDevice::touchBeginEvent(const QTouchEvent* event) { return; } KeyboardMouseDevice::enableTouch(false); - initFromEvent(event); } void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (!virtualPadManager.isEnabled()) { + touchLeftEnd(); + touchRightEnd(); return; } // touch end here is a big reset -> resets both pads diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index fd2342bfec..43c5612c82 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -26,6 +26,7 @@ Q_OBJECT public: // Plugin functions + virtual void init() override; virtual bool isSupported() const override; virtual const QString getName() const override { return NAME; } @@ -88,7 +89,6 @@ protected: // just for debug private: void debugPoints(const QTouchEvent* event, QString who); - void initFromEvent(const QTouchEvent* event); }; diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index 4c3e6ff728..441c491168 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -51,8 +51,24 @@ namespace VirtualPad { return _enabled; } + void Manager::hide(bool hidden) { + _hidden = hidden; + } + + bool Manager::isHidden() { + return _hidden; + } + Instance* Manager::getLeftVirtualPad() { return &_leftVPadInstance; } + bool Instance::isShown() { + return _shown; + } + + void Instance::setShown(bool show) { + _shown = show; + } + } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 599954989f..48a78ca09b 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -21,10 +21,13 @@ namespace VirtualPad { virtual glm::vec2 getFirstTouch(); virtual void setCurrentTouch(glm::vec2 point); virtual glm::vec2 getCurrentTouch(); + virtual bool isShown(); + virtual void setShown(bool show); private: bool _isBeingTouched; glm::vec2 _firstTouch; glm::vec2 _currentTouch; + bool _shown; }; class Manager : public QObject, public Dependency { @@ -37,9 +40,12 @@ namespace VirtualPad { Instance* getLeftVirtualPad(); bool isEnabled(); void enable(bool enable); + bool isHidden(); + void hide(bool hide); private: Instance _leftVPadInstance; bool _enabled; + bool _hidden; }; } diff --git a/scripts/system/+android/goto.js b/scripts/system/+android/goto.js index e917455128..2019af9077 100644 --- a/scripts/system/+android/goto.js +++ b/scripts/system/+android/goto.js @@ -52,7 +52,7 @@ module.exports = { }); }, show: function() { - Controller.setVPadEnabled(false); + Controller.setVPadHidden(true); if (window) { window.fromQml.connect(fromQml); window.setVisible(true); @@ -60,7 +60,7 @@ module.exports = { } }, hide: function() { - Controller.setVPadEnabled(true); + Controller.setVPadHidden(false); if (window) { window.fromQml.disconnect(fromQml); window.setVisible(false); diff --git a/scripts/system/+android/touchscreenvirtualpad.js b/scripts/system/+android/touchscreenvirtualpad.js index fa41a2b5e0..d48b623e03 100644 --- a/scripts/system/+android/touchscreenvirtualpad.js +++ b/scripts/system/+android/touchscreenvirtualpad.js @@ -14,6 +14,7 @@ function init() { Controller.setVPadEnabled(true); + Controller.setVPadHidden(false); } init(); From 3275846882b5480fedccf34efed976039eedf01e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 1 Mar 2018 09:57:42 +1300 Subject: [PATCH 136/267] Material entity JSDoc --- .../entities/src/EntityItemProperties.cpp | 54 ++++++++++++++++++ libraries/entities/src/EntityTypes.h | 3 + .../src/model-networking/MaterialCache.cpp | 55 +++++++++++++++++++ libraries/script-engine/src/Vec3.h | 9 +++ tools/jsdoc/plugins/hifi.js | 1 + 5 files changed, 122 insertions(+) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 1ef48e7107..2491e20b7d 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -589,6 +589,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @see {@link Entities.EntityProperties-Box|EntityProperties-Box} * @see {@link Entities.EntityProperties-Light|EntityProperties-Light} * @see {@link Entities.EntityProperties-Line|EntityProperties-Line} + * @see {@link Entities.EntityProperties-Material|EntityProperties-Material} * @see {@link Entities.EntityProperties-Model|EntityProperties-Model} * @see {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} * @see {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} @@ -664,6 +665,59 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * }); */ +/**jsdoc + * The "Material" {@link Entities.EntityType|EntityType} modifies the existing materials on + * {@link Entities.EntityType|Model} entities, {@link Entities.EntityType|Shape} entities (albedo only), + * {@link Overlays.OverlayType|model overlays}, and avatars. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}.
+ * To apply a material to an entity or overlay, set the material entity's parentID property to the entity or + * overlay's ID. + * To apply a material to an avatar, set the material entity's parentID property to the avatar's session UUID. + * To apply a material to your avatar such that it persists across domains and log-ins, create the material as an avatar entity + * by setting the clientOnly parameter in {@link Entities.addEntity} to true. + * Material entities render as non-scalable spheres if they don't have their parent set. + * @typedef {object} Entities.EntityProperties-Material + * @property {string} materialURL="" - URL to a {@link MaterialResource}. If you append ?name to the URL, the + * material with that name in the {@link MaterialResource} will be applied to the entity.
+ * Alternatively, set the property value to "userData" to use the {@link Entities.EntityProperties|userData} + * entity property to live edit the material resource values. + * @property {number} priority=0 - The priority for applying the material to its parent. Only the highest priority material is + * applied, with materials of the same priority randomly assigned. Materials that come with the model have a priority of + * 0. + * @property {string|number} parentMaterialName="0" - Selects the submesh or submeshes within the parent to apply the material + * to. If in the format "mat::string", all submeshes with material name "string" are replaced. + * Otherwise the property value is parsed as an unsigned integer, specifying the mesh index to modify. Invalid values are + * parsed to 0. + * @property {string} materialMappingMode="uv" - How the material is mapped to the entity. Either "uv" or + * "projected". Currently, only "uv" is supported. + * @property {Vec2} materialMappingPos=0,0 - Offset position in UV-space of the top left of the material, range + * { x: 0, y: 0 }{ x: 1, y: 1 }. + * @property {Vec2} materialMappingScale=1,1 - How much to scale the material within the parent's UV-space. + * @property {number} materialMappingRot=0 - How much to rotate the material within the parent's UV-space, in degrees. + * @example Color a sphere using a Material entity. + * var entityID = Entities.addEntity({ + * type: "Sphere", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * dimensions: { x: 1, y: 1, z: 1 }, + * color: { red: 128, green: 128, blue: 128 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * var materialID = Entities.addEntity({ + * type: "Material", + * parentID: entityID, + * materialURL: "userData", + * priority: 1, + * userData: JSON.stringify({ + * materials: { + * // Can only set albedo on a Shape entity. + * // Value overrides entity's "color" property. + * albedo: [1.0, 0, 0] + * } + * }), + * }); + */ + /**jsdoc * The "Model" {@link Entities.EntityType|EntityType} displays an FBX or OBJ model. * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 2b5858e412..bcde8893c4 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -49,6 +49,9 @@ public: * {@link Entities.EntityProperties-Light|EntityProperties-Light} * "Line"A sequence of one or more simple straight lines. * {@link Entities.EntityProperties-Line|EntityProperties-Line} + * "Material"Modifies the existing materials on Model entities, Shape entities (albedo + * only), {@link Overlays.OverlayType|model overlays}, and avatars. + * {@link Entities.EntityProperties-Material|EntityProperties-Material} * "Model"A mesh model from an FBX or OBJ file. * {@link Entities.EntityProperties-Model|EntityProperties-Model} * "ParticleEffect"A particle system that can be used to simulate things such as fire, diff --git a/libraries/model-networking/src/model-networking/MaterialCache.cpp b/libraries/model-networking/src/model-networking/MaterialCache.cpp index 8d9d6571f8..d1172560a1 100644 --- a/libraries/model-networking/src/model-networking/MaterialCache.cpp +++ b/libraries/model-networking/src/model-networking/MaterialCache.cpp @@ -26,6 +26,25 @@ void NetworkMaterialResource::downloadFinished(const QByteArray& data) { finishedLoading(true); } +/**jsdoc + *

An RGB or SRGB color value.

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IndexTypeAttributesDefaultValue
0numberRed component value. Number in the range 0.01.0.
1numberGreen component value. Number in the range 0.01.0.
2numberBlue component value. Number in the range 0.01.0.
3boolean<optional>falseIf true then the color is an SRGB color.
+ * @typedef {array} RGBS + */ bool NetworkMaterialResource::parseJSONColor(const QJsonValue& array, glm::vec3& color, bool& isSRGB) { if (array.isArray()) { QJsonArray colorArray = array.toArray(); @@ -43,6 +62,12 @@ bool NetworkMaterialResource::parseJSONColor(const QJsonValue& array, glm::vec3& return false; } +/**jsdoc + * A material or set of materials such as may be used by a {@link Entities.EntityType|Material} entity. + * @typedef {object} MaterialResource + * @property {number} materialVersion=1 - The version of the material. Currently not used. + * @property {Material|Material[]} materials - The details of the material or materials. + */ NetworkMaterialResource::ParsedMaterials NetworkMaterialResource::parseJSONMaterials(const QJsonDocument& materialJSON) { ParsedMaterials toReturn; if (!materialJSON.isNull() && materialJSON.isObject()) { @@ -76,6 +101,36 @@ NetworkMaterialResource::ParsedMaterials NetworkMaterialResource::parseJSONMater return toReturn; } +/**jsdoc + * A material such as may be used by a {@link Entities.EntityType|Material} entity. + * @typedef {object} Material + * @property {string} name="" - A name for the material. + * @property {string} model="hifi_pbr" - Currently not used. + * @property {Vec3Color|RGBS} emissive - The emissive color. A {@link Vec3Color} value is treated as sRGB. A {@link RGBS} value + * can be either RGB or sRGB. + * @property {number} opacity=1.0 - The opacity, 0.01.0. + * @property {boolean} unlit=false - If true, the material is not lit. + * @property {Vec3Color|RGBS} albedo - The albedo color. A {@link Vec3Color} value is treated as sRGB. A {@link RGBS} value can + * be either RGB or sRGB. + * @property {number} roughness - The roughness, 0.01.0. + * @property {number} metallic - The metallicness, 0.01.0. + * @property {number} scattering - The scattering, 0.01.0. + * @property {string} emissiveMap - URL of emissive texture image. + * @property {string} albedoMap - URL of albedo texture image. + * @property {string} opacityMap - URL of opacity texture image. Set value the same as the albedoMap value for + * transparency. + * @property {string} roughnessMap - URL of roughness texture image. + * @property {string} glossMap - Synonym for roughnessMap. + * @property {string} metallicMap - URL of metallic texture image. + * @property {string} specularMap - Synonym for metallicMap. + * @property {string} normalMap - URL of normal texture image. + * @property {string} bumpMap - Synonym for normalMap. + * @property {string} occlusionMap - URL of occlusion texture image. + * @property {string} scatteringMap - URL of scattering texture image. Only used if normalMap or + * bumpMap is specified. + * @property {string} lightMap - URL of light texture image. Currently not used. + */ +// Note: See MaterialEntityItem.h for default values used in practice. std::pair> NetworkMaterialResource::parseJSONMaterial(const QJsonObject& materialJSON) { std::string name = ""; std::shared_ptr material = std::make_shared(); diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 1e1cd917a3..f6974a591a 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -48,6 +48,15 @@ * @property {float} w W-coordinate of the vector. */ +/**jsdoc + * A color vector. + * + * @typedef {object} Vec3Color + * @property {number} x - Red component value. Integer in the range 0 - 255. + * @property {number} y - Green component value. Integer in the range 0 - 255. + * @property {number} z - Blue component value. Integer in the range 0 - 255. + */ + /// Scriptable interface a Vec3ernion helper class object. Used exclusively in the JavaScript API class Vec3 : public QObject, protected QScriptable { Q_OBJECT diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 9f8570b4f3..1240e501da 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -25,6 +25,7 @@ exports.handlers = { '../../libraries/avatars/src', '../../libraries/controllers/src/controllers/', '../../libraries/entities/src', + '../../libraries/model-networking/src/model-networking/', '../../libraries/octree/src', '../../libraries/networking/src', '../../libraries/physics/src', From d82a300f5fc0f461ab3b44c43a0297539b1071fa Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 1 Mar 2018 09:58:35 +1300 Subject: [PATCH 137/267] Miscellaneous JSDoc improvements --- .../entities/src/EntityScriptingInterface.h | 18 ++++++++++-------- libraries/script-engine/src/Vec3.h | 18 +++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 41002b9917..e5780fbad4 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -151,7 +151,7 @@ public slots: /**jsdoc * Check whether or not you can rez (create) new entities in the domain. * @function Entities.canRez - * @returns {boolean} true if the domain server will allow this script to rez (create) new entities, + * @returns {boolean} true if the domain server will allow the script to rez (create) new entities, * otherwise false. */ Q_INVOKABLE bool canRez(); @@ -160,7 +160,7 @@ public slots: * Check whether or not you can rez (create) new temporary entities in the domain. Temporary entities are entities with a * finite lifetime property value set. * @function Entities.canRezTmp - * @returns {boolean} true if the domain server will allow this script to rez (create) new temporary + * @returns {boolean} true if the domain server will allow the script to rez (create) new temporary * entities, otherwise false. */ Q_INVOKABLE bool canRezTmp(); @@ -169,7 +169,7 @@ public slots: * Check whether or not you can rez (create) new certified entities in the domain. Certified entities are entities that have * PoP certificates. * @function Entities.canRezCertified - * @returns {boolean} true if the domain server will allow this script to rez (create) new certified + * @returns {boolean} true if the domain server will allow the script to rez (create) new certified * entities, otherwise false. */ Q_INVOKABLE bool canRezCertified(); @@ -178,7 +178,7 @@ public slots: * Check whether or not you can rez (create) new temporary certified entities in the domain. Temporary entities are entities * with a finite lifetime property value set. Certified entities are entities that have PoP certificates. * @function Entities.canRezTmpCertified - * @returns {boolean} true if the domain server will allow this script to rez (create) new temporary + * @returns {boolean} true if the domain server will allow the script to rez (create) new temporary * certified entities, otherwise false. */ Q_INVOKABLE bool canRezTmpCertified(); @@ -186,15 +186,17 @@ public slots: /**jsdoc * Check whether or not you can make changes to the asset server's assets. * @function Entities.canWriteAssets - * @returns {boolean} true if the domain server will allow this script to make changes to the to the asset + * @returns {boolean} true if the domain server will allow the script to make changes to the to the asset * server's assets, otherwise false. */ Q_INVOKABLE bool canWriteAssets(); /**jsdoc - * @function Entities.canReplaceContent - * @return {bool} `true` if the DomainServer will allow this Node/Avatar to replace the domain's content set - */ + * Check whether or not you can replace the domain's content set. + * @function Entities.canReplaceContent + * @returns {boolean} true if the domain server will allow the script to replace the domain's content set, + * otherwise false. + */ Q_INVOKABLE bool canReplaceContent(); /**jsdoc diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index f6974a591a..7ed0fd9e8b 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -25,27 +25,27 @@ * A 2-dimensional vector. * * @typedef {object} Vec2 - * @property {float} x X-coordinate of the vector. - * @property {float} y Y-coordinate of the vector. + * @property {number} x - X-coordinate of the vector. + * @property {number} y - Y-coordinate of the vector. */ /**jsdoc * A 3-dimensional vector. * * @typedef {object} Vec3 - * @property {float} x X-coordinate of the vector. - * @property {float} y Y-coordinate of the vector. - * @property {float} z Z-coordinate of the vector. + * @property {number} x - X-coordinate of the vector. + * @property {number} y - Y-coordinate of the vector. + * @property {number} z - Z-coordinate of the vector. */ /**jsdoc * A 4-dimensional vector. * * @typedef {object} Vec4 - * @property {float} x X-coordinate of the vector. - * @property {float} y Y-coordinate of the vector. - * @property {float} z Z-coordinate of the vector. - * @property {float} w W-coordinate of the vector. + * @property {number} x - X-coordinate of the vector. + * @property {number} y - Y-coordinate of the vector. + * @property {number} z - Z-coordinate of the vector. + * @property {number} w - W-coordinate of the vector. */ /**jsdoc From f9086e31de021c93966f431406f9f93dc537c850 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 1 Mar 2018 10:08:50 +1300 Subject: [PATCH 138/267] Deprecate Entities.getMeshes() in favor of using the new Graphics API --- libraries/entities/src/EntityScriptingInterface.h | 4 +++- .../src/graphics-scripting/GraphicsScriptingInterface.h | 2 +- libraries/shared/src/RegisteredMetaTypes.h | 3 +++ tools/jsdoc/plugins/hifi.js | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index e5780fbad4..166b2130ef 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1305,6 +1305,7 @@ public slots: * @function Entities.getMeshes * @param {Uuid} entityID - The ID of the Model or PolyVox entity to get the meshes of. * @param {Entities~getMeshesCallback} callback - The function to call upon completion. + * @deprecated Use the {@link Graphics} API instead. */ /**jsdoc * Called when {@link Entities.getMeshes} is complete. @@ -1313,7 +1314,8 @@ public slots: * Model or PolyVox entity; otherwise undefined. * @param {boolean} success - true if the {@link Entities.getMeshes} call was successful, false * otherwise. The call may be unsuccessful if the requested entity could not be found. - */ + * @deprecated Use the {@link Graphics} API instead. + */ // FIXME move to a renderable entity interface Q_INVOKABLE void getMeshes(QUuid entityID, QScriptValue callback); diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h index 84c6cb6fa8..526352804b 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h @@ -38,7 +38,7 @@ public slots: * Returns a model reference object associated with the specified UUID ({@link EntityID}, {@link OverlayID}, or {@link AvatarID}). * * @function Graphics.getModel - * @param {UUID} The objectID of the model whose meshes are to be retrieved. + * @param {UUID} entityID - The objectID of the model whose meshes are to be retrieved. * @return {Graphics.Model} the resulting Model object */ scriptable::ScriptableModelPointer getModel(QUuid uuid); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 9080a59d98..4fee78a0db 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -345,6 +345,7 @@ using MeshPointer = std::shared_ptr; /**jsdoc * A handle for a mesh in an entity, such as returned by {@link Entities.getMeshes}. * @class MeshProxy + * @deprecated Use the {@link Graphics} API instead. */ class MeshProxy : public QObject { Q_OBJECT @@ -356,6 +357,7 @@ public: * Get the number of vertices in the mesh. * @function MeshProxy#getNumVertices * @returns {number} Integer number of vertices in the mesh. + * @deprecated Use the {@link Graphics} API instead. */ Q_INVOKABLE virtual int getNumVertices() const = 0; @@ -364,6 +366,7 @@ public: * @function MeshProxy#getPos3 * @param {number} index - Integer index of the mesh vertex. * @returns {Vec3} Local position of the vertex relative to the mesh. + * @deprecated Use the {@link Graphics} API instead. */ Q_INVOKABLE virtual glm::vec3 getPos3(int index) const = 0; }; diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 1240e501da..1f73f14b2b 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -24,6 +24,7 @@ exports.handlers = { '../../libraries/animation/src', '../../libraries/avatars/src', '../../libraries/controllers/src/controllers/', + '../../libraries/graphics-scripting/src/graphics-scripting/', '../../libraries/entities/src', '../../libraries/model-networking/src/model-networking/', '../../libraries/octree/src', From 1a42722d99119526fbe0819433f973f22d27ea08 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 1 Mar 2018 10:50:40 +1300 Subject: [PATCH 139/267] Fix Material roughnessMap etc. JSDoc --- .../src/model-networking/MaterialCache.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/model-networking/src/model-networking/MaterialCache.cpp b/libraries/model-networking/src/model-networking/MaterialCache.cpp index d1172560a1..de5b3023ae 100644 --- a/libraries/model-networking/src/model-networking/MaterialCache.cpp +++ b/libraries/model-networking/src/model-networking/MaterialCache.cpp @@ -119,16 +119,16 @@ NetworkMaterialResource::ParsedMaterials NetworkMaterialResource::parseJSONMater * @property {string} albedoMap - URL of albedo texture image. * @property {string} opacityMap - URL of opacity texture image. Set value the same as the albedoMap value for * transparency. - * @property {string} roughnessMap - URL of roughness texture image. - * @property {string} glossMap - Synonym for roughnessMap. - * @property {string} metallicMap - URL of metallic texture image. - * @property {string} specularMap - Synonym for metallicMap. - * @property {string} normalMap - URL of normal texture image. - * @property {string} bumpMap - Synonym for normalMap. + * @property {string} roughnessMap - URL of roughness texture image. Can use this or glossMap, but not both. + * @property {string} glossMap - URL of gloss texture image. Can use this or roughnessMap, but not both. + * @property {string} metallicMap - URL of metallic texture image. Can use this or specularMap, but not both. + * @property {string} specularMap - URL of specular texture image. Can use this or metallicMap, but not both. + * @property {string} normalMap - URL of normal texture image. Can use this or bumpMap, but not both. + * @property {string} bumpMap - URL of bump texture image. Can use this or normalMap, but not both. * @property {string} occlusionMap - URL of occlusion texture image. * @property {string} scatteringMap - URL of scattering texture image. Only used if normalMap or * bumpMap is specified. - * @property {string} lightMap - URL of light texture image. Currently not used. + * @property {string} lightMap - URL of light map texture image. Currently not used. */ // Note: See MaterialEntityItem.h for default values used in practice. std::pair> NetworkMaterialResource::parseJSONMaterial(const QJsonObject& materialJSON) { From 9acb83632c4efcc1e709359a5f7b0a2898de0847 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 28 Feb 2018 18:52:13 -0300 Subject: [PATCH 140/267] Android - Make joystick move up when showing the bottom bar --- .../resources/qml/hifi/+android/bottombar.qml | 6 ----- .../ControllerScriptingInterface.cpp | 5 ++++ .../scripting/ControllerScriptingInterface.h | 3 ++- .../TouchscreenVirtualPadDevice.cpp | 26 ++++++++++++++----- .../TouchscreenVirtualPadDevice.h | 3 +++ libraries/ui/src/VirtualPadManager.cpp | 8 ++++++ libraries/ui/src/VirtualPadManager.h | 3 +++ scripts/system/+android/bottombar.js | 2 ++ 8 files changed, 43 insertions(+), 13 deletions(-) diff --git a/interface/resources/qml/hifi/+android/bottombar.qml b/interface/resources/qml/hifi/+android/bottombar.qml index e861d441d9..e31dc9453f 100644 --- a/interface/resources/qml/hifi/+android/bottombar.qml +++ b/interface/resources/qml/hifi/+android/bottombar.qml @@ -43,12 +43,6 @@ Item { HifiConstants { id: android } MouseArea { anchors.fill: parent - onEntered: { - Controller.setVPadEnabled(false); - } - onExited: { - Controller.setVPadEnabled(true); - } } Rectangle { diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 38d5306a1c..49ecc4774d 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -94,6 +94,11 @@ void ControllerScriptingInterface::setVPadHidden(const bool hidden) { virtualPadManager.hide(hidden); } +void ControllerScriptingInterface::setVPadExtraBottomMargin(const int margin) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + virtualPadManager.setExtraBottomMargin(margin); +} + void ControllerScriptingInterface::emitKeyPressEvent(QKeyEvent* event) { emit keyPressEvent(KeyEvent(*event)); } void ControllerScriptingInterface::emitKeyReleaseEvent(QKeyEvent* event) { emit keyReleaseEvent(KeyEvent(*event)); } diff --git a/interface/src/scripting/ControllerScriptingInterface.h b/interface/src/scripting/ControllerScriptingInterface.h index bb5615f996..9b24e2a06e 100644 --- a/interface/src/scripting/ControllerScriptingInterface.h +++ b/interface/src/scripting/ControllerScriptingInterface.h @@ -65,8 +65,9 @@ public slots: virtual glm::vec2 getViewportDimensions() const; virtual QVariant getRecommendedHUDRect() const; - virtual void setVPadHidden(bool hidden); // Call it when a window should hide it virtual void setVPadEnabled(bool enable); + virtual void setVPadHidden(bool hidden); // Call it when a window should hide it + virtual void setVPadExtraBottomMargin(int margin); signals: void keyPressEvent(const KeyEvent& event); diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 848174eb76..90a78b3231 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -42,7 +42,6 @@ bool TouchscreenVirtualPadDevice::isSupported() const { void TouchscreenVirtualPadDevice::init() { _fixedPosition = true; // This should be config - QScreen* eventScreen = qApp->primaryScreen(); if (_screenDPI != eventScreen->physicalDotsPerInch()) { _screenWidthCenter = eventScreen->size().width() / 2; @@ -51,18 +50,31 @@ void TouchscreenVirtualPadDevice::init() { _screenDPI = eventScreen->physicalDotsPerInch(); _fixedRadius = _screenDPI * 256 / 534; - qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) - _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius ); } + auto& virtualPadManager = VirtualPad::Manager::instance(); + setupFixedCenter(virtualPadManager, true); + if (_fixedPosition) { - _firstTouchLeftPoint = _fixedCenterPosition; - auto& virtualPadManager = VirtualPad::Manager::instance(); virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled - virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); } } +void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force) { + if (!_fixedPosition) return; + + //auto& virtualPadManager = VirtualPad::Manager::instance(); + if (_extraBottomMargin == virtualPadManager.extraBottomMargin() && !force) return; // Our only criteria to decide a center change is the bottom margin + + _extraBottomMargin = virtualPadManager.extraBottomMargin(); + qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) + QScreen* eventScreen = qApp->primaryScreen(); // do not call every time + _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); + + _firstTouchLeftPoint = _fixedCenterPosition; + virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); +} + float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); } @@ -74,6 +86,8 @@ void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller }); auto& virtualPadManager = VirtualPad::Manager::instance(); + setupFixedCenter(virtualPadManager); + if (_validTouchLeft) { float leftDistanceScaleX, leftDistanceScaleY; leftDistanceScaleX = (_currentTouchLeftPoint.x - _firstTouchLeftPoint.x) / _screenDPIScale.x; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 43c5612c82..6e65ef7ab2 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -15,6 +15,7 @@ #include #include "InputPlugin.h" #include +#include "VirtualPadManager.h" class QTouchEvent; class QGestureEvent; @@ -78,6 +79,7 @@ protected: bool _fixedPosition; glm::vec2 _fixedCenterPosition; qreal _fixedRadius; + int _extraBottomMargin {0}; void touchLeftBegin(glm::vec2 touchPoint); void touchLeftUpdate(glm::vec2 touchPoint); @@ -86,6 +88,7 @@ protected: void touchRightBegin(glm::vec2 touchPoint); void touchRightUpdate(glm::vec2 touchPoint); void touchRightEnd(); + void setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force = false); // just for debug private: void debugPoints(const QTouchEvent* event, QString who); diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index 441c491168..486a6c2c71 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -59,6 +59,14 @@ namespace VirtualPad { return _hidden; } + int Manager::extraBottomMargin() { + return _extraBottomMargin; + } + + void Manager::setExtraBottomMargin(int margin) { + _extraBottomMargin = margin; + } + Instance* Manager::getLeftVirtualPad() { return &_leftVPadInstance; } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 48a78ca09b..3563d333f8 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -42,10 +42,13 @@ namespace VirtualPad { void enable(bool enable); bool isHidden(); void hide(bool hide); + int extraBottomMargin(); + void setExtraBottomMargin(int margin); private: Instance _leftVPadInstance; bool _enabled; bool _hidden; + int _extraBottomMargin {0}; }; } diff --git a/scripts/system/+android/bottombar.js b/scripts/system/+android/bottombar.js index 5f82886c8a..27ef39c914 100644 --- a/scripts/system/+android/bottombar.js +++ b/scripts/system/+android/bottombar.js @@ -196,6 +196,7 @@ function lowerBottomBar() { if (bottomHudOptionsBar) { bottomHudOptionsBar.show(); } + Controller.setVPadExtraBottomMargin(0); } function raiseBottomBar() { @@ -206,6 +207,7 @@ function raiseBottomBar() { if (bottomHudOptionsBar) { bottomHudOptionsBar.hide(); } + Controller.setVPadExtraBottomMargin(255); // Height in bottombar.qml print('[bottombar.js] raiseBottomBar end'); } From 9f9214e808df300810b2eb7b610262caa137656e Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 1 Mar 2018 09:33:48 -0800 Subject: [PATCH 141/267] getting back the RC65 version for a few files --- interface/resources/qml/Stats.qml | 6 +--- interface/src/ui/Stats.cpp | 31 +------------------ interface/src/ui/Stats.h | 2 -- .../system/libraries/entitySelectionTool.js | 5 ++- 4 files changed, 4 insertions(+), 40 deletions(-) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index a12bd4b2c0..4626d9bcda 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -257,11 +257,7 @@ Item { id: octreeCol spacing: 4; x: 4; y: 4; StatText { - text: "Render Engine: " + root.engineFrameTime.toFixed(1) + " ms" - } - StatText { - visible: root.expanded - text: root.renderEngineStats + text: "Engine: " + root.engineFrameTime.toFixed(1) + " ms" } StatText { text: "Batch: " + root.batchFrameTime.toFixed(1) + " ms" diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index ff42ed09e7..80f57bfe0e 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -482,7 +482,7 @@ void Stats::updateStats(bool force) { float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; _gameUpdateStats = QString("/idle/update = %1 ms").arg(dt); - QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "pickManager", "postUpdateLambdas", "misc" }; + QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "misc" }; for (int32_t j = 0; j < categories.size(); ++j) { QString recordKey = "/idle/update/" + categories[j]; itr = allRecords.find(recordKey); @@ -502,39 +502,10 @@ void Stats::updateStats(bool force) { _gameUpdateStats = ""; emit gameUpdateStatsChanged(); } - - itr = allRecords.find("/paintGL/display/EngineRun/Engine"); - std::priority_queue renderEngineStats; - if (itr != allRecords.end()) { - float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; - _renderEngineStats = QString("/render = %1 ms").arg(dt); - - QVector categories = { "RenderMainView", "SecondaryCameraJob", "UpdateScene"}; - for (int32_t j = 0; j < categories.size(); ++j) { - QString recordKey = "/paintGL/display/EngineRun/Engine/" + categories[j]; - itr = allRecords.find(recordKey); - if (itr != allRecords.end()) { - float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; - QString message = QString("\n %1 = %2").arg(categories[j]).arg(dt); - renderEngineStats.push(SortableStat(message, dt)); - } - } - while (!renderEngineStats.empty()) { - SortableStat stat = renderEngineStats.top(); - _renderEngineStats += stat.message; - renderEngineStats.pop(); - } - emit renderEngineStatsChanged(); - } else if (_renderEngineStats != "") { - _renderEngineStats = ""; - emit renderEngineStatsChanged(); - } } else if (_showGameUpdateStats) { _showGameUpdateStats = false; _gameUpdateStats = ""; - _renderEngineStats = ""; emit gameUpdateStatsChanged(); - emit renderEngineStatsChanged(); } } diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index e5fc0beaf6..af3189f20b 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -106,7 +106,6 @@ class Stats : public QQuickItem { STATS_PROPERTY(QString, lodStatus, QString()) STATS_PROPERTY(QString, timingStats, QString()) STATS_PROPERTY(QString, gameUpdateStats, QString()) - STATS_PROPERTY(QString, renderEngineStats, QString()) STATS_PROPERTY(int, serverElements, 0) STATS_PROPERTY(int, serverInternal, 0) STATS_PROPERTY(int, serverLeaves, 0) @@ -240,7 +239,6 @@ signals: void localLeavesChanged(); void timingStatsChanged(); void gameUpdateStatsChanged(); - void renderEngineStatsChanged(); void glContextSwapchainMemoryChanged(); void qmlTextureMemoryChanged(); void texturePendingTransfersChanged(); diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index a419e9d49c..8a07ff0d20 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1322,9 +1322,8 @@ SelectionDisplay = (function() { isActiveTool(handleScaleRTFCube) || isActiveTool(handleStretchXSphere) || isActiveTool(handleStretchYSphere) || isActiveTool(handleStretchZSphere)); - var showOutlineForZone = (SelectionManager.selections.length === 1 && - typeof SelectionManager.savedProperties[SelectionManager.selections[0]] !== "undefined" && - SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); + var showOutlineForZone = (SelectionManager.selections.length === 1 && + SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); that.setHandleScaleEdgeVisible(showOutlineForZone || (!isActiveTool(handleRotatePitchRing) && !isActiveTool(handleRotateYawRing) && !isActiveTool(handleRotateRollRing))); From 5440f62860ae8ca02943e1f9d27f5b80f99b6963 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 1 Mar 2018 10:46:47 -0800 Subject: [PATCH 142/267] fixing a bad key /pipeline pair --- libraries/render-utils/src/RenderPipelines.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index b3a1d40257..84a144e6db 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -592,8 +592,8 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba Key::Builder().withMaterial().withSkinned().withTangents().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalMapPixel, nullptr, nullptr); addPipeline( - Key::Builder().withMaterial().withSkinned(), - skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); + Key::Builder().withMaterial().withSkinned().withSpecular().withDualQuatSkinned(), + skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); addPipeline( Key::Builder().withMaterial().withSkinned().withTangents().withSpecular().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalSpecularMapPixel, nullptr, nullptr); From 8cae20f53de82ffe9a49c917bec62966e382ead6 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 1 Mar 2018 11:03:18 -0800 Subject: [PATCH 143/267] adding stereo checkbox to audio settings --- interface/resources/qml/hifi/audio/Audio.qml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index eab1e40af0..fc308100a8 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -112,6 +112,7 @@ Rectangle { // mute is in its own row RowLayout { + spacing: (margins.sizeCheckBox - 10.5) * 3; AudioControls.CheckBox { id: muteMic text: qsTr("Mute microphone"); @@ -123,6 +124,16 @@ Rectangle { checked = Qt.binding(function() { return AudioScriptingInterface.muted; }); // restore binding } } + + AudioControls.CheckBox { + id: stereoMic + spacing: muteMic.spacing; + text: qsTr("Enable stereo"); + checked: false; + onClicked: { + Audio.setIsStereoInput(checked); + } + } } RowLayout { From 4b572eda6bc93e89ae3e0debfe32a09615eb5e49 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 1 Mar 2018 11:05:40 -0800 Subject: [PATCH 144/267] changing Name --- interface/resources/qml/hifi/audio/Audio.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index fc308100a8..f7dde336c8 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -128,7 +128,7 @@ Rectangle { AudioControls.CheckBox { id: stereoMic spacing: muteMic.spacing; - text: qsTr("Enable stereo"); + text: qsTr("Stereo"); checked: false; onClicked: { Audio.setIsStereoInput(checked); From 2a1c22e7a5eb53548d0f901cfb3e9143e1c6c7ef Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 1 Mar 2018 11:10:45 -0800 Subject: [PATCH 145/267] "Create Test" copies (and renames) images from snapshot folder to the corresponding test folder. --- tools/auto-tester/src/Test.cpp | 68 ++++++++++++++++++++++------------ tools/auto-tester/src/Test.h | 4 +- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 931a940760..357fc7b296 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -17,8 +17,6 @@ #include Test::Test() { - snapshotFilenameFormat = QRegularExpression("hifi-snap-by-.*-on-\\d\\d\\d\\d-\\d\\d-\\d\\d_\\d\\d-\\d\\d-\\d\\d.jpg"); - expectedImageFilenameFormat = QRegularExpression("ExpectedImage_\\d+.jpg"); mismatchWindow.setModal(true); @@ -387,16 +385,16 @@ void Test::createRecursiveScriptsRecursively() { void Test::createTest() { // Rename files sequentially, as ExpectedResult_1.jpeg, ExpectedResult_2.jpg and so on // Any existing expected result images will be deleted - QString pathToImageDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); - if (pathToImageDirectory == "") { + QString imageSourceDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); + if (imageSourceDirectory == "") { return; } - QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(pathToImageDirectory); + QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(imageSourceDirectory); int i = 1; foreach (QString currentFilename, sortedImageFilenames) { - QString fullCurrentFilename = pathToImageDirectory + "/" + currentFilename; + QString fullCurrentFilename = imageSourceDirectory + "/" + currentFilename; if (isInExpectedImageFilenameFormat(currentFilename)) { if (!QFile::remove(fullCurrentFilename)) { messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nTest creation aborted"); @@ -408,22 +406,15 @@ void Test::createTest() { messageBox.critical(0, "Error", "More than 100,000 images not supported"); exit(-1); } - QString newFilename = "ExpectedImage_" + QString::number(i-1).rightJustified(5, '0') + ".jpg"; - QString fullNewFileName = pathToImageDirectory + "/" + newFilename; + QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".jpg"; + QString imageDestinationDirectory = getImageDestinationDirectory(currentFilename); + QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; - if (!imageDirectory.rename(fullCurrentFilename, newFilename)) { - if (!QFile::exists(fullCurrentFilename)) { - messageBox.critical(0, "Error", "Could not rename file: " + fullCurrentFilename + " to: " + newFilename + "\n" - + fullCurrentFilename + " not found" - + "\nTest creation aborted" - ); - exit(-1); - } else { - messageBox.critical(0, "Error", "Could not rename file: " + fullCurrentFilename + " to: " + newFilename + "\n" - + "unknown error" + "\nTest creation aborted" - ); - exit(-1); - } + try { + QFile::copy(fullCurrentFilename, fullNewFileName); + } catch (...) { + messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nTest creation aborted"); + exit(-1); } ++i; } @@ -475,9 +466,40 @@ QStringList Test::createListOfAllJPEGimagesInDirectory(QString pathToImageDirect return imageDirectory.entryList(nameFilters, QDir::Files, QDir::Name); } -// Use regular expressions to check if files are in specific format +// Snapshots are files in the following format: +// Filename contains no periods (excluding period before exception +// Filename (i.e. without extension) contains _tests_ (this is based on all test scripts being within the tests folder +// Last 5 characters in filename are digits +// Extension is jpg bool Test::isInSnapshotFilenameFormat(QString filename) { - return (snapshotFilenameFormat.match(filename).hasMatch()); + QStringList filenameParts = filename.split("."); + + bool filnameHasNoPeriods = (filenameParts.size() == 2); + bool contains_tests = filenameParts[0].contains("_tests_"); + + bool last5CharactersAreDigits; + filenameParts[0].right(5).toInt(&last5CharactersAreDigits, 10); + + bool extensionIsJPG = filenameParts[1] == "jpg"; + + return (filnameHasNoPeriods && contains_tests && last5CharactersAreDigits && extensionIsJPG); +} + +// For a file named "D_GitHub_hifi-tests_tests_content_entity_zone_create_0.jpg", the test directory is +// D:/GitHub/hifi-tests/tests/content/entity/zone/create +// This method assumes the filename is in the correct format +// The final part of the filename is the image number. This is checked for sanity +QString Test::getImageDestinationDirectory(QString filename) { + QString filenameWithoutExtension = filename.split(".")[0]; + QStringList filenameParts = filenameWithoutExtension.split("_"); + + QString result = filenameParts[0] + ":"; + + for (int i = 1; i < filenameParts.length() - 1; ++i) { + result += "/" + filenameParts[i]; + } + + return result; } bool Test::isInExpectedImageFilenameFormat(QString filename) { diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 3da5badb6d..55fb7229d1 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -46,6 +46,8 @@ public: bool isAValidDirectory(QString pathname); + QString getImageDestinationDirectory(QString filename); + private: const QString TEST_FILENAME { "test.js" }; const QString TEST_RESULTS_FOLDER { "TestResults" }; @@ -55,14 +57,12 @@ private: QDir imageDirectory; - QRegularExpression snapshotFilenameFormat; QRegularExpression expectedImageFilenameFormat; MismatchWindow mismatchWindow; ImageComparer imageComparer; - QString testResultsFolderPath { "" }; int index { 1 }; }; From b5c3b78d57ee6e85bf3deefdab5533e1e4111655 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 1 Mar 2018 17:58:23 -0300 Subject: [PATCH 146/267] Android - Virtual Pad - Limit joystick inside base circle. --- .../TouchscreenVirtualPadDevice.cpp | 98 ++++++++++++++----- .../TouchscreenVirtualPadDevice.h | 5 + 2 files changed, 80 insertions(+), 23 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 90a78b3231..1774bbb4d3 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -50,6 +50,7 @@ void TouchscreenVirtualPadDevice::init() { _screenDPI = eventScreen->physicalDotsPerInch(); _fixedRadius = _screenDPI * 256 / 534; + _fixedRadiusForCalc = _fixedRadius - _screenDPI * 105 / 534; // 105 is the radius of the stick circle } auto& virtualPadManager = VirtualPad::Manager::instance(); @@ -79,6 +80,79 @@ float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); } +glm::vec2 TouchscreenVirtualPadDevice::clippedPointInCircle(float radius, glm::vec2 origin, glm::vec2 touchPoint) { + float deltaX = touchPoint.x-origin.x; + float deltaY = touchPoint.y-origin.y; + + float distance = sqrt(pow(deltaX,2)+pow(deltaY,2)); + + // First case, inside the boundaires, just use the distance + if (distance <= radius) { + return touchPoint; + } + + // Second case, purely vertical (avoid division by zero) + if (deltaX == 0.0f) { + return vec2(touchPoint.x, clip(touchPoint.y, origin.y-radius, origin.y+radius) ); + } + + // Third case, calculate point in circumference + // line formula + float m = deltaY/deltaX; + float b = touchPoint.y - m * touchPoint.x; + + // quadtratic coefs of circumference and line intersection + float qa = pow(m,2)+1; + float qb = 2 * ( m * b - origin.x - origin.y * m ); + float qc = pow(origin.x, 2) - pow(radius,2) + b * b - 2 * b * origin.y + pow(origin.y, 2); + + float discr = qb * qb - 4 * qa * qc; + float discrSign = deltaX>0?1.0:-1.0; + + float finalX = (- qb + discrSign * sqrt(discr)) / (2 * qa); + float finalY = m * finalX + b; + + return vec2(finalX, finalY); +} + +void TouchscreenVirtualPadDevice::processInputUseCircleMethod(VirtualPad::Manager& virtualPadManager) { + vec2 clippedPoint = clippedPointInCircle(_fixedRadiusForCalc, _firstTouchLeftPoint, _currentTouchLeftPoint); + + _inputDevice->_axisStateMap[controller::LX] = (clippedPoint.x - _firstTouchLeftPoint.x) / _fixedRadiusForCalc; + _inputDevice->_axisStateMap[controller::LY] = (clippedPoint.y - _firstTouchLeftPoint.y) / _fixedRadiusForCalc; + + virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); + virtualPadManager.getLeftVirtualPad()->setCurrentTouch(clippedPoint); + virtualPadManager.getLeftVirtualPad()->setBeingTouched(true); + virtualPadManager.getLeftVirtualPad()->setShown(true); // If touched, show in any mode (fixed joystick position or non-fixed) +} + +void TouchscreenVirtualPadDevice::processInputUseSquareMethod(VirtualPad::Manager& virtualPadManager) { + float leftDistanceScaleX, leftDistanceScaleY; + leftDistanceScaleX = (_currentTouchLeftPoint.x - _firstTouchLeftPoint.x) / _screenDPIScale.x; + leftDistanceScaleY = (_currentTouchLeftPoint.y - _firstTouchLeftPoint.y) / _screenDPIScale.y; + + leftDistanceScaleX = clip(leftDistanceScaleX, -STICK_RADIUS_INCHES, STICK_RADIUS_INCHES); + leftDistanceScaleY = clip(leftDistanceScaleY, -STICK_RADIUS_INCHES, STICK_RADIUS_INCHES); + + // NOW BETWEEN -1 1 + leftDistanceScaleX /= STICK_RADIUS_INCHES; + leftDistanceScaleY /= STICK_RADIUS_INCHES; + + _inputDevice->_axisStateMap[controller::LX] = leftDistanceScaleX; + _inputDevice->_axisStateMap[controller::LY] = leftDistanceScaleY; + + /* Shared variables for stick rendering (clipped to the stick radius)*/ + // Prevent this for being done when not in first person view + virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); + virtualPadManager.getLeftVirtualPad()->setCurrentTouch( + glm::vec2(clip(_currentTouchLeftPoint.x, -STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x, STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x), + clip(_currentTouchLeftPoint.y, -STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y, STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y)) + ); + virtualPadManager.getLeftVirtualPad()->setBeingTouched(true); + virtualPadManager.getLeftVirtualPad()->setShown(true); // If touched, show in any mode (fixed joystick position or non-fixed) +} + void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { auto userInputMapper = DependencyManager::get(); userInputMapper->withLock([&, this]() { @@ -89,29 +163,7 @@ void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller setupFixedCenter(virtualPadManager); if (_validTouchLeft) { - float leftDistanceScaleX, leftDistanceScaleY; - leftDistanceScaleX = (_currentTouchLeftPoint.x - _firstTouchLeftPoint.x) / _screenDPIScale.x; - leftDistanceScaleY = (_currentTouchLeftPoint.y - _firstTouchLeftPoint.y) / _screenDPIScale.y; - - leftDistanceScaleX = clip(leftDistanceScaleX, -STICK_RADIUS_INCHES, STICK_RADIUS_INCHES); - leftDistanceScaleY = clip(leftDistanceScaleY, -STICK_RADIUS_INCHES, STICK_RADIUS_INCHES); - - // NOW BETWEEN -1 1 - leftDistanceScaleX /= STICK_RADIUS_INCHES; - leftDistanceScaleY /= STICK_RADIUS_INCHES; - - _inputDevice->_axisStateMap[controller::LX] = leftDistanceScaleX; - _inputDevice->_axisStateMap[controller::LY] = leftDistanceScaleY; - - /* Shared variables for stick rendering (clipped to the stick radius)*/ - // Prevent this for being done when not in first person view - virtualPadManager.getLeftVirtualPad()->setFirstTouch(_firstTouchLeftPoint); - virtualPadManager.getLeftVirtualPad()->setCurrentTouch( - glm::vec2(clip(_currentTouchLeftPoint.x, -STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x, STICK_RADIUS_INCHES * _screenDPIScale.x + _firstTouchLeftPoint.x), - clip(_currentTouchLeftPoint.y, -STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y, STICK_RADIUS_INCHES * _screenDPIScale.y + _firstTouchLeftPoint.y)) - ); - virtualPadManager.getLeftVirtualPad()->setBeingTouched(true); - virtualPadManager.getLeftVirtualPad()->setShown(true); // If touched, show in any mode (fixed joystick position or non-fixed) + processInputUseCircleMethod(virtualPadManager); } else { virtualPadManager.getLeftVirtualPad()->setBeingTouched(false); if (_fixedPosition) { diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 6e65ef7ab2..f71490b0e3 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -79,6 +79,7 @@ protected: bool _fixedPosition; glm::vec2 _fixedCenterPosition; qreal _fixedRadius; + qreal _fixedRadiusForCalc; int _extraBottomMargin {0}; void touchLeftBegin(glm::vec2 touchPoint); @@ -89,6 +90,10 @@ protected: void touchRightUpdate(glm::vec2 touchPoint); void touchRightEnd(); void setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force = false); + + void processInputUseCircleMethod(VirtualPad::Manager& virtualPadManager); + void processInputUseSquareMethod(VirtualPad::Manager& virtualPadManager); + glm::vec2 clippedPointInCircle(float radius, glm::vec2 origin, glm::vec2 touchPoint); // just for debug private: void debugPoints(const QTouchEvent* event, QString who); From 5e311a86ee75af09128ea575040a4f0af62e6531 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 2 Mar 2018 10:20:13 +1300 Subject: [PATCH 147/267] Document the "Image" pseudo-entity type --- .../entities/src/EntityItemProperties.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2491e20b7d..a6f15c5fdd 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -726,7 +726,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * value is specified then the model is automatically sized to its * {@link Entityes.EntityProperties|naturalDimensions}. * @property {Color} color=255,255,255 - Currently not used. - * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx". + * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx".
+ * Note: If the name ends with "default-image-model.fbx" then the entity is considered to be an "Image" + * entity, in which case the textures property should be set per the example. * @property {string} textures="" - A JSON string of texture name, URL pairs used when rendering the model in place of the * model's original textures. Only the texture names and URLs to be overridden need be specified; original textures are * used where there are no overrides. You can use JSON.stringify() to convert a JavaScript object of name, URL @@ -771,6 +773,24 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * dimensions: { x: 0.0945, y: 0.0921, z: 0.0423 }, * lifetime: 300 // Delete after 5 minutes. * }); + * @example Crate an "Image" entity like the Create app. + * var IMAGE_MODEL = "https://hifi-content.s3.amazonaws.com/DomainContent/production/default-image-model.fbx"; + * var DEFAULT_IMAGE = "https://hifi-content.s3.amazonaws.com/DomainContent/production/no-image.jpg"; + * var entity = Entities.addEntity({ + * type: "Model", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -3 })), + * rotation: MyAvatar.orientation, + * dimensions: { + * x: 0.5385, + * y: 0.2819, + * z: 0.0092 + * }, + * shapeType: "box", + * collisionless: true, + * modelURL: IMAGE_MODEL, + * textures: JSON.stringify({ "tex.picture": DEFAULT_IMAGE }), + * lifetime: 300 // Delete after 5 minutes + * }); */ /**jsdoc From b2c7ddbd056813131fdad8a0c5da05bc1f125f77 Mon Sep 17 00:00:00 2001 From: LaShonda Hopper Date: Thu, 15 Feb 2018 14:52:16 -0500 Subject: [PATCH 148/267] [Case 4315] Particle System Tab has additional color picker support (details below). * Adds 3 additional keys/properties to hifi-entity-ui's specification support for color pickers. * layoutType: This correlates to colpick's layout property. This is expected to be a string. Valid values are those supported by colpick, see colpick.js for additional details. * Within hifi-entity-ui, if this value isn't specified the default is "hex" as was previously hard coded. * layoutColorScheme: This correlates to colpicks's colorScheme property. This is expected to be a string. Valid values are those supported by colpick, see colpick.js for additional details. * Within hifi-entity-ui, if this value isn't specified the default is "dark" as was previously hard coded. * useSubmitButton: This correlates to colpick's submit property. This is expected to be a boolean. See colpick.js for additional details. * Within hifi-entity-ui, if this value isn't specified the default is true as was previously hard coded. * Amends particleExplorer.js color picker descriptors to make use of the new keys to bring the color pickers within the Particle Tab inline with the appearance of the Properties Tab color pickers submitted within PR #12241 which don't utilize the OK button. Changes Committed: modified: scripts/system/particle_explorer/hifi-entity-ui.js modified: scripts/system/particle_explorer/particleExplorer.js --- .../particle_explorer/hifi-entity-ui.js | 5 +++-- .../particle_explorer/particleExplorer.js | 20 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/scripts/system/particle_explorer/hifi-entity-ui.js b/scripts/system/particle_explorer/hifi-entity-ui.js index 720aaee4d9..05b6ba6f75 100644 --- a/scripts/system/particle_explorer/hifi-entity-ui.js +++ b/scripts/system/particle_explorer/hifi-entity-ui.js @@ -439,8 +439,9 @@ HifiEntityUI.prototype = { $colPickContainer.colpick({ - colorScheme: 'dark', - layout: 'hex', + colorScheme: (group.layoutColorScheme === undefined ? 'dark' : group.layoutColorScheme), + layout: (group.layoutType === undefined ? 'hex' : group.layoutType), + submit: (group.useSubmitButton === undefined ? true : group.useSubmitButton), color: { r: domArray[0].value, g: domArray[1].value, diff --git a/scripts/system/particle_explorer/particleExplorer.js b/scripts/system/particle_explorer/particleExplorer.js index 971798828f..3598f30ee0 100644 --- a/scripts/system/particle_explorer/particleExplorer.js +++ b/scripts/system/particle_explorer/particleExplorer.js @@ -236,7 +236,10 @@ red: 255, green: 255, blue: 255 - } + }, + layoutType: "hex", + layoutColorScheme: "dark", + useSubmitButton: false }, { type: "Row" @@ -249,7 +252,10 @@ red: 0, green: 0, blue: 0 - } + }, + layoutType: "hex", + layoutColorScheme: "dark", + useSubmitButton: false }, { type: "Row" @@ -262,7 +268,10 @@ red: 255, green: 255, blue: 255 - } + }, + layoutType: "hex", + layoutColorScheme: "dark", + useSubmitButton: false }, { type: "Row" @@ -275,7 +284,10 @@ red: 255, green: 255, blue: 255 - } + }, + layoutType: "hex", + layoutColorScheme: "dark", + useSubmitButton: false }, { type: "Row" From fde1ca62620e162c4804e6da8ab01f3ff0aa6256 Mon Sep 17 00:00:00 2001 From: LaShonda Hopper Date: Thu, 22 Feb 2018 14:49:15 -0500 Subject: [PATCH 149/267] [Case 4315] Ensures that Particle Tab Color Pickers obey colpick visual styling. Changes Committed: modified: scripts/system/particle_explorer/particleExplorer.html --- scripts/system/particle_explorer/particleExplorer.html | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/particle_explorer/particleExplorer.html b/scripts/system/particle_explorer/particleExplorer.html index 48cd4afa06..ab4c249cc3 100644 --- a/scripts/system/particle_explorer/particleExplorer.html +++ b/scripts/system/particle_explorer/particleExplorer.html @@ -27,6 +27,7 @@ + From 0f2cf8ea85b32e2d5121a42b7cbe232ebe5575a5 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 1 Mar 2018 14:24:20 -0800 Subject: [PATCH 150/267] Re-implemented shadow controls. --- .../dialogs/GraphicsPreferencesDialog.qml | 19 ------ interface/src/Menu.cpp | 16 +++-- interface/src/Menu.h | 2 + .../src/RenderableEntityItem.cpp | 8 ++- .../src/RenderableEntityItem.h | 1 + .../src/RenderableModelEntityItem.cpp | 4 ++ .../src/RenderableZoneEntityItem.cpp | 1 + libraries/entities/src/EntityItem.cpp | 27 ++++++++ libraries/entities/src/EntityItem.h | 5 ++ .../entities/src/EntityItemProperties.cpp | 13 ++++ libraries/entities/src/EntityItemProperties.h | 2 + .../src/EntityItemPropertiesDefaults.h | 1 + libraries/entities/src/EntityPropertyFlags.h | 10 +-- .../entities/src/KeyLightPropertyGroup.cpp | 31 +++++++-- .../entities/src/KeyLightPropertyGroup.h | 2 + libraries/graphics/src/graphics/Light.cpp | 9 ++- libraries/graphics/src/graphics/Light.h | 5 ++ .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- .../render-utils/src/CauterizedModel.cpp | 5 +- .../src/DeferredLightingEffect.cpp | 18 ++++-- .../render-utils/src/DeferredLightingEffect.h | 2 +- .../render-utils/src/MeshPartPayload.cpp | 13 +++- libraries/render-utils/src/MeshPartPayload.h | 4 +- libraries/render-utils/src/Model.cpp | 63 +++++++++++++------ libraries/render-utils/src/Model.h | 6 ++ .../render-utils/src/RenderShadowTask.cpp | 14 ++++- libraries/render-utils/src/RenderShadowTask.h | 2 +- scripts/system/html/entityProperties.html | 44 ++++++------- scripts/system/html/js/entityProperties.js | 32 +++++++++- 30 files changed, 269 insertions(+), 95 deletions(-) delete mode 100644 interface/resources/qml/hifi/dialogs/GraphicsPreferencesDialog.qml diff --git a/interface/resources/qml/hifi/dialogs/GraphicsPreferencesDialog.qml b/interface/resources/qml/hifi/dialogs/GraphicsPreferencesDialog.qml deleted file mode 100644 index d95bafd0a9..0000000000 --- a/interface/resources/qml/hifi/dialogs/GraphicsPreferencesDialog.qml +++ /dev/null @@ -1,19 +0,0 @@ -import QtQuick 2.5 -import Qt.labs.settings 1.0 - -import "../../dialogs" - -PreferencesDialog { - id: root - objectName: "GraphicsPreferencesDialog" - title: "Graphics Settings" - showCategories: ["Graphics"] - property var settings: Settings { - category: root.objectName - property alias x: root.x - property alias y: root.y - property alias width: root.width - property alias height: root.height - } -} - diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 8c0ac584c5..ca6f7a31d1 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -43,6 +43,7 @@ #include "ui/StandAloneJSConsole.h" #include "InterfaceLogging.h" #include "LocationBookmarks.h" +#include "DeferredLightingEffect.h" #if defined(Q_OS_MAC) || defined(Q_OS_WIN) #include "SpeechRecognizer.h" @@ -360,11 +361,16 @@ Menu::Menu() { // Developer menu ---------------------------------- MenuWrapper* developerMenu = addMenu("Developer", "Developer"); - // Developer > Graphics... - action = addActionToQMenuAndActionHash(developerMenu, "Graphics..."); - connect(action, &QAction::triggered, [] { - qApp->showDialog(QString("hifi/dialogs/GraphicsPreferencesDialog.qml"), - QString("hifi/tablet/TabletGraphicsPreferences.qml"), "GraphicsPreferencesDialog"); + // Developer > Graphics + MenuWrapper* graphicsOptionsMenu = developerMenu->addMenu("Render"); + action = addCheckableActionToQMenuAndActionHash(graphicsOptionsMenu, MenuOption::Shadows, 0, true); + connect(action, &QAction::triggered, [action] { + DependencyManager::get()->setShadowMapEnabled(action->isChecked()); + }); + + action = addCheckableActionToQMenuAndActionHash(graphicsOptionsMenu, MenuOption::AmbientOcclusion, 0, false); + connect(action, &QAction::triggered, [action] { + DependencyManager::get()->setAmbientOcclusionEnabled(action->isChecked()); }); // Developer > UI >>> diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 34588535ec..1d37b74ffe 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -204,6 +204,8 @@ namespace MenuOption { const QString WorldAxes = "World Axes"; const QString DesktopTabletToToolbar = "Desktop Tablet Becomes Toolbar"; const QString HMDTabletToToolbar = "HMD Tablet Becomes Toolbar"; + const QString Shadows = "Shadows"; + const QString AmbientOcclusion = "AmbientOcclusion"; } #endif // hifi_Menu_h diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index d3c9f3d4bd..c33b87e5cf 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -164,7 +164,12 @@ ItemKey EntityRenderer::getKey() { return ItemKey::Builder::transparentShape().withTypeMeta().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); } - return ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); + // This allows shapes to cast shadows + if (_canCastShadow) { + return ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1).withShadowCaster(); + } else { + return ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); + } } uint32_t EntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { @@ -377,6 +382,7 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa _moving = entity->isMovingRelativeToParent(); _visible = entity->getVisible(); + _canCastShadow = entity->getCanCastShadow(); _cauterized = entity->getCauterized(); _needsRenderUpdate = false; }); diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index d34a1127ae..ada57c8ab0 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -129,6 +129,7 @@ protected: bool _isFading{ _entitiesShouldFadeFunction() }; bool _prevIsTransparent { false }; bool _visible { false }; + bool _canCastShadow { false }; bool _cauterized { false }; bool _moving { false }; bool _needsRenderUpdate { false }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 5f926d1bb9..b7c5caf8ee 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1395,6 +1395,10 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce } // TODO? early exit here when not visible? + if (model->canCastShadow() != _canCastShadow) { + model->setCanCastShadow(_canCastShadow, scene, viewTaskBits, false); + } + if (_needsCollisionGeometryUpdate) { setCollisionMeshKey(entity->getCollisionMeshKey()); _needsCollisionGeometryUpdate = false; diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 34703804cd..322c91e3d3 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -330,6 +330,7 @@ void ZoneEntityRenderer::updateKeySunFromEntity(const TypedEntityPointer& entity sunLight->setColor(ColorUtils::toVec3(_keyLightProperties.getColor())); sunLight->setIntensity(_keyLightProperties.getIntensity()); sunLight->setDirection(entity->getTransform().getRotation() * _keyLightProperties.getDirection()); + sunLight->setCastShadows(_keyLightProperties.getCastShadows()); } void ZoneEntityRenderer::updateAmbientLightFromEntity(const TypedEntityPointer& entity) { diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index ec0bdbd2ae..f77d8a59c3 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -91,6 +91,7 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param requestedProperties += PROP_REGISTRATION_POINT; requestedProperties += PROP_ANGULAR_DAMPING; requestedProperties += PROP_VISIBLE; + requestedProperties += PROP_CAN_CAST_SHADOW; requestedProperties += PROP_COLLISIONLESS; requestedProperties += PROP_COLLISION_MASK; requestedProperties += PROP_DYNAMIC; @@ -249,6 +250,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping()); APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible()); + APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow()); APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, getCollisionless()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, getCollisionMask()); APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, getDynamic()); @@ -799,6 +801,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); + READ_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); READ_ENTITY_PROPERTY(PROP_COLLISIONLESS, bool, setCollisionless); READ_ENTITY_PROPERTY(PROP_COLLISION_MASK, uint8_t, setCollisionMask); READ_ENTITY_PROPERTY(PROP_DYNAMIC, bool, setDynamic); @@ -1234,6 +1237,7 @@ EntityItemProperties EntityItem::getProperties(EntityPropertyFlags desiredProper COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping); COPY_ENTITY_PROPERTY_TO_PROPERTIES(localRenderAlpha, getLocalRenderAlpha); COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionless, getCollisionless); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionMask, getCollisionMask); COPY_ENTITY_PROPERTY_TO_PROPERTIES(dynamic, getDynamic); @@ -1346,6 +1350,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL); SET_ENTITY_PROPERTY_FROM_PROPERTIES(localRenderAlpha, setLocalRenderAlpha); SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow); SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); // Certifiable Properties @@ -2723,6 +2728,28 @@ void EntityItem::setVisible(bool value) { } } +bool EntityItem::getCanCastShadow() const { + bool result; + withReadLock([&] { + result = _canCastShadow; + }); + return result; +} + +void EntityItem::setCanCastShadow(bool value) { + bool changed = false; + withWriteLock([&] { + if (_canCastShadow != value) { + changed = true; + _canCastShadow = value; + } + }); + + if (changed) { + emit requestRenderUpdate(); + } +} + bool EntityItem::isChildOfMyAvatar() const { QUuid ancestorID = findAncestorOfType(NestableType::Avatar); return !ancestorID.isNull() && (ancestorID == Physics::getSessionUUID() || ancestorID == AVATAR_SELF_ID); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index b12417c496..d08c5514e9 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -274,6 +274,10 @@ public: bool getVisible() const; void setVisible(bool value); + + bool getCanCastShadow() const; + void setCanCastShadow(bool value); + inline bool isVisible() const { return getVisible(); } inline bool isInvisible() const { return !getVisible(); } @@ -551,6 +555,7 @@ protected: glm::vec3 _registrationPoint { ENTITY_ITEM_DEFAULT_REGISTRATION_POINT }; float _angularDamping { ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING }; bool _visible { ENTITY_ITEM_DEFAULT_VISIBLE }; + bool _canCastShadow{ ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW }; bool _collisionless { ENTITY_ITEM_DEFAULT_COLLISIONLESS }; uint8_t _collisionMask { ENTITY_COLLISION_MASK_DEFAULT }; bool _dynamic { ENTITY_ITEM_DEFAULT_DYNAMIC }; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index a2724c4cbf..2eca612fc2 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -316,6 +316,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL); CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); + CHECK_PROPERTY_CHANGE(PROP_CAN_CAST_SHADOW, canCastShadow); CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint); CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity); CHECK_PROPERTY_CHANGE(PROP_ANGULAR_DAMPING, angularDamping); @@ -490,6 +491,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISIONLESS, collisionless); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISIONLESS, collisionless, ignoreForCollisions, getCollisionless()); // legacy support COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_MASK, collisionMask); @@ -751,6 +753,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, glmVec3, setAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); + COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); COPY_PROPERTY_FROM_QSCRIPTVALUE(color, xColor, setColor); COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, xColor, setColorSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, xColor, setColorStart); @@ -922,6 +925,7 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(angularVelocity); COPY_PROPERTY_IF_CHANGED(angularDamping); COPY_PROPERTY_IF_CHANGED(visible); + COPY_PROPERTY_IF_CHANGED(canCastShadow); COPY_PROPERTY_IF_CHANGED(color); COPY_PROPERTY_IF_CHANGED(colorSpread); COPY_PROPERTY_IF_CHANGED(colorStart); @@ -1094,6 +1098,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue std::call_once(initMap, [](){ ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); + ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, glm::quat); @@ -1187,6 +1192,8 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, glm::vec3); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); @@ -1412,6 +1419,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping()); APPEND_ENTITY_PROPERTY(PROP_VISIBLE, properties.getVisible()); + APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, properties.getCanCastShadow()); APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask()); APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic()); @@ -1784,6 +1792,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, glm::vec3, setAngularVelocity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint8_t, setCollisionMask); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic); @@ -2053,6 +2062,7 @@ void EntityItemProperties::markAllChanged() { _angularDampingChanged = true; _nameChanged = true; _visibleChanged = true; + _canCastShadowChanged = true; _colorChanged = true; _alphaChanged = true; _modelURLChanged = true; @@ -2250,6 +2260,9 @@ QList EntityItemProperties::listChangedProperties() { if (visibleChanged()) { out += "visible"; } + if (canCastShadowChanged()) { + out += "canCastShadow"; + } if (rotationChanged()) { out += "rotation"; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 36ca47291c..0838bb937a 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -117,6 +117,7 @@ public: // bool _fooChanged { false }; DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE); + DEFINE_PROPERTY(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool, ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW); DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, glm::vec3, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3, ENTITY_ITEM_DEFAULT_DIMENSIONS); DEFINE_PROPERTY_REF(PROP_ROTATION, Rotation, rotation, glm::quat, ENTITY_ITEM_DEFAULT_ROTATION); @@ -426,6 +427,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, Velocity, velocity, "in meters"); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Name, name, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Visible, visible, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, CanCastShadow, canCastShadow, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Rotation, rotation, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Density, density, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Gravity, gravity, ""); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index eb09a64628..0e0c2994cd 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -46,6 +46,7 @@ const quint32 ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION = 0; const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f; const float ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA = 1.0f; const bool ENTITY_ITEM_DEFAULT_VISIBLE = true; +const bool ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW { true }; const QString ENTITY_ITEM_DEFAULT_SCRIPT = QString(""); const quint64 ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP = 0; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index b65d5d1a3f..07908fe6cf 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -20,6 +20,7 @@ enum EntityPropertyList { // these properties are supported by the EntityItem base class PROP_VISIBLE, + PROP_CAN_CAST_SHADOW, PROP_POSITION, PROP_DIMENSIONS, PROP_ROTATION, @@ -205,6 +206,11 @@ enum EntityPropertyList { PROP_HAZE_MODE, + PROP_KEYLIGHT_COLOR, + PROP_KEYLIGHT_INTENSITY, + PROP_KEYLIGHT_DIRECTION, + PROP_KEYLIGHT_CAST_SHADOW, + PROP_HAZE_RANGE, PROP_HAZE_COLOR, PROP_HAZE_GLARE_COLOR, @@ -254,10 +260,6 @@ enum EntityPropertyList { // Aliases/Piggyback properties for Zones. These properties intentionally reuse the enum values for // other properties which will never overlap with each other. We do this so that we don't have to expand // the size of the properties bitflags mask - PROP_KEYLIGHT_COLOR = PROP_COLOR, - PROP_KEYLIGHT_INTENSITY = PROP_INTENSITY, - PROP_KEYLIGHT_DIRECTION = PROP_EXPONENT, - PROP_SKYBOX_COLOR = PROP_ANIMATION_URL, PROP_SKYBOX_URL = PROP_ANIMATION_FPS, diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index c476b4c23c..e0b6ae6e96 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -21,6 +21,7 @@ const xColor KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_INTENSITY = 1.0f; const float KeyLightPropertyGroup::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY = 0.5f; const glm::vec3 KeyLightPropertyGroup::DEFAULT_KEYLIGHT_DIRECTION = { 0.0f, -1.0f, 0.0f }; +const bool KeyLightPropertyGroup::DEFAULT_KEYLIGHT_CAST_SHADOWS { false }; void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { @@ -28,23 +29,27 @@ void KeyLightPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desired COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_COLOR, KeyLight, keyLight, Color, color); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_INTENSITY, KeyLight, keyLight, Intensity, intensity); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_DIRECTION, KeyLight, keyLight, Direction, direction); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_KEYLIGHT_CAST_SHADOW, KeyLight, keyLight, CastShadows, castShadows); } void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, color, xColor, setColor); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, intensity, float, setIntensity); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, direction, glmVec3, setDirection); - + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(keyLight, castShadows, bool, setCastShadows); + // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightColor, xColor, setColor, getColor); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightIntensity, float, setIntensity, getIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, glmVec3, setDirection, getDirection); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightCastShadows, bool, setCastShadows, getCastShadows); } void KeyLightPropertyGroup::merge(const KeyLightPropertyGroup& other) { COPY_PROPERTY_IF_CHANGED(color); COPY_PROPERTY_IF_CHANGED(intensity); COPY_PROPERTY_IF_CHANGED(direction); + COPY_PROPERTY_IF_CHANGED(castShadows); } void KeyLightPropertyGroup::debugDump() const { @@ -52,6 +57,7 @@ void KeyLightPropertyGroup::debugDump() const { qCDebug(entities) << " color:" << getColor(); // << "," << getColor()[1] << "," << getColor()[2]; qCDebug(entities) << " intensity:" << getIntensity(); qCDebug(entities) << " direction:" << getDirection(); + qCDebug(entities) << " castShadows:" << getCastShadows(); } void KeyLightPropertyGroup::listChangedProperties(QList& out) { @@ -64,6 +70,9 @@ void KeyLightPropertyGroup::listChangedProperties(QList& out) { if (directionChanged()) { out << "keyLight-direction"; } + if (castShadowsChanged()) { + out << "keyLight-castShadows"; + } } bool KeyLightPropertyGroup::appendToEditPacket(OctreePacketData* packetData, @@ -78,12 +87,13 @@ bool KeyLightPropertyGroup::appendToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, getIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, getDirection()); - + APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, getCastShadows()); + return true; } bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt, - int& processedBytes) { + int& processedBytes) { int bytesRead = 0; bool overwriteLocalData = true; @@ -92,11 +102,13 @@ bool KeyLightPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFl READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); - + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_COLOR, Color); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_INTENSITY, Intensity); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_DIRECTION, Direction); - + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_KEYLIGHT_CAST_SHADOW, CastShadows); + processedBytes += bytesRead; Q_UNUSED(somethingChanged); @@ -108,6 +120,7 @@ void KeyLightPropertyGroup::markAllChanged() { _colorChanged = true; _intensityChanged = true; _directionChanged = true; + _castShadowsChanged = true; } EntityPropertyFlags KeyLightPropertyGroup::getChangedProperties() const { @@ -116,7 +129,8 @@ EntityPropertyFlags KeyLightPropertyGroup::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_COLOR, color); CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_INTENSITY, intensity); CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_DIRECTION, direction); - + CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_CAST_SHADOW, castShadows); + return changedProperties; } @@ -124,6 +138,7 @@ void KeyLightPropertyGroup::getProperties(EntityItemProperties& properties) cons COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(KeyLight, Color, getColor); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(KeyLight, Intensity, getIntensity); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(KeyLight, Direction, getDirection); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(KeyLight, CastShadows, getCastShadows); } bool KeyLightPropertyGroup::setProperties(const EntityItemProperties& properties) { @@ -132,6 +147,7 @@ bool KeyLightPropertyGroup::setProperties(const EntityItemProperties& properties SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(KeyLight, Color, color, setColor); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(KeyLight, Intensity, intensity, setIntensity); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(KeyLight, Direction, direction, setDirection); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(KeyLight, CastShadows, castShadows, setCastShadows); return somethingChanged; } @@ -142,6 +158,7 @@ EntityPropertyFlags KeyLightPropertyGroup::getEntityProperties(EncodeBitstreamPa requestedProperties += PROP_KEYLIGHT_COLOR; requestedProperties += PROP_KEYLIGHT_INTENSITY; requestedProperties += PROP_KEYLIGHT_DIRECTION; + requestedProperties += PROP_KEYLIGHT_CAST_SHADOW; return requestedProperties; } @@ -159,6 +176,7 @@ void KeyLightPropertyGroup::appendSubclassData(OctreePacketData* packetData, Enc APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, getIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, getDirection()); + APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, getCastShadows()); } int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -172,6 +190,7 @@ int KeyLightPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* READ_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, xColor, setColor); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setDirection); + READ_ENTITY_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, bool, setCastShadows); return bytesRead; } diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index f33ebb282d..5e13a6afa6 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -78,10 +78,12 @@ public: static const float DEFAULT_KEYLIGHT_INTENSITY; static const float DEFAULT_KEYLIGHT_AMBIENT_INTENSITY; static const glm::vec3 DEFAULT_KEYLIGHT_DIRECTION; + static const bool DEFAULT_KEYLIGHT_CAST_SHADOWS; DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, Color, color, xColor, DEFAULT_KEYLIGHT_COLOR); DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, Intensity, intensity, float, DEFAULT_KEYLIGHT_INTENSITY); DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, Direction, direction, glm::vec3, DEFAULT_KEYLIGHT_DIRECTION); + DEFINE_PROPERTY(PROP_KEYLIGHT_CAST_SHADOW, CastShadows, castShadows, bool, DEFAULT_KEYLIGHT_CAST_SHADOWS); }; #endif // hifi_KeyLightPropertyGroup_h diff --git a/libraries/graphics/src/graphics/Light.cpp b/libraries/graphics/src/graphics/Light.cpp index 9da14fec4f..76d8a6030a 100755 --- a/libraries/graphics/src/graphics/Light.cpp +++ b/libraries/graphics/src/graphics/Light.cpp @@ -65,6 +65,14 @@ const Vec3& Light::getDirection() const { return _lightSchemaBuffer->volume.direction; } +void Light::setCastShadows(const bool castShadows) { + _castShadows = castShadows; +} + +bool Light::getCastShadows() const { + return _castShadows; +} + void Light::setColor(const Color& color) { _lightSchemaBuffer.edit().irradiance.color = color; updateLightRadius(); @@ -132,7 +140,6 @@ void Light::setSpotExponent(float exponent) { _lightSchemaBuffer.edit().irradiance.falloffSpot = exponent; } - void Light::setAmbientIntensity(float intensity) { _ambientSchemaBuffer.edit().intensity = intensity; } diff --git a/libraries/graphics/src/graphics/Light.h b/libraries/graphics/src/graphics/Light.h index e6ef1e35c5..bb9fb3e5b9 100755 --- a/libraries/graphics/src/graphics/Light.h +++ b/libraries/graphics/src/graphics/Light.h @@ -103,6 +103,9 @@ public: void setDirection(const Vec3& direction); const Vec3& getDirection() const; + void setCastShadows(const bool castShadows); + bool getCastShadows() const; + void setOrientation(const Quat& orientation); const glm::quat& getOrientation() const { return _transform.getRotation(); } @@ -191,6 +194,8 @@ protected: void updateLightRadius(); + bool _castShadows{ false }; + }; typedef std::shared_ptr< Light > LightPointer; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 5c202fa70c..a83924ee58 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::MaterialEntities); + return static_cast(EntityVersion::ShadowControl); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::RemovedJurisdictions); case PacketType::AvatarIdentity: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index e9fe232335..98a9087d37 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -230,7 +230,8 @@ enum class EntityVersion : PacketVersion { ZoneLightInheritModes = 82, ZoneStageRemoved, SoftEntities, - MaterialEntities + MaterialEntities, + ShadowControl }; enum class EntityScriptCallMethodVersion : PacketVersion { diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 6806b41647..fdb57dace7 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -214,6 +214,7 @@ void CauterizedModel::updateRenderItems() { bool isWireframe = self->isWireframe(); bool isVisible = self->isVisible(); + bool canCastShadow = self->canCastShadow(); bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInHUD = self->isLayeredInHUD(); bool enableCauterization = self->getEnableCauterization(); @@ -231,7 +232,7 @@ void CauterizedModel::updateRenderItems() { bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning(); transaction.updateItem(itemID, [modelTransform, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey, - isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, enableCauterization](CauterizedMeshPartPayload& data) { + isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, canCastShadow, enableCauterization](CauterizedMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions, cauterizedMeshState.clusterDualQuaternions); @@ -273,7 +274,7 @@ void CauterizedModel::updateRenderItems() { data.updateTransformForCauterizedMesh(renderTransform); data.setEnableCauterization(enableCauterization); - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, render::ItemKey::TAG_BITS_ALL); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, render::ItemKey::TAG_BITS_ALL); data.setLayer(isLayeredInFront, isLayeredInHUD); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index e2c0073d2f..665e767c7c 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -537,15 +537,25 @@ void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, auto keyLight = lightAndShadow.first; - graphics::LightPointer keyAmbientLight; + graphics::LightPointer ambientLight; if (lightStage && lightStage->_currentFrame._ambientLights.size()) { - keyAmbientLight = lightStage->getLight(lightStage->_currentFrame._ambientLights.front()); + ambientLight = lightStage->getLight(lightStage->_currentFrame._ambientLights.front()); } - bool hasAmbientMap = (keyAmbientLight != nullptr); + bool hasAmbientMap = (ambientLight != nullptr); // Setup the global directional pass pipeline { - if (deferredLightingEffect->_shadowMapEnabled) { + // Check if keylight casts shadows + bool keyLightCastShadows { false }; + + if (lightStage && lightStage->_currentFrame._sunLights.size()) { + graphics::LightPointer keyLight = lightStage->getLight(lightStage->_currentFrame._sunLights.front()); + if (keyLight) { + keyLightCastShadows = keyLight->getCastShadows(); + } + } + + if (deferredLightingEffect->_shadowMapEnabled && keyLightCastShadows) { // If the keylight has an ambient Map then use the Skybox version of the pass // otherwise use the ambient sphere version diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index 1b776e6409..ce7ecacbbe 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -61,7 +61,7 @@ public: private: DeferredLightingEffect() = default; - bool _shadowMapEnabled{ false }; + bool _shadowMapEnabled{ true }; // note that this value is overwritten in the ::configure method bool _ambientOcclusionEnabled{ false }; graphics::MeshPointer _pointLightMesh; diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 2637d24d67..98ecc4c941 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -77,7 +77,7 @@ void MeshPartPayload::removeMaterial(graphics::MaterialPointer material) { _drawMaterials.remove(material); } -void MeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled) { +void MeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { ItemKey::Builder builder; builder.withTypeShape(); @@ -91,6 +91,10 @@ void MeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits, builder.withLayered(); } + if (canCastShadow) { + builder.withShadowCaster(); + } + if (isGroupCulled) { builder.withSubMetaCulled(); } @@ -328,7 +332,8 @@ void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& render _worldBound.transform(boundTransform); } -void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled) { +// Note that this method is called for models but not for shapes +void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { ItemKey::Builder builder; builder.withTypeShape(); @@ -342,6 +347,10 @@ void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tag builder.withLayered(); } + if (canCastShadow) { + builder.withShadowCaster(); + } + if (isGroupCulled) { builder.withSubMetaCulled(); } diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 3ad222d90c..087550345d 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -32,7 +32,7 @@ public: typedef render::Payload Payload; typedef Payload::DataPointer Pointer; - virtual void updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled = false); + virtual void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false); virtual void updateMeshPart(const std::shared_ptr& drawMesh, int partIndex); @@ -92,7 +92,7 @@ public: void notifyLocationChanged() override; - void updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled = false) override; + void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override; // matrix palette skinning void updateClusterBuffer(const std::vector& clusterMatrices); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 12d6659849..593780709a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -104,6 +104,7 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) : _snappedToRegistrationPoint(false), _url(HTTP_INVALID_COM), _isVisible(true), + _canCastShadow(false), _blendNumber(0), _appliedBlendNumber(0), _isWireframe(false) @@ -270,6 +271,7 @@ void Model::updateRenderItems() { bool isWireframe = self->isWireframe(); bool isVisible = self->isVisible(); + bool canCastShadow = self->canCastShadow(); uint8_t viewTagBits = self->getViewTagBits(); bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInHUD = self->isLayeredInHUD(); @@ -288,7 +290,7 @@ void Model::updateRenderItems() { transaction.updateItem(itemID, [modelTransform, meshState, useDualQuaternionSkinning, invalidatePayloadShapeKey, isWireframe, isVisible, - viewTagBits, isLayeredInFront, + canCastShadow, viewTagBits, isLayeredInFront, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions); @@ -313,7 +315,7 @@ void Model::updateRenderItems() { } data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); @@ -773,46 +775,66 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, bool isLayeredInFront = _isLayeredInFront; bool isLayeredInHUD = _isLayeredInHUD; - + bool canCastShadow = _canCastShadow; render::Transaction transaction; foreach (auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); }); } foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); }); } scene->enqueueTransaction(transaction); } } +void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) { + if (_canCastShadow != canCastShadow) { + _canCastShadow = canCastShadow; + + bool isVisible = _isVisible; + bool isLayeredInFront = _isLayeredInFront; + bool isLayeredInHUD = _isLayeredInHUD; + + render::Transaction transaction; + foreach (auto item, _modelMeshRenderItemsMap.keys()) { + transaction.updateItem(item, + [isVisible, viewTagBits, canCastShadow, isLayeredInFront, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { + data.updateKey(isVisible, viewTagBits, canCastShadow, isLayeredInFront || isLayeredInHUD, isGroupCulled); + }); + } + + scene->enqueueTransaction(transaction); + } +} void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene) { if (_isLayeredInFront != isLayeredInFront) { _isLayeredInFront = isLayeredInFront; bool isVisible = _isVisible; + bool canCastShadow = _canCastShadow; uint8_t viewTagBits = _viewTagBits; bool isLayeredInHUD = _isLayeredInHUD; bool isGroupCulled = _isGroupCulled; render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); }); } foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); }); } @@ -825,22 +847,23 @@ void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& sce _isLayeredInHUD = isLayeredInHUD; bool isVisible = _isVisible; + bool canCastShadow = _canCastShadow; uint8_t viewTagBits = _viewTagBits; bool isLayeredInFront = _isLayeredInFront; bool isGroupCulled = _isGroupCulled; render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); }); } foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, + transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); }); } @@ -1650,15 +1673,16 @@ void Model::addMaterial(graphics::MaterialLayer material, const std::string& par uint8_t viewTagBits = getViewTagBits(); bool layeredInFront = isLayeredInFront(); bool layeredInHUD = isLayeredInHUD(); + bool canCastShadow = _canCastShadow; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; - transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, + transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, canCastShadow, invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.addMaterial(material); // if the material changed, we might need to update our item key or shape key - data.updateKey(visible, layeredInFront || layeredInHUD, viewTagBits); + data.updateKey(visible, layeredInFront || layeredInHUD, canCastShadow, viewTagBits); data.setShapeKey(invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning); }); } @@ -1676,15 +1700,16 @@ void Model::removeMaterial(graphics::MaterialPointer material, const std::string uint8_t viewTagBits = getViewTagBits(); bool layeredInFront = isLayeredInFront(); bool layeredInHUD = isLayeredInHUD(); + bool canCastShadow = _canCastShadow; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; - transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, + transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, canCastShadow, invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.removeMaterial(material); // if the material changed, we might need to update our item key or shape key - data.updateKey(visible, layeredInFront || layeredInHUD, viewTagBits); + data.updateKey(visible, layeredInFront || layeredInHUD, canCastShadow, viewTagBits); data.setShapeKey(invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning); }); } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 9c98ac2b8b..2b14a7c055 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -88,6 +88,10 @@ public: // new Scene/Engine rendering support void setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled); + + bool canCastShadow() const { return _canCastShadow; } + void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled); + void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene); void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene); bool needsFixupInScene() const; @@ -403,6 +407,8 @@ protected: bool _isVisible; uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL }; + bool _canCastShadow; + gpu::Buffers _blendedVertexBuffers; QVector > > _dilatedTextures; diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index e8963c2e4e..ce4bf01dcf 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -218,7 +218,10 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende const auto setupOutput = task.addJob("ShadowSetup"); const auto queryResolution = setupOutput.getN(2); // Fetch and cull the items from the scene - static const auto shadowCasterFilter = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(tagBits, tagMask); + + // Enable models to not cast shadows (otherwise, models will always cast shadows) + static const auto shadowCasterFilter = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(tagBits, tagMask).withShadowCaster(); + const auto fetchInput = FetchSpatialTree::Inputs(shadowCasterFilter, queryResolution).asVarying(); const auto shadowSelection = task.addJob("FetchShadowTree", fetchInput); const auto selectionInputs = FetchSpatialSelection::Inputs(shadowSelection, shadowCasterFilter).asVarying(); @@ -297,8 +300,14 @@ void RenderShadowSetup::setSlopeBias(int cascadeIndex, float value) { } void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, Outputs& output) { + // Abort all jobs if not casting shadows auto lightStage = renderContext->_scene->getStage(); assert(lightStage); + if (!lightStage->getCurrentKeyLight() || !lightStage->getCurrentKeyLight()->getCastShadows()) { + renderContext->taskFlow.abortTask(); + return; + } + // Cache old render args RenderArgs* args = renderContext->args; @@ -378,12 +387,13 @@ void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, O void RenderShadowCascadeSetup::run(const render::RenderContextPointer& renderContext, Outputs& output) { auto lightStage = renderContext->_scene->getStage(); assert(lightStage); + // Cache old render args RenderArgs* args = renderContext->args; const auto globalShadow = lightStage->getCurrentKeyShadow(); if (globalShadow && _cascadeIndexgetCascadeCount()) { - output.edit0() = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(_tagBits, _tagMask); + output.edit0() = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(_tagBits, _tagMask).withShadowCaster(); // Set the keylight render args auto& cascade = globalShadow->getCascade(_cascadeIndex); diff --git a/libraries/render-utils/src/RenderShadowTask.h b/libraries/render-utils/src/RenderShadowTask.h index 7f127a558c..98b70c0c9f 100644 --- a/libraries/render-utils/src/RenderShadowTask.h +++ b/libraries/render-utils/src/RenderShadowTask.h @@ -38,7 +38,7 @@ class RenderShadowTaskConfig : public render::Task::Config::Persistent { Q_OBJECT Q_PROPERTY(bool enabled MEMBER enabled NOTIFY dirty) public: - RenderShadowTaskConfig() : render::Task::Config::Persistent(QStringList() << "Render" << "Engine" << "Shadows", false) {} + RenderShadowTaskConfig() : render::Task::Config::Persistent(QStringList() << "Render" << "Engine" << "Shadows", true) {} signals: void dirty(); diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index c53a2fa5bd..d6710238fb 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -42,25 +42,28 @@ -
+
+ +
@@ -293,7 +296,6 @@
-
BehaviorM @@ -365,8 +367,6 @@
- -
LightM @@ -400,7 +400,6 @@
-
ModelM @@ -484,7 +483,6 @@
-
ZoneM @@ -532,6 +530,10 @@
+
+ + +
Skybox @@ -676,7 +678,7 @@ min="-1000" max="50000" step="10"> -
+
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 2b29fbf041..4db9bd00c6 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -616,6 +616,8 @@ function loaded() { var elShape = document.getElementById("property-shape"); + var elCanCastShadow = document.getElementById("property-can-cast-shadow"); + var elLightSpotLight = document.getElementById("property-light-spot-light"); var elLightColor = document.getElementById("property-light-color"); var elLightColorRed = document.getElementById("property-light-color-red"); @@ -687,6 +689,8 @@ function loaded() { var elZoneKeyLightDirectionX = document.getElementById("property-zone-key-light-direction-x"); var elZoneKeyLightDirectionY = document.getElementById("property-zone-key-light-direction-y"); + var elZoneKeyLightCastShadows = document.getElementById("property-zone-key-light-cast-shadows"); + // Skybox var elZoneSkyboxModeInherit = document.getElementById("property-zone-skybox-mode-inherit"); var elZoneSkyboxModeDisabled = document.getElementById("property-zone-skybox-mode-disabled"); @@ -844,7 +848,6 @@ function loaded() { elLocked.checked = properties.locked; - elName.value = properties.name; elVisible.checked = properties.visible; @@ -1011,6 +1014,12 @@ function loaded() { properties.color.green + "," + properties.color.blue + ")"; } + if (properties.type === "Model" || + properties.type === "Shape" || properties.type === "Box" || properties.type === "Sphere") { + + elCanCastShadow.checked = properties.canCastShadow; + } + if (properties.type === "Model") { elModelURL.value = properties.modelURL; elShapeType.value = properties.shapeType; @@ -1060,7 +1069,6 @@ function loaded() { elLightFalloffRadius.value = properties.falloffRadius.toFixed(1); elLightExponent.value = properties.exponent.toFixed(2); elLightCutoff.value = properties.cutoff.toFixed(2); - } else if (properties.type === "Zone") { // Key light elZoneKeyLightModeInherit.checked = (properties.keyLightMode === 'inherit'); @@ -1076,6 +1084,8 @@ function loaded() { elZoneKeyLightDirectionX.value = properties.keyLight.direction.x.toFixed(2); elZoneKeyLightDirectionY.value = properties.keyLight.direction.y.toFixed(2); + elZoneKeyLightCastShadows.checked = properties.keyLight.castShadows; + // Skybox elZoneSkyboxModeInherit.checked = (properties.skyboxMode === 'inherit'); elZoneSkyboxModeDisabled.checked = (properties.skyboxMode === 'disabled'); @@ -1139,13 +1149,15 @@ function loaded() { // Show/hide sections as required showElements(document.getElementsByClassName('skybox-section'), elZoneSkyboxModeEnabled.checked); + showElements(document.getElementsByClassName('keylight-section'), elZoneKeyLightModeEnabled.checked); + showElements(document.getElementsByClassName('ambient-section'), elZoneAmbientLightModeEnabled.checked); + showElements(document.getElementsByClassName('haze-section'), elZoneHazeModeEnabled.checked); - } else if (properties.type === "PolyVox") { elVoxelVolumeSizeX.value = properties.voxelVolumeSize.x.toFixed(2); elVoxelVolumeSizeY.value = properties.voxelVolumeSize.y.toFixed(2); @@ -1176,6 +1188,15 @@ function loaded() { elMaterialMappingRot.value = properties.materialMappingRot.toFixed(2); } + // Only these types can cast a shadow + if (properties.type === "Model" || + properties.type === "Shape" || properties.type === "Box" || properties.type === "Sphere") { + + showElements(document.getElementsByClassName('can-cast-shadow-section'), true); + } else { + showElements(document.getElementsByClassName('can-cast-shadow-section'), false); + } + if (properties.locked) { disableProperties(); elLocked.removeAttribute('disabled'); @@ -1432,6 +1453,8 @@ function loaded() { elShape.addEventListener('change', createEmitTextPropertyUpdateFunction('shape')); + elCanCastShadow.addEventListener('change', createEmitCheckedPropertyUpdateFunction('canCastShadow')); + elImageURL.addEventListener('change', createImageURLUpdateFunction('textures')); elWebSourceURL.addEventListener('change', createEmitTextPropertyUpdateFunction('sourceUrl')); @@ -1590,6 +1613,9 @@ function loaded() { elZoneKeyLightDirectionX.addEventListener('change', zoneKeyLightDirectionChangeFunction); elZoneKeyLightDirectionY.addEventListener('change', zoneKeyLightDirectionChangeFunction); + elZoneKeyLightCastShadows.addEventListener('change', + createEmitGroupCheckedPropertyUpdateFunction('keyLight', 'castShadows')); + // Skybox var skyboxModeChanged = createZoneComponentModeChangedFunction('skyboxMode', elZoneSkyboxModeInherit, elZoneSkyboxModeDisabled, elZoneSkyboxModeEnabled); From b50044fb2b667a8a2d98ca7b3cee864870894c0a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 2 Mar 2018 13:15:27 +1300 Subject: [PATCH 151/267] Remove deprecated Window.openFileChanged() signal from API --- interface/src/scripting/WindowScriptingInterface.cpp | 1 - interface/src/scripting/WindowScriptingInterface.h | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 12b20566ed..e0a008b25e 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -259,7 +259,6 @@ void WindowScriptingInterface::browseAsync(const QString& title, const QString& setPreviousBrowseLocation(QFileInfo(result).absolutePath()); } emit browseChanged(result); - emit openFileChanged(result); // Deprecated signal; to be removed in due course. }); } diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 67fdea0bc5..5a30f44856 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -179,7 +179,6 @@ public slots: * Prompt the user to choose a file. Displays a non-modal dialog that navigates the directory tree. A * {@link Window.browseChanged|browseChanged} signal is emitted when a file is chosen; no signal is emitted if the user * cancels the dialog. - * @deprecated A deprecated {@link Window.openFileChanged|openFileChanged} signal is also emitted when a file is chosen. * @function Window.browseAsync * @param {string} title="" - The title to display at the top of the dialog. * @param {string} directory="" - The initial directory to start browsing at. @@ -660,15 +659,6 @@ signals: */ void browseChanged(QString filename); - /**jsdoc - * Triggered when the user chooses a file in a {@link Window.browseAsync|browseAsync} dialog. - * @function Window.openFileChanged - * @deprecated This signal is being replaced with {@link Window.browseChanged|browseChanged} and will be removed. - * @param {string} filename - The path and name of the file the user chose in the dialog. - * @returns {Signal} - */ - void openFileChanged(QString filename); - /**jsdoc * Triggered when the user OKs a {@link Window.promptAsync|promptAsync} dialog. * @function Window.promptTextChanged From 70bdedc4b398293d30168666517f34904573cef3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Mar 2018 16:37:19 -0800 Subject: [PATCH 152/267] Fix Edit -> Export Entities exporting gzipped json We were not respecting the doGzip flag. --- libraries/octree/src/Octree.cpp | 21 +++++++++++--------- libraries/octree/src/Octree.h | 4 ++-- libraries/octree/src/OctreePersistThread.cpp | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 334299185e..7e0c82506b 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1778,7 +1778,7 @@ bool Octree::writeToFile(const char* fileName, const OctreeElementPointer& eleme return success; } -bool Octree::toJSON(QJsonDocument* doc, const OctreeElementPointer& element) { +bool Octree::toJSONDocument(QJsonDocument* doc, const OctreeElementPointer& element) { QVariantMap entityDescription; OctreeElementPointer top; @@ -1804,18 +1804,22 @@ bool Octree::toJSON(QJsonDocument* doc, const OctreeElementPointer& element) { return true; } -bool Octree::toGzippedJSON(QByteArray* data, const OctreeElementPointer& element) { +bool Octree::toJSON(QByteArray* data, const OctreeElementPointer& element, bool doGzip) { QJsonDocument doc; - if (!toJSON(&doc, element)) { + if (!toJSONDocument(&doc, element)) { qCritical("Failed to convert Entities to QVariantMap while converting to json."); return false; } - QByteArray jsonData = doc.toJson(); + if (doGzip) { + QByteArray jsonData = doc.toJson(); - if (!gzip(jsonData, *data, -1)) { - qCritical("Unable to gzip data while saving to json."); - return false; + if (!gzip(jsonData, *data, -1)) { + qCritical("Unable to gzip data while saving to json."); + return false; + } + } else { + *data = doc.toJson(); } return true; @@ -1825,7 +1829,7 @@ bool Octree::writeToJSONFile(const char* fileName, const OctreeElementPointer& e qCDebug(octree, "Saving JSON SVO to file %s...", fileName); QByteArray jsonDataForFile; - if (!toGzippedJSON(&jsonDataForFile)) { + if (!toJSON(&jsonDataForFile, element, doGzip)) { return false; } @@ -1837,7 +1841,6 @@ bool Octree::writeToJSONFile(const char* fileName, const OctreeElementPointer& e qCritical("Could not write to JSON description of entities."); } - return success; } diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index cb281593b1..c4c4508138 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -284,8 +284,8 @@ public: void loadOctreeFile(const char* fileName); // Octree exporters - bool toJSON(QJsonDocument* doc, const OctreeElementPointer& element = nullptr); - bool toGzippedJSON(QByteArray* data, const OctreeElementPointer& element = nullptr); + bool toJSONDocument(QJsonDocument* doc, const OctreeElementPointer& element = nullptr); + bool toJSON(QByteArray* data, const OctreeElementPointer& element = nullptr, bool doGzip = false); bool writeToFile(const char* filename, const OctreeElementPointer& element = nullptr, QString persistAsFileType = "json.gz"); bool writeToJSONFile(const char* filename, const OctreeElementPointer& element = nullptr, bool doGzip = false); virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 23d6b6c2aa..7c5b7eb45c 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -341,7 +341,7 @@ void OctreePersistThread::sendLatestEntityDataToDS() { const DomainHandler& domainHandler = nodeList->getDomainHandler(); QByteArray data; - if (_tree->toGzippedJSON(&data)) { + if (_tree->toJSON(&data, nullptr, true)) { auto message = NLPacketList::create(PacketType::OctreeDataPersist, QByteArray(), true, true); message->write(data); nodeList->sendPacketList(std::move(message), domainHandler.getSockAddr()); From 7107e1539ffa735b7fc90e7b09c694da0f4d3d70 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 2 Mar 2018 13:45:31 +1300 Subject: [PATCH 153/267] Remove deprecated Window.location.protocolVersion() function from API --- libraries/networking/src/AddressManager.cpp | 4 ---- libraries/networking/src/AddressManager.h | 9 --------- 2 files changed, 13 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 9296f61ad3..4965a5baaa 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -46,10 +46,6 @@ AddressManager::AddressManager() : } -QString AddressManager::protocolVersion() { - return protocolVersionsSignatureBase64(); -} - bool AddressManager::isConnected() { return DependencyManager::get()->getDomainHandler().isConnected(); } diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 6c9f06d2dd..1b550df693 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -71,15 +71,6 @@ class AddressManager : public QObject, public Dependency { Q_PROPERTY(QString domainID READ getDomainID) Q_PROPERTY(QString domainId READ getDomainID) public: - - /**jsdoc - * Get Interface's protocol version. - * @function location.protocolVersion - * @returns {string} A string uniquely identifying the version of the metaverse protocol that Interface is using. - * @deprecated This function is deprecated and will be removed. Use {@link Window.protocolSignature} instead. - */ - Q_INVOKABLE QString protocolVersion(); - using PositionGetter = std::function; using OrientationGetter = std::function; From a66125fbb781af8faf8fa1cef32628974291e5b0 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 1 Mar 2018 16:56:51 -0800 Subject: [PATCH 154/267] scriptablematerial -> scriptablemateriallayer --- .../src/graphics-scripting/Forward.h | 17 ++++-- .../GraphicsScriptingInterface.cpp | 26 ++++++--- .../graphics-scripting/ScriptableModel.cpp | 57 ++++++++++--------- .../src/graphics-scripting/ScriptableModel.h | 5 +- libraries/graphics/src/graphics/Material.h | 4 +- 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/libraries/graphics-scripting/src/graphics-scripting/Forward.h b/libraries/graphics-scripting/src/graphics-scripting/Forward.h index 650e4104e7..3d710b41b4 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/Forward.h +++ b/libraries/graphics-scripting/src/graphics-scripting/Forward.h @@ -39,7 +39,7 @@ namespace scriptable { class ScriptableMaterial { public: ScriptableMaterial() {} - ScriptableMaterial(const graphics::MaterialLayer& materialLayer); + ScriptableMaterial(const graphics::MaterialPointer& material); ScriptableMaterial(const ScriptableMaterial& material) { *this = material; } ScriptableMaterial& operator=(const ScriptableMaterial& material); @@ -64,9 +64,18 @@ namespace scriptable { QString occlusionMap; QString lightmapMap; QString scatteringMap; + }; + class ScriptableMaterialLayer { + public: + ScriptableMaterialLayer() {} + ScriptableMaterialLayer(const graphics::MaterialLayer& materialLayer) : material(materialLayer.material), priority(materialLayer.priority) {} + ScriptableMaterialLayer(const ScriptableMaterialLayer& materialLayer) { *this = materialLayer; } + ScriptableMaterialLayer& operator=(const ScriptableMaterialLayer& materialLayer); + + ScriptableMaterial material; quint16 priority; }; - typedef QHash> MultiMaterialMap; + typedef QHash> MultiMaterialMap; class ScriptableMeshBase : public QObject { Q_OBJECT @@ -92,7 +101,7 @@ namespace scriptable { WeakModelProviderPointer provider; QUuid objectID; // spatially nestable ID QVector meshes; - MultiMaterialMap materials; + MultiMaterialMap materialLayers; QVector materialNames; ScriptableModelBase(QObject* parent = nullptr) : QObject(parent) {} @@ -102,7 +111,7 @@ namespace scriptable { void append(const ScriptableMeshBase& mesh); void append(scriptable::WeakMeshPointer mesh); - void appendMaterial(const graphics::MaterialLayer& material, int shapeID, std::string materialName); + void appendMaterial(const graphics::MaterialLayer& materialLayer, int shapeID, std::string materialName); void appendMaterials(const std::unordered_map& materialsToAppend); void appendMaterialNames(const std::vector& names); // TODO: in future containers for these could go here diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp index ff0170f07d..20b54b02c9 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp @@ -298,7 +298,8 @@ namespace { qRegisterMetaType(), qRegisterMetaType(), qRegisterMetaType(), - qRegisterMetaType>(), + qRegisterMetaType(), + qRegisterMetaType>(), qRegisterMetaType(), qRegisterMetaType(), }; @@ -338,11 +339,11 @@ namespace scriptable { ); } - QScriptValue qVectorScriptableMaterialToScriptValue(QScriptEngine* engine, const QVector& vector) { + QScriptValue qVectorScriptableMaterialLayerToScriptValue(QScriptEngine* engine, const QVector& vector) { return qScriptValueFromSequence(engine, vector); } - void qVectorScriptableMaterialFromScriptValue(const QScriptValue& array, QVector& result) { + void qVectorScriptableMaterialLayerFromScriptValue(const QScriptValue& array, QVector& result) { qScriptValueToSequence(array, result); } @@ -369,7 +370,6 @@ namespace scriptable { obj.setProperty("occlusionMap", material.occlusionMap); obj.setProperty("lightmapMap", material.lightmapMap); obj.setProperty("scatteringMap", material.scatteringMap); - obj.setProperty("priority", material.priority); return obj; } @@ -377,10 +377,21 @@ namespace scriptable { // No need to convert from QScriptValue to ScriptableMaterial } + QScriptValue scriptableMaterialLayerToScriptValue(QScriptEngine* engine, const scriptable::ScriptableMaterialLayer &materialLayer) { + QScriptValue obj = engine->newObject(); + obj.setProperty("material", scriptableMaterialToScriptValue(engine, materialLayer.material)); + obj.setProperty("priority", materialLayer.priority); + return obj; + } + + void scriptableMaterialLayerFromScriptValue(const QScriptValue &object, scriptable::ScriptableMaterialLayer& materialLayer) { + // No need to convert from QScriptValue to ScriptableMaterialLayer + } + QScriptValue multiMaterialMapToScriptValue(QScriptEngine* engine, const scriptable::MultiMaterialMap& map) { QScriptValue obj = engine->newObject(); for (auto key : map.keys()) { - obj.setProperty(key, qVectorScriptableMaterialToScriptValue(engine, map[key])); + obj.setProperty(key, qVectorScriptableMaterialLayerToScriptValue(engine, map[key])); } return obj; } @@ -405,7 +416,7 @@ namespace scriptable { void GraphicsScriptingInterface::registerMetaTypes(QScriptEngine* engine) { qScriptRegisterSequenceMetaType>(engine); - qScriptRegisterSequenceMetaType>(engine); + qScriptRegisterSequenceMetaType>(engine); scriptable::registerQPointerMetaType(engine); scriptable::registerQPointerMetaType(engine); @@ -417,7 +428,8 @@ void GraphicsScriptingInterface::registerMetaTypes(QScriptEngine* engine) { scriptable::registerDebugEnum(engine, gpu::DIMENSIONS); qScriptRegisterMetaType(engine, scriptable::scriptableMaterialToScriptValue, scriptable::scriptableMaterialFromScriptValue); - qScriptRegisterMetaType(engine, scriptable::qVectorScriptableMaterialToScriptValue, scriptable::qVectorScriptableMaterialFromScriptValue); + qScriptRegisterMetaType(engine, scriptable::scriptableMaterialLayerToScriptValue, scriptable::scriptableMaterialLayerFromScriptValue); + qScriptRegisterMetaType(engine, scriptable::qVectorScriptableMaterialLayerToScriptValue, scriptable::qVectorScriptableMaterialLayerFromScriptValue); qScriptRegisterMetaType(engine, scriptable::multiMaterialMapToScriptValue, scriptable::multiMaterialMapFromScriptValue); Q_UNUSED(metaTypeIds); diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp index a713d42012..c65764a225 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.cpp @@ -42,29 +42,27 @@ scriptable::ScriptableMaterial& scriptable::ScriptableMaterial::operator=(const occlusionMap = material.occlusionMap; lightmapMap = material.lightmapMap; scatteringMap = material.scatteringMap; - priority = material.priority; return *this; } -scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer& materialLayer) : - name(materialLayer.material->getName().c_str()), - model(materialLayer.material->getModel().c_str()), - opacity(materialLayer.material->getOpacity()), - roughness(materialLayer.material->getRoughness()), - metallic(materialLayer.material->getMetallic()), - scattering(materialLayer.material->getScattering()), - unlit(materialLayer.material->isUnlit()), - emissive(materialLayer.material->getEmissive()), - albedo(materialLayer.material->getAlbedo()), - priority(materialLayer.priority) +scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialPointer& material) : + name(material->getName().c_str()), + model(material->getModel().c_str()), + opacity(material->getOpacity()), + roughness(material->getRoughness()), + metallic(material->getMetallic()), + scattering(material->getScattering()), + unlit(material->isUnlit()), + emissive(material->getEmissive()), + albedo(material->getAlbedo()) { - auto map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::EMISSIVE_MAP); + auto map = material->getTextureMap(graphics::Material::MapChannel::EMISSIVE_MAP); if (map && map->getTextureSource()) { emissiveMap = map->getTextureSource()->getUrl().toString(); } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::ALBEDO_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::ALBEDO_MAP); if (map && map->getTextureSource()) { albedoMap = map->getTextureSource()->getUrl().toString(); if (map->useAlphaChannel()) { @@ -72,7 +70,7 @@ scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer } } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::METALLIC_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::METALLIC_MAP); if (map && map->getTextureSource()) { if (map->getTextureSource()->getType() == image::TextureUsage::Type::METALLIC_TEXTURE) { metallicMap = map->getTextureSource()->getUrl().toString(); @@ -81,7 +79,7 @@ scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer } } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::ROUGHNESS_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::ROUGHNESS_MAP); if (map && map->getTextureSource()) { if (map->getTextureSource()->getType() == image::TextureUsage::Type::ROUGHNESS_TEXTURE) { roughnessMap = map->getTextureSource()->getUrl().toString(); @@ -90,7 +88,7 @@ scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer } } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::NORMAL_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::NORMAL_MAP); if (map && map->getTextureSource()) { if (map->getTextureSource()->getType() == image::TextureUsage::Type::NORMAL_TEXTURE) { normalMap = map->getTextureSource()->getUrl().toString(); @@ -99,29 +97,36 @@ scriptable::ScriptableMaterial::ScriptableMaterial(const graphics::MaterialLayer } } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::OCCLUSION_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::OCCLUSION_MAP); if (map && map->getTextureSource()) { occlusionMap = map->getTextureSource()->getUrl().toString(); } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::LIGHTMAP_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::LIGHTMAP_MAP); if (map && map->getTextureSource()) { lightmapMap = map->getTextureSource()->getUrl().toString(); } - map = materialLayer.material->getTextureMap(graphics::Material::MapChannel::SCATTERING_MAP); + map = material->getTextureMap(graphics::Material::MapChannel::SCATTERING_MAP); if (map && map->getTextureSource()) { scatteringMap = map->getTextureSource()->getUrl().toString(); } } +scriptable::ScriptableMaterialLayer& scriptable::ScriptableMaterialLayer::operator=(const scriptable::ScriptableMaterialLayer& materialLayer) { + material = materialLayer.material; + priority = materialLayer.priority; + + return *this; +} + scriptable::ScriptableModelBase& scriptable::ScriptableModelBase::operator=(const scriptable::ScriptableModelBase& other) { provider = other.provider; objectID = other.objectID; for (const auto& mesh : other.meshes) { append(mesh); } - materials = other.materials; + materialLayers = other.materialLayers; materialNames = other.materialNames; return *this; } @@ -135,7 +140,7 @@ scriptable::ScriptableModelBase::~ScriptableModelBase() { m.strongMesh.reset(); } meshes.clear(); - materials.clear(); + materialLayers.clear(); materialNames.clear(); } @@ -150,16 +155,16 @@ void scriptable::ScriptableModelBase::append(const ScriptableMeshBase& mesh) { meshes << mesh; } -void scriptable::ScriptableModelBase::appendMaterial(const graphics::MaterialLayer& material, int shapeID, std::string materialName) { - materials[QString::number(shapeID)].push_back(ScriptableMaterial(material)); - materials["mat::" + QString::fromStdString(materialName)].push_back(ScriptableMaterial(material)); +void scriptable::ScriptableModelBase::appendMaterial(const graphics::MaterialLayer& materialLayer, int shapeID, std::string materialName) { + materialLayers[QString::number(shapeID)].push_back(ScriptableMaterialLayer(materialLayer)); + materialLayers["mat::" + QString::fromStdString(materialName)].push_back(ScriptableMaterialLayer(materialLayer)); } void scriptable::ScriptableModelBase::appendMaterials(const std::unordered_map& materialsToAppend) { auto materialsToAppendCopy = materialsToAppend; for (auto& multiMaterial : materialsToAppendCopy) { while (!multiMaterial.second.empty()) { - materials[QString(multiMaterial.first.c_str())].push_back(ScriptableMaterial(multiMaterial.second.top())); + materialLayers[QString(multiMaterial.first.c_str())].push_back(ScriptableMaterialLayer(multiMaterial.second.top())); multiMaterial.second.pop(); } } diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h index b1fe29447f..a1278132ca 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h @@ -28,7 +28,7 @@ namespace scriptable { Q_PROPERTY(QUuid objectID MEMBER objectID CONSTANT) Q_PROPERTY(glm::uint32 numMeshes READ getNumMeshes) Q_PROPERTY(ScriptableMeshes meshes READ getMeshes) - Q_PROPERTY(scriptable::MultiMaterialMap materials READ getMaterials) + Q_PROPERTY(scriptable::MultiMaterialMap materialLayers READ getMaterialLayers) Q_PROPERTY(QVector materialNames READ getMaterialNames) public: @@ -43,7 +43,7 @@ namespace scriptable { ScriptableMeshes getMeshes(); const ScriptableMeshes getConstMeshes() const; - scriptable::MultiMaterialMap getMaterials() { return materials; } + scriptable::MultiMaterialMap getMaterialLayers() { return materialLayers; } QVector getMaterialNames() { return materialNames; } public slots: @@ -60,4 +60,5 @@ namespace scriptable { Q_DECLARE_METATYPE(scriptable::ScriptableModelPointer) Q_DECLARE_METATYPE(QVector) Q_DECLARE_METATYPE(scriptable::ScriptableMaterial) +Q_DECLARE_METATYPE(scriptable::ScriptableMaterialLayer) Q_DECLARE_METATYPE(scriptable::MultiMaterialMap) diff --git a/libraries/graphics/src/graphics/Material.h b/libraries/graphics/src/graphics/Material.h index f34f68c04a..f9e83a0324 100755 --- a/libraries/graphics/src/graphics/Material.h +++ b/libraries/graphics/src/graphics/Material.h @@ -356,9 +356,9 @@ public: void setTextureTransforms(const Transform& transform); - const std::string& getName() { return _name; } + const std::string& getName() const { return _name; } - const std::string& getModel() { return _model; } + const std::string& getModel() const { return _model; } void setModel(const std::string& model) { _model = model; } protected: From 2067c959311921a5ea1bb6017e4b8c929119e797 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 28 Feb 2018 17:50:55 -0800 Subject: [PATCH 155/267] Fix NVTT for mac --- cmake/externals/nvtt/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/nvtt/CMakeLists.txt b/cmake/externals/nvtt/CMakeLists.txt index 00722bd1e0..3076217c33 100644 --- a/cmake/externals/nvtt/CMakeLists.txt +++ b/cmake/externals/nvtt/CMakeLists.txt @@ -29,8 +29,8 @@ else () ExternalProject_Add( ${EXTERNAL_NAME} - URL http://hifi-public.s3.amazonaws.com/dependencies/nvidia-texture-tools-2.1.0.hifi.zip - URL_MD5 5794b950f8b265a9a41b2839b3bf7ebb + URL http://hifi-public.s3.amazonaws.com/dependencies/nvidia-texture-tools-2.1.0.hifi-83462e4.zip + URL_MD5 602776e08515b54bfa1b8dc455003f0f CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DNVTT_SHARED=1 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_POSITION_INDEPENDENT_CODE=ON LOG_DOWNLOAD 1 LOG_CONFIGURE 1 From 5bb4023fb5d62869923a2a0f9a1b47383d05c3df Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 1 Mar 2018 19:23:17 -0800 Subject: [PATCH 156/267] First version - can download fixed URL to fixed location. --- tools/auto-tester/CMakeLists.txt | 2 +- tools/auto-tester/src/Test.cpp | 63 +++++++++++++------------ tools/auto-tester/src/Test.h | 7 ++- tools/auto-tester/src/main.cpp | 6 ++- tools/auto-tester/src/ui/AutoTester.cpp | 35 ++++++++++---- tools/auto-tester/src/ui/AutoTester.h | 8 +++- 6 files changed, 76 insertions(+), 45 deletions(-) diff --git a/tools/auto-tester/CMakeLists.txt b/tools/auto-tester/CMakeLists.txt index a875f5676a..a2589bb760 100644 --- a/tools/auto-tester/CMakeLists.txt +++ b/tools/auto-tester/CMakeLists.txt @@ -5,7 +5,7 @@ project(${TARGET_NAME}) SET (CMAKE_AUTOUIC ON) SET (CMAKE_AUTOMOC ON) -setup_hifi_project (Core Widgets) +setup_hifi_project (Core Widgets Network) link_hifi_libraries () # FIX: Qt was built with -reduce-relocations diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 357fc7b296..458ce0838b 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -16,8 +16,13 @@ #include #include +#include "ui/AutoTester.h" +extern AutoTester* autoTester; + Test::Test() { - expectedImageFilenameFormat = QRegularExpression("ExpectedImage_\\d+.jpg"); + QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + EXPECTED_IMAGE_TYPE); + + expectedImageFilenameFormat = QRegularExpression(regex); mismatchWindow.setModal(true); } @@ -178,49 +183,45 @@ void Test::appendTestResultsToFile(QString testResultsFolderPath, TestFailure te void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { // Get list of JPEG images in folder, sorted by name - QString pathToImageDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); - if (pathToImageDirectory == "") { + QString pathToTestResultsDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); + if (pathToTestResultsDirectory == "") { return; } // Leave if test results folder could not be created - if (!createTestResultsFolderPathIfNeeded(pathToImageDirectory)) { + if (!createTestResultsFolderPathIfNeeded(pathToTestResultsDirectory)) { return; } - QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(pathToImageDirectory); - - // Separate images into two lists. The first is the expected images, the second is the test results + // Create two lists. The first is the test results, the second is the expected images // Images that are in the wrong format are ignored. + + QStringList sortedTestResultsFilenames = createListOfAllJPEGimagesInDirectory(pathToTestResultsDirectory); QStringList expectedImages; QStringList resultImages; - foreach(QString currentFilename, sortedImageFilenames) { - QString fullCurrentFilename = pathToImageDirectory + "/" + currentFilename; - if (isInExpectedImageFilenameFormat(currentFilename)) { - expectedImages << fullCurrentFilename; - } else if (isInSnapshotFilenameFormat(currentFilename)) { + foreach(QString currentFilename, sortedTestResultsFilenames) { + QString fullCurrentFilename = pathToTestResultsDirectory + "/" + currentFilename; + if (isInSnapshotFilenameFormat(currentFilename)) { resultImages << fullCurrentFilename; + + QString expectedImageDirectory = getExpectedImageDestinationDirectory(currentFilename); + + // extract the digits at the end of the filename (exluding the file extension) + QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); + + QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + EXPECTED_IMAGE_TYPE; + expectedImages << (expectedImageDirectory + "/" + expectedImageFilename); } } - // The number of images in each list should be identical - if (expectedImages.length() != resultImages.length()) { - messageBox.critical(0, - "Test failed", - "Found " + QString::number(resultImages.length()) + " images in directory" + - "\nExpected to find " + QString::number(expectedImages.length()) + " images" - ); + autoTester->downloadImage(QUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png")); + ////bool success = compareImageLists(expectedImages, resultImages, pathToImageDirectory, interactiveMode, progressBar); - exit(-1); - } - - bool success = compareImageLists(expectedImages, resultImages, pathToImageDirectory, interactiveMode, progressBar); - - if (success) { - messageBox.information(0, "Success", "All images are as expected"); - } else { - messageBox.information(0, "Failure", "One or more images are not as expected"); - } + ////if (success) { + //// messageBox.information(0, "Success", "All images are as expected"); + ////} else { + //// messageBox.information(0, "Failure", "One or more images are not as expected"); + ////} zipAndDeleteTestResultsFolder(); } @@ -407,7 +408,7 @@ void Test::createTest() { exit(-1); } QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".jpg"; - QString imageDestinationDirectory = getImageDestinationDirectory(currentFilename); + QString imageDestinationDirectory = getExpectedImageDestinationDirectory(currentFilename); QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; try { @@ -489,7 +490,7 @@ bool Test::isInSnapshotFilenameFormat(QString filename) { // D:/GitHub/hifi-tests/tests/content/entity/zone/create // This method assumes the filename is in the correct format // The final part of the filename is the image number. This is checked for sanity -QString Test::getImageDestinationDirectory(QString filename) { +QString Test::getExpectedImageDestinationDirectory(QString filename) { QString filenameWithoutExtension = filename.split(".")[0]; QStringList filenameParts = filenameWithoutExtension.split("_"); diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 55fb7229d1..7168a8ef69 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -46,7 +46,7 @@ public: bool isAValidDirectory(QString pathname); - QString getImageDestinationDirectory(QString filename); + QString getExpectedImageDestinationDirectory(QString filename); private: const QString TEST_FILENAME { "test.js" }; @@ -65,6 +65,11 @@ private: QString testResultsFolderPath { "" }; int index { 1 }; + + // Expected images are in the format ExpectedImage_dddd.jpg (d == decimal digit) + const int NUM_DIGITS { 5 }; + const QString EXPECTED_IMAGE_PREFIX { "ExpectedImage_" }; + const QString EXPECTED_IMAGE_TYPE { ".jpg" }; }; #endif // hifi_test_h \ No newline at end of file diff --git a/tools/auto-tester/src/main.cpp b/tools/auto-tester/src/main.cpp index 6e5e06b732..cd0ce22b13 100644 --- a/tools/auto-tester/src/main.cpp +++ b/tools/auto-tester/src/main.cpp @@ -10,11 +10,13 @@ #include #include "ui/AutoTester.h" +AutoTester* autoTester; + int main(int argc, char *argv[]) { QApplication application(argc, argv); - AutoTester autoTester; - autoTester.show(); + autoTester = new AutoTester(); + autoTester->show(); return application.exec(); } diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 18eef13e6e..8d0b0dc6a5 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -12,36 +12,53 @@ AutoTester::AutoTester(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); - ui.checkBoxInteractiveMode->setChecked(true); - ui.progressBar->setVisible(false); + + test = new Test(); } void AutoTester::on_evaluateTestsButton_clicked() { - test.evaluateTests(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); + ////QUrl imageUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png"); + ////downloader = new Downloader(imageUrl, this); + ////connect(downloader, SIGNAL (downloaded()), this, SLOT (saveImage())); + test->evaluateTests(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); } void AutoTester::on_evaluateTestsRecursivelyButton_clicked() { - test.evaluateTestsRecursively(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); + test->evaluateTestsRecursively(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); } void AutoTester::on_createRecursiveScriptButton_clicked() { - test.createRecursiveScript(); + test->createRecursiveScript(); } void AutoTester::on_createRecursiveScriptsRecursivelyButton_clicked() { - test.createRecursiveScriptsRecursively(); + test->createRecursiveScriptsRecursively(); } void AutoTester::on_createTestButton_clicked() { - test.createTest(); + test->createTest(); } void AutoTester::on_deleteOldSnapshotsButton_clicked() { - test.deleteOldSnapshots(); + test->deleteOldSnapshots(); } void AutoTester::on_closeButton_clicked() { exit(0); -} \ No newline at end of file +} + +void AutoTester::downloadImage(QUrl url) { + downloader = new Downloader(url, this); + + connect(downloader, SIGNAL (downloaded()), this, SLOT (saveImage())); +} + +void AutoTester::saveImage() { + QPixmap image; + image.loadFromData(downloader->downloadedData()); + int er = image.width(); + int df = image.height(); + image.save("D:/Dicom/lll.png"); +} diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index d25969589b..2f6a9bca1e 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -12,6 +12,8 @@ #include #include "ui_AutoTester.h" + +#include "../Downloader.h" #include "../Test.h" class AutoTester : public QMainWindow { @@ -19,6 +21,7 @@ class AutoTester : public QMainWindow { public: AutoTester(QWidget *parent = Q_NULLPTR); + void downloadImage(QUrl url); private slots: void on_evaluateTestsButton_clicked(); @@ -29,10 +32,13 @@ private slots: void on_deleteOldSnapshotsButton_clicked(); void on_closeButton_clicked(); + void saveImage(); + private: Ui::AutoTesterClass ui; - Test test; + Test* test; + Downloader* downloader; }; #endif // hifi_AutoTester_h \ No newline at end of file From 07267f9fe6bd8618b4cf1e6d20b98677693a1946 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 2 Mar 2018 09:13:07 -0800 Subject: [PATCH 157/267] WIP. --- tools/auto-tester/src/Downloader.cpp | 32 +++++++++++++++++ tools/auto-tester/src/Downloader.h | 48 +++++++++++++++++++++++++ tools/auto-tester/src/Test.cpp | 4 ++- tools/auto-tester/src/ui/AutoTester.cpp | 2 +- 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 tools/auto-tester/src/Downloader.cpp create mode 100644 tools/auto-tester/src/Downloader.h diff --git a/tools/auto-tester/src/Downloader.cpp b/tools/auto-tester/src/Downloader.cpp new file mode 100644 index 0000000000..030aa95a19 --- /dev/null +++ b/tools/auto-tester/src/Downloader.cpp @@ -0,0 +1,32 @@ +// +// Downloader.cpp +// +// Created by Nissim Hadar on 1 Mar 2018. +// Copyright 2013 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 "Downloader.h" + +Downloader::Downloader(QUrl imageUrl, QObject *parent) : QObject(parent) { + connect( + &_networkAccessManager, SIGNAL (finished(QNetworkReply*)), + this, SLOT (fileDownloaded(QNetworkReply*)) + ); + + QNetworkRequest request(imageUrl); + _networkAccessManager.get(request); +} + +void Downloader::fileDownloaded(QNetworkReply* reply) { + _downloadedData = reply->readAll(); + + //emit a signal + reply->deleteLater(); + emit downloaded(); +} + +QByteArray Downloader::downloadedData() const { + return _downloadedData; +} \ No newline at end of file diff --git a/tools/auto-tester/src/Downloader.h b/tools/auto-tester/src/Downloader.h new file mode 100644 index 0000000000..b0ad58fac5 --- /dev/null +++ b/tools/auto-tester/src/Downloader.h @@ -0,0 +1,48 @@ +// +// Downloader.h +// +// Created by Nissim Hadar on 1 Mar 2018. +// Copyright 2013 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_downloader_h +#define hifi_downloader_h + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class Downloader : public QObject { +Q_OBJECT +public: + explicit Downloader(QUrl imageUrl, QObject *parent = 0); + + QByteArray downloadedData() const; + +signals: + void downloaded(); + + private slots: + void fileDownloaded(QNetworkReply* pReply); + +private: + QNetworkAccessManager _networkAccessManager; + QByteArray _downloadedData; +}; + +#endif // hifi_downloader_h \ No newline at end of file diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 458ce0838b..ee792c0ea4 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -214,7 +214,9 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { } } - autoTester->downloadImage(QUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png")); + ////autoTester->downloadImage(QUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png")); + ////autoTester->downloadImage(QUrl("https://github.com/NissimHadar/hifi_tests/blob/addRecursionToAutotester/tests/content/entity/zone/ambientLightInheritance/ExpectedImage_00000.jpg?raw=true")); + autoTester->downloadImage(QUrl("https://hifi-content.s3.amazonaws.com/nissim/autoTester/resources/ColourBox.jpg")); ////bool success = compareImageLists(expectedImages, resultImages, pathToImageDirectory, interactiveMode, progressBar); ////if (success) { diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 8d0b0dc6a5..5a666aa5eb 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -60,5 +60,5 @@ void AutoTester::saveImage() { image.loadFromData(downloader->downloadedData()); int er = image.width(); int df = image.height(); - image.save("D:/Dicom/lll.png"); + image.save("D:/Dicom/lll.jpg"); } From a5a109e4f1d25a4ff33e7dbd11598eb8e1a63f2b Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 1 Mar 2018 16:40:24 -0800 Subject: [PATCH 158/267] Fix undefined request from JS --- scripts/modules/request.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/modules/request.js b/scripts/modules/request.js index c7bf98d815..3516554567 100644 --- a/scripts/modules/request.js +++ b/scripts/modules/request.js @@ -71,7 +71,7 @@ module.exports = { } } httpRequest.open(options.method, options.uri, true); - httpRequest.send(options.body); + httpRequest.send(options.body || null); } }; From 55d8cfd4c154154705576e5703fbaacf3b52c02d Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 2 Mar 2018 10:56:44 -0800 Subject: [PATCH 159/267] make sure dont make audio devices that don't use stereo use stereo --- interface/resources/qml/hifi/audio/Audio.qml | 8 ++++++-- libraries/audio-client/src/AudioClient.cpp | 8 ++++++-- libraries/audio-client/src/AudioClient.h | 2 +- libraries/audio/src/AbstractAudioInterface.h | 2 +- libraries/script-engine/src/AudioScriptingInterface.cpp | 6 ++++-- libraries/script-engine/src/AudioScriptingInterface.h | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index f7dde336c8..a9a8a8e5c4 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -128,10 +128,13 @@ Rectangle { AudioControls.CheckBox { id: stereoMic spacing: muteMic.spacing; - text: qsTr("Stereo"); + text: qsTr("use stereo for stereo devices"); checked: false; onClicked: { - Audio.setIsStereoInput(checked); + var success = Audio.setIsStereoInput(checked); + if (!success) { + checked = !checked; + } } } } @@ -215,6 +218,7 @@ Rectangle { text: devicename onPressed: { if (!checked) { + stereoMic.checked = false; AudioScriptingInterface.setInputDevice(info, bar.currentIndex === 1); } } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 8379151d1c..3828304964 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1372,9 +1372,11 @@ void AudioClient::setNoiseReduction(bool enable) { } -void AudioClient::setIsStereoInput(bool isStereoInput) { - if (isStereoInput != _isStereoInput) { +bool AudioClient::setIsStereoInput(bool isStereoInput) { + bool stereoInputChanged = false; + if (isStereoInput != _isStereoInput && _inputDeviceInfo.supportedChannelCounts().contains(2)) { _isStereoInput = isStereoInput; + stereoInputChanged = true; if (_isStereoInput) { _desiredInputFormat.setChannelCount(2); @@ -1394,6 +1396,8 @@ void AudioClient::setIsStereoInput(bool isStereoInput) { // restart the input device switchInputToAudioDevice(_inputDeviceInfo); } + + return stereoInputChanged; } bool AudioClient::outputLocalInjector(const AudioInjectorPointer& injector) { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 0643b8e52a..2c2ddd0342 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -194,7 +194,7 @@ public slots: void toggleMute(); bool isMuted() { return _muted; } - virtual void setIsStereoInput(bool stereo) override; + virtual bool setIsStereoInput(bool stereo) override; void setNoiseReduction(bool isNoiseGateEnabled); bool isNoiseReductionEnabled() const { return _isNoiseGateEnabled; } diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index 37731c31f7..ba1e733f13 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -41,7 +41,7 @@ public: public slots: virtual bool shouldLoopbackInjectors() { return false; } - virtual void setIsStereoInput(bool stereo) = 0; + virtual bool setIsStereoInput(bool stereo) = 0; }; Q_DECLARE_METATYPE(AbstractAudioInterface*) diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index 28bf5ed163..dd8d284c12 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -60,8 +60,10 @@ ScriptAudioInjector* AudioScriptingInterface::playSound(SharedSoundPointer sound } } -void AudioScriptingInterface::setStereoInput(bool stereo) { +bool AudioScriptingInterface::setStereoInput(bool stereo) { + bool stereoInputChanged = false; if (_localAudioInterface) { - _localAudioInterface->setIsStereoInput(stereo); + stereoInputChanged = _localAudioInterface->setIsStereoInput(stereo); } + return stereoInputChanged; } diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index 23a0861acd..d46430ccce 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -35,7 +35,7 @@ protected: // FIXME: there is no way to play a positionless sound Q_INVOKABLE ScriptAudioInjector* playSystemSound(SharedSoundPointer sound, const QVector3D& position); - Q_INVOKABLE void setStereoInput(bool stereo); + Q_INVOKABLE bool setStereoInput(bool stereo); signals: void mutedByMixer(); /// the client has been muted by the mixer From 7ce13a3ce745ca53d206917dcbefee7bdf6d5d3c Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 2 Mar 2018 11:06:28 -0800 Subject: [PATCH 160/267] adding comment --- interface/resources/qml/hifi/audio/Audio.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index a9a8a8e5c4..156332579a 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -219,6 +219,7 @@ Rectangle { onPressed: { if (!checked) { stereoMic.checked = false; + Audio.setIsStereoInput(false); // the next selected audio device might not support stereo AudioScriptingInterface.setInputDevice(info, bar.currentIndex === 1); } } From d64a6ecda7ae493e7e7469778e824d81cea4b795 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 2 Mar 2018 16:56:06 -0300 Subject: [PATCH 161/267] Fix keyboard in Samsung Note 8 --- android/app/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index efb7abbb93..5e93bdffa3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -44,7 +44,6 @@ android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTop" - android:enableVrMode="com.google.vr.vrcore/com.google.vr.vrcore.common.VrCoreListenerService" > From 01699e26a583223bfb02b2dd2f79302248a6e11e Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 2 Mar 2018 18:04:36 -0300 Subject: [PATCH 162/267] Fix QML debug info: print last QML loaded file instead of Desktop.qml --- libraries/ui/src/OffscreenUi.cpp | 4 +--- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 287978bbd3..76ea10c0ac 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -658,10 +658,8 @@ void OffscreenUi::createDesktop(const QUrl& url) { #ifdef DEBUG getSurfaceContext()->setContextProperty("DebugQML", QVariant(true)); - getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant(url.toString())); -#else +#else getSurfaceContext()->setContextProperty("DebugQML", QVariant(false)); - getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant("")); #endif load(url, [=](QQmlContext* context, QObject* newObject) { diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index 23a63c8f2a..1047fd1c7e 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -909,6 +909,12 @@ void OffscreenQmlSurface::loadInternal(const QUrl& qmlSource, bool createNewCont finalQmlSource = _qmlContext->resolvedUrl(qmlSource); } +#ifdef DEBUG + getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant(finalQmlSource.toString())); +#else + getSurfaceContext()->setContextProperty("DebugQMLFile", QVariant("")); +#endif + auto targetContext = contextForUrl(finalQmlSource, parent, createNewContext); auto qmlComponent = new QQmlComponent(_qmlContext->engine(), finalQmlSource, QQmlComponent::PreferSynchronous); if (qmlComponent->isLoading()) { From 76e4a5bef2c4524d467236e14797e163c7f62ff3 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 2 Mar 2018 18:46:14 -0300 Subject: [PATCH 163/267] Android - Change for test, this cast should avoid crashes due to SIGSEV in ToneMappingDeferred::run inputs.get1(). --- libraries/render-utils/src/RenderForwardTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 144671fca8..8bf060751f 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -100,7 +100,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // Lighting Buffer ready for tone mapping // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify // the output FBO as null, which causes the tonemapping to target the blit framebuffer - const auto toneMappingInputs = ToneMappingDeferred::Inputs(framebuffer, nullptr).asVarying(); + const auto toneMappingInputs = ToneMappingDeferred::Inputs(framebuffer, static_cast(nullptr) ).asVarying(); task.addJob("ToneMapping", toneMappingInputs); // Layered Overlays From d29adcd000dd5dffc33849c9763008a1f62e78d1 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 2 Mar 2018 16:08:14 -0800 Subject: [PATCH 164/267] Can download multiple images from GitHub. --- tools/auto-tester/src/Test.cpp | 54 +++++++++++++++++++------ tools/auto-tester/src/Test.h | 1 + tools/auto-tester/src/ui/AutoTester.cpp | 36 +++++++++++++---- tools/auto-tester/src/ui/AutoTester.h | 12 +++++- 4 files changed, 81 insertions(+), 22 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index ee792c0ea4..ac10d1ab33 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -188,36 +188,43 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { return; } - // Leave if test results folder could not be created + // Quit if test results folder could not be created if (!createTestResultsFolderPathIfNeeded(pathToTestResultsDirectory)) { return; } // Create two lists. The first is the test results, the second is the expected images + // The expected images are represented as a URL to enabel download from GitHub // Images that are in the wrong format are ignored. QStringList sortedTestResultsFilenames = createListOfAllJPEGimagesInDirectory(pathToTestResultsDirectory); QStringList expectedImages; QStringList resultImages; + + const QString URLPrefix("https://raw.githubusercontent.com"); + const QString githubUser("NissimHadar"); + const QString testsRepo("hifi_tests"); + const QString branch("addRecursionToAutotester"); + foreach(QString currentFilename, sortedTestResultsFilenames) { QString fullCurrentFilename = pathToTestResultsDirectory + "/" + currentFilename; if (isInSnapshotFilenameFormat(currentFilename)) { resultImages << fullCurrentFilename; - QString expectedImageDirectory = getExpectedImageDestinationDirectory(currentFilename); + QString expectedImagePartialSourceDirectory = getExpectedImagePartialSourceDirectory(currentFilename); // extract the digits at the end of the filename (exluding the file extension) QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); - QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + EXPECTED_IMAGE_TYPE; - expectedImages << (expectedImageDirectory + "/" + expectedImageFilename); + + QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + expectedImagePartialSourceDirectory + "/" + expectedImageFilename); + expectedImages << imageURLString; } } - ////autoTester->downloadImage(QUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png")); - ////autoTester->downloadImage(QUrl("https://github.com/NissimHadar/hifi_tests/blob/addRecursionToAutotester/tests/content/entity/zone/ambientLightInheritance/ExpectedImage_00000.jpg?raw=true")); - autoTester->downloadImage(QUrl("https://hifi-content.s3.amazonaws.com/nissim/autoTester/resources/ColourBox.jpg")); - ////bool success = compareImageLists(expectedImages, resultImages, pathToImageDirectory, interactiveMode, progressBar); + //autoTester->downloadImage(QUrl("https://raw.githubusercontent.com/NissimHadar/hifi_tests/addRecursionToAutotester/tests/content/entity/zone/ambientLightInheritance/ExpectedImage_00000.jpg")); + + autoTester->downloadImages(expectedImages); ////if (success) { //// messageBox.information(0, "Success", "All images are as expected"); @@ -386,7 +393,7 @@ void Test::createRecursiveScriptsRecursively() { } void Test::createTest() { - // Rename files sequentially, as ExpectedResult_1.jpeg, ExpectedResult_2.jpg and so on + // Rename files sequentially, as ExpectedResult_00000.jpeg, ExpectedResult_00001.jpg and so on // Any existing expected result images will be deleted QString imageSourceDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); if (imageSourceDirectory == "") { @@ -404,9 +411,9 @@ void Test::createTest() { exit(-1); } } else if (isInSnapshotFilenameFormat(currentFilename)) { - const int MAX_IMAGES = 100000; - if (i >= MAX_IMAGES) { - messageBox.critical(0, "Error", "More than 100,000 images not supported"); + const int maxImages = pow(10, NUM_DIGITS); + if (i >= maxImages) { + messageBox.critical(0, "Error", "More than " + QString::number(maxImages) + " images not supported"); exit(-1); } QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".jpg"; @@ -491,7 +498,6 @@ bool Test::isInSnapshotFilenameFormat(QString filename) { // For a file named "D_GitHub_hifi-tests_tests_content_entity_zone_create_0.jpg", the test directory is // D:/GitHub/hifi-tests/tests/content/entity/zone/create // This method assumes the filename is in the correct format -// The final part of the filename is the image number. This is checked for sanity QString Test::getExpectedImageDestinationDirectory(QString filename) { QString filenameWithoutExtension = filename.split(".")[0]; QStringList filenameParts = filenameWithoutExtension.split("_"); @@ -505,6 +511,28 @@ QString Test::getExpectedImageDestinationDirectory(QString filename) { return result; } +// For a file named "D_GitHub_hifi-tests_tests_content_entity_zone_create_0.jpg", the source directory on GitHub +// is ...tests/content/entity/zone/create +// This is used to create the full URL +// This method assumes the filename is in the correct format +QString Test::getExpectedImagePartialSourceDirectory(QString filename) { + QString filenameWithoutExtension = filename.split(".")[0]; + QStringList filenameParts = filenameWithoutExtension.split("_"); + + int i { 0 }; + while (filenameParts[i] != "tests") { + ++i; + } + + QString result = filenameParts[i]; + + for (int j = i + 1; j < filenameParts.length() - 1; ++j) { + result += "/" + filenameParts[j]; + } + + return result; +} + bool Test::isInExpectedImageFilenameFormat(QString filename) { return (expectedImageFilenameFormat.match(filename).hasMatch()); } \ No newline at end of file diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 7168a8ef69..026dbf25f6 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -47,6 +47,7 @@ public: bool isAValidDirectory(QString pathname); QString getExpectedImageDestinationDirectory(QString filename); + QString getExpectedImagePartialSourceDirectory(QString filename); private: const QString TEST_FILENAME { "test.js" }; diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 5a666aa5eb..c3ab88b7f4 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -16,6 +16,8 @@ AutoTester::AutoTester(QWidget *parent) : QMainWindow(parent) { ui.progressBar->setVisible(false); test = new Test(); + + signalMapper = new QSignalMapper(); } void AutoTester::on_evaluateTestsButton_clicked() { @@ -50,15 +52,35 @@ void AutoTester::on_closeButton_clicked() { } void AutoTester::downloadImage(QUrl url) { - downloader = new Downloader(url, this); + downloaders.emplace_back(new Downloader(url, this)); + connect(downloaders[_index], SIGNAL (downloaded()), signalMapper, SLOT (map())); - connect(downloader, SIGNAL (downloaded()), this, SLOT (saveImage())); + signalMapper->setMapping(downloaders[_index], _index); + + ++_index; } -void AutoTester::saveImage() { +void AutoTester::downloadImages(QStringList listOfURLs) { + _numberOfImagesToDownload = listOfURLs.size(); + _numberOfImagesDownloaded = 0; + _index = 0; + + for (int i = 0; i < _numberOfImagesToDownload; ++i) { + QUrl imageURL(listOfURLs[i]); + downloadImage(imageURL); + } + + connect(signalMapper, SIGNAL (mapped(int)), this, SLOT (saveImage(int))); +} + +void AutoTester::saveImage(int index) { QPixmap image; - image.loadFromData(downloader->downloadedData()); - int er = image.width(); - int df = image.height(); - image.save("D:/Dicom/lll.jpg"); + image.loadFromData(downloaders[index]->downloadedData()); + + int w = image.width(); + int h = image.height(); + + ++_numberOfImagesDownloaded; + + image.save("D:/Dicom/lll_" + QString::number(index) + ".jpg"); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index 2f6a9bca1e..5c1f217421 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -11,6 +11,7 @@ #define hifi_AutoTester_h #include +#include #include "ui_AutoTester.h" #include "../Downloader.h" @@ -22,6 +23,7 @@ class AutoTester : public QMainWindow { public: AutoTester(QWidget *parent = Q_NULLPTR); void downloadImage(QUrl url); + void downloadImages(QStringList listOfURLs); private slots: void on_evaluateTestsButton_clicked(); @@ -32,13 +34,19 @@ private slots: void on_deleteOldSnapshotsButton_clicked(); void on_closeButton_clicked(); - void saveImage(); + void saveImage(int index); private: Ui::AutoTesterClass ui; Test* test; - Downloader* downloader; + std::vector downloaders; + + QSignalMapper* signalMapper; + + int _numberOfImagesToDownload; + int _numberOfImagesDownloaded; + int _index; }; #endif // hifi_AutoTester_h \ No newline at end of file From 4b836a2ca9ef0194af2c6f1c03ff96ee7f409fe6 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 2 Mar 2018 16:49:09 -0800 Subject: [PATCH 165/267] Stores downloaded images in correct folder and with correct filenames. --- tools/auto-tester/src/Test.cpp | 11 +++++++---- tools/auto-tester/src/ui/AutoTester.cpp | 17 +++++++++-------- tools/auto-tester/src/ui/AutoTester.h | 11 ++++++++--- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index ac10d1ab33..d30349b395 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -198,7 +198,8 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { // Images that are in the wrong format are ignored. QStringList sortedTestResultsFilenames = createListOfAllJPEGimagesInDirectory(pathToTestResultsDirectory); - QStringList expectedImages; + QStringList expectedImagesURLs; + QStringList expectedImagesFilenames; QStringList resultImages; const QString URLPrefix("https://raw.githubusercontent.com"); @@ -217,14 +218,16 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + EXPECTED_IMAGE_TYPE; + expectedImagesFilenames << expectedImageFilename; + QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + expectedImagePartialSourceDirectory + "/" + expectedImageFilename); - expectedImages << imageURLString; + expectedImagesURLs << imageURLString; } } - //autoTester->downloadImage(QUrl("https://raw.githubusercontent.com/NissimHadar/hifi_tests/addRecursionToAutotester/tests/content/entity/zone/ambientLightInheritance/ExpectedImage_00000.jpg")); + autoTester->downloadImages(expectedImagesURLs, pathToTestResultsDirectory, expectedImagesFilenames); - autoTester->downloadImages(expectedImages); + // Wait for do ////if (success) { //// messageBox.information(0, "Success", "All images are as expected"); diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index c3ab88b7f4..5fd726ad72 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -51,7 +51,7 @@ void AutoTester::on_closeButton_clicked() { exit(0); } -void AutoTester::downloadImage(QUrl url) { +void AutoTester::downloadImage(const QUrl& url) { downloaders.emplace_back(new Downloader(url, this)); connect(downloaders[_index], SIGNAL (downloaded()), signalMapper, SLOT (map())); @@ -60,13 +60,16 @@ void AutoTester::downloadImage(QUrl url) { ++_index; } -void AutoTester::downloadImages(QStringList listOfURLs) { - _numberOfImagesToDownload = listOfURLs.size(); +void AutoTester::downloadImages(const QStringList& URLs, const QString& directoryName, const QStringList& filenames) { + _directoryName = directoryName; + _filenames = filenames; + + _numberOfImagesToDownload = URLs.size(); _numberOfImagesDownloaded = 0; _index = 0; for (int i = 0; i < _numberOfImagesToDownload; ++i) { - QUrl imageURL(listOfURLs[i]); + QUrl imageURL(URLs[i]); downloadImage(imageURL); } @@ -77,10 +80,8 @@ void AutoTester::saveImage(int index) { QPixmap image; image.loadFromData(downloaders[index]->downloadedData()); - int w = image.width(); - int h = image.height(); + + image.save(_directoryName + "/" + _filenames[index]); ++_numberOfImagesDownloaded; - - image.save("D:/Dicom/lll_" + QString::number(index) + ".jpg"); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index 5c1f217421..d5bab6d8a4 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -22,8 +22,8 @@ class AutoTester : public QMainWindow { public: AutoTester(QWidget *parent = Q_NULLPTR); - void downloadImage(QUrl url); - void downloadImages(QStringList listOfURLs); + void downloadImage(const QUrl& url); + void downloadImages(const QStringList& URLs, const QString& directoryName, const QStringList& filenames); private slots: void on_evaluateTestsButton_clicked(); @@ -38,10 +38,15 @@ private slots: private: Ui::AutoTesterClass ui; - Test* test; + std::vector downloaders; + // local storage for parameters - folder to store downloaded files in, and a list of their names + QString _directoryName; + QStringList _filenames; + + // Used to enable passing a parameter to slots QSignalMapper* signalMapper; int _numberOfImagesToDownload; From 361b5331bafba0d7862c52c8527a3c3550a91dc8 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 2 Mar 2018 18:09:32 -0800 Subject: [PATCH 166/267] File sizes are wrong, and so is format. --- tools/auto-tester/src/Test.cpp | 101 ++++-------------------- tools/auto-tester/src/Test.h | 11 ++- tools/auto-tester/src/ui/AutoTester.cpp | 23 +++--- tools/auto-tester/src/ui/AutoTester.h | 1 - tools/auto-tester/src/ui/AutoTester.ui | 13 --- 5 files changed, 36 insertions(+), 113 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index d30349b395..8fed094b07 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -63,9 +63,9 @@ void Test::zipAndDeleteTestResultsFolder() { index = 1; } -bool Test::compareImageLists(QStringList expectedImages, QStringList resultImages, QString testDirectory, bool interactiveMode, QProgressBar* progressBar) { +bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) { progressBar->setMinimum(0); - progressBar->setMaximum(expectedImages.length() - 1); + progressBar->setMaximum(expectedImagesFilenames.length() - 1); progressBar->setValue(0); progressBar->setVisible(true); @@ -74,10 +74,10 @@ bool Test::compareImageLists(QStringList expectedImages, QStringList resultImage const double THRESHOLD { 0.999 }; bool success{ true }; bool keepOn{ true }; - for (int i = 0; keepOn && i < expectedImages.length(); ++i) { + for (int i = 0; keepOn && i < expectedImagesFilenames.length(); ++i) { // First check that images are the same size - QImage resultImage(resultImages[i]); - QImage expectedImage(expectedImages[i]); + QImage resultImage(resultImagesFilenames[i]); + QImage expectedImage(expectedImagesFilenames[i]); if (resultImage.width() != expectedImage.width() || resultImage.height() != expectedImage.height()) { messageBox.critical(0, "Internal error", "Images are not the same size"); exit(-1); @@ -94,14 +94,14 @@ bool Test::compareImageLists(QStringList expectedImages, QStringList resultImage if (similarityIndex < THRESHOLD) { TestFailure testFailure = TestFailure{ (float)similarityIndex, - expectedImages[i].left(expectedImages[i].lastIndexOf("/") + 1), // path to the test (including trailing /) - QFileInfo(expectedImages[i].toStdString().c_str()).fileName(), // filename of expected image - QFileInfo(resultImages[i].toStdString().c_str()).fileName() // filename of result image + expectedImagesFilenames[i].left(expectedImagesFilenames[i].lastIndexOf("/") + 1), // path to the test (including trailing /) + QFileInfo(expectedImagesFilenames[i].toStdString().c_str()).fileName(), // filename of expected image + QFileInfo(resultImagesFilenames[i].toStdString().c_str()).fileName() // filename of result image }; mismatchWindow.setTestFailure(testFailure); - if (!interactiveMode) { + if (!isInteractiveMode) { appendTestResultsToFile(testResultsFolderPath, testFailure, mismatchWindow.getComparisonImage()); success = false; } else { @@ -181,9 +181,9 @@ void Test::appendTestResultsToFile(QString testResultsFolderPath, TestFailure te comparisonImage.save(failureFolderPath + "/" + "Difference Image.jpg"); } -void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { +void Test::startTestsEvaluation() { // Get list of JPEG images in folder, sorted by name - QString pathToTestResultsDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); + pathToTestResultsDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder containing the test images", ".", QFileDialog::ShowDirsOnly); if (pathToTestResultsDirectory == "") { return; } @@ -199,8 +199,6 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { QStringList sortedTestResultsFilenames = createListOfAllJPEGimagesInDirectory(pathToTestResultsDirectory); QStringList expectedImagesURLs; - QStringList expectedImagesFilenames; - QStringList resultImages; const QString URLPrefix("https://raw.githubusercontent.com"); const QString githubUser("NissimHadar"); @@ -210,7 +208,7 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { foreach(QString currentFilename, sortedTestResultsFilenames) { QString fullCurrentFilename = pathToTestResultsDirectory + "/" + currentFilename; if (isInSnapshotFilenameFormat(currentFilename)) { - resultImages << fullCurrentFilename; + resultImagesFilenames << fullCurrentFilename; QString expectedImagePartialSourceDirectory = getExpectedImagePartialSourceDirectory(currentFilename); @@ -226,15 +224,10 @@ void Test::evaluateTests(bool interactiveMode, QProgressBar* progressBar) { } autoTester->downloadImages(expectedImagesURLs, pathToTestResultsDirectory, expectedImagesFilenames); +} - // Wait for do - - ////if (success) { - //// messageBox.information(0, "Success", "All images are as expected"); - ////} else { - //// messageBox.information(0, "Failure", "One or more images are not as expected"); - ////} - +void Test::finishTestsEvaluation(bool interactiveMode, QProgressBar* progressBar) { + bool success = compareImageLists(interactiveMode, progressBar); zipAndDeleteTestResultsFolder(); } @@ -253,70 +246,6 @@ bool Test::isAValidDirectory(QString pathname) { return true; } -// Two criteria are used to decide if a folder contains valid test results. -// 1) a 'test'js' file exists in the folder -// 2) the folder has the same number of actual and expected images -void Test::evaluateTestsRecursively(bool interactiveMode, QProgressBar* progressBar) { - // Select folder to start recursing from - QString topLevelDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder that will contain the top level test script", ".", QFileDialog::ShowDirsOnly); - if (topLevelDirectory == "") { - return; - } - - // Leave if test results folder could not be created - if (!createTestResultsFolderPathIfNeeded(topLevelDirectory)) { - return; - } - - bool success{ true }; - QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); - while (it.hasNext()) { - QString directory = it.next(); - - if (!isAValidDirectory(directory)) { - continue; - } - - const QString testPathname{ directory + "/" + TEST_FILENAME }; - QFileInfo fileInfo(testPathname); - if (!fileInfo.exists()) { - // Folder does not contain 'test.js' - continue; - } - - QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(directory); - - // Separate images into two lists. The first is the expected images, the second is the test results - // Images that are in the wrong format are ignored. - QStringList expectedImages; - QStringList resultImages; - foreach(QString currentFilename, sortedImageFilenames) { - QString fullCurrentFilename = directory + "/" + currentFilename; - if (isInExpectedImageFilenameFormat(currentFilename)) { - expectedImages << fullCurrentFilename; - } else if (isInSnapshotFilenameFormat(currentFilename)) { - resultImages << fullCurrentFilename; - } - } - - if (expectedImages.length() != resultImages.length()) { - // Number of images doesn't match - continue; - } - - // Set success to false if any test has failed - success &= compareImageLists(expectedImages, resultImages, directory, interactiveMode, progressBar); - } - - if (success) { - messageBox.information(0, "Success", "All images are as expected"); - } else { - messageBox.information(0, "Failure", "One or more images are not as expected"); - } - - zipAndDeleteTestResultsFolder(); -} - void Test::importTest(QTextStream& textStream, const QString& testPathname) { textStream << "Script.include(\"" << "file:///" << testPathname + "?raw=true\");" << endl; } diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 026dbf25f6..bb7831da5e 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -23,14 +23,15 @@ class Test { public: Test(); - void evaluateTests(bool interactiveMode, QProgressBar* progressBar); - void evaluateTestsRecursively(bool interactiveMode, QProgressBar* progressBar); + void startTestsEvaluation(); + void finishTestsEvaluation(bool interactiveMode, QProgressBar* progressBar); + void createRecursiveScript(); void createRecursiveScriptsRecursively(); void createTest(); void deleteOldSnapshots(); - bool compareImageLists(QStringList expectedImages, QStringList resultImages, QString testDirectory, bool interactiveMode, QProgressBar* progressBar); + bool compareImageLists(bool isInteractiveMode, QProgressBar* progressBar); QStringList createListOfAllJPEGimagesInDirectory(QString pathToImageDirectory); @@ -71,6 +72,10 @@ private: const int NUM_DIGITS { 5 }; const QString EXPECTED_IMAGE_PREFIX { "ExpectedImage_" }; const QString EXPECTED_IMAGE_TYPE { ".jpg" }; + + QString pathToTestResultsDirectory; + QStringList expectedImagesFilenames; + QStringList resultImagesFilenames; }; #endif // hifi_test_h \ No newline at end of file diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 5fd726ad72..52499cd448 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -21,14 +21,7 @@ AutoTester::AutoTester(QWidget *parent) : QMainWindow(parent) { } void AutoTester::on_evaluateTestsButton_clicked() { - ////QUrl imageUrl("http://ribafreixo.com/wp-content/uploads/2017/03/Order-Now-Button-300x113.png"); - ////downloader = new Downloader(imageUrl, this); - ////connect(downloader, SIGNAL (downloaded()), this, SLOT (saveImage())); - test->evaluateTests(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); -} - -void AutoTester::on_evaluateTestsRecursivelyButton_clicked() { - test->evaluateTestsRecursively(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); + test->startTestsEvaluation(); } void AutoTester::on_createRecursiveScriptButton_clicked() { @@ -68,6 +61,11 @@ void AutoTester::downloadImages(const QStringList& URLs, const QString& director _numberOfImagesDownloaded = 0; _index = 0; + ui.progressBar->setMinimum(0); + ui.progressBar->setMaximum(_numberOfImagesToDownload - 1); + ui.progressBar->setValue(0); + ui.progressBar->setVisible(true); + for (int i = 0; i < _numberOfImagesToDownload; ++i) { QUrl imageURL(URLs[i]); downloadImage(imageURL); @@ -80,8 +78,13 @@ void AutoTester::saveImage(int index) { QPixmap image; image.loadFromData(downloaders[index]->downloadedData()); - - image.save(_directoryName + "/" + _filenames[index]); + image.save(_directoryName + "/" + _filenames[index], 0, 100); ++_numberOfImagesDownloaded; + + if (_numberOfImagesDownloaded == _numberOfImagesToDownload) { + test->finishTestsEvaluation(ui.checkBoxInteractiveMode->isChecked(), ui.progressBar); + } else { + ui.progressBar->setValue(_numberOfImagesDownloaded); + } } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index d5bab6d8a4..acf34c60a3 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -27,7 +27,6 @@ public: private slots: void on_evaluateTestsButton_clicked(); - void on_evaluateTestsRecursivelyButton_clicked(); void on_createRecursiveScriptButton_clicked(); void on_createRecursiveScriptsRecursivelyButton_clicked(); void on_createTestButton_clicked(); diff --git a/tools/auto-tester/src/ui/AutoTester.ui b/tools/auto-tester/src/ui/AutoTester.ui index 0d142ec43e..70060940d1 100644 --- a/tools/auto-tester/src/ui/AutoTester.ui +++ b/tools/auto-tester/src/ui/AutoTester.ui @@ -66,19 +66,6 @@ Create Recursive Script - - - - 20 - 130 - 220 - 40 - - - - Evaluate Tests Recursively - - From 0a2610a9e0b8335e89f6c725e117d24dacb2707e Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sat, 3 Mar 2018 09:58:30 -0800 Subject: [PATCH 167/267] Evaluation seems to work. --- tools/auto-tester/src/ImageComparer.cpp | 6 ++-- tools/auto-tester/src/Test.cpp | 47 ++++++++++++++----------- tools/auto-tester/src/Test.h | 7 ++-- tools/auto-tester/src/ui/AutoTester.cpp | 7 ++-- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/tools/auto-tester/src/ImageComparer.cpp b/tools/auto-tester/src/ImageComparer.cpp index 94b95a5ab6..99f7d22c5f 100644 --- a/tools/auto-tester/src/ImageComparer.cpp +++ b/tools/auto-tester/src/ImageComparer.cpp @@ -17,13 +17,13 @@ double ImageComparer::compareImages(QImage resultImage, QImage expectedImage) const { // Make sure the image is 8 bits per colour QImage::Format format = expectedImage.format(); - if (format != QImage::Format::Format_RGB32) { + if (format != QImage::Format::Format_ARGB32) { throw -1; } const int L = 255; // (2^number of bits per pixel) - 1 - const double K1{ 0.01 }; - const double K2{ 0.03 }; + const double K1 { 0.01 }; + const double K2 { 0.03 }; const double c1 = pow((K1 * L), 2); const double c2 = pow((K2 * L), 2); diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 8fed094b07..48fa530384 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -20,7 +20,7 @@ extern AutoTester* autoTester; Test::Test() { - QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + EXPECTED_IMAGE_TYPE); + QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + IMAGE_FORMAT); expectedImageFilenameFormat = QRegularExpression(regex); @@ -65,7 +65,7 @@ void Test::zipAndDeleteTestResultsFolder() { bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) { progressBar->setMinimum(0); - progressBar->setMaximum(expectedImagesFilenames.length() - 1); + progressBar->setMaximum(expectedImagesFullFilenames.length() - 1); progressBar->setValue(0); progressBar->setVisible(true); @@ -74,10 +74,11 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) const double THRESHOLD { 0.999 }; bool success{ true }; bool keepOn{ true }; - for (int i = 0; keepOn && i < expectedImagesFilenames.length(); ++i) { + for (int i = 0; keepOn && i < expectedImagesFullFilenames.length(); ++i) { // First check that images are the same size - QImage resultImage(resultImagesFilenames[i]); - QImage expectedImage(expectedImagesFilenames[i]); + QImage resultImage(resultImagesFullFilenames[i]); + QImage expectedImage(expectedImagesFullFilenames[i]); + if (resultImage.width() != expectedImage.width() || resultImage.height() != expectedImage.height()) { messageBox.critical(0, "Internal error", "Images are not the same size"); exit(-1); @@ -94,9 +95,9 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) if (similarityIndex < THRESHOLD) { TestFailure testFailure = TestFailure{ (float)similarityIndex, - expectedImagesFilenames[i].left(expectedImagesFilenames[i].lastIndexOf("/") + 1), // path to the test (including trailing /) - QFileInfo(expectedImagesFilenames[i].toStdString().c_str()).fileName(), // filename of expected image - QFileInfo(resultImagesFilenames[i].toStdString().c_str()).fileName() // filename of result image + expectedImagesFullFilenames[i].left(expectedImagesFullFilenames[i].lastIndexOf("/") + 1), // path to the test (including trailing /) + QFileInfo(expectedImagesFullFilenames[i].toStdString().c_str()).fileName(), // filename of expected image + QFileInfo(resultImagesFullFilenames[i].toStdString().c_str()).fileName() // filename of result image }; mismatchWindow.setTestFailure(testFailure); @@ -197,7 +198,7 @@ void Test::startTestsEvaluation() { // The expected images are represented as a URL to enabel download from GitHub // Images that are in the wrong format are ignored. - QStringList sortedTestResultsFilenames = createListOfAllJPEGimagesInDirectory(pathToTestResultsDirectory); + QStringList sortedTestResultsFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(pathToTestResultsDirectory); QStringList expectedImagesURLs; const QString URLPrefix("https://raw.githubusercontent.com"); @@ -205,18 +206,23 @@ void Test::startTestsEvaluation() { const QString testsRepo("hifi_tests"); const QString branch("addRecursionToAutotester"); + resultImagesFullFilenames.clear(); + expectedImagesFilenames.clear(); + expectedImagesFullFilenames.clear(); + foreach(QString currentFilename, sortedTestResultsFilenames) { QString fullCurrentFilename = pathToTestResultsDirectory + "/" + currentFilename; if (isInSnapshotFilenameFormat(currentFilename)) { - resultImagesFilenames << fullCurrentFilename; + resultImagesFullFilenames << fullCurrentFilename; QString expectedImagePartialSourceDirectory = getExpectedImagePartialSourceDirectory(currentFilename); // extract the digits at the end of the filename (exluding the file extension) QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); - QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + EXPECTED_IMAGE_TYPE; + QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + IMAGE_FORMAT; expectedImagesFilenames << expectedImageFilename; + expectedImagesFullFilenames << pathToTestResultsDirectory + "/" + expectedImageFilename; QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + expectedImagePartialSourceDirectory + "/" + expectedImageFilename); expectedImagesURLs << imageURLString; @@ -332,9 +338,10 @@ void Test::createTest() { return; } - QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(imageSourceDirectory); + QStringList sortedImageFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(imageSourceDirectory); - int i = 1; + int i = 1; + const int maxImages = pow(10, NUM_DIGITS); foreach (QString currentFilename, sortedImageFilenames) { QString fullCurrentFilename = imageSourceDirectory + "/" + currentFilename; if (isInExpectedImageFilenameFormat(currentFilename)) { @@ -343,12 +350,12 @@ void Test::createTest() { exit(-1); } } else if (isInSnapshotFilenameFormat(currentFilename)) { - const int maxImages = pow(10, NUM_DIGITS); + if (i >= maxImages) { messageBox.critical(0, "Error", "More than " + QString::number(maxImages) + " images not supported"); exit(-1); } - QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".jpg"; + QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + IMAGE_FORMAT; QString imageDestinationDirectory = getExpectedImageDestinationDirectory(currentFilename); QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; @@ -383,7 +390,7 @@ void Test::deleteOldSnapshots() { continue; } - QStringList sortedImageFilenames = createListOfAllJPEGimagesInDirectory(directory); + QStringList sortedImageFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(directory); // Delete any file that is a snapshot (NOT the Expected Images) QStringList expectedImages; @@ -400,10 +407,10 @@ void Test::deleteOldSnapshots() { } } -QStringList Test::createListOfAllJPEGimagesInDirectory(QString pathToImageDirectory) { +QStringList Test::createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToImageDirectory) { imageDirectory = QDir(pathToImageDirectory); QStringList nameFilters; - nameFilters << "*.jpg"; + nameFilters << "*" + IMAGE_FORMAT; return imageDirectory.entryList(nameFilters, QDir::Files, QDir::Name); } @@ -422,9 +429,9 @@ bool Test::isInSnapshotFilenameFormat(QString filename) { bool last5CharactersAreDigits; filenameParts[0].right(5).toInt(&last5CharactersAreDigits, 10); - bool extensionIsJPG = filenameParts[1] == "jpg"; + bool extensionIsIMAGE_FORMAT = filenameParts[1] == IMAGE_FORMAT.right(3); // without the period - return (filnameHasNoPeriods && contains_tests && last5CharactersAreDigits && extensionIsJPG); + return (filnameHasNoPeriods && contains_tests && last5CharactersAreDigits && extensionIsIMAGE_FORMAT); } // For a file named "D_GitHub_hifi-tests_tests_content_entity_zone_create_0.jpg", the test directory is diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index bb7831da5e..56d924b82a 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -33,7 +33,7 @@ public: bool compareImageLists(bool isInteractiveMode, QProgressBar* progressBar); - QStringList createListOfAllJPEGimagesInDirectory(QString pathToImageDirectory); + QStringList createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToImageDirectory); bool isInSnapshotFilenameFormat(QString filename); bool isInExpectedImageFilenameFormat(QString filename); @@ -71,11 +71,12 @@ private: // Expected images are in the format ExpectedImage_dddd.jpg (d == decimal digit) const int NUM_DIGITS { 5 }; const QString EXPECTED_IMAGE_PREFIX { "ExpectedImage_" }; - const QString EXPECTED_IMAGE_TYPE { ".jpg" }; + const QString IMAGE_FORMAT { ".png" }; QString pathToTestResultsDirectory; QStringList expectedImagesFilenames; - QStringList resultImagesFilenames; + QStringList expectedImagesFullFilenames; + QStringList resultImagesFullFilenames; }; #endif // hifi_test_h \ No newline at end of file diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 52499cd448..ade6b0514e 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -75,8 +75,11 @@ void AutoTester::downloadImages(const QStringList& URLs, const QString& director } void AutoTester::saveImage(int index) { - QPixmap image; - image.loadFromData(downloaders[index]->downloadedData()); + QPixmap pixmap; + pixmap.loadFromData(downloaders[index]->downloadedData()); + + QImage image = pixmap.toImage(); + image = image.convertToFormat(QImage::Format_ARGB32); image.save(_directoryName + "/" + _filenames[index], 0, 100); From b32ad2f69c7120cfcd76d5464bd6591141160aca Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sat, 3 Mar 2018 18:22:51 -0800 Subject: [PATCH 168/267] createTests fixed. --- tools/auto-tester/src/Test.cpp | 13 ++----------- tools/auto-tester/src/Test.h | 1 - 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 48fa530384..dbaa3a05a5 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -344,13 +344,7 @@ void Test::createTest() { const int maxImages = pow(10, NUM_DIGITS); foreach (QString currentFilename, sortedImageFilenames) { QString fullCurrentFilename = imageSourceDirectory + "/" + currentFilename; - if (isInExpectedImageFilenameFormat(currentFilename)) { - if (!QFile::remove(fullCurrentFilename)) { - messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nTest creation aborted"); - exit(-1); - } - } else if (isInSnapshotFilenameFormat(currentFilename)) { - + if (isInSnapshotFilenameFormat(currentFilename)) { if (i >= maxImages) { messageBox.critical(0, "Error", "More than " + QString::number(maxImages) + " images not supported"); exit(-1); @@ -360,6 +354,7 @@ void Test::createTest() { QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; try { + QFile::remove(fullNewFileName); QFile::copy(fullCurrentFilename, fullNewFileName); } catch (...) { messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nTest creation aborted"); @@ -471,7 +466,3 @@ QString Test::getExpectedImagePartialSourceDirectory(QString filename) { return result; } - -bool Test::isInExpectedImageFilenameFormat(QString filename) { - return (expectedImageFilenameFormat.match(filename).hasMatch()); -} \ No newline at end of file diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 56d924b82a..29e1b135ed 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -36,7 +36,6 @@ public: QStringList createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToImageDirectory); bool isInSnapshotFilenameFormat(QString filename); - bool isInExpectedImageFilenameFormat(QString filename); void importTest(QTextStream& textStream, const QString& testPathname); From 12a70d57c2903ccdd37fbfc7ccc7733b977a232d Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 4 Mar 2018 17:24:52 +0100 Subject: [PATCH 169/267] Set Y pos for indicator explicetly --- interface/resources/qml/controls-uit/CheckBox.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index e60f646327..00853ecf6c 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -42,6 +42,7 @@ Original.CheckBox { style: CheckBoxStyle { indicator: Rectangle { id: box + y: (checkBox.height - height) / 2 width: boxSize height: boxSize radius: boxRadius @@ -101,8 +102,8 @@ Original.CheckBox { } label: Label { - text: control.text - color: control.color + text: checkBox.text + color: checkBox.color x: 2 wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight From 1d43ca48bd77241d222fbce38eb6a62cf578f946 Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 4 Mar 2018 17:59:56 +0100 Subject: [PATCH 170/267] remove wrap --- interface/resources/qml/controls-uit/CheckBox.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 00853ecf6c..61e5d0c0f0 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -105,8 +105,8 @@ Original.CheckBox { text: checkBox.text color: checkBox.color x: 2 - wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap - elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight + //wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap + //elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight enabled: checkBox.enabled } } From 9f151566bf30e58c51e064ac0320395c0df899b4 Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 4 Mar 2018 18:46:27 +0100 Subject: [PATCH 171/267] temporarily remove styling --- interface/resources/qml/controls-uit/CheckBox.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 61e5d0c0f0..5001102360 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -38,7 +38,7 @@ Original.CheckBox { // onHovered: { // Tablet.playSound(TabletEnums.ButtonHover); // } - +/* style: CheckBoxStyle { indicator: Rectangle { id: box @@ -105,9 +105,9 @@ Original.CheckBox { text: checkBox.text color: checkBox.color x: 2 - //wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap - //elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight + wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap + elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight enabled: checkBox.enabled } - } + }*/ } From c2c7962f66d8d6f94304d86158463343ce6946af Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 4 Mar 2018 19:49:47 +0100 Subject: [PATCH 172/267] return styling. set implicit sizes --- interface/resources/qml/controls-uit/CheckBox.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 5001102360..02bb9aacc9 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -38,13 +38,13 @@ Original.CheckBox { // onHovered: { // Tablet.playSound(TabletEnums.ButtonHover); // } -/* + style: CheckBoxStyle { indicator: Rectangle { id: box - y: (checkBox.height - height) / 2 - width: boxSize - height: boxSize + //y: (checkBox.height - height) / 2 + implicitWidth: boxSize + implicitHeight: boxSize radius: boxRadius border.width: 1 border.color: pressed || hovered @@ -109,5 +109,5 @@ Original.CheckBox { elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight enabled: checkBox.enabled } - }*/ + } } From 43e7f282ec562cfb0e4f9ba2fd0c22c2978954fe Mon Sep 17 00:00:00 2001 From: vladest Date: Sun, 4 Mar 2018 20:44:46 +0100 Subject: [PATCH 173/267] cleanup --- interface/resources/qml/controls-uit/CheckBox.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 02bb9aacc9..973bbee60e 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -42,7 +42,6 @@ Original.CheckBox { style: CheckBoxStyle { indicator: Rectangle { id: box - //y: (checkBox.height - height) / 2 implicitWidth: boxSize implicitHeight: boxSize radius: boxRadius From 913ad569c0585769e53bc2d1e926a0afef47c572 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sun, 4 Mar 2018 17:36:20 -0800 Subject: [PATCH 174/267] Added completion message. --- tools/auto-tester/src/Test.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index dbaa3a05a5..7b6293dcbc 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -234,6 +234,13 @@ void Test::startTestsEvaluation() { void Test::finishTestsEvaluation(bool interactiveMode, QProgressBar* progressBar) { bool success = compareImageLists(interactiveMode, progressBar); + + if (success) { + messageBox.information(0, "Success", "All images are as expected"); + } else { + messageBox.information(0, "Failure", "One or more images are not as expected"); + } + zipAndDeleteTestResultsFolder(); } From 5a79f272f3e9ef29ed87977c586b2d7c34edc852 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Sun, 4 Mar 2018 20:56:57 -0800 Subject: [PATCH 175/267] Allow multiple evaluations. --- tools/auto-tester/src/Test.cpp | 18 ++++++++++++------ tools/auto-tester/src/ui/AutoTester.cpp | 3 ++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 7b6293dcbc..fbd30e7307 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -216,16 +216,22 @@ void Test::startTestsEvaluation() { resultImagesFullFilenames << fullCurrentFilename; QString expectedImagePartialSourceDirectory = getExpectedImagePartialSourceDirectory(currentFilename); - - // extract the digits at the end of the filename (exluding the file extension) + + // Images are stored on GitHub as ExpectedImage_ddddd.png + // Extract the digits at the end of the filename (exluding the file extension) QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); - QString expectedImageFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + IMAGE_FORMAT; + QString expectedImageStoredFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + IMAGE_FORMAT; + + QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + + expectedImagePartialSourceDirectory + "/" + expectedImageStoredFilename); + + expectedImagesURLs << imageURLString; + + // The image retrieved from Github needs a unique name + QString expectedImageFilename = currentFilename.replace("/", "_").replace(".", "_EI."); expectedImagesFilenames << expectedImageFilename; expectedImagesFullFilenames << pathToTestResultsDirectory + "/" + expectedImageFilename; - - QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + expectedImagePartialSourceDirectory + "/" + expectedImageFilename); - expectedImagesURLs << imageURLString; } } diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index ade6b0514e..5ac7be3dd8 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -81,7 +81,8 @@ void AutoTester::saveImage(int index) { QImage image = pixmap.toImage(); image = image.convertToFormat(QImage::Format_ARGB32); - image.save(_directoryName + "/" + _filenames[index], 0, 100); + QString fullPathname = _directoryName + "/" + _filenames[index]; + image.save(fullPathname, 0, 100); ++_numberOfImagesDownloaded; From 654770af512032cad26c91a8eff4cd1b0cdcc736 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 5 Mar 2018 09:39:26 -0800 Subject: [PATCH 176/267] fix controller dispatacher error --- scripts/system/controllers/controllerDispatcher.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 18b194dd3a..4f041d3067 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -43,6 +43,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.totalVariance = 0; this.highVarianceCount = 0; this.veryhighVarianceCount = 0; + this.orderedPluginNames = []; this.tabletID = null; this.blacklist = []; this.pointerManager = new PointerManager(); From 1997cd27bd463127a088148a013bd1e3efa70f0b Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 5 Mar 2018 11:26:37 -0800 Subject: [PATCH 177/267] correctly use default values --- scripts/system/html/js/entityProperties.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 2b29fbf041..86bbe7086b 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -321,22 +321,19 @@ function multiDataUpdater(groupName, updateKeyPair, userDataElement, defaults) { } var keys = Object.keys(updateKeyPair); keys.forEach(function (key) { - delete parsedData[groupName][key]; if (updateKeyPair[key] !== null && updateKeyPair[key] !== "null") { if (updateKeyPair[key] instanceof Element) { if (updateKeyPair[key].type === "checkbox") { - if (updateKeyPair[key].checked !== defaults[key]) { - parsedData[groupName][key] = updateKeyPair[key].checked; - } + parsedData[groupName][key] = updateKeyPair[key].checked; } else { var val = isNaN(updateKeyPair[key].value) ? updateKeyPair[key].value : parseInt(updateKeyPair[key].value); - if (val !== defaults[key]) { - parsedData[groupName][key] = val; - } + parsedData[groupName][key] = val; } } else { parsedData[groupName][key] = updateKeyPair[key]; } + } else if (defaults[key] !== null && defaults[key] !== "null") { + parsedData[groupName][key] = defaults[key]; } }); if (Object.keys(parsedData[groupName]).length === 0) { From d7725f1d73e99870fffae195399556151e224777 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sun, 4 Mar 2018 00:18:59 +0100 Subject: [PATCH 178/267] make the grabbable checkbox again, respect default true setting --- scripts/system/html/js/entityProperties.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 2b29fbf041..7e87586b4f 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -1281,7 +1281,7 @@ function loaded() { if (elCloneable.checked) { elGrabbable.checked = false; } - userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic); + userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, true); }); elCloneableDynamic.addEventListener('change', function(event) { userDataChanger("grabbableKey", "cloneDynamic", event.target, elUserData, -1); From c091bc0bb3d27258ab3d7538b757f573a0d80546 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 5 Mar 2018 17:08:38 -0300 Subject: [PATCH 179/267] Fix warnings regarding float to double conversion --- .../src/input-plugins/TouchscreenVirtualPadDevice.cpp | 6 +++--- .../src/input-plugins/TouchscreenVirtualPadDevice.h | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 1774bbb4d3..bbe6102d21 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -68,7 +68,7 @@ void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualP if (_extraBottomMargin == virtualPadManager.extraBottomMargin() && !force) return; // Our only criteria to decide a center change is the bottom margin _extraBottomMargin = virtualPadManager.extraBottomMargin(); - qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) + float margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) QScreen* eventScreen = qApp->primaryScreen(); // do not call every time _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); @@ -104,12 +104,12 @@ glm::vec2 TouchscreenVirtualPadDevice::clippedPointInCircle(float radius, glm::v // quadtratic coefs of circumference and line intersection float qa = pow(m,2)+1; float qb = 2 * ( m * b - origin.x - origin.y * m ); - float qc = pow(origin.x, 2) - pow(radius,2) + b * b - 2 * b * origin.y + pow(origin.y, 2); + float qc = powf(origin.x, 2) - powf(radius,2) + b * b - 2 * b * origin.y + powf(origin.y, 2); float discr = qb * qb - 4 * qa * qc; float discrSign = deltaX>0?1.0:-1.0; - float finalX = (- qb + discrSign * sqrt(discr)) / (2 * qa); + float finalX = (- qb + discrSign * sqrtf(discr)) / (2 * qa); float finalY = m * finalX + b; return vec2(finalX, finalY); diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index f71490b0e3..4b95f3fbaf 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -62,9 +62,9 @@ public: const std::shared_ptr& getInputDevice() const { return _inputDevice; } protected: - qreal _lastPinchScale; - qreal _pinchScale; - qreal _screenDPI; + float _lastPinchScale; + float _pinchScale; + float _screenDPI; glm::vec2 _screenDPIScale; bool _validTouchLeft; glm::vec2 _firstTouchLeftPoint; @@ -78,8 +78,8 @@ protected: bool _fixedPosition; glm::vec2 _fixedCenterPosition; - qreal _fixedRadius; - qreal _fixedRadiusForCalc; + float _fixedRadius; + float _fixedRadiusForCalc; int _extraBottomMargin {0}; void touchLeftBegin(glm::vec2 touchPoint); From 0bb56d837d01e8105671b8919e6d567b5e172ec1 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 5 Mar 2018 18:08:06 -0300 Subject: [PATCH 180/267] Android - Use a different variable to save the reported dpi by qt in TouchscreenVirtualPadDevice --- .../src/input-plugins/TouchscreenVirtualPadDevice.cpp | 3 ++- .../src/input-plugins/TouchscreenVirtualPadDevice.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index bbe6102d21..e323ed8fbc 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -43,10 +43,11 @@ void TouchscreenVirtualPadDevice::init() { _fixedPosition = true; // This should be config QScreen* eventScreen = qApp->primaryScreen(); - if (_screenDPI != eventScreen->physicalDotsPerInch()) { + if (_screenDPIProvided != eventScreen->physicalDotsPerInch()) { _screenWidthCenter = eventScreen->size().width() / 2; _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); + _screenDPIProvided = eventScreen->physicalDotsPerInch(); _screenDPI = eventScreen->physicalDotsPerInch(); _fixedRadius = _screenDPI * 256 / 534; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 4b95f3fbaf..d5019da805 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -65,6 +65,7 @@ protected: float _lastPinchScale; float _pinchScale; float _screenDPI; + qreal _screenDPIProvided; glm::vec2 _screenDPIScale; bool _validTouchLeft; glm::vec2 _firstTouchLeftPoint; From 8fb3015ec8677b71f8315f62ec83e0501c18d6ff Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 5 Mar 2018 16:51:05 -0800 Subject: [PATCH 181/267] Fix for missing avatar on second replay Fixes a logic problem in the handshake request handling; deals with KillAvatar from the Agent by removing the node-linked data, not the actual Node; tweaks some of the network debug output. --- assignment-client/src/avatars/AvatarMixer.cpp | 4 +++- libraries/networking/src/udt/Connection.cpp | 3 ++- libraries/networking/src/udt/Socket.cpp | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 3ca924b007..dd7db5a21d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -605,7 +605,9 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes void AvatarMixer::handleKillAvatarPacket(QSharedPointer message, SharedNodePointer node) { auto start = usecTimestampNow(); - DependencyManager::get()->processKillNode(*message); + node->stopPingTimer(); + emit(DependencyManager::get()->nodeKilled(node)); + node->setLinkedData(nullptr); auto end = usecTimestampNow(); _handleKillAvatarPacketElapsedTime += (end - start); diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 77ed589e0b..c1fe6ccd85 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -576,8 +576,9 @@ void Connection::processControl(ControlPacketPointer controlPacket) { // where the other end expired our connection. Let's reset. #ifdef UDT_CONNECTION_DEBUG - qCDebug(networking) << "Got handshake request, stopping SendQueue"; + qCDebug(networking) << "Got HandshakeRequest from" << _destination << ", stopping SendQueue"; #endif + _hasReceivedHandshakeACK = false; stopSendQueue(); } break; diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 8b93a05130..5324946f82 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -402,6 +402,10 @@ void Socket::readPendingDatagrams() { packet->getDataSize(), packet->getPayloadSize())) { // the connection could not be created or indicated that we should not continue processing this packet +#ifdef UDT_CONNECTION_DEBUG + qCDebug(networking) << "Bad packet version" << (unsigned int)NLPacket::versionInHeader(*packet) + << ", type" << NLPacket::typeInHeader(*packet); +#endif continue; } } From 84815fadaeb6bf2476074466cc0d0da28dfb549d Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 5 Mar 2018 17:45:51 -0800 Subject: [PATCH 182/267] Use JPG->PNG trick to keep file sizes down. --- tools/auto-tester/src/Test.cpp | 79 +++++++++++-------------- tools/auto-tester/src/Test.h | 7 ++- tools/auto-tester/src/ui/AutoTester.cpp | 4 -- tools/auto-tester/src/ui/AutoTester.h | 1 - tools/auto-tester/src/ui/AutoTester.ui | 21 ++----- 5 files changed, 43 insertions(+), 69 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index fbd30e7307..53687fdeda 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include @@ -20,7 +22,7 @@ extern AutoTester* autoTester; Test::Test() { - QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + IMAGE_FORMAT); + QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + ".png"); expectedImageFilenameFormat = QRegularExpression(regex); @@ -194,11 +196,23 @@ void Test::startTestsEvaluation() { return; } + // Before any processing - all images are converted to PNGs, as this is the format stored on GitHub + QStringList sortedSnapshotFilenames = createListOfAll_imagesInDirectory("jpg", pathToTestResultsDirectory); + foreach(QString filename, sortedSnapshotFilenames) { + QStringList stringParts = filename.split("."); + copyJPGtoPNG( + pathToTestResultsDirectory + "/" + stringParts[0] + ".jpg", + pathToTestResultsDirectory + "/" + stringParts[0] + ".png" + ); + + QFile::remove(pathToTestResultsDirectory + "/" + stringParts[0] + ".jpg"); + } + // Create two lists. The first is the test results, the second is the expected images - // The expected images are represented as a URL to enabel download from GitHub + // The expected images are represented as a URL to enable download from GitHub // Images that are in the wrong format are ignored. - QStringList sortedTestResultsFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(pathToTestResultsDirectory); + QStringList sortedTestResultsFilenames = createListOfAll_imagesInDirectory("png", pathToTestResultsDirectory); QStringList expectedImagesURLs; const QString URLPrefix("https://raw.githubusercontent.com"); @@ -212,7 +226,7 @@ void Test::startTestsEvaluation() { foreach(QString currentFilename, sortedTestResultsFilenames) { QString fullCurrentFilename = pathToTestResultsDirectory + "/" + currentFilename; - if (isInSnapshotFilenameFormat(currentFilename)) { + if (isInSnapshotFilenameFormat("png", currentFilename)) { resultImagesFullFilenames << fullCurrentFilename; QString expectedImagePartialSourceDirectory = getExpectedImagePartialSourceDirectory(currentFilename); @@ -220,7 +234,7 @@ void Test::startTestsEvaluation() { // Images are stored on GitHub as ExpectedImage_ddddd.png // Extract the digits at the end of the filename (exluding the file extension) QString expectedImageFilenameTail = currentFilename.left(currentFilename.length() - 4).right(NUM_DIGITS); - QString expectedImageStoredFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + IMAGE_FORMAT; + QString expectedImageStoredFilename = EXPECTED_IMAGE_PREFIX + expectedImageFilenameTail + ".png"; QString imageURLString(URLPrefix + "/" + githubUser + "/" + testsRepo + "/" + branch + "/" + expectedImagePartialSourceDirectory + "/" + expectedImageStoredFilename); @@ -351,24 +365,23 @@ void Test::createTest() { return; } - QStringList sortedImageFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(imageSourceDirectory); + QStringList sortedImageFilenames = createListOfAll_imagesInDirectory("jpg", imageSourceDirectory); int i = 1; const int maxImages = pow(10, NUM_DIGITS); foreach (QString currentFilename, sortedImageFilenames) { QString fullCurrentFilename = imageSourceDirectory + "/" + currentFilename; - if (isInSnapshotFilenameFormat(currentFilename)) { + if (isInSnapshotFilenameFormat("jpg", currentFilename)) { if (i >= maxImages) { messageBox.critical(0, "Error", "More than " + QString::number(maxImages) + " images not supported"); exit(-1); } - QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + IMAGE_FORMAT; + QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".png"; QString imageDestinationDirectory = getExpectedImageDestinationDirectory(currentFilename); QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; try { - QFile::remove(fullNewFileName); - QFile::copy(fullCurrentFilename, fullNewFileName); + copyJPGtoPNG(fullCurrentFilename, fullNewFileName); } catch (...) { messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nTest creation aborted"); exit(-1); @@ -380,45 +393,23 @@ void Test::createTest() { messageBox.information(0, "Success", "Test images have been created"); } -void Test::deleteOldSnapshots() { - // Select folder to start recursing from - QString topLevelDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select root folder for snapshot deletion", ".", QFileDialog::ShowDirsOnly); - if (topLevelDirectory == "") { - return; - } +void Test::copyJPGtoPNG(QString sourceJPGFullFilename, QString destinationPNGFullFilename) { + QFile::remove(destinationPNGFullFilename); - // Recurse over folders - QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); - while (it.hasNext()) { - QString directory = it.next(); + QImageReader reader; + reader.setFileName(sourceJPGFullFilename); - // Only process directories - QDir dir(directory); - if (!isAValidDirectory(directory)) { - continue; - } + QImage image = reader.read(); - QStringList sortedImageFilenames = createListOfAll_IMAGE_FORMAT_imagesInDirectory(directory); - - // Delete any file that is a snapshot (NOT the Expected Images) - QStringList expectedImages; - QStringList resultImages; - foreach(QString currentFilename, sortedImageFilenames) { - QString fullCurrentFilename = directory + "/" + currentFilename; - if (isInSnapshotFilenameFormat(currentFilename)) { - if (!QFile::remove(fullCurrentFilename)) { - messageBox.critical(0, "Error", "Could not delete existing file: " + currentFilename + "\nSnapshot deletion aborted"); - exit(-1); - } - } - } - } + QImageWriter writer; + writer.setFileName(destinationPNGFullFilename); + writer.write(image); } -QStringList Test::createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToImageDirectory) { +QStringList Test::createListOfAll_imagesInDirectory(QString imageFormat, QString pathToImageDirectory) { imageDirectory = QDir(pathToImageDirectory); QStringList nameFilters; - nameFilters << "*" + IMAGE_FORMAT; + nameFilters << "*." + imageFormat; return imageDirectory.entryList(nameFilters, QDir::Files, QDir::Name); } @@ -428,7 +419,7 @@ QStringList Test::createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToI // Filename (i.e. without extension) contains _tests_ (this is based on all test scripts being within the tests folder // Last 5 characters in filename are digits // Extension is jpg -bool Test::isInSnapshotFilenameFormat(QString filename) { +bool Test::isInSnapshotFilenameFormat(QString imageFormat, QString filename) { QStringList filenameParts = filename.split("."); bool filnameHasNoPeriods = (filenameParts.size() == 2); @@ -437,7 +428,7 @@ bool Test::isInSnapshotFilenameFormat(QString filename) { bool last5CharactersAreDigits; filenameParts[0].right(5).toInt(&last5CharactersAreDigits, 10); - bool extensionIsIMAGE_FORMAT = filenameParts[1] == IMAGE_FORMAT.right(3); // without the period + bool extensionIsIMAGE_FORMAT = (filenameParts[1] == imageFormat); return (filnameHasNoPeriods && contains_tests && last5CharactersAreDigits && extensionIsIMAGE_FORMAT); } diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 29e1b135ed..b849ab577f 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -33,9 +33,9 @@ public: bool compareImageLists(bool isInteractiveMode, QProgressBar* progressBar); - QStringList createListOfAll_IMAGE_FORMAT_imagesInDirectory(QString pathToImageDirectory); + QStringList createListOfAll_imagesInDirectory(QString imageFormat, QString pathToImageDirectory); - bool isInSnapshotFilenameFormat(QString filename); + bool isInSnapshotFilenameFormat(QString imageFormat, QString filename); void importTest(QTextStream& textStream, const QString& testPathname); @@ -49,6 +49,8 @@ public: QString getExpectedImageDestinationDirectory(QString filename); QString getExpectedImagePartialSourceDirectory(QString filename); + void copyJPGtoPNG(QString sourceJPGFullFilename, QString destinationPNGFullFilename); + private: const QString TEST_FILENAME { "test.js" }; const QString TEST_RESULTS_FOLDER { "TestResults" }; @@ -70,7 +72,6 @@ private: // Expected images are in the format ExpectedImage_dddd.jpg (d == decimal digit) const int NUM_DIGITS { 5 }; const QString EXPECTED_IMAGE_PREFIX { "ExpectedImage_" }; - const QString IMAGE_FORMAT { ".png" }; QString pathToTestResultsDirectory; QStringList expectedImagesFilenames; diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 5ac7be3dd8..a5e13331dd 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -36,10 +36,6 @@ void AutoTester::on_createTestButton_clicked() { test->createTest(); } -void AutoTester::on_deleteOldSnapshotsButton_clicked() { - test->deleteOldSnapshots(); -} - void AutoTester::on_closeButton_clicked() { exit(0); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index acf34c60a3..938e7ca2d2 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -30,7 +30,6 @@ private slots: void on_createRecursiveScriptButton_clicked(); void on_createRecursiveScriptsRecursivelyButton_clicked(); void on_createTestButton_clicked(); - void on_deleteOldSnapshotsButton_clicked(); void on_closeButton_clicked(); void saveImage(int index); diff --git a/tools/auto-tester/src/ui/AutoTester.ui b/tools/auto-tester/src/ui/AutoTester.ui index 70060940d1..55c3897e58 100644 --- a/tools/auto-tester/src/ui/AutoTester.ui +++ b/tools/auto-tester/src/ui/AutoTester.ui @@ -30,8 +30,8 @@ - 360 - 210 + 20 + 30 220 40 @@ -44,7 +44,7 @@ 20 - 75 + 135 220 40 @@ -70,7 +70,7 @@ 23 - 40 + 100 131 20 @@ -95,19 +95,6 @@ 24 - - - - 360 - 270 - 220 - 40 - - - - Delete Old Snapshots - - From 547d86a2d52699d27b0cb553e0e47ecd02a65f2d Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 5 Mar 2018 18:10:15 -0800 Subject: [PATCH 183/267] Improve debugging diagnostic --- libraries/networking/src/udt/Socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 5324946f82..4189cb613c 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -403,7 +403,7 @@ void Socket::readPendingDatagrams() { packet->getPayloadSize())) { // the connection could not be created or indicated that we should not continue processing this packet #ifdef UDT_CONNECTION_DEBUG - qCDebug(networking) << "Bad packet version" << (unsigned int)NLPacket::versionInHeader(*packet) + qCDebug(networking) << "Can't process packet: version" << (unsigned int)NLPacket::versionInHeader(*packet) << ", type" << NLPacket::typeInHeader(*packet); #endif continue; From 15c1f5ba307ad36562456c252e3d2a1fb27e4720 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Tue, 27 Feb 2018 16:44:45 -0800 Subject: [PATCH 184/267] fixed log spam undefined error --- scripts/system/libraries/entitySelectionTool.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 8a07ff0d20..a419e9d49c 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1322,8 +1322,9 @@ SelectionDisplay = (function() { isActiveTool(handleScaleRTFCube) || isActiveTool(handleStretchXSphere) || isActiveTool(handleStretchYSphere) || isActiveTool(handleStretchZSphere)); - var showOutlineForZone = (SelectionManager.selections.length === 1 && - SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); + var showOutlineForZone = (SelectionManager.selections.length === 1 && + typeof SelectionManager.savedProperties[SelectionManager.selections[0]] !== "undefined" && + SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); that.setHandleScaleEdgeVisible(showOutlineForZone || (!isActiveTool(handleRotatePitchRing) && !isActiveTool(handleRotateYawRing) && !isActiveTool(handleRotateRollRing))); From 53e1a0cae5fa41ba691e65caace1058867f2da91 Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Thu, 1 Mar 2018 01:53:02 +0300 Subject: [PATCH 185/267] forward 'maybeEnableHmdPreview' if control is not visible --- interface/resources/qml/hifi/commerce/wallet/Wallet.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index ae42b8e3e1..e2f4385965 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -222,6 +222,8 @@ Rectangle { } else { sendToScript(msg); } + } else if (msg.method === 'maybeEnableHmdPreview') { + sendToScript(msg); } } } From b74be92fd8965ae297ad442ede65c4cd933b5fb8 Mon Sep 17 00:00:00 2001 From: David Back Date: Tue, 6 Mar 2018 11:29:43 -0800 Subject: [PATCH 186/267] redo scale handles to fix scaling into avatar collision causing chaos --- .../system/libraries/entitySelectionTool.js | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 8a07ff0d20..3c794f14fb 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -458,12 +458,12 @@ SelectionDisplay = (function() { borderSize: 1.4 }; var handleScaleLBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, -z) - var handleScaleRBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, z) - var handleScaleLBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, -z) + var handleScaleRBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, -z) + var handleScaleLBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, z) var handleScaleRBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, z) var handleScaleLTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, -z) - var handleScaleRTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, z) - var handleScaleLTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, -z) + var handleScaleRTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, -z) + var handleScaleLTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, z) var handleScaleRTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, z) var handlePropertiesScaleEdge = { @@ -1021,7 +1021,6 @@ SelectionDisplay = (function() { return; } - if (SelectionManager.hasSelection()) { var position = SelectionManager.worldPosition; var rotation = spaceMode === SPACE_LOCAL ? SelectionManager.localRotation : SelectionManager.worldRotation; @@ -1147,14 +1146,14 @@ SelectionDisplay = (function() { rotation: scaleCubeRotation, dimensions: scaleCubeDimensions }); - var scaleRBNCubePosition = { x:-scaleCubeOffsetX, y:-scaleCubeOffsetY, z:scaleCubeOffsetZ }; + var scaleRBNCubePosition = { x:scaleCubeOffsetX, y:-scaleCubeOffsetY, z:-scaleCubeOffsetZ }; scaleRBNCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleRBNCubePosition)); Overlays.editOverlay(handleScaleRBNCube, { position: scaleRBNCubePosition, rotation: scaleCubeRotation, dimensions: scaleCubeDimensions }); - var scaleLBFCubePosition = { x:scaleCubeOffsetX, y:-scaleCubeOffsetY, z:-scaleCubeOffsetZ }; + var scaleLBFCubePosition = { x:-scaleCubeOffsetX, y:-scaleCubeOffsetY, z:scaleCubeOffsetZ }; scaleLBFCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleLBFCubePosition)); Overlays.editOverlay(handleScaleLBFCube, { position: scaleLBFCubePosition, @@ -1175,14 +1174,14 @@ SelectionDisplay = (function() { rotation: scaleCubeRotation, dimensions: scaleCubeDimensions }); - var scaleRTNCubePosition = { x:-scaleCubeOffsetX, y:scaleCubeOffsetY, z:scaleCubeOffsetZ }; + var scaleRTNCubePosition = { x:scaleCubeOffsetX, y:scaleCubeOffsetY, z:-scaleCubeOffsetZ }; scaleRTNCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleRTNCubePosition)); Overlays.editOverlay(handleScaleRTNCube, { position: scaleRTNCubePosition, rotation: scaleCubeRotation, dimensions: scaleCubeDimensions }); - var scaleLTFCubePosition = { x:scaleCubeOffsetX, y:scaleCubeOffsetY, z:-scaleCubeOffsetZ }; + var scaleLTFCubePosition = { x:-scaleCubeOffsetX, y:scaleCubeOffsetY, z:scaleCubeOffsetZ }; scaleLTFCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleLTFCubePosition)); Overlays.editOverlay(handleScaleLTFCube, { position: scaleLTFCubePosition, @@ -1236,9 +1235,11 @@ SelectionDisplay = (function() { }); // UPDATE STRETCH HIGHLIGHT PANELS - var scaleLTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTFCubePosition); var scaleRBFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRBFCubePosition); - var stretchPanelXDimensions = Vec3.subtract(scaleLTFCubePositionRotated, scaleRBFCubePositionRotated); + var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition); + var scaleLTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTNCubePosition); + var scaleRTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTNCubePosition); + var stretchPanelXDimensions = Vec3.subtract(scaleRTNCubePositionRotated, scaleRBFCubePositionRotated); var tempY = Math.abs(stretchPanelXDimensions.y); stretchPanelXDimensions.x = STRETCH_PANEL_WIDTH; stretchPanelXDimensions.y = Math.abs(stretchPanelXDimensions.z); @@ -1249,8 +1250,6 @@ SelectionDisplay = (function() { rotation: rotationZ, dimensions: stretchPanelXDimensions }); - var scaleLTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTNCubePosition); - var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition); var stretchPanelYDimensions = Vec3.subtract(scaleLTNCubePositionRotated, scaleRTFCubePositionRotated); var tempX = Math.abs(stretchPanelYDimensions.x); stretchPanelYDimensions.x = Math.abs(stretchPanelYDimensions.z); @@ -1262,9 +1261,7 @@ SelectionDisplay = (function() { rotation: rotationY, dimensions: stretchPanelYDimensions }); - var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition); - var scaleRBNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRBNCubePosition); - var stretchPanelZDimensions = Vec3.subtract(scaleRTFCubePositionRotated, scaleRBNCubePositionRotated); + var stretchPanelZDimensions = Vec3.subtract(scaleLTNCubePositionRotated, scaleRBFCubePositionRotated); var tempX = Math.abs(stretchPanelZDimensions.x); stretchPanelZDimensions.x = Math.abs(stretchPanelZDimensions.y); stretchPanelZDimensions.y = tempX; @@ -1957,7 +1954,11 @@ SelectionDisplay = (function() { }; var onMove = function(event) { - var proportional = (spaceMode === SPACE_WORLD) || event.isShifted || directionEnum === STRETCH_DIRECTION.ALL; + if (event.x === undefined || event.y === undefined) { + return; + } + + var proportional = (spaceMode === SPACE_WORLD) || directionEnum === STRETCH_DIRECTION.ALL; var position, dimensions, rotation; if (spaceMode === SPACE_LOCAL) { @@ -1998,12 +1999,6 @@ SelectionDisplay = (function() { vector = grid.snapToSpacing(vector); var changeInDimensions = Vec3.multiply(NEGATE_VECTOR, vec3Mult(localSigns, vector)); - if (directionEnum === STRETCH_DIRECTION.ALL) { - var toCameraDistance = getDistanceToCamera(position); - var dimensionsMultiple = toCameraDistance * STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE; - changeInDimensions = Vec3.multiply(changeInDimensions, dimensionsMultiple); - } - var newDimensions; if (proportional) { var absoluteX = Math.abs(changeInDimensions.x); @@ -2085,31 +2080,38 @@ SelectionDisplay = (function() { function addHandleScaleTool(overlay, mode, directionEnum) { var directionVector, offset, selectedHandle; if (directionEnum === SCALE_DIRECTION.LBN) { - directionVector = { x:1, y:1, z:1 }; + directionVector = { x:1, y:0, z:1 }; + offset = { x:-1, y:-1, z:-1 }; selectedHandle = handleScaleLBNCube; } else if (directionEnum === SCALE_DIRECTION.RBN) { - directionVector = { x:1, y:1, z:-1 }; + directionVector = { x:-1, y:0, z:1 }; + offset = { x:1, y:-1, z:-1 }; selectedHandle = handleScaleRBNCube; } else if (directionEnum === SCALE_DIRECTION.LBF) { - directionVector = { x:-1, y:1, z:1 }; + directionVector = { x:1, y:0, z:-1 }; + offset = { x:-1, y:-1, z:1 }; selectedHandle = handleScaleLBFCube; } else if (directionEnum === SCALE_DIRECTION.RBF) { - directionVector = { x:-1, y:1, z:-1 }; + directionVector = { x:-1, y:0, z:-1 }; + offset = { x:1, y:-1, z:1 }; selectedHandle = handleScaleRBFCube; } else if (directionEnum === SCALE_DIRECTION.LTN) { - directionVector = { x:1, y:-1, z:1 }; + directionVector = { x:1, y:0, z:1 }; + offset = { x:-1, y:1, z:-1 }; selectedHandle = handleScaleLTNCube; } else if (directionEnum === SCALE_DIRECTION.RTN) { - directionVector = { x:1, y:-1, z:-1 }; + directionVector = { x:-1, y:0, z:1 }; + offset = { x:1, y:1, z:-1 }; selectedHandle = handleScaleRTNCube; } else if (directionEnum === SCALE_DIRECTION.LTF) { - directionVector = { x:-1, y:-1, z:1 }; + directionVector = { x:1, y:0, z:-1 }; + offset = { x:-1, y:1, z:1 }; selectedHandle = handleScaleLTFCube; } else if (directionEnum === SCALE_DIRECTION.RTF) { - directionVector = { x:-1, y:-1, z:-1 }; + directionVector = { x:-1, y:0, z:-1 }; + offset = { x:1, y:1, z:1 }; selectedHandle = handleScaleRTFCube; } - offset = Vec3.multiply(directionVector, NEGATE_VECTOR); var tool = makeStretchTool(mode, STRETCH_DIRECTION.ALL, directionVector, directionVector, offset, null, selectedHandle); return addHandleTool(overlay, tool); From 30206ff33e2a4275cc0f4e82029f52c4d341929b Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 6 Mar 2018 12:28:55 -0800 Subject: [PATCH 187/267] Call killed-avatar slot directly rather than by signal Rename nodeKilled slot to handleKilledAvatar since the node isn't killed in this case and call directly from handleKillAvatarPacket(). --- assignment-client/src/avatars/AvatarMixer.cpp | 27 ++++++++++--------- assignment-client/src/avatars/AvatarMixer.h | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index dd7db5a21d..929941c05c 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -42,7 +42,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : ThreadedAssignment(message) { // make sure we hear about node kills so we can tell the other nodes - connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); + connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &AvatarMixer::handleAvatarKilled); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::AvatarData, this, "queueIncomingPacket"); @@ -423,14 +423,15 @@ void AvatarMixer::throttle(std::chrono::microseconds duration, int frame) { } } -void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { - if (killedNode->getType() == NodeType::Agent - && killedNode->getLinkedData()) { + +void AvatarMixer::handleAvatarKilled(SharedNodePointer avatarNode) { + if (avatarNode->getType() == NodeType::Agent + && avatarNode->getLinkedData()) { auto nodeList = DependencyManager::get(); { // decrement sessionDisplayNames table and possibly remove - QMutexLocker nodeDataLocker(&killedNode->getLinkedData()->getMutex()); - AvatarMixerClientData* nodeData = dynamic_cast(killedNode->getLinkedData()); + QMutexLocker nodeDataLocker(&avatarNode->getLinkedData()->getMutex()); + AvatarMixerClientData* nodeData = dynamic_cast(avatarNode->getLinkedData()); const QString& baseDisplayName = nodeData->getBaseDisplayName(); // No sense guarding against very rare case of a node with no entry, as this will work without the guard and do one less lookup in the common case. if (--_sessionDisplayNames[baseDisplayName].second <= 0) { @@ -447,12 +448,12 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { // we relay avatar kill packets to agents that are not upstream // and downstream avatar mixers, if the node that was just killed was being replicated return (node->getType() == NodeType::Agent && !node->isUpstream()) || - (killedNode->isReplicated() && shouldReplicateTo(*killedNode, *node)); + (avatarNode->isReplicated() && shouldReplicateTo(*avatarNode, *node)); }, [&](const SharedNodePointer& node) { if (node->getType() == NodeType::Agent) { if (!killPacket) { killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason)); - killPacket->write(killedNode->getUUID().toRfc4122()); + killPacket->write(avatarNode->getUUID().toRfc4122()); killPacket->writePrimitive(KillAvatarReason::AvatarDisconnected); } @@ -462,7 +463,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { if (!replicatedKillPacket) { replicatedKillPacket = NLPacket::create(PacketType::ReplicatedKillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason)); - replicatedKillPacket->write(killedNode->getUUID().toRfc4122()); + replicatedKillPacket->write(avatarNode->getUUID().toRfc4122()); replicatedKillPacket->writePrimitive(KillAvatarReason::AvatarDisconnected); } @@ -479,7 +480,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { return false; } - if (node->getUUID() == killedNode->getUUID()) { + if (node->getUUID() == avatarNode->getUUID()) { return false; } @@ -489,7 +490,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { QMetaObject::invokeMethod(node->getLinkedData(), "cleanupKilledNode", Qt::AutoConnection, - Q_ARG(const QUuid&, QUuid(killedNode->getUUID()))); + Q_ARG(const QUuid&, QUuid(avatarNode->getUUID()))); } ); } @@ -605,8 +606,8 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes void AvatarMixer::handleKillAvatarPacket(QSharedPointer message, SharedNodePointer node) { auto start = usecTimestampNow(); - node->stopPingTimer(); - emit(DependencyManager::get()->nodeKilled(node)); + handleAvatarKilled(node); + node->setLinkedData(nullptr); auto end = usecTimestampNow(); _handleKillAvatarPacketElapsedTime += (end - start); diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index cb5f536faa..1fbfd7338b 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -39,7 +39,7 @@ public slots: /// runs the avatar mixer void run() override; - void nodeKilled(SharedNodePointer killedNode); + void handleAvatarKilled(SharedNodePointer killedNode); void sendStatsPacket() override; From 6cc36136bdb3fa3954f05ef960cd7c08dd2cef10 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 6 Mar 2018 12:34:21 -0800 Subject: [PATCH 188/267] Fix assert on interaction with stats and avatarinputs during UI setup --- interface/src/Application.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 53c24ccd5c..719fbf4ae8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2681,7 +2681,6 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("Overlays", &_overlays); surfaceContext->setContextProperty("Window", DependencyManager::get().data()); surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); - surfaceContext->setContextProperty("Stats", Stats::getInstance()); surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); surfaceContext->setContextProperty("ScriptDiscoveryService", DependencyManager::get().data()); surfaceContext->setContextProperty("AvatarBookmarks", DependencyManager::get().data()); @@ -2711,7 +2710,6 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("ApplicationCompositor", &getApplicationCompositor()); - surfaceContext->setContextProperty("AvatarInputs", AvatarInputs::getInstance()); surfaceContext->setContextProperty("Selection", DependencyManager::get().data()); surfaceContext->setContextProperty("ContextOverlay", DependencyManager::get().data()); surfaceContext->setContextProperty("Wallet", DependencyManager::get().data()); @@ -2726,6 +2724,9 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { void Application::onDesktopRootItemCreated(QQuickItem* rootItem) { Stats::show(); AvatarInputs::show(); + auto surfaceContext = DependencyManager::get()->getSurfaceContext(); + surfaceContext->setContextProperty("Stats", Stats::getInstance()); + surfaceContext->setContextProperty("AvatarInputs", AvatarInputs::getInstance()); } void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { From a23884d0e03407841616b4d0bfc6109cc961bcac Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 2 Mar 2018 17:33:28 -0800 Subject: [PATCH 189/267] Prevent crash during long backup web requests --- domain-server/src/DomainServer.cpp | 54 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d2ef1a4156..178345a144 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1937,6 +1937,8 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; + QPointer connectionPtr { connection }; + auto nodeList = DependencyManager::get(); auto getSetting = [this](QString keyPath, QVariant value) -> bool { @@ -2120,30 +2122,38 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url return true; } else if (url.path() == URI_API_BACKUPS) { auto deferred = makePromise("getAllBackupsAndStatus"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonDocument docJSON(QJsonObject::fromVariantMap(result)); - connection->respond(HTTPConnection::StatusCode200, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); + connectionPtr->respond(HTTPConnection::StatusCode200, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); }); _contentManager->getAllBackupsAndStatus(deferred); return true; } else if (url.path().startsWith(URI_API_BACKUPS_ID)) { auto id = url.path().mid(QString(URI_API_BACKUPS_ID).length()); auto deferred = makePromise("consolidateBackup"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonObject rootJSON; auto success = result["success"].toBool(); if (success) { auto path = result["backupFilePath"].toString(); auto file { std::unique_ptr(new QFile(path)) }; if (file->open(QIODevice::ReadOnly)) { - connection->respond(HTTPConnection::StatusCode200, std::move(file)); + connectionPtr->respond(HTTPConnection::StatusCode200, std::move(file)); } else { qCritical(domain_server) << "Unable to load consolidated backup at:" << path << result; - connection->respond(HTTPConnection::StatusCode500, "Error opening backup"); + connectionPtr->respond(HTTPConnection::StatusCode500, "Error opening backup"); } } else { - connection->respond(HTTPConnection::StatusCode400); + connectionPtr->respond(HTTPConnection::StatusCode400); } }); _contentManager->consolidateBackup(deferred, id); @@ -2264,12 +2274,16 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url } else if (uploadedFilename.endsWith(".zip", Qt::CaseInsensitive)) { auto deferred = makePromise("recoverFromUploadedBackup"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonObject rootJSON; auto success = result["success"].toBool(); rootJSON["success"] = success; QJsonDocument docJSON(rootJSON); - connection->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), + connectionPtr->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); }); @@ -2297,12 +2311,16 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url } auto deferred = makePromise("createManualBackup"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonObject rootJSON; auto success = result["success"].toBool(); rootJSON["success"] = success; QJsonDocument docJSON(rootJSON); - connection->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), + connectionPtr->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); }); _contentManager->createManualBackup(deferred, it.value()); @@ -2322,12 +2340,16 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url } else if (url.path().startsWith(URI_API_BACKUPS_RECOVER)) { auto id = url.path().mid(QString(URI_API_BACKUPS_RECOVER).length()); auto deferred = makePromise("recoverFromBackup"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonObject rootJSON; auto success = result["success"].toBool(); rootJSON["success"] = success; QJsonDocument docJSON(rootJSON); - connection->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), + connectionPtr->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); }); _contentManager->recoverFromBackup(deferred, id); @@ -2423,12 +2445,16 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url if (url.path().startsWith(URI_API_BACKUPS_ID)) { auto id = url.path().mid(QString(URI_API_BACKUPS_ID).length()); auto deferred = makePromise("deleteBackup"); - deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + deferred->then([connectionPtr, JSON_MIME_TYPE](QString error, QVariantMap result) { + if (!connectionPtr) { + return; + } + QJsonObject rootJSON; auto success = result["success"].toBool(); rootJSON["success"] = success; QJsonDocument docJSON(rootJSON); - connection->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), + connectionPtr->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), JSON_MIME_TYPE.toUtf8()); }); _contentManager->deleteBackup(deferred, id); From 48aa862c16799a054d5c8c3bd1ddb026990006e4 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 6 Mar 2018 13:52:42 -0800 Subject: [PATCH 190/267] Show Connection instructions in Send Money when 0 connections --- .../commerce/wallet/sendMoney/SendMoney.qml | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml index 07c85a7f6a..5d03296823 100644 --- a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml +++ b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml @@ -398,6 +398,7 @@ Item { // Item { id: filterBarContainer; + visible: !connectionInstructions.visible; // Size height: 40; // Anchors @@ -495,6 +496,78 @@ Item { } } } + + // "Make a Connection" instructions + Rectangle { + id: connectionInstructions; + visible: connectionsModel.count === 0 && !connectionsLoading.visible; + anchors.fill: parent; + color: "white"; + + RalewayRegular { + id: makeAConnectionText; + // Properties + text: "Make a Connection"; + // Anchors + anchors.top: parent.top; + anchors.topMargin: 20; + anchors.left: parent.left; + anchors.right: parent.right; + // Text Size + size: 24; + // Text Positioning + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter; + // Style + color: hifi.colors.darkGray; + } + + Image { + id: connectionImage; + source: "qrc:/icons/connection.svg"; + width: 150; + height: 150; + mipmap: true; + // Anchors + anchors.top: makeAConnectionText.bottom; + anchors.topMargin: 15; + anchors.horizontalCenter: parent.horizontalCenter; + } + + FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } + Text { + id: connectionHelpText; + // Anchors + anchors.top: connectionImage.bottom; + anchors.topMargin: 15; + anchors.left: parent.left + anchors.leftMargin: 40; + anchors.right: parent.right + anchors.rightMargin: 40; + // Text alignment + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHLeft + // Style + font.pixelSize: 18; + font.family: ralewayRegular.name + color: hifi.colors.darkGray + wrapMode: Text.Wrap + textFormat: Text.StyledText; + property string instructions: + "When you meet someone you want to remember later, you can connect with a handshake:

" + property string hmdMountedInstructions: + "1. Put your hand out onto their hand and squeeze your controller's grip button on its side.
" + + "2. Once the other person puts their hand onto yours, you'll see your connection form.
" + + "3. After about 3 seconds, you're connected!" + property string hmdNotMountedInstructions: + "1. Press and hold the 'x' key to extend your arm.
" + + "2. Once the other person puts their hand onto yours, you'll see your connection form.
" + + "3. After about 3 seconds, you're connected!"; + // Text + text: + HMD.mounted ? instructions + hmdMountedInstructions : instructions + hmdNotMountedInstructions + } + } } } } From a83b54e10dd63f312d143b6b9ac1b850410f7900 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 6 Mar 2018 13:52:41 -0800 Subject: [PATCH 191/267] fix for getSetting QVariant ref in DomainServer --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d2ef1a4156..cf99ca4344 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1939,7 +1939,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url auto nodeList = DependencyManager::get(); - auto getSetting = [this](QString keyPath, QVariant value) -> bool { + auto getSetting = [this](QString keyPath, QVariant& value) -> bool { value = _settingsManager.valueForKeyPath(keyPath); if (!value.isValid()) { From 47e8e26255d267f450d7143f0c35ea2d8eece588 Mon Sep 17 00:00:00 2001 From: David Back Date: Tue, 6 Mar 2018 14:04:15 -0800 Subject: [PATCH 192/267] CR indent fixes --- .../system/libraries/entitySelectionTool.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 3c794f14fb..a4acbbf67c 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1954,10 +1954,10 @@ SelectionDisplay = (function() { }; var onMove = function(event) { - if (event.x === undefined || event.y === undefined) { - return; - } - + if (event.x === undefined || event.y === undefined) { + return; + } + var proportional = (spaceMode === SPACE_WORLD) || directionEnum === STRETCH_DIRECTION.ALL; var position, dimensions, rotation; @@ -2081,35 +2081,35 @@ SelectionDisplay = (function() { var directionVector, offset, selectedHandle; if (directionEnum === SCALE_DIRECTION.LBN) { directionVector = { x:1, y:0, z:1 }; - offset = { x:-1, y:-1, z:-1 }; + offset = { x:-1, y:-1, z:-1 }; selectedHandle = handleScaleLBNCube; } else if (directionEnum === SCALE_DIRECTION.RBN) { directionVector = { x:-1, y:0, z:1 }; - offset = { x:1, y:-1, z:-1 }; + offset = { x:1, y:-1, z:-1 }; selectedHandle = handleScaleRBNCube; } else if (directionEnum === SCALE_DIRECTION.LBF) { directionVector = { x:1, y:0, z:-1 }; - offset = { x:-1, y:-1, z:1 }; + offset = { x:-1, y:-1, z:1 }; selectedHandle = handleScaleLBFCube; } else if (directionEnum === SCALE_DIRECTION.RBF) { directionVector = { x:-1, y:0, z:-1 }; - offset = { x:1, y:-1, z:1 }; + offset = { x:1, y:-1, z:1 }; selectedHandle = handleScaleRBFCube; } else if (directionEnum === SCALE_DIRECTION.LTN) { directionVector = { x:1, y:0, z:1 }; - offset = { x:-1, y:1, z:-1 }; + offset = { x:-1, y:1, z:-1 }; selectedHandle = handleScaleLTNCube; } else if (directionEnum === SCALE_DIRECTION.RTN) { directionVector = { x:-1, y:0, z:1 }; - offset = { x:1, y:1, z:-1 }; + offset = { x:1, y:1, z:-1 }; selectedHandle = handleScaleRTNCube; } else if (directionEnum === SCALE_DIRECTION.LTF) { directionVector = { x:1, y:0, z:-1 }; - offset = { x:-1, y:1, z:1 }; + offset = { x:-1, y:1, z:1 }; selectedHandle = handleScaleLTFCube; } else if (directionEnum === SCALE_DIRECTION.RTF) { directionVector = { x:-1, y:0, z:-1 }; - offset = { x:1, y:1, z:1 }; + offset = { x:1, y:1, z:1 }; selectedHandle = handleScaleRTFCube; } var tool = makeStretchTool(mode, STRETCH_DIRECTION.ALL, directionVector, From 97d283cc5f3d18628a69e55334c8e91e5a3d65b5 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 6 Mar 2018 16:17:27 -0800 Subject: [PATCH 193/267] use correct api call for audio and correct function call to set stereo input mode --- interface/resources/qml/hifi/audio/Audio.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index 156332579a..684a732286 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -131,7 +131,7 @@ Rectangle { text: qsTr("use stereo for stereo devices"); checked: false; onClicked: { - var success = Audio.setIsStereoInput(checked); + var success = AudioScriptingInterface.setStereoInput(checked); if (!success) { checked = !checked; } @@ -219,7 +219,7 @@ Rectangle { onPressed: { if (!checked) { stereoMic.checked = false; - Audio.setIsStereoInput(false); // the next selected audio device might not support stereo + AudioScriptingInterface.setStereoInput(false); // the next selected audio device might not support stereo AudioScriptingInterface.setInputDevice(info, bar.currentIndex === 1); } } From 05e9aa52c90fc07786aed06a2579da8634cdce9e Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 6 Mar 2018 16:22:54 -0800 Subject: [PATCH 194/267] Moved can-cast-shadow checkbox to behaviour section. --- scripts/system/html/entityProperties.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index d6710238fb..7389442649 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -61,10 +61,6 @@ -
- - -
@@ -317,6 +313,10 @@
+
+ + +
From 17c12fde9c66ca0fd723b478eee7aa4b93fab588 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 6 Mar 2018 16:32:04 -0800 Subject: [PATCH 195/267] Fix for HandshakeRequest logic --- libraries/networking/src/udt/Connection.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 77ed589e0b..b34c05106f 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -578,6 +578,7 @@ void Connection::processControl(ControlPacketPointer controlPacket) { #ifdef UDT_CONNECTION_DEBUG qCDebug(networking) << "Got handshake request, stopping SendQueue"; #endif + _hasReceivedHandshakeACK = false; stopSendQueue(); } break; From 4b3d63eea4952c46749593fdb49d1e79699172d2 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 6 Mar 2018 16:37:05 -0800 Subject: [PATCH 196/267] Added math.h to includes (MacOS build error). --- tools/auto-tester/src/Test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 53687fdeda..2b3d121638 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -21,6 +21,8 @@ #include "ui/AutoTester.h" extern AutoTester* autoTester; +#include + Test::Test() { QString regex(EXPECTED_IMAGE_PREFIX + QString("\\\\d").repeated(NUM_DIGITS) + ".png"); From 251e4a312736cba17c7e4a51e0f38cd7029dc561 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Tue, 6 Mar 2018 16:35:49 -0800 Subject: [PATCH 197/267] Fixed blocks importer textures being interpreted as image entities --- interface/src/Application.cpp | 18 +++++++++--------- interface/src/Application.h | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index af159263ed..189b4c02bc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6607,17 +6607,17 @@ void Application::addAssetToWorld(QString path, QString zipFile, bool isZip, boo addAssetToWorldInfo(filename, "Adding " + mapping.mid(1) + " to the Asset Server."); - addAssetToWorldWithNewMapping(path, mapping, 0); + addAssetToWorldWithNewMapping(path, mapping, 0, isBlocks); } -void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy) { +void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isBlocks) { auto request = DependencyManager::get()->createGetMappingRequest(mapping); QObject::connect(request, &GetMappingRequest::finished, this, [=](GetMappingRequest* request) mutable { const int MAX_COPY_COUNT = 100; // Limit number of duplicate assets; recursion guard. auto result = request->getError(); if (result == GetMappingRequest::NotFound) { - addAssetToWorldUpload(filePath, mapping); + addAssetToWorldUpload(filePath, mapping, isBlocks); } else if (result != GetMappingRequest::NoError) { QString errorInfo = "Could not map asset name: " + mapping.left(mapping.length() - QString::number(copy).length() - 1); @@ -6629,7 +6629,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin } copy++; mapping = mapping.insert(mapping.lastIndexOf("."), "-" + QString::number(copy)); - addAssetToWorldWithNewMapping(filePath, mapping, copy); + addAssetToWorldWithNewMapping(filePath, mapping, copy, isBlocks); } else { QString errorInfo = "Too many copies of asset name: " + mapping.left(mapping.length() - QString::number(copy).length() - 1); @@ -6642,7 +6642,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin request->start(); } -void Application::addAssetToWorldUpload(QString filePath, QString mapping) { +void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isBlocks) { qInfo(interfaceapp) << "Uploading" << filePath << "to Asset Server as" << mapping; auto upload = DependencyManager::get()->createUpload(filePath); QObject::connect(upload, &AssetUpload::finished, this, [=](AssetUpload* upload, const QString& hash) mutable { @@ -6651,7 +6651,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping) { qWarning(interfaceapp) << "Error downloading model: " + errorInfo; addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { - addAssetToWorldSetMapping(filePath, mapping, hash); + addAssetToWorldSetMapping(filePath, mapping, hash, isBlocks); } // Remove temporary directory created by Clara.io market place download. @@ -6668,7 +6668,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping) { upload->start(); } -void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash) { +void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isBlocks) { auto request = DependencyManager::get()->createSetMappingRequest(mapping, hash); connect(request, &SetMappingRequest::finished, this, [=](SetMappingRequest* request) mutable { if (request->getError() != SetMappingRequest::NoError) { @@ -6677,8 +6677,8 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { // to prevent files that aren't models from being loaded into world automatically - if (filePath.endsWith(OBJ_EXTENSION) || filePath.endsWith(FBX_EXTENSION) || - filePath.endsWith(JPG_EXTENSION) || filePath.endsWith(PNG_EXTENSION)) { + if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || + filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && (!isBlocks)) { addAssetToWorldAddEntity(filePath, mapping); } else { qCDebug(interfaceapp) << "Zipped contents are not supported entity files"; diff --git a/interface/src/Application.h b/interface/src/Application.h index ad12a4dc67..8b8e76d584 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -322,9 +322,9 @@ public slots: void addAssetToWorldFromURLRequestFinished(); void addAssetToWorld(QString filePath, QString zipFile, bool isZip, bool isBlocks); void addAssetToWorldUnzipFailure(QString filePath); - void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy); - void addAssetToWorldUpload(QString filePath, QString mapping); - void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash); + void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isBlocks); + void addAssetToWorldUpload(QString filePath, QString mapping, bool isBlocks); + void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isBlocks); void addAssetToWorldAddEntity(QString filePath, QString mapping); void handleUnzip(QString sourceFile, QStringList destinationFile, bool autoAdd, bool isZip, bool isBlocks); From 243e79df4aa44291f70d378bd668a7ff9ae60ecd Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 6 Mar 2018 21:59:59 -0300 Subject: [PATCH 198/267] Fix merge of radar.js --- scripts/system/+android/radar.js | 114 ------------------------------- 1 file changed, 114 deletions(-) diff --git a/scripts/system/+android/radar.js b/scripts/system/+android/radar.js index 665ca26a12..84fb66403f 100644 --- a/scripts/system/+android/radar.js +++ b/scripts/system/+android/radar.js @@ -921,7 +921,6 @@ function saveAvatarData(QUuid) { if (avatarsData[QUuid] != undefined) { avatarsData[QUuid].position = avat.position; } else { -<<<<<<< HEAD var avatarIcon = Overlays.addOverlay("circle3d", { color: uniqueColor.convertHexToRGB(uniqueColor.getColor(QUuid)), dimensions: ICON_ENTITY_DEFAULT_DIMENSIONS, @@ -930,20 +929,6 @@ function saveAvatarData(QUuid) { outerRadius: 2, isSolid: true, visible: false -======= - var avatarIcon = Overlays.addOverlay("image3d", { - subImage : { - x : 0, - y : 0, - width : 150, - height : 142 - }, - url : getAvatarIconForUser(QUuid), - dimensions : ICON_ENTITY_DEFAULT_DIMENSIONS, - visible : false, - ignoreRayIntersection : false, - orientation : Quat.fromPitchYawRollDegrees(-90, 0, 0) ->>>>>>> upstream/master }); var needRefresh = !avat || !avat.displayName; @@ -951,7 +936,6 @@ function saveAvatarData(QUuid) { : "Unknown"; var textWidth = displayName.length * AVATAR_DISPLAY_NAME_CHAR_WIDTH; var avatarName = Overlays.addOverlay("text", { -<<<<<<< HEAD width: textWidth, height: AVATAR_DISPLAY_NAME_HEIGHT, color: { red: 255, green: 255, blue: 255}, @@ -961,28 +945,6 @@ function saveAvatarData(QUuid) { visible: false, text: displayName, textAlignCenter: true -======= - width : textWidth, - height : AVATAR_DISPLAY_NAME_HEIGHT, - color : { - red : 255, - green : 255, - blue : 255 - }, - backgroundAlpha : 0.0, - textRaiseColor : { - red : 0, - green : 0, - blue : 0 - }, - font : { - size : 68, - bold : true - }, - visible : false, - text : displayName, - textAlignCenter : true ->>>>>>> upstream/master }); avatarsIcons.push(avatarIcon); avatarsNames.push(avatarName); @@ -1050,7 +1012,6 @@ function distanceForCameraHeight(h) { return 5; } function renderMyAvatarIcon() { -<<<<<<< HEAD var commonY = Camera.position.y - distanceForCameraHeight(Camera.position.y); var iconPos = findLineToHeightIntersectionCoords( MyAvatar.position.x, MyAvatar.position.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, @@ -1058,17 +1019,6 @@ function renderMyAvatarIcon() { Camera.position.x, Camera.position.y, Camera.position.z, commonY); if (!iconPos) { printd("avatarmy icon pos null"); return;} -======= - var iconPos = findLineToHeightIntersectionCoords(MyAvatar.position.x, - MyAvatar.position.y + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, - MyAvatar.position.z, Camera.position.x, Camera.position.y, - Camera.position.z, Camera.position.y - - RADAR_CAMERA_DISTANCE_TO_ICONS); - if (!iconPos) { - printd("avatarmy icon pos null"); - return; - } ->>>>>>> upstream/master var iconDimensions = avatarIconPlaneDimensions(); var avatarPos = MyAvatar.position; @@ -1084,7 +1034,6 @@ function renderMyAvatarIcon() { var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) / (borderPoints[1].z - borderPoints[0].z); -<<<<<<< HEAD if (!myAvatarIcon && MyAvatar.SELF_ID) { myAvatarIcon = Overlays.addOverlay("circle3d", { color: uniqueColor.convertHexToRGB(uniqueColor.getColor(MyAvatar.SELF_ID)), @@ -1094,27 +1043,11 @@ function renderMyAvatarIcon() { outerRadius: 2, isSolid: true, visible: false -======= - if (!myAvatarIcon && MyAvatar.sessionUUID) { - myAvatarIcon = Overlays.addOverlay("image3d", { - subImage : { - x : 0, - y : 0, - width : 150, - height : 142 - }, - url : getAvatarIconForUser(MyAvatar.sessionUUID), - dimensions : ICON_ENTITY_DEFAULT_DIMENSIONS, - visible : false, - ignoreRayIntersection : false, - orientation : Quat.fromPitchYawRollDegrees(-90, 0, 0) ->>>>>>> upstream/master }); } if (!myAvatarName) { myAvatarName = Overlays.addOverlay("text", { -<<<<<<< HEAD width: 100, height: AVATAR_DISPLAY_NAME_HEIGHT, textAlignCenter: true, @@ -1125,29 +1058,6 @@ function renderMyAvatarIcon() { visible: false, text: "Me" }); -======= - width : 40, - height : AVATAR_DISPLAY_NAME_HEIGHT, - textAlignCenter : true, - color : { - red : 255, - green : 255, - blue : 255 - }, - backgroundAlpha : 0.0, - font : { - size : 68, - bold : true - }, - textRaiseColor : { - red : 0, - green : 0, - blue : 0 - }, - visible : false, - text : "Me" - }); ->>>>>>> upstream/master } if (myAvatarIcon) { @@ -1209,7 +1119,6 @@ function renderAllOthersAvatarIcons() { avatarPos = AvatarList.getAvatar(QUuid).position; var cameraPos = Camera.position; -<<<<<<< HEAD var p1 = findLineToHeightIntersectionCoords(avatarPos.x, avatarPos.y, avatarPos.z, cameraPos.x, cameraPos.y, cameraPos.z, commonY); @@ -1222,29 +1131,6 @@ function renderAllOthersAvatarIcons() { Camera.position.x, Camera.position.y, Camera.position.z, commonY); if (!iconPos) { print ("avatar icon pos bad for " + QUuid); continue; } -======= - var p1 = findLineToHeightIntersectionCoords(avatarPos.x, - avatarPos.y, avatarPos.z, cameraPos.x, cameraPos.y, - cameraPos.z, commonY); - - var x = (p1.x - borderPoints[0].x) * (Window.innerWidth) - / (borderPoints[1].x - borderPoints[0].x); - var y = (p1.z - borderPoints[0].z) * (Window.innerHeight) - / (borderPoints[1].z - borderPoints[0].z); - - if (avatarsData[QUuid].icon != undefined) { - var iconPos = findLineToHeightIntersectionCoords( - avatarPos.x, - avatarPos.y - + RADAR_ICONS_APPARENT_DISTANCE_TO_AVATAR_BASE, - avatarPos.z, Camera.position.x, Camera.position.y, - Camera.position.z, Camera.position.y - - RADAR_CAMERA_DISTANCE_TO_ICONS); - if (!iconPos) { - print("avatar icon pos bad for " + QUuid); - continue; - } ->>>>>>> upstream/master if (avatarsData[QUuid].needRefresh) { var avat = AvatarList.getAvatar(QUuid); if (avat && avat.displayName) { From 866bec0b34da3dc8da1c7ffd741d08e86ed919be Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Mar 2018 02:36:07 +0100 Subject: [PATCH 199/267] rule -> role --- interface/src/avatar/MyAvatar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index fa5206e128..d48d059bed 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -346,7 +346,7 @@ public: * restoreRoleAnimation() is used to restore a specified animation role's default animation clip. If you have not specified an override animation * for the specified role, this function will have no effect. * @function MyAvatar.restoreRoleAnimation - * @param rule {string} The animation role clip to restore + * @param role {string} The animation role clip to restore */ Q_INVOKABLE void restoreRoleAnimation(const QString& role); From 923c81ae2863f7154270f85a08369b4dff4e6c7c Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 6 Mar 2018 17:38:27 -0800 Subject: [PATCH 200/267] Swap order of the ZoneRendererJob with DrawLocalLights to fix the local lights --- libraries/render-utils/src/RenderDeferredTask.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index f262307944..50620bfcce 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -142,13 +142,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto ambientOcclusionFramebuffer = ambientOcclusionOutputs.getN(0); const auto ambientOcclusionUniforms = ambientOcclusionOutputs.getN(1); - + // Clear Light, Haze and Skybox Stages and render zones from the general metas bucket + const auto zones = task.addJob("ZoneRenderer", metas); + // 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); - // Filter zones from the general metas bucket - const auto zones = task.addJob("ZoneRenderer", metas); - // Light Clustering // Create the cluster grid of lights, cpu job for now const auto lightClusteringPassInputs = LightClusteringPass::Inputs(deferredFrameTransform, lightingModel, linearDepthTarget).asVarying(); From c6e5f4c9c83774d323f7408f1d7b7a8f4e452765 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Tue, 6 Mar 2018 19:24:09 -0800 Subject: [PATCH 201/267] zip file drags don't auto add model textures --- interface/src/Application.cpp | 17 +++++++++-------- interface/src/Application.h | 8 ++++---- .../src/FileScriptingInterface.cpp | 13 +++++++++++++ .../script-engine/src/FileScriptingInterface.h | 1 + 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 189b4c02bc..9a04a9509e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6607,17 +6607,17 @@ void Application::addAssetToWorld(QString path, QString zipFile, bool isZip, boo addAssetToWorldInfo(filename, "Adding " + mapping.mid(1) + " to the Asset Server."); - addAssetToWorldWithNewMapping(path, mapping, 0, isBlocks); + addAssetToWorldWithNewMapping(path, mapping, 0, isZip, isBlocks); } -void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isBlocks) { +void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip, bool isBlocks) { auto request = DependencyManager::get()->createGetMappingRequest(mapping); QObject::connect(request, &GetMappingRequest::finished, this, [=](GetMappingRequest* request) mutable { const int MAX_COPY_COUNT = 100; // Limit number of duplicate assets; recursion guard. auto result = request->getError(); if (result == GetMappingRequest::NotFound) { - addAssetToWorldUpload(filePath, mapping, isBlocks); + addAssetToWorldUpload(filePath, mapping, isZip, isBlocks); } else if (result != GetMappingRequest::NoError) { QString errorInfo = "Could not map asset name: " + mapping.left(mapping.length() - QString::number(copy).length() - 1); @@ -6629,7 +6629,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin } copy++; mapping = mapping.insert(mapping.lastIndexOf("."), "-" + QString::number(copy)); - addAssetToWorldWithNewMapping(filePath, mapping, copy, isBlocks); + addAssetToWorldWithNewMapping(filePath, mapping, copy, isZip, isBlocks); } else { QString errorInfo = "Too many copies of asset name: " + mapping.left(mapping.length() - QString::number(copy).length() - 1); @@ -6642,7 +6642,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin request->start(); } -void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isBlocks) { +void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isZip, bool isBlocks) { qInfo(interfaceapp) << "Uploading" << filePath << "to Asset Server as" << mapping; auto upload = DependencyManager::get()->createUpload(filePath); QObject::connect(upload, &AssetUpload::finished, this, [=](AssetUpload* upload, const QString& hash) mutable { @@ -6651,7 +6651,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool qWarning(interfaceapp) << "Error downloading model: " + errorInfo; addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { - addAssetToWorldSetMapping(filePath, mapping, hash, isBlocks); + addAssetToWorldSetMapping(filePath, mapping, hash, isZip, isBlocks); } // Remove temporary directory created by Clara.io market place download. @@ -6668,7 +6668,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool upload->start(); } -void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isBlocks) { +void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip, bool isBlocks) { auto request = DependencyManager::get()->createSetMappingRequest(mapping, hash); connect(request, &SetMappingRequest::finished, this, [=](SetMappingRequest* request) mutable { if (request->getError() != SetMappingRequest::NoError) { @@ -6678,7 +6678,8 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q } else { // to prevent files that aren't models from being loaded into world automatically if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || - filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && (!isBlocks)) { + filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && + (!isBlocks) && (!isZip)) { addAssetToWorldAddEntity(filePath, mapping); } else { qCDebug(interfaceapp) << "Zipped contents are not supported entity files"; diff --git a/interface/src/Application.h b/interface/src/Application.h index 8b8e76d584..e4d784f2d5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -320,11 +320,11 @@ public slots: // FIXME: Move addAssetToWorld* methods to own class? void addAssetToWorldFromURL(QString url); void addAssetToWorldFromURLRequestFinished(); - void addAssetToWorld(QString filePath, QString zipFile, bool isZip, bool isBlocks); + void addAssetToWorld(QString filePath, QString zipFile, bool isZip = false, bool isBlocks = false); void addAssetToWorldUnzipFailure(QString filePath); - void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isBlocks); - void addAssetToWorldUpload(QString filePath, QString mapping, bool isBlocks); - void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isBlocks); + void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip = false, bool isBlocks = false); + void addAssetToWorldUpload(QString filePath, QString mapping, bool isZip = false, bool isBlocks = false); + void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip = false, bool isBlocks = false); void addAssetToWorldAddEntity(QString filePath, QString mapping); void handleUnzip(QString sourceFile, QStringList destinationFile, bool autoAdd, bool isZip, bool isBlocks); diff --git a/libraries/script-engine/src/FileScriptingInterface.cpp b/libraries/script-engine/src/FileScriptingInterface.cpp index 1472e53045..3bf044fd8b 100644 --- a/libraries/script-engine/src/FileScriptingInterface.cpp +++ b/libraries/script-engine/src/FileScriptingInterface.cpp @@ -68,6 +68,10 @@ void FileScriptingInterface::runUnzip(QString path, QUrl url, bool autoAdd, bool if (path.contains("vr.google.com/downloads")) { isZip = true; } + if (!hasModel(fileList)) { + isZip = false; + } + emit unzipResult(path, fileList, autoAdd, isZip, isBlocks); } @@ -107,6 +111,15 @@ bool FileScriptingInterface::isTempDir(QString tempDir) { return (testContainer == tempContainer); } +bool FileScriptingInterface::hasModel(QStringList fileList) { + for (int i = 0; i < fileList.size(); i++) { + if (fileList.at(i).toLower().contains(".fbx") || fileList.at(i).toLower().contains(".obj")) { + return true; + } + } + return false; +} + QString FileScriptingInterface::getTempDir() { QTemporaryDir dir; dir.setAutoRemove(false); diff --git a/libraries/script-engine/src/FileScriptingInterface.h b/libraries/script-engine/src/FileScriptingInterface.h index e4c27dbf7f..5cbe417130 100644 --- a/libraries/script-engine/src/FileScriptingInterface.h +++ b/libraries/script-engine/src/FileScriptingInterface.h @@ -32,6 +32,7 @@ signals: private: bool isTempDir(QString tempDir); + bool hasModel(QStringList fileList); QStringList unzipFile(QString path, QString tempDir); void recursiveFileScan(QFileInfo file, QString* dirName); void downloadZip(QString path, const QString link); From eeb7f5ca8df3369dd7f34ab508dabfb64a101a04 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 7 Mar 2018 17:29:39 +1300 Subject: [PATCH 202/267] Doc review --- interface/src/avatar/AvatarActionFarGrab.h | 3 +- interface/src/avatar/AvatarActionHold.cpp | 4 +- .../entities/src/EntityDynamicInterface.cpp | 8 +- .../entities/src/EntityItemProperties.cpp | 133 ++++++++++-------- .../entities/src/EntityScriptingInterface.h | 53 +++---- libraries/entities/src/EntityTypes.h | 18 ++- libraries/entities/src/HazePropertyGroup.h | 2 +- .../src/model-networking/MaterialCache.cpp | 4 +- .../octree/src/OctreeScriptingInterface.h | 5 +- libraries/shared/src/PhysicsCollisionGroups.h | 3 +- 10 files changed, 133 insertions(+), 100 deletions(-) diff --git a/interface/src/avatar/AvatarActionFarGrab.h b/interface/src/avatar/AvatarActionFarGrab.h index c93f243551..97d4a6bb03 100644 --- a/interface/src/avatar/AvatarActionFarGrab.h +++ b/interface/src/avatar/AvatarActionFarGrab.h @@ -17,7 +17,8 @@ /**jsdoc * The "far-grab" {@link Entities.ActionType|ActionType} moves and rotates an entity to a target position and - * orientation, optionally relative to another entity, such that the entity doesn't collide with the user's avatar. + * orientation, optionally relative to another entity. Collisions between the entity and the user's avatar are disabled during + * the far-grab. * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. * * @typedef {object} Entities.ActionArguments-FarGrab diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 0d7129181b..9d568e6d73 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -417,8 +417,8 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { } /**jsdoc - * The "hold" {@link Entities.ActionType|ActionType} positions and rotates an entity relative to an avatar's hand, - * without collisions between the entity and the holding avatar. + * The "hold" {@link Entities.ActionType|ActionType} positions and rotates an entity relative to an avatar's hand. + * Collisions between the entity and the user's avatar are disabled during the hold. * It has arguments in addition to the common {@link Entities.ActionArguments|ActionArguments}. * * @typedef {object} Entities.ActionArguments-Hold diff --git a/libraries/entities/src/EntityDynamicInterface.cpp b/libraries/entities/src/EntityDynamicInterface.cpp index 9ff39fe5b4..d43bdd7b51 100644 --- a/libraries/entities/src/EntityDynamicInterface.cpp +++ b/libraries/entities/src/EntityDynamicInterface.cpp @@ -102,12 +102,12 @@ variables. These argument variables are used by the code which is run when bull * * * "far-grab"Avatar action -* Moves and rotates an entity to a target position and orientation, optionally relative to another entity, such that -* the entity doesn't collide with the user's avatar. +* Moves and rotates an entity to a target position and orientation, optionally relative to another entity. Collisions +* between the entity and the user's avatar are disabled during the far-grab. * {@link Entities.ActionArguments-FarGrab} * "hold"Avatar action -* Positions and rotates an entity relative to an avatar's hand, without collisions between the entity and the holding -* avatar. +* Positions and rotates an entity relative to an avatar's hand. Collisions between the entity and the user's avatar +* are disabled during the hold. * {@link Entities.ActionArguments-Hold} * "offset"Object action * Moves an entity so that it is a set distance away from a target point. diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index a6f15c5fdd..324cf15a07 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -447,8 +447,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties * @property {Uuid} id - The ID of the entity. Read-only. * @property {string} name="" - A name for the entity. Need not be unique. - * @property {Entities.EntityType} type - The entity type. You cannot change the type of an entity after it's created. - * Read-only. + * @property {Entities.EntityType} type - The entity type. You cannot change the type of an entity after it's created. (Though + * its value may switch among "Box", "Shape", and "Sphere" depending on changes to + * the shape property set for entities of these types.) Read-only. * @property {boolean} clientOnly=false - If true then the entity is an avatar entity, otherwise it is a server * entity. Read-only. * @property {Uuid} owningAvatarID=Uuid.NULL - The session ID of the owning avatar if clientOnly is @@ -510,7 +511,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * 10.0. The higher the value, the more quickly it slows down. Examples: 0.1 for ice, * 0.9 for sandpaper. * @property {number} density=1000 - The density of the entity in kg/m3, 100 for balsa wood – - * 10000 for silver. The density is used in conjunction with the entity's collision volume to work out its + * 10000 for silver. The density is used in conjunction with the entity's bounding box volume to work out its * mass in the application of physics. * * @property {boolean} collisionless=false - Whether or not the entity should collide with items per its @@ -528,13 +529,17 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {string} href="" - A "hifi://" metaverse address that a user is taken to when they click on the entity. * @property {string} description="" - A description of the href property value. * - * @property {string} userData="" - Intended to be used to store extra data about the entity in JSON format. WARNING: Other - * apps such as the Create app can also use this property, so make sure you handle data stored by other apps. + * @property {string} userData="" - Used to store extra data about the entity in JSON format. WARNING: Other apps such as the + * Create app can also use this property, so make sure you handle data stored by other apps — edit only your bit and + * leave the rest of the data intact. You can use JSON.parse() to parse the string into a JavaScript object + * which you can manipulate the properties of, and use JSON.stringify() to convert the object into a string to + * put in the property. * * @property {string} script="" - The URL of the client entity script, if any, that is attached to the entity. * @property {number} scriptTimestamp=0 - Intended to be used to indicate when the client entity script was loaded. Should be * an integer number of milliseconds since midnight GMT on January 1, 1970 (e.g., as supplied by Date.now(). - * If you update the property's value, the script is re-downloaded and reloaded. + * If you update the property's value, the script is re-downloaded and reloaded. This is how the "reload" + * button beside the "script URL" field in properties tab of the Create app works. * @property {string} serverScripts="" - The URL of the server entity script, if any, that is attached to the entity. * * @property {Uuid} parentID=Uuid.NULL - The ID of the entity or avatar that this entity is parented to. {@link Uuid|Uuid.NULL} @@ -564,7 +569,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {string} actionData="" - Base-64 encoded compressed dump of the actions associated with the entity. This property * is typically not used in scripts directly; rather, functions that manipulate an entity's actions update it. * The size of this property increases with the number of actions. Because this property value has to fit within a High - * Fidelity datagram packet there is a limit to the number of actions that an entity can have. + * Fidelity datagram packet there is a limit to the number of actions that an entity can have, and edits which would result + * in overflow are rejected. * Read-only. * @property {Entities.RenderInfo} renderInfo - Information on the cost of rendering the entity. Currently information is only * provided for Model entities. Read-only. @@ -603,9 +609,10 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { /**jsdoc * The "Box" {@link Entities.EntityType|EntityType} is the same as the "Shape" - * {@link Entities.EntityType|EntityType} except that its initial shape value is always set to "Cube" - * when the entity is created. This property value can subsequently be changed (i.e. so that the entity is no longer displayed - * as a cube). + * {@link Entities.EntityType|EntityType} except that its shape value is always set to "Cube" + * when the entity is created. If its shape property value is subsequently changed then the entity's + * type will be reported as "Sphere" if the shape is set to "Sphere", + * otherwise it will be reported as "Shape". * @typedef {object} Entities.EntityProperties-Box */ @@ -619,7 +626,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {number} intensity=1 - The brightness of the light. * @property {number} falloffRadius=0.1 - The distance from the light's center at which intensity is reduced by 25%. * @property {boolean} isSpotlight=false - If true then the light is directional, emitting along the entity's - * negative z-axis; otherwise the light is a point light which emanates in all directions. + * local negative z-axis; otherwise the light is a point light which emanates in all directions. * @property {number} exponent=0 - Affects the softness of the spotlight beam: the higher the value the softer the beam. * @property {number} cutoff=1.57 - Affects the size of the spotlight beam: the higher the value the larger the beam. * @example Create a spotlight pointing at the ground. @@ -724,15 +731,16 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-Model * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. When adding an entity, if no dimensions * value is specified then the model is automatically sized to its - * {@link Entityes.EntityProperties|naturalDimensions}. + * {@link Entities.EntityProperties|naturalDimensions}. * @property {Color} color=255,255,255 - Currently not used. * @property {string} modelURL="" - The URL of the FBX of OBJ model. Baked FBX models' URLs end in ".baked.fbx".
* Note: If the name ends with "default-image-model.fbx" then the entity is considered to be an "Image" * entity, in which case the textures property should be set per the example. * @property {string} textures="" - A JSON string of texture name, URL pairs used when rendering the model in place of the - * model's original textures. Only the texture names and URLs to be overridden need be specified; original textures are - * used where there are no overrides. You can use JSON.stringify() to convert a JavaScript object of name, URL - * pairs into a JSON string. + * model's original textures. Use a texture name from the originanlTextures property to override that texture. + * Only the texture names and URLs to be overridden need be specified; original textures are used where there are no + * overrides. You can use JSON.stringify() to convert a JavaScript object of name, URL pairs into a JSON + * string. * @property {string} originalTextures="{}" - A JSON string of texture name, URL pairs used in the model. The property value is * filled in after the entity has finished rezzing (i.e., textures have loaded). You can use JSON.parse() to * parse the JSON string into a JavaScript object of name, URL pairs. Read-only. @@ -773,7 +781,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * dimensions: { x: 0.0945, y: 0.0921, z: 0.0423 }, * lifetime: 300 // Delete after 5 minutes. * }); - * @example Crate an "Image" entity like the Create app. + * @example Create an "Image" entity like you can in the Create app. * var IMAGE_MODEL = "https://hifi-content.s3.amazonaws.com/DomainContent/production/default-image-model.fbx"; * var DEFAULT_IMAGE = "https://hifi-content.s3.amazonaws.com/DomainContent/production/no-image.jpg"; * var entity = Entities.addEntity({ @@ -807,7 +815,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {number} emitSpeed=5 - The speed, in m/s, that each particle is emitted at. * @property {number} speedSpread=1 - The spread in speeds at which particles are emitted at. If emitSpeed == 5 * and speedSpread == 1, particles will be emitted with speeds in the range 4m/s – 6m/s. - * @property {vec3} emitAcceleration=0,-9.8,0 - The acceleration that is applied to each particle during its lifetime. + * @property {vec3} emitAcceleration=0,-9.8,0 - The acceleration that is applied to each particle during its lifetime. The + * default is Earth's gravity value. * @property {vec3} accelerationSpread=0,0,0 - The spread in accelerations that each particle is given. If * emitAccelerations == {x: 0, y: -9.8, z: 0} and accelerationSpread == * {x: 0, y: 1, z: 0}, each particle will have an acceleration in the range, {x: 0, y: -10.8, z: 0} @@ -818,40 +827,46 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * otherwise they stay with the entity's dimensions. * * @property {Quat} emitOrientation=-0.707,0,0,0.707 - The orientation of particle emission relative to the entity's axes. By - * default, particles emit along the entity's z-axis, and azimuthStart and azimuthFinish are - * relative to the entity's x-axis. The default value is a rotation of -90 degrees about the x-axis, i.e., the particles - * emit vertically. + * default, particles emit along the entity's local z-axis, and azimuthStart and azimuthFinish + * are relative to the entity's local x-axis. The default value is a rotation of -90 degrees about the local x-axis, i.e., + * the particles emit vertically. * @property {vec3} emitDimensions=0,0,0 - The dimensions of the ellipsoid from which particles are emitted. * @property {number} emitRadiusStart=1 - The starting radius within the ellipsoid at which particles start being emitted; * range 0.01.0 for the ellipsoid center to the ellipsoid surface, respectively. * Particles are emitted from the portion of the ellipsoid that lies between emitRadiusStart and the * ellipsoid's surface. - * @property {number} polarStart=0 - The angle in radians from the entity's z-axis at which particles start being emitted + * @property {number} polarStart=0 - The angle in radians from the entity's local z-axis at which particles start being emitted * within the ellipsoid; range 0Math.PI. Particles are emitted from the portion of the * ellipsoid that lies between polarStart and polarFinish. - * @property {number} polarFinish=0 - The angle in radians from the entity's z-axis at which particles stop being emitted + * @property {number} polarFinish=0 - The angle in radians from the entity's local z-axis at which particles stop being emitted * within the ellipsoid; range 0Math.PI. Particles are emitted from the portion of the * ellipsoid that lies between polarStart and polarFinish. - * @property {number} azimuthStart=-Math.PI - The angle in radians from the entity's x-axis about the entity's z-axis at which - * particles start being emitted; range -Math.PIMath.PI. Particles are emitted from the - * portion of the ellipsoid that lies between azimuthStart and azimuthFinish. - * @property {number} azimuthFinish=Math.PI - The angle in radians from the entity's x-axis about the entity's z-axis at which - * particles stop being emitted; range -Math.PIMath.PI. Particles are emitted from the - * portion of the ellipsoid that lies between azimuthStart and azimuthFinish. + * @property {number} azimuthStart=-Math.PI - The angle in radians from the entity's local x-axis about the entity's local + * z-axis at which particles start being emitted; range -Math.PIMath.PI. Particles are + * emitted from the portion of the ellipsoid that lies between azimuthStart and azimuthFinish. + * @property {number} azimuthFinish=Math.PI - The angle in radians from the entity's local x-axis about the entity's local + * z-axis at which particles stop being emitted; range -Math.PIMath.PI. Particles are + * emitted from the portion of the ellipsoid that lies between azimuthStart and azimuthFinish. * * @property {string} textures="" - The URL of a JPG or PNG image file to display for each particle. If you want transparency, * use PNG format. * @property {number} particleRadius=0.025 - The radius of each particle at the middle of its life. - * @property {number} radiusStart=0.025 - The radius of each particle at the start of its life. - * @property {number} radiusFinish=0.025 - The radius of each particle at the end of its life. + * @property {number} radiusStart=0.025 - The radius of each particle at the start of its life. If not explicitly set, the + * particleRadius value is used. + * @property {number} radiusFinish=0.025 - The radius of each particle at the end of its life. If not explicitly set, the + * particleRadius value is used. * @property {number} radiusSpread=0 - Currently not used. * @property {Color} color=255,255,255 - The color of each particle at the middle of its life. - * @property {Color} colorStart=255,255,255 - The color of each particle at the start of its life. - * @property {color} colorFinish=255,255,255 - The color of each particle at the end of its life. + * @property {Color} colorStart=255,255,255 - The color of each particle at the start of its life. If not explicitly set, the + * color value is used. + * @property {Color} colorFinish=255,255,255 - The color of each particle at the end of its life. If not explicitly set, the + * color value is used. * @property {Color} colorSpread=0,0,0 - Currently not used. * @property {number} alpha=1 - The alpha of each particle at the middle of its life. - * @property {number} alphaStart=1 - The alpha of each particle at the start of its life. - * @property {number} alphaFinish=1 - The alpha of each particle at the end of its life. + * @property {number} alphaStart=1 - The alpha of each particle at the start of its life. If not explicitly set, the + * alpha value is used. + * @property {number} alphaFinish=1 - The alpha of each particle at the end of its life. If not explicitly set, the + * alpha value is used. * @property {number} alphaSpread=0 - Currently not used. * * @property {ShapeType} shapeType="none" - Currently not used. Read-only. @@ -939,24 +954,24 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * rejected. * @property {Entities.PolyVoxSurfaceStyle} voxelSurfaceStyle=2 - The style of rendering the voxels' surface and how * neighboring PolyVox entities are joined. - * @property {string} xTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's x-axis. JPG or PNG - * format. If no texture is specified the surfaces display white. - * @property {string} yTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's y-axis. JPG or PNG - * format. If no texture is specified the surfaces display white. - * @property {string} zTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's z-axis. JPG or PNG - * format. If no texture is specified the surfaces display white. - * @property {Uuid} xNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve x-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. - * @property {Uuid} yNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve y-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. - * @property {Uuid} zNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve z-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. - * @property {Uuid} xPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve x-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. - * @property {Uuid} yPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve y-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. - * @property {Uuid} zPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve z-axis direction, if you - * want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {string} xTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's local x-axis. JPG or + * PNG format. If no texture is specified the surfaces display white. + * @property {string} yTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's local y-axis. JPG or + * PNG format. If no texture is specified the surfaces display white. + * @property {string} zTextureURL="" - URL of the texture to map to surfaces perpendicular to the entity's local z-axis. JPG or + * PNG format. If no texture is specified the surfaces display white. + * @property {Uuid} xNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve local x-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} yNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve local y-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} zNNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's -ve local z-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} xPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve local x-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} yPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve local y-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. + * @property {Uuid} zPNeighborID=Uuid.NULL - ID of the neighboring PolyVox entity in the entity's +ve local z-axis direction, + * if you want them joined. Set to {@link Uuid|Uuid.NULL} if there is none or you don't want to join them. * @example Create a textured PolyVox sphere. * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); * var texture = "http://public.highfidelity.com/cozza13/tuscany/Concrete2.jpg"; @@ -991,9 +1006,10 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { /**jsdoc * The "Sphere" {@link Entities.EntityType|EntityType} is the same as the "Shape" - * {@link Entities.EntityType|EntityType} except that its initial shape value is always set to - * "Sphere" when the entity is created. This property value can subsequently be changed (i.e. so that the entity - * is no longer displayed as a sphere). + * {@link Entities.EntityType|EntityType} except that its shape value is always set to "Sphere" + * when the entity is created. If its shape property value is subsequently changed then the entity's + * type will be reported as "Box" if the shape is set to "Cube", + * otherwise it will be reported as "Shape". * @typedef {object} Entities.EntityProperties-Sphere */ @@ -1030,7 +1046,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {Vec3} dimensions=0.1,0.1,0.01 - The dimensions of the entity. * @property {string} sourceUrl="" - The URL of the Web page to display. This value does not change as you or others navigate * on the Web entity. - * @property {number} dpi=30 - The resolution to display the page at, in dots per inch + * @property {number} dpi=30 - The resolution to display the page at, in dots per inch. If you convert this to dots per meter + * (multiply by 1 / 0.0254 = 39.3701) then multiply dimensions.x and dimensions.y by that value + * you get the resolution in pixels. * @example Create a Web entity displaying at 1920 x 1080 resolution. * var METERS_TO_INCHES = 39.3701; * var entity = Entities.addEntity({ @@ -1050,6 +1068,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { /**jsdoc * The "Zone" {@link Entities.EntityType|EntityType} is a volume of lighting effects and avatar permissions. + * Avatar interaction events such as {@link Entities.enterEntity} are also often used with a Zone entity. * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. * @typedef {object} Entities.EntityProperties-Zone * @property {Vec3} dimensions=0.1,0.1,0.1 - The size of the volume in which the zone's lighting effects and avatar permissions @@ -1247,7 +1266,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); } - // FIXME: Shouldn't provide a shapeType property for Box and Sphere entities? + // FIXME: Shouldn't provide a shapeType property for Box and Sphere entities. if (_type == EntityTypes::Box) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, QString("Box")); } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 166b2130ef..3a5f6e18ab 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -186,8 +186,8 @@ public slots: /**jsdoc * Check whether or not you can make changes to the asset server's assets. * @function Entities.canWriteAssets - * @returns {boolean} true if the domain server will allow the script to make changes to the to the asset - * server's assets, otherwise false. + * @returns {boolean} true if the domain server will allow the script to make changes to the asset server's + * assets, otherwise false. */ Q_INVOKABLE bool canWriteAssets(); @@ -481,7 +481,7 @@ public slots: Q_INVOKABLE bool getServerScriptStatus(QUuid entityID, QScriptValue callback); /**jsdoc - * Get metadata for "magic" entity properties such as script and serverScripts. + * Get metadata for certain entity properties such as script and serverScripts. * @function Entities.queryPropertyMetadata * @param {Uuid} entityID - The ID of the entity to get the metadata for. * @param {string} property - The property name to get the metadata for. @@ -491,7 +491,7 @@ public slots: * @throws Throws an error if property is not handled yet or callback is not a function. */ /**jsdoc - * Get metadata for "magic" entity properties such as script and serverScripts. + * Get metadata for certain entity properties such as script and serverScripts. * @function Entities.queryPropertyMetadata * @param {Uuid} entityID - The ID of the entity to get the metadata for. * @param {string} property - The property name to get the metadata for. @@ -513,8 +513,9 @@ public slots: /**jsdoc - * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. Ray picks are - * done using {@link Entities.findRayIntersection|findRayIntersection}or + * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. By default, Light + * entities are not intersected. The setting lasts for the Interface session. Ray picks are done using + * {@link Entities.findRayIntersection|findRayIntersection} or * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} * APIs. * @function Entities.setLightsArePickable @@ -526,7 +527,7 @@ public slots: /**jsdoc * Get whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Light} entities. Ray picks are - * done using {@link Entities.findRayIntersection|findRayIntersection}or + * done using {@link Entities.findRayIntersection|findRayIntersection} or * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} * APIs. * @function Entities.getLightsArePickable @@ -537,8 +538,9 @@ public slots: Q_INVOKABLE bool getLightsArePickable() const; /**jsdoc - * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Zone} entities. Ray picks are - * done using {@link Entities.findRayIntersection|findRayIntersection}or + * Set whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Zone} entities. By default, Light + * entities are not intersected. The setting lasts for the Interface session. Ray picks are done using + * {@link Entities.findRayIntersection|findRayIntersection} or * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} * APIs. * @function Entities.setZonesArePickable @@ -550,7 +552,7 @@ public slots: /**jsdoc * Get whether or not ray picks intersect the bounding box of {@link Entities.EntityType|Zone} entities. Ray picks are - * done using {@link Entities.findRayIntersection|findRayIntersection}or + * done using {@link Entities.findRayIntersection|findRayIntersection} or * {@link Entities.findRayIntersectionBlocking|findRayIntersectionBlocking}, or the {@link Picks} and {@link RayPick} * APIs. * @function Entities.getZonesArePickable @@ -584,8 +586,8 @@ public slots: * @function Entities.setVoxelSphere * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. * @param {Vec3} center - The center of the sphere of voxels to set, in world coordinates. - * @param {number} radius - If radius of the sphere of voxels to set, in world coordinates. - * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @param {number} radius - The radius of the sphere of voxels to set, in world coordinates. + * @param {number} value - If value % 256 == 0 then each voxel is cleared, otherwise each voxel is set. * @example Create a PolyVox sphere. * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); * var polyVox = Entities.addEntity({ @@ -607,7 +609,7 @@ public slots: * @param {Vec3} start - The center of the sphere of voxels to set, in world coordinates. * @param {Vec3} end - The center of the sphere of voxels to set, in world coordinates. * @param {number} radius - The radius of the capsule cylinder and spherical ends, in world coordinates. - * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @param {number} value - If value % 256 == 0 then each voxel is cleared, otherwise each voxel is set. * @example Create a PolyVox capsule shape. * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })); * var polyVox = Entities.addEntity({ @@ -631,7 +633,7 @@ public slots: * @param {Vec3} position - The position relative to the minimum axes values corner of the entity. The * position coordinates are rounded to the nearest integer to get the voxel coordinate. The minimum axes * corner voxel is { x: 0, y: 0, z: 0 }. - * @param {number} value - If value % 256 == 0 then the voxel is cleared, otherwise the voxel is set. + * @param {number} value - If value % 256 == 0 then voxel is cleared, otherwise the voxel is set. * @example Create a cube PolyVox entity and clear the minimum axes corner voxel. * var entity = Entities.addEntity({ * type: "PolyVox", @@ -650,7 +652,7 @@ public slots: * Set the values of all voxels in a {@link Entities.EntityType|PolyVox} entity. * @function Entities.setAllVoxels * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|PolyVox} entity. - * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @param {number} value - If value % 256 == 0 then each voxel is cleared, otherwise each voxel is set. * @example Create a PolyVox cube. * var entity = Entities.addEntity({ * type: "PolyVox", @@ -671,7 +673,7 @@ public slots: * @param {Vec3} lowPosition - The position of the minimum axes value corner of the cube of voxels to set, in voxel * coordinates. * @param {Vec3} cuboidSize - The size of the cube of voxels to set, in voxel coordinates. - * @param {number} value - If value % 256 == 0 then the each voxel is cleared, otherwise each voxel is set. + * @param {number} value - If value % 256 == 0 then each voxel is cleared, otherwise each voxel is set. * @example Create a PolyVox cube and clear the voxels in one corner. * var polyVox = Entities.addEntity({ * type: "PolyVox", @@ -745,7 +747,7 @@ public slots: * @param {Vec3} voxelCoords - The voxel coordinates. May be fractional and outside the entity's bounding box. * @returns {Vec3} The local coordinates of the voxelCoords if the entityID is a * {@link Entities.EntityType|PolyVox} entity, otherwise {@link Vec3|Vec3.ZERO}. - * @example Get the world dimensions of a voxel in a PolyVox entity. + * @example Get the world dimensions of a voxel in a PolyVox entity. * var polyVox = Entities.addEntity({ * type: "PolyVox", * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 })), @@ -849,7 +851,7 @@ public slots: * @param {Entities.ActionType} actionType - The type of action. * @param {Uuid} entityID - The ID of the entity to add the action to. * @param {Entities.ActionArguments} arguments - Configure the action. - * @returns {Uuid} The ID of the action added if successful, otherwise null. + * @returns {Uuid} The ID of the action added if successfully added, otherwise null. * @example Constrain a cube to move along a vertical line. * var entityID = Entities.addEntity({ * type: "Box", @@ -919,7 +921,7 @@ public slots: Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); /**jsdoc - * Get the trannslation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. * @function Entities.getAbsoluteJointRotationInObjectFrame * @param {Uuid} entityID - The ID of the entity. * @param {number} jointIndex - The integer index of the joint. @@ -1068,7 +1070,8 @@ public slots: /**jsdoc - * Get the IDs of entities, overlays, and avatars that are directly parented to an entity. + * Get the IDs of entities, overlays, and avatars that are directly parented to an entity. To get all descendants of an + * entity, recurse on the IDs returned by the function. * @function Entities.getChildrenIDs * @param {Uuid} parentID - The ID of the entity to get the children IDs of. * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID @@ -1133,11 +1136,11 @@ public slots: Q_INVOKABLE QVector getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex); /**jsdoc - * Check whether an entity or overlay has a an entity as an ancestor (parent, parent's parent, etc.). + * Check whether an entity or overlay has an entity as an ancestor (parent, parent's parent, etc.). * @function Entities.isChildOfParent * @param {Uuid} childID - The ID of the child entity or overlay to test for being a child, grandchild, etc. * @param {Uuid} parentID - The ID of the parent entity to test for being a parent, grandparent, etc. - * @returns {boolean} true if the childID> entity or overlay has the parentID entity + * @returns {boolean} true if the childID entity or overlay has the parentID entity * as a parent or grandparent etc., otherwise false. * @example Check that a grandchild entity is a child of its grandparent. * function createEntity(description, position, parent) { @@ -1273,8 +1276,8 @@ public slots: * but a {@link Entities.EntityType|Shape} entity doesn't. * @function Entities.wantsHandControllerPointerEvents * @param {Uuid} entityID - The ID of the entity. - * @returns {boolean} true if the entity entity can be found and it wants hand controller pointer events, - * otherwise false. + * @returns {boolean} true if the entity can be found and it wants hand controller pointer events, otherwise + * false. */ Q_INVOKABLE bool wantsHandControllerPointerEvents(QUuid id); @@ -1657,7 +1660,7 @@ signals: /**jsdoc * Triggered when an avatar leaves an entity. - * @function Entities.enterEntity + * @function Entities.leaveEntity * @param {Uuid} entityID - The ID of the entity that the avatar left. * @returns {Signal} */ diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index bcde8893c4..0e2fca8180 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -42,8 +42,12 @@ public: * ValueDescriptionProperties * * - * "Box"A rectangular prism. This is identical to the Shape EntityType except - * that it is always created with an initial shape property value of "Cube". + * "Box"A rectangular prism. This is a synonym of "Shape" for the case + * where the entity's shape property value is "Cube".
+ * If an entity is created with its type + * set to "Box" it will always be created with a shape property value of + * "Cube". If an entity of type Shape or Sphere has its shape set + * to "Cube" then its type will be reported as "Box". * {@link Entities.EntityProperties-Box|EntityProperties-Box} * "Light"A local lighting effect. * {@link Entities.EntityProperties-Light|EntityProperties-Light} @@ -62,10 +66,14 @@ public: * "PolyVox"A set of textured voxels. * {@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox} * "Shape"A basic entity such as a cube. - * See also, the Box and Sphere entity types. + * See also, the "Box" and "Sphere" entity types. * {@link Entities.EntityProperties-Shape|EntityProperties-Shape} - * "Sphere"A sphere. This is identical to the Shape EntityType except that it is - * always created with an initial shape property value of "Sphere". + * "Sphere"A sphere. This is a synonym of "Shape" for the case + * where the entity's shape property value is "Sphere".
+ * If an entity is created with its type + * set to "Sphere" it will always be created with a shape property value of + * "Sphere". If an entity of type Box or Shape has its shape set + * to "Sphere" then its type will be reported as "Sphere". * {@link Entities.EntityProperties-Sphere|EntityProperties-Sphere} * "Text"A pane of text oriented in space. * {@link Entities.EntityProperties-Text|EntityProperties-Text} diff --git a/libraries/entities/src/HazePropertyGroup.h b/libraries/entities/src/HazePropertyGroup.h index 1437a5fe12..e992aefbf3 100644 --- a/libraries/entities/src/HazePropertyGroup.h +++ b/libraries/entities/src/HazePropertyGroup.h @@ -57,7 +57,7 @@ static const float INITIAL_KEY_LIGHT_ALTITUDE{ 200.0f }; * * @property {boolean} hazeAltitudeEffect=false - If true then haze decreases with altitude as defined by the * entity's local coordinate system; hazeBaseRef and
hazeCeiling
are used. - * @property {number} hazeBaseRef=0 - The y-azis value in the entity's local coordinate system at which the haze density starts + * @property {number} hazeBaseRef=0 - The y-axis value in the entity's local coordinate system at which the haze density starts * reducing with altitude. * @property {number} hazeCeiling=200 - The y-axis value in the entity's local coordinate system at which the haze density has * reduced to 5%. diff --git a/libraries/model-networking/src/model-networking/MaterialCache.cpp b/libraries/model-networking/src/model-networking/MaterialCache.cpp index de5b3023ae..01bb43759c 100644 --- a/libraries/model-networking/src/model-networking/MaterialCache.cpp +++ b/libraries/model-networking/src/model-networking/MaterialCache.cpp @@ -106,8 +106,8 @@ NetworkMaterialResource::ParsedMaterials NetworkMaterialResource::parseJSONMater * @typedef {object} Material * @property {string} name="" - A name for the material. * @property {string} model="hifi_pbr" - Currently not used. - * @property {Vec3Color|RGBS} emissive - The emissive color. A {@link Vec3Color} value is treated as sRGB. A {@link RGBS} value - * can be either RGB or sRGB. + * @property {Vec3Color|RGBS} emissive - The emissive color, i.e., the color that the material emits. A {@link Vec3Color} value + * is treated as sRGB. A {@link RGBS} value can be either RGB or sRGB. * @property {number} opacity=1.0 - The opacity, 0.01.0. * @property {boolean} unlit=false - If true, the material is not lit. * @property {Vec3Color|RGBS} albedo - The albedo color. A {@link Vec3Color} value is treated as sRGB. A {@link RGBS} value can diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index 4154911d08..e501dd166a 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -37,7 +37,7 @@ private slots: public slots: /**jsdoc - * Set the maximum number of entity packets that the client send per second. + * Set the maximum number of entity packets that the client can send per second. * @function Entities.setPacketsPerSecond * @param {number} packetsPerSecond - Integer maximum number of entity packets that the client can send per second. */ @@ -53,7 +53,8 @@ public slots: int getPacketsPerSecond() const { return _packetSender->getPacketsPerSecond(); } /**jsdoc - * Check whether servers exist for the client to send entity packets to. + * Check whether servers exist for the client to send entity packets to, i.e., whether you are connected to a domain and + * its entity server is working. * @function Entities.serversExist * @returns {boolean} true if servers exist for the client to send entity packets to, otherwise * false. diff --git a/libraries/shared/src/PhysicsCollisionGroups.h b/libraries/shared/src/PhysicsCollisionGroups.h index 0eb1d2021f..edec61dc67 100644 --- a/libraries/shared/src/PhysicsCollisionGroups.h +++ b/libraries/shared/src/PhysicsCollisionGroups.h @@ -79,7 +79,8 @@ const int16_t BULLET_COLLISION_MASK_COLLISIONLESS = 0; * 16Other avatars. * * - *

The values for the collision types that are enabled are added together to give the CollisionMask value.

+ *

The values for the collision types that are enabled are added together to give the CollisionMask value. For example, a + * value of 31 means that an entity will collide with all item types.

* @typedef {number} Entities.CollisionMask */ From 13767beece24de41649b9d408961009b296562ed Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 7 Mar 2018 08:19:36 -0800 Subject: [PATCH 203/267] Caps change --- interface/resources/qml/hifi/audio/Audio.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index 684a732286..b598e26954 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -128,7 +128,7 @@ Rectangle { AudioControls.CheckBox { id: stereoMic spacing: muteMic.spacing; - text: qsTr("use stereo for stereo devices"); + text: qsTr("Use stereo for stereo devices"); checked: false; onClicked: { var success = AudioScriptingInterface.setStereoInput(checked); From 2d448d7208ae90a8bdea3ba45d30865b78f80864 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 7 Mar 2018 10:02:35 -0800 Subject: [PATCH 204/267] tablet scale and position changes --- interface/src/Application.cpp | 2 +- scripts/system/libraries/WebTablet.js | 5 +++-- scripts/system/libraries/utils.js | 4 ++-- scripts/system/tablet-ui/tabletUI.js | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 35b7de7284..36c661f8be 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -891,7 +891,7 @@ Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; -const float DEFAULT_HMD_TABLET_SCALE_PERCENT = 100.0f; +const float DEFAULT_HMD_TABLET_SCALE_PERCENT = 70.0f; const float DEFAULT_DESKTOP_TABLET_SCALE_PERCENT = 75.0f; const bool DEFAULT_DESKTOP_TABLET_BECOMES_TOOLBAR = true; const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false; diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index a34191b951..511bb6989e 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -46,8 +46,9 @@ function calcSpawnInfo(hand, landscape) { var headPos = (HMD.active && Camera.mode === "first person") ? HMD.position : Camera.position; var headRot = (HMD.active && Camera.mode === "first person") ? HMD.orientation : Camera.orientation; - - var forward = Quat.getForward(Quat.cancelOutRollAndPitch(headRot)); + var dominantHandRotation = MyAvatar.getDominantHand() === "right" ? -20 : 20; + var offsetRotation = Quat.fromPitchYawRollDegrees(0, dominantHandRotation, 0); + var forward = Vec3.multiplyQbyV(offsetRotation, Quat.getForward(Quat.cancelOutRollAndPitch(headRot))); var FORWARD_OFFSET = 0.5 * MyAvatar.sensorToWorldScale; finalPosition = Vec3.sum(headPos, Vec3.multiply(FORWARD_OFFSET, forward)); var orientation = Quat.lookAt({x: 0, y: 0, z: 0}, forward, Vec3.multiplyQbyV(MyAvatar.orientation, Vec3.UNIT_Y)); diff --git a/scripts/system/libraries/utils.js b/scripts/system/libraries/utils.js index 442a9f6d24..6afde85c29 100644 --- a/scripts/system/libraries/utils.js +++ b/scripts/system/libraries/utils.js @@ -356,7 +356,7 @@ getTabletWidthFromSettings = function () { var DEFAULT_TABLET_WIDTH = 0.4375; var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); var toolbarMode = tablet.toolbarMode; - var DEFAULT_TABLET_SCALE = 100; + var DEFAULT_TABLET_SCALE = 70; var tabletScalePercentage = DEFAULT_TABLET_SCALE; if (!toolbarMode) { if (HMD.active) { @@ -441,4 +441,4 @@ getMainTabletIDs = function () { tabletIDs.push(HMD.homeButtonID); } return tabletIDs; -}; \ No newline at end of file +}; diff --git a/scripts/system/tablet-ui/tabletUI.js b/scripts/system/tablet-ui/tabletUI.js index 100d0e82ee..ee3dab7308 100644 --- a/scripts/system/tablet-ui/tabletUI.js +++ b/scripts/system/tablet-ui/tabletUI.js @@ -19,11 +19,11 @@ var tabletRezzed = false; var activeHand = null; var DEFAULT_WIDTH = 0.4375; - var DEFAULT_TABLET_SCALE = 100; + var DEFAULT_TABLET_SCALE = 70; var preMakeTime = Date.now(); var validCheckTime = Date.now(); var debugTablet = false; - var tabletScalePercentage = 100.0; + var tabletScalePercentage = 70.0; UIWebTablet = null; var MSECS_PER_SEC = 1000.0; var MUTE_MICROPHONE_MENU_ITEM = "Mute Microphone"; From 28589094c2b6f4b7b569ed40a3efd152f2b5cc46 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Wed, 7 Mar 2018 10:18:40 -0800 Subject: [PATCH 205/267] hopefully fixed mac/ubuntu builds --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9a04a9509e..7a9ce6f649 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6677,8 +6677,8 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { // to prevent files that aren't models from being loaded into world automatically - if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || - filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && + if ((filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || + filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) && (!isBlocks) && (!isZip)) { addAssetToWorldAddEntity(filePath, mapping); } else { From da414b94fdd88344cb0e8f06c72dbfc575f6a18f Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 7 Mar 2018 10:47:37 -0800 Subject: [PATCH 206/267] WIP - adding the creation of recursive scripts. --- tools/auto-tester/src/Test.cpp | 45 +++++++++++++++++++++++++--------- tools/auto-tester/src/Test.h | 4 +++ 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 2b3d121638..f514696ad3 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -84,7 +84,7 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) QImage expectedImage(expectedImagesFullFilenames[i]); if (resultImage.width() != expectedImage.width() || resultImage.height() != expectedImage.height()) { - messageBox.critical(0, "Internal error", "Images are not the same size"); + messageBox.critical(0, "Internal error #1", "Images are not the same size"); exit(-1); } @@ -92,7 +92,7 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) try { similarityIndex = imageComparer.compareImages(resultImage, expectedImage); } catch (...) { - messageBox.critical(0, "Internal error", "Image not in expected format"); + messageBox.critical(0, "Internal error #2", "Image not in expected format"); exit(-1); } @@ -139,20 +139,20 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) void Test::appendTestResultsToFile(QString testResultsFolderPath, TestFailure testFailure, QPixmap comparisonImage) { if (!QDir().exists(testResultsFolderPath)) { - messageBox.critical(0, "Internal error", "Folder " + testResultsFolderPath + " not found"); + messageBox.critical(0, "Internal error #3", "Folder " + testResultsFolderPath + " not found"); exit(-1); } QString failureFolderPath { testResultsFolderPath + "/" + "Failure_" + QString::number(index) }; if (!QDir().mkdir(failureFolderPath)) { - messageBox.critical(0, "Internal error", "Failed to create folder " + failureFolderPath); + messageBox.critical(0, "Internal error #4", "Failed to create folder " + failureFolderPath); exit(-1); } ++index; QFile descriptionFile(failureFolderPath + "/" + TEST_RESULTS_FILENAME); if (!descriptionFile.open(QIODevice::ReadWrite)) { - messageBox.critical(0, "Internal error", "Failed to create file " + TEST_RESULTS_FILENAME); + messageBox.critical(0, "Internal error #5", "Failed to create file " + TEST_RESULTS_FILENAME); exit(-1); } @@ -172,14 +172,14 @@ void Test::appendTestResultsToFile(QString testResultsFolderPath, TestFailure te sourceFile = testFailure._pathname + testFailure._expectedImageFilename; destinationFile = failureFolderPath + "/" + "Expected Image.jpg"; if (!QFile::copy(sourceFile, destinationFile)) { - messageBox.critical(0, "Internal error", "Failed to copy " + sourceFile + " to " + destinationFile); + messageBox.critical(0, "Internal error #6", "Failed to copy " + sourceFile + " to " + destinationFile); exit(-1); } sourceFile = testFailure._pathname + testFailure._actualImageFilename; destinationFile = failureFolderPath + "/" + "Actual Image.jpg"; if (!QFile::copy(sourceFile, destinationFile)) { - messageBox.critical(0, "Internal error", "Failed to copy " + sourceFile + " to " + destinationFile); + messageBox.critical(0, "Internal error #7", "Failed to copy " + sourceFile + " to " + destinationFile); exit(-1); } @@ -282,7 +282,24 @@ bool Test::isAValidDirectory(QString pathname) { } void Test::importTest(QTextStream& textStream, const QString& testPathname) { - textStream << "Script.include(\"" << "file:///" << testPathname + "?raw=true\");" << endl; + // `testPathname` includes the full path to the test. We need the portion below (and including) `tests` + QStringList filenameParts = testPathname.split('/'); + int i{ 0 }; + while (i < filenameParts.length() && filenameParts[i] != "tests") { + ++i; + } + + if (i == filenameParts.length()) { + messageBox.critical(0, "Internal error #10", "Bad testPathname"); + exit(-1); + } + + QString filename; + for (int j = i; j < filenameParts.length(); ++j) { + filename += "/" + filenameParts[j]; + } + + textStream << "Script.include(\"" << "https://raw.githubusercontent.com/" << user << "/hifi_tests/" << branch << filename + "\");" << endl; } // Creates a single script in a user-selected folder. @@ -298,7 +315,7 @@ void Test::createRecursiveScript() { QFile allTestsFilename(topLevelDirectory + "/" + recursiveTestsFilename); if (!allTestsFilename.open(QIODevice::WriteOnly | QIODevice::Text)) { messageBox.critical(0, - "Internal Error", + "Internal Error #8", "Failed to create \"" + recursiveTestsFilename + "\" in directory \"" + topLevelDirectory + "\"" ); @@ -308,7 +325,7 @@ void Test::createRecursiveScript() { QTextStream textStream(&allTestsFilename); textStream << "// This is an automatically generated file, created by auto-tester" << endl << endl; - textStream << "var autoTester = Script.require(\"https://github.com/highfidelity/hifi_tests/blob/master/tests/utils/autoTester.js?raw=true\");" << endl; + textStream << "var autoTester = Script.require(\"https://raw.githubusercontent.com/" + user + "/hifi_tests/" + branch + "/tests/utils/autoTester.js\");" << endl; textStream << "autoTester.enableRecursive();" << endl << endl; QVector testPathnames; @@ -459,11 +476,17 @@ QString Test::getExpectedImagePartialSourceDirectory(QString filename) { QString filenameWithoutExtension = filename.split(".")[0]; QStringList filenameParts = filenameWithoutExtension.split("_"); + // Note that the topmost "tests" folder is assumed to be the root int i { 0 }; - while (filenameParts[i] != "tests") { + while (i < filenameParts.length() && filenameParts[i] != "tests") { ++i; } + if (i == filenameParts.length()) { + messageBox.critical(0, "Internal error #9", "Bad filename"); + exit(-1); + } + QString result = filenameParts[i]; for (int j = i + 1; j < filenameParts.length() - 1; ++j) { diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index b849ab577f..2a26e042b9 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -77,6 +77,10 @@ private: QStringList expectedImagesFilenames; QStringList expectedImagesFullFilenames; QStringList resultImagesFullFilenames; + + // Used for accessing GitHub + const QString user{ "NissimHadar" }; + const QString branch{ "addRecursionToAutotester" }; }; #endif // hifi_test_h \ No newline at end of file From 91b7acec1f150023b088f2cbfa69eb1750114651 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Wed, 7 Mar 2018 11:06:53 -0800 Subject: [PATCH 207/267] Fix crash when closing the Audio menu. On some machines, checkPeakValues takes long enough that timer callbacks overlap and activeClients gets clobbered while in use. --- libraries/audio-client/src/AudioPeakValues.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioPeakValues.cpp b/libraries/audio-client/src/AudioPeakValues.cpp index 3df469b830..0b8921a117 100644 --- a/libraries/audio-client/src/AudioPeakValues.cpp +++ b/libraries/audio-client/src/AudioPeakValues.cpp @@ -43,14 +43,19 @@ void AudioClient::checkPeakValues() { // prepare the windows environment CoInitialize(NULL); + std::unique_lock lock(_deviceMutex, std::defer_lock); + // if disabled, clean up active clients if (!_enablePeakValues) { - activeClients.clear(); + if (lock.try_lock()) { + // deferred, if timer callbacks overlap + activeClients.clear(); + } return; } // lock the devices so the _inputDevices list is static - std::unique_lock lock(_deviceMutex); + lock.lock(); HRESULT result; // initialize the payload From dba0c1046e1a5a9b7814926e3f75da9a06e2ecf8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 8 Mar 2018 08:17:26 +1300 Subject: [PATCH 208/267] Fix typo --- libraries/entities/src/EntityItemProperties.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 324cf15a07..e8bbc19ac2 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -737,7 +737,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * Note: If the name ends with "default-image-model.fbx" then the entity is considered to be an "Image" * entity, in which case the textures property should be set per the example. * @property {string} textures="" - A JSON string of texture name, URL pairs used when rendering the model in place of the - * model's original textures. Use a texture name from the originanlTextures property to override that texture. + * model's original textures. Use a texture name from the originalTextures property to override that texture. * Only the texture names and URLs to be overridden need be specified; original textures are used where there are no * overrides. You can use JSON.stringify() to convert a JavaScript object of name, URL pairs into a JSON * string. From 9bd7f31ff32b7a68bcc333e71217604194c5034f Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 7 Mar 2018 11:30:30 -0800 Subject: [PATCH 209/267] Now search for `tests` folder bottom-up. --- tools/auto-tester/src/Test.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index f514696ad3..8267435fad 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -476,13 +476,14 @@ QString Test::getExpectedImagePartialSourceDirectory(QString filename) { QString filenameWithoutExtension = filename.split(".")[0]; QStringList filenameParts = filenameWithoutExtension.split("_"); - // Note that the topmost "tests" folder is assumed to be the root - int i { 0 }; - while (i < filenameParts.length() && filenameParts[i] != "tests") { - ++i; + // Note that the bottom-most "tests" folder is assumed to be the root + // This is required because the tests folder is named hifi_tests + int i { filenameParts.length() - 1 }; + while (i >= 0 && filenameParts[i] != "tests") { + --i; } - if (i == filenameParts.length()) { + if (i < 0) { messageBox.critical(0, "Internal error #9", "Bad filename"); exit(-1); } From 109fa1d832a4d1eed7c209e0aaae8543d40a4cd3 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 7 Mar 2018 17:18:37 -0300 Subject: [PATCH 210/267] Add the url of each qml as on-screen debug info --- interface/resources/qml/windows/Frame.qml | 5 +++-- libraries/qml/src/qml/OffscreenSurface.cpp | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/windows/Frame.qml b/interface/resources/qml/windows/Frame.qml index 210a3c76d0..98bfb52c38 100644 --- a/interface/resources/qml/windows/Frame.qml +++ b/interface/resources/qml/windows/Frame.qml @@ -16,10 +16,11 @@ import "../js/Utils.js" as Utils Item { id: frame + objectName: "Frame" HifiConstants { id: hifi } default property var decoration - + property string qmlFile: "N/A" property bool gradientsSupported: desktop.gradientsSupported readonly property int frameMarginLeft: frame.decoration ? frame.decoration.frameMarginLeft : 0 @@ -44,7 +45,7 @@ Item { id: debugZ visible: DebugQML color: "red" - text: (window ? "Z: " + window.z : "") + text: (window ? "Z: " + window.z : "") + " " + qmlFile y: window ? window.height + 4 : 0 } diff --git a/libraries/qml/src/qml/OffscreenSurface.cpp b/libraries/qml/src/qml/OffscreenSurface.cpp index e3e26bb7fa..704111762a 100644 --- a/libraries/qml/src/qml/OffscreenSurface.cpp +++ b/libraries/qml/src/qml/OffscreenSurface.cpp @@ -342,6 +342,11 @@ void OffscreenSurface::finishQmlLoad(QQmlComponent* qmlComponent, // Make sure we make items focusable (critical for // supporting keyboard shortcuts) newItem->setFlag(QQuickItem::ItemIsFocusScope, true); +#ifdef DEBUG + for (auto frame : newObject->findChildren("Frame")) { + frame->setProperty("qmlFile", qmlComponent->url()); + } +#endif } bool rootCreated = getRootItem() != nullptr; From 9ae2da7e4b3a3b9f2560b39602d955874a5bf934 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Wed, 7 Mar 2018 13:18:36 -0800 Subject: [PATCH 211/267] fixed logic for texture files/non-models --- interface/src/Application.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7a9ce6f649..7fff296323 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6676,10 +6676,10 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q qWarning(interfaceapp) << "Error downloading model: " + errorInfo; addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { - // to prevent files that aren't models from being loaded into world automatically - if ((filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || - filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) && - (!isBlocks) && (!isZip)) { + // to prevent files that aren't models or texture files from being loaded into world automatically + if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || + (filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && + ((!isBlocks) && (!isZip)))) { addAssetToWorldAddEntity(filePath, mapping); } else { qCDebug(interfaceapp) << "Zipped contents are not supported entity files"; From b47b512ab9a767039b629e26daa75b2d2528b025 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 7 Mar 2018 13:25:40 -0800 Subject: [PATCH 212/267] Completed recursive creation of recursive scripts. --- tools/auto-tester/src/Test.cpp | 58 ++++++++++++++++++++++++++++++---- tools/auto-tester/src/Test.h | 2 ++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 8267435fad..1078ce1bc4 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -311,6 +311,52 @@ void Test::createRecursiveScript() { return; } + createRecursiveScript(topLevelDirectory, true); +} + +// This method creates a `testRecursive.js` script in every sub-folder. +void Test::createRecursiveScriptsRecursively() { + // Select folder to start recursing from + QString topLevelDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select the root folder for the recursive scripts", ".", QFileDialog::ShowDirsOnly); + if (topLevelDirectory == "") { + return; + } + + createRecursiveScript(topLevelDirectory, false); + + QDirIterator it(topLevelDirectory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it.hasNext()) { + QString directory = it.next(); + + // Only process directories + QDir dir(); + if (!isAValidDirectory(directory)) { + continue; + } + + // Only process directories that have sub-directories + bool hasNoSubDirectories{ true }; + QDirIterator it2(directory.toStdString().c_str(), QDirIterator::Subdirectories); + while (it2.hasNext()) { + QString directory2 = it2.next(); + + // Only process directories + QDir dir(); + if (isAValidDirectory(directory2)) { + hasNoSubDirectories = false; + break; + } + } + + if (!hasNoSubDirectories) { + createRecursiveScript(directory, false); + } + } + + messageBox.information(0, "Success", "Scripts have been created"); +} + +void Test::createRecursiveScript(QString topLevelDirectory, bool interactiveMode) { const QString recursiveTestsFilename("testRecursive.js"); QFile allTestsFilename(topLevelDirectory + "/" + recursiveTestsFilename); if (!allTestsFilename.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -350,7 +396,7 @@ void Test::createRecursiveScript() { continue; } - const QString testPathname{ directory + "/" + TEST_FILENAME }; + const QString testPathname { directory + "/" + TEST_FILENAME }; QFileInfo fileInfo(testPathname); if (fileInfo.exists()) { // Current folder contains a test @@ -360,7 +406,7 @@ void Test::createRecursiveScript() { } } - if (testPathnames.length() <= 0) { + if (interactiveMode && testPathnames.length() <= 0) { messageBox.information(0, "Failure", "No \"" + TEST_FILENAME + "\" files found"); allTestsFilename.close(); return; @@ -370,10 +416,10 @@ void Test::createRecursiveScript() { textStream << "autoTester.runRecursive();" << endl; allTestsFilename.close(); - messageBox.information(0, "Success", "Script has been created"); -} - -void Test::createRecursiveScriptsRecursively() { + + if (interactiveMode) { + messageBox.information(0, "Success", "Script has been created"); + } } void Test::createTest() { diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 2a26e042b9..411f27eae6 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -28,6 +28,8 @@ public: void createRecursiveScript(); void createRecursiveScriptsRecursively(); + void createRecursiveScript(QString topLevelDirectory, bool interactiveMode); + void createTest(); void deleteOldSnapshots(); From 0aacdcd5580f4d63530023d694d2c9a8ec5c72a0 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 7 Mar 2018 13:33:39 -0800 Subject: [PATCH 213/267] docs --- .../graphics-scripting/src/graphics-scripting/Forward.h | 6 ++++++ .../src/graphics-scripting/ScriptableModel.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/libraries/graphics-scripting/src/graphics-scripting/Forward.h b/libraries/graphics-scripting/src/graphics-scripting/Forward.h index 3d710b41b4..ed8e96a12f 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/Forward.h +++ b/libraries/graphics-scripting/src/graphics-scripting/Forward.h @@ -65,6 +65,12 @@ namespace scriptable { QString lightmapMap; QString scatteringMap; }; + + /**jsdoc + * @typedef {object} Graphics.MaterialLayer + * @property {Material} material - This layer's material. + * @property {number} priority - The priority of this layer. If multiple materials are applied to a mesh part, only the highest priority layer is used. + */ class ScriptableMaterialLayer { public: ScriptableMaterialLayer() {} diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h index a1278132ca..ac0b7b9623 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h +++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableModel.h @@ -21,6 +21,8 @@ namespace scriptable { * @property {Uuid} objectID - UUID of corresponding inworld object (if model is associated) * @property {number} numMeshes - The number of submeshes contained in the model. * @property {Graphics.Mesh[]} meshes - Array of submesh references. + * @property {Object.} materialLayers - Map of materials layer lists. You can look up a material layer list by mesh part number or by material name. + * @property {string[]} materialNames - Array of all the material names used by the mesh parts of this model, in order (e.g. materialNames[0] is the name of the first mesh part's material). */ class ScriptableModel : public ScriptableModelBase { From 2987c90f965ff2f92eb7d847097d4c716be85731 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Wed, 7 Mar 2018 13:48:35 -0800 Subject: [PATCH 214/267] fixed syntax for ubuntu --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7fff296323..429348c593 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6677,8 +6677,8 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q addAssetToWorldError(filenameFromPath(filePath), errorInfo); } else { // to prevent files that aren't models or texture files from being loaded into world automatically - if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) || - (filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION) && + if ((filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION)) || + ((filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) && ((!isBlocks) && (!isZip)))) { addAssetToWorldAddEntity(filePath, mapping); } else { From e2bf84224a873c8d9a3dde11b441cb79c5193d88 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 8 Mar 2018 10:59:12 +1300 Subject: [PATCH 215/267] Add further examples. --- .../entities/src/EntityScriptingInterface.h | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index b1d69972aa..a259638371 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -928,6 +928,23 @@ public slots: * @returns {Quat} The rotation of the joint in the entity's coordinate frame if the entity is a * {@link Entities.EntityType|Model} entity, the entity is loaded, and the joint index is valid; otherwise * {@link Quat(0)|Quat.IDENTITY}. + * @example Compare the local and absolute rotations of an avatar model's left hand joint. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var index = Entities.getJointIndex(entityID, "LeftHand"); + * var localRotation = Entities.getLocalJointRotation(entityID, index); + * var absoluteRotation = Entities.getAbsoluteJointRotationInObjectFrame(entityID, index); + * print("Left hand local rotation: " + JSON.stringify(Quat.safeEulerAngles(localRotation))); + * print("Left hand absolute rotation: " + JSON.stringify(Quat.safeEulerAngles(absoluteRotation))); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex); @@ -953,6 +970,23 @@ public slots: * @param {Quat} rotation - The rotation relative to the entity's coordinate frame to set the joint to. * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, * the joint index is valid, and the rotation is different to the joint's current rotation; otherwise false. + * @example Raise an avatar model's left palm. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var index = Entities.getJointIndex(entityID, "LeftHand"); + * var absoluteRotation = Entities.getAbsoluteJointRotationInObjectFrame(entityID, index); + * absoluteRotation = Quat.multiply(Quat.fromPitchYawRollDegrees(0, 0, 90), absoluteRotation); + * var success = Entities.setAbsoluteJointRotationInObjectFrame(entityID, index, absoluteRotation); + * print("Success: " + success); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex, glm::quat rotation); @@ -976,6 +1010,21 @@ public slots: * @param {number} jointIndex - The integer index of the joint. * @returns {Quat} The local rotation of the joint if the entity is a {@link Entities.EntityType|Model} entity, the entity * is loaded, and the joint index is valid; otherwise {@link Quat(0)|Quat.IDENTITY}. + * @example Report the local rotation of an avatar model's head joint. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var index = Entities.getJointIndex(entityID, "Head"); + * var rotation = Entities.getLocalJointRotation(entityID, index); + * print("Head local rotation: " + JSON.stringify(Quat.safeEulerAngles(rotation))); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE glm::quat getLocalJointRotation(const QUuid& entityID, int jointIndex); @@ -1001,6 +1050,22 @@ public slots: * @param {Quat} rotation - The local rotation to set the joint to. * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, * the joint index is valid, and the rotation is different to the joint's current rotation; otherwise false. + * @example Make an avatar model turn its head left. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var index = Entities.getJointIndex(entityID, "Head"); + * var rotation = Quat.fromPitchYawRollDegrees(0, 60, 0); + * var success = Entities.setLocalJointRotation(entityID, index, rotation); + * print("Success: " + success); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointRotation(const QUuid& entityID, int jointIndex, glm::quat rotation); @@ -1026,6 +1091,36 @@ public slots: * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, * the model has joints, and at least one of the rotations is different to the model's current rotations; otherwise * false. + * @example Raise both palms of an avatar model. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * + * // Get all the joint rotations. + * var jointNames = Entities.getJointNames(entityID); + * var jointRotations = []; + * for (var i = 0, length = jointNames.length; i < length; i++) { + * var index = Entities.getJointIndex(entityID, jointNames[i]); + * jointRotations.push(Entities.getLocalJointRotation(entityID, index)); + * } + * + * // Raise both palms. + * var index = jointNames.indexOf("LeftHand"); + * jointRotations[index] = Quat.multiply(Quat.fromPitchYawRollDegrees(-90, 0, 0), jointRotations[index]); + * index = jointNames.indexOf("RightHand"); + * jointRotations[index] = Quat.multiply(Quat.fromPitchYawRollDegrees(-90, 0, 0), jointRotations[index]); + * + * // Update all the joint rotations. + * var success = Entities.setLocalJointRotations(entityID, jointRotations); + * print("Success: " + success); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE bool setLocalJointRotations(const QUuid& entityID, const QVector& rotations); @@ -1054,6 +1149,20 @@ public slots: * @returns {number} The integer index of the joint if the entity is a {@link Entities.EntityType|Model} entity, the entity * is loaded, and the joint is present; otherwise -1. The joint indexes are in order per * {@link Entities.getJointNames|getJointNames}. + * @example Report the index of a model's head joint. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var index = Entities.getJointIndex(entityID, "Head"); + * print("Head joint index: " + index); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE int getJointIndex(const QUuid& entityID, const QString& name); @@ -1064,6 +1173,20 @@ public slots: * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Model} entity. * @returns {string[]} The names of all the joints in the entity if it is a {@link Entities.EntityType|Model} entity and * is loaded, otherwise an empty array. The joint names are in order per {@link Entities.getJointIndex|getJointIndex}. + * @example Report a model's joint names. + * entityID = Entities.addEntity({ + * type: "Model", + * modelURL: "https://hifi-content.s3.amazonaws.com/milad/production/Examples/Models/Avatars/blue_suited.fbx", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -5 })), + * rotation: MyAvatar.orientation, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * Script.setTimeout(function () { + * // Joint data aren't available until after the model has loaded. + * var jointNames = Entities.getJointNames(entityID); + * print("Joint names: " + JSON.stringify(jointNames)); + * }, 2000); */ // FIXME move to a renderable entity interface Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); From a0eb7e0712373cdd87901e85f283ee56db9ad23c Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 7 Mar 2018 15:01:12 -0800 Subject: [PATCH 216/267] Don't default unknown Marketplace item types to 'Entity' --- interface/resources/qml/hifi/commerce/checkout/Checkout.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index 372fb3c774..96ffa390bf 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -147,8 +147,7 @@ Rectangle { } else if (root.itemHref.indexOf('.json') > -1) { root.itemType = "entity"; // "wearable" type handled later } else { - console.log("WARNING - Item type is UNKNOWN!"); - root.itemType = "entity"; + root.itemType = "unknown"; } } From 16e39f363725fa05619a91929307a7ea26992e24 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 7 Mar 2018 15:01:12 -0800 Subject: [PATCH 217/267] Don't default unknown Marketplace item types to 'Entity' --- interface/resources/qml/hifi/commerce/checkout/Checkout.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index 372fb3c774..96ffa390bf 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -147,8 +147,7 @@ Rectangle { } else if (root.itemHref.indexOf('.json') > -1) { root.itemType = "entity"; // "wearable" type handled later } else { - console.log("WARNING - Item type is UNKNOWN!"); - root.itemType = "entity"; + root.itemType = "unknown"; } } From d4487e92b8d5f1d7f817f5e0785db8b10e6bc049 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 8 Mar 2018 12:23:13 +1300 Subject: [PATCH 218/267] Further JSDoc tweaks --- .../entities/src/EntityScriptingInterface.h | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index a259638371..b483225390 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -909,11 +909,12 @@ public slots: /**jsdoc - * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and + * orientation. * @function Entities.getAbsoluteJointTranslationInObjectFrame * @param {Uuid} entityID - The ID of the entity. * @param {number} jointIndex - The integer index of the joint. - * @returns {Vec3} The translation of the joint in the entity's coordinate frame if the entity is a + * @returns {Vec3} The translation of the joint relative to the entity's position and orientation if the entity is a * {@link Entities.EntityType|Model} entity, the entity is loaded, and the joint index is valid; otherwise * {@link Vec3(0)|Vec3.ZERO}. */ @@ -921,11 +922,12 @@ public slots: Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); /**jsdoc - * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * Get the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and + * orientation. * @function Entities.getAbsoluteJointRotationInObjectFrame * @param {Uuid} entityID - The ID of the entity. * @param {number} jointIndex - The integer index of the joint. - * @returns {Quat} The rotation of the joint in the entity's coordinate frame if the entity is a + * @returns {Quat} The rotation of the joint relative to the entity's orientation if the entity is a * {@link Entities.EntityType|Model} entity, the entity is loaded, and the joint index is valid; otherwise * {@link Quat(0)|Quat.IDENTITY}. * @example Compare the local and absolute rotations of an avatar model's left hand joint. @@ -950,11 +952,12 @@ public slots: Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex); /**jsdoc - * Set the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * Set the translation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and + * orientation. * @function Entities.setAbsoluteJointTranslationInObjectFrame * @param {Uuid} entityID - The ID of the entity. * @param {number} jointIndex - The integer index of the joint. - * @param {Vec3} translation - The translation relative to the entity's coordinate frame to set the joint to. + * @param {Vec3} translation - The translation to set the joint to relative to the entity's position and orientation. * @returns {boolean} trueif the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, * the joint index is valid, and the translation is different to the joint's current translation; otherwise * false. @@ -963,11 +966,12 @@ public slots: Q_INVOKABLE bool setAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex, glm::vec3 translation); /**jsdoc - * Set the rotation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's coordinate frame. + * Set the rotation of a joint in a {@link Entities.EntityType|Model} entity relative to the entity's position and + * orientation. * @function Entities.setAbsoluteJointRotationInObjectFrame * @param {Uuid} entityID - The ID of the entity. * @param {number} jointIndex - The integer index of the joint. - * @param {Quat} rotation - The rotation relative to the entity's coordinate frame to set the joint to. + * @param {Quat} rotation - The rotation to set the joint to relative to the entity's orientation. * @returns {boolean} true if the entity is a {@link Entities.EntityType|Model} entity, the entity is loaded, * the joint index is valid, and the rotation is different to the joint's current rotation; otherwise false. * @example Raise an avatar model's left palm. @@ -1126,7 +1130,9 @@ public slots: Q_INVOKABLE bool setLocalJointRotations(const QUuid& entityID, const QVector& rotations); /**jsdoc - * Set the local rotations and translations of joints in a {@link Entities.EntityType|Model} entity. + * Set the local rotations and translations of joints in a {@link Entities.EntityType|Model} entity. This is the same as + * calling both {@link Entities.setLocalJointRotations|setLocalJointRotations} and + * {@link Entities.setLocalJointTranslations|setLocalJointTranslations} at the same time. * @function Entities.setLocalJointsData * @param {Uuid} entityID - The ID of the entity. * @param {Quat[]} rotations - The local rotations to set the joints to. From a4854839a4c3148e91d1a103f2b5b634f581fe14 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 7 Mar 2018 17:45:10 -0800 Subject: [PATCH 219/267] Enable user selection of destination folder when creating a test. --- tools/auto-tester/src/Test.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 1078ce1bc4..c14c6b9437 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -430,6 +430,11 @@ void Test::createTest() { return; } + QString imageDestinationDirectory = QFileDialog::getExistingDirectory(nullptr, "Please select folder to save the test images", ".", QFileDialog::ShowDirsOnly); + if (imageDestinationDirectory == "") { + return; + } + QStringList sortedImageFilenames = createListOfAll_imagesInDirectory("jpg", imageSourceDirectory); int i = 1; @@ -442,7 +447,6 @@ void Test::createTest() { exit(-1); } QString newFilename = "ExpectedImage_" + QString::number(i - 1).rightJustified(5, '0') + ".png"; - QString imageDestinationDirectory = getExpectedImageDestinationDirectory(currentFilename); QString fullNewFileName = imageDestinationDirectory + "/" + newFilename; try { From 9681f0eb779278c7170ccbb6647cef940cbdff56 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 7 Mar 2018 18:20:26 -0800 Subject: [PATCH 220/267] restore old scale math, disable avatar collisions while scaling --- .../system/libraries/entitySelectionTool.js | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 54254f6548..53769650e2 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -272,17 +272,19 @@ SelectionDisplay = (function() { var STRETCH_SPHERE_OFFSET = 0.06; var STRETCH_SPHERE_CAMERA_DISTANCE_MULTIPLE = 0.01; var STRETCH_MINIMUM_DIMENSION = 0.001; - var STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE = 2; + var STRETCH_ALL_MINIMUM_DIMENSION = 0.01; + var STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE = 6; var STRETCH_PANEL_WIDTH = 0.01; var SCALE_CUBE_OFFSET = 0.5; var SCALE_CUBE_CAMERA_DISTANCE_MULTIPLE = 0.015; - var SCALE_MINIMUM_DIMENSION = 0.02; var CLONER_OFFSET = { x:0.9, y:-0.9, z:0.9 }; var CTRL_KEY_CODE = 16777249; + var AVATAR_COLLISIONS_OPTION = "Enable Avatar Collisions"; + var TRANSLATE_DIRECTION = { X : 0, Y : 1, @@ -336,6 +338,8 @@ SelectionDisplay = (function() { var ctrlPressed = false; + var handleStretchCollisionOverride = false; + var handlePropertiesTranslateArrowCones = { shape: "Cone", solid: true, @@ -597,6 +601,11 @@ SelectionDisplay = (function() { var activeTool = null; var handleTools = {}; + that.shutdown = function() { + that.restoreAvatarCollisionsFromStretch(); + } + Script.scriptEnding.connect(that.shutdown); + // We get mouseMoveEvents from the handControllers, via handControllerPointer. // But we dont' get mousePressEvents. that.triggerMapping = Controller.newMapping(Script.resolvePath('') + '-click'); @@ -1740,6 +1749,13 @@ SelectionDisplay = (function() { }; }; + that.restoreAvatarCollisionsFromStretch = function() { + if (handleStretchCollisionOverride) { + Menu.setIsOptionChecked(AVATAR_COLLISIONS_OPTION, true); + handleStretchCollisionOverride = false; + } + } + // TOOL DEFINITION: HANDLE STRETCH TOOL function makeStretchTool(stretchMode, directionEnum, directionVec, pivot, offset, stretchPanel, scaleHandle) { var directionFor3DStretch = directionVec; @@ -1942,6 +1958,10 @@ SelectionDisplay = (function() { if (scaleHandle != null) { Overlays.editOverlay(scaleHandle, { color: COLOR_SCALE_CUBE_SELECTED }); } + if (Menu.isOptionChecked(AVATAR_COLLISIONS_OPTION)) { + Menu.setIsOptionChecked(AVATAR_COLLISIONS_OPTION, false); + handleStretchCollisionOverride = true; + } }; var onEnd = function(event, reason) { @@ -1951,6 +1971,7 @@ SelectionDisplay = (function() { if (scaleHandle != null) { Overlays.editOverlay(scaleHandle, { color: COLOR_SCALE_CUBE }); } + that.restoreAvatarCollisionsFromStretch(); pushCommandForSelections(); }; @@ -2000,6 +2021,12 @@ SelectionDisplay = (function() { vector = grid.snapToSpacing(vector); var changeInDimensions = Vec3.multiply(NEGATE_VECTOR, vec3Mult(localSigns, vector)); + if (directionEnum === STRETCH_DIRECTION.ALL) { + var toCameraDistance = getDistanceToCamera(position); + var dimensionsMultiple = toCameraDistance * STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE; + changeInDimensions = Vec3.multiply(changeInDimensions, dimensionsMultiple); + } + var newDimensions; if (proportional) { var absoluteX = Math.abs(changeInDimensions.x); @@ -2022,9 +2049,11 @@ SelectionDisplay = (function() { newDimensions = Vec3.sum(initialDimensions, changeInDimensions); } - newDimensions.x = Math.max(newDimensions.x, STRETCH_MINIMUM_DIMENSION); - newDimensions.y = Math.max(newDimensions.y, STRETCH_MINIMUM_DIMENSION); - newDimensions.z = Math.max(newDimensions.z, STRETCH_MINIMUM_DIMENSION); + var minimumDimension = directionEnum === STRETCH_DIRECTION.ALL ? STRETCH_ALL_MINIMUM_DIMENSION : + STRETCH_MINIMUM_DIMENSION; + newDimensions.x = Math.max(newDimensions.x, minimumDimension); + newDimensions.y = Math.max(newDimensions.y, minimumDimension); + newDimensions.z = Math.max(newDimensions.z, minimumDimension); var changeInPosition = Vec3.multiplyQbyV(rotation, vec3Mult(localDeltaPivot, changeInDimensions)); if (directionEnum === STRETCH_DIRECTION.ALL) { @@ -2081,38 +2110,31 @@ SelectionDisplay = (function() { function addHandleScaleTool(overlay, mode, directionEnum) { var directionVector, offset, selectedHandle; if (directionEnum === SCALE_DIRECTION.LBN) { - directionVector = { x:1, y:0, z:1 }; - offset = { x:-1, y:-1, z:-1 }; + directionVector = { x:1, y:1, z:1 }; selectedHandle = handleScaleLBNCube; } else if (directionEnum === SCALE_DIRECTION.RBN) { - directionVector = { x:-1, y:0, z:1 }; - offset = { x:1, y:-1, z:-1 }; + directionVector = { x:-1, y:1, z:1 }; selectedHandle = handleScaleRBNCube; } else if (directionEnum === SCALE_DIRECTION.LBF) { - directionVector = { x:1, y:0, z:-1 }; - offset = { x:-1, y:-1, z:1 }; + directionVector = { x:1, y:1, z:-1 }; selectedHandle = handleScaleLBFCube; } else if (directionEnum === SCALE_DIRECTION.RBF) { - directionVector = { x:-1, y:0, z:-1 }; - offset = { x:1, y:-1, z:1 }; + directionVector = { x:-1, y:1, z:-1 }; selectedHandle = handleScaleRBFCube; } else if (directionEnum === SCALE_DIRECTION.LTN) { - directionVector = { x:1, y:0, z:1 }; - offset = { x:-1, y:1, z:-1 }; + directionVector = { x:1, y:-1, z:1 }; selectedHandle = handleScaleLTNCube; } else if (directionEnum === SCALE_DIRECTION.RTN) { - directionVector = { x:-1, y:0, z:1 }; - offset = { x:1, y:1, z:-1 }; + directionVector = { x:-1, y:-1, z:1 }; selectedHandle = handleScaleRTNCube; } else if (directionEnum === SCALE_DIRECTION.LTF) { - directionVector = { x:1, y:0, z:-1 }; - offset = { x:-1, y:1, z:1 }; + directionVector = { x:1, y:-1, z:-1 }; selectedHandle = handleScaleLTFCube; } else if (directionEnum === SCALE_DIRECTION.RTF) { - directionVector = { x:-1, y:0, z:-1 }; - offset = { x:1, y:1, z:1 }; + directionVector = { x:-1, y:-1, z:-1 }; selectedHandle = handleScaleRTFCube; } + offset = Vec3.multiply(directionVector, NEGATE_VECTOR); var tool = makeStretchTool(mode, STRETCH_DIRECTION.ALL, directionVector, directionVector, offset, null, selectedHandle); return addHandleTool(overlay, tool); From 554c37d14b5c1b25669eff2c9e9568d0e554b39f Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 7 Mar 2018 19:34:08 -0800 Subject: [PATCH 221/267] removed undefined event checks in scaling --- scripts/system/libraries/entitySelectionTool.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 53769650e2..fced5fc4e9 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1976,10 +1976,6 @@ SelectionDisplay = (function() { }; var onMove = function(event) { - if (event.x === undefined || event.y === undefined) { - return; - } - var proportional = (spaceMode === SPACE_WORLD) || directionEnum === STRETCH_DIRECTION.ALL; var position, dimensions, rotation; From d0cc64f63d07104ee40737e83a86424d86f6f8c0 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 8 Mar 2018 11:19:49 -0800 Subject: [PATCH 222/267] Fix font loading for MacOS via different font loading method --- interface/resources/qml/CurrentAPI.qml | 2 -- interface/resources/qml/controls-uit/CheckBoxQQC2.qml | 4 ++-- interface/resources/qml/controls-uit/Keyboard.qml | 9 +++------ interface/resources/qml/controls-uit/SpinBox.qml | 3 +-- interface/resources/qml/controls-uit/TextEdit.qml | 6 +++--- interface/resources/qml/controls-uit/TextField.qml | 4 +--- interface/resources/qml/controls/FontAwesome.qml | 3 +-- interface/resources/qml/dialogs/FileDialog.qml | 5 +---- interface/resources/qml/dialogs/TabletFileDialog.qml | 5 +---- .../qml/dialogs/assetDialog/AssetDialogContent.qml | 5 +---- interface/resources/qml/hifi/AssetServer.qml | 3 +-- interface/resources/qml/hifi/ComboDialog.qml | 2 -- interface/resources/qml/hifi/DesktopLetterboxMessage.qml | 7 +++---- interface/resources/qml/hifi/LetterboxMessage.qml | 7 +++---- interface/resources/qml/hifi/NameCard.qml | 3 +-- interface/resources/qml/hifi/Pal.qml | 3 +-- .../hifi/commerce/common/EmulatedMarketplaceHeader.qml | 3 +-- .../qml/hifi/commerce/wallet/sendMoney/SendMoney.qml | 5 ++--- .../resources/qml/hifi/dialogs/TabletAssetServer.qml | 3 +-- .../qml/hifi/tablet/tabletWindows/TabletFileDialog.qml | 5 +---- .../resources/qml/styles-uit/AnonymousProRegular.qml | 3 +-- interface/resources/qml/styles-uit/FiraSansRegular.qml | 3 +-- interface/resources/qml/styles-uit/FiraSansSemiBold.qml | 3 +-- interface/resources/qml/styles-uit/HiFiGlyphs.qml | 3 +-- interface/resources/qml/styles-uit/RalewayBold.qml | 5 ++--- interface/resources/qml/styles-uit/RalewayLight.qml | 3 +-- interface/resources/qml/styles-uit/RalewayRegular.qml | 3 +-- interface/resources/qml/styles-uit/RalewaySemiBold.qml | 4 ++-- interface/src/Application.cpp | 9 +++++++++ 29 files changed, 47 insertions(+), 76 deletions(-) diff --git a/interface/resources/qml/CurrentAPI.qml b/interface/resources/qml/CurrentAPI.qml index d9255e51eb..96bfb5c36b 100644 --- a/interface/resources/qml/CurrentAPI.qml +++ b/interface/resources/qml/CurrentAPI.qml @@ -33,8 +33,6 @@ Item { width: parent.width height: parent.height } - - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } Timer { id: updateList diff --git a/interface/resources/qml/controls-uit/CheckBoxQQC2.qml b/interface/resources/qml/controls-uit/CheckBoxQQC2.qml index 040cd8e505..8a9686ff5e 100644 --- a/interface/resources/qml/controls-uit/CheckBoxQQC2.qml +++ b/interface/resources/qml/controls-uit/CheckBoxQQC2.qml @@ -109,9 +109,9 @@ CheckBox { contentItem: Text { id: root - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } font.pixelSize: hifi.fontSizes.inputLabel - font.family: ralewaySemiBold.name + font.family: "Raleway" + font.weight: Font.DemiBold text: checkBox.text color: checkBox.color x: 2 diff --git a/interface/resources/qml/controls-uit/Keyboard.qml b/interface/resources/qml/controls-uit/Keyboard.qml index 0c86754734..ea76d44aaa 100644 --- a/interface/resources/qml/controls-uit/Keyboard.qml +++ b/interface/resources/qml/controls-uit/Keyboard.qml @@ -125,8 +125,7 @@ Rectangle { TextInput { id: mirrorText visible: showMirrorText - FontLoader { id: font; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - font.family: font.name + font.family: "Fira Sans" font.pixelSize: 20 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter @@ -165,8 +164,6 @@ Rectangle { anchors.bottom: parent.bottom anchors.bottomMargin: 0 - FontLoader { id: hiFiGlyphs; source: "qrc:/fonts/hifi-glyphs.ttf"; } - Column { id: columnAlpha width: keyboardWidth @@ -250,7 +247,7 @@ Rectangle { Key { width: 43; glyph: ","; } Key { width: 43; glyph: "."; } Key { - fontFamily: hiFiGlyphs.name; + fontFamily: "hifi-glyphs"; fontPixelSize: 48; letterAnchors.topMargin: -4; verticalAlignment: Text.AlignVCenter; @@ -343,7 +340,7 @@ Rectangle { Key { width: 43; glyph: ","; } Key { width: 43; glyph: "."; } Key { - fontFamily: hiFiGlyphs.name; + fontFamily: "hifi-glyphs"; fontPixelSize: 48; letterAnchors.topMargin: -4; verticalAlignment: Text.AlignVCenter; diff --git a/interface/resources/qml/controls-uit/SpinBox.qml b/interface/resources/qml/controls-uit/SpinBox.qml index f2a7e0efe8..30f6682d5a 100644 --- a/interface/resources/qml/controls-uit/SpinBox.qml +++ b/interface/resources/qml/controls-uit/SpinBox.qml @@ -25,8 +25,7 @@ SpinBox { property color colorLabelInside: hifi.colors.white property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0) - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - font.family: firaSansSemiBold.name + font.family: "Fira Sans SemiBold" font.pixelSize: hifi.fontSizes.textFieldInput height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. diff --git a/interface/resources/qml/controls-uit/TextEdit.qml b/interface/resources/qml/controls-uit/TextEdit.qml index 34eff7586a..0fe03150f4 100644 --- a/interface/resources/qml/controls-uit/TextEdit.qml +++ b/interface/resources/qml/controls-uit/TextEdit.qml @@ -16,9 +16,9 @@ import "../styles-uit" TextEdit { property real size: 32 - - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } - font.family: ralewaySemiBold.name + + font.family: "Raleway" + font.weight: Font.DemiBold font.pointSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft diff --git a/interface/resources/qml/controls-uit/TextField.qml b/interface/resources/qml/controls-uit/TextField.qml index ee646b2575..782ab454b5 100644 --- a/interface/resources/qml/controls-uit/TextField.qml +++ b/interface/resources/qml/controls-uit/TextField.qml @@ -34,9 +34,7 @@ TextField { placeholderText: textField.placeholderText - FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - FontLoader { id: hifiGlyphs; source: "qrc:/fonts/hifi-glyphs.ttf"; } - font.family: firaSansRegular.name + font.family: "Fira Sans" font.pixelSize: hifi.fontSizes.textFieldInput height: implicitHeight + 3 // Make surrounding box higher so that highlight is vertically centered. property alias textFieldLabel: textFieldLabel diff --git a/interface/resources/qml/controls/FontAwesome.qml b/interface/resources/qml/controls/FontAwesome.qml index 7eda46e17e..2c897b6347 100644 --- a/interface/resources/qml/controls/FontAwesome.qml +++ b/interface/resources/qml/controls/FontAwesome.qml @@ -4,13 +4,12 @@ import QtQuick.Controls.Styles 1.3 Text { id: root - FontLoader { id: iconFont; source: "qrc:/fonts/fontawesome-webfont.ttf"; } property int size: 32 width: size height: size font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: iconFont.name + font.family: "FontAwesome" } diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index c078ace264..572e7a7918 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -532,9 +532,6 @@ ModalWindow { itemDelegate: Item { clip: true - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - FiraSansSemiBold { text: getText(); elide: styleData.elideMode @@ -548,7 +545,7 @@ ModalWindow { size: hifi.fontSizes.tableText color: hifi.colors.baseGrayHighlight font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir) - ? firaSansSemiBold.name : firaSansRegular.name + ? "Fira Sans SemiBold" : "Fira Sans" function getText() { if (styleData.row === -1) { diff --git a/interface/resources/qml/dialogs/TabletFileDialog.qml b/interface/resources/qml/dialogs/TabletFileDialog.qml index 776f47d19d..c635095ac6 100644 --- a/interface/resources/qml/dialogs/TabletFileDialog.qml +++ b/interface/resources/qml/dialogs/TabletFileDialog.qml @@ -496,9 +496,6 @@ TabletModalWindow { itemDelegate: Item { clip: true - //FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - //FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - FiraSansSemiBold { text: getText(); elide: styleData.elideMode @@ -512,7 +509,7 @@ TabletModalWindow { size: hifi.fontSizes.tableText color: hifi.colors.baseGrayHighlight //font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir) - //? firaSansSemiBold.name : firaSansRegular.name + //? "Fira Sans SemiBold" : "Fira Sans" function getText() { if (styleData.row === -1) { diff --git a/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml b/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml index dabc66c502..84f4c694ff 100644 --- a/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml +++ b/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml @@ -345,9 +345,6 @@ Item { itemDelegate: Item { clip: true - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - FiraSansSemiBold { text: styleData.value elide: styleData.elideMode @@ -361,7 +358,7 @@ Item { size: hifi.fontSizes.tableText color: hifi.colors.baseGrayHighlight font.family: (styleData.row !== -1 && assetTableView.model.get(styleData.row).fileIsDir) - ? firaSansSemiBold.name : firaSansRegular.name + ? "Fira Sans SemiBold" : "Fira Sans" } } diff --git a/interface/resources/qml/hifi/AssetServer.qml b/interface/resources/qml/hifi/AssetServer.qml index 19a559b66c..34be11d4df 100644 --- a/interface/resources/qml/hifi/AssetServer.qml +++ b/interface/resources/qml/hifi/AssetServer.qml @@ -660,8 +660,7 @@ Windows.ScrollingWindow { text: styleData.value - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - font.family: firaSansSemiBold.name + font.family: "Fira Sans SemiBold" font.pixelSize: hifi.fontSizes.textFieldInput height: hifi.dimensions.tableRowHeight diff --git a/interface/resources/qml/hifi/ComboDialog.qml b/interface/resources/qml/hifi/ComboDialog.qml index 0b1a3b1a5c..06254bb7fb 100644 --- a/interface/resources/qml/hifi/ComboDialog.qml +++ b/interface/resources/qml/hifi/ComboDialog.qml @@ -25,8 +25,6 @@ Item { property int dialogHeight; property int comboOptionTextSize: 16; property int comboBodyTextSize: 16; - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } visible: false; id: combo; anchors.fill: parent; diff --git a/interface/resources/qml/hifi/DesktopLetterboxMessage.qml b/interface/resources/qml/hifi/DesktopLetterboxMessage.qml index 9230bbe962..ede8590bfb 100644 --- a/interface/resources/qml/hifi/DesktopLetterboxMessage.qml +++ b/interface/resources/qml/hifi/DesktopLetterboxMessage.qml @@ -24,8 +24,6 @@ Item { property real headerTextMargin: -5 property real headerGlyphMargin: -15 property bool isDesktop: false - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } visible: false id: letterbox anchors.fill: parent @@ -78,7 +76,8 @@ Item { // Text Size font.pixelSize: headerTextPixelSize // Style - font.family: ralewaySemiBold.name + font.family: "Raleway" + font.weight: Font.DemiBold color: hifi.colors.darkGray horizontalAlignment: Text.AlignHLeft verticalAlignment: Text.AlignVCenter @@ -101,7 +100,7 @@ Item { horizontalAlignment: Text.AlignHLeft // Style font.pixelSize: popupTextPixelSize - font.family: ralewayRegular.name + font.family: "Raleway" color: hifi.colors.darkGray wrapMode: Text.WordWrap textFormat: Text.StyledText diff --git a/interface/resources/qml/hifi/LetterboxMessage.qml b/interface/resources/qml/hifi/LetterboxMessage.qml index dcd0d906db..0e9ce89ddb 100644 --- a/interface/resources/qml/hifi/LetterboxMessage.qml +++ b/interface/resources/qml/hifi/LetterboxMessage.qml @@ -23,8 +23,6 @@ Item { property real popupTextPixelSize: 16 property real headerTextMargin: -5 property real headerGlyphMargin: -15 - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } visible: false id: letterbox anchors.fill: parent @@ -82,7 +80,8 @@ Item { // Text Size font.pixelSize: headerTextPixelSize // Style - font.family: ralewaySemiBold.name + font.family: "Raleway" + font.weight: Font.DemiBold color: hifi.colors.darkGray horizontalAlignment: Text.AlignHLeft verticalAlignment: Text.AlignVCenter @@ -127,7 +126,7 @@ Item { horizontalAlignment: Text.AlignHLeft // Style font.pixelSize: popupTextPixelSize - font.family: ralewayRegular.name + font.family: "Raleway" color: hifi.colors.darkGray wrapMode: Text.WordWrap textFormat: Text.StyledText diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index 4c9c746488..c97a802f10 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -177,8 +177,7 @@ Item { anchors.right: parent.right anchors.rightMargin: editGlyph.width + editGlyph.anchors.rightMargin // Style - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - font.family: firaSansSemiBold.name + font.family: "Fira Sans SemiBold" font.pixelSize: displayNameTextPixelSize selectionColor: hifi.colors.blueAccent selectedTextColor: "black" diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 699173aaeb..d779b4ba42 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -908,7 +908,6 @@ Rectangle { anchors.horizontalCenter: parent.horizontalCenter; } - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } Text { id: connectionHelpText; // Anchors @@ -923,7 +922,7 @@ Rectangle { horizontalAlignment: Text.AlignHLeft // Style font.pixelSize: 18; - font.family: ralewayRegular.name + font.family: "Raleway" color: hifi.colors.darkGray wrapMode: Text.WordWrap textFormat: Text.StyledText; diff --git a/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml b/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml index 8eb03c1254..8a7e809b3d 100644 --- a/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml +++ b/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml @@ -141,10 +141,9 @@ Item { } } - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } TextMetrics { id: textMetrics; - font.family: ralewayRegular.name + font.family: "Raleway" text: usernameText.text; } diff --git a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml index 07c85a7f6a..d0aa89923f 100644 --- a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml +++ b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml @@ -924,14 +924,13 @@ Item { anchors.right: parent.right; anchors.rightMargin: 20; height: 95; - - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } + TextArea { id: optionalMessage; property int maximumLength: 72; property string previousText: text; placeholderText: "Optional Public Message (" + maximumLength + " character limit)"; - font.family: firaSansSemiBold.name; + font.family: "Fira Sans SemiBold"; font.pixelSize: 20; // Anchors anchors.fill: parent; diff --git a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml index 0f70b44477..a85e5d4498 100644 --- a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml +++ b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml @@ -659,8 +659,7 @@ Rectangle { text: styleData.value - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - font.family: firaSansSemiBold.name + font.family: "Fira Sans SemiBold" font.pixelSize: hifi.fontSizes.textFieldInput height: hifi.dimensions.tableRowHeight diff --git a/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml b/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml index ead63537f0..08b0104fce 100644 --- a/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml +++ b/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml @@ -478,9 +478,6 @@ Rectangle { itemDelegate: Item { clip: true - //FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } - //FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } - FiraSansSemiBold { text: getText(); elide: styleData.elideMode @@ -494,7 +491,7 @@ Rectangle { size: hifi.fontSizes.tableText color: hifi.colors.baseGrayHighlight //font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir) - //? firaSansSemiBold.name : firaSansRegular.name + //? "Fira Sans SemiBold" : "Fira Sans" function getText() { if (styleData.row === -1) { diff --git a/interface/resources/qml/styles-uit/AnonymousProRegular.qml b/interface/resources/qml/styles-uit/AnonymousProRegular.qml index c832910ec2..d7e13423b6 100644 --- a/interface/resources/qml/styles-uit/AnonymousProRegular.qml +++ b/interface/resources/qml/styles-uit/AnonymousProRegular.qml @@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: anonymousProRegular; source: "qrc:/fonts/AnonymousPro-Regular.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: anonymousProRegular.name + font.family: "Anonymous Pro" } diff --git a/interface/resources/qml/styles-uit/FiraSansRegular.qml b/interface/resources/qml/styles-uit/FiraSansRegular.qml index 6d73210120..1166fa5cba 100644 --- a/interface/resources/qml/styles-uit/FiraSansRegular.qml +++ b/interface/resources/qml/styles-uit/FiraSansRegular.qml @@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: firaSansRegular.name + font.family: "Fira Sans" } diff --git a/interface/resources/qml/styles-uit/FiraSansSemiBold.qml b/interface/resources/qml/styles-uit/FiraSansSemiBold.qml index 2bfd319d49..2f095c57a6 100644 --- a/interface/resources/qml/styles-uit/FiraSansSemiBold.qml +++ b/interface/resources/qml/styles-uit/FiraSansSemiBold.qml @@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: firaSansSemiBold.name + font.family: "Fira Sans SemiBold" } diff --git a/interface/resources/qml/styles-uit/HiFiGlyphs.qml b/interface/resources/qml/styles-uit/HiFiGlyphs.qml index baab41e166..07f0212f0c 100644 --- a/interface/resources/qml/styles-uit/HiFiGlyphs.qml +++ b/interface/resources/qml/styles-uit/HiFiGlyphs.qml @@ -12,12 +12,11 @@ import QtQuick 2.5 Text { id: root - FontLoader { id: hiFiGlyphs; source: "qrc:/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 + font.family: "hifi-glyphs" } diff --git a/interface/resources/qml/styles-uit/RalewayBold.qml b/interface/resources/qml/styles-uit/RalewayBold.qml index 963d8d9ba4..5f42ecd90b 100644 --- a/interface/resources/qml/styles-uit/RalewayBold.qml +++ b/interface/resources/qml/styles-uit/RalewayBold.qml @@ -14,11 +14,10 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: ralewayBold; source: "qrc:/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. + font.family: "Raleway" + font.bold: true } diff --git a/interface/resources/qml/styles-uit/RalewayLight.qml b/interface/resources/qml/styles-uit/RalewayLight.qml index 8957b70c82..e6b12fca9c 100644 --- a/interface/resources/qml/styles-uit/RalewayLight.qml +++ b/interface/resources/qml/styles-uit/RalewayLight.qml @@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: ralewayLight; source: "qrc:/fonts/Raleway-Light.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: ralewayLight.name + font.family: "Raleway Light" } diff --git a/interface/resources/qml/styles-uit/RalewayRegular.qml b/interface/resources/qml/styles-uit/RalewayRegular.qml index fd2661928c..5c9b87dc8a 100644 --- a/interface/resources/qml/styles-uit/RalewayRegular.qml +++ b/interface/resources/qml/styles-uit/RalewayRegular.qml @@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: ralewayRegular.name + font.family: "Raleway" } diff --git a/interface/resources/qml/styles-uit/RalewaySemiBold.qml b/interface/resources/qml/styles-uit/RalewaySemiBold.qml index 7ec9ea3b34..0b25f900bc 100644 --- a/interface/resources/qml/styles-uit/RalewaySemiBold.qml +++ b/interface/resources/qml/styles-uit/RalewaySemiBold.qml @@ -14,10 +14,10 @@ import QtQuick.Controls.Styles 1.4 Text { id: root - FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; } property real size: 32 font.pixelSize: size verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft - font.family: ralewaySemiBold.name + font.family: "Raleway" + font.weight: Font.DemiBold } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 719fbf4ae8..fb17138fbb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -981,6 +981,15 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qInstallMessageHandler(messageHandler); QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "styles/Inconsolata.otf"); + QFontDatabase::addApplicationFont(":/fonts/fontawesome-webfont.ttf"); + QFontDatabase::addApplicationFont(":/fonts/hifi-glyphs.ttf"); + QFontDatabase::addApplicationFont(":/fonts/AnonymousPro-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/FiraSans-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/FiraSans-SemiBold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/Raleway-Light.ttf"); + QFontDatabase::addApplicationFont(":/fonts/Raleway-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/Raleway-Bold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/Raleway-SemiBold.ttf"); _window->setWindowTitle("High Fidelity Interface"); Model::setAbstractViewStateInterface(this); // The model class will sometimes need to know view state details from us From d1b87b31167019342a0388849e1c85686a5d3ad4 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 8 Mar 2018 12:14:42 -0800 Subject: [PATCH 223/267] Added missing avatar shadows. --- interface/src/avatar/MyAvatar.cpp | 12 ++++++------ interface/src/avatar/MyAvatar.h | 2 -- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b6fa3fde96..a5e24b8707 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1115,6 +1115,7 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { void MyAvatar::setEnableMeshVisible(bool isEnabled) { _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); + _skeletonModel->setCanCastShadow(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); } void MyAvatar::setEnableInverseKinematics(bool isEnabled) { @@ -1467,6 +1468,7 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); + _skeletonModel->setCanCastShadow(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); _headBoneSet.clear(); _cauterizationNeedsUpdate = true; @@ -1848,12 +1850,6 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName, Avatar::attach(modelURL, jointName, translation, rotation, scale, isSoft, allowDuplicates, useSaved); } -void MyAvatar::setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visible) { - if (model->isActive() && model->isRenderable()) { - model->setVisibleInScene(visible, scene, render::ItemKey::TAG_BITS_NONE, true); - } -} - void MyAvatar::initHeadBones() { int neckJointIndex = -1; if (_skeletonModel->isLoaded()) { @@ -2043,8 +2039,12 @@ void MyAvatar::preDisplaySide(RenderArgs* renderArgs) { _attachmentData[i].jointName.compare("RightEye", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { + _attachmentModels[i]->setVisibleInScene(shouldDrawHead, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); + + _attachmentModels[i]->setCanCastShadow(shouldDrawHead, qApp->getMain3DScene(), + render::ItemKey::TAG_BITS_NONE, true); } } } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index fa5206e128..2615f8fa0f 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -681,8 +681,6 @@ private: // These are made private for MyAvatar so that you will use the "use" methods instead virtual void setSkeletonModelURL(const QUrl& skeletonModelURL) override; - void setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visiblity); - virtual void updatePalms() override {} void lateUpdatePalms(); From a703b5a3b54dd658be2d15bf18ffe6e66165448e Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 8 Mar 2018 12:15:26 -0800 Subject: [PATCH 224/267] Added check to correct crashing when selecting ambient occlusion from menu. --- libraries/render-utils/src/DeferredLightingEffect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 665e767c7c..78bc3ba195 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -492,7 +492,7 @@ void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, batch.setResourceTexture(DEFERRED_BUFFER_DEPTH_UNIT, deferredFramebuffer->getPrimaryDepthTexture()); // FIXME: Different render modes should have different tasks - if (args->_renderMode == RenderArgs::DEFAULT_RENDER_MODE && deferredLightingEffect->isAmbientOcclusionEnabled()) { + if (args->_renderMode == RenderArgs::DEFAULT_RENDER_MODE && deferredLightingEffect->isAmbientOcclusionEnabled() && ambientOcclusionFramebuffer) { batch.setResourceTexture(DEFERRED_BUFFER_OBSCURANCE_UNIT, ambientOcclusionFramebuffer->getOcclusionTexture()); } else { // need to assign the white texture if ao is off From 22f18dbf56598b3644cddd9739e8e54c59856217 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 8 Mar 2018 13:12:13 -0800 Subject: [PATCH 225/267] Don't hit certain Commerce backend endpoints when wallet isn't yet auth'd --- interface/src/commerce/Ledger.cpp | 41 ++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 712c505e8a..858af9b13d 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -80,9 +80,13 @@ void Ledger::signedSend(const QString& propertyName, const QByteArray& text, con void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail, QJsonObject& requestParams) { auto wallet = DependencyManager::get(); - requestParams["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); - - send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + requestParams["public_keys"] = QJsonArray::fromStringList(cachedPublicKeys); + send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams); + } else { + qDebug(commerce) << "User attempted to call keysQuery, but cachedPublicKeys was empty!"; + } } void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail) { @@ -296,14 +300,18 @@ void Ledger::updateLocation(const QString& asset_id, const QString location, con emit walletScriptingInterface->walletNotSetup(); qDebug(commerce) << "User attempted to update the location of a certificate, but their wallet wasn't ready. Status:" << walletStatus; } else { - QStringList keys = wallet->listPublicKeys(); - QString key = keys[0]; - QJsonObject transaction; - transaction["certificate_id"] = asset_id; - transaction["place_name"] = location; - QJsonDocument transactionDoc{ transaction }; - auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); - signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + QString key = cachedPublicKeys[0]; + QJsonObject transaction; + transaction["certificate_id"] = asset_id; + transaction["place_name"] = location; + QJsonDocument transactionDoc{ transaction }; + auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); + signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure); + } else { + qDebug(commerce) << "User attempted to update the location of a certificate, but cachedPublicKeys was empty!"; + } } } @@ -359,7 +367,12 @@ void Ledger::alreadyOwned(const QString& marketplaceId) { auto wallet = DependencyManager::get(); QString endpoint = "already_owned"; QJsonObject request; - request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); - request["marketplace_item_id"] = marketplaceId; - send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); + request["marketplace_item_id"] = marketplaceId; + send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request); + } else { + qDebug(commerce) << "User attempted to use the alreadyOwned endpoint, but cachedPublicKeys was empty!"; + } } From b273d78729d7f6922a8e87d85ccdb262fc66cbcd Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 8 Mar 2018 13:12:13 -0800 Subject: [PATCH 226/267] Don't hit certain Commerce backend endpoints when wallet isn't yet auth'd --- interface/src/commerce/Ledger.cpp | 41 ++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 712c505e8a..858af9b13d 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -80,9 +80,13 @@ void Ledger::signedSend(const QString& propertyName, const QByteArray& text, con void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail, QJsonObject& requestParams) { auto wallet = DependencyManager::get(); - requestParams["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); - - send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + requestParams["public_keys"] = QJsonArray::fromStringList(cachedPublicKeys); + send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams); + } else { + qDebug(commerce) << "User attempted to call keysQuery, but cachedPublicKeys was empty!"; + } } void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail) { @@ -296,14 +300,18 @@ void Ledger::updateLocation(const QString& asset_id, const QString location, con emit walletScriptingInterface->walletNotSetup(); qDebug(commerce) << "User attempted to update the location of a certificate, but their wallet wasn't ready. Status:" << walletStatus; } else { - QStringList keys = wallet->listPublicKeys(); - QString key = keys[0]; - QJsonObject transaction; - transaction["certificate_id"] = asset_id; - transaction["place_name"] = location; - QJsonDocument transactionDoc{ transaction }; - auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); - signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + QString key = cachedPublicKeys[0]; + QJsonObject transaction; + transaction["certificate_id"] = asset_id; + transaction["place_name"] = location; + QJsonDocument transactionDoc{ transaction }; + auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); + signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure); + } else { + qDebug(commerce) << "User attempted to update the location of a certificate, but cachedPublicKeys was empty!"; + } } } @@ -359,7 +367,12 @@ void Ledger::alreadyOwned(const QString& marketplaceId) { auto wallet = DependencyManager::get(); QString endpoint = "already_owned"; QJsonObject request; - request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); - request["marketplace_item_id"] = marketplaceId; - send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request); + QStringList cachedPublicKeys = wallet->listPublicKeys(); + if (!cachedPublicKeys.isEmpty()) { + request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys()); + request["marketplace_item_id"] = marketplaceId; + send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request); + } else { + qDebug(commerce) << "User attempted to use the alreadyOwned endpoint, but cachedPublicKeys was empty!"; + } } From 409f5293bfe7214c3bdb71e79daa3cbe480a85cd Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 8 Mar 2018 13:51:34 -0800 Subject: [PATCH 227/267] Try this --- interface/src/Application.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fb17138fbb..cd99a91073 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -981,15 +981,15 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qInstallMessageHandler(messageHandler); QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "styles/Inconsolata.otf"); - QFontDatabase::addApplicationFont(":/fonts/fontawesome-webfont.ttf"); - QFontDatabase::addApplicationFont(":/fonts/hifi-glyphs.ttf"); - QFontDatabase::addApplicationFont(":/fonts/AnonymousPro-Regular.ttf"); - QFontDatabase::addApplicationFont(":/fonts/FiraSans-Regular.ttf"); - QFontDatabase::addApplicationFont(":/fonts/FiraSans-SemiBold.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Raleway-Light.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Raleway-Regular.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Raleway-Bold.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Raleway-SemiBold.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/fontawesome-webfont.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/hifi-glyphs.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/AnonymousPro-Regular.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/FiraSans-Regular.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/FiraSans-SemiBold.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Light.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Regular.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Bold.ttf"); + QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-SemiBold.ttf"); _window->setWindowTitle("High Fidelity Interface"); Model::setAbstractViewStateInterface(this); // The model class will sometimes need to know view state details from us From 9d805283d14bc31d61d19abf11fd41ee1d283015 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 8 Mar 2018 14:24:44 -0800 Subject: [PATCH 228/267] clear wallet when picking a new one --- .../qml/hifi/commerce/wallet/Wallet.qml | 3 ++- interface/src/commerce/QmlCommerce.cpp | 5 ++++ interface/src/commerce/QmlCommerce.h | 1 + interface/src/commerce/Wallet.cpp | 24 +++++++++++-------- interface/src/commerce/Wallet.h | 3 ++- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index fa065bc4de..b8b34dc395 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -174,11 +174,12 @@ Rectangle { WalletChoice { id: walletChoice; proceedFunction: function (isReset) { - console.log(isReset ? "Reset wallet." : "Trying again with new wallet."); + console.log("WalletChoice", isReset ? "Reset wallet." : "Trying again with new wallet."); Commerce.setSoftReset(); if (isReset) { walletResetSetup(); } else { + Commerce.clearWallet(); var msg = { referrer: walletChoice.referrer } followReferrer(msg); } diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp index 557193c074..53ec59049f 100644 --- a/interface/src/commerce/QmlCommerce.cpp +++ b/interface/src/commerce/QmlCommerce.cpp @@ -138,6 +138,11 @@ void QmlCommerce::setSoftReset() { wallet->setSoftReset(); } +void QmlCommerce::clearWallet() { + auto wallet = DependencyManager::get(); + wallet->clear(); +} + void QmlCommerce::setPassphrase(const QString& passphrase) { auto wallet = DependencyManager::get(); wallet->setPassphrase(passphrase); diff --git a/interface/src/commerce/QmlCommerce.h b/interface/src/commerce/QmlCommerce.h index 6a4eaa2be2..b4af4393e3 100644 --- a/interface/src/commerce/QmlCommerce.h +++ b/interface/src/commerce/QmlCommerce.h @@ -67,6 +67,7 @@ protected: Q_INVOKABLE void setPassphrase(const QString& passphrase); Q_INVOKABLE void changePassphrase(const QString& oldPassphrase, const QString& newPassphrase); Q_INVOKABLE void setSoftReset(); + Q_INVOKABLE void clearWallet(); Q_INVOKABLE void buy(const QString& assetId, int cost, const bool controlledFailure = false); Q_INVOKABLE void balance(); diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index fad82115d6..060f8de09b 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -343,19 +343,23 @@ Wallet::Wallet() { auto accountManager = DependencyManager::get(); connect(accountManager.data(), &AccountManager::usernameChanged, this, [&]() { getWalletStatus(); - _publicKeys.clear(); - - if (_securityImage) { - delete _securityImage; - } - _securityImage = nullptr; - - // tell the provider we got nothing - updateImageProvider(); - _passphrase->clear(); + clear(); }); } +void Wallet::clear() { + _publicKeys.clear(); + + if (_securityImage) { + delete _securityImage; + } + _securityImage = nullptr; + + // tell the provider we got nothing + updateImageProvider(); + _passphrase->clear(); +} + Wallet::~Wallet() { if (_securityImage) { delete _securityImage; diff --git a/interface/src/commerce/Wallet.h b/interface/src/commerce/Wallet.h index d771f404e5..8a7d6b8c07 100644 --- a/interface/src/commerce/Wallet.h +++ b/interface/src/commerce/Wallet.h @@ -49,8 +49,9 @@ public: bool getPassphraseIsCached() { return !(_passphrase->isEmpty()); } bool walletIsAuthenticatedWithPassphrase(); bool changePassphrase(const QString& newPassphrase); - void setSoftReset() { _isOverridingServer = true; } + void setSoftReset() { _isOverridingServer = true; } bool wasSoftReset() { bool was = _isOverridingServer; _isOverridingServer = false; return was; } + void clear(); void getWalletStatus(); enum WalletStatus { From 47b08d722880ba24c94b8fd730c049d221499f13 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 8 Mar 2018 15:38:00 -0800 Subject: [PATCH 229/267] Update Hifi icon --- android/app/src/main/AndroidManifest.xml | 4 ++-- .../app/src/main/res/drawable/ic_launcher.xml | 17 +++++++++++++++++ android/app/src/main/res/drawable/icon.png | Bin 9914 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 5195 -> 0 bytes .../main/res/mipmap-hdpi/ic_launcher_round.png | Bin 5023 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 4333 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_round.png | Bin 4369 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 5931 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 5635 -> 0 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7424 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 6905 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9114 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 8380 -> 0 bytes 13 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_launcher.xml delete mode 100644 android/app/src/main/res/drawable/icon.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5e93bdffa3..b3a8c87649 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -19,9 +19,9 @@ android:allowBackup="true" android:screenOrientation="unspecified" android:theme="@style/NoSystemUI" - android:icon="@mipmap/ic_launcher" + android:icon="@drawable/ic_launcher" android:launchMode="singleTop" - android:roundIcon="@mipmap/ic_launcher_round"> + android:roundIcon="@drawable/ic_launcher"> diff --git a/android/app/src/main/res/drawable/ic_launcher.xml b/android/app/src/main/res/drawable/ic_launcher.xml new file mode 100644 index 0000000000..03b1edc4e9 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/icon.png b/android/app/src/main/res/drawable/icon.png deleted file mode 100644 index 70aaf9b4ed60a80081821907d53086beb249eb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9914 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 P0B~TR#op}QjIjR)wK5d} diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index d376d7af8852da4934eed5fb8b3fa718a6977d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5195 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 FV1h;$)&2kg diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 81a137957d489151137f4ec48490fed96ddf0373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5023 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

FpAv>ypK&zL`d0&`aN|8w zg&BM-aN6V<;pwx&q4TQIN0n!uPRC=Ub~O;&_$jfkK1o>Hey#;x7QxW^tkV(Sf2$~k zvXWzzZQm#((M$ExvU3CDCKVW?E76KdkdbIQ5T^U#bhYEOG?Uu?8_C~)>~vb1zjfoW z&xK*G5N6;HzdI-f<#!w9qHMcFrL2i4H5MonQY%8rkXLUcaNSm*5h=F`!~98TdedOU bmA?l7BAQ7ybVso%00000NkvXXu0mjfd0HQi diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index d032c300142532c9cd1d2679277d365c20f4e964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 N002ovPDHLkV1nK$3jhEB diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 3cccf1037b45e43400c9648cdc9cc129d8df2e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5635 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index e97062e0ee222ba85204e3e6b2758c622eddd6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7424 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 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f01203c738e29c6371cd4185ab10c9a817ea33d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9114 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 Tu8OV$002TsQ?W|kJmh}>;TD+- From f1ef085b4b2b5b31c5cc64d72f165b682f0a8816 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 9 Mar 2018 15:34:56 +1300 Subject: [PATCH 230/267] Add canCastShadows and castShadows properties --- libraries/entities/src/EntityItemProperties.cpp | 5 ++++- libraries/entities/src/KeyLightPropertyGroup.h | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 1ef4728c0d..d348101b66 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -471,6 +471,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {boolean} locked=false - Whether or not the entity can be edited or deleted. If true then the * entity's properties other than locked cannot be changed, and the entity cannot be deleted. * @property {boolean} visible=true - Whether or not the entity is rendered. If true then the entity is rendered. + * @property {boolean} canCastShadows=true - Whether or not the entity casts shadows. Currently applicable only to + * {@link Entities.EntityType|Model} and {@link Entities.EntityType|Shape} entities. Shadows are cast if inside a + * {@link Entities.EntityType|Zone} entity with castShadows enabled in its {@link Entities.EntityProperties-Zone|keyLight} property. * * @property {Vec3} position=0,0,0 - The position of the entity. * @property {Quat} rotation=0,0,0,1 - The orientation of the entity with respect to world coordinates. @@ -1189,7 +1192,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow); // Relevant to Shape and Model entities only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISIONLESS, collisionless); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISIONLESS, collisionless, ignoreForCollisions, getCollisionless()); // legacy support COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_MASK, collisionMask); diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index 007e8b2005..2be33787de 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -33,6 +33,9 @@ class ReadBitstreamToTreeParams; * @property {Color} color=255,255,255 - The color of the light. * @property {number} intensity=1 - The intensity of the light. * @property {Vec3} direction=0,-1,0 - The direction the light is shining. + * @property {boolean} castShadows=false - If true then shadows are cast. Shadows are cast by avatars, plus + * {@link Entities.EntityType|Model} and {@link Entities.EntityType|Shape} entities that have their + * {@link Entities.EntityProperties|canCastShadows} property set to true. */ class KeyLightPropertyGroup : public PropertyGroup { public: From 77901e5089b38ae91b810d23d0b4c80f1c8c89dc Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 8 Mar 2018 20:11:35 -0800 Subject: [PATCH 231/267] Corrected MacOS warnings. --- tools/auto-tester/src/Test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index c14c6b9437..9bced3d1fc 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -329,7 +329,7 @@ void Test::createRecursiveScriptsRecursively() { QString directory = it.next(); // Only process directories - QDir dir(); + QDir dir; if (!isAValidDirectory(directory)) { continue; } @@ -341,7 +341,7 @@ void Test::createRecursiveScriptsRecursively() { QString directory2 = it2.next(); // Only process directories - QDir dir(); + QDir dir; if (isAValidDirectory(directory2)) { hasNoSubDirectories = false; break; From 81de668c1edec983420d4b1f9a6cfb5e677486ef Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 23 Feb 2018 11:20:45 -0800 Subject: [PATCH 232/267] faster per-entity raypick culling --- libraries/entities/src/EntityTreeElement.cpp | 33 +++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 9e32bc3346..1ebb07c3a2 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -643,25 +643,25 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori int entityNumber = 0; EntityItemID entityID; forEachEntity([&](EntityItemPointer entity) { - if ( (visibleOnly && !entity->isVisible()) || (collidableOnly && (entity->getCollisionless() || entity->getShapeType() == SHAPE_TYPE_NONE)) - || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) - || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { - return; - } - + // use simple line-sphere for broadphase check + // (this is faster and more likely to cull results than the filter check below so we do it first) bool success; AABox entityBox = entity->getAABox(success); if (!success) { return; } + glm::vec3 sphereCenter = entityBox.calcCenter() - origin; + float r2 = 0.25f * glm::length2(entityBox.getScale()); + float d = glm::dot(sphereCenter, direction); + if (glm::length2(sphereCenter) > r2 && (glm::abs(d) > 0.0f && glm::distance2(d * direction, sphereCenter) > r2)) { + return; + } - float localDistance; - BoxFace localFace; - glm::vec3 localSurfaceNormal; - QVariantMap localExtraInfo; - - // if the ray doesn't intersect with our cube, we can stop searching! - if (!entityBox.findRayIntersection(origin, direction, localDistance, localFace, localSurfaceNormal)) { + // check RayPick filter settings + if ((visibleOnly && !entity->isVisible()) + || (collidableOnly && (entity->getCollisionless() || entity->getShapeType() == SHAPE_TYPE_NONE)) + || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) + || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { return; } @@ -682,14 +682,17 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori // we can use the AABox's ray intersection by mapping our origin and direction into the entity frame // and testing intersection there. + float localDistance; + BoxFace localFace; + glm::vec3 localSurfaceNormal; if (entityFrameBox.findRayIntersection(entityFrameOrigin, entityFrameDirection, localDistance, localFace, localSurfaceNormal)) { if (entityFrameBox.contains(entityFrameOrigin) || localDistance < distance) { // now ask the entity if we actually intersect if (entity->supportsDetailedRayIntersection()) { + QVariantMap localExtraInfo; if (entity->findDetailedRayIntersection(origin, direction, keepSearching, element, localDistance, - localFace, localSurfaceNormal, localExtraInfo, precisionPicking)) { - + localFace, localSurfaceNormal, localExtraInfo, precisionPicking)) { if (localDistance < distance) { distance = localDistance; face = localFace; From 79b9fec900f5587b1de2c2686cad4e0649e054f9 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 23 Feb 2018 16:08:31 -0800 Subject: [PATCH 233/267] add rayHitsSphere() util method --- libraries/shared/src/GeometryUtil.cpp | 8 ++++++++ libraries/shared/src/GeometryUtil.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/libraries/shared/src/GeometryUtil.cpp b/libraries/shared/src/GeometryUtil.cpp index 0742a5625b..65adc28e07 100644 --- a/libraries/shared/src/GeometryUtil.cpp +++ b/libraries/shared/src/GeometryUtil.cpp @@ -40,6 +40,14 @@ glm::vec3 computeVectorFromPointToSegment(const glm::vec3& point, const glm::vec } } +bool rayHitsSphere(const glm::vec3& rayStart, const glm::vec3& rayDirection, + const glm::vec3& sphereCenter, float sphereRadiusSquared) { + glm::vec3 center = sphereCenter - rayStart; + float distance = glm::dot(center, rayDirection); + return (glm::length2(center) < sphereRadiusSquared + || (glm::abs(distance) > 0.0f && glm::distance2(distance * rayDirection, center) < sphereRadiusSquared)); +} + // Computes the penetration between a point and a sphere (centered at the origin) // if point is inside sphere: returns true and stores the result in 'penetration' // (the vector that would move the point outside the sphere) diff --git a/libraries/shared/src/GeometryUtil.h b/libraries/shared/src/GeometryUtil.h index 4832616fbd..bc09b71fc6 100644 --- a/libraries/shared/src/GeometryUtil.h +++ b/libraries/shared/src/GeometryUtil.h @@ -19,6 +19,9 @@ class Plane; glm::vec3 computeVectorFromPointToSegment(const glm::vec3& point, const glm::vec3& start, const glm::vec3& end); +bool rayHitsSphere(const glm::vec3& rayStart, const glm::vec3& rayDirection, + const glm::vec3& sphereCenter, float sphereRadiusSquared); + /// Computes the penetration between a point and a sphere (centered at the origin) /// \param point the point location relative to sphere center (origin) /// \param defaultDirection the direction of the pentration when the point is near the origin From 6ab85d5800266635a51f23f01f829045e10ed600 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 23 Feb 2018 16:09:03 -0800 Subject: [PATCH 234/267] cleanup and a few small optimizations --- libraries/entities/src/EntityTreeElement.cpp | 40 +++++++++----------- libraries/entities/src/EntityTreeElement.h | 2 +- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 1ebb07c3a2..e6bcdc9487 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -598,13 +598,13 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con EntityItemID result; float distanceToElementCube = std::numeric_limits::max(); - float distanceToElementDetails = distance; BoxFace localFace; glm::vec3 localSurfaceNormal; - QVariantMap localExtraInfo; - // if the ray doesn't intersect with our cube, we can stop searching! - if (!_cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal)) { + // if the ray doesn't intersect with our cube OR the distance to element is less than current best distance + // we can stop searching! + if (!_cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal) + || (!_cube.contains(origin) && distanceToElementCube > distance)) { keepSearching = false; // no point in continuing to search return result; // we did not intersect } @@ -616,20 +616,17 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con // if the distance to the element cube is not less than the current best distance, then it's not possible // for any details inside the cube to be closer so we don't need to consider them. - if (_cube.contains(origin) || distanceToElementCube < distance) { - - EntityItemID entityID = findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, - face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, - localExtraInfo, precisionPicking, distanceToElementCube); - if (!entityID.isNull()) { - if (distanceToElementDetails < distance) { - distance = distanceToElementDetails; - face = localFace; - surfaceNormal = localSurfaceNormal; - extraInfo = localExtraInfo; - result = entityID; - } - } + QVariantMap localExtraInfo; + float distanceToElementDetails = distance; + EntityItemID entityID = findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, + face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, + localExtraInfo, precisionPicking); + if (!entityID.isNull() && distanceToElementDetails < distance) { + distance = distanceToElementDetails; + face = localFace; + surfaceNormal = localSurfaceNormal; + extraInfo = localExtraInfo; + result = entityID; } return result; } @@ -637,7 +634,7 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, - bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking, float distanceToElementCube) { + bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking) { // only called if we do intersect our bounding cube, but find if we actually intersect with entities... int entityNumber = 0; @@ -650,10 +647,7 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori if (!success) { return; } - glm::vec3 sphereCenter = entityBox.calcCenter() - origin; - float r2 = 0.25f * glm::length2(entityBox.getScale()); - float d = glm::dot(sphereCenter, direction); - if (glm::length2(sphereCenter) > r2 && (glm::abs(d) > 0.0f && glm::distance2(d * direction, sphereCenter) > r2)) { + if (!rayHitsSphere(origin, direction, entityBox.calcCenter(), 0.25f * glm::length2(entityBox.getScale()))) { return; } diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index 2313bde0c4..80707fcb14 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -155,7 +155,7 @@ public: bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, - QVariantMap& extraInfo, bool precisionPicking, float distanceToElementCube); + QVariantMap& extraInfo, bool precisionPicking); virtual bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const override; From 2750f3ee71d350e7a9451dce9dfc9a1075dbfb5b Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 23 Feb 2018 16:38:42 -0800 Subject: [PATCH 235/267] remove unused cruft and avoid useless work --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 2 +- .../entities-renderer/src/RenderableModelEntityItem.h | 2 +- .../entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 2 +- .../entities-renderer/src/RenderablePolyVoxEntityItem.h | 2 +- libraries/entities/src/EntityItem.h | 2 +- libraries/entities/src/EntityTreeElement.cpp | 8 +++----- libraries/entities/src/EntityTreeElement.h | 2 +- libraries/entities/src/LightEntityItem.cpp | 2 +- libraries/entities/src/LightEntityItem.h | 2 +- libraries/entities/src/LineEntityItem.h | 2 +- libraries/entities/src/PolyLineEntityItem.h | 2 +- libraries/entities/src/PolyVoxEntityItem.h | 2 +- libraries/entities/src/ShapeEntityItem.cpp | 2 +- libraries/entities/src/ShapeEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.h | 2 +- libraries/entities/src/WebEntityItem.cpp | 2 +- libraries/entities/src/WebEntityItem.h | 2 +- libraries/entities/src/ZoneEntityItem.cpp | 2 +- libraries/entities/src/ZoneEntityItem.h | 2 +- 20 files changed, 22 insertions(+), 24 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index eb42e9af22..c4fa71a488 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -286,7 +286,7 @@ bool RenderableModelEntityItem::supportsDetailedRayIntersection() const { } bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { auto model = getModel(); if (!model) { diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 5d7d84b7bc..68bc70c8a9 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -68,7 +68,7 @@ public: virtual bool supportsDetailedRayIntersection() const override; virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 2b1de8d11b..0211daff1e 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -565,7 +565,7 @@ public: #endif bool RenderablePolyVoxEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 0a00d1cb73..70c87dca6f 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -53,7 +53,7 @@ public: virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index d08c5514e9..0303964e18 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -159,7 +159,7 @@ public: virtual bool supportsDetailedRayIntersection() const { return false; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { return true; } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index e6bcdc9487..2c51ff13f1 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -594,8 +594,6 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking) { - keepSearching = true; // assume that we will continue searching after this. - EntityItemID result; float distanceToElementCube = std::numeric_limits::max(); BoxFace localFace; @@ -618,7 +616,7 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con // for any details inside the cube to be closer so we don't need to consider them. QVariantMap localExtraInfo; float distanceToElementDetails = distance; - EntityItemID entityID = findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, + EntityItemID entityID = findDetailedRayIntersection(origin, direction, element, distanceToElementDetails, face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, localExtraInfo, precisionPicking); if (!entityID.isNull() && distanceToElementDetails < distance) { @@ -631,7 +629,7 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con return result; } -EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, +EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking) { @@ -685,7 +683,7 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori // now ask the entity if we actually intersect if (entity->supportsDetailedRayIntersection()) { QVariantMap localExtraInfo; - if (entity->findDetailedRayIntersection(origin, direction, keepSearching, element, localDistance, + if (entity->findDetailedRayIntersection(origin, direction, element, localDistance, localFace, localSurfaceNormal, localExtraInfo, precisionPicking)) { if (localDistance < distance) { distance = localDistance; diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index 80707fcb14..b219d64d9d 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -152,7 +152,7 @@ public: const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking = false); virtual EntityItemID findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking); diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 85edefa413..3f7fc5f799 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -298,7 +298,7 @@ void LightEntityItem::resetLightPropertiesChanged() { } bool LightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 3be1d48aa5..4d0bde3718 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -86,7 +86,7 @@ public: virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index 9f16807084..375453e0e9 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -61,7 +61,7 @@ class LineEntityItem : public EntityItem { // never have a ray intersection pick a LineEntityItem. virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override { return false; } diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index 8af2b26216..2dc8befe97 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -94,7 +94,7 @@ class PolyLineEntityItem : public EntityItem { // never have a ray intersection pick a PolyLineEntityItem. virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override { return false; } diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 47d2a4b4e1..90982fe448 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -45,7 +45,7 @@ class PolyVoxEntityItem : public EntityItem { // never have a ray intersection pick a PolyVoxEntityItem. virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override { return false; } diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index 2425208a87..db3d6798be 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -228,7 +228,7 @@ bool ShapeEntityItem::supportsDetailedRayIntersection() const { } bool ShapeEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { // determine the ray in the frame of the entity transformed from a unit sphere diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h index 7ad1b3c1c2..46d696f979 100644 --- a/libraries/entities/src/ShapeEntityItem.h +++ b/libraries/entities/src/ShapeEntityItem.h @@ -92,7 +92,7 @@ public: bool supportsDetailedRayIntersection() const override; bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 7b1089e6ed..7030a95562 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -129,7 +129,7 @@ void TextEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits } bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { glm::vec3 dimensions = getScaledDimensions(); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 3ab743ecfd..06b377ee14 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -48,7 +48,7 @@ public: virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp index 91e7bca063..548bca3225 100644 --- a/libraries/entities/src/WebEntityItem.cpp +++ b/libraries/entities/src/WebEntityItem.cpp @@ -106,7 +106,7 @@ void WebEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitst } bool WebEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { glm::vec3 dimensions = getScaledDimensions(); diff --git a/libraries/entities/src/WebEntityItem.h b/libraries/entities/src/WebEntityItem.h index 7d8f37cd83..dab7cd5e22 100644 --- a/libraries/entities/src/WebEntityItem.h +++ b/libraries/entities/src/WebEntityItem.h @@ -47,7 +47,7 @@ public: virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 6083e5b8de..4ae020f966 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -296,7 +296,7 @@ void ZoneEntityItem::setCompoundShapeURL(const QString& url) { } bool ZoneEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const { diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 95b6248fde..2c6b01fc69 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -105,7 +105,7 @@ public: virtual bool supportsDetailedRayIntersection() const override { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, + OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override; From 7a19f48b9c36579fa68eb2fb833470e2503016a6 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 1 Mar 2018 16:15:26 -0800 Subject: [PATCH 236/267] move rayHitsSphere logic to AABox method --- libraries/entities/src/EntityTreeElement.cpp | 2 +- libraries/shared/src/AABox.cpp | 9 +++++++++ libraries/shared/src/AABox.h | 1 + libraries/shared/src/GeometryUtil.cpp | 8 -------- libraries/shared/src/GeometryUtil.h | 3 --- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 2c51ff13f1..654d4b4ecc 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -645,7 +645,7 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori if (!success) { return; } - if (!rayHitsSphere(origin, direction, entityBox.calcCenter(), 0.25f * glm::length2(entityBox.getScale()))) { + if (!entityBox.rayHitsBoundingSphere(origin, direction)) { return; } diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp index cea0a83d52..cbf3c1b785 100644 --- a/libraries/shared/src/AABox.cpp +++ b/libraries/shared/src/AABox.cpp @@ -287,6 +287,15 @@ bool AABox::findRayIntersection(const glm::vec3& origin, const glm::vec3& direct return false; } +bool AABox::rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const { + glm::vec3 localCenter = calcCenter() - origin; + float distance = glm::dot(localCenter, direction); + const float ONE_OVER_TWO_SQUARED = 0.25f; + float radiusSquared = ONE_OVER_TWO_SQUARED * glm::length2(_scale); + return (glm::length2(localCenter) < radiusSquared + || (glm::abs(distance) > 0.0f && glm::distance2(distance * direction, localCenter) < radiusSquared)); +} + bool AABox::touchesSphere(const glm::vec3& center, float radius) const { // Avro's algorithm from this paper: http://www.mrtc.mdh.se/projects/3Dgraphics/paperF.pdf glm::vec3 e = glm::max(_corner - center, Vectors::ZERO) + glm::max(center - _corner - _scale, Vectors::ZERO); diff --git a/libraries/shared/src/AABox.h b/libraries/shared/src/AABox.h index 24485eaad6..2d5ca242d6 100644 --- a/libraries/shared/src/AABox.h +++ b/libraries/shared/src/AABox.h @@ -71,6 +71,7 @@ public: bool expandedIntersectsSegment(const glm::vec3& start, const glm::vec3& end, float expansion) const; bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal) const; + bool rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const; bool touchesSphere(const glm::vec3& center, float radius) const; // fast but may generate false positives bool touchesAAEllipsoid(const glm::vec3& center, const glm::vec3& radials) const; bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration) const; diff --git a/libraries/shared/src/GeometryUtil.cpp b/libraries/shared/src/GeometryUtil.cpp index 65adc28e07..0742a5625b 100644 --- a/libraries/shared/src/GeometryUtil.cpp +++ b/libraries/shared/src/GeometryUtil.cpp @@ -40,14 +40,6 @@ glm::vec3 computeVectorFromPointToSegment(const glm::vec3& point, const glm::vec } } -bool rayHitsSphere(const glm::vec3& rayStart, const glm::vec3& rayDirection, - const glm::vec3& sphereCenter, float sphereRadiusSquared) { - glm::vec3 center = sphereCenter - rayStart; - float distance = glm::dot(center, rayDirection); - return (glm::length2(center) < sphereRadiusSquared - || (glm::abs(distance) > 0.0f && glm::distance2(distance * rayDirection, center) < sphereRadiusSquared)); -} - // Computes the penetration between a point and a sphere (centered at the origin) // if point is inside sphere: returns true and stores the result in 'penetration' // (the vector that would move the point outside the sphere) diff --git a/libraries/shared/src/GeometryUtil.h b/libraries/shared/src/GeometryUtil.h index bc09b71fc6..4832616fbd 100644 --- a/libraries/shared/src/GeometryUtil.h +++ b/libraries/shared/src/GeometryUtil.h @@ -19,9 +19,6 @@ class Plane; glm::vec3 computeVectorFromPointToSegment(const glm::vec3& point, const glm::vec3& start, const glm::vec3& end); -bool rayHitsSphere(const glm::vec3& rayStart, const glm::vec3& rayDirection, - const glm::vec3& sphereCenter, float sphereRadiusSquared); - /// Computes the penetration between a point and a sphere (centered at the origin) /// \param point the point location relative to sphere center (origin) /// \param defaultDirection the direction of the pentration when the point is near the origin From 9fbe7ec194da243c0cc48eb46e61905bb946a56d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 1 Mar 2018 22:48:55 -0800 Subject: [PATCH 237/267] time-box Picks and solve in round-robin sequence --- .../src/raypick/PickScriptingInterface.cpp | 10 +- .../src/raypick/PickScriptingInterface.h | 10 +- libraries/entities/src/EntityItem.cpp | 2 +- libraries/pointers/src/PickCacheOptimizer.h | 125 ++++++++++-------- libraries/pointers/src/PickManager.cpp | 9 +- libraries/pointers/src/PickManager.h | 11 +- 6 files changed, 107 insertions(+), 60 deletions(-) diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index 43e0c059f0..1bf6dd2f8e 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -174,4 +174,12 @@ void PickScriptingInterface::registerMetaTypes(QScriptEngine* engine) { engine->globalObject().setProperty("PickType", pickTypes); qScriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue); -} \ No newline at end of file +} + +unsigned int PickScriptingInterface::getPerFrameTimeBudget() const { + return DependencyManager::get()->getPerFrameTimeBudget(); +} + +void PickScriptingInterface::setPerFrameTimeBudget(unsigned int numUsecs) { + DependencyManager::get()->setPerFrameTimeBudget(numUsecs); +} diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h index 98427e34ca..288d3008bb 100644 --- a/interface/src/raypick/PickScriptingInterface.h +++ b/interface/src/raypick/PickScriptingInterface.h @@ -185,6 +185,14 @@ public: */ Q_INVOKABLE bool isMouse(unsigned int uid); + Q_PROPERTY(unsigned int perFrameTimeBudget READ getPerFrameTimeBudget WRITE setPerFrameTimeBudget) + /**jsdoc + * The max number of usec to spend per frame updating Pick results. + * @typedef {number} Picks.perFrameTimeBudget + */ + unsigned int getPerFrameTimeBudget() const; + void setPerFrameTimeBudget(unsigned int numUsecs); + public slots: static constexpr unsigned int PICK_NOTHING() { return 0; } static constexpr unsigned int PICK_ENTITIES() { return PickFilter::getBitMask(PickFilter::FlagBit::PICK_ENTITIES); } @@ -202,4 +210,4 @@ public slots: static constexpr unsigned int INTERSECTED_HUD() { return IntersectionType::HUD; } }; -#endif // hifi_PickScriptingInterface_h \ No newline at end of file +#endif // hifi_PickScriptingInterface_h diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index f77d8a59c3..c01ebe8ca4 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2984,4 +2984,4 @@ std::unordered_map EntityItem::getMaterial toReturn = _materials; } return toReturn; -} \ No newline at end of file +} diff --git a/libraries/pointers/src/PickCacheOptimizer.h b/libraries/pointers/src/PickCacheOptimizer.h index 10c9d6cf84..e930f8c663 100644 --- a/libraries/pointers/src/PickCacheOptimizer.h +++ b/libraries/pointers/src/PickCacheOptimizer.h @@ -37,7 +37,7 @@ template class PickCacheOptimizer { public: - void update(std::unordered_map>& picks, bool shouldPickHUD); + void update(std::unordered_map>& picks, uint32_t& nextToUpdate, uint64_t expiry, bool shouldPickHUD); protected: typedef std::unordered_map> PickCache; @@ -67,66 +67,85 @@ void PickCacheOptimizer::cacheResult(const bool intersects, const PickResultP } template -void PickCacheOptimizer::update(std::unordered_map>& picks, bool shouldPickHUD) { +void PickCacheOptimizer::update(std::unordered_map>& picks, + uint32_t& nextToUpdate, uint64_t expiry, bool shouldPickHUD) { PickCache results; - for (const auto& pickPair : picks) { - std::shared_ptr> pick = std::static_pointer_cast>(pickPair.second); - + const uint32_t INVALID_PICK_ID = 0; + std::unordered_map>::iterator itr = picks.begin(); + if (nextToUpdate != INVALID_PICK_ID) { + itr = picks.find(nextToUpdate); + if (itr == picks.end()) { + itr = picks.begin(); + } + } + uint32_t numUpdates = 0; + while(numUpdates < picks.size()) { + std::shared_ptr> pick = std::static_pointer_cast>(itr->second); T mathematicalPick = pick->getMathematicalPick(); PickResultPointer res = pick->getDefaultResult(mathematicalPick.toVariantMap()); if (!pick->isEnabled() || pick->getFilter().doesPickNothing() || pick->getMaxDistance() < 0.0f || !mathematicalPick) { pick->setPickResult(res); - continue; - } - - if (pick->getFilter().doesPickEntities()) { - PickCacheKey entityKey = { pick->getFilter().getEntityFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; - if (!checkAndCompareCachedResults(mathematicalPick, results, res, entityKey)) { - PickResultPointer entityRes = pick->getEntityIntersection(mathematicalPick); - if (entityRes) { - cacheResult(entityRes->doesIntersect(), entityRes, entityKey, res, mathematicalPick, results, pick); - } - } - } - - if (pick->getFilter().doesPickOverlays()) { - PickCacheKey overlayKey = { pick->getFilter().getOverlayFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; - if (!checkAndCompareCachedResults(mathematicalPick, results, res, overlayKey)) { - PickResultPointer overlayRes = pick->getOverlayIntersection(mathematicalPick); - if (overlayRes) { - cacheResult(overlayRes->doesIntersect(), overlayRes, overlayKey, res, mathematicalPick, results, pick); - } - } - } - - if (pick->getFilter().doesPickAvatars()) { - PickCacheKey avatarKey = { pick->getFilter().getAvatarFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; - if (!checkAndCompareCachedResults(mathematicalPick, results, res, avatarKey)) { - PickResultPointer avatarRes = pick->getAvatarIntersection(mathematicalPick); - if (avatarRes) { - cacheResult(avatarRes->doesIntersect(), avatarRes, avatarKey, res, mathematicalPick, results, pick); - } - } - } - - // Can't intersect with HUD in desktop mode - if (pick->getFilter().doesPickHUD() && shouldPickHUD) { - PickCacheKey hudKey = { pick->getFilter().getHUDFlags(), QVector(), QVector() }; - if (!checkAndCompareCachedResults(mathematicalPick, results, res, hudKey)) { - PickResultPointer hudRes = pick->getHUDIntersection(mathematicalPick); - if (hudRes) { - cacheResult(true, hudRes, hudKey, res, mathematicalPick, results, pick); - } - } - } - - if (pick->getMaxDistance() == 0.0f || (pick->getMaxDistance() > 0.0f && res->checkOrFilterAgainstMaxDistance(pick->getMaxDistance()))) { - pick->setPickResult(res); } else { - pick->setPickResult(pick->getDefaultResult(mathematicalPick.toVariantMap())); + if (pick->getFilter().doesPickEntities()) { + PickCacheKey entityKey = { pick->getFilter().getEntityFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; + if (!checkAndCompareCachedResults(mathematicalPick, results, res, entityKey)) { + PickResultPointer entityRes = pick->getEntityIntersection(mathematicalPick); + if (entityRes) { + cacheResult(entityRes->doesIntersect(), entityRes, entityKey, res, mathematicalPick, results, pick); + } + } + } + + if (pick->getFilter().doesPickOverlays()) { + PickCacheKey overlayKey = { pick->getFilter().getOverlayFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; + if (!checkAndCompareCachedResults(mathematicalPick, results, res, overlayKey)) { + PickResultPointer overlayRes = pick->getOverlayIntersection(mathematicalPick); + if (overlayRes) { + cacheResult(overlayRes->doesIntersect(), overlayRes, overlayKey, res, mathematicalPick, results, pick); + } + } + } + + if (pick->getFilter().doesPickAvatars()) { + PickCacheKey avatarKey = { pick->getFilter().getAvatarFlags(), pick->getIncludeItems(), pick->getIgnoreItems() }; + if (!checkAndCompareCachedResults(mathematicalPick, results, res, avatarKey)) { + PickResultPointer avatarRes = pick->getAvatarIntersection(mathematicalPick); + if (avatarRes) { + cacheResult(avatarRes->doesIntersect(), avatarRes, avatarKey, res, mathematicalPick, results, pick); + } + } + } + + // Can't intersect with HUD in desktop mode + if (pick->getFilter().doesPickHUD() && shouldPickHUD) { + PickCacheKey hudKey = { pick->getFilter().getHUDFlags(), QVector(), QVector() }; + if (!checkAndCompareCachedResults(mathematicalPick, results, res, hudKey)) { + PickResultPointer hudRes = pick->getHUDIntersection(mathematicalPick); + if (hudRes) { + cacheResult(true, hudRes, hudKey, res, mathematicalPick, results, pick); + } + } + } + + if (pick->getMaxDistance() == 0.0f || (pick->getMaxDistance() > 0.0f && res->checkOrFilterAgainstMaxDistance(pick->getMaxDistance()))) { + pick->setPickResult(res); + } else { + pick->setPickResult(pick->getDefaultResult(mathematicalPick.toVariantMap())); + } + } + + ++itr; + if (itr == picks.end()) { + itr = picks.begin(); + } + nextToUpdate = itr->first; + ++numUpdates; + uint64_t now = usecTimestampNow(); + if (usecTimestampNow() > expiry) { + break; } } } -#endif // hifi_PickCacheOptimizer_h \ No newline at end of file +#endif // hifi_PickCacheOptimizer_h diff --git a/libraries/pointers/src/PickManager.cpp b/libraries/pointers/src/PickManager.cpp index 92fec014da..b73b54cdb6 100644 --- a/libraries/pointers/src/PickManager.cpp +++ b/libraries/pointers/src/PickManager.cpp @@ -89,14 +89,17 @@ void PickManager::setIncludeItems(unsigned int uid, const QVector& includ } void PickManager::update() { + uint64_t expiry = usecTimestampNow() + _perFrameTimeBudget; std::unordered_map>> cachedPicks; withReadLock([&] { cachedPicks = _picks; }); bool shouldPickHUD = _shouldPickHUDOperator(); - _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], shouldPickHUD); - _stylusPickCacheOptimizer.update(cachedPicks[PickQuery::Stylus], false); + // we pass the same expiry to both updates + // even when the rayPicks consume all the budget at least one stylus will be updated + _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], _nextPickToUpdate[PickQuery::Ray], expiry, shouldPickHUD); + _stylusPickCacheOptimizer.update(cachedPicks[PickQuery::Stylus], _nextPickToUpdate[PickQuery::Stylus], expiry, false); } bool PickManager::isLeftHand(unsigned int uid) { @@ -121,4 +124,4 @@ bool PickManager::isMouse(unsigned int uid) { return pick->isMouse(); } return false; -} \ No newline at end of file +} diff --git a/libraries/pointers/src/PickManager.h b/libraries/pointers/src/PickManager.h index 5b069879a8..3b466be2bc 100644 --- a/libraries/pointers/src/PickManager.h +++ b/libraries/pointers/src/PickManager.h @@ -14,6 +14,8 @@ #include "Pick.h" #include "PickCacheOptimizer.h" +#include + class PickManager : public Dependency, protected ReadWriteLockable { SINGLETON_DEPENDENCY @@ -48,17 +50,24 @@ public: static const unsigned int INVALID_PICK_ID { 0 }; + unsigned int getPerFrameTimeBudget() const { return _perFrameTimeBudget; } + void setPerFrameTimeBudget(unsigned int numUsecs) { _perFrameTimeBudget = numUsecs; } + protected: std::function _shouldPickHUDOperator; std::function _calculatePos2DFromHUDOperator; std::shared_ptr findPick(unsigned int uid) const; std::unordered_map>> _picks; + unsigned int _nextPickToUpdate[PickQuery::NUM_PICK_TYPES] { 0, 0 }; std::unordered_map _typeMap; unsigned int _nextPickID { INVALID_PICK_ID + 1 }; PickCacheOptimizer _rayPickCacheOptimizer; PickCacheOptimizer _stylusPickCacheOptimizer; + + static const unsigned int DEFAULT_PER_FRAME_TIME_BUDGET = 2 * USECS_PER_MSEC; + unsigned int _perFrameTimeBudget { DEFAULT_PER_FRAME_TIME_BUDGET }; }; -#endif // hifi_PickManager_h \ No newline at end of file +#endif // hifi_PickManager_h From 7a39bd5c816edc4ce77c378e8d112df35056dd64 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 2 Mar 2018 09:29:42 -0800 Subject: [PATCH 238/267] remove tab whitespace --- libraries/shared/src/AABox.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/AABox.h b/libraries/shared/src/AABox.h index 2d5ca242d6..cf79cf9d04 100644 --- a/libraries/shared/src/AABox.h +++ b/libraries/shared/src/AABox.h @@ -71,7 +71,7 @@ public: bool expandedIntersectsSegment(const glm::vec3& start, const glm::vec3& end, float expansion) const; bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal) const; - bool rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const; + bool rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const; bool touchesSphere(const glm::vec3& center, float radius) const; // fast but may generate false positives bool touchesAAEllipsoid(const glm::vec3& center, const glm::vec3& radials) const; bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration) const; From 24635b045110975c9d21f495a65097c920637bc7 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 2 Mar 2018 14:51:18 -0800 Subject: [PATCH 239/267] remove unused debug cruft variable --- libraries/pointers/src/PickCacheOptimizer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/pointers/src/PickCacheOptimizer.h b/libraries/pointers/src/PickCacheOptimizer.h index e930f8c663..dd1fa6cecb 100644 --- a/libraries/pointers/src/PickCacheOptimizer.h +++ b/libraries/pointers/src/PickCacheOptimizer.h @@ -141,7 +141,6 @@ void PickCacheOptimizer::update(std::unordered_mapfirst; ++numUpdates; - uint64_t now = usecTimestampNow(); if (usecTimestampNow() > expiry) { break; } From f83c6000df8f90d35dad902e0a77b0f9f56a886c Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 6 Mar 2018 11:06:49 -0800 Subject: [PATCH 240/267] use 'auto' for very long type --- libraries/pointers/src/PickCacheOptimizer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/pointers/src/PickCacheOptimizer.h b/libraries/pointers/src/PickCacheOptimizer.h index dd1fa6cecb..95ffa104ee 100644 --- a/libraries/pointers/src/PickCacheOptimizer.h +++ b/libraries/pointers/src/PickCacheOptimizer.h @@ -71,7 +71,7 @@ void PickCacheOptimizer::update(std::unordered_map>::iterator itr = picks.begin(); + auto iter = picks.begin(); if (nextToUpdate != INVALID_PICK_ID) { itr = picks.find(nextToUpdate); if (itr == picks.end()) { From 9eecd3cb80b0c3361ad3649f4415981465f47c0f Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 6 Mar 2018 11:07:10 -0800 Subject: [PATCH 241/267] update styluses first: they are cheap --- libraries/pointers/src/PickManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/pointers/src/PickManager.cpp b/libraries/pointers/src/PickManager.cpp index b73b54cdb6..ba8fa814f0 100644 --- a/libraries/pointers/src/PickManager.cpp +++ b/libraries/pointers/src/PickManager.cpp @@ -96,10 +96,10 @@ void PickManager::update() { }); bool shouldPickHUD = _shouldPickHUDOperator(); - // we pass the same expiry to both updates - // even when the rayPicks consume all the budget at least one stylus will be updated - _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], _nextPickToUpdate[PickQuery::Ray], expiry, shouldPickHUD); + // we pass the same expiry to both updates, but the stylus updates are relatively cheap + // and the rayPicks updae will ALWAYS update at least one ray even when there is no budget _stylusPickCacheOptimizer.update(cachedPicks[PickQuery::Stylus], _nextPickToUpdate[PickQuery::Stylus], expiry, false); + _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], _nextPickToUpdate[PickQuery::Ray], expiry, shouldPickHUD); } bool PickManager::isLeftHand(unsigned int uid) { From 3f1944eb8af38ff5493ededd69c2521cc1a259d1 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 7 Mar 2018 10:06:32 -0800 Subject: [PATCH 242/267] fix variable name typo --- libraries/pointers/src/PickCacheOptimizer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/pointers/src/PickCacheOptimizer.h b/libraries/pointers/src/PickCacheOptimizer.h index 95ffa104ee..49a039935c 100644 --- a/libraries/pointers/src/PickCacheOptimizer.h +++ b/libraries/pointers/src/PickCacheOptimizer.h @@ -71,7 +71,7 @@ void PickCacheOptimizer::update(std::unordered_map Date: Thu, 8 Mar 2018 10:11:26 -0800 Subject: [PATCH 243/267] more readable code --- libraries/entities/src/EntityTreeElement.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 654d4b4ecc..1ae55bc333 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -601,8 +601,8 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con // if the ray doesn't intersect with our cube OR the distance to element is less than current best distance // we can stop searching! - if (!_cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal) - || (!_cube.contains(origin) && distanceToElementCube > distance)) { + bool hit = _cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal); + if (!hit || (!_cube.contains(origin) && distanceToElementCube > distance)) { keepSearching = false; // no point in continuing to search return result; // we did not intersect } From c49d0557fca907d00cdef01b46ee5608448bbb28 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 9 Mar 2018 09:29:37 -0800 Subject: [PATCH 244/267] fixing check box issues --- interface/resources/qml/hifi/audio/Audio.qml | 2 +- libraries/audio-client/src/AudioClient.h | 1 + libraries/audio/src/AbstractAudioInterface.h | 6 ++++-- libraries/script-engine/src/AudioScriptingInterface.cpp | 8 ++++++++ libraries/script-engine/src/AudioScriptingInterface.h | 1 + 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index b598e26954..6e0131c86f 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -129,7 +129,7 @@ Rectangle { id: stereoMic spacing: muteMic.spacing; text: qsTr("Use stereo for stereo devices"); - checked: false; + checked: AudioScriptingInterface.isStereoEnabled(); onClicked: { var success = AudioScriptingInterface.setStereoInput(checked); if (!success) { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 053202f583..1ec58c8507 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -193,6 +193,7 @@ public slots: bool isMuted() { return _muted; } virtual bool setIsStereoInput(bool stereo) override; + virtual bool isStereoEnabled() override { return _isStereoInput; } void setNoiseReduction(bool isNoiseGateEnabled); bool isNoiseReductionEnabled() const { return _isNoiseGateEnabled; } diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index ba1e733f13..20ab1a80ec 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -28,7 +28,7 @@ class AbstractAudioInterface : public QObject { Q_OBJECT public: AbstractAudioInterface(QObject* parent = 0) : QObject(parent) {}; - + static void emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber, bool isStereo, const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale, PacketType packetType, QString codecName = QString("")); @@ -40,8 +40,10 @@ public: public slots: virtual bool shouldLoopbackInjectors() { return false; } - + virtual bool setIsStereoInput(bool stereo) = 0; + + virtual bool isStereoEnabled() = 0; }; Q_DECLARE_METATYPE(AbstractAudioInterface*) diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index dd8d284c12..9bf275ddbf 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -67,3 +67,11 @@ bool AudioScriptingInterface::setStereoInput(bool stereo) { } return stereoInputChanged; } + +bool AudioScriptingInterface::isStereoEnabled() { + bool stereoEnabled = false; + if (_localAudioInterface) { + stereoEnabled = _localAudioInterface->isStereoEnabled(); + } + return stereoEnabled; +} diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index d46430ccce..08357536b7 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -36,6 +36,7 @@ protected: Q_INVOKABLE ScriptAudioInjector* playSystemSound(SharedSoundPointer sound, const QVector3D& position); Q_INVOKABLE bool setStereoInput(bool stereo); + Q_INVOKABLE bool isStereoEnabled(); signals: void mutedByMixer(); /// the client has been muted by the mixer From 3a39fca26819d64b0ac82232fb163d3f01436cb4 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 9 Mar 2018 10:09:51 -0800 Subject: [PATCH 245/267] made requested changes --- interface/resources/qml/hifi/audio/Audio.qml | 4 ++-- libraries/audio-client/src/AudioClient.h | 2 +- libraries/audio/src/AbstractAudioInterface.h | 2 +- libraries/script-engine/src/AudioScriptingInterface.cpp | 4 ++-- libraries/script-engine/src/AudioScriptingInterface.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index 6e0131c86f..776bebf374 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -128,8 +128,8 @@ Rectangle { AudioControls.CheckBox { id: stereoMic spacing: muteMic.spacing; - text: qsTr("Use stereo for stereo devices"); - checked: AudioScriptingInterface.isStereoEnabled(); + text: qsTr("Use stereo for input device"); + checked: AudioScriptingInterface.isStereoInput(); onClicked: { var success = AudioScriptingInterface.setStereoInput(checked); if (!success) { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 1ec58c8507..3bfbdb49ce 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -193,7 +193,7 @@ public slots: bool isMuted() { return _muted; } virtual bool setIsStereoInput(bool stereo) override; - virtual bool isStereoEnabled() override { return _isStereoInput; } + virtual bool isStereoInput() override { return _isStereoInput; } void setNoiseReduction(bool isNoiseGateEnabled); bool isNoiseReductionEnabled() const { return _isNoiseGateEnabled; } diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index 20ab1a80ec..30cbceeb0e 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -43,7 +43,7 @@ public slots: virtual bool setIsStereoInput(bool stereo) = 0; - virtual bool isStereoEnabled() = 0; + virtual bool isStereoInput() = 0; }; Q_DECLARE_METATYPE(AbstractAudioInterface*) diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index 9bf275ddbf..f248c20d41 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -68,10 +68,10 @@ bool AudioScriptingInterface::setStereoInput(bool stereo) { return stereoInputChanged; } -bool AudioScriptingInterface::isStereoEnabled() { +bool AudioScriptingInterface::isStereoInput() { bool stereoEnabled = false; if (_localAudioInterface) { - stereoEnabled = _localAudioInterface->isStereoEnabled(); + stereoEnabled = _localAudioInterface->isStereoInput(); } return stereoEnabled; } diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index 08357536b7..be2b4ebc8c 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -36,7 +36,7 @@ protected: Q_INVOKABLE ScriptAudioInjector* playSystemSound(SharedSoundPointer sound, const QVector3D& position); Q_INVOKABLE bool setStereoInput(bool stereo); - Q_INVOKABLE bool isStereoEnabled(); + Q_INVOKABLE bool isStereoInput(); signals: void mutedByMixer(); /// the client has been muted by the mixer From e21c4988fb8035209c3e2ad034a870ac5fa68628 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 9 Mar 2018 10:11:25 -0800 Subject: [PATCH 246/267] stereo checkbox text change --- interface/resources/qml/hifi/audio/Audio.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml index 776bebf374..ba50b7f238 100644 --- a/interface/resources/qml/hifi/audio/Audio.qml +++ b/interface/resources/qml/hifi/audio/Audio.qml @@ -128,7 +128,7 @@ Rectangle { AudioControls.CheckBox { id: stereoMic spacing: muteMic.spacing; - text: qsTr("Use stereo for input device"); + text: qsTr("Enable stereo input"); checked: AudioScriptingInterface.isStereoInput(); onClicked: { var success = AudioScriptingInterface.setStereoInput(checked); From 317d9a8dbc40d1c28d441c35b758db39037645a5 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 9 Mar 2018 11:45:39 -0800 Subject: [PATCH 247/267] Correct can cast shadow flag being visible on entities that can't cast shadows. --- scripts/system/html/entityProperties.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 7389442649..82a450bedd 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -313,7 +313,7 @@

-
+
From 10447bf10e6c4a370b842a2d11039a376af1f25f Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 9 Mar 2018 13:04:04 -0800 Subject: [PATCH 248/267] Fix the fact that all avatars should cast shadows, not just MyAvatar. since this is always a SkeletonMOdel class let s just turn it on by default there --- interface/src/avatar/MyAvatar.cpp | 6 ++---- .../avatars-renderer/src/avatars-renderer/SkeletonModel.cpp | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index a5e24b8707..9620a2dcec 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1115,7 +1115,6 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { void MyAvatar::setEnableMeshVisible(bool isEnabled) { _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); - _skeletonModel->setCanCastShadow(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); } void MyAvatar::setEnableInverseKinematics(bool isEnabled) { @@ -1468,7 +1467,6 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); - _skeletonModel->setCanCastShadow(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); _headBoneSet.clear(); _cauterizationNeedsUpdate = true; @@ -2043,8 +2041,8 @@ void MyAvatar::preDisplaySide(RenderArgs* renderArgs) { _attachmentModels[i]->setVisibleInScene(shouldDrawHead, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); - _attachmentModels[i]->setCanCastShadow(shouldDrawHead, qApp->getMain3DScene(), - render::ItemKey::TAG_BITS_NONE, true); + _attachmentModels[i]->setCanCastShadow(shouldDrawHead, qApp->getMain3DScene(), + render::ItemKey::TAG_BITS_NONE, true); } } } diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index b2a494230b..b25df633c0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -33,6 +33,10 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : { // SkeletonModels, and by extention Avatars, use Dual Quaternion skinning. _useDualQuaternionSkinning = true; + + // Avatars all cast shadow + _canCastShadow = true; + assert(_owningAvatar); } From fec30b83637683fd75b2e20d1e210cc8554c02e9 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 9 Mar 2018 15:04:14 -0800 Subject: [PATCH 249/267] Fixing the menu for Shadow and AO to do the correct path to engine config --- interface/src/Menu.cpp | 45 +++++++++++++++++++------- interface/src/Menu.h | 2 +- interface/src/ui/PreferencesDialog.cpp | 28 ---------------- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ca6f7a31d1..733fd785d4 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -45,6 +45,9 @@ #include "LocationBookmarks.h" #include "DeferredLightingEffect.h" +#include "AmbientOcclusionEffect.h" +#include "RenderShadowTask.h" + #if defined(Q_OS_MAC) || defined(Q_OS_WIN) #include "SpeechRecognizer.h" #endif @@ -361,18 +364,6 @@ Menu::Menu() { // Developer menu ---------------------------------- MenuWrapper* developerMenu = addMenu("Developer", "Developer"); - // Developer > Graphics - MenuWrapper* graphicsOptionsMenu = developerMenu->addMenu("Render"); - action = addCheckableActionToQMenuAndActionHash(graphicsOptionsMenu, MenuOption::Shadows, 0, true); - connect(action, &QAction::triggered, [action] { - DependencyManager::get()->setShadowMapEnabled(action->isChecked()); - }); - - action = addCheckableActionToQMenuAndActionHash(graphicsOptionsMenu, MenuOption::AmbientOcclusion, 0, false); - connect(action, &QAction::triggered, [action] { - DependencyManager::get()->setAmbientOcclusionEnabled(action->isChecked()); - }); - // Developer > UI >>> MenuWrapper* uiOptionsMenu = developerMenu->addMenu("UI"); action = addCheckableActionToQMenuAndActionHash(uiOptionsMenu, MenuOption::DesktopTabletToToolbar, 0, @@ -389,6 +380,36 @@ Menu::Menu() { // Developer > Render >>> MenuWrapper* renderOptionsMenu = developerMenu->addMenu("Render"); + action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Shadows, 0, true); + connect(action, &QAction::triggered, [action] { + auto renderConfig = qApp->getRenderEngine()->getConfiguration(); + if (renderConfig) { + auto mainViewShadowTaskConfig = renderConfig->getConfig("RenderMainView.RenderShadowTask"); + if (mainViewShadowTaskConfig) { + if (action->isChecked()) { + mainViewShadowTaskConfig->setPreset("Enabled"); + } else { + mainViewShadowTaskConfig->setPreset("None"); + } + } + } + }); + + action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::AmbientOcclusion, 0, false); + connect(action, &QAction::triggered, [action] { + auto renderConfig = qApp->getRenderEngine()->getConfiguration(); + if (renderConfig) { + auto mainViewAmbientOcclusionConfig = renderConfig->getConfig("RenderMainView.AmbientOcclusion"); + if (mainViewAmbientOcclusionConfig) { + if (action->isChecked()) { + mainViewAmbientOcclusionConfig->setPreset("Enabled"); + } else { + mainViewAmbientOcclusionConfig->setPreset("None"); + } + } + } + }); + addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::WorldAxes); addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::DefaultSkybox, 0, true); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 1d37b74ffe..cf9eed1a27 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -205,7 +205,7 @@ namespace MenuOption { const QString DesktopTabletToToolbar = "Desktop Tablet Becomes Toolbar"; const QString HMDTabletToToolbar = "HMD Tablet Becomes Toolbar"; const QString Shadows = "Shadows"; - const QString AmbientOcclusion = "AmbientOcclusion"; + const QString AmbientOcclusion = "Ambient Occlusion"; } #endif // hifi_Menu_h diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 48b56c7ced..4c233b986c 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -24,10 +24,6 @@ #include "SnapshotAnimated.h" #include "UserActivityLogger.h" -#include "AmbientOcclusionEffect.h" -#include "AntialiasingEffect.h" -#include "RenderShadowTask.h" - void setupPreferences() { auto preferences = DependencyManager::get(); auto nodeList = DependencyManager::get(); @@ -295,30 +291,6 @@ void setupPreferences() { } #endif - - { - static const QString RENDER("Graphics"); - auto renderConfig = qApp->getRenderEngine()->getConfiguration(); - if (renderConfig) { - auto mainViewAmbientOcclusionConfig = renderConfig->getConfig("RenderMainView.AmbientOcclusion"); - if (mainViewAmbientOcclusionConfig) { - auto getter = [mainViewAmbientOcclusionConfig]()->QString { return mainViewAmbientOcclusionConfig->getPreset(); }; - auto setter = [mainViewAmbientOcclusionConfig](QString preset) { mainViewAmbientOcclusionConfig->setPreset(preset); }; - auto preference = new ComboBoxPreference(RENDER, "Ambient occlusion", getter, setter); - preference->setItems(mainViewAmbientOcclusionConfig->getPresetList()); - preferences->addPreference(preference); - } - - auto mainViewShadowConfig = renderConfig->getConfig("RenderMainView.RenderShadowTask"); - if (mainViewShadowConfig) { - auto getter = [mainViewShadowConfig]()->QString { return mainViewShadowConfig->getPreset(); }; - auto setter = [mainViewShadowConfig](QString preset) { mainViewShadowConfig->setPreset(preset); }; - auto preference = new ComboBoxPreference(RENDER, "Shadows", getter, setter); - preference->setItems(mainViewShadowConfig->getPresetList()); - preferences->addPreference(preference); - } - } - } { static const QString NETWORKING("Networking"); From 9b9b62d0e4e2c1211ab27b50ec8dceb721352187 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 9 Mar 2018 15:20:51 -0800 Subject: [PATCH 250/267] Transition to hover if falling and height above ground is greater than the threshold. --- libraries/physics/src/CharacterController.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index d39930ab76..9b6e9fe7a0 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -756,6 +756,9 @@ void CharacterController::updateState() { SET_STATE(State::Hover, "double jump button"); } else if ((jumpButtonHeld || vertTargetSpeedIsNonZero) && (now - _jumpButtonDownStartTime) > JUMP_TO_HOVER_PERIOD) { SET_STATE(State::Hover, "jump button held"); + } else if (_floorDistance > _scaleFactor * DEFAULT_AVATAR_FALL_HEIGHT) { + // Transition to hover if we are above the fall threshold + SET_STATE(State::Hover, "above fall threshold"); } } break; From 4b27cd73ffa9f8e9589f4cffb26720750f1e3478 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 9 Mar 2018 13:36:43 -0800 Subject: [PATCH 251/267] LogHandler class stores regexps rather than always recreating General efficiency tweaks; move to C++11. --- libraries/shared/src/LogHandler.cpp | 64 +++++++++++------------------ libraries/shared/src/LogHandler.h | 22 ++++++---- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index cb3c0d07b2..ee063bbd31 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -92,12 +91,13 @@ void LogHandler::setShouldDisplayMilliseconds(bool shouldDisplayMilliseconds) { void LogHandler::flushRepeatedMessages() { QMutexLocker lock(&_mutex); - QHash::iterator message = _repeatMessageCountHash.begin(); - while (message != _repeatMessageCountHash.end()) { + for(auto& message: _repeatedMessages) { - if (message.value() > 0) { + if (message->messageCount > 1) { QString repeatMessage = QString("%1 repeated log entries matching \"%2\" - Last entry: \"%3\"") - .arg(message.value()).arg(message.key()).arg(_lastRepeatedMessage.value(message.key())); + .arg(message->messageCount - 1) + .arg(message->regexp.pattern()) + .arg(message->lastMessage); QMessageLogContext emptyContext; lock.unlock(); @@ -105,8 +105,7 @@ void LogHandler::flushRepeatedMessages() { lock.relock(); } - _lastRepeatedMessage.remove(message.key()); - message = _repeatMessageCountHash.erase(message); + message->messageCount = 0; } } @@ -118,44 +117,25 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont if (type == LogDebug) { // for debug messages, check if this matches any of our regexes for repeated log messages - foreach(const QString& regexString, getInstance()._repeatedMessageRegexes) { - QRegExp repeatRegex(regexString); - if (repeatRegex.indexIn(message) != -1) { - - if (!_repeatMessageCountHash.contains(regexString)) { - // we have a match but didn't have this yet - output the first one - _repeatMessageCountHash[regexString] = 0; - - // break the foreach so we output the first match - break; - } else { - // we have a match - add 1 to the count of repeats for this message and set this as the last repeated message - _repeatMessageCountHash[regexString] += 1; - _lastRepeatedMessage[regexString] = message; - - // return out, we're not printing this one - return QString(); - } + for(auto& repeatRegex: _repeatedMessages) { + if (repeatRegex->regexp.indexIn(message) != -1) { + // If we've printed the first one then return out. + if (repeatRegex->messageCount++ == 0) break; + repeatRegex->lastMessage = message; + return QString(); } } } + if (type == LogDebug) { // see if this message is one we should only print once - foreach(const QString& regexString, getInstance()._onlyOnceMessageRegexes) { - QRegExp onlyOnceRegex(regexString); - if (onlyOnceRegex.indexIn(message) != -1) { - if (!_onlyOnceMessageCountHash.contains(message)) { - // we have a match and haven't yet printed this message. - _onlyOnceMessageCountHash[message] = 1; - // break the foreach so we output the first match - break; - } else { - // We've already printed this message, don't print it again. - return QString(); + for(auto& onceOnly : _onetimeMessages) { + if (onceOnly->regexp.indexIn(message) != -1) { + if (onceOnly->messageCount++ == 0) break; // we have a match and haven't yet printed this message. + else return QString(); // We've already printed this message, don't print it again. } } } - } // log prefix is in the following format // [TIMESTAMP] [DEBUG] [PID] [TID] [TARGET] logged string @@ -217,10 +197,16 @@ const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); QMutexLocker lock(&_mutex); - return *_repeatedMessageRegexes.insert(regexString); + std::unique_ptr<_RepeatedMessage> repeatRecord(new _RepeatedMessage()); + repeatRecord->regexp = QRegExp(regexString); + _repeatedMessages.insert(std::move(repeatRecord)); + return regexString; } const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { QMutexLocker lock(&_mutex); - return *_onlyOnceMessageRegexes.insert(regexString); + std::unique_ptr<_OnceOnlyMessage> onetimeMessage(new _OnceOnlyMessage()); + onetimeMessage->regexp = QRegExp(regexString); + _onetimeMessages.insert(std::move(onetimeMessage)); + return regexString; } diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index ea961a8d4c..bbf6d62f03 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -13,11 +13,12 @@ #ifndef hifi_LogHandler_h #define hifi_LogHandler_h -#include #include -#include #include +#include #include +#include +#include const int VERBOSE_LOG_INTERVAL_SECONDS = 5; @@ -66,12 +67,19 @@ private: bool _shouldOutputProcessID { false }; bool _shouldOutputThreadID { false }; bool _shouldDisplayMilliseconds { false }; - QSet _repeatedMessageRegexes; - QHash _repeatMessageCountHash; - QHash _lastRepeatedMessage; - QSet _onlyOnceMessageRegexes; - QHash _onlyOnceMessageCountHash; + struct _RepeatedMessage { + QRegExp regexp; + int messageCount { 0 }; + QString lastMessage; + }; + std::set> _repeatedMessages; + + struct _OnceOnlyMessage { + QRegExp regexp; + int messageCount { 0 }; + }; + std::set> _onetimeMessages; static QMutex _mutex; }; From d4cf22fbaf03b145e321bb73b174d100ff1a6204 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 9 Mar 2018 15:11:05 -0800 Subject: [PATCH 252/267] LogHandler class stores regexps - code tweaks Code standard changes from review. --- libraries/shared/src/LogHandler.cpp | 20 ++++++++++++++------ libraries/shared/src/LogHandler.h | 18 +++++++++--------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index ee063bbd31..88110da95b 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -117,10 +117,12 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont if (type == LogDebug) { // for debug messages, check if this matches any of our regexes for repeated log messages - for(auto& repeatRegex: _repeatedMessages) { + for(auto& repeatRegex : _repeatedMessages) { if (repeatRegex->regexp.indexIn(message) != -1) { // If we've printed the first one then return out. - if (repeatRegex->messageCount++ == 0) break; + if (repeatRegex->messageCount++ == 0) { + break; + } repeatRegex->lastMessage = message; return QString(); } @@ -131,11 +133,17 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont // see if this message is one we should only print once for(auto& onceOnly : _onetimeMessages) { if (onceOnly->regexp.indexIn(message) != -1) { - if (onceOnly->messageCount++ == 0) break; // we have a match and haven't yet printed this message. - else return QString(); // We've already printed this message, don't print it again. + if (onceOnly->messageCount++ == 0) { + // we have a match and haven't yet printed this message. + break; + } + else { + // We've already printed this message, don't print it again. + return QString(); } } } + } // log prefix is in the following format // [TIMESTAMP] [DEBUG] [PID] [TID] [TARGET] logged string @@ -197,7 +205,7 @@ const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); QMutexLocker lock(&_mutex); - std::unique_ptr<_RepeatedMessage> repeatRecord(new _RepeatedMessage()); + std::unique_ptr repeatRecord(new RepeatedMessage()); repeatRecord->regexp = QRegExp(regexString); _repeatedMessages.insert(std::move(repeatRecord)); return regexString; @@ -205,7 +213,7 @@ const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { QMutexLocker lock(&_mutex); - std::unique_ptr<_OnceOnlyMessage> onetimeMessage(new _OnceOnlyMessage()); + std::unique_ptr onetimeMessage(new OnceOnlyMessage()); onetimeMessage->regexp = QRegExp(regexString); _onetimeMessages.insert(std::move(onetimeMessage)); return regexString; diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index bbf6d62f03..fbf7bddaab 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -68,18 +68,18 @@ private: bool _shouldOutputThreadID { false }; bool _shouldDisplayMilliseconds { false }; - struct _RepeatedMessage { - QRegExp regexp; - int messageCount { 0 }; - QString lastMessage; + struct RepeatedMessage { + QRegExp regexp; + int messageCount { 0 }; + QString lastMessage; }; - std::set> _repeatedMessages; + std::set> _repeatedMessages; - struct _OnceOnlyMessage { - QRegExp regexp; - int messageCount { 0 }; + struct OnceOnlyMessage { + QRegExp regexp; + int messageCount { 0 }; }; - std::set> _onetimeMessages; + std::set> _onetimeMessages; static QMutex _mutex; }; From c78df4d96724589e690351b26db3d70fa75132e7 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 9 Mar 2018 15:41:56 -0800 Subject: [PATCH 253/267] Setting the correct Job config for ssao check box and fixing typo --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 733fd785d4..fa0e8087f0 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -399,7 +399,7 @@ Menu::Menu() { connect(action, &QAction::triggered, [action] { auto renderConfig = qApp->getRenderEngine()->getConfiguration(); if (renderConfig) { - auto mainViewAmbientOcclusionConfig = renderConfig->getConfig("RenderMainView.AmbientOcclusion"); + auto mainViewAmbientOcclusionConfig = renderConfig->getConfig("RenderMainView.AmbientOcclusion"); if (mainViewAmbientOcclusionConfig) { if (action->isChecked()) { mainViewAmbientOcclusionConfig->setPreset("Enabled"); From cc166dbece16be8b9d92311a0e6c3c53045b984c Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 9 Mar 2018 15:44:56 -0800 Subject: [PATCH 254/267] LogHandler regexps - use vector of values --- libraries/shared/src/LogHandler.cpp | 39 ++++++++++++++--------------- libraries/shared/src/LogHandler.h | 6 ++--- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 88110da95b..49927a325b 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -93,11 +93,11 @@ void LogHandler::flushRepeatedMessages() { QMutexLocker lock(&_mutex); for(auto& message: _repeatedMessages) { - if (message->messageCount > 1) { + if (message.messageCount > 1) { QString repeatMessage = QString("%1 repeated log entries matching \"%2\" - Last entry: \"%3\"") - .arg(message->messageCount - 1) - .arg(message->regexp.pattern()) - .arg(message->lastMessage); + .arg(message.messageCount - 1) + .arg(message.regexp.pattern()) + .arg(message.lastMessage); QMessageLogContext emptyContext; lock.unlock(); @@ -105,7 +105,7 @@ void LogHandler::flushRepeatedMessages() { lock.relock(); } - message->messageCount = 0; + message.messageCount = 0; } } @@ -117,13 +117,13 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont if (type == LogDebug) { // for debug messages, check if this matches any of our regexes for repeated log messages - for(auto& repeatRegex : _repeatedMessages) { - if (repeatRegex->regexp.indexIn(message) != -1) { + for (auto& repeatRegex : _repeatedMessages) { + if (repeatRegex.regexp.indexIn(message) != -1) { // If we've printed the first one then return out. - if (repeatRegex->messageCount++ == 0) { + if (repeatRegex.messageCount++ == 0) { break; } - repeatRegex->lastMessage = message; + repeatRegex.lastMessage = message; return QString(); } } @@ -131,13 +131,12 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont if (type == LogDebug) { // see if this message is one we should only print once - for(auto& onceOnly : _onetimeMessages) { - if (onceOnly->regexp.indexIn(message) != -1) { - if (onceOnly->messageCount++ == 0) { + for (auto& onceOnly : _onetimeMessages) { + if (onceOnly.regexp.indexIn(message) != -1) { + if (onceOnly.messageCount++ == 0) { // we have a match and haven't yet printed this message. break; - } - else { + } else { // We've already printed this message, don't print it again. return QString(); } @@ -205,16 +204,16 @@ const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); QMutexLocker lock(&_mutex); - std::unique_ptr repeatRecord(new RepeatedMessage()); - repeatRecord->regexp = QRegExp(regexString); - _repeatedMessages.insert(std::move(repeatRecord)); + RepeatedMessage repeatRecord; + repeatRecord.regexp = QRegExp(regexString); + _repeatedMessages.push_back(repeatRecord); return regexString; } const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { QMutexLocker lock(&_mutex); - std::unique_ptr onetimeMessage(new OnceOnlyMessage()); - onetimeMessage->regexp = QRegExp(regexString); - _onetimeMessages.insert(std::move(onetimeMessage)); + OnceOnlyMessage onetimeMessage; + onetimeMessage.regexp = QRegExp(regexString); + _onetimeMessages.push_back(onetimeMessage); return regexString; } diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index fbf7bddaab..2e64f16c1e 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include const int VERBOSE_LOG_INTERVAL_SECONDS = 5; @@ -73,13 +73,13 @@ private: int messageCount { 0 }; QString lastMessage; }; - std::set> _repeatedMessages; + std::vector _repeatedMessages; struct OnceOnlyMessage { QRegExp regexp; int messageCount { 0 }; }; - std::set> _onetimeMessages; + std::vector _onetimeMessages; static QMutex _mutex; }; From 7d267bb709a34d1159e4a2509734bef5d4dcc892 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 9 Mar 2018 15:19:48 -0800 Subject: [PATCH 255/267] Fix local KTX files never being removed from pending downloads --- .../model-networking/src/model-networking/TextureCache.cpp | 7 +++++++ .../model-networking/src/model-networking/TextureCache.h | 1 + 2 files changed, 8 insertions(+) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index ffc9af5264..034f31b707 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -459,6 +459,10 @@ void NetworkTexture::makeRequest() { } +void NetworkTexture::handleLocalRequestCompleted() { + TextureCache::requestCompleted(_self); +} + void NetworkTexture::makeLocalRequest() { const QString scheme = _url.scheme(); QString path; @@ -468,6 +472,9 @@ void NetworkTexture::makeLocalRequest() { path = ":" + _url.path(); } + auto self = _self; + connect(this, &Resource::finished, this, &NetworkTexture::handleLocalRequestCompleted); + path = FileUtils::selectFile(path); auto storage = std::make_shared(path); diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h index 080c2704c6..b2740e2ca1 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.h +++ b/libraries/model-networking/src/model-networking/TextureCache.h @@ -71,6 +71,7 @@ public slots: protected: void makeRequest() override; void makeLocalRequest(); + Q_INVOKABLE void handleLocalRequestCompleted(); virtual bool isCacheable() const override { return _loaded; } From 84cc4c18a40c7025da738137da87ee4bc91628bc Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 9 Mar 2018 18:13:26 -0800 Subject: [PATCH 256/267] Added date/time to testResultsFolder. --- tools/auto-tester/src/Test.cpp | 22 +++++++--------------- tools/auto-tester/src/Test.h | 7 ++++--- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 9bced3d1fc..347cfd90dc 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -31,21 +31,13 @@ Test::Test() { mismatchWindow.setModal(true); } -bool Test::createTestResultsFolderPathIfNeeded(QString directory) { - // The test results folder is located in the root of the tests (i.e. for recursive test evaluation) - if (testResultsFolderPath == "") { - testResultsFolderPath = directory + "/" + TEST_RESULTS_FOLDER; - QDir testResultsFolder(testResultsFolderPath); +bool Test::createTestResultsFolderPath(QString directory) { + QDateTime now = QDateTime::currentDateTime(); + testResultsFolderPath = directory + "/" + TEST_RESULTS_FOLDER + "--" + now.toString(DATETIME_FORMAT); + QDir testResultsFolder(testResultsFolderPath); - if (testResultsFolder.exists()) { - testResultsFolder.removeRecursively(); - } - - // Create a new test results folder - return QDir().mkdir(testResultsFolderPath); - } else { - return true; - } + // Create a new test results folder + return QDir().mkdir(testResultsFolderPath); } void Test::zipAndDeleteTestResultsFolder() { @@ -194,7 +186,7 @@ void Test::startTestsEvaluation() { } // Quit if test results folder could not be created - if (!createTestResultsFolderPathIfNeeded(pathToTestResultsDirectory)) { + if (!createTestResultsFolderPath(pathToTestResultsDirectory)) { return; } diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 411f27eae6..cd5075002a 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -43,7 +43,7 @@ public: void appendTestResultsToFile(QString testResultsFolderPath, TestFailure testFailure, QPixmap comparisonImage); - bool createTestResultsFolderPathIfNeeded(QString directory); + bool createTestResultsFolderPath(QString directory); void zipAndDeleteTestResultsFolder(); bool isAValidDirectory(QString pathname); @@ -81,8 +81,9 @@ private: QStringList resultImagesFullFilenames; // Used for accessing GitHub - const QString user{ "NissimHadar" }; - const QString branch{ "addRecursionToAutotester" }; + const QString user { "NissimHadar" }; + const QString branch { "addRecursionToAutotester" }; + const QString DATETIME_FORMAT { "yyyy-MM-dd_hh-mm-ss" }; }; #endif // hifi_test_h \ No newline at end of file From 957d39b0b13e9647f624c6bdd5147445eb1441df Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 11 Mar 2018 14:49:23 +1300 Subject: [PATCH 257/267] Fix rotation and position of meshes attached to eye joints --- libraries/animation/src/AnimSkeleton.cpp | 11 +++++++++++ libraries/animation/src/AnimSkeleton.h | 1 + libraries/animation/src/Rig.cpp | 21 +++++++++++++++++++++ libraries/animation/src/Rig.h | 5 +++++ 4 files changed, 38 insertions(+) diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 2c37d2d089..3749ad905e 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -78,6 +78,17 @@ int AnimSkeleton::getParentIndex(int jointIndex) const { return _joints[jointIndex].parentIndex; } +QVector AnimSkeleton::getChildrenOfJoint(int jointIndex) const { + // Children and grandchildren, etc. + QVector result; + for (int i = jointIndex + 1; i < _joints.size(); i++) { + if (_joints[i].parentIndex == jointIndex || result.contains(_joints[i].parentIndex)) { + result.push_back(i); + } + } + return result; +} + const QString& AnimSkeleton::getJointName(int jointIndex) const { return _joints[jointIndex].name; } diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h index 664358f414..52f3ac7182 100644 --- a/libraries/animation/src/AnimSkeleton.h +++ b/libraries/animation/src/AnimSkeleton.h @@ -43,6 +43,7 @@ public: const AnimPose& getPostRotationPose(int jointIndex) const; int getParentIndex(int jointIndex) const; + QVector getChildrenOfJoint(int jointIndex) const; AnimPose getAbsolutePose(int jointIndex, const AnimPoseVec& relativePoses) const; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index d6791ab0b8..f2f5d48713 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -199,6 +199,8 @@ void Rig::destroyAnimGraph() { _internalPoseSet._overridePoses.clear(); _internalPoseSet._overrideFlags.clear(); _numOverrides = 0; + _leftEyeJointChildren.clear(); + _rightEyeJointChildren.clear(); } void Rig::initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset) { @@ -225,12 +227,17 @@ void Rig::initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOff buildAbsoluteRigPoses(_animSkeleton->getRelativeDefaultPoses(), _absoluteDefaultPoses); _rootJointIndex = geometry.rootJointIndex; + _leftEyeJointIndex = geometry.leftEyeJointIndex; + _rightEyeJointIndex = geometry.rightEyeJointIndex; _leftHandJointIndex = geometry.leftHandJointIndex; _leftElbowJointIndex = _leftHandJointIndex >= 0 ? geometry.joints.at(_leftHandJointIndex).parentIndex : -1; _leftShoulderJointIndex = _leftElbowJointIndex >= 0 ? geometry.joints.at(_leftElbowJointIndex).parentIndex : -1; _rightHandJointIndex = geometry.rightHandJointIndex; _rightElbowJointIndex = _rightHandJointIndex >= 0 ? geometry.joints.at(_rightHandJointIndex).parentIndex : -1; _rightShoulderJointIndex = _rightElbowJointIndex >= 0 ? geometry.joints.at(_rightElbowJointIndex).parentIndex : -1; + + _leftEyeJointChildren = _animSkeleton->getChildrenOfJoint(geometry.leftEyeJointIndex); + _rightEyeJointChildren = _animSkeleton->getChildrenOfJoint(geometry.rightEyeJointIndex); } void Rig::reset(const FBXGeometry& geometry) { @@ -253,6 +260,8 @@ void Rig::reset(const FBXGeometry& geometry) { buildAbsoluteRigPoses(_animSkeleton->getRelativeDefaultPoses(), _absoluteDefaultPoses); _rootJointIndex = geometry.rootJointIndex; + _leftEyeJointIndex = geometry.leftEyeJointIndex; + _rightEyeJointIndex = geometry.rightEyeJointIndex; _leftHandJointIndex = geometry.leftHandJointIndex; _leftElbowJointIndex = _leftHandJointIndex >= 0 ? geometry.joints.at(_leftHandJointIndex).parentIndex : -1; _leftShoulderJointIndex = _leftElbowJointIndex >= 0 ? geometry.joints.at(_leftElbowJointIndex).parentIndex : -1; @@ -260,6 +269,9 @@ void Rig::reset(const FBXGeometry& geometry) { _rightElbowJointIndex = _rightHandJointIndex >= 0 ? geometry.joints.at(_rightHandJointIndex).parentIndex : -1; _rightShoulderJointIndex = _rightElbowJointIndex >= 0 ? geometry.joints.at(_rightElbowJointIndex).parentIndex : -1; + _leftEyeJointChildren = _animSkeleton->getChildrenOfJoint(geometry.leftEyeJointIndex); + _rightEyeJointChildren = _animSkeleton->getChildrenOfJoint(geometry.rightEyeJointIndex); + if (!_animGraphURL.isEmpty()) { _animNode.reset(); initAnimGraph(_animGraphURL); @@ -1430,6 +1442,15 @@ void Rig::updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm // directly set absolutePose rotation _internalPoseSet._absolutePoses[index].rot() = deltaQuat * headQuat; + + // Update eye joint's children. + auto children = index == _leftEyeJointIndex ? _leftEyeJointChildren : _rightEyeJointChildren; + for (int i = 0; i < children.size(); i++) { + int jointIndex = children[i]; + int parentIndex = _animSkeleton->getParentIndex(jointIndex); + _internalPoseSet._absolutePoses[jointIndex] = + _internalPoseSet._absolutePoses[parentIndex] * _internalPoseSet._relativePoses[jointIndex]; + } } } diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 7230d05e2a..72f9f64482 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -267,6 +267,11 @@ protected: int _rootJointIndex { -1 }; + int _leftEyeJointIndex { -1 }; + int _rightEyeJointIndex { -1 }; + QVector _leftEyeJointChildren; + QVector _rightEyeJointChildren; + int _leftHandJointIndex { -1 }; int _leftElbowJointIndex { -1 }; int _leftShoulderJointIndex { -1 }; From e33539f5752791eaab00784b1aa6e6f67ab9bbbd Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Sat, 10 Mar 2018 18:44:24 -0800 Subject: [PATCH 258/267] Remove unused variable --- libraries/model-networking/src/model-networking/TextureCache.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 034f31b707..b03195041b 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -472,7 +472,6 @@ void NetworkTexture::makeLocalRequest() { path = ":" + _url.path(); } - auto self = _self; connect(this, &Resource::finished, this, &NetworkTexture::handleLocalRequestCompleted); path = FileUtils::selectFile(path); From 3001225cb723a4526e7a680e32e0a7730ce82437 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 12 Mar 2018 15:49:20 +1300 Subject: [PATCH 259/267] Fix CPU and GPU not throttling when Interface minimized from maximized --- libraries/ui/src/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ui/src/MainWindow.cpp b/libraries/ui/src/MainWindow.cpp index 20f994e63d..091fd850af 100644 --- a/libraries/ui/src/MainWindow.cpp +++ b/libraries/ui/src/MainWindow.cpp @@ -107,12 +107,12 @@ void MainWindow::changeEvent(QEvent* event) { QWindowStateChangeEvent* stateChangeEvent = static_cast(event); if ((stateChangeEvent->oldState() == Qt::WindowNoState || stateChangeEvent->oldState() == Qt::WindowMaximized) && - windowState() == Qt::WindowMinimized) { + (windowState() & Qt::WindowMinimized) == Qt::WindowMinimized) { emit windowShown(false); emit windowMinimizedChanged(true); } else { emit windowShown(true); - if (stateChangeEvent->oldState() == Qt::WindowMinimized) { + if ((stateChangeEvent->oldState() & Qt::WindowMinimized) == Qt::WindowMinimized) { emit windowMinimizedChanged(false); } } From 5acc605ba029aadca7eeba4e248e46ede94023a9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 12 Mar 2018 16:03:31 +1300 Subject: [PATCH 260/267] Fix OSX / Linux warning --- libraries/animation/src/AnimSkeleton.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 3749ad905e..5976231d83 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -81,7 +81,7 @@ int AnimSkeleton::getParentIndex(int jointIndex) const { QVector AnimSkeleton::getChildrenOfJoint(int jointIndex) const { // Children and grandchildren, etc. QVector result; - for (int i = jointIndex + 1; i < _joints.size(); i++) { + for (int i = jointIndex + 1; i < (int)_joints.size(); i++) { if (_joints[i].parentIndex == jointIndex || result.contains(_joints[i].parentIndex)) { result.push_back(i); } From bafd6340a2847e82a1fef6678bc6ccc752d1b4db Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 12 Mar 2018 14:21:48 -0400 Subject: [PATCH 261/267] Removed unused fonts in scripts --- .../utilities/fonts/AnonymousPro-Regular.ttf | Bin 158080 -> 0 bytes .../utilities/fonts/AnonymousPro.license | 93 -- .../utilities/fonts/FiraSans-Regular.ttf | Bin 403924 -> 0 bytes .../utilities/fonts/FiraSans-SemiBold.ttf | Bin 437824 -> 0 bytes .../utilities/fonts/FiraSans.license | 94 -- .../utilities/fonts/Raleway-Bold.ttf | Bin 179244 -> 0 bytes .../utilities/fonts/Raleway-Light.ttf | Bin 182376 -> 0 bytes .../utilities/fonts/Raleway-Regular.ttf | Bin 178520 -> 0 bytes .../utilities/fonts/Raleway-SemiBold.ttf | Bin 180492 -> 0 bytes .../developer/utilities/fonts/Raleway.license | 94 -- .../utilities/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes .../developer/utilities/fonts/hifi-glyphs.ttf | Bin 29160 -> 0 bytes .../lib/fonts/AnonymousPro-Regular.ttf | Bin 158080 -> 0 bytes .../utilities/lib/fonts/AnonymousPro.license | 93 -- .../utilities/lib/fonts/FiraSans-Regular.ttf | Bin 403924 -> 0 bytes .../utilities/lib/fonts/FiraSans-SemiBold.ttf | Bin 437824 -> 0 bytes .../utilities/lib/fonts/FiraSans.license | 94 -- .../utilities/lib/fonts/Raleway-Bold.ttf | Bin 179244 -> 0 bytes .../utilities/lib/fonts/Raleway-Light.ttf | Bin 182376 -> 0 bytes .../utilities/lib/fonts/Raleway-Regular.ttf | Bin 178520 -> 0 bytes .../utilities/lib/fonts/Raleway-SemiBold.ttf | Bin 180492 -> 0 bytes .../utilities/lib/fonts/Raleway.license | 94 -- .../lib/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes .../utilities/lib/fonts/hifi-glyphs.ttf | Bin 30784 -> 0 bytes .../fonts/hifi-glyphs/icons-reference.html | 1056 ----------------- .../lib/fonts/hifi-glyphs/styles.css | 421 ------- 26 files changed, 2039 deletions(-) delete mode 100644 scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf delete mode 100644 scripts/developer/utilities/fonts/AnonymousPro.license delete mode 100644 scripts/developer/utilities/fonts/FiraSans-Regular.ttf delete mode 100644 scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf delete mode 100644 scripts/developer/utilities/fonts/FiraSans.license delete mode 100644 scripts/developer/utilities/fonts/Raleway-Bold.ttf delete mode 100644 scripts/developer/utilities/fonts/Raleway-Light.ttf delete mode 100644 scripts/developer/utilities/fonts/Raleway-Regular.ttf delete mode 100644 scripts/developer/utilities/fonts/Raleway-SemiBold.ttf delete mode 100644 scripts/developer/utilities/fonts/Raleway.license delete mode 100644 scripts/developer/utilities/fonts/fontawesome-webfont.ttf delete mode 100644 scripts/developer/utilities/fonts/hifi-glyphs.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/AnonymousPro-Regular.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/AnonymousPro.license delete mode 100644 scripts/developer/utilities/lib/fonts/FiraSans-Regular.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/FiraSans-SemiBold.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/FiraSans.license delete mode 100644 scripts/developer/utilities/lib/fonts/Raleway-Bold.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/Raleway-Light.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/Raleway-Regular.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/Raleway-SemiBold.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/Raleway.license delete mode 100644 scripts/developer/utilities/lib/fonts/fontawesome-webfont.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/hifi-glyphs.ttf delete mode 100644 scripts/developer/utilities/lib/fonts/hifi-glyphs/icons-reference.html delete mode 100644 scripts/developer/utilities/lib/fonts/hifi-glyphs/styles.css diff --git a/scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf b/scripts/developer/utilities/fonts/AnonymousPro-Regular.ttf deleted file mode 100644 index 06aafc067310fba0d33b0a133654475ac73388ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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=; diff --git a/scripts/developer/utilities/fonts/AnonymousPro.license b/scripts/developer/utilities/fonts/AnonymousPro.license deleted file mode 100644 index 5e8b7385e7..0000000000 --- a/scripts/developer/utilities/fonts/AnonymousPro.license +++ /dev/null @@ -1,93 +0,0 @@ -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 deleted file mode 100644 index d9fdc0e922030c6836a9ad5f808fd7e1c5970873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403924 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 r-(pXe}H&MjC7NAiF2}5 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 War7s!{wz%rN_!OQ*CO@X^#2EvSW`a$ diff --git a/scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf b/scripts/developer/utilities/fonts/FiraSans-SemiBold.ttf deleted file mode 100644 index 821a43d7fd25967a72ebe7b828fd8d1491767de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437824 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 z 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 diff --git a/scripts/developer/utilities/fonts/FiraSans.license b/scripts/developer/utilities/fonts/FiraSans.license deleted file mode 100644 index d444ea92b6..0000000000 --- a/scripts/developer/utilities/fonts/FiraSans.license +++ /dev/null @@ -1,94 +0,0 @@ -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 deleted file mode 100644 index 38c099cc857f5c21ed7289d757f2f96ccd483552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179244 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 diff --git a/scripts/developer/utilities/fonts/Raleway-Light.ttf b/scripts/developer/utilities/fonts/Raleway-Light.ttf deleted file mode 100644 index 91aa0c701f04f5bd804362b583b44f0b4a1f9acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 diff --git a/scripts/developer/utilities/fonts/hifi-glyphs.ttf b/scripts/developer/utilities/fonts/hifi-glyphs.ttf deleted file mode 100644 index 8733349227646b207ec15315e9eab9ee7ae9e252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29160 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 Wk?wovI=$BCKkvW)rUBpIIs6AkCfWV~ diff --git a/scripts/developer/utilities/lib/fonts/AnonymousPro-Regular.ttf b/scripts/developer/utilities/lib/fonts/AnonymousPro-Regular.ttf deleted file mode 100644 index 06aafc067310fba0d33b0a133654475ac73388ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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=; diff --git a/scripts/developer/utilities/lib/fonts/AnonymousPro.license b/scripts/developer/utilities/lib/fonts/AnonymousPro.license deleted file mode 100644 index 5e8b7385e7..0000000000 --- a/scripts/developer/utilities/lib/fonts/AnonymousPro.license +++ /dev/null @@ -1,93 +0,0 @@ -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/lib/fonts/FiraSans-Regular.ttf b/scripts/developer/utilities/lib/fonts/FiraSans-Regular.ttf deleted file mode 100644 index d9fdc0e922030c6836a9ad5f808fd7e1c5970873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403924 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 r-(pXe}H&MjC7NAiF2}5 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 War7s!{wz%rN_!OQ*CO@X^#2EvSW`a$ diff --git a/scripts/developer/utilities/lib/fonts/FiraSans-SemiBold.ttf b/scripts/developer/utilities/lib/fonts/FiraSans-SemiBold.ttf deleted file mode 100644 index 821a43d7fd25967a72ebe7b828fd8d1491767de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437824 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 z 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 diff --git a/scripts/developer/utilities/lib/fonts/FiraSans.license b/scripts/developer/utilities/lib/fonts/FiraSans.license deleted file mode 100644 index d444ea92b6..0000000000 --- a/scripts/developer/utilities/lib/fonts/FiraSans.license +++ /dev/null @@ -1,94 +0,0 @@ -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/lib/fonts/Raleway-Bold.ttf b/scripts/developer/utilities/lib/fonts/Raleway-Bold.ttf deleted file mode 100644 index 38c099cc857f5c21ed7289d757f2f96ccd483552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179244 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 diff --git a/scripts/developer/utilities/lib/fonts/Raleway-Light.ttf b/scripts/developer/utilities/lib/fonts/Raleway-Light.ttf deleted file mode 100644 index 91aa0c701f04f5bd804362b583b44f0b4a1f9acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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

XDCG$Cn90yW2!TvHc6kUO~pBDt)WIi`>J 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 diff --git a/scripts/developer/utilities/lib/fonts/Raleway-Regular.ttf b/scripts/developer/utilities/lib/fonts/Raleway-Regular.ttf deleted file mode 100644 index e570a2d5c39b2841b5753350a3822bd2b685e771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178520 zcmbrm2Y4Gr+Bp8s?5ew|TUOiEs##jeDwgCT+p;aW$w{2VNvt@DOPqv|N>3=E1p=WT z?T&+^bJSy<&u7i?yBXLic_zVr4q zAOKJ!02->&^Lx7&ELw08;73CM;O!omGyiXhJqFO1y8xc&yXP)V@z22T0GPJ`BpvI|5JIvTVN$N>UIE7047fX$a~bi1p|Pjt>7(qB{p%S z89#gzd4g|(Eg%ygW8k3$E&_n-%MIca3jGdU4iW&o3vUO2i;E?C7b5U209HvT3Lz;_ zHvujT05e<~e&gojPkvj=p%vW-^>6?N&>heYPe40f0%kk`33M+6u>yE( z05^7k5wpPIVW`JOaNxNR!F}L_UC<6MLl^oUSo9F2(f5!*?|_5KKpnmf%J6lN!@mI^ zei3qb403oD zfI0ZrP)-}53~vGnz6h%DNnl49hHwK|5QYdggC7;39o~a5W`V`4A&Xt$!Rx_`v*1B} zV8O?N7k5Jz_Cpp96fVLV$f7EkOlxCPp% zM&Qv|P)(juqYyybz)5AmN8Uxh2Zx9Qf`{9n4E2FeEUy8+^b8I{gxXX16TSyLB7O*t zrY<-Lb~p$N;24IHvJKa5UpWFF;DXCwQ895j+h;4tpRg;)LMksEfJ{SP@TI z@XWkmKU9f$+7Df@zwme14-&i>eA9R$xSDyHpi{gjxSDy{pb`&5RxAlD$ovEzHQ*QP zw?Y~G6%t~d&?=#s8715TkBDf_q z_Mggs7TXEGAZJ#jLqZ27zVQXvMgB3fJOEZ)0X9h+9QGI9frC&@a6J8fX`CWV z8>V4-G%QN6Ex|4eR>E8GHZbDvAb^J;i)Vp}(6C6`gg;KvTM6gWV;?nE37$un)3E%( zULZ%#@bubCYbAIn;e(W&0Mu0gA}>4-+TmG9!IO{@V*P4ebNB$O}&fJGv6QXgSoNOTmq<1V(JLgM;u#v<-H4aX)9%?T5$$D@cEO;fz@J_H}H89u=Y205pDDw8FK!tZg0P&ze0<@zyU_N>p zTG7+cj=lvO?g9%s2o~H87W^Jqs4!S4KXAAS28lc-bK-Jv!k=J}Y5@bbLj~5tAlW;< z7eZpG1p`?R=D~|EhAeJ`8r%tk1Rl5_G_)J^=q}JxTR|h@EdqnM7RvE_;Bf?W@CnRC zU%?>uf=h(gFz|RScnOTL4Osj&4B{JLP=xhO;KK+8@rA$>d5YfwAGHxYcn$C(EEHfT z@FzM2!53Z!gD44R+yfy|PG=y5`#_EDFoIKy{df!(Qoh3!*~NM z7J2>{sKxg_0anyA-h^Si90JsBFibrI!}tTJqM|U2XTdPu1vct+7{;5xh8@6?vBm2N zP-7Vki`Opjku!v!1~pcJNnF=ks&`)F#+7Ej1?A!q!Q737He)IwO@aND^NuVFMf*zj<{pe-r z$5yc7PoW=u1-5A!+Y1!BNo?~FUJUO*KfD7n_^5C(WdkY2i0i=OIvSy0oXZORWMAkm z=*MdTW2dO~5*?IWmZEk{Jq?stvj9!q0RT_KSs;ZDaDofw!F<>PyWlza0%25%94Lfh zs22^OE$A}zGxQSr3;G%Z#@LJ#IEQ!P=kW{pU8<5&Q&&-UQM;(!w3!akBlH#Yq^;cM zvSn<;w&k{Uw)1RP+8(t%VSCy3iR~Y@e=`)LV`>;1<6zuOh-qTd%tmH2b0Kpxa~pF9 za~E?j^C+uj4J^YtST`GF2iau~?2tMt9U6z;QRA>V{Ei;SsAGj|-#5>EM}H?R5bc@) z7r0?Q48l$D1nhO*tIJv@v4jQ)nc#RyYVd)SL#z;7L~2cRuX%6ICNA?df$e;;LmJtSH`PmBNlVTL92!yoBW>{t5jE>+;m>DvGQ-yLx0e;wo; z*b3*vHn;#Tgp1%3xD;N6-@)tf2D}Nshd;poz#m~hyaVsTd+;#Ah(a`yz;<{WUV*pZ zGI$LxMjRf;%kczWfmh*Ua1yuRR@{bDxE*)kH15LPxCi&*KD-jI##!8tkHs0h26y7M z=u&h!`T%{1K1P2+pQ6t}ij`!=Nc{hZADXs=OBV4@{fLE4xBv|jkb(>ppn@_ehYF~K zDo}$4w4eh$7{CbCV1gPjg9WT$13NIlf&(~_Ke)jIUZ@2h_<@H21fdQ>5QYdup&nuo zhXlx>0UDtRnjr}-&)8H5F}5Ej7@ ze_zm0#_roOYgdOkzJP41#L+~g( z2D{)%cmke+J+K>|gJ)qcJdYlS6JQ0bgk#YYuo>=x<6td%7fyjS=o`2kZbAQm6VboW zK{y6Bp}(Ln(f^`L&_7`voPpj00iJ>LVFEUwzoYr+YxD)Ihb`zypkNzZ1UDiVa-*H- z0rUuZ6g`L@f~V2HVIRtZ61|0Xqdn+5^gY@Ir=o|^W9TWk5Uzp?;A;38Tnj&kU%)kR z1N@43CEzx=9d3n(VLMz5$4}AIX^4Z@;B5hTMt}uFnHQMV*(yuDWK&78WkkIfFR=;vQ$;)@<(VGXUGnO)M$=$8BL2zmGe7fD(K8~_}FRK zEBGUEp)8Jq{G0%t0__@QGTXT^f)^29U?wmX7_*R?hLS+JxUqC`3e``%E;t8<$jj4P zoB2{1p&+hfhe}ChhFCMl=6q~GDCZ|J&Il7@>3~qd3uu&KgtE>)vM)v`<2rIeIk}rR z#0ceFM=l^#@{CX=f`oa5hUMG2F`=S!l-WMY2o+oh7Z9rW?BLKOJ(12ih4K~LrhuU4 zvvY^C^NSD7Y|bfY#pfD+5-K|v3{6&6b_!^$L#Xr-Eez)1itmljZ` z0IfR^LgKm6@-PWFGdLtvave-YP;niCk`pAO9n7eJ#vW9w5mZ1&$M(@ljnpq(=r=oZ z0YS%4g4Q1p^!y|urGcNsq%`uA6e+9uNt%=6A>7m37H=@M|dVCt~bhqfHFVi1_JW`D3>75!9bkx0O?k)VKRdBWOMaAlVrMo zVoL&ajx_{?7#}ny148`2brn$O@`iwr;3qK{TuhMZCMRFOuHNn2ySZ*|j2Rj?6VA$Y z?1&?z*ZBfM122FJelV&) zyT^zm5*Ohbofs&x%ENQz0zy*>4h+Kx6897wxMV{>Xr68o5Aw$+xLV?sJNL;-$rF#*1Kcu)(ZVFQzq3xE^Y$EihP&GwE}^P(Xuv!#H^d}!!O0-f`2#}R5v}vg14p!`j%Y2tJ9E6F-)QHB2LH?s zrI$(*cJM-@e>=k@34LvE`01_!-5C^u{(#UaZkdp82`7XsIVQ;jxrV82r1?oX?dl-3 zF4B1kGXI^3yMK(N{$J>pK$x(oB-dbOXHW>6n_6RrpM(Z~2@YNSBsBV2f+e!Zshv!3 zx|gr1*x-pfw{(rJa5FCg^sLc$jivIK4!jtMed+qtn4r22V6 z!a~*`5N7c^0Mh<|Fq_{2h*akAJCOKffZu_{Cv!=kj6WdEBYj9^KIua$gQO3sEZ}zn zK)XL6EaXY(kJJ|NJ5ll35Wf=@pXEqDL|PY1KNI$W*l+4-b4+zW1oTM^B z<|LI-GAF5wkv?7ifG|$_kjiq>hg2p=A5vK%uB*cz5LSxoBDGcGx=8I9ab2XgT3i>Y z9V@Pj)YgdWBDJ;Rx=3vuKM76K2wX4T39bHsu%TFO^9O{D1n8ujkn#tFI`RP1wn zu}b=!Aod{*q|b@`Bs5QtdXji2j(T#jO5Ql7SS8&z@sp^z*kNOoqxyJyB z=Fi4Skaau+&>iI@;3GGwvc>dlx=HSnR?8&vsYj!D5T~UPnw5x;$~tx#c58Q6>{jlU zrY0o{-z2Cz9!ilPxuGCE=|mUI9THL(3{6rK=}9-adrW>7AUbuy^1&g}C6~+PQe{i% z0Xiw?r8P21neP!)I8UH2nZ%IZDVdN$IxR~6|MM>c8Aw8s#FViDpx`GFXZ&K}JFF>u zQ*em!=Qe1AMrg!N>?GrgJ)GE6_^$B1*gkWN{o*M6^e7*TxuB&*i;?qj1(pA}Cxu$Y!6;*Xg)idgO>IcV1nxBbO_tbM2b6~@5KVyb}Lpc$Rs7>3Ppv>mBf(?7hYN zW-VKLX6-w^2H$ml&VP~rPQIESetkN8mowTVzXnX#qN(=;&&w^iLu1f4cUgB4S#7ov+-X|>zlr4KB4)MWL0u`^469} z%Xux2wk~eHq4lx0wzliq{*juWnrts`=i9fnf7&7KnCN(*bD(o==cDPR>FYCuBwtOHWz)`LfL;@{v#MT|&fa+T^=E&1&bo7cbI!ld)t&pmxnFLLZ9R7DzVq1gmY(<9^JC{vod4kY-)(Ez zcJ8)kFECxO=7QTUc;`aXh1)Ou$M(y&KeYXei+V1)^`gIAJbv-D7r%Q++a){2|6aM| z^GlVNHeb5-(i<*4aGCS6xtCpX*@KsTc=_{}zkT^vSF~KQ{)(4=cGk~sxYB&(t5;dB znt#t6h28+7lbGKe{>s_}#e(N7@J#^b8x4n6L z>h{xazw`Dt@2I%r!aLshb>P=`+}V0p&0S-6eSY`KyPvxIt$XD6)ZerGp8M~~-`jWZ zvG+cIU+}(T?z{fJfBh!;n~~pK{+p+M^Y#74`#bO7c>k04e|-P9LbcE-{CZL|dG-$F zj!Sp!-toy!%g%*6x9oiRf%F5nKA3y(o(G?Q@RNsn9@_b^;o*4?pZ4(oKC<+Y9gn>G zsQJ-jAHC|)Zyu|Bto^Z#kL`QB=JBD&uY7#Zo)h-m|8&LE8=ijTnZz?EJ+u4S zx@U9Gp8V`9&-tI*@Z5`g4SRd`KKZ=m`NrorKmX2eYkqseZ-4&V4_+vHq49-PFI@V< zJ1=~{Z{xmQ`}V)6eew7gZ-4RSm#CNcmxf>ZbKKFMs$7`^sIfx?X+w)xZ9( z=XbyU-TSX;Upw}-$6rUUZ+!i+*S~#Z@Qu^nxZ#bb-uUKCFG&{yk_UAYeiJ zU?sedUlPZ2rdSC@Q)EPp0Fvm(#?i*2`e-bw&on!mvGVDspMDxJxB&1ucrTd24!xLH_D1=Z3^_x>1NF~y90VBNiCwt{m6)j1VT5Z;; z)mDv?Y|8ESs3V4`jneBXuuRXz+@6HNU{rg8RII)gCt^{(!C<87gV>{v#F5U1jcTbB z<*g%0OyS1il*83A9C!U}J;$BYBW)OLvO1CrqOOkBK94cb$uC%zzf9|C@h#}b?TioS zzeZ)YKq?gKsjEg~|Wus(c?)0*T+c$CASbJaXf)R6kAV#+5N-t^X z-Vng;4qtZ*Q)@G*#2tluLdI2%I;Xj^rIih^)n($A!n2}gzXw19-oiKdR{T5Af(M#m z4lIBLsd@7eg;1XYVL1W`hE*T|nN%WM1r#OjBb`+tsgxd3BAV`@`&*K=UcC-McP2Tf zWll8gZLV#$TXi12N2LHQ(v~T7eyt;j3F4v=8zw0AL|QS~Cg-TY1O({6v`Y{&BJ`v^ z;jOOrChYcjt>BeJylRVEY$|o7&>$MNNgkLX4%l@ca5)e8W6pg)%~1bBdS2cHNezz=?p z+hpYA3ca88NTu8q1`;L0DmsQ(qE$&Xg zCsJi`lJl3r3OGyT&!&_CPjh?JFGlGoHKovtEIHGR70*0F-rx&w!x#7?P=j=5r38ii zTEbO~6_j3QFv{F+-r$Z}>vaLQDcu}xn}rrfmyeBwO}3$l)uGvsE;cXQQ#|)?!w2{y z(2`LoGKx+r^R!ap0Z!Pc5BgIPYaOdGxdZx`HR>{;#iM(cnFC9P7kWagCx&dM@YvXL zGEyrpLlk}iD!`I5Rg{;hlnS|wrZ6glZX&p#UysNp5}t%H7S$(=GNa5RTjWoxGOmm& z%`-kfcC;FtHNCwxPD87qy`79&54+JCECm&KQckG^Qy2lFUn{IXxHSVnleMHK(_oetH`^vtiq|hHcvb!9d}D_!*3o{Duc42vBcUs2CVZX()sN z@CKL?vn_-k)#M@GI^$U`r2+scNY!duVelJ?q|(b4s*N3{xq~AkgJi|+@Heyqg@6KE z$_(V?1teIz6e9#^)(mteVywO$IsewyCcXu5I*bEF@L%eWT8_X!*-?A*_&Axx41iO3 zZ?Qk2mt+=zEPKWT2yqCf^4?kKExh+o6W$9L5`}MY051@^r8QMUBE}TLgfGI>8S{F* zPFhjzN4g4JI#Gn@$!74nXrvY6fV*=^JiesUT`Du?P^Y)HGh{Z0I%~b1Av1DyY?vDe z%-zt@v0-j7ICn!we5j4%+J@rsp*Dx3ZHVk72!O7^&7gsBDkwn|jrxG5=yQPrj3~TH zDj|?tHoZFyXgIZAE#lgxXJb)y1;xc8tvC@?qigc_T`Kp~MYP65*nzuRTU*h+WtQry zjv9welBdXgJOKJ5&VZjtI=v2yf{rAGBUmNsR&-If0w4^=RvVNkjQ%J&Tg6jB_ysv3 zB{?9gp!BSsFXP(d*0z{K&4yXF-eZvkq>e;iFxV5RamJF>OiRd)CLEb`o2Am~4A`_T zt43R6RfMGsV>0oL_Sz(GS5(389%U~dKigSpHhbWZY92c9C&YVL$=cQesMICe4mId|w z$6M?43)`~`7cVfGXU#KsV)n*G2EL4MNIQeG8tfWJ_zTr|Paqq!w#5B>eQ!E5(A3>% z3)-uq0bh;Zrmm^$@Y)i7E74+&g|ji>W>7*oG^G;dVrm4CT_B9kl_DDGtrGF%Es!9L zVJSs27-j*KsXz%zwOXT=DXRUF7#l-TbyUykU91{SH`c9ZB?3KHj?H zuSncKS6G7%;bsUzf2x;96jW7WOk+Y)n4<9(G2KBTT_Gc%3eZ5U64k#&Q~C`?a}fA_ zwO*F7S#%ne0)i+gSLpm`N|ulVLDV>M0E)t2D&tzIL_ERjSy?=e^x?rar>Apq)SYRn zs|;Ainp~-nxhB}^teaochU8@xGPMpZ%D)q?$)W}}IX@Cx)Z)-OBX&nPX$q#?t`@$! z)+6;bbvp-FwG}LO0>}EoH@FVJ2o8utbE-kB!4x(lT7vt40trn?2<1*mSg9ygi}KRR z1$i#+jJsW4Cjq4Eh%+sU2~mBC$Hfyqy{V!`gX=u$C9#HOoo;t#w7GkumDewB}~FHwGaK-8X?^xR3TNYT+zk?uQx;h*09r7`a1qQ>tE(u5(T~^|i#T+1{%rJ@{4Zu>dE22TpdeB> zi0ydql-?IhML2?M!ajiDdR0lCNM>iSxBkA4R6{(-*Hk-+xik|ZN9zqX>S&%vwDiNM zufW*uO%F$6i`$(hZ?vY`$7sE6bG+U;ZC)+wueR2Ej2WgrWoKI>HYVD}Fl`Zg{y__$ zs4>R_mKuM9&6@DlJXe>ETiM2bzoRL@DwI}tu!ippR#yko{+gi2s#J2pCaW{y*6BSB z4o)l+Xr(n^uc~5#R!hKMrM3qNl{gD4u^l&yRMMJiHX{kG)nH8FJ^(4AB|sBBn8K1D zQvK0{LUf4|YnWyrtvFFsvJz7SQUZnZFrADwbscBr^}`K(PrU^hi-hu>yEAGN2_+q| zTBDt)`$s6{guWkAimQ`Q3Wjz7I1NjGU=6qZH*1(!u@n)TO-)Vcw(;@&lJRlC&{en} zE)d64!q@`}giCsWRf=eg=?#*S2G&Ms2QLMTTX4TQWg+c^XHDq|M>OYBI?*6k(n@*B zB$rL;ZB$WJ=xVAb%7VBQRY_xD3tyvWaTU=kc1jS@!CZQYMDJqJt@+(3m0yZ<-}gTI zO!iyAkcOwx@o1$8iMkXISb`|P)QTC31}!QYKjs>Uv3ggG)u&M~|2hgj9S)xm4g-Qj z;cK*i=KL;6%;kzn(Ej{Vl*;c$w|@0)_L*mUzXuEs0Q3-k6s40RQJqK$QRC0L_7Y|=0_m5t5&I%e0DnVb<98)B=P{Wg1uRU1P+A#cKKtx)RO zkaORfHGrY6u%0T%!>}0E!rIhouLo1K9Vw|1HC8ES&%$y<_mv?4nFM6ygp}l~Qbj3O zfgBWa#d1)o@Cc!TEJ&r|7JE=Xf;Fp`kIfs%_O`brV!Y4ASk1}#br za&+891JYm=bt$RLQ)Ik)Vn3D+Q^}r;M&b$MVWUPHkH=!f-X^@6NON>^-`0sHN~vW+ z4wGFY$Cja3_Z&9X!SWqyl_liz^jI~{xpj$lhk{b+)pl>SB9hzGmEJrYi!9pI?eBG! z*ADu!TbDPstUCWZpRv3%R1&Sqb= z$>6EBxSD&NXB%8KmHyUlbI+Eg@#x~y`?}9q8q;YQovvZU_PGl#9FHCPi!N^QVx7Xk znSIf6a+b>g@U?g^$Uq7Hlvja>M@E8Zz=*~xMHd%wy|kcyxm>Q4E7fXsm6YhCQN(#z z8HXqe#hQ_)Z%Ka7a2EakvMY#k``&vpcX!3Y3XuwYVKdDF+njsceNRdQ> zmV&4@VqU~%vXV8qtYQipK{vQTc z7=4ic*5ItGF^4!kAn+Bw#h2lIB(E~%vRM^!8Y9#YM8LGe5>k(D;BDXde zWkKpN^%RXkLVCWy!Yuo@U#ycIg-D8cmw&sYsN!{ANptkqap)fiob>>9d z!i<9p*~;q&SI3*z&JS0zVb11l@flL9&Ly}bko^_j3uRy;_82kdr<{@$g$Uy*S}X>g zRt;sKVkHW_KdPP?IgJ!6e68=}AZ zWAicVT34Q(?mlOEv$3|(;p}LQ%wN-(Tst?^*m`n2e`{&?7mCm&IHdsrjaCp_n@VPh zgSco_9${mvIW?>1)KN97#usMt!(CnIc5)0+fBpfyH~%b37NH6^mTXkS#gm(|Xi(8KE1I?<_wB*`F1>@Oge4tZ9aW1ut;b==_~Y#kWmjcr z$?V0cT&2O&zo8qg&R;wCyk+&o=o7I_yw@slr#PiTO3`EjL|oumn!=)pFOrW&qZX|` zbySU_#Eh2db6sfLto(Z@JS+d#^YL@}33NmLxB27Iii`G_#%{!WK?3#^`DQwq1%&WY z3YA8cfTZX&AcL}Gxa;uVLz`NQ>!NhxsS2k23YrLX;(Ntp|69li$*hDhfg8f{LF zr(K?|(I!$#T2`Es?mlOtxozdyorI>*F->dchwBHAO*E~U7mf}dTjEml@Ls3@Gm$Xl z>lRF*6+qKd+=|$mEw~@RY*JT31yp!hslq@`bji%))Q5RImqYI0tOmvw&j$bWkv;0v z89g!UyLhjsZJ?H)+v?7Li_+#mGs8CXrkT(&LLISsZDu`H^lC^b2~BM&nI-8gad5&2 zIbs>;H&uIFR!eoAsjk}VkSUCQ*J0sboZC9(FzB#@exlnZS$H4Q37o z`k7p&k#m=T=k6M9W1OuMhauRzHL|?PYC1OUThq|AW?m#ZxF$j1ImPK$;k}>+8$?r~ zvS|s5XuJZZ*ljW^rAl;3>}61cT3y4E#UF;HOv_P6fs-em1Y>QJ^EY#T{rYDmh<;dv zsHeNpBg=n@q#{^@O$^h_6F-$20M8Zm26L*Kz>Hc7ghPRNFo>2QdaXD$r{-cTo_nb4 z5KiF>4sF60h#r+Wh41j~crTbp{EKK9$t)pMk*{QMKLVY$qD&?Q6EYEMbrEB@#9e~L zstu#fow=C4i|Iao-rxycwu~V*)D)e6Y#go3U)OW?cvH*7S!q&lICfqH5DbJ4iTM+R*Befr#N+$ zN-Dupil|K(Q6l#$x~$Y1wN_I_d_O2^OhhRy(U~ZULs6tf6CD#PI#0gu zl7BOc@HV{X`|tCw<)6YQ9cm)_6W)91A|!fV$zMP?VVYaYXhf6c)5LX8#6pQ3sX(RC zXb86?8z@eP20#CNR{krbn04U59Hhv9h4<$7p?Lo1`CAa5e-kZ3#}J-b1%OY(dqECd zijmQX`Z4&(L9UsGkD61XrJwz|KmWg7`7iO_{5fb#z9WASDbX%KKwKsBOHy2dfOv|D zuZehHi|QT;oq`xSEwQ=;@h#{Pt7q-#qr40Ac@DjE=;Z{S+nP9ZKjF?pg}2~U{4vPD zk+K7(5rwI-l5Wr{I%s7eQ>#UZVI)o}byPoeN+RK<${G)?Y$Q9i0ANc=68?m@R*N{a z8tv@Q_fI)%0YRkj7Ti5OHxSVv&Mg|GKbV_n1hJ?(($KKU+la4g{QjS03_q$ve-&xa zGbx=&rz{eY4oTCw6vhahIMby)DTTCF8`W|Y<=@-%T=I^)P#wB9zZxyd-$h<&FFcK& z6n)HYakT&F;UVZ0U|!25xMYVqxIavDf<;KV8t8xSXt8fD?`B#-wm zRRadL@D2Jq)_@xtU|DKdufqtJBN+-hF)gzpkkWmCKt>~(=)5J-%I+-T^dk}yiSEfN zkW^Z_fqt(CK_uj9@HVh^tEJkYsZuGxjoeCw&TpKSPX?nH7b5mqG-A-}bx}Pr-aHoRj0TOhrD>@SuiRb#BJi`08rg zSw?f=MrCVw1>T>3I@TVXH5N^b_xh7ubJkni-^}Tqbv3t`>l`{j;3<5AC0GM4qD@%L zN7+2xqL+uDwujg}t|M)pnR@YIo5$nMj5hVHw{#fhguI!k)mESJn8H4rv{U74%(xmy zyF5sm81MCUHtM|rCea_@XE(AHCPt&P)NxvWcAUVU#Fi6yKbRo|R~CU@?qE&jG$qv{ zpm3jg=Dh^><%*qbMaWNi3c9m$qD;dGEi0j>_NWe`gRLnY!4zfzNEwDY+F>{vC^8Zu2fVz?Z^5| zjS-Gky2A}-Upic4tM66@`o?03<$eB47_}bSVo6eVLo}L9>bN@d&E`6%&e`1W_4PM8 z2y_V60$2kM2tX>;VzZLyT%Qa{08Y2^Lt?Dg@9!Ip%d03~cfGZun$uTV>o_g)`7#lUCDK((IGP0jt-&9I5gJo*6{2t% zLd0cCQKD+lm6Z^uv}oM6Wo1YzZIKcy!3ajR*2SsSaz%|_WW2F@!Yzu1npCeRf?%Sj zXI{6xNw2S{)rTUNUyk00SB$RHREAY$eO*=Yd_bfz7Td7~oX`korYihCM>#E#nyN7k zBz|5qFqCqLltko4_Y`%I@I{93Iq_JuQ~hRQx8k;G@6=Cr%%x0j7lLq|tI^$PH5+sy zJvou{XnKlGSyofgqgMQ*WMzrx+MQe~7w;VBT52;(>ld$g`0Oj2-RY>!c8uHBRL4kE z?oh(QXF?`htVF{)JDTm;hY3sE~zgF!|drMiRlH5iv;skw}=RsVpb1Qc*c+ zCETtJ_v>^BbVi-gpsy&GOGy@rOri73X5gc!or*4Qw#mp=xwRU$rYc?IPc)<-)aZj1 z$_kT1hnsQglCxi8nu?_b}S_mg#n7n zwCJhb8`Ejzn)Um4k?NRR@&0@jvi&~)G9Z{;_!g=0eyAiGog5(`u60oZ6OmQYwOyPT z*3m}Qq9?QH=5)tqrx~ltR$it}=<4El|Do%xtW=VaD`TOlbyM?188I)VuvKf7G_hZc z2SiWwdC7=OiY1b^EKO8wF@kRba!(qiBjo6IPq*b#DvncYIXzb;S6Ggu7eYBwk#NMo zn87GU$Mn>^bW@`(7H}xi4Nc8Ubm>;+n6{2Nir%yM7MB`v!wU`G1e<>vaZ3m1b>{bA z#mULezU28#^Ze*E6>Go znrUaKqXMJa#$_3|C$p@fVI<>mXGXrUMKc~xhNLNFJf3vDP3i9&k0-|ac)o8u5g+gK zqcT3*$gqw5ynj|B%Qnpt^&UTN$C@9}dk8zUf<%Hxh+~8>WHE<`s51mw?IdB3Epo!6 z^rD%4a{pQHAv~i5&>z!#7Idtzr(2kn$@t<9m!oY_w=W|~&)S;CFh`fU>f*}IX#Oeu z-imNbAUj^481M5Zoy}RVufNHm=jv*1vV=ID$oqMmz#3v>!f2DL(Eu+-W;NsrFMcx^USwacWh(N@aKs+l0$GYAMw zg>O*?KMH2z12-cn2?`MZ2Z=@ErL=e&fY>@9x|2BKr`9_~PjZDA28a>skYx4hIW@^( zh$m1+YP7la2Cq%i)05t`3A?JTywpS~mGUx^+k{Sv3qm~qE2~*c6As)}_y(J?0xWP+ zQO#A=lw*vvVn&BqyrZY?ru1MPVZB6JVhp2_X~V=`d`!%=si#H9VW~$hrA1&AbzOx_ zLW2cai0m^u+@j1A^};E2S0vGxRQlzD`RUEJrm&|hU0qg5RofgVDUaKTBKiH3I(I#b zdh&BDNsJhCvZa&kMGNF_)+mae8ItE!bOaM&QS#VIL8=kcyrNW8tBq2hzS*_&fsQw^ zA|FTl4*iRaQVBrWumaRYzf8GOK}(4fLqby&Q4^-zBpR(+LxNbuFGCTB3>DQ9FJ2-l zGvc>9KWNyvq2Ys$Czt0M)9I$%a-udMW&Rti$hUm?=G}L{`Q_AH=yR-qN-|f4Qi>1z zW2PqpfJ&&;X>>$pYmLSPaRPB3k4(mCsiEuT^6Pt_f4+CB#EO?HD__cgn?LkoMa7GV zLQ=A$0*jSc0Xh;3P|1n!R7V`rqNBKtC_g2QGpf;tiO0=Y%!WybKtf`a)3aJ$Dbwh6 zCgVq4dv>r_=$s>CvRrB17?RMHyBGJH?|yE11*g-ezH zYh$?@nRG0!FRRi@QH5632nZGyw!jsX3@9+BbOf2_63QTs7m~J5ayyCnwy^me>ca0& z5&b>~;AL_3@l;fb5M5J7()9WOiA-yY7;MMl4n&vs^bXXXYB4yajSPN&hQc_aFqd>jE7{Dlj!5}zkpvguU2 z3L&WVTFe@?=-;L(s^~70A_*=QFEo8q7wox7KKEuF*I`)^dsDM0BFQ*2h;nTZ86?u+JCL zFn*Jvwzk$7x7i{~TNF~MRH3LZFPACg3VFoQ7^$mPGnE9pF*pN#f<3@MJ+!5gcA12t zz*bWsr!i$zlRx{_$4D{sn5wHPY1B;uV;C(j<&3pa{oy)~ORr_gCl6ZD#!nb!B)L*b zQkaVzPv%LuWA!Ar`6!L}`amb!XzX(Is5M%3udUC}=x{U|yKUW0u8VEfI`|q>z@gPT z0;U??p+z5f^qOwA$Jk)EH5z-Y8I4}A$ymE1EvdS0_APVBsnqCofuu)W zfcHW*$@nrL1eG)Tz59r1ya6w4|V`Cf&5 zfq^u!Y(Ykdd}5hpx>@}j~P zxKiYCG6Z zhvXhjXU2-joF)6k<95f23{qrSN2F5}RXbPdqk$ml?2$^*%|@d;+3R4N!nKuw?pZZq zPqoR-YnQF4ROxMOqPI3RR1=q594>WD*kv$#f;z6d$*Io26VCKjS5%rjbq1r?sH%9T zBF2R>e!aSesq&>OtUim?p^;+wtUggA!JAPT{vVM?MnsP7A(`_C77)gbmWm&M0s1jqh+g=qufJNF zhMVx_Wy_W=0}4Wge^XUcQQuiGB91!P+Y^t`GAZ#O03|^bNuZL-B+^wNQz9D6=v4|a z!FQ2@D1jq#lHfb1__a+}I@uHrduP?on)$7bN}&^%aCEr%=?l^#)6o)E;iL*S7PM!hFdENTz#*>munfA87zZ=~DNe8Kt6_qmD%kz&2D1p`_O5^$wR)*)=A5cyPZ z0nyM&Ko5&wQ%vVoAUzjjV;GY8^U&Ha1u^DJzQs8BfBzQaVe%~oeFU8+AO)*MN?#U6 zQn~2fmSU*{Zz1$f6MCmXA*U59%8(qS61jARsz~oDk=~Uey*D zjrhDXX`Untl4JMZXnrbPUrYqx^jv~iqi&AVqnifKU!F)TKYw7(HbU*&=5%dd9F62Q z_w<}P6p0L-I`=7S#HnixZfH98q}WrnzOeiJACNZ_TDZB7kac9}l&uNsa8)KRX{l$V!RsMQtafT0Ik&_!4e6jTyVtU`t*G%5xxfVeEt7*LdSDM+PlQyF|3Bv51U#~P-EDVc ztJ`u9cDung;4s=T7;Gm@3Gp>x2!tUd7eXKj5Qh7b8$t-VolAIp+yn?*Lkzs|?j?Ci z$R!Dv>$FPuTYH~Vb*fY)l?d;Bk9_&uQXSRVd+llMwbuXt(+R)UI4;Znb#mhIrND@YDm&esb)@|jN~W$iBj0POWu*I7UE8u z7KjI91&8KUV^T1vEtg}3s7G-OMWcNMAdn(YkxN1WO7I!oJrt&bm?cy|&=wUoHj%AQ zk2ZiNq9|PgNxIDABp6QHfvxc7#~g<|b%i~Jh}*-y>%a%Dz!nl|crjgxsUvrvU4;@U zDQxG+}I_2iMN6dqp}-Z4ig|@(7AE8n6ij`iV#|naF+=j312{3afSDL2U6dt3<>w z&oLQI&yquUptCyk#>bczX?aqQTOL9O5XX>>=DP7^+uOR`o166blWq(dVQ7ATm<8iV z*_@WTb@`EKm4{mTl;DsnKfMqeU+mMVtu@?2}%uck((CL@!+M-@lP=e9{N zaLtM|7ENM=hCq_M9i9^kEeJXTJO`q9=VlW@x5My(4FsKIu;BG$T);rkO_#OjzHn9w zgriP(a>!F6pD&fjw5;_zN^YNr)PEWG?;^QCo~Acg-T>4mgoUc*)&M6qCAJNI$F4>CB6KFCmh!k;XL?0bhd8brwN-4vqq zn^1yTn1^HV2phi#mxjVZ!x>TNJOP64w`7*jGx)25cO`|`mGeNH1XLVTqS}aTSLJJ< zDE1u}u`BjdqoV}os-v@`v)uO{A8Yj>`V8;e+p`xzTBbi+ssE`b$KosI^8Ne9K$ByK zI~(=SnoG;Fu9^RKj9g;YyT6nF7GTLzf+-2O+w|WOjcTeCBHF^{vfTHa$n!9*wo(+l zXa01(tsV@3$g{ly`80XXf;_{RK5kcdd3dyeH)BZ(=3gHp9g%0mC!-h5j-MG8k~Ja; z=x}3rnAEyL&&ER>dPc^3!k!5n?Ib+S&`y1b1?h89kP!65pdb=V{Uw&9E+dZu5Pc+RmyFz{$+G-t*`cIJ8f^) zu&zpT_xFjtyxisN_VP*@`6AlhAGkVsckcZ8mL?R=pZ7CPg*<(bBH*b8=&+|WS>q8!H(Kk6#&2C)tuY*l-QVDF*bw?-gn$w}G*>oZ{6bksX zen;M!H#_EP8_=Xt$e(J@l(hBr%fUn>?AE*vA+Pw-L;l!M#On<@g}my|wHP4n?05BP z{Zxv@2VHJgpQoQn(fA;8AJA8j`{*+egDSJgC`;kojW3+i2hr6kTu;V zix49*%)sJB9C>bd{$^i$)q`62XqQ%r#yowCu|_bem5>TD zsPgrW4I2omYIG==97y`T{f+hHXls-;q`{(boTQTN zIucE%m;IU+2xyw0$5?KM8?44F2or3ivzV=;0wC1~A;RrOxsO0jyPRIl8FU5HNy!%2 zA8N6*YjR&h-nsAPbnm|b2=AmfpdUPNOs{DewA(;Tol1pkHe5X-9?#}Q5AzYy4iaxI zN?UHX+v7IL!Q6J+Pys9R@&6EPH;w2|O&}j7->tuboU8v9d24;7zWe4a^7UsC%~z}c zQ|;Mj$q;#7{ln;B=Jw9eU!;Eq$8biCjfMtANt`A`#;e*fqJX#onDUnKmWDO_cto=7 z_A(Y#o5gDB(r|9rn@VDtn1s1*^TuXLgEi}H*`+zyCnzn~Ig)MM=ZY&YyKVFUK&E?k z^>l7%|CR4n@%X*3Io=JUnVBCM5Jnq!LXOm&5uOGI^uwY)*WX78#^_}tBe6;weiE(U z#80}M4XmGvNLUMk5)U6Mit_y0La~XY6mG|Jr}=Ip!p722h-ZT*P;NvPrE4apet{L# zGIYiwve03ujpd{~SXE1Mm9p3Jc5-`Ze*KM245yIOc5eP=6Uf!S^nG#1=W*65|h#dfUphd<2F(qvpz~U|1)By`C9mh@HE!d;67~N zJ#9n*NmQikpvrbC5>>p;@kj;))M3x0;?eM+-|OzPk2pp!M~uf-6A~(PJ^u}`=tmCn z0xUpMq1weG5IDY6c$&wU&~q*1DPhbm1c{+c4nG!c!t(qTtW+HtZsJYl7H|X)IJM(V znJ0ZX=JX?L3&q26r{rI`&&`mrY%T|(08{!z%kC$#LxquJkV{y&w?eigaX1?t>UW7j zDd<5;8r=5K$X2q!_O_EpOY`eHR>)^Zye!)x?>!te+qAe0AsEG(+`e~qYPzZvMiMcP zTM4NlMm}n6n(b7H?XBPCtM%OB?dRL;&Hr+E7c70iism)g)Yq+(-N7e&+vKtH$ulxc z;KZ@oLbXz!7%dL3jjT1N5^_Jb=jGZvbbwEM_yi-X2P~K#X5Ra{EF%_O`B(ZU#ts;U zF*u>?lz>f8&9g{hNq}Wc0&p_S6>-bPcEe&m8TV>x*cP^&KMtIp#%_4%6xHS~&b{F9 zA!cXQ%|Gp7gbC>I0C^Mn6gWWsgbkT;G747S!-a?5QF!>_ z;zJJ?9(uU=aAR)JFG3h{Fp0iFh={aUh{yVgEQxqA7B+CpMs7-qD-BExN(?GYe?)j*bA5Q~9%)iU$7SA;D|90+>c4!anUBF!DJGyeLq z(){{e`!LvSpZh>pAU38W5dAGY4Klph-WT}-efh@1c#_Akmz%4alOLSYE9UDr#xF+{EllzNu z*H%)F)fS!x6`UB+w-XRJVw+LW2~RN0jS0qQ*#ZXK#w#V_!V$Qg$yLe?@HUxeKA;uB zeFbx*+;3T89#w>$LrBalf^_xie(FhEMw1_9dd}SNBiMxfaFU8Q< zY}7dS40&Mmmf2WjW^?qbtE+z=FQ>go=I}*YHOU+vrZ?VPe@(bFA4A@O`ezW6u!q{9 ze+HAdvhsv*PnW0n1i{=v0mMrN-__(q#-B}O-HI(#K(sJ>b(46pkNUNgW<*aAU}9`1 z%0KKpI8dx*yq=j82#!chCbVPG>669b<;fv!C>z+kb$I<+txC2|rRGM0wWV@+WT+2G zgzE|wiYKQd1Nr$>cyc%*x$i$&J~b0TRxXa9eug2a7vMhq`ocUF)crtesR^W3RfYv) z>(fM2+ZdYK&e7ED2acwmt9HUuV-eR+hNs3o=SY}p+>MTctEM00o?5G2UZCGQM}CTC zS(yLnngwI8M>5MsX@31kW;xCxw^pkxAzRu~ZE->TDH;arF!$r{{|)nnUjdI~n_0eJ zAIUryd0@D8J>3CM=&#+sl*A2i+TBzYoR}Rp*a>Vl$0ZkWIQB2CKDM;_`O;!Pz}8$9 zEB(&hdivDH`ttFm#p)e%cXTqG_7g9(?s4ZM+48XioYx~6_*@q^Ry5}1*Nq)ahgazj zceJ@->3&C_V6&+^cG77db24MQxUty}u(h~YW#(Sg7xkrDb)mY@d6v3=Vq=>jgd>?Y zJ$G^LNG3dOMz5`_cp1*XtM#AlXfX%a1c$9LNBfA~&g%d7&(Th1TV269y0x)#X7$X8 zV~ZVky#AluWL=`;M>3((9lBxhE0gOmA$ZNXWbU&*e# zIHi?q$NFZrgKlcKlZ9jJ7re<5eOyRPEe{VbPsM1%$_|@%Sescurjwb;v1;Mu-4#)5 zWn);HiWY}lQ^N_5=9>=sIQhvx7S^UBk*W2(8OKL0)mz#QRv zYFWbm?bIW(+#2@(b|dPapT0v+ccmopKd=(oAMw9MENxtx?#xj#vm)gi(SE^T;&_JP zmnM+;dSaXsnGtdz6vQOtkmVYtTdb@cNF=cijFn?-w4Ilu9T)8H%*(+7X}xoETtbJf zH+~NC``lOKOe4q}l!Xb{(AV%jnM_c`NvlK#L6ngK7g+|3#0_&>$t8slBx=p&Br!LU zn)SoEk6^jy?oe-Cw2Yn%BQOQ0^bO;7no0NE z!F*m-@>BV#@lo6{JZ@z~9bxh7juE+zef%Bn6y4E#FL|zf_jNsX6hvbjIVvR&)3Bpo z$Yv;_M_j}PvSO33u|$cXOjO$hRb}_9HH@N*mz-R#rBL88s={<(dSWaQ3lDlVHE+vX z?!tYROi62`s$=IrH+OOFp5A-T5HY*2?y=+S_6%<|*hH+k7o=~(;#~~UFgmynxtGo5 z*I@1isYH+xi(};BNos3oMOfj#CY}^CH=B%r1n<L43A>c@{-9 zAZJ^{`-Y&EwU?IW*B@PG6FQ4+0HAw61c1L`brp7GWMQ)vQP2CnP*D`SVh=D7wc)3G zwX)X7XIgpLoI(GNf3tv`bMRGTemL;3ZVmtl*5a#C=l`aoTSMrjS(8oBfSh!OuZvB zOdkklvkU~7D+e$P*hY)-gIf!;iN5^$rJ1RnmEqj+?ed8ihV8RU4+id=z5Q~fbbI~n zk@9kGcy%hu2s2j8QTmZ`{^G^${IM5ojbxACQJ%Qtc=p)T(yMB#v18+tiCm=~%O0N` zicPKLP+}l5xr`&-6na$r*&R1$2`b&zHClHnhBARj64C&jiWJ2R5#1A_w? zH6O{P649Z7%3y_2lsNaX@R*Dm-4jS1$V-0Zfa^sEViR(z%PoSRkwwP9lY`crl2}7J z4f9mQ3T6zJGWL_ha!T#|C+sLZlmq1oI{^>lK_S1jqgmQ5v}cs~g5Yiq?*L|$)_cq- zwYQudad#fZ-eR0=hczAjWIVIc-kmZ^U7Ox(Myb8^#^H7T(DpaZtV6rd>;cawozgcz zZKRPTNx5Vrin4F&U`A;jwvL)nYVT0@+xg+s>*fJ#=5YEQa;D1?0)BoMjr|$(Nh|ts zmP~4%*G5KZt(j3;KQyD%*smMADNoq8+vJbuF3vsw&=EGz=0gV<1ULa3;F$#DB8f++A$w)r0-yA@ATtuY=XBYCxs zWxdFeWPaAvQDd9MIz^?5$PmD2aVQ(f8i_5{7AypXA!c;aV1aiJW(924~ zcXGuEq2Z zL`)5`i%tvmOoMnaZTXDz&#;e-QUc?#ZQV~G8fj&q!Mwsj3^W+H?!ZEGAMW+tm}uzt z(4#{=5@goF`%N6)!28>eSDdIu1%!bJ*j@8ClJOe@A2!I`F3$ghG%j4-NoWWqw_ z=bG^u(oP#6@zcV5Y+Lt9Vt63n_j+6on<~boxCbTm_}!>G8%VY_$A(3k8$Nm_^3cbMu#oGl#E~g6#J|y(eU6v!0+yJI+T=}(y-5s>r(e_{|5J7 z6CFBk9xh$`E*K-tZ$N4IRo;6?(obb6Ohg$$fcTSY{ABbu*?KF&tROnVvMgS;ma7yzssvBZrBO8plrgoHK zio4KhGQ4uHz{r}D&RChpCxyG`UO4`nn z1}GT|m-r8`#Zv~|lLd(B{|Qr|(}|-c3QmzkBjVZvvow7nw~iGb5<+ejJ~}Evy<Qww(2%!v^himP6IQDnX(GMIVnGVdy|YZ&$qNCj`9T^>vf=Hcu!izZs48 z`XX%ke7=A$plMnFIoBl4zQZM+kVnq%3pyyhH z@Uze2ycsG4G75PwSARk^v$OCC(7*-qCuAVwg&_atAp1(?@l1AnCQ!;udGSjkb8(IR zJ*xgB_Rcb{`7t;Kx9X=8aZ2bQkx9iyML921ki?BKg!qdxRLOjn3=?(40 ziShaB__2v&zI0}|fQ9r%4;c%K2{}W;=>3C?ecwkkPdlQa3(a91C8svAra|{h;mdJ z4-1bWP|PTa>wt~G&Xd=c=GW`z4gf+ll&P?|YxgVNkPjAhD$XL0Ui66B>UgZtYK%D; zBAG4BZ6m{(4y|ra?QjZBGLEf&f7e7#gIgYb;Ciuh?#99|Z`xUgQLIllBB`0QyZ>-g zk7#IW!(kN;wsxKStk3miZeFuiUp#`vWv;Vkv_F+>wEqC3cW!@YyML6o|95&YJomxt zZ|~Xm7!91&r<+P^qD&;fn?KjoZIxUb9v&_X7yPKahCF|VD6e6yY;WpoQr5?|B&-ll*oonhl4S`5H)6-o!J!3G^BE?bv&BUo%#j zvAjC>zI|)sy*IwP(fiJ$_BHHg%N)A>2pQC36nLY5t{o%85HiLP-F!`FVL=d>!UrNH1&G0v z$;zW)>?NCtXribD2@x^+()K&K5p9Yga;Ap)Nh1_*lPTudCDn|=GhPUJA8duF+>81+(x`9+z?DM-nbkv4;sL zOzWljv#p`^GAt26MqzWNcv9O0yWL17Ic-!?;F9XV+an6{l)F9(%?BACu=!WpdLol1 zFg}`|&CEtwtj6!-=s<@JQY3}<%qBi15JY82ytVsNJ?p`|7CyK(@-B?`5O!{GtSLKa1a?(BCE)a(gyIg zTL8W;C&1u9z~}CFhF#%?wJ~4YV(r$Ov(@mwYrQX8hQM#R4Yt-KEy6|p4r3&oW-}ee zklbtJ(OL_Wj6B*H8;$w7*_p|S(Z#XF_7Q2F{oO~TwKqo?oIkL3w%1{L$YKd|MQ|+k zPkBX@TUNwdYt7N1Ke}?IZ4@RBTo3z7!+x6Uq3l0`$=_4!)y~_@Bi`OS%hZ8`c!yGC zBEZ`ICD5i3jPgyIrbU?6Gg74ckfa;=f314K7$(45cl}&bH<*VDcmSfQA&g$yCR4*I zLIrsx(FjU-xn7JgfmvqQHl<}*VU2BQVx=NI)!Mr*4YUKjJrSQae;w+Qhak9wIP}BbT62 zRtZu79iGztMvo>ZMtq{I#A8TMZipe}co7*o(^!?ZX86Y{b_&xkP0^bIf07j?HGOY_ zntS`6-qu5c!6!nsxPDa83zsIc<)BZM)b-W3e*=eJq4W|GX%X2a*MF)1e zk;P+TdDHEG)2f}<0 zjgP9aNAI;5y=9gakvYdY%RsRal^}h|f%9u*WTZG!^cYhMd3<_Nv&U#z5A&)1#XVWH`{t*j?J36#ks|W z`TaAdm0_UQ8G}C6QKw0wcI3ISW=7zu^lAD0WlgskV3wsVcdhc;(hOYEp|p?nR5#Ho<1&gw1Q4PNJ&9 zB?mJXC<;S;BiFM&)%GV?0mA-{>0fsFvu!`zTsn$>qb&OmYt z_TGKOor-=B2V~cO)Wgs4Lf^>zA`jC=LN-5<)t!s*1V})MMDJBF`nF(J)OTTZlC+eT zV9KBg?Z<}4bN@>H;_52-fZ^9%+npm@^-t0p^*C8jlu zy8P1QBwA;3a+Q3bev#gIIJf%@vrabm@WT(+|K#28#ue0O=(NUgbb?%`RVJcB1XUDp zM_{=H1~9ZJw&MT%DYwlQX;tBDgt5%Jaf^EE;^OinkL*`)eF282{?ZU}rF+i;kRg`E zOyR8sg^2|!3D-duZIpsck@sz36TQVnteOUhMM48e*k@P8l$2s%3XHoVn4)_@?)GZ< zfP!1hPvCxL9Il1NjHW@y7zb3O5rh9 zC!5!EfDSuQ2D##*Ta3L8z*0SiOh#M_H{su2{RFSi5pHGitG&MhfI8EVXjRu;=uKTW z;on^TU6NppHdG}-0PrjuYcFOQkWgNDLLtaxNku-+2H6*mv*zw|s*329yljlI@{hH( z)wkVVOB zMoT&Rd@B35SC7}&XrP}*VSDdi=o{H=3c%@41sFlcCL=%gV&;XFbCFA;MAp}io zL`y7UO@OK4wynDXko867q;=*Lu5g7zLvJ~i%x$ke5?CqB9820)`^WFR<${il+3pYI zwqCqOUQmC>*`L2_s)+USn|qst=V}!QLk!O8XPrbM4kAiO|BL?>?{=zo0S&D%UjT1t zOPe;nCk+kp8qJ~DP%Ik3TGci}CalrqtE}v2w9G9{MIRA$sMq(&L$g`+ihJ(4`L!-O z(G>dj{)PNM?6e(3?GiHzL6{C9i$Ad1NQ4i8Agl{p8GlYgwHC7^p`|IQWbU8&LHpxY z)0ts}(RTCEy(jiI8P3cLAv{q+g9Aa43Z`_nfNF@G*_tgjCYnv4DVL2kVEg5=4IG*y zF&9ks=NgLH3EsF4ve|P6BQRm@LEN1eQEz555G{sE-f*|s0#mMA?D+on7w>-~o6%MJ zI7RIw4@Q7Ax63X{0#JHiO zZKF1DAnzpCFDJy1Cq1%uxvlWo1KIb7oJf@IhCQl zZZcwJQksV?rCg<~w5g=OxHP~1N~==3AZa`Aw2GzUj##BtHh-Mx`Ls+MPM_2u-QAQe zGsmeo9d>ixsIBuR;U}XwKtEn3?=mKe(Z5^vs!a7=h5#~6_7hQX6G=30hQ@T|tJDw? zS}|V>;Pbc~s=_A*it`y0Lul*vllbm?to>$<5Z>R`a{yXpC$ce$jD46n=e>^Nt8f%w zze?W4lH%EBFP|ePjI%zgr<^G7g+oX;kS4BK1G*x#3}33PAAet(U;h_tH`rS&QuoG8 zq&GkU8`e>RAQO=YA_CkQ!&akGLPmW!n`~1RE`x^V!_y$aP)OUW3&d_I`$&w4$Hu$!LP{S3Xa`$@XFn@m+lf{l9xuA9xhO}74W@O-^LzA57&H0ENfH3#=2$k&zU4(bZBq@L2RlFIg&%E3dz!9&5$s{4wVF|aHCH7-Mghj5PX!?8RSOu_ zZ&^WjSy`c5HnmAl?e(DBi>^wr7vl74rmE+&RsF4pFQc5c^CE4h7yfh#1^NKf8WKP; z)rKV8o$+q)GOq_?atx1VH1mwn3UruWguJ&Vw*pooW2~sn66n9Su1B=QdM8VmuV~*& z+DH0tjV8S1&^5{1xI1+CvSbws;vMvhSnG|kf*_GZfhaN)yFyuT)bSB{ZO8H^iu+*U zD;jALwvq{eVm>jIoPs#SF)c8h(O6xAKf$y|&H9We4NjZ7FcKpsFeHh5Q7Yb1AJ(Rq z&z3eGxnlx}wnuMWE^Fk=^;eSH>c3t8IMQq9Rxi)tf3vHXYqd}2mM4eI%`!5%oc$zI zk`c@2?w_sRf7?X)-2Iig`)`}z8NMG0e@8t~f@81+&(m*n5t~v-#8EPL!%1u)h&JJx zN)*McKyY9>stFoBetc|{!11l)TkEUU%ILANW4X*wDB#!n9X1rRZ7pXEn52F!jDDju zC(G?>=q95d8J@XoWq5e?uFBRc!$Yq)Q@ymDtsiF;e&KQ%Ho7O@rsS% zm2!h`C|X{j9}?nI%h}xV$r!cg*RRf2?>U*@-n!-X{4Eb0A6c7<_6?-`?#Ou38!Rkj zwr*dDSGS7AQ`JOb?v`S4s}lcygSL-X{$Cf~0Rs3Ti5@>5Ep8%U6eMs*7e+eVn&dnFl8%Xh-TdU@j`acl4{v25jkIu!B<(c2G$Z59vG>p+` zxCc2EYP~&j>PF^(EYdBn=G7S34cD7jmYdE+@XMw7_58}c{$)LKbyk&d{nY=7t}oU9 zfZATYuuO0!VT9&7yA2IM2F~iYc!{K#*C8&^(afc*s<6YtHg=p%i<`D)$R?8t4=Mu+ z3X1wVWYTj77;P9Y9Y5@5G&980-Dp7JlIc8ZWs7H;wpX}xh{!dw;> zV6uBtBQyx$(NN;XjQ(K2$%y{68gvU=`kkglS=;E_tR`*FH}^K!6#pRwBX-YHzZr30~(= zOBzJ1<1i>RSLoK%WHKHaNHKPI79&7B5hE52n!IQYIqp%KGfPC4UMO2-TS*!0@)!qsRZa$5;?u>0Z@smZN!=tV3}GBlhWO{dFafk;5JIRZl?vD`w= zmx~WaqmF^hpg-j8SDgd#(Zu>W?3X!GGE^J-EFx56(L)BSGM!09!Z{78_>I(z)a!VC z)~Jo}9%0DNuzbmLM;Nr`n8`5P(Crc+opRU@8#YxL&L(30E@f7oZ4qkddE_49eZ0N* z!82)Ijxv4(;(KT4BK;z4p_XKRq`yxTB%Kfi8Em(RifVKUQc*B9Iu+ErEhSXA^bFUR z(Sg@Si@8kJn@S=xMhiP_Q<=48;j#H@U7@W+wg228sx7|fC0*8HvSkh=7tfbFsMMX6 zu69|Pv#k?iY-KD&n}T&fAhLIce4ct>6YVoHj1XdJ$*|AnLH1#gM{b{Wx^;5x#If39 zsgO-)I@-sGV;s7mTMhJ)hJo_c=VyCbvi@2-^L+QZ5jE4H|!6vGq3)!*3s^D&o&5K!`ug%i57Ep( zq$qnFgO#O627;AN$x${k@T}SFA{WvAHc#Kzg>btO}x!aow7@Z4sERk}*u& zCDSym)g?=5YnM6dyZ-HA_BRp&k!PrF`_V{4ZQWY z85D~`8EA2ZY%xRmGaiI^pc^J|l8XICBEHi6dPWXLv;M$v)MK#%BQE2F62uzp9M++mUq8O@%t4*0Ltn%(Gv(>${u!H#4 zL3$fqMY-r+H%`wc_uvpLn7C(0gJzNO(S=+F!(s#TJOXyrMP*`_uY;o4E^!v57RE(G z*Z>QcyFber7`e6tC*C#wY+Fx7BLrq=m>yp?m53}v7h3rk5od7_A7gi`c3^3oIG{GN zJA30Bx?7dcp2wIT+q6CjqCzAhO4sGN7B)SjI`&qA>t9S(WnYJ7O9}Ntfo1=j%IG0T)qmj@^c%(TZ z*uu^u(jGB?c%Qsl3%^$PVH&hX#;xnJ2=D80yiyGeILB1Cj2R=bLmGn7j!*G%<4kva zEgFBYt;cXJ=0|dwL_AWA7F)*-_q7AZt~G1YVHjO4DTHo(k@VNB_Azzy5LF$72^?Dh z6{B{ja1KNg2+NTyY+}IK6wezRa5;;GY&sSlm>8Teb({$7y4h@O}E;CJ9MA0 z{BEV&yg=JES9t^yxZlRYO#c##nnXhY)4JypNW>#U&DD(w<1VY)NZ52()`F2h>AIrn z-}B^-$@fas43tQI?J`bW_d_iq)`462{qy1q2D5}3ZDF)FK%URe+rq}>4ROZwGEj*)xo z@0z{u)=9ketnQtqVQPa6Jj_Q%OSvc|F)sy5HwFhNtcBU{#FpO~E6{7%WKH3KupR=D zP$JSt`KMM@fo)wQ;L-Z~Y>FhBUF|dm7E*$2c6wTtt%G1t6AWwKz}1B z-00s~^I=r=2KF#fr8~GP(tVOECV3Od$q9Z!>Bu%lbI0tt2P{D+(qF z0wD~d!tSE%HqPfP)@B=JmL!2bbHbk>XE9Cq5c%tRh8F87@~z!3u|n-%qi1WC-H+CA z^kV>oE9JO4z0s&6-QmbzBTRF^8)bas=gH;zhsdwh-%swU-_CB_=g5c3qxCyj9iQ1p z8@TZPkI6G&WyOq$5bq3#{4{9Nun3)(J=yJcm)+&jJer0aCY5F{r_27BwU5MAs~A0G zfEi0K@tyPfZ1bH~8bIT%Ea7?RTM=p!v-b0IwNay!2J@iVPpns*(aTOks6sGr-iWCn zn@E@8o%lJn2 zo}>SPevvU!>H4D2%jz^ycupiJFTsocmzjb?gPWMQGvX0^^uEHlx|9;l?&zca<$+%?pfHnV|4kU3sdC_53Q6h ztmK8=n?iB*PI>n7;~O@gSiQPF?8}s6(X2iis^0x`TbqwxsVohzU8z>DtPSHC8Qt3? ze@DLuIXJ1WVpYcgL4tIQ2mui{WFjaA2O6vFhDP>cRoX)G*m!Ixtt0uew#LzO4|Z8~s@u}t35rpvAhf*@Y9IVFL4TE^RFEMw5|FLnTHK=_|a zsOKO_>(W+O-vCf#1!Np){)g<^yT;#Y99gKR$Nyy0WvAvo$Nz19B5iGN>(SAYN2^v! z$3~CkGN~l4U#;jVviaYKN2@`o+L-@V&J(SC5ci-k&|$>uZ|jYy(n!9TJFLBD&Ps+8 z6}~}lfCmOpWhHRtj!$_A1+o$Tl!r(_@J<~#bBFHZVIfW}FH4ja+J*TPiZ(x!cJQ=Z zG@b+gls?2CU;r!rIT+C;)ZN+E`@CN7fOkOiX8cJ;KGqJClo)`AzMvH*Sr=EyyV@b9 zsCn>Eja3tE(!XMLqCtqjdHq(A5CwN;L?*aO5WAnooRaaJ6JC* z6z;ia_f2NIZ`s=6g7EN#C8in5|?VZ*U{V{o9g z*}SN?Q?oN|Kqlha*Ma(ntiYzuJ-Nq%bwa;td+%Swr`Ze}f@^#-IR?BG2+lJWOE-QJ zfW^|;Y?DN4z_;m+EbtPzus&e?nxkQ?b4a)2B4pDiT-Y~#h*`Ct60)sRX!p$=;L$#d zXv%{0z{<2u;a$du_R>l&F?V*Nn4bDmCdj!m6^%}<H=qpn$j6~;0xMD#)X=?$c9Ucxte2B24N{F8pw(RzJG!nK4 z?0)n*H5(GNHcs2l-X{HKi<|jqM>o^F40d*&cqOIywnl3o(e2IqA>Y%IAj@XvyKzfw zZG2cSb$SRC#q1zXH1prW*0%2XN&5S@*4tMXr?GJly)k?Fv6E+?*eR2H^!slq?0&j* z`hM)M=`CUeaE=%Uy&pSWETn=W1-y?78xbOy9%7)=hp5=s{6J~`6**~ogJ`%K%NX+l zmZeRnO%d=4s5(S}jk@6lj&^&JUH^?g6OmimQ2#pK_ydE22=me`Y`|&;%tw)w+6*G_ zf196(=$%AzS%-acJUf@0i${mTg9CoAJ>$sW{Bzj`Ec35-Z;!s&Iz~OZdFGh)?%r8= z>jd=q^%_Qt0)8qBS@CG3nOJkqD=K;-B73AXzy8KUdB|9#=_`lOkeM7}hyodgMffG% zgS{9V&1#~oM27yqAj-^-NaA#PWHG;(h=m5c$Ui?U4LA7bo3N5zX~HU{`Sq6^l_d-n z)MH2H2s0JO-VS~kfHZPv1YNR#mGvMB;u9d)h^z?mbrt=6kjTBDC<~?_QD`s_h(`z0 zp>$v%FrWoAEr=ZCBoOfXWQA~PB2E%qDSHLMixrhvg)}{tB@g-ryc&sZaH*n%=1WJC z>!VLT^^_J2YVN@SVMK`qd{K4x)U(gh-&JG2aEiWQ_ca&_Cw0H31p=Dp2aq7K_apK{ z;Xy;QY#q+Q8}y%_BQ|xv9+k8Ks!e?YoM0E6_UD^IX8pwBU_MEclwge|hAv4iCS=yf zh0NFwu(fe=I7i^jEho=yoLgHtwzM$cNt(*d5=ABgr;}#rc^>c2(a zS|6$JzIls${aM^5zRUnfwP&9tL*#k&4}*wvLU`8Ppx-5)kWP5q9TX^LW-6?jluMMEa3!DIidf3#`UEyD zD%ot#gbFkeOP|9S`KQxMW1)EU%y?=wLKW4%v5-4g9Jqehu{(qD=Py++t>j33p23&~ zC-Vv0g0nckl3jUmN-Nin_04Pt-PCR;3&++kc#|dixR97y9v)tvicwx^Z;D?zY~EpQ zW+5IeEzeAjRSPHYu85kDUz>_>WYbv6yEGLo4!Nd=6CTYs9rP_s4CG^;e{A5Inux_P zr8LmbZU)ZTwt1a;h@3fL{0bZRu#eT*#8S z$ngxi+_bNlt>2j6z<=*SX?~sFI6wX5=GxpT|k(vQ*%L6aldH@xTr>9ypjcrHPG{(*92)f3fFU_wXMcbIv zv>gx)<;Axfx|obp9idPnNC@zyn1%uA38j-drmDL8oeooRk%8mN#?d4QC_kSo2bDId z#h+QKX8v5SW{{@r*=LEL`&o| z8>RkKHrqBEo(d%Mvv~wijR>u(sXN1=!kjyt@egJ3*lQ|pPOw>#Wy+gB2NZzb&MF#E zgcF$XrYg4yZ?-n!%`NZz57zgzD{nrkKeFG`5jPyfrV6S}K-EP>B+B(ZqN?^wV7Kp| zK)j&T#l0M(qSTb%Jht@ziu`74caJom)~&WV(xiHGs~x#2%-b1)+>5zJwu-G-dJe%x zBn8KlB2t-U1{Ud-s;XX<@xl7MZX1?+n45{eDTzTQjmb|&EpiQSXOnw3(3ER1@a!e# zvnY^Tc_`k1(Y1BDRVdih!gOJJVk{904|+8< zZ_9h#tYXh-UJs%TL^E2was=51-lsS9DBIA~$moYKa`WR_k$^~#0>uy`h3lYzYD4OD zSvC@JST=1Yn%!;!?ywt6KM>37^=PifqQVW1w9YWEbx^jfGw5rUfq6-Dg53N+Eu+Jk zC2(~5VG*7|qthou47t4#) z%1ADi2oJg^waI4d5!2q*`sO9FP2QwWXb77Wtex`pK5&-JWp}B^(G&Lm1^~WotQ`kd zsX6S5jN;TA0*3CNVBBjMrCTIh05(+;8E=bZ@^2cGaeH;vJR6bsmoE&wVSEb!{=!%d z4&*##YXOr_4feRDO=NUj6mTUvREN*&MtVW>i1KP>?Sk>$;br6G-F+Jpd1CBi006#a z++Y}ohCqP|@F*6ZQ$aMSj$6oRo%T)?xUJJ{do^Pn2G%Ldq{26w9Jt6FJEvE00*OGx zM;rB)48+oirL%eNb+^oKtZZo8K?SX>z0msV%5uxdo@5<2y>Y(hA!|lepV_zT9m*i$ zW(*=7_mjST6g*_x7=`u28ASN_-~5V6FM%;`^t#FO+oRk2`9Iov(i;QFfj!w5tM4~@ zvV157NMkqLxH@CTyl1X%6o|7!wA4y|lu->AvsQ|@f9@`5Qwv#Y<0Pzwg_g2I$ z+()J+^TXjmcS=h&cM#0u9k_#Z7^PQQCy)Q|p|Z^Cn{PaPyqerRyqD|xN~4zzJONXM zGU-=PE9x;q{|nylJ{UN=_QAY|dVzGUoOK30}a&yl~#^U%5xR>vc00H)CT!s9}RaEcj`oeV?~7EHIzpeO87A zlb7OY=!XQ1Vvc)=$SOZ***@9y4^)sPRlbI*4p`%{u<1~c+gDv8LJsdu%lbv69bK?Y{rl#Ds0A0ntl7$Gtl@G=Jv7laH%Zdnjbennt?BM=Uu z!=t&I>m7^3+RlSk;S&?*z7eO#3cl>9Rk}JlXIKCeYVz|hjUJxM20F{QPc)^LsXlBw+MIlTm z6Qi~KQZ{~R)EkAkJHf!Wn+Tnxmle!qvp7n|`XT1Ijn6PROfQ+wZR>uU8e>YMTEEMw zrfqE51{%xOdjPtF*bE!=cR+QRr$|>QM-z3~47#b*-P9|c}!JyygE^5W5kvd#04g&9xgw<5*9md$Q z0(Y0X4m4vls4_kbaoZ7%)w(8#LXyQmL z^r_zI4LG-~dIWL<boIC;HHCLABv42Jg{;u~ z#*rBKdE&!{lMsW?^C39hM9)_lV}T4wWYJ0zTRW*RV2u)nilrUCs=#Jrfd-2nRXp0f zce@n)w|QUETt$=X^IbO+64tr6_&TgCas?Urjic z6d`#W-lW!%9uJ|Zi9)h~DH)praT0IVgwODraJgeic(QtF1sUx>BP7bpnW+n&d1rBM zH9LEGHJ4qvtC~GA85Qb}3-Re?d*S5OisTmaYvo8e?;aXY`U;zO&sMIS%uhw8*YcPM z!PwvoeFwRnF^6VZY%mN!2%Kl-Ae0awrvMLKK@)6#&U`qX@XwHhsn-$&pbs*RbCunO zv3ML9-UH5Qc@VP+kk>+_DlXRLYpttx*;)^~p-vpO~%* zj9M<)N0C%8=uebBd;ZGg?GLT4K79M+mGggC|MtY`nMnG?rG@!RC(@CbTPEt?u9bfE z>dI>_&&^$a&C1nZE!Ap$wc9R_PhUSfF>&_#^!Vl5YJH6PU~{iX6VwKAQ*YiG4cG(% z{m8Je5#~P%#*fA+F+d5x5JLcpmystsj0bpBHtR)_{BuMum>(l^SId)n-0~2xuONhN zJ89#~wzqY=H#h0=C*6t?E+E}IW}1+N-B4J+we+a%dLWug0?V?=p^&=jar*akXCTvYUWNHxyYA z4DiR0k*p?w!w-OBy%|P!p(>#Q(h_sdlNQo;?IXv}Q2UEGXS;94SDGPTtWT3K)@t>S zH2B)d12`$S_b$-)vbl@(^A(g>i?ExvhgMQI1_AAJrEHJ?! zX}avsbgcO&`ee-9f!Qqevu$jGPp*+wV!b(V_x_*7ylG!XE!I+B|5t-Ye(K7Vf3y_kwyGFB|I^++_9C7`jv)Ak zZTL0Z!%VhFL$WTcC#;_{9!bM9Tr;29)_nj$zejWT+s)`K>Uv@Ox@Z{KYQMjqfc@bs zS9V|Dscx3<8_3zIK@^h6IPF9zB66rB(zh{ZFi*Y1mE{C3ITecm#FDXOA|4&`c|ZeA z3nlEfV4>WdT@s7yx4YfX-&i}~PJZ(*%vr{`IbEP3A|BfUWWz=1Is+Dp(iK)zjwkKX zCa}PEUtgcrr}?}Z-gXBIq$S{ih9sw(ckTLKjeN;+$KE}SI}$RLU0{Aa)<(?fmC1pi zfMIUSOW8)#EHqvrTjg?jraUt}H9i_03iy(2UiHdS#@hAc-hKG`b2WObcMtyNcbPRK zdl#4&KLOKNTNoJ<1q8!xFk%<9rNNH5hNf(|Y?G4&CZ{K-r^;AMr^+xvCeURI_UyAO z(`EmUdv@6$ui1O|*Wb;@OWV7^e0BjGs1RVDg}C%gyco+$05C6IHZmVLMtB4^oOE}M z2+TwO;MJ?bXwyHx!2EMOpH}qaF`}}~#W;EJD&NBLq^c$n3qT}nX2NhuvxCEK^4y*tSxeFQxXLMCE`%CVUcWk85G`V zOFIM}+d{v&5B~l=Y=^BK{7&D-+F;rPd7H=e603ys_1kUo!4v_ShnXW+DNFlILfu&6 zRqtpMEO`5BCzIe_VsZntv_(Ty(t*SP&9(&hnS{K%G{62g`%Hp$Vt?Ll5nin!I)t~d znA{-pfDI0K`&@Qe5m9pt9D-dyA>V5@8Bu(A(PUsM^cgX#iN_Htu~~#M(fPqW3o-Ef zO+|iv?&4hihn-C|g}C^ab~Kh?*y`&>OHb;ng9Cn#=9DFoY_Mh$*g^llwrNup0Xfwe zJWVp%>SN$sT;g5Y+QF1#a~J3SYQHHT#%4aa&zOii-@8C>W5@y*>SSPiz=Cz>N0M1r zX;!Ht5TXmz9rvGBsJqmFx-h|2_Q-+-6h)y`jgGNQ5B`>(M?!{ZhmFPlHH;lM z55t*Hz#08iG(rVRHf%%!DoE&`*m)a_`!M581yeL)bTpMBFgh_hF+P?mrAi~Y!Jt=j z*bsTn;eTd zDY&LzHO36=Y9FW9a~Y$Dh3Y2HUfTdVd3b1y4dBVO<>O0>)ymZ5=&7+&?E~50pb#*l z9X`dPEnwDObnpEUhWEJxjML-5le@ZDj;%AMfs4745k1QkiK&1tZ9{Ag_h8FjW~#ZO zN434W%&um*W)UlRfob33cR5fm5kwWWWUioV!U6)VTE41^UyU^ycAMn|HnSFFy38(O zsJwc-)=*mIt2DoNfno2sR**IJ&|0Q&uv8Fke9g;q7qyz(Ytci~-XFYr_5Ft@yN%ri zv3FhD%@78M$pm$3_r8p_y%swxjg7bb!;{yTO}fB%rv@Q{ygH_{&LP^30+khdL=r~a zj5`p5Wor%6srARM&Mn^aznOaz@JO!eZ1~<=-Cey%-Cf;Xy>Hc3z3;o$R!eH_Ju{kp zG~?MvBX2Wau~}>bu?>#d5@QI2B|=CYZ$F5C&osNIt@53|}C|7#lFFZ9JpW z|D0RZt(IoSHkkkUf5TWFsnk_iSK>c15WHodl=Doy!O7`;W!551TM zqrc-j;HiNlLBA!7oEo%ZXl1GpOxdFp)yU0sXPqLM5 z{KeIi%C3t@CoRs5WG-td%$ZK^plk`|&NUR`MYa|R}nH6Y4uk^nh#ciVj zAt?e4=p8mozae2vD1!lMh>mnpG@|yo5moyQ;B2+*Fq5vB629&Q%!b%P#N z1#(s(3OpTmV0!CVb|x?UCdar~)Y zjEyP3#k5}XZ!wJWTTNm>w^B_Kp&3*%V~|L}#{hw85Wu;0NXKzdw`^z2yjZQ@#JMLu z#YwtpLp_52=kvpgu-DvL}*1xyu4r=mj59gZjTzcurlb6EEf_FGaN1-21 zmwj5u&@h0x!ceeU5I|_CeXRT0O^rX*VJY{F&R?t#5q*b^ci8<&H}~%?u)#+)8UpZUZI(!n?tzpo6rHIwb5m z;V__oE|6s6%3PTjxsTm;+xV@w{t>>mfxj)s8}eHbM#;5X@HGsJ?9khZR#!rGoZ&Vt zW^{@a6sz1rfo`da2i(JsD9N1u0~K=gJ|Nqz+>6RSed4y;=pEsn!r19Ce3N|J*y%C( z|00a`V341<7g>9%?2v7-2-K=z2hAg>MiLt;(P-7|5o|WWZN~d!l}gMO z_L$9{Fhn-v2;n;r#DVH4X}~PwgL*B?=(H4Ld7*$$J;}q@@!|I1mZ4+xAB0$xTYE-h zApb$T_YI?M=s3C&-HfhiUiuo$U<$=TofttY2COwrvtKQ5|n)ULD z?Te!$$pr7f=&DmEZd|_cz|!LJ?Z;=PMz)P^D;E>P$>C7I5$EG31F~bgjgqK(4{c_u z5!Rd6#4qym^(t>A#@yU>OpCD#<9`j+6K;2+9tzcxE?2S^g4zvyz0UOzkTq*-#-0`;Wykd{P&2U7=9=I5R;-S zBhid@R4gu0bV5OR=qPGqwBDXlYXU~xrpa^!l>k8Pe)o7`w&3;^XR`U3g42HCC&c{PzQ4iM-n`rF3m)j@id z`9-c$KFjhVSHWk!*dr}1EiE-I!9XGwC zmF?E8!vzzlW1UX6=iMOy-?$HTcm>v&IFxc*y#g1^d6N~dx03W^!-;B^7m_@m3Ojfq z<$$l>wD~2@CIxIFS0uA)U|^w!}@-&!)YQ%>MCW29*rtF682_B z#JPj8IPHG(a10jbOe!)Ai!%+2GviUelJ_Z#^OdiNMf|Wh15rK-i&L~aB0jn}?UEOc zcPO^@G5jGsw%L9!uG{b3o9wp{l727Ke(%1p`OeoB^PL+&7)93Z!A3lVY>>;+Vg~Zl z3?i5zD@dbRT+nHOoplHyw4G9GY{({ZJjby{Pg=`E6lP|`DjdGNU!R z(ymH_)PZ3Y1A>*pSab5ADP?AOftM`deArb;c*|u^BJ5&=8c$*{IydJ}6?rk|>%-c` z_+Td7XRx|Lu29CrIrL$z)5W#Qp>)8;n*6~~e+FSBu6+z2#x0Zw9S}fPH3_JNVhAQo z@2F4;)Z%*Lmd;%y4CRJavr&)oIM34gTW_uw6U8bO{(u8Hs2?c&3x`_4|G?NTy$?Ht zoUhp0-g3FdX1PF|PmNfDw(SLBAmuucuX{7YyYnf3pO-hs!(t*KM66!BG31E^B3vNh znsTs%F>k_ep+0%-9()Xsy@*d~V_P!#P+!Rrl|lD#hZj{-0{iM5a6>+l5i$-~Wo z9-q9~87m`14c~6m-r)0$?sW8b@p+ysn3cm@v$J4UsLz{8Mus!)4|dIp;`1tjB6WGM zpe}F6mY~E(i#K&#UB|k>9C+96!3XfzMxRH=dAs8Cj9s7ScpiKnws(Bq+Q;w;9-}^Q z?gf0_V%O*GMjL#dkyqdT_wspW^7}hIhv>J4x?WH4C|)n-Jx6uVK!+IkL2RN1wx|NxCt1IBsekJHpR=~~$i<>hjVGno~2zw$9JA^$5qr}=B zL`QB%!{~;l%W3a7Y8af&cs&{oGgvMljZOpFg%D|qz~{l}G>f%5o%X8E8G_>Qlr%r9 z1L721g>Hq5w6|UGnx&@6R`w*~wh14|UX_(@t)S8lMy&)`w^J2mR>-iF5eoG!am)=cIFMAu&}BfNq|rmybSqfeCV~rMRmiyokPg|UK zLjM+&NmGe}QK-+Ll1#IP_Ec+Pyg62{mI|W8**RAUkOrz)-QcSlsD|28t8W`jKGVy)^~0HF3vh{#t7wfB7DguSX?biU>AG z%FopXoQXuzQsrOWQoNGYkU-@bkOYCn2?B1SlX`w%m4 zU^NVJ*o|;L#wU53i9wvz!u0i{zGb~m%RoVy8Ta>(_O}c9TsD)2K01=vQAJf=5)RJr zkJU*RL0qhs<7JniG_epAuoD1Jh1(-)>+t`mt6UdE!Bws&|2%N>6(<&sVdG&SjU2(I zW9{Y3ZwkEoV{e2O9B=$M`Sj5 zrqc4iP#v8TV>Xou12}|7(m-^u)LA2iKVpR=$ffaa%OXy8R!|INU z^>VCQ73*&{RCZrCd-#pvI#(PR3DozEr}TJ-P5umn3wHS@eZ`6Gx!~Avi5ub??cK@I z%XSW#ueI%C=56?WgIDY-?U{;*gI&|tWEy>Wb8diHXA_%7V7CqL$Tx$^2xzb`5FNBRg+_rOEgmVdQtAT}; zszkGPkx`BzF__gD1dW2So$h_L#}+W%Kr)ih=~Pd< z)Z0XB%H?aM&7uP$p4qkMah5!$XizotqMKn50}wg^?JouqW(7bb8lFWUJPQXoi(ZF( z*r#P7Fr$q#fosimJf4}byu)dSkX*-e4dzRIA#MYd27L-Q)`4K^C`@P<tPc~w=N3tGIR&bEkIz1U*5-d$f(TP$ZP@0HJ6Q$rM{RPRvOGUr> z6~?`WKSXXP52HS%<5&@EQMixQXnfHuwBT+WMNlgS7Bn$&rKma^P= z5nQXb_lub8aFU7 z8A4-Aq-B<&N{iA~Man6lyH3JwzYjWE`9#0ya@wqV9r9wYo`ptZ>h9}-0|egbv`2I- zFH~bOT$(x@aEg~L3?H3}#ix!A4IP_`%R7R5N~JwPye+iXnF+bYLZ(x_zi?vkov|$b zZZ3ZFO^F;}VEMJPOr3lOX^|VvqAQ!1nE+X>V`Qvh0~*JAL%>g1y_TMWO@IvmhHEme z^l4$%4H%t72Bc>VdO!`RjDhYj=qXL<+Fp-NH#}G=K~p$U@XUH=b#9#-Km-@CsOmH& zVDE(zs$~wp^t1EHF4X_pf7`Bg`htDdh~JjQkG!-qwXciY;~TSCT-9+FQ`QQA#k=G? zUfOvZkb|@MFuoh*p$7RpvW=CcVmU{$hrkWq9({~)-5_NBcC zgEDJpnMv{;6h~Qf5Un&%r0q7wfZCYRFJPA0gLQ1FNVFgsX+U}grW;&4OPFQEBAu4i zt#sg=2Gsi~nm<#Tc0PwdF?42ptT8fB%N@)gRNF!n`9>wGZGodhr} zpnzefwU_cL5YJ}U&N4OCCJdpi=omWC+(+%gK!WIvgxUfYYysp!S(9oDj9?3lNN+H9 zY=ObhX{V{v9X_~w=fd3hSTP?8bj?8j#mxXkSbk58;o9yjU(;(C$W6a5-VV^i3z>^^ zFAtW0T*TU0yn^4R;xgrCp_7YHx<9Qz=@89HsF{e!MpTCV{}h$E>gBz@7NytDGQ;FM zD2vKyH@XbnjP7kZi+&%&XkrQw%aWawL~qony7B{^rH61IhLyL{v+^iPyFu%3eIfdq zHL%9LtM`RIV*MAFnjwr{{mQFPpFDBN{`UOPKsX4rXA1jfaTcV@>=!ar5G9|7`YMJ^ zK@oq?HGbwi^EH+}4>mr~-3a8ZFK6xJ@j^17;?MD>QH3zKMY#Aj6lLoZ9^^8V;OMf>JtVexV-?swiFcZNL zt{99aLpMR(fd25EQzu5(UwiqbM-J`THQlO|HYbarZTL$_7XJa}@?Ty&->g}m$#=h; znIv;Bn73a2KYyr6q}lsvyob)>O-)lz_FgIE6wgoM6NCvq-pS>A0hLU4u0mR*Lt5SP zddi<*OvOdPR}#E!smWg;;m^LLIeaMz{}&!O@S9-8Kq*m+;*`a+8}JYYV_lS2SPOcs zMyuC=E~!?Jdu%%NR-&!AI@Wy(wRi8@xnuicdw!xhP|Ib4{uGeLm5}*m*$pKX-dbNy zUwk>sNj^(c>g&Goxv}hPtY9yN5#m9w9 zhfiGDS3a-?kFL=z>VF{Pz<($n}d8j+eWdN+M5~5%r?J4>A?+(v?Mzj`|5yItL*K@)kxM^#6n~n$MI%2Ue@)XY<0>xX z;65#E!r#P`FT&Yn`7|hwwD8-pX#gbP)}C8CM|P8k5QB90GQi=AV;9zwa%%OMqLceFoixPrmqPLwaO<_?fF|X2OIJekbEZdL)9x1}&e*2!m!QLl6V`03RgqZ1i>Q zKz(LJMl`*7=7x#87nXM7Q}Tb3Z=HJ*4?)bBMfa22NXOc=n&S&uk5;46;(4Raz-Smu zG~_ra*`UK1dVu@2ZJ-5Ww2=tN+ZA$@Nwt-(^-iG_T~#G*Dh&c+X7zQc1)+!D!v>j$ z0vW+;GI=BEfHahFx>JJ@Us~{*j2Ejlfc~ z$0(G>(%N#D-PuDQi60~70$=AjbHwBglO$6vIBO28Io#(J2sx7<>oXK|`et_SgT?8g5T5Vv;cpC zuobJ>CPwN1B6`*jrT5(okHRfb(mogZF21Ti5pc)CA*;=$3!7pAXCxeUIK2AcMZS+) z7H7Y;-)xYq@YSS$r`e(Y-PLdHH|h~aJJDABI{XN-LpGTq1kLvM5zP$72=rtTS=ND! zKeHR!(`gQBp^fGijss?|-3l*YFV|g=wV;3EkfN%KJO5@PGPvui*gO7iJTkcBRP62e z4Xj393*!t%gOj7gZNx6>dI`0v|Ivh9~5I#*OcM zNB)=5!9hIn-ifPDwf<6>r%`<9HIw4?g-R9)l0||7GjcRTJ+;1cB-M z4)tjUG}43z)CO-i0;)jNkv=?s$l$#~2H$?r!h|(AvnRzG& zq^ZVf2#WQGkzPNtpwkd2iR?GAw2L}uag8$VL;|BkB~i|2!$D~E!$E&uMT|=a#7c;j zF=TxyDVwIP=KU)|#BfUxPn2oiJ7mSd9TmZ!$4O*79EOfW1%e5E49#FuXOs zmpq0-up-TvAr_1QgjIzXrWNd!c2et#4RajF$D^DT65DpMTJBK76$=25OC1|0o|v8G zv(p7%A?`PXxJERb4VbaE^$m@^ED-uU#GRJu%T%l_6 zCPTrLuOFX2-I|?sW?R|JWY+2P+v6B|251Ii_h)I*h*u>0J`8mWe(+kLCqM-K3f`O%k`2IdET|7oTq1|p$ zsZ=dhE#{MncuaY%D5qqyyRXpc2y@v(G>mk0_y9d`(^}^9l$2A^y?Waj$$&QgF20wp=BB)BN&a$j?7GsmkNM@ z_ol0=OVKGqRVI`pur#kFUcFnJ1HhCbNrTf`btulX4h1`;Xsdl^CuL(R%G z)eSvpU}>*RBW<6p{so5YFbH@}K|WahPq2XX4ZlqH%S`82mHl$z-&|@smyaJgeCXiP z-mUGSfl4VOadxQ>%C@N<8Eqim8EsH(qds0$ZwoR&E>x(Z9bRZ$;kiI&tw;S0id{ff z3`*3(I#)=t=bLkLtRor>r+s}EyN!gyTP05+>hh;cPHARP5(np^&1+)8eMjA;geR1* zxniwyFj8-c;Ym-wgNu!2t0MvSh8v>Zeh+VDJdDxA7R&e*wSl=bXZ1Coc_Vx12y@t0zMt9 zCy1b32oW2Rs6J7-S=gjbq{kr2E(r$N3utOYMT6>O!$Qkw2 zTy2)b3-ho?y659r)b5;&y>1EWwKtrJI}@gqqOd_`GZ7naN(7ToqIIBD-9IjQ5@oMD z6}BhFwj~nV#uD(HflAyp6|OWxLZcK6m&d~4u~JC>q(4*l`f6FfH$4yx)KlIsY{<%m zXihGMr|}ATMCGNIn)wbE+{J)l)Q)%P>4J6xK@TE?-yb}GS)_D)e;4@sJxJ-4C43hD zh{RDIlpgaPJt(9UikiCmc}WxeFn57ZDMoRv%<&g)7}Nim0WYhuy;MY7lYtyYP-qgqS!npgt6D zN(LRALhw8TtcI}#Eu{ZPY1*d`_1SEkO=obY1%?r687v$JN#c*+H1nyMcfM)-P4Arf z6#jsGh#2HH{s;K8`Ygi8yp|>=Vn8MoX@-m}Rg6BJohey@Q;Y3)(38q&&W`T7^+f|>)e5Y0<69( zmjMTN9{)%_h2JFK3q-1c0U`~2rt$^wypaF+5Plow$;X-^!iXW50XRm9iD<^Or^;yq z_M(=YZQ9f?TIHmDQII zlzNck7XX75hB>7$Z3glIsQbe(%;gthm;)>K8A8YzlmT6()Jv#XqbrG~duM@u1tD@M z==ai!wG7UH1{~hZj_<4`rDUyE7kGiK)v&LyyCKCV_LtkQ3gvvqhN8`a&zoyV`JLV- zHuRZU&Vl#JkCwb`{CQzyXQ{fU5t$#0l!iUoW-L0I@uXt9ejrOagjgiA{?qhYxgFRY3@Kr7-c0X00%Ww_f@ZqVMBSYSXJw02E zjc!e1UVduecsrACAFslHr?!qp5kX#rh@G5ykqQRT-`8kHH&rlzv8;mbFVrIQQGvrZ z${)nn=J)NBKZ?B%jN*soTH}Fp_y}TX48#)&L6`6pL><j&0FpJZlWx3#kC8{{ z=$DkW}P=_^Gvt_Ai*-)Da@YeB?N35J(Z0X3A!p;j8{&?19l)a+?gw+<_>Z|CY<=KM?f-ZHnhufO zs~;n0R^LmG!XLQ9+H?34BEmd3{WeUA7O;@1rX?bzLfTP2!suOT8Z`8*;CRe7EM=>Ix_40E>k`q6o zYOrbaHu9ge{yfz5cX;fonxpy>CS>T6iFP#0p|+_40;U#4P2E)OoKw2v8ezxJT8G_QH%aMykR)y z(Sw>xfwD8P*~?pt*Z523M6Tqn?x_2P;q7@(rI<8VEtT=vNaN&u5<82>wiYIw5=Bn8j!=(hj{+Pe$%NN?-z0$!{#`yTw4sVByM zNF@1tI3j=Kp@;Dj!e~1}=p9s_+1|9$HoS_|Do2}Y!hCLTwa6o@F*O$ZE|HLyt^@UM zWAC*-&?_EL#o+w2p4T30jJto7E_ARR4xSm_klbc!A# zcwHv?sj&ktV`lzXwSIg)Jz2SY_3UMpF}y!elpN8Kb}ZE%jLcJ?7{(L$ z3i1f8>U%@;{90z;`pTmOgKkN)pn(!)$Kt+bK;<5+{|LN3B@+1=>OR%t zg21tG2&FR*$FNOT0E2l{xen2*mYN(wTLD73!z$?YCT)bAT z(u!VnCE#~SR}MwT^4|E^mUwN^v2`l3Gvm%4tChD_eY?4tdH-NO=!j%JxkEb&8R*fS z9EsU%hJ0&BIG7E@gY|Y!{^#o)_T9cdZ!+jj1v#s()4S6G$A}DgP`ka%k>lTxzS$Um{PA&oul#p-o4kcc^4<8#)kiz` zn4|VI*z{>(eSqF8L>QpflSAP9sS$;C1WH}PU5x^M!&nXft-PH`@*KWTK?WiSVIzLW zhKg(rqq((1A6~D>_R%wTw<4Q`GxiHsWM|H=$W9@I-%P%W92czrZmIR(s_rO4$blSD zTK}yGV0P=jHBkTkX8DtE)JL-g2NxAXE;F8LG#X^8FW|E^&Ai8H!K+uPV}&8^qrL~~ zPc*hC*cgXi)xBLW=1|FzAN3Hcaa*)I~pU!De zpx_48O{a4`!0kPB`U^D#oEp1yE}33f85vudPox)4%1?#|7mKCE!C-i3TcNZ#7}Dgo zo~YKA+quHF6Xp7eEm`bLFOEiIW80GH#Zf6XwoS3RX%Zwhmw z#qVIHZ0Ozsc4r(+j-Z%bRfFO}*DN(%ZWl(P;7YsGkdreRkP|!CJH05OwslK8o=7HA630t@kn>Yn7m!7z$qF3|LvOC4H=^y>S+xWxNN9S3VxVL&nBdib{v*LpG)8!p@P8W7LJyy#}=|K-ZLtW zZi|fUEYkFYgMqQmteqnj5=T*}&$U{JmV_v|`Ml*)Rseq(+bWQZY>8+>VD-Lql(HK- zZ{3r?DVOTBbXUak_A5qC&Zm;|%Om?v2a5hfLxrvNU}ShPcXG$ApRTnR3tN|~_2cdA zL{%u|qK(B=c5zhPx1%8c0-n)}5I%t4hP24lbaZ=fsq~y)f|*)hf1K9WV-!M&7%2m* zM~#MJJfliwzQL7-U>b|~ujJR`r{s6F$s5O3hZK8p7GH<&qH)Y%v(~FlfDshJ0x^V2 z26e-f$R=$9_Wvzyg40?2ofkp(W^`x~ zC{S_Cgw~p$FD*p!@z#0>J#%#+!|xx=%$5V|A#^zqR6=O@`Xofq$@W!KS3(5cNR&rY z+peD*o{o<1dooahNE_<=CS$RQvZ5S;C-8M@j5*M(_Rh`voIo@44UAF=A>?s69eqYLgoiqACr(SRRBUylXiJ9?r(=}_F%IN+ zG!nWL36y72vGIa0JhH12i5$Din;j7*4%zeO{P2`i-ZLi6w4|Y=Gtt^_aHmJ3F>fjE zc1Y!*P>I@yo6S&Jatx(&zI4zUtj?xJw{fgc7!k5FC7*g~3sJ4wBwB77k~{}2vEEY~ zZJ15L;~Dit27pWV)YkiBpkJxSwoc$~MfB7Lk)1suvIf_AaXVM$n03A%^*H!D!Q+E! zgQfDsiEyiBh!+QZsaDY&tjr|6Lq(A}S{UBYSt*8h`3j<=6D>HzJS+%QK!{k#S5XEu zft>CatQm6S0Bh5}JeSA*Rt)uNG$&CiYB9?}&u5{U6wu^CrwXZTZ=S z|G42vBCS69;Sb|)Jg@9VEE5Ttkq@Pt2~f@@3|e-dpP61PszJS#)^S2uE96l>98GPG)8E?n3c$Y{YSx23o}rpo8ZD#M zFt>C9?K0gd=rG)-irOA`JR0!3^Papr5drE$RAE*sv4*pjQf&|H}v=?}83fS%Qlx zm#Uu#QuSbs_fOwBbYKWRUFk6bvt?fU4gOPdW)s3rxr{VZBq<0xdjW(!;+#s?#v{gQ zOW~5O`DJCN|3=QBAWBnZc3`;^7Iuk}-B{2AQpFqw zrlOBgAjNbz&2tICWi>$4#)h_D7rKlUQQ$<@%!o8ur8qR5BN_>MdA$W+_NDyRdMGro zB`5##F=Jn}zNJEbC{;wx8mUFU)WGKG_{v=;?vuaftF#M+cFj-jxaBQhdhPIpGhPja zDluOEK0NaQgqUBEGsuZV;BRO#qsNG4&@yPUdlx_o8y{2$-tCHnU7}k|2yo)H8d;x0 zqAzm-=-hU8y3q5yq+fpf)D%87^_A|^{scQZkNFjRK>jc}BYzEN*PnB==K(RbXYV0r zkPFWK77FrEMF=fISc_KRDODD}`jB>Ls%VcutH-EP(x%e<1=>)~$@3!FJF!qb9G&_M zamYW39jhI?y!E}^bCH1jd2&aiA^+AJI&t|=l(8X)n0FusS>f&&6Qrl@EMeeog{FE8 z)+_@h(o5-)J_ZuTHfYrYLldu;nXpTWcO z|Cav*Z;?T!17VmEa;TGM0w9RW&r#C7mJ)B_ohkR8vvIVN!QOk9_x0QWziGpV)7d6> z(KqUc_y))p2%6(zG7q=D6*QWaMx}5A8|ScUS*5i-1JVv023*KBGm`lV{>Pzdd0TUe zdB;I+b%GpR9U?ndKe7G>chQbG3eH3mZWwkjUEf_Im2cKY9h-@`^~aW_t%b;m5Xz>P{41IpP&EkH|FIvS1Of# zb!#h54`Ra>j7x1uDrN%1u8*--cbjM2d?tTWaLvl>9*C_J>nQw15^X;RV?@TzYWWE7! zykO=VQsE7P=?Q__R&p#{n@!4phxbHBQm$HIbY|KnWWDmwvB8%Y9r6vo_GZI2E|l_o zDlu8~ku%})xKLYi+KyGd#i&dEl`~qz|1Cf7l=5C*K?D`={WKPXzDb}{zKMqf($ma@b->QTSdVpDtXrm4PhQ|TYqdUY zn|COtiQ_mU8%W#1GJ(;yLuyk|pJK#c{MX{=Zr^hIXSaX->Fr;A+m^R|bvwQq?}53Z ze^fICrb>A`hNpJwB8atDL97*@-$AS)@Zzut?M2HNmpSrPc{M4oPS0WWR z`e|}T_TtAOE>K4CPCAO4BP_5dop!ptqu1NJl-#NIErn&i-nEpfpqwRNAP;XwWQBFU z)CHJaFN(;%@?vcq9vIOBm?ORYUm-bNm}NG_ZXGR=iY)Li&_Ch9yeRn3K`vU_e>>?&q8 zk4;9BGe-w|M6%{yy|0KbZNB!zn5vFd*>zcM_{yEdt}s?}(r~zF+>yAfZ0>;jBJk-_1Y_^a;u))=+ z-o=|0d%X){kg)b0@-K`Ac~BU|ffe14F^LOduLc|=ZHRz0NON0HBLVQ4XdCC{+|;8- z*98$3n1JQQI#h+m;-XFmnoW4e^flYkscqNHOix|4C7IfCdTM(5idWruYWnI|-*mdE z$!)!|HF;_=uRU@^n_oON*}8ITPP6=B!_B8oy+*Hp&8gEjL&cRAA#xqvyTIYtz_sWG z1IqEpX0w5C2y}(PBEyIn@A~nNx5!Up!bsrpR@8gC|> zF&EY#4b&!f`r)o9VT>Y=7Ue}wjgM&70*c$J)p9pw{Q2qW*skHmo~nDAi#KwE2i(*K zRjpQWZ2!PN-&38>@h+RP*O@u`4$)==B=$DHK<^0>;xYOP%BwJQtF|d@nZ_2n`PDZe zcc^2-{4F_yEYxzch`o&>0A8hXYQyMo9IbHcj*mJ<%r)npoW_kiAL(L$rg3pgtE<4CoqRn4H_7b zgRG8FYv=d-L;jF0AtVGV?YrJ{Y!U10PlCBJcVOzHmEEHeaddb2r&H>qjHW({e>vUz zG^3qIk>5bRusW>9*ah`@Am&q#2{d%-5TWRRBm}y8F7^x;x&H-k4znFxd!GC$c?hLY zvpGujohZhrXy9Omz&VuC1cY^rQB`;HxF9FjXGAHS0(B?wavhAZE>s0o)Uc}vZ6>&p zUs@Qp4cRIqXF+|?t1;+OkwF}oijC>2#Q6)l3h44 zFkC!1m+21{#7JxJ*ooIRTeq$>Y1FxPmiY*I7gqpgGWf&I;hwy^ir^YZ=VjQqgDt9IvVM{nD@K+P38BW`dGEXT|aY*adz{ym*U9i6bM2hgx zVj;03ymczEEA3uBeC%ouXYd9vkxu2SOD=;UG8dcOZx?b#AX7w!QZ93UerkI-m~EXt z`jmf!@w$@vQY9f6c*E{~^GFdyVqrdL^i4Z!TA-Vc#Z0gcgaEM)XbMUPQ?;e0cY)TP ztL_3C!gu3I{ibLfTB!9#1t0y#(pXSpdeiKo>Rh8LkEU#UOy-(kk_iQ+fS9oJ!{X9 z_meXygl_G_8O?(>h9!jIilh=Hr6va zUB62&``@LJJJ1>5USyzK@8C_&|Z+v^@ahJgjh5afmyc$>kK-8 zs4W+I>6q*78K_QIF?4kD=oO>Gvy0N$Qf2nqz<_JlfHa!%TzRBe+<9POq_mYM*QWA& zwvX;M8;{QBw+@C!E2&hGkJW^k?PKG^^?E$4?i+F!b2qXe4|rbQN+5HmhmI2XRzwhV zM_Pg1t{@gZZ5ttwd3M-s9I_ybWQ!O;#YT}$FH;6{tqx~<1urBvvZdA9Lef@$%#|M0 z$p6^E`k1>5gM)>Bx6Kp{ocnqY@CRD0YiCK0Rx=6B;JWvu*-;3>BM{cRI0xX9b~7W! zm1z_?@hru{`__T-smF*BknhP3CJt^A-h6QF8R8{BL|&9Z%S{u77U#Vlf@T#pdb=ui z(&Yh5v;_>XF!_%D5zRl*tpPv0;IAw#-51LxqSWGm;JMmXgBI_?2Cvs$>s6kVIe_Q) zt@MX387c1?6(Y?8gV((>I(1^~FZ$&_ac9Tk@v*G?&|gnvK`$bkYV0hwqc2HF#gJMbO^?Lc4g zFX%hv7(Uz%1)V%b@n|p+O8C8ez!|V}z?y|vt5fXLS*#-Gf{h;&MczeYdiXEA#h(}L z2AkiWDY=pZ!r8}?g+%Iq{XH+b&BgRT5Q9U^`D~Kl)AzLs;Yy4rhQ})jv2yRvt-gp| z8u%xK0R_Z&5<|C#1hvBcO;#9!J^|l(b`m%6*X1-Zzzo~g4ikYGkX6YaY_tvjg^jj> zg9YWHw!zu44Ghi4tlI{ijJ|bkxP%h|NW2R zcU^zeoBfCYSF78HuNmt+~gVx!!}}17i@CXn+H&ACg-%fI$fHhzFpN4y6guMi-?=)XS_L zYOuws$cpy(6?dFyow#G+&p*E9t*2X8y>-jS{+t+|eDcXB&&j`f>Zzxm!u{uK6v2;gmZb&4)wvd}W}TO^FGoS6!{E#DEN&vLF77XFuMC z>-962@p;A7yL+BT*@xfl)B_Vt zl=BV2TCxmqm%o#FpmVQiY;|UwEAwUiy7m{o(f-Hz$;lQmoRfd`v!4;e-A{l-TI?QifUQCg0qQmXOJ&reMJZQ`EE*8j$bSD(dyB7YGN%2$JJ zQAXn#TD=S&N|nWe44uCxLr1eO-n1P^$ZFdEZCIL|lpmd(#EI{(KKu03ilqWe0lmoW z3S!!+i=|6i;Rj2b_`&B{1oQcA$CEGCblmvj9mkb7eVhPg1h8l|n1o*V1Hy)^sF+T^yD4%qDg*ISkOLzgNi)%zF@ADzJEeS7-ZQZrYK?|Zj@0%~ zL?dH+XHrutLujxlYWkx2nsKr$f0lf2xj33#I9912n@^8O!wZR2dnm$-dGGuD1rZ`Z zm_seGp(xaU`F)$}zvxubcaW6UAR91ml`^=g{wp4vIx;kW+CSmkwyEumDK$719Xv7} z$GZBlxzyy~=0-E%cGC;TV5Ra1;V*RN53++D2fBIw=nBQ=iBI8sK83$BJd7~1tVM{C z+WvS`QhH|d7-TuP*8iD)@ZRxX zSwce8nRVZ3Hd>;Mf>O7?`u=z&-0wyVim#=~Ysn)jy4`A80NHjS9VSMa_*FRRR;1>8 zBk&ACVE$MYB)n{qD{{n8W=n@mDK+Gmo=&BLxTf{XVTh-4+t4wo!5XQ78*CzH3 z%SVVoF2N3c^!>0xpu*yAI?JH(4P90hbL~TIyU2?aw-l64Nh;1UETUOAT3C-!>Zjg~|9^UOzv|^*zjbN4W=l~F%52WSS zFe>o5dxuxwzW&+D*bvw~BuryS56y=oM8lp=?IHMHmEhyUZ5!uyavqz9;}T(-5AWu} zsmhqW6Ckf$BQ*{i1u?8XJET5^5{ukJpTY$QK@Y0!SERuXDcFkD;&fPCRu={PT^sLT zztFw^Ve@@E_k`H*S^NyKqZq`_UJn6rK7ucRXp73Z5RNa@O9uTe9xD8ddcY?)^ebp| z0qq{GYcu)P%nhDOUo=y2MJLMwBmV{)w86q;BD2qz_nvHz9-S1W$s>mGQI}hC^#PZ* z9-Sx!lSN;t1tkQPqwO4w(%LiRv$V5D3SFuIXkk4>`#LQFEL-v9B4FA0Fj!)GXiThM z0_Cah62coyd399NCueWb)Z}6F+|CQE=BT5?ML~TCf?YQ zuPu#<(eZti(vDF{vu9%BU6-^I;~DpnE%8Rig{9h3Ba)muG1NFd9TUg)*PbATABIny z4%W96j$ak5Z-o;Th%J1O?lmv)PoVKS4FEe-&~DgfwOYMaPlV&RIPBt1$5{x2L{`LA z1>Sa+KUQdXvtzOQC$G6}3!b>1j|Xk_>{rbTW8z5Kz548#GZ_E7*%x!?2B>d<^VB0K zg0iTHZf^D!3k2&R*+Du=UJ@Nl2F6+DmgiVimS$D)MQK_hkp(y<2J zvWYP=P`0Mhj`Vt(0}^4CX%6=(AZ|Ks&}%dZrK{;`F)xImOQ=3&NcG^(<{sRc>4N>h zD!t&FKR9$?=)~aR>3DqV$iU#?Rt(D%j8K`3c}l5>VYn|dH2vp{07VY1a)=?XI&|pJ zq1Bty3&#fPN9WS%`6D&Gl}XK10%o_!TLXE~j#H_rlHXsNhCW`*+5%z7BPfeL)U?FC zgdqk@nTr@oMxBfMnlTn@^;l!jYL;ml9D!K37Y>M256@5c76V1KApa)yTx~#vF_4uF zzeV|)K3Ftb9rPXSeDbDi>19hxO>;U)y)Pe+O2D?!DqxS&010Fp6qrY0CaRSKG(vUq zgz=;Y!{H%5(jRr$MXzxn14S5EET>4MCs-I41znLQB)4(?m><(pCY zELkk?-CO>7YwNXF!A@0BlSdGP3~1_;3LLJyEwAJvyMer7xk0D87cHmAmXEZT?t`N| z4ORg!r#QBMI!axt}m3B9IG#-l76}ckOj30DvOR zCrMc9WFWiXw-Ot7z;D`U2q#C5Oi1G7kbBm&sN=ZOs!f!!JKYZwh?ptUfgHa?6cy=PqhpID)kz+w2uruq+ zi4JqPD3;n~?`dNqmXoA%-WhOm29wjD48=#{j(9i`44T|g5AU^G^nLDdPMF=L%rE*A zI=?JxD--JiW^pG+0l@+AIel=5;t>JxOJP!XzrWP9!M5+&=Ag+2u@R7{+n~o`Sbdh< zaN-2DFbI7^wKXQFhhrICuVn$(rB@=j7hq`H)!Y@sl{t3kz|fs7b@RUwZiNt8d-K`? z`ZKB&Mh)&TK9zU$Agl#43oU?OPwV&zaQ_jb!y3ZCo>wk{vmM{}$jy*y3HZ{~O)W$-DTI-N2&(By!0TKS_rU4Rwgo9lv1tb~oJiN^%=J zG1y_(DPblg+~~(nRFkk1^6hd|tx`@Ec1pi{kiQ7PL_k00)!FY$#|lD1Z)xbu4QA4$ zteAE>L%eO<o%0*uC^^Q0heXz-k}ILA>p28(i!0hk#Ki0Lmf*|mn>byiCa7$ zbskR2(pkK16P;=0%7i-vo7E2XKVwvCz_M1*_KHva#x>7|xB`)g#d%pV`pwr+RoUQC zm1y(N=}WlNv%Ba`gx*r;=A>7xL04^Lfoa==GCD-~jhCmKH>_Wf0rS%<+Cp6W!AD3! z51f@X%&{OOSqlQf5o*FiXSC5Ns?Kz$f(v`^ReVhsyA zlG3C1$=;}wW80k3wnJn@d{WmWYiBsLJMOezF&*Q~&^mU`1tG>nrkpj{wL4tZQ-_K} z{^Z#_o!+%sB2jMd+M846tTeh()k%Hc|iW$NEn_X z})MvNf8ri*AzvBi+<6-gutgOro1_j01}Yk zd=F9QN%cy0KZiKbnJu4ew%vE`z4sm}zi`Xe3l8ntnfBIOY2D15hi*3W4vn1KP)r)Kquu-_eZOnfSmaD~pzvR#|*;bYpiJyE|OscR-ObRnfk1qlK~jWZB>v{Q zLxcQ;VWQEwii&W=o2k0GEmTdsSDQlDZ4f8RT(=-jHo5K)+#yx2J2c2o7@iB6=iU!T z_fVbvtzkwWJ5;9tsJjiOhyKQOM+Uj0LfePw_fFMMG|q`so0z&|&@Xa|>y9-kk+-|< zIAlgWd3Mq48;bL1%q&gmliN2XJ#9c*N`F0N^h>!gr?fQX!rak?zT!gP4JmzQ<&>6Y z&Cb8xS5Pv$*q4)+np-rhZ@-j_bEXv(rHr06JEx!^r#L^QPrm2OnlURUzrgjDU6fax zKcgt++&R9&8*>Ws^Kw%9%=8r$6lE1p_usO9Q|9KE&P>VnmH3LU^W~+STU1z@GB#(H zFQrFzPJwT3&JEr<+c#rQK~AyK=_j+FCC5)qKR4PytV2`WP*U92huY*$@D-Qj7Zs*t zq^6~%%{U{av~+sToYJD1`Gut^eXbjjIXCGa&IUuNa;T}<-C;sxhefGOX=ZJ+TV=}XQK$SaRZ8xj~SSWQly{{a?uwl zNJkn5APp(#@4w1GKcwJ7zkC_h-4!voIU^xE?+fpaio~3?Fik zhg9UE2(!@FhITP>FbxGLLJCG>7G@&{1t>s{rAq0^Z*VsYGi)sRD5w`&Hj0qvrbk0O z7jxi4A#Svx<|7X|Hq4opDvdP@#hBiRuK<-Pn2UUrVkT0M4IfHudar{Ic{YY36x!Sv ziyX{?4=Lz@Y#W~sbCH7^8eD5AGcdBO+M9j(R58#A1$e!hof8b zMq85BoE$gbORTE|{oOj5Z&Oi<8!#I_TT;2UK5CiGvaRI?q}p~?Xlr!7+t#$*=GmI9 zd_dc?*6eBaep7j(`RV1V)|x`huoP-dacYOQ9iN}OXdY-w(!0)^K3s2Ge4&kBV|D73 zwq0$hL+XW)QYS4QjZNpghNR)QEdLz}yf%>@^maZj@N>FA{*1;9OS4j}d8NEmbJxjd zO>3a$cqHj6zEA<+eM~y>ou8pzOu5UY|BPv#kE$pG)9fKIER}m?V3{>o|a6mn---;X-l=TxfHW86sO@dx0Yy*=2%Xy zu}-(?QmN#~Q+?0j1D+&P`5p+PY1w?KZNHkzbN%vdoQzMV!9|ugX|4rA9#ba-tw;4GkxCc+rvy<}H(rmL99)MS%j>*+2$tVk zKhMQ*Tw?1?sg-_p^QFYCi?eN+rdqzHT87q{88{6W;arS4s&~}RV!@Y@?zrkgeg_!+ zT0{s!?bjD0a5~!HO+@M!z!8I3#33FDXbYWTk%VNlM+bC7Cv-*^bVWCG#|cQmiRgio z&=bATTjyb*FHXU!=!gDD#c5WrOGgGWF%W|=7(*}=XJ8oq4`<>mWMMc);B1_OkvJFU zVH8H=d|ZGrxDaD;5iZ6h$i_Hait(6$iMR}tFd3I)3a-GFn2M{AV?yu;{1iXKTlfXG z;8xs&JMmjQg~v@O?l57v1rMMSdvG^?iQ7#$)?hat#h+1aB1{`pnMl-_DEuDJ;$QeD zmf<-p$28<(HSR?oK71?`~uBMymZcZ>M=0wxOoMd{M zUf75IrnfoS^f7(SDdtqu&-6E`<}{OL2AFh{VKU7?bGjL12Ad&fs5!$7GyiAKG-sJC zGu(_YXPa}(NOP_^4`o&j z$xJqvn);%<}P!$ zxySt6+-vSL_nQaIgXSUg3-e3!u=$mF#QfU)#{AYiY8IH^na9lU%^%F;=8xu2<_Ytp zdCL6RJZ+va&zk4V^X3KfqFHGEVqP*Yn^(-M__cY>yl&nwi_DwmE%Ubdt9i$~Yu+<| zGw++fn}3*pn#JZ{<^%Jg`N({1{%t-nOU$R{GxNFm!hC7IGE2=ev)rsOE6pk_#9#0V zUd8)(2`}UCxEb%^Hav}g;BEZXtTt=RTC>i4ZOY7gv%zdMo6Kgj#cVa(%yzTG>@>Tu z*OZ$Iv)fdfJ*LW3n;P7O1!k|=XZD*~bHE%l-RL+oL@_%xsoF!Q@ zTt>**a*m9YbLBi4C8Onhxj@Fqg)&wyl8faM$(C_)sf?EiGEpv*Nitb3mnm|ETq#rK zD#?*)k}G-Qlj$-;W=g(XE!Rka%#uPWlG$>t6ibPe${e{)=F0VQgWM=TkRQsAWS;z3 zej+!?&2o$URDLG6%58GH%$GalPPt3&mV4yqa#)34K2tkDh(g&ykF?NKQ`!R&n-dyD5O_4ptUNmz~;f$Q(IkO6K=9I=31z&|{ zJLD8Qpr zmD*G2rCRQ#TJGbWa-ZXr`*=5PbKJCzchWY;p2Ef#=NHZho1@3r@xdvJofCW&G2X2o zbDVSZ!~mVqbA#NIg4{O*+~Jd*6yIo1QIq|(E9yqSGi+S$%(*#E>dww|&ja1_>F#-u zdmikbhq&kA?s+W7X{pr!}F#U%qY&e&SzuENIN$&$Ga0ZJiqWdUva4~&t|;i zVZea6oI1B7M|%DveV!|BWF0SYzB-qYqdk9-`JO9obR92o`E@QMFY^3F7J06?i|TlZ zE2?uDneF+DEcRS+*>$|c71z0p9Pjyyoa4FT#@F!@H>b{}&5-l~PPwKJaLP4(fK#sN z14e|E_-jYHTk07@oLZ7G-0__;;_S$C@`_5Q`3j2WDr2&a$UMJml;1Veb488y*T1Mj zzcVu1dmdTrca8JAO8l-%{jO5a6+Y3{fbhA_X`-zq;dAXNa$;V-uh>_TUlKXj@6yKL zP^xXgajB4TTqVvKan=79iLi~8)&Y6q*2y}N+Z!5NSdMy) zv)BIU!tKrU&y%K? zn^DdkjXJ(0|N7uZZS-0n#HzzjOz1fpdZ~sR<TsSk$k*=9(XFKn?+&MGt9QWFL&(T>j z(;S^8bAZ!j$QAy^v!gtVOr(@H~s-$xL$Z}I0M{p(%o><-Eh*~aMClJ_|qME zkeTji4Vmd~xan@X(p~z}-E^h9=}LFgmF~u$?#7?)#-HxSpW()z=AB(S(p);yTsj80 z=QNj|G?$(M?)3nd9#_g`4sheoaKp=R!^?2P$#CDxaKp)P)0N?dli{W-!%bI)o30Em zTsK`AZn`qubY-~d%5>9{>BgVw#-HiNpXtV*>BgVw#-HiNpXtV*>BgVw#-HiNpXtV* z>BgVw#-HiNKhTYTpd0@{H~xWc`~%(i2fFbObmJfB#y`-Ff1n%xKsWw@Zu|q?_y@Z2 zyE=8It5atVapNE2#y`Tn9x=eq8Zac{?F@h@bVolJ9SBAngsPR1v`@@6zGA)S%rY># zudcOAMs+HKk$&pev<=M;y({$o__EO7g#JEsN!Tf2X<_ri9uJ=oUK;+3@Mpr`3ttsp z8GbM#HDYjlS$tW<*oZ0d_eRW%xj!K$;>n0N;>+4x8apN-rp>g3nD`}a?rQT& z$cH1}h+G`GBC0UvhfzynKZ+V0H6f}nDle)~@5KBtsx)d|)K8=Ci25MvwWtrGmPCCO zwJK^;)Q+gigwvxAMt4sb7Ckur-k@J?%>D7T&MzS*@QZ#WAts@F^!qUq`%z54m@8v` zsPDww9CKI9{mw5TCg$OU80XE{x8rN$%i`|{{>OY4+a~su*kSfJB6dvdnAi!iQ(~vb z&W^n<_BAJ_*tcUpieF-XW$y16v7g2NB6eB)y!fhw?g`!Ff0__uL%lb?*1CQX|4jVC z`1j*K&|HZxi{BEzE56G9YU67YkPxnPCv;CpOGryNJz-eFh=ef-lM}8=xG~|ugnuMd zwC&t>RNL&fGuz(W_VKo5iER=K6Yok~nD|=a+llWd?nu*Y3%7Zztc= zZdJRoq?DwwNw+86lk`PWP13>SsN~C%?@4|z`Mu-~?Ni%NX@5ui$J_tAeMN^69e&s` zy<>WZM>@RJVOz(Tj_Dl-cf7jegPjsOF6{Vb$2A?RI)!&i=#(>6c%&aooOu4BQosk%3ZHbW*Epd`?So`4#(j&-b z*iTX=&Dsh*OW_%ErVMv2f@54epkoD`EIE?rxAv)}Z??7asZCGqc|VhTtmW=O`K4Ov z5Qm{$gJG<~WNtL=SZVIydI{qe3Fiih<`zk0nY80ZN#a&XW|?&6*D{D@b{~og{rVzn z(3Ryd_z5c!jiLM)!_Wqkxzh~cY6)Ytgmb4vbGamPtF+^4N#+*m%r$6_SXLvMyU>L- zn9NEn;!e~e3I}nL$!3+gomCRX8VToaiR5mHW2MA%mn5=Ul3694Sta^C+VQNAS*(y- zxI-3jkKKW}2JNtj+fa)WaS)wNHuss^Z3^F&5Y|W%m&qWmmNWSW8O66GhgFi#r80~A zWHvWT3HQl-*2tZ#lKWVVNVI1qI&cR%ax*&dD|F@8(wmzll`AEaJLPn4Lq8-j63JYO z_AEySZbL_|M<@Okn&K`jM|ZBrWbVNteu7#g;~-K^Hp|WJTxss$tL83llMt?R(_JNz z+#zw?A@O`e5-r^i2c^AS2JuNblfRZxTqxtYTdrc2gq!6S z?veQ{lRNp9+{bmYfHjCf9Cx8BH)AN5VHkHIiz`uL%W5;)Ac5P_mAf#MOOVB-DB(8T z$ZEXDYH7zc2*XfrKo+;6gca`HJqUB(S%oZaKnd4NJMKU@61dyem!VvVEPjm=mPuH|Mt#VvT1Yp{rmP>Yjr5Q9w@es214lgZ{* zb35Oc5H5B3O^w8HizIQOWN@Dh;vW&_55ar8A2*>bLRf`l?#5(pMFDr=TJFLku176; z;vmj4UAWw2bA!u?c1k$6NgQ|EmYA&jy098;@Cd8%6j$L@zJ+zHMlCwyATmuNt4%*H zMhITzKGY&bTRTGW2y3v2HCV?QlgJu$Kv!2)u$gyp9OG zfs;^+3vm!v;}CkAFhn2(XK*>jqPq!$et~Q(+L|zQg25x)4{@Jn+3PBMtVOh~CvmJq z62C$(x77~gR%EftP2C35g*(jc+>KBSb2mD$5*@h_o%kDc<~DTaDv9T-2uFKXqa!z<6DyRTNpDt2 zD$8&JhH?>xaU;fJ0w(h_OyMRx!qr&Budt4*v6o*Pu-1g(N|VUdrX9aBL-@YQ=GW$S zu8!lmlO9t1;ATGCjrb;=G zq;d=55yzc~=T;Gnrg9*wI-3ZW(bT~%{|hNyCunnwafCLbr{B- z$g+H>98*}1M_3_YmUAh`+AbNaMGWFtg?R2mPg^?cZThpUoZXKptkgOy;jEQ*+$kA6 zhzPXj4mWp|C#g*MN_t!VxZ0N0Zd)Fc%n<$)24m3|#th+3{R{_sAq#ym9362kVlW0V zxDYY82r(#VA(c0#;!>t8f|j;t|$j5%*{=U^lBY zCnSYc(w9{-kX15>wP=GloQ!xxBMYZtINBly?aeC)H?JeytVX)dkwy>1qqF)jtC3;p z)pY{O?Ud80E5Z!nkL;5%{_EEv$U>-D4V|mK1QAHEykQErO9(%ZFz&ECAlgdhO_IoM zlElBd{B@^v<~HfV&C<=5gVum|Z45fQ`d-ATWH8gA^T{8vddgVLLq3xDI!<6UQdo`N zT#P>YO)wZ_!r*imjO3R%kL4J}3XEns&bPT%flFA8Y*u3&%W)~IF`gBez-mn7eoW#% zOy+)E&RSbbuHXS&$t@^=K_SacJ{bH42ET>D zqcB(igWtj6_b_;YUt$rz#)n*tkGU92xEP;_P&)7%>BuVS!~@cqHPV&eNH^}16jn$NekmvM8|le!t0ej@`}A%pn34CXg7g!^PDzmYR|z?R~PFqVUB?bq~ZOHj#D)COYgKBPE?j3;bDuXmh;knA!mtq+ABa5rFoJ|+5wJD8er6jV# z>XjW?EuFbVy78b4Vih70!ZQ7O43fA6y;zB1tTA1tvINPt zkFf`xxCEWK30+u)?kqf4encpQ}+Rm)}<>FFryqo8Mkus6>2O2Jx>*L$A6W{ct=8()yUyH(}$?Qf??!-`jfnnT)EG~2NWw{&c21(>j zN#bTn<_=d&S}omJDTBBJZ4kokNaA)|+lTUit!<0A(RATTb31Enz1gha#ERLIy#5EXdb)~PhM{877RzKDzm&^ZEthkx)!T37S4c!W-$YL? zLl$3_aePC@vrI1IJ90S}%ayFLam=)F?2&o=Qf}cgtL@L{0l80igXLmbz!iu_PwtUX ztdt4dFIVw^`CKVivqENbi#*Dmh>-DIDOd7<%;IL5$8x!a+vHZ3 z%L4Az^?a5`>_8Tm%RKIuTUj9sSczD~a~*nev+DOUiq$fXU&#cP%Vn&!vE|zoYpHxD zH*ufb%BB9isde+_fL!k8kCxw^tVN`ZVwH@u`C99i>Q=dl2jmtT#txfcy?d?SFvMHQP>n3Ew;?Gdp~^8O z$JWJn#wpCR?9=lk_b$6~E$V+{oQ5=N4{Y4a@lLoZEs!J|1w=%h&i9zQ`r~cikK~R_;@8`%7sAWK)7O0C`xSdKog)RG=LV;(>h~%Cx8T%JKF?Lko&Fc$NO(TamHZ@-en+1D zFM*3x|FbF9d1Cl(@qyzF)n-_Jykzb70sM&X@C%Ppr!8=)YJ07P?}MIfwSo<;mE!Lg zoOJV9F5|o3FUngNe3zB{x^=^J&=PIN%X=>6>bf+18yuNsDi8S#KjBND8?(m-Q zX}6F54j1b^Pabna>$Ua6gRgNnm+?t{$mg_0;js4d00QO9H*Kny+Ipem39B_-!Fmio zv^L}QT*I~8$@N^swRU`J1^?;thuwUNYq*_T_%{D;?Z@xCt^H$u<>kiV;7T&BkJYRR zj=AOFhx}u}H~$`R|8L{ya`V3lftvo`j>gNnb!FN25nRfbzK?Xb9$M0;{ci*-xm&-k z)i}7Lv9X_kRQJ%BuOmfp33xq2uW$ID<4}&|{a?oaLJn|iV4Su-xQwrINkc8wvv4(! z#%3ZMIk>_03$<^!S>NVrZsz9ZG{>f(dM&^=_%}YQ`YN=q__Z@5BB%vcavyiIlC|7p z^?(12iKbg6SMqN*e5ZfBjcd4!oAi$s_wTuhUvmc+d8r7F(d&UZ)*XGqH(AbQe3@JL z8Mp8w{*3?PJHdRVAzYn)2iNle4>Wv!>^MH5wjOM+Vn3?`<=S#^e{+6WeXQwkK8~gk zs5^%TH}h+*lm9cF7FP?~(j3C~Mc)8IO9 z%pkx4Jg|maxRtePCsE1lNruL?Y7gG*Oeb7!vn^Wt&-&l!`Dz-rl{%xknxnPB`i5Gh z>|Hy@qA^Fn%9r@Ij!Lw&h4OQL!A*fN4c69=B^bOLItKI*SMzTB&*R;^%i-6|3HBKPH*+=D zaub*6J&*HphtuzET8`TCX|gQ2Nyl~qt;@!7+~)@dNl(pd9dQVn0bU>coVPl*W=oyb zAh@G}G(4bOzcYAHSluA}{mz5^_ZLYUUTuuoDA3eAuZGZKy4-dY< zhn=Tf$QSLn;Re3W*Z4f2=QI2>pXIZBhWGOx-opp@G#>=`B>$|l(7BM09dWuKyli(;0^P+~XjuvZYtWJ;C+f#?hp<+4}I}Z>sJGperVt1OMhp z8t!3@yCUKdwb*0Rp_^$l&z>9B`%W7r1po*EH$eu2h}cEk9k&RnC1LhiML~sRicI@O7QR;;o6~PL~r}{oT=0oPN9Z@>@2X=tYxjI`!}XJ94+dm;kyQ> zh43zZ$R}8-S538ciR#RvX6FAStwndu@*{FmtV@ zu2$k$z4!?K$rrd^L$ZCpMl=_V&mUKdd-%Ez)qBf3H>Pbg1&^wR@HFHAEcMj^o09ES zG?JSC9W*b8Sjj3@^FjWT54jew7ME{Jz<;tr!{tuykhf{E}#%VRD?Oe~YU~N?GqugRO^tHBCed*XzTYyuL zj_&pRrPRA_ef0K%v@JkWR-Xnx91V+i@B=>S)`3>BTzF6m0r$IQzt24%#Txp$nqUBK z9q{Xfs%vvcK%e7V&B=mq0}g%v88pua9B?5kgI75zt1auD#E1n{68Ek2~x*XpLHR zxjZ2M`9@>!x)jdmhkTky8g_sfH1fzAtR zGDR%cS%kcY@9;6JyB#P zaaxSmJ8T`eb~;;!S?ivgw9_<%tpkm$G-^!7xLm^@gSNQF-mMS*liPyVku{bJ?uyhs zR!eX3N}OZwXK{aH)HIDiPcqORng$=>>c%>g#iyu3X!ZXW2FemBuD2e^^tT;kbd6|A;7u#sGkEz1F!bgN3eb1Xkpht=*||- zEO2M`knUVu2Rd^haF1mz9sO5$df9gq4cCg<8468WRsPe~*W)3tjtu{K3Yx>Q*ShA$ z430l9`?kTyxzw`{cryRHh2u>XpX4(C{LiD-Ucb-a6I|!5qH0|Pk3N2T2Bc zHqB$}XEu(*>2u!|sC4Ha1ADXn?{PwI;wyH}zq5YTt|jHprpH{l*3%kWqI-B2=I<)B z-t!r5IMNwjEk|qgjE*O49Z(C2ojc;zf$dH2V$L;Q+YZQ`!{fVN2Nbq96g1Phxlyrz zRrOn#Ra?)xaD1RU^9Abw&CU1=$^riv<@Xg%y7?$qdTT&~bK-CaNceB7pV$(rjuu?T zg}Tzn8B=igE&n+1ot4JG#h$gKCH%9w5v%_!oLTgIj8E}*mXa`CmC@WfIKJR<4R5~v z@dLlKE1KLjUdIc3nzg|;f#!7GK)R2_TJ~K9SMpbG`KwfT+aAm7uRE>_9Yc2Rcv7(` z1V&uHi_le=tm0$*)LUVAB&DkP(6m;_Pq{vL)RG(2Keux;R~%7HO{^UchWg|7ztpks19t&EZDi6;1Apgk6 zy>)|n$CGu3LtqZc;cHiG!CAXne;l(l!HxVS7jnJ3cagWE*WJshHE{ej=i`B+(ZN(x z)Lrb32R+9R4a=vwUeWP@r(1hA zOVxM27k2bK-^&3H&2i%IDpapN8vYT`LA*SypCjKsg8K-KA+S52hoJuQR#qL$d?fDU zTBp_PG1yYU-2u(8zTKoHwyFSBPpuz9T{KqJ@E51Ov14o6=H>f_t&0W=Oi!Wa2KV{M;_d_Ny?wM&G zT6b%sA;k^v90^({M;oaFhuMkcc!6(nk+q8t$_@_vlO$wH3S6c<1Jz{#em4 z2U_~RhvxM1V7XKu$Gd;j+VHfn027Y)BU=&ZT? zPlA8fwQM|K$Ira)DB7=aG!NZRjVrww!Yx5V9^0Hg_-!DtkBEokM^!@}+ag)e===di z>)6K{YJd&tY%Merm;dW!M}vlP>}b$1y~jpXQ~3X_pmA_p!~SJ3nwZgKcXIt6K`;m* z2mug=Fc`E!8wjEiix9*k9^q(<6hxpGvd{q|F%=oeLmtMW5QVr1voRYN<3`+wOE3@f zkd0e0ALDQ*?!-jgjeBqz?#1sg8NbK7xCVd2$G8)pUwpfQLMrm{0{3- zi9evqw81MT$|T@JlW2P2Gt<*#W4*c5OfZRNs>wIW=BMU%lVa{LcbZ=2ZgY=0+1zVh zFn!Hm%p2x>^NxAfWSdoHmATZcF>B0tQ!6kNBt#<26%r|tW|~Axw8@n?i8FbUAPL4N ziPG6jm#)&y6v+vaVy=}Q($kbkZ|P^QlT=AHKazCGF!SVe$uU2XT)ERcBX`Sv=1X}< z7MK+<2$Nq!Z24!{qk-T=z|G-MgdrReXoE;ZAsR7=MI7RhfVODsuQiG2h2A(Beb5)D z;8gTOKlDc`PP48w3_u#vk%@sg9fL3!LogIQ(9Zw*G*8xwI3Mq(t+#d#Qo zQ5cQ0FcIhD0*t|h7>kQ=F)l$iPV&E<#;9R zMql@*Dbimb^h28e2c%)3`x}BYFb-!1{YD@QBix^+$oXAr(=^)s0i$uD`?~~Z;S%)1 znKpLscrvowKdeiSeJ~ub$G#ZR;D0J62K|AF=!bLM|48(!^Y4$5_CFG-I2XWaI4|h$ zT=&B$|9=#ET6Y>oyMIlAQjw1H{r?PHQ0JeCG5-HRT-fM;5H7+HTw?1+Hio+YG{CyE z>y?*xSJSFFrW7bmM+2o+Db%+o<8lB~&9g0iZKyW zQHc4Nj}qLBn^9`{uwMTd^Dzh4VJ@!64ff6tFdsj}k1!8E#!qk)ZnJl9!_AnFoACqt z{7wMZ;}+bCTk%u;47cHS>+3Gd$A6A{aUbr-19$)r+T#Ow$o_wUU*cgrgkRz3_WsZD z2p+&Ac*s5n?!~Wh4}OE+x~X^skKj=o#>033x8fe$fdw!Kk>4U3KZddXGzXO)y_$o3 z0I`04sk~5mW+JXe8g4*4T!-u2(62!f1XGc1^U^zqxL3}#J`2S-3_uvt5pH>P0d90d zNX9gDKznpR4%%ZHa*>N^xDt~v2^}yA?J)@*k%!61L<9z+4NkXj{=j{|F0>@ICdAm1 ztc$t!ayGivy$wL@PtT4Ui1epO>qy|2?f(JU80Y@NF%{F0T<6!p|I-vXzfLwy-V>k$ zCcD2jm}Yf>WJ`m0%tiU0&{ekwDGNo=Ra_jx|PKc#U zpKF-fo}54Y?n#*H{wLvD>#k3g#vbr>6*|`Wha%7aABV|}{=*P~aI~>?<8)-W|4ZF+ z()2cjlTJZ0B9UxqIvOaoN}-hiHz!@5FQwD_E0uwq&$Se2`kZvMvBbn6 z2ICQhSoi24)^e+cwXh{9M#)k0&m8}+Bc|BMx?_sfY4mCWfFbs7DNe9=hT;sQU>I^S z1^!e_=)}LyL#seSL$40bvWgdQAow3 zFaP5oQ&5V*c?J11kX4XBBM0Xe6waB2F-3aJF43o#mCVYW zjVnt^(gq-}q$Dlf$}8na8ka$YJ%-z(_8^Rn(ICva9e-NujMaAA<0F%1erTSQOHG;d zmP_RxHyrJ8T!y|9DZS-%$&`4Bl{85eBPYly(oPbjlSIhL(ocp;sC1B%q^I21)3O9_VAfK?u&rh31ewUuXOS;n4vX+M|$=kBLM-q<=+esWdwlg4c1_^`_W>|qz zMj3@NN*RUHa-A^C3J}aJs|8xhhVu1;wqMIgS&{zdTv^5m@b`QEUwPznbkDixp7ZW? z0|)?G1YkkaI@r~*Y{jw*fE@S$0Q?<&O9uai&JBQvwgNmE>KI&>y1o7SOMpD|GXSQ2 z$zWOKuRpk00KlsNU~FRZ_}1o2F5d!>zY9S2+{E!a_+);*3V_!Dz*FnCuHW49(KZi& zt`(rbxPJV&tpK0_JhTA-6zeygxbC+jExQ4{C4hI{v0-X_l6|cDBmgV{fcStQ>$eJ@1nM#>mT4}+D z+(5688(=rcrOO0D&;SOX=?a5ykRgx(kO#?L0Jt#Q;+s$jUjY!6oM8|-U~T}C z=>vXcZuzYzZa)r^z<AQ3VGxw&__Cf@Cvz z$uKmLK4_4xT?4gff)Ks}O?UFo( z%+(OUtAS_E1|Pi_-vE9N2NVx-oB)^9-VW~Ebwuzpk7xdi+zw6&KNLrEU(|p>!jUHP zC2D|>m%%xYABv*|Uwjp6$p1*!+9h03e9*4!6Wr=203b= zLF!Xlr8Kjkg(smhcTIvJ9jElX8=Mk;C|oFwQMl1F{HK=E{|<0|Ukmp^oiz4e&?lYq zpAx-lP?LETKFK_Zn#||$N#;Y;fEGRhf?9~cCt#;|B40osehewfQ}9XV9Qu`b%MB^% z+X;P?*1xyi0xhHuSZo7U!ZGCq%8LuzWto4HVwfeLK_6KPDGC1+{*(^pT3iDj+Gm%6 zzDVJ*b1%p$0yL20RPu@D!-Qv!Ma+12-N3Kdy&<;)MqGSSZCw z@Zu!Y;~U_TWZ_w0#T&qlyPybv1}?lol7%j;2Pc(}cnR3&=lvW!^YeZVb`q8JrJb-) z&J2TxJpp`-4V;990CqtWy9bt%uc3@7f<_6JE5XNH4Pm+_a|e`Cxy@V&A^KeAI`A{U z1cB~{*#o8YIV1sQvIXSi72rt#cw&Gg8OwYo$@Wh{Ngjk!>;nb<7HaWNFo4fN9G`<` zVuvEK35tmeiplX%%#=Vea~u>ii=miwLO0dN^qE8hCGc}UctA-E&`se&?uC%l zIzUhNL!#gzKY|o#11nh!-4q_AACznx6yiQmGna!x!dnM)lWO3|0Jup#ovBN(K8-3SV@94d$n+VNM=O4fpw>J7#U9R3naWEr%QrO-;`&`K(S zBX>b7Sq!Zb?>9j!IUZW64#E#XFY(U(z)LnsAGG4Xz{4n^l_`_f(9?VIV`wEVFp+Pd zg>Yb=*RjKyukhEiN3u4P;vX-@Ehn8fmW9Bhnq+SWI%q;-$7@Q6qq`(ax7=S@I6&{2q;BQD!jV>(5 z7sC&|;~O-9XVnV&GXF%L2aSSwr3u3;}>XY2)b zkG;*l(mr9|Y(Lw6nf-qIL-ya<|6>2t{w2@w2ELfL^Df@Ym-DrJE5DULkw2gRIe!y> z3x6Ab2Y3Or@;r0s@vqshIq9rC zc)$yTuoP~9hhP@|jtpv0zzU3GH}*?sIEWwNzwj%9gqb_TEP0yz@rW}3Tf$bb7qg;0 z-|n`z+DGhb?VIeU+b^}>XMfQCjQs=qC-yIR!s~epU&8a!8ET|6?BGx5f6o8nd(SZF zTse0Jt;^^tnm@y&bOxYj$h@EVAoG{Z-I)(Ej{{_$$vg{?c`@@6K<1^)%bDM29?v|Q zxj1uNW;%0B=Ge@p^b47?^csNl0f6+X^yd`O=w1GuC*OJEod@4};GO&4nW4VS+yDLchi||2_M312`RzZx{mR=< zzy0gCuXy{iH_GzLxv#h{kMh9ok-VSBq`$8&@Pxkmp>wkHa-Rda4*X-j_y7O71%CM- z7daF5z&UU(oCoK_1@I%d2ws2};br(e`~hBpSK&4I6TA*@z?<+E+=~PmWKjlt;m`0q z{1JW(FTsTuq>FTubz~#yA-&`n(ngLY zEo2j3gcsvG_#S?MAL4)Ee@i}1*4d?g^1=_!d%`)7_=i5(I~ia>1{}yi2`b2k0w@GE zP-|5OdN6o%hYF~KC{#fV z;*bCZR6`BaLLJmY12jStB%v8n&;qT{2JO%RozMl{&;z}&2o}Q<=!1Sq@+^gAupCyv z5Ddcztb|pt8b)CajKMgp1&}at30wx(zzuK<{0eS|JK#6)Yq%3;U_b1GyWnoP5AK2c z;kWQ0JPZ%PBk(93fG6M}%)*oS02~KXunvyFhu}oG4Yt81d=pN9WAPAN3^(GZumk^% zU%&>~g&*TT@bCB|{0uh3ZhQ+wcpT1wN!Ws);2?gEe}ic_6(0r$&V>u$di0gehJTD59Hw=@c=%GU*k9UAe@Bv;&1U0I3Ioj=fUN0DO?Fx!B61|xE8Jh zfSgDD z8xo0U{C))}U}8d8YjrwB7#5*LXx#@0En}&$h#`?5TNf5dh@a%e1AQXv9ogr{yq30! zHj!%^a*B*+cwps_Q*c`M4)J1N-;h&G4qJJ#n)a%PhxwW8?D0v_-#6r(`^AgpbiAC- zJkU49ujBXb9p}ZozM(NIFY!O2g~$kwKKIzo4B&F+By6=h>>6Cx9E@*>y5 z@8$Q37@R4Wc|_LRKQz{79UmAT5{8|_yqFvu5;16{N1Jy{sep4H z_R7$axX8<{f?2e^aJ%U48=^PQ zA8p}H`ILf$)IL=n(>CO^3eMqxGb|Q_W(a8$C&ydEVqr+cF`gImTe|7Fcrjl{4T}Zz z*T4`j76_@~u&564qDBGAEh zZ)k=RvdDT;d-w9vV*^e>#PM9;njNRN5YM<+7;p}Y`7Iq{K}*M&NRC9+4#|ct3@b;RBG?ojE)P6=LfB> z;jm~3&44}_7LB19q^&75LuhLb%`mjJgl1UU7KLVHv@H(JaJ03CX5_Rj3C$>IYYWXN zXn7+5f9njhSj9SklQ^v(}%&kou{AQlAwAI|3p&44`^ z7WvQ&($*Q8A+&XcW*FKEp&6F8?$C^kww}-oM_X@bMowE_XhuO>e`rQY+fazFm)Iv9 z;>Seo7~dj@I7VqMCOy&Xb_FwPIH zwNl9{r1r%TjfOy2tPY7_5;a0fWIZD5k*0~tmf+Ohh`{spd#l4@&5=|1NOmoe6;gC2 zFOE^6k?bGZPk4s6?k8TRcsNA`siKA7D@e12_A!xdIhr5GcoBnHy+K;WCIyjc8K3MM z5=qOrRb*Pms31G~o^gTaMb;~{k5^j-QPI*a5|5~8k)ATff8Rp{`V>KATgE67WS((R z_MKHl);mr$k+ccV*koT;RDS!c;jmbng9Fd=qRcx72cf>7eY>|#k$v1}+N|pj&&qsvnxns13 zW)!R^MQL54^BiRUGZA-uA4&bc&@F{96;bsl7utu?m3}&>Ef^LD=p5P^q;qIz zDV;+*%R>7Bpg9;8mxpNTkM>rC_G9+iP-s79uMN|ANJmHLJgK*m&Xanp=sc;nnm)57 z7#2tAGihfHeJ1UU(Pz@mIGxiT42x^&9NL+nb7*Ih&Y_(tXzgwo9k)3e8|$cEX9-E}d{v zwo50R9GZdp`Snhbeo5=?&UWeaQ?p$<{j|^w)@LW2p6${JXJor{!kM8NXqaE`Ea{iD z-kxliPCq-_rPI#|&0s@z!nxTlop4^ZODCKk+OK3u&R9(aMa7iJxcheH)O48Y&>pd5 zU}y&MqT$~HO773r8IY&$0qBSdG6>Kg$@~#^F6duSsz$Is7%D@b0Q}-n4hyGxob;gb7^$&^3^M+=a$<`S!{q40qVyosel zbjtAX@NhDJ72C(wD?(hcT$UfW4>Mq!e4Ve%Od)5#pmT**Ab z{F7C&0^7u%#~zUBWIJTP=Jebt+|T3=`Cj=x`Iic{qDHYqal7&|<-t5h-sZg9^8Tno z)pFIDs%uowsQ#UA%b2fR|TsIZYnrfkS=r;t}MKuaDU-jYEYM`8`V?lJ?d*U zR?UwzuW2`GpV8&%uF<`sJFH)-KSO_~q0q40aFfwuywZ5k#GBTb9yfhxwwf24&o%Ee ze_=6LMl3g2Zm>LE6e#*tv9@@5@tIbewZr;u$!N*xB{!BlWb3tUvfXL>$R4x5ZvWJ= z%5k&f0AImx;P2)Caxk@o`c3%=8Q z5Bk3F*ZTMPf8~G4f4H=)^yJb%1>%8A1D^$V2R{g5Xj|z1FoqY0e;$4%Vvn3wmRI(Z za(DR~6+0@Om2XDRiyo?)ta>dr5IZq;Y3%;khwVk_L{+(M`~lW zzpC@s{krax`tJIl)&IF+W5Xj2hZ=v{_+}GnI7|8oc5aZ$$$ovF^-x)ygm)qQsNUwbaUszPQ zXlT)Oi#}Xjz4(H~`xn2lqBrkz#j&S z2RjCL58gibm!-y~155WT{cxFk*^ibTT<%(a?(!R#f4XA(iWi2$Lq8uj4DTBL>F_rr z$E@sHdHu>iuBu&i`l>&#E?#~9>Q6@3kG`_ziLqP8t>fpfjjVlTLOwA#apuH}ldY3~ zpNdb3>(uLRSg%-r)B4Xg9Jk?#jSU;m-T3@5iemY9fO)EA% zySZxfEz_@TNo~1rYhvq9x9PUsyIsG1di%lS+&g?b&fDqVdCu`o$6s{9&a;tzIxKhCp~&{^~o2XQglk!DJPzC-zi`1UbFk)skNtyr>RftJMFR4EvIih z{i8E_&Uo+4)n~qVmh!B%XFYM&U-oGCOze5~?EJGgpMBXmOU}9eoWti{Kq{A>2Id%O1T-TT4?>I)_=xa&gZ!hs8K`%&~q*IbmiX!@cDejNVsbwB><;yoAN zck$s%MlX3;`uF!s6_=J?y7JNsFMaqja#{Oj+b_H0vR8k?{N(+gd~tcf{nzeaZ~XP&elz)-Cx7$KotiuA z?>zR-dqqwh5Vwmj%~a29pSfk`%YBXe#`j&i@6mmS_FMM1?BBZo;r$=%|LQKwT`hOr za<}^K3-A7)d$!+m(>+h$3-?yvJ9h7H?&I$}?f#bgueg8T{V)Eu{I@^-?UxV49vFS# z*$3+$yzs$$AN=g0AyA3bJzZ0fPIA3ONC?(xdUw?2N?;~yL>IM{J;`@x?deESLEiIFGnpEb{p z&%XU+$&>4z{KJ#!r>svM_tdLT7d^f6>4%>F`!lW2T=UF*&wTOh@UvGw`;X`J&uw|` zn&+NG!Yvq2do4|8VUq>?_M(+5c+ZtIJ-!{59saz-zs)ZGP>h*JxCnzzP6( zg8U8`kV7b0$|54H27vk=AcR>hLxyQ!dRZ2Lm9uhA1`IG-PH7A#v{9`*7B#Mzo}NC8 zFQ&^6pMO3ONaE+{Aumbmxsy&A!!mS5f&h*9ee39BQDZa~H6}+(NAdGF-gx5;Am9NY z*OFPVf&;pe?HaY5L5?MaK{Az(d3p6cg$e?oTwS0dN@Y{e+%`)}N*pB)yUki$WHFnJ z2E9%@_t9vTwjc`fs8Ns$3F#Y)Cg?XRm%g%uASc&e;N5do*+}^%Wg`{a_IP(+QZ`b4 zarsEauJj@AC0@Mix}}dj_Sj=fuUmZZ;K74`yY4z*K*(H7dYLk)fNE%hlal5j%Ge47 zS$)iIvv3>-W<-wd?h*6*hLQrXG8sD!1d(i!BYSLBuxfwI-dw%Gk4j zAldT+bB2@Z#)d?^ED{cBwN`^dX$fM4@fpo_#%L%ca-$IQdVL8yW2S9{iB&a{L@a7F znaoU;*Jq5!(O@#iI1Udhg-F7tkFThAdRvC0Rh?(XqpCo4i<>LpVoR#5uExR2s^;my zs`jR2Tl(#~`i5HK$TJ(&dMb->?$%g**!}C{KoC2#gg86eAL*n;H>ofMHrG3E~=% zpc1WcIxHqPt2EM+3NFrQu#>st3NGoa(aLzNDnjOt8?7{%@v}T{w1MwvF@{nhdc@L> z(Rlxr4bg&%=HAj&r?s*(LJ#S08%=bc6d?{(k*TmMQtT|!tE9ul7gv}o%Ek(Kt3DF8 zx~-;s>1b8`iIRv5WZ=#mA}^B{K@T3Nfgb3Gk>rXciwT4M$a17xi9~@QBd{K1Am?QA z^}sOFky?9H$Z_nNJY?BUwzsa<=QSD-TAFKn>Ut{5yfwZWht1$IdQ?i#qds402SEeshhw$f?u2iV71Ry|bt= zZORSgCf3BgbRaiPj*D?T``=Y3_AKa=4gPc18UN2jJH0U?2(A+2O8gpy=YVL`qsPpOcz z48eTppvnz;jYtoW@FmQ?s61hoo8>-vU$|Yb7tw6ehYBQ>Cr9*H&q2v3GRP z-BrNDxSc3K1-_)4lM#j>AOll?$gT#KZIa-l0+pn8>e6Jk`w;r1;PTeeK# zkB3e?ap=So0ihvtJ=~D3g1AeDfL&QNp<|E$kS#E$j2kE+YUxF?XTi1MqzV8y;Ivv+ zX$qRDJ~PU@Eba+meEmr$t*1L~fOl{Mwg3b6q!sAR%VHRTXov;dijnA6yR!FMJm zq`LsFg42Pa*w4+!h9j^~Pt>sT^wa56tN`Q`GMk-GsinRLfNp!i0}uryr=*Kc!v7+( zhil0!5Qt_DktkUPdhmfQSxocF3=%3NVUD@{e!rWg>djC{a;!voNG=J!tZ0i?HWCu` zwXIGhMq7Qp*3m>_b(?Ri(HC<#V?LwN7jrsdJ|lWkTl&M{{w=B0mi|bje@iOd9k5WwC4Y3Ljvu$Ex0$1l3o7C$qJTFiC>GSBHf0H&Sg>W*U zM?f9LayQMJ6NL4W5yobXFaRipQhRAgrZfkml(`xiNmLXPxv!C#mn?;h+-dX|x*IEm z#LxR_Rw@PoT4@#;WHXf|-x1%_Rl>DyQ986lxGW zwIPQp&noyWlp6TVX8eXEp%SW-F}FY%wy=O8A>AMYmXWdRbHJgy#ub#v*3h#p@wuID zPbsG?4tlbNiKMAbCP`C!1tB)qad8U|fZH5ZZiCRgs-|~`&|>MWO?C7ww%S`dlhNp6 zb6a6~Lx;DbzmC^ABY)!@k$R!5CvJ;X_Id)<)wQYRP37g`P-&0FXHyqPQhs|pWCH@G z%o#*Y>L3papf;H(kcuaOo&gD-#UTsq9+|{-%VbChj54&wVKG3y3i2RNtJP`cN=r}{ zbH*^LjT!|bMzz?L{v9sw85&Bz@WN@=uf_Y*U6a=%gKBzuN9I_euqSL695Ws*!X$az+_Fo7} z$p(-MjZ7k*a2lQRcpPn&%bEmV+h}~zNqnkgsIsxo=&rDNQ^s+W=NBq;MqHWx+^wy_ z23P&k%GgkotF5jnP}SRHuMiAQp7qyvdxxi|9@Cqsmr$NLM5@TMz(W<(C9Cy1!jK|l zWuzMzkg<%666%~Xjqgnzt_21nnJ-9y%z^+3=z&B2?aa{v4h?om&}A*YLP7$i?W?L{t6P00A!I784WtJA{=t?& zUBD7{8MYLaMvJXcpQXr8TfZg!mB|$_8iOvA!5Oqzf=>PK%9m8zowa>sj(CvI({-0c zIx32a$~z)uJvx;$951qkd5xA2mz0DZS{)z4Zj0MeP*CKtn1rH&!Xh^iaAnpJFR7F0 zqA^)lgfdpIBZMK{035P1V5#BD5ZQOB`)Jaj)iGvc&$Vk zQw`rzhH+S;3_O}LuhHI)B;0-l?;jR3lPMdMo-LXOkynkEXHo^>bj<@ z3lQouALBasow`4@c2STKq1nveUY~)zeig=o~?d!E4j4TJ>gCpDnM*6>(U+#RcjjUQ^N7 zVlL~B3ei$Wfy!+6m%MrEsg!;~nQ6vMR>BAz1NS7Yeq?1nWLO90F>AC$mA42LxEPfR zuDeIn^bI8w`3NAFft)f+PNC+hn7s9%0Hs1X0V)-)p=MQQHc}vUX`~?bzqpgEq2!dk z5fD4EcR1-l*tmXTe4wwVtGOu=3k5ua&1%#as9*#~3cl4cEH$|#CuUAMnap#_CI><4 zT2lKfCzi6m;|cS(o{v5rkHx%H&>Ia@_2W(5=d5dB@(iv@q1a_m65DW9_hM(P#TjT+ z=UF2{XTO1mPZ*jdp;Vjf}_DZ+GVyw3m`|7)0n@m2twzRI< z+;P%yv|`1sj@DfxRYq;dU`R~v9b9q2SoH8AP1xdPbl!*%$p=E;;Um|OS&%~>1e1Ox zvJx4xK#(Qtq;MIH-ZWsZLZQf04$>v`V@UfSgKZK?e>9P<^7o1?psqLzxU$gJf7Uj1-}3fL@;G1AM8+8F9L) zuOaCZr`9Q12%Owxl5~h*r1(MUFEtm*sX|>}IQ?s!_S6T=v5JO{593v3}r%-;|& zCD)%txsXEi7BUO@P(-~o>f_G^HW>z~*vk4dCWBrJ`Ji&jl*V9GJFkNDl+Xn&gk7Cd};ghf)>_r2+#(-TCLvi@jK;8YtS*TJ#lR}=7V_5nCL>iT686p`6S<=zzw30KZjcPH9C@^wk-&S0FO8T$p-~G?c-ru*B%=)G)|7!P8%&@}I_YA&$?V~4sTbG>z?dX{ ziX?+dmKp-sO}$hCcq(0?zDGvcKMS{f$k%CgI!b;{Eh8`#33`20OK$#s;~%!}`uO8r zm`U%(v(iXr(~EIm7Os?c?v$w8p0vt<0AhDGoWNx9tJTr%S%P}H9%`dn;lS1*ykgsG z{4AYMX48O~!*!JVh0NFFIr6L&S@0)4--cbKSRb1uU<9|T*piK~%9Mtn?5Ggx(Ka`p z(7Su2qH5*t?%v(Q7133@)35M#ORM68wRXO4FdAQ4>yR}}o!Q!P=44&dx-(ij&YY;j z4V9yv!EpDg^62W0V7PO2PBtwkvrq_Ds!!;9F@(V>VA(ktMSai)(hFcM(yE~l3jIz_ zX`-B*bN>XRB%36?EA(NYyua4zs9sWj;C_p*M5E(NP5a5Lzj-hi9&Gmg8%GT8a+|$e z&@X_E8OkWn+pR{1kz5xUBV(CUbFNEk4~=!g7-g+C=q<9t^2SBbTv%rBfX{SC0b~A*`NrfyM)8L|x z1{bX)iURI_^_3ISAB?5nC$op2BsEeL4}m5J%@QuWNkOYoaWcX&)IcK0NHQxMztZZo zdYy(wgD`4NL>aw4iUPw37}e{s_m~w!8&5pu&6CrA9@}&FSo+T=y>$$E{9pe{A54Eu zS`XJ^WBM^Nd-y?=QE1WBR4)g) zRx9ZUGYwj4qsGBsG&J~`{Ncm54AY&_$Zc0n_hm)xd~B1ZdZjo&3U~$XKPlZi7q|t4 zNam05()_c5ssriSlJokVXH)$ji)tec4ZrXYlab+XKBH@tVj0m$^yi!5CR>vwGKmK1 z&{+&2h&vXBw`VwL)$5}ai>0%xo>+C|)mVmCrZ-}B`YC!#UFKT6Q;IixrPcng(Qdk! zIp#Fh;f@I@;$23T!%O6KV89~XT|ha3<_dObXr@4Vc+@N}+gQ_1UY|Arfs)K2Qb-Ko zgE)*OR~wNq21HVTa*QA=_aMjG5jd_JSUD$Wxl;i_&Z1n3>C*gWM~@OY4%WzMD!UVU zOZ^Cy<^FhS+{N2UEG8-H=R;qf(hxMyYbKL9n;w$;;?YWz(P%ImsT}tDd>luG?*d=z zci!eQD__@N;pw!c8Uy`7*VN`syKEY>iWgW$Sa0)p7>p%N_PU$#c84Ct9(DxwOU=U1H?y{zzU;`5N+i`uWP* zaL+`%dTm!=)K=ak2+bAtRM}p$r$mb1@|i=#L<}HM`=P{olyB1^#eygrJDFae-*cpI zv(WyfNwBP@n}jr}`q$Lf2#^{l0EcV-Tee)2llpb{?00=v*HSPNK&D>e{dNVoNf3o??+cG|Nr zr*#H^*wLe)W;3i|zHh8m}vJ9Os{6F!GzrubeAYbt-E^}YoMA&or{^gVE5WYVxlJ)>Kc#b z8|6ZEsYzwD>#TJ>m~dA6OeSBolh#H6;2GotFhfl;u0n?7Bhrv6!${^pdykBUswEe; zsYi|+*T7MKzzk-s-XmzW3T1In61cG{DkHM)7-uw61u)j$KC*~!EU~Cd^}f<`&cWN3 z8OOJ3)dR}>+Jt3UdW96#b&@DCfE#Myv}9p0;3{BcT#<#aK)QRx;=ZAzOQIyIFFJa% z6hhM&Z9TxU5>qrYy;kaG!>ikp}fAF zR~4f&?1eq*Qpzi) zr|s(-Dw@1%^mMlAoMCJFY4Updsd&9myC^8hTmTRy4JB1-(UPaEvZV^Usb?;r@jZc9 z>dHw`>FMcdqB{IJ89(tvAekR!n&BSuI%vTNlgT`m*4`i>#W1a>ps{CGvPl}LsB5A} zgEf@$nrSw=2vD+PCXSj$dWVxnoen`~)EN!>e3gO&Eo$YG4x2+!5-_(w8SEQtXXJn&x&V*?#i@ z0G(D(tv;tuE~$z{RIbP0+`3|V`k%X=ef3`h*OS-N6`4P$U!p6wWWK;M@;a!gt*1Z) z8labKGYOq!42a~<3sO2rPvu%P7vS{9TBhw*m90QyNfp;Lk=GADWOFKH%T)!9HFLXW z)=Hc-kW`kKvwB0jD^Z!)yTEPaI{Y^sbY|P z`cC+dK0U3mSs1X!aN|U~*V{4C&@j*&s#)PT-rb;BWq}ogbHk_z=#?;6k5&Mia&|N zj2dp-`uIr7<7!;CLZ~S<6$R@B zW5jRg@_1h)uf9C}Gjrw*Y`UW3$ip&OwLs0kCTbqe>ER;)BF!02nyHoH_u9)H2foPzRdRz*r`iDAkIn-vI z{is%-b@sV=j!aZmnsGyN!Z^Lox}q|#K!$gaL^OSXsCLGisni8?<`BM23=o1uvZ@#v zVr2=<8UQl$ioYW(gK1nqB6NF+#iZaMgrRKkYF@lnri8-pgdD^)9aH6~4g zqM%qPbM~wN1WV=%oFex^5v}7a(i4ux|7qZZCN0ToRw8-eI2g-T1PC-JZFFU0#@V1T zbq#3|uu;%Tr6CENGIj@wBZ8r=ZF>85;xL;7dDgt5!jdqL9n0>xV_Eu*k|K>vs-HSU zVnhX2*p}5=sv;F3sFNx?tkN%b?$=z^pMeTisx1kDG1rzA5mkBs ze{=YAs%u4JkG*x%O>aF$pQHf#Kk=wQO`lYl$B}R2 zFY}K905zx$Is?_jdb2q}Lq3AfCzlI)=9JTw%F~W}wOx{K9nIxqc9m8F%T8?GLvqVf<{RVH0&&egqx_@le0AiozX?(Yi3G7jUy1(>PqN-!-k7$^>!ammF>2dKjSp)yYHebVTvKew)8@-{ zvOVO2ceL)pLbvwg;Q}qP7J*%yuQw{c)T^X;Pk-iAxRa6p=XyZu!S#=x$(;Yq2^8ZM znRnsK+!>1V2_xnCScXOBR4Exxq%%n2>-jTieHJMJrH^Gp6?PIea-30X;ArhvtSU~c zUSbtz$#h)4R%IyG$j?fsH5xU!U|6O9QfbuZFJ=Wx`WtP*@W|I6B#ndED;2^Ah;>5(+EytuEs>t|IxWxBq>uRG!)p&-9;h4 z&t$M_xTXR})LR_(`wRw)TGseixj*348ntSjhOpj%ix&JD=>MrpV0q>nI7pt()r!o& zG(p3+-&Svak5x`H7zv{gJ2*W(jnAda@kROq1rR9BoJSnwY;Zw1>;EB?`b(@PofZ|@ zprMRbtBvO>t~#hA+sRO}ae>Qf)Rs`Pk;RUv`j>mXK5Zi-Wm%0!K+;kv+UTyXhT!+Z*+XvN=txtZDA{D_F`3cg?#&V(o*koI7#|uqS9Fk zd1utAoyL=Fi4f1>fQ&Dz1%#^1zwp1wv(N|w$t4B(1W3S1I9Vb{6kHtT3bq?$EXT^Y zQyFS)(=wrj8AgRds#cJ%0lBA#@7U6+>8MdKnJBAB z=I^|Lo~?|N>W95PA<<{>IpUqAwHt&w%VKXJp06`1@3|f^P-*b!yv>5%W3d+1+04OE z$Wq*FE3S_rZo-rNi$m^YxwX2Y)fOCH>aVe+b%9h1soKC42C{!y{3YBt6Y_wcn zC`x)htt&=>@p>IXTsbS z=+J2S_OeA9tJfH;s|yC}@ME=BtL`XkFKehTZx6Jpbvkuxpu?Q7HAFhf-m{e2wapb3 zO-Vqo&Ap3bp(imRf|@1NK~f;dk*cb79MZZVnuyLrrLvv|0UFp|i`i(Pv20p8sZr6_ zZ|KW6RL##7MEitTR+r&hi*^WCUA66sE1Wx*JaY2E*^}|?u0~teRabR6>btO+2Gc2L z3}j9PQIcJ9YHdihNXU>WT7m?)EXQyN-&c-A`HgX*<5%=A5C~^}iSLnT zp&6D!XR@sbt4m#ub%iCoB|mF?|Y?Dd8GKA)Uc zyi#(^)-2D5D`*WnrCv$y&B>x~ljSDqbr#N(dkKKjuGhzL_<+tBXzF!&n`5N~9em1d z@Y;2{5|?&#bD=_8;;iW|4J0dsf@PX|!Qd&;)CN60^V( zQNYR-4vopCQ*bf`B?;&t>v1W0MUs4#k{tHYYIuZYR1o88>D4d5@56-@O`m)3t7Fx& zRb>72^z<|^5YBwb6whUC7r`27)ummX@fa)TsJ9P{3>jJ_#mOlGc@fGZ-YQ=eZ!fW$jas!z2_E$1 zsTRJ5^gWq~?@vVhqB!W(nf!5QmAACCByKNm@9h~h8?;4M28-I%MWKQMtxxYQ^Wbu= zz0^_^v}-jcPpQEWi}Z9JUxZz($zbH2jXHInCaB~roetSBNN@RZZtMp+kxqsye$Bo>X$TrlLXo79Th-ZNeJV{z@2zwZ$ zZ|5zemN!k#5$P?7`MLDw4Fj;7DUv(o>#ljh+X;2om>-@jw=Dt*U-J%ZK~kc5pA zwU1UHr;x(c9N}byCXJ|#wH{bdDp=)IJ}Q8dDYz+BmgZFw&F4upUsFwKzNw))S(8k} zV^z`0fPW#~)51Q=djE;;=Uyd{()of>NMx0ZV8k2y&zr2So;Uh0kQ1EIV3tgYc&y4tQ#zq|X&@F0l*U`~^Ye5HwJbkh zrdDXl3I15jABtDE78Yvq^EobGQ&`B+@|7m=;}ygW45*4MEF`xg#oR zY3y-MT&h`h?yaS{S8ns@E4MMHQ9rLfqyLAwHvy0As?J5%-e;^yQq85BRD)_zl}b}- zDouSft0nc|p$D~FJy`B;H#VX@;Kasm0^JM=4+60rW=Jkv2oQp~1agxb2!&H zEge##12WhVrpU6l=#8~>^e6p&nLux$XVRIMBZZ07(PN>mUQcQGJLGlQi9({q;_`*P z;Y7mOrv|*OSf1D6mR$qw)7Yvgc@=rFP=G%8wC0WyQHl^j>>^Y^Toy%yto8V5En3;6 zM3I4GFYurT#=_QNHMH`KZI7oevZoMjyVrN^`oKk4MLrETfkZ6S?sm4dSXJmFeG1zG ztANuAjHTjg8pSZ&0r;asC+#W0-H{I!rjF11{ZohAf(d8WsI%L9x<5J5-QHK|8;$fG zBCpD4`Yb-Tqa)nWF&U0Jye&%DKNyKQJ92?!K~=`Hk$i+@Cabw>KeKE*Av{&>s-&tj zBgJ1>DqW=~eVaJ;N4C4^6171T9_Dcphex3V!fuBk5=K}JdZcj zd5q*t%c~)+gHibk=q75TG7&JG+B$b>X)_bNi&g7BJ%Y_sE z&6vw?jb$jcrh10M`2owl)K&?Wutan++~>{3J^A+X_ZaT_8G4-6oCG0?6=}Gx=uHce zB_dE+xS}cu)M6E%WHlObIRgxnmtc2@!Qo=u%W83)NoS8Rf-aX+mQzV*G5OT1iF@JP z`1#?rsl-`-*HCnEl@!Lu$rm5Fap%?)$(H|`WJyw68_SGm{gf=w(`U+mz)peh!&}JX zd*7@Ph&_4N_wlwzz_&dMKY##);B{;+-L35G1`@)Giefo z>GgJoT8)3n$!KvVm7Xm|qs7^DYNir23SBP7WE1cMIK*w3RMVPizUF0$@oxmXoQ7qy_w>Wh589`duykP{>|5a&@(adwRdm*-xU=1 zjCuAhYFjT%U;Iz+FMq9q?Iy1WfO|XJpl4Bc^B*NfYw_@?$xy(6Okc|o>iNx zD1m&jrl~*D8)dwl*=LE^=~uvoyNHhXG=V+QgzpAXjI+R8#WsET?66p)F+@0uckD>e(2K%|m*8K@x8 z6D;0j#lo*6xg0=lA~!K!Lf5aS(4E)McDu#TC(Q&I-Fd#J7~+1%EM{AxeFsyR&bxmRNt%-&^myWP3fM*>CRNSX^yiF`0+SQ{KC91d=gvx`#oMAp{6jU)N_V8S{HMk`Gc9slP*E~KUd%>x zvxzV0VOdjx`3n|eVZLCzQgoF>cwER>r#qe#dD5nK+!O^buLt$q_Ax;F8w}jbV%vH0 zhvX+FJR9Z$aMQu7$@L0~jU_k81)d&mgl9um1Y}m=xoo4rjM2PI2}2lHCTk4jqdwYG@+dAY;h@Z~l-QbeMOy4MHqJ$CQ-i4*1)(D?cD;X{XTtt9AqGEJWc z8G>xzX_X~W5V^zetT_Dqixc`cy-fdfZ69)QR9oTLHLD&*xB?c%P9?BNS8R>oY<8Qf zraR*u;h@jsY_;X=Iiq8ax(Q{W_7>_**5_F2I{R^dA`)(Mx~;;LwY{su7mq|-E}u;} zWD9oJjDW-8bhJ3zh?>qsTiRM$T&+}2XFCwFMDHfAq0d7Hl-P*$;L#|a!gw$`$5#+W zah}Q)MD+7Q?X2k*S%ePKftg#p=p$PW&;0CYuXnc=UTM-QQMZ;i>UQdaMQx6cwL&DD zY87Mz`?Doej~Q%jwb@j))zylD@)lc5)q3paLAFsnWLh_(Z5Tl{Subs2(Nv>FeC7Bc zfw67gB9N>^QIU;E1sPQNO2cLa{Hhua`xAkL*WFrKO*V6r1feEiVjw(+2GezIjPz%+ z{r%ZY|7oY+?{o$NH4Pp~Vss^wS@bwtecm>w2lvV>U4s9?D!%;C&*nLeb>>)Tas>oJ zgi|`GMcDK{+clbLKlEt?(kYj3Bc1J_rwBzM;`f4vh6I-pZKqP< zk_Fd}h-bEO!NiP*w5||Inv_=C+S*)g2Ju*%)e_EQ4Zrb!LrEn`oC0}2`EL1Lq`Ukj za$h<1FONJ*zWfP#YvXepf4TAOvm`}gWtQoTZ_m5YyZL8$W-@jHv-b>@3<^Hrl|k&LhGb+3DnlW7;YuU=yqYk$_wR z1yqZoUIJN`))_gTomec4U1?HWRaH!-t8Ufp!o!#`JDG?H9XkI3))SdW<+Eo`oV{#n zQv!F$t!bl4K*0k5pBA2GZOUk!imX>@0KH*`cLPWw!^I#G9V@IY`jz9?ep~llgr_UB z3qNJEt6+tUM0m-^jxSR%3M^E=EHhF(eyv0IMsVtYZvQ&~39#?7BIcJdSvC1OJyu+4 z8+QthU;E>#gP~6cdd>i(Ri6bLBF;rZRY?(af(Hc8aUhjG<~G%4HIKE$7yD9-EexrL zfdw8^ZJ|0Yo28MljN|0cP#rq^&2MJ-Y%+c)8L5S6f9cM@W*BY03O*t{iFH1>zw1a- z3sFE473m77vXzQN6|Znalny?%SyRbaG}P{Ox3yTiY+ab$#^bOGMirWR6*^4y$z6O4 zGlW%$HSsf$aq_41PlTs=gbV%Qe2x+Z-y}#=WzY+oO`X#>$ zDRXeU!$CH(=a^!zZ##K%sdV)bGu*TxQkU(FSN4YM8YBJ`df?E5c3i(}Hfp-6 zt~Mp81{qBPna-ZQO!WI_Pn`Yby=Rym zQ!o6Fy(gGJ2`-R#kS{#_bvjGAVkKhzG-pn|Tb^_ZE_I z2tg?8&LXUu=vgmJ?I_6#sg=(^f`qe#0br!TbcXOkP5N82{lmqxPaG~BO$HvD=^sLD zefQBsd-+PRowy1^2&pHZ4Yrs6**6eIoISmD_uy+65LoYZCodLXvxHcCucx#8&YqJ= z^2YYU(t2OdiDdaDHb-IkES^COSuH#b?TDJwdL!ZLZi&UdSg8!aP#z3t9ST;F*0@tP zMq1;s-vDhrakaG26mcyKG2AF`5AK2ytYR|lfmoEx3#T!wgQO{v81TE=Y*sNMMXLK> zW9;{vmP%J2+JXOOyWF2N1%X$_2Y0s^BI#@Qww+Bo1NI% zF5N9$Y}zzIA1S^<<8VluFt1Pa#wS*gK36^uvOF*AYctFMWNO?JZ?-lYHuQUEPn>+B1L`#L@4 zA0rxK`zO>+zW{@{uDS_9J`jo=p6v2z?4AJPd7YVSu$c0uk2C1FbP`BC8iP=# zDi55#nJ7Q#oXod-I{U*OcdqCR#hu|yyX|VMbgZXqu^4G>Pq^ofbgy0>J5O4py|GAd z%z00L)*ts;yz#uRY@=#!sTlF+CsM)wY*=>QyEJ@!C`3TeG2G8H4EGq^uU#E0Q9*46 z{N|0J57t$^A5rY&S;b zKJDI7@^c-OvC_|VP%xl-fI+!;sdV)qgVM@k!R9fUgiYie$ zs?ibjM{hrVWMye#Mw=WTIXQZ=(Xcsx)+N?FkbQuWe8VnY>p_OM*)34i?eQ=5oofoN zYcJc!i0k9rYHJZJ7Ioc9YWFV(A8I=v>hbXrHrV4+<5QCpBV!|DjV-k8XB}!Ia&Ulw z9XWgA?12W5g~BW2#rL!sI0`S<9^c1!*}x*$EEW4~Ay%t;zHZa69kjVww9n<^eNTCz^uV2N*zWef;|%qq)2zRL)nv@T=4Vhv0TthX=GxKcPa{*Crqr zij6E0$ud7)91vwm!U}GSL@ZZYhz%s!CS9@;N;#5vamArhEJ0Ru^Sk4YX^p@g>vycL zomySiZlAurG}6yJ+dsVK>ZM!RmyC$HRhXgwIedt&mQg$$wP6GFH!7ULWbj-JWo zuB8W)&cX31+O_C$Q$-=|Bf*K4ws49b5keeK9Hf<@wptxATVD}rR=T^=z4_&h5!FNo z5$W&rOcbNJko~quu+8o0Z&j_uoG0Gi^7X`6m*1Z&B^WFBEaNAc!rVYlp^_UI&~pP* z`^XI}9wawV`|zH*fkizxkk6*{+(2zrnW2YJM;FM+HEMGM|FfDJ$c>(zPB!IH@!xmY z-ykh;o7j8!{9t2lmEk3&vyu`JboP+v8GA@CGI#g(P$DxD5rn)LBqFjrg-IVXlL!)E zECFK@DRkF!iPTbAV9c!{mk0~H?VC>|gYMmaI7P^ZH+`nQ3D60>u&gcO-7^uVqJUkK zK@eF%GV&fETpcJ*Id)P(>RGayN=ag>H`SZ(iiG^$R)^Rrb-FMNyfZ4-uy-X4H=f1m_&8kXvAUn|0ja!VXP06Sk7Ugaj zxog0=k-ToE; zu`o-uB6|$8Q$%U+_(DZdtcumgK;ODE?{*fQK5k>tO~ZJ8lYg_Y{eA47ZXGs^5h#LO zRo}v;e29_tOiH`ubPTTy+wVAg;_Rn3_4#_M-UCQ(|ADY8&uEky?vmXiaq*8JgnN+TDS zy3#YJi(?l}*x8A5PZqmwFMl+U8;vCxp~GlAK9&p6cjPiBPMypwyyR$CYG$q2 ze|kDy%ne`eA1e$E4Te*F&K6E3}<|S?5IA|IbY3h@wX=*OBWt{1{aI*?+#8D z^3lqfhwa{xbHY3_sG0CL90mXu5HpVY?gUoSHU$ zzd5J+*6YXC$vxX|99KrujemD`q1Iv+@k9o-l4z17<-CO`$_~@PoYNAgLOe*$slG$a zFY$Yu*H?B~Gy5>RsU}NEKfTBF{TVY(^V$qcH&st-J?FGo%{eXo%sHp}F~KAH)qBpc zel!~sYy7)&fNREb2fc7-a8j1(&fSjo&GWX5Nu8;!~c4Bd>( zP~7`h>+9=3CQp*LKlD)f-48zasne$`w&Z~zq@WKob*)&mnCt3HilWp`C>4>bT+d5! z)*(G#wM19LA%H?YlnSRH2*Ip7t6Kbdzd1KmtYob+$_S?*(FTs9R2yLNUBsUftf z&^g8oLL1XFoYh8uWKHuDh=gl-Z7@gRN0t#2V9Q`wLV{6@KR4pGxrSSEGkzQTcP#H^ z^i_ZkxXJs9SSN_IQi1vi5wNSqZzTOUIufm&IY*pK2#N2=1sUO8OamhZsKX{PHIOO& z89b0GkF04PNel+O$lznMsA7lI;X-vjersvoSu(R!y88PKn0)v)-mJUkd6gjnzry?K z(k~=2uARiYYx<=`+u1LFPCZtYNGRa>aMW%VD-^RVm)<)encK_x* z7xY=?HaX-S%{H|9byVVB`}&)E}azu0Ij^nJ4FP*9z{2sv^C zs3qqkM67Zcv6T80V`O5r{sxhe7nzLEM{dMqgtv-@Y(`&SDqU^BXe9I_`V-lD^K_iv zVr;!7ZP-CXAwnb(l}UwVz?`$eVX?@w`$*NLbJJzANvE3;=nw<2Sz(&v5>>Kdz!2y- zL4no2`IZMBaLd52>GBaWa%r`vD^T7R-u}Z-_rS4x`a89O zNGbb1XCmZ`3}|?+aNeiCWFr@bIc>T+ZgknAsDdPMv7ZJ5*xv5-wujrpp`bV54R~-k zt<8p0FI;Olq|;|loNY9uNTONA2He!Ey(hGiQCW?F6sGFdKpY0kylV@*E#_)!8)byw zH99d-lC3F~&MhodvMs2)G7Mwzkale!v1~o|kJXgwI;bjFc;-aZs6`9sB`Xj7^RR#O zfIspG{A}sVq4+_9{c|K+37PKAOHC&c`Cp582*ZLl%V$OHdf>E=;;&-R;4A%r%*;nY>cABUp<=7CM zlEce-ie4aY#=)vHsNi*-+z^q!4o(>Y06>osXl=2oqJUhgNcP9L3hEm2j=DELS^Kuy z9NiMUO#8*Xt)_*jU=>uWkpj8bMl2R{cCI%2!LxG<^V5gM$3~V$ml|c}>SOl%rZcba z?*XzN$7+Y>AXc?nJBk#P?K!3e}7{()mfE)W&Gn*?&{v1cEAw^X=$j{#6XD?8GqkrImcrHEGj$f%wdDyp& z;rS5Wo?}e*y)cFP)p0_F7$LNsC}fz3iiOBxPT~wQ29>=8(oJJWK@2M2M)1Togj@Uj z#zy<5`lq~}&QvyUu>|#Ar2S35RzBM8`Ik7(qrZC zR~hZGmqPiYI}@r{e(Wns5{%{kR!JhThEp`vqz#amlnY6fR8X>pj8?}w zDy_zNfiBOciPQEC4!176d9 z!DxTuF@G0t|9{}v)Oz$??wGK+`IPB zZzDrR@BTF0(i?lqxRI@g9s&Xb^a?!9tb3oz9_ZN(Y|twYJ!G1#BxEo~QBiV0AvOjp zVKm=t+o}(+<9Fvv2B8Hu>X z6KJ{(r9EsL!m8h7rea@J-33OEs%!0$%!w1@_a3|V3;S9hPaQfGK7W4eyL+vVMu=6T z;qb7>IGfzOiD!8e==1E`vG>MaCiB&$FRRAAuiwsi@Aa>)^uFfE=U2oK*JL{tQbiE}CXF{E2!MED;EfFP`fK89Y`+Q(c(@v_uk zg?j1#zX&K)l6fh89#Sv{ALdb-mhODgAu85Hn1aHTWK6%XRFq`05)ovSPiI;xQ!8M# z>d7Cwg(?c1S8eb%!31c>9NdMEE)>>eO?bo`f>h2 zym?mfCO$tZOX4lwn>>Kp%+;%#Gc)^DocZ0kv9Y;wn$vYR6P>BxDsM6*sisYWY#|Df zl}kHeq)aXad8sC0)our{x7u4<92GDrMk~x24m&_7=<~F-+9QrgWt=g? zY98nM+ogHTf2H>NSQ-Cs)!q%ORVb)EGzoWUr}dez8%?$8Q*v3)e$|!`>DjLWn~m|Y z;laM%?#aSr{fyMEg61<)7a!RF?7Y3Uzx$i1%Qb^hMH(Zv`scbL(A6@}&gqTHgna6u zhw5gbch~i>qloM0xgLrKSPxe>_BY65=phm~zCFh@hJA?FB7~5`3ZnodaC3L~H~{#- zhwyQq7vbY6=wW^$b7J%*rQeHtxv0kNO3^uK73)QkpNfUoSg?(K30+8GFdQU~q+dnK zyFEC{x?g8T%KwmibL4RoDxG`SFZ^!?%xW~LTx~~E+$`z=Y=UhP66g^Sq_fc8M5K&SH5k;LFK}P0y z&W(WeiF4KZ#Cf9YQKy|Kj$}j#Y9dWFHvvPJ`XBf$o5c5!r#294hjx{zMo&9V2Uv6< z4;s8l^XmN>=$U!B2}Kv3=j49=5v|R?5HkV zZr`75xlnhC?kQvbT|879J1(SvOAxiu{{K8EUihnMDNrY6T$##eUg^dTW#)kEaEOvrq{t4`kz@1*U3 zhBZ|?&Igt8qlapS-fV3-^fBwK4HOGe3G$L~J2MMbpd*cN%z0SNWHPx-&ZV0elK-Uk z-hr^t`zhFnsw(Ti3b3lS!@TD6mYufKZ+^bkZkl{% zO^c5)yBV7to17TmX*0FV0sFNX^r;SNC-#j4n}(am;X1eT^xgD1kf8u)wKczws#1o? zib4cgSVnoE!=Qp9tI8#vpc0kG*`Cc<1BCMyA_(&<2y&T5G511uKG&5^B}45VmldhE zWF!#r<)xA2P|>Tn_cj%>>W`gIerAuO>MxI+K7E7~c0H(=Vsakdw*CKNm5SEEyTf@l zFX3Sn#TN56ii$7q=WU$B_p|S>THCikW@p`RX>NANsg_s=vR(2a;*x=VNI)(Exr~D` zwE`9kr<7h?u@hAl&fC~Xfub-pH{+NdtosPogs{&sea$8xThror_5tiX{div-7GIty zMQ?Iwq{`B;Px~X6u=j}rZdCMJI2~KggC2mo2l{5=N#=nLYenWsh^$sz1k@~`M531! zjKWPARq$2cvxcQfaweT|raT&VepB~&9(kbrwrkhOWr3qOZ{HdtrSc!sTjjqZUHEoG zJaDOe>+Y(OqKhz$g46E3kh6bdjg?KH+`?DzP6 zUT}k(k$~fWEvQJtB1e2+cqA!4LHe+ z^{Q9l`f1ZuU^{Sb{9FZACZa+FRTOY5V3`F57&Pg@;(y*`o5d0_6g;^mY$cRsRC=4V zVFv~_AANMEKI~ZxPW^!{5lgqf3_waOcbUZd3Q8VhVcZpvMGK`M(<_Y13jM`NtaAqF zhy(*j?q^lSq?Bav2aLcX{GoXX?eS~ME+w*z?rLh9AV}x2 z@Jk1E{6||kv#IXZN(6*7<8q|iD5n<@ZnA2UoR$G}*@2>318`w4#>56-swhKtBCfO> z_a49Y9534urkEPV_CElS7N%xVtKB=n0W5oI_r|?5n_nPV)@WVd!U+J|Y_7eSYe3R_ z;f6wx^OA~uo^|>zoM*SI#jYx%SMsts##%tu);izz__fhmr;1HxosUY9ISjtb=8(O+ z@>Z@9`Vya%JSHJ>aUSr`b zI(dZSP5lGM3fGMKhmm5XpkfRtM7QUdwsH%&kdvkQy;WU4tcPQzdXuo)+KObIF0a#z zQfqZ@LT~OB{R7AHo4NGZ=}lh1ft_Iy2Ko)uGiK2-_%xe8<=_@p^d7(Vq7A;%SdR1f z_7CYZ^cD!-5;O6sFADXH{bTEbA#Pj^FFgZ zO@52niozIpUZYv&v=N55r+%>M_N%w28M4d?0a(+VNZl_|!4USwm;(xXqfRqBxOGWyJjj`(w;Koo z(ExSm_yZ{B-AbS;D%Zn=3mWe)6O=B zRm5_x8fO@Ft|wMh)ajmFK^vW>tBL}EY?!SrcAG`_X8!YE(*LLYB-t$ADnCpXANaCfr;8fr7;jwC=AA7TRTQMU)&K)s zvHED43c`*SwY4HCCiiu*MY`WUVv<7t9yaKg4LNk)7_%rkSN={?8`zM&lB=x~qRXxx zP-)$^4P0rRX9OnMo@YUA4g*Jt>2c)Y!aA~ZIM|Z{f+;Pc#p!aPcq~f@JB!Y^mpq24 z-p8+zCm65Q{q)w>J2!xG4R>~4yP=@v@SE*~5(l1&dfAq)6wjEomW0(*(&=K0FEdh9 z>NMSv4*Wlxb=?Kq9~n1e`az;Hrb3_vD>VM#i+Fw z6Zeu7vy~rTBTwiy!aB%$m}e^WGWd|OvXzKJ8<9l)j%D22_{tSU=>ka7lJQ~ykIP|G z6>bzt)hLAej^o>}n|sb$A$+8+?*I({DH!v}*pbFJ{gIt(n*_Rs$^Iry#*3j@XQB6 zCL$3;?&AR=^qgL$A)`K?MYgC4mx03p#N#9G#iRcCHS)xt-NiaUZsQ8Bv)ex==jij$ z3U0*5s)UFZf|8jiUue98ITVa`Ziymiw7bpiNhRBu1+*|D)WvbIa9j0fE?clFyn zRaw^b(3#Qb$<31;FO7z55l35KCRjQ|N~y_Fa$EVwrHP~8s-G!jYZbtOh-oZZv54#v ziYwy=cBb)nU_S-x1d(_3XA+gl8=W88HG z2*HbZ$iha52<{g4q7eQh89%M@2mHLx=suyJSOKD=G6fqA{2kD`8}gcF!Ar8!#T2-a zzPaXxY~23H(WTPWmu&X-1p0Du%jP}N2j_byk}Z6_G{Elad(ubPp45hH)^-IC|Jt(* z+lj=!rh@|jiIf{|N zlq+qxjk-m`-f73LXWzxL@zeCZ^cDo*xYibsP#TX*ISFFL>E=Yzctfp#t)_+5kmd#v z1X0+i{vB4=elL}BIeDS8VMXSI%J9(8r>~tPuYVxiHd<6j{7An1iR?^Y5Tn$bcN(KP$U8l%4FSjm#X>Mf$8KXR zk4(>_b3ad6#H7kQU5S`rg;Owyxu?HLvTxa&*LP}R;e}7`&FX7l=urg~TRx_Z zQ~=czm>$+)7mUXM+rD(5w$}s1-$t@e?}-n;xv;SHpn(cE{%wd3H`uUU}x}szt3*WxHMIIHSYk-w%oV_(*Z>&}i|@hxcAiPT%HD-{uRK z_g+yHQuHL5*W*#To|1%nJl-!JcDtw{AEP((tlkQAyKW+ymUA$1MiFJ_NT3f~yDo7g zmKu$O@rwE_rGB=*qc`CLd#+91#;tu2j3CC~r{Vy84lC6$*5D_SC=f+va$YE|j!H!$ zuS%I)LHQ!A?8QNvgw;eGpgR{IObkK{Vwldzrkt#t!W$n#l(11*5~cnjL-|Hxyb3za zuO~{yfpXH>J2snIdHi&L@yz3gQ?sQWC;3wOoup9yi}LRb-d>8v#%>=NyrUHD7`tO* z<7Q+a_4q0)l7}E~!LOjEV{yrq`52~btz%fa-Xrk`C~(~{HEJp}^OE7L2B^P|HBtw+nIJ0k4?rp(?=x@&7f zeSTDIjZ(kIqr{^E2Ytv)on2=2^NjUbm$^5H4@vjf-Amc7rMpXuo3X@;mr55Fx&&HY z7ed{oxW79UR_=A%-p$9?{qpf-4_b?O{ddZPv|cyyoMY{@dVpxypX_q z3`TR>h#(mNJf77;ffyZ9p@@`a`b04i3;0B@=ye7YE)}8G2*-2A_47h;Co@Se15Z+8SS!`zxQwdM$ULs zeW6fari4Fsbn~as8j9=u!3Gjzv?$Q;i>|iJv3v~ z1N;2s)Kcl{tTkPnj4jT3yJxzGPff&;ZsN8#PZk~h)2m%GOQC_Ko}pudq3ry*k)_9a zgphBu{7bfWU&~-mFy8LAIbuDteZxol{r$Zc9I=qQrx5B4`Rpwn-Q&5z+eX4Y383KL z{t@|ewx;{gI&n=$i70fal!^*LrFtW{W4Palt;JLtBM(c&!a=)L?34Pcf(_MM&S2Wq zB?YN!@hoJ0mr3hV>FU)(PZYX)&-V3~w7LF;ZcoR^a(?`Bw)gPuxspAUj}09e2t2@o zK;f?RLL!+?#-lDrAeM_}r}Dne#LQSS-R5g^sE%N=H@boMum1cKYMbe28` z$BC$g@fCQBV!=I0_T$YJde$C;{aflVjL4m8IcYWZpRjBh(9^s?)0B z)b!wos6wvq`%@?;*jw`{czn;7Y2Edo0Mx{|r_l%L>e||x<~+K(v@km}(ASm8xH}Wb zno>(9oNlsfFyyP*QfrBY|Fudi+`am`Qj>k8SZBPQQ+M{YH=r55Q|Rk%vag)2x8&mC zfuNA75Dx`5h-j#`#?&N@ae#L8b)cy7^^zSXLR&rdPQD ziZZPj(_6sLP`Q43n|}yrx2NVq)!A+KDJ@_B0RRP*%H*0p$LH2DKYM7hvnS>5OdwWb z=e!z)c;bQ)ZExhy7t;lFP>;j8J$V)xxLPxFmXrk*k{cftWZ6in;ngO zpG5?71qi(VeOC7>$b6lt?r}iAn}?#`QE#35JtOsfwq}Dhbrt;(vC%PU-e)~nWKsd6 z=r!XgA=`Yuf0H{aZ{62EYk*PqyU(_4&(hQM79`<+X)S(zYfTarFqUgQep>6QZmlZW z#G)rgBY?oB$AHOj32SY1!OUEiV0-}XcrY<_3x#>U3hI}4R9jX+>~mRzF02Ltd& zS|A>x3Qahus-y`~aXT9zmWp_79#n;ZdJPn0m0=Rjd_0A9>;@~mvRnX*W!i$f8IDmm zene5p^?iK?+2iUS2e5$U9^eTvYP<0-m=?@U;C3{yHiRIS!@vh4{;c4~K_ z*H=fayL)nee)GWxX@}pRv-+K-M5EK=4yiOs7Ek>4Z=WdtO}M>HI;DD~>H$Ha6@ad> z`l1%b8*OkZh?oH-M7Kfi>^q&#T4z7$WOMrs-OGRG+Yfw)F6)4^^8em?C*9aUPcg9l zWAYy6`$o8DFNhI8RT%dThPLX)iiIywrGAO5vf=V3T?oFyYqx;mh90_eq{!i=($y*N zaxU1D^q9tlIknT)_LguVW*!GT8^ZwfGOPOQ($W$kC<9ICB`g(VFb1ZvH7Q`f@xM0K z2qqHB`du7K4#nx^Z-4&t4}AXf-=WKN<7=bk-zBS~U)#WMZ{PkgxlDf#;&}gyhp3g1 zWtC71Ay&$A1Sr9as~lyl4k6$jE^rWIM(6LPuI zbJlmmDnh*DADF!hE#R)%SEC7-)Y;mh#1+M>5~aFoBThaFp#kuNpRR_21cr)zJ^3!w zD-D)HrK+SI;w~CX+BGluZ6I{_$S$?DO$G4ivrWo^YnV{S;X^uWWQ7D319tcm=Rd75 z5p;o7bx@gD(3yv86U2(MBAqv%3swb8giKnhdF-dw7#oT@GmjASy&6qI8Md3oaeQUV=eV zDVA)pD>Af`c4UHWY$r%a(7+T^1Gt;*baGAFs#dg z@wvd%mmxrjYZqzLqmf`fl&`K^Y-8j3*pUtT#T_z+byeNX=jl5&Ssyb$aRJ`G&lyWr zco{gyLCvh`43i-(XUtl|r}@n353gw*xDxZZbZ4w1T!<8EXAgI@-DaYN9P@4v9 zKCADn8K8li4{zz7($ip0f)UipYH642Kw9k-A=pT z!Tbzgo-`47YOGmFI_kxo+ICF6uu`wt^ul+Wt63WSz0b4$6yZ1ZIqy$WS;`swz5Pk5 z>OblHy&0pki0)!kT2r+ozBYrzx5psyZTbn$lY-Q=RdSNH|bzFB&6e z$D2~K5!;2-_rKQ<+o?tjzi+A^xGk+I+pnQj%2j6LxZie!n9eK~{E52IEZcK00LzRL zh{qz~>iWiNh{o$1Md2}H+F)H<^wePU1^rQ;wye%;2s$7MujBLD7LV-U8aIAb$2A_r zimj>I#a!8f^@5(WC9tqPLq9}s zK_|{kfC!WT){pBjwN<<2cp+V))g~z7Jz2&#`-?f-WFLZKy zjt)^9B;kfJJ2py5#6^M9#uQzztcT0-qmIoD{LV)9vy)6-y{jMv8tVqbNoHNKtUR zizF!sNm6vX$rC&bd*6#roxb|$i~jay<*!`0`Kk-$uRQkE7wPDUlmGg!<&wTa0@BQj$&?mM4 zP_8W8iug;E@)dU%7q(e%?iUW(NP&@*76YI%0j{RfVdyxa>lgX zl(?KXp&`-sC~r<9uI-b0tFX=-N8*i4W4Vp_Q6j^FEK5YN$f|%fbe9xL8PthkoE#2| z1;EkfXlre;*ewW&V6w|rlk76qRU>^^WoUl??1{5A<8qd@{NmC1 z@@tP`7mPkyz=16Bh-d&-de7)V@#cVdY@Ngq!zH}5&uX=tsv=Q=rjcIlR z+drkx(&r!n1&nfd+^m`znW{yCdM%v7d2U4^Sha#@!#u2ZCh;G9=UY}>zi%gz*w zXC7b7FPD;Hc~wYH9F@i{{?dF)NbNgbin(HiP(C}`7aZGo<X;KN6SqKK8&Yc_Xhpi?NO>*wLZE?x-k`yh24mT&6@>N)d4}#QnYc=hPj~ zY4N(Rsyvb+A~}rTx3{ODLq}7nN0HDYU$k%s#oZXifdE>by zun#x>B1{uU`+8l@@lx+>-)vW=Gl>h>+2iVA_TPfXuuh9yv41mb(OxvOLb8Fyl&|lf zc2-YB8N0IeKn%2qIQ*gTkMtI}AONprDUgr52nDhn`nU@<2kO+wBgx15S6!o515fRS#O07%+~$ zxE8d$RlY`^sE3EgIqDB<+NNolsbF{^1aDwyUZ3q}bVIF{iUY2F$98#O= zV1>%=-eua;dE}+>#}o`L`Ft)H0bj_6uCCwZb$P3BXHI=u-SHXvoskgnUfxlM5#PG~ z8hOIl-f48}TZljqVvjz$^=_lDv)j|;8+u<;@LJ6kB{J? z=rd^^PTk55vrePC%|C%X4Pif%aRg!1_L7&@H|S-m4u?oa>-t;1U`8c2>iDB3m?F1f z@!iaZ!*Ge4t1aNBK+uv|lwbcz02bwE_AH5%!Ab$>x-9Tg&yW_-f6cLMW-HaKxZs(A zhISe#F%UILp|j3Ne~$yS>g|;Lg$b#}tX259K7$?b%UWy5M&aT6?wMU{H1^(;RI~#@)2}OA~=B^(Mb3JhKjU5904g<>n3l@#=F~S+Fo4Kq0|F9KBFCXg}BiC~Gu)TkmcJ zlw(!*GxSgBa}b3AR5F$rQ3p@~BU0CakXIUVxpTs5HWleXg!)cm)D}GmRgV-Pm-+{e z&b{PVe(+ikuq4}=Pv44t<-#IvZ$5=Eren)Zm&asY9sfEb!pfYp!W7^^? z?-@UI`4zKskKa8d1u;BDzKLb@h2^t-#r4H}VQF1wc^#u3*6x&sRg&~(9d|KLh-Oof ztQT**2Wa(3|G?tdI;y&FOiperrlX_B`g5IQe-y}-;;ha*SBj&yqR!#kvwUs{6&4YE z)OUJuz|ziSaegJO^@dPqQLiiKmE@9(-U18wAX$5-#S0Eu=b=ADP6_L(glr1Js?{2c zMnYDf)r)?!(}IUw#b0RbFVnA?Z+=@3G;$)1t8ZiHkyX8mZ>h9(RXbe04P!tYeJ4g1 z#4g}0@oqF3qj|>v{@I%UP4ne(>uRIsS8ma_MlZbL@NGBNi{zfsbF=9(WaiId9>nl{ zEs%i;avOI-eb|YfLdq{v=md&n3{fH&{%-ZJO3hz2f8}H5Kaj(QZ<}D6mbjVly4yo5 zc8en56;`#00tX~=m%0lSRBWPL1+(@OwEhF=%MR}G0T%Q?qI*O@s+Fw9)Q*qotZ3|& z7&E~(;u{-&0s5|yuB^>EIFOy_nn=VVs9Wf^W^5U>L5C$^vcZG+tn{tssXc(RYRvb6 zoYX3ZrT{stzr{G2$4zCS6KQ)6M&pYB4qi#JA6mpGmr7Uf+=CU7#n?W(D=A`?KU07# zOu`$u8b)tV+9}FPB)lhe?}Z&?yt`5N?tFSp3+B2caj4ienVXDv1OrSNBP(Sq${1C+ z*nUY1k1v(3zU`o#g(rQRTk!)k78>e%zYbmqKqp3;{0>X@7x^TH2Gisf zZlAM-v^~PL)0{2Nj^NN$`-6|X)amy-oq>RmQ)7Nl#Ikkl*=Ol9)`%yRR4#8_M;$ft zg2&nF^R_uXAVGNhN3=zFLRVE>fZO3$wAYLhi`q;lPgw@lqTVn>PrwdV!CukIyV6Q* zHs+pi;u5Zr*1}<44qm>nwAhs;aCCL?_NCjg4tA{6NHVXDC1ea#T|>n*WZPxfu3@uk z8p4c}CK=KL$miX=RJ!^n^-0r%i0J(n-{!aL)2RT$_BR29-(YcdH~3&hTSBatmq(qs zYz~MPLA+!o7EmOM!dQ3p5VR!8>nJ!kDX)4w9-oJ?+T(vNEX2YRG{wLk#=Y^Oq>>~~ zfle=#uKs|0xBM>BUH%feubldqM;;|#{sis~e~Ng*jc1=FDH1Dx9oY=Fe692HZ|Bz zTTml~oL3!OGUwE(`8i2Eb@9~2^}CKAojW;ya&jEO&z*^AIN)n_h_lkHtF3`3&hYRE z${NW^X1G{^`{7cl!2P&fYl|>~CV?3{_B_H(DuBP|F)Q#Ebev*ixAn)TgH)8{L!(`{ z<&#(LJG35*-#syT&q9XK@(Cea7>oJxoniHyqi1rtYw5wHb8vi$b}f3`*rWE5;KWK> zI7N>LA?~*YDTk>T;(J!BBWCL>c0?BDy1UZ7`Q?of)vF{&yL>ip)D?>KcX}p@(Ok%W zTO`=#cJ#NZ)?&^RZ*Tc}1sqtxAwLBnNW%aO!(nY2J;U4;Rlqaky|a8F*}_e+V7#?xTtJ@|9paaTSKp*(RS2wwM3eHxNb-{BujCtMu00 zgRfm!eC5Wt*PXmre9aR2;9gH>`JFu{ljM!%k?zD*PAm@A+U z!clEyfPlP12Oay3vKB^P7gtmUKKm^3;MqW5vFW?H>BDPM8=U z9cgrg@G7aF8( z-Xu%iM5#BKPS+X3BmU&1E0zzocgI|l0){E8HgO~uF(iCDvNa06{md@XOu_dia-`Bz zSZ9I!iWC|P_|`S!9d+-0f6cq<^?QFwd!m_NA}`yBMHN(waJ}AwT8OGz&x6%!HlzP9 zMSSb}d;qgLT{}Dnv91esBZ;Wr5uMG#jb18S&1NWYDs~ln3-OLnyW6Q|Em?OPRy!Dt+lSB#3F>XW zbN^B=yhFdSFR2%ub#Fv?3Y-vu+qGl3S|lLSb)Xmvq;LfkP%WslAj^6p5X-ua`UZ^c zxgxGem__SR9j>a2jawY4GcUJ!Mh@2+&|jP8<)Ya@wx}^ZRRta=48SB@(AN8UsUnl* zO2d)WK~^mCCA{jh3bLscP*wf@4~oJGY?s8II|I z=q!_a>*LZpxp?Y&vOhMSU3;=4#_rKA>-3&1LC+HpC02xF<7B8W+7q22T(h;hf?hFUjcD3CZ>_l&)y>g%n%}GW` zTDQ_SH>Vk42losA(wt@l1n2{U-$nr+)}XSsi_m7HHKe=-0V*#EEIQq8cN-&U)b|HO zN9x3WNOkjBy>;KHAsb;0`d|&$h`|Pg{z4M^;7;wfD3Miu{IY$s>Nlt$OR9Vc6=Ha{ z#HJu)x5W0)zMgcaE9pvNRhQSamp1Ylb|Va$tu>kQzcn4-+J*7%=EKZ%Rv3$r6JogX zgI+3$yo)jrxn@yRxl@7ljX+1ZJ-`H%Tdb-mfRi|}PObiYsGESlsO`qf&GS%WiWh)wP!=^D@_AZY)VL*Hx7Q*im?0^EP|>0jYw6D$JM2y{ zi|#%j+Yf>TTbP8`^F)wKZ)V(0MIlHiSGunLQr3T|*V6~NtHGhii29@#6wGEX(bbR^ z2U)Zi?uf8 z+c|r+OJcj}Bvx@}PAI^C<}+x^N2n}y8W^N}gsS>a`kZAe{WN*v*waHR7$z1k7?`4v z)?0bhKqKw=NF55P0|zLZMg&W!-S2Z1+=c2OHQGdW!yl1s?NHs-XrgPD;nuO;<~z8Z zXUs6j@3X2Mo*;spAd(O#qGZUFp?66DX|-5U9SepscBXkl(ExxGP&jOyCf>wNe*luE z0Mc%K;6Nl4oS5qe2cw{1JWYAVmx3G=w`<4ZM3xdZD#}(yyNfC0DlNV&8@>e6QDC9$ zlF@I}3agU-?9fffREtG+W2E>p_S>=_J_^>|=k`ZNfwz_IJY8daZ!LIVsOc7NPgPlO z6G<9Uq#*8)S&#xWjL)aQidl+ie!!64bgg^eCFq1AG))_KFHfzCxS8TKU}u^Z?l6AJHQ9>`~i} zH9|&h`_g}`wmm(yfmspq9wC$;iTd)L5#_w2cXBy5xv`i@FWfWUF`R9uasL0BfdBFaQK41jrG<16Xhh z7H|HeGRz?#@fgV(iclT^`ckH6pt4&tR={JS4qXO9f-6W?4(9+M1go+vtFr21x_-#n zNs4YkpfBBeHxbUh{=fafi4!O216%JT-zZ0b07}7qnLY=3IktOWBTMNHLB(V`xR^w!7&hwLugf_fC)PBpJCk&|6K#qT%A;I^agbNeah`p1CTBJ;7f$#$V=lifmLb&E**g^O z9#HS4w(^%>KQ=-Z%D<2#=LFgr>htE}o_u@xdz_Jio}pIoBVMtUh@_2xNS75^5OkbT zSf>{yY(fFR5B?P6;82xd9%;ill}nB2g7Yu#KT31=MnkqJ(_9!iL_SbHMLuxxV)>sd zf(v8}&FuL0EPWqSl)`%b4PL7mM=yupPmtwy9a%9L;SE{Gc*!(b4QWwEt_|d3qi2QH zHO(iANZ{}Hifv-6f^6vm6C{&{ir!R1JOW8lS~mfpr_L%B5QIg3EurUSEBcdIxJuSh>m-=E{v$3Mc^&I~nZjulB!$S5e6i89 z*v{5KAP@?Kd?*;whU{qZnle=*=YYY{0G z$Z~}mpQ~Q!5;y?pQK*W{m#cyW2}4D%N#o+^#=q+F7O{sODu2mTKU~!jMQxRPKjCg+ zFXEB{5d<*7I%m{GTnOiU)ulT_THO41#s;f|T>Atz9*oX~Sy?@L4ooYKNmoegI7QP~m)*{gp`vuL?lJ623)e_=7oB+L zZ_n4!&Eo8kdre`7^4B-WZ<~V+TZ7C>4c5ycD8Y-hmLUQ{h)@U;LXnRR0Rl1Hv~h2p z!%|ps9tfFd2$pI~Bc_(tKZ>n&4G#~OhD)O(#r}9lz}LwPeBUIetTR72(50vRR~xkB zKv$j@KF7wxV2SL8K6t6t8YBV@iL|QafddjZ2zM8&DjtlEoV)96?xKtj2S-N1&WETQc}Hhc-N3j|0AEXx<~La1M;fd!WGu?xHOgvGW- z-|xKl&S)f8;9q`U_?fXsqdWJ$<(%_A=Q+QV9#WW!EFR@e7GdJJN z1y|2VlCm8~eB_QNeGaPT>U$>6YL(XLg{jq2pRcvfz8Yz`ZA4=(`y1Hh&`F5Lg_%w? zagENLT8$K;T=5+Bp82^;4^hwDeDgOibA)QBF}#ro#D+Mp%}R+1MGurzg|#?%emkqg z69sF4%Q)63dtfn}m=?n&A`F=3gQ?3XFl3K*j?&LuPJe+KPTHF^7}nm2UaL{4fZd6z zZ&In?IP4ONU2}S2%EBZVIeMQrDwcb0-2Wf~$&Atlo*^lHq`l zZsT!QeCJ&=W<#Mdaa6AU^hsjFgo|l?0M|cVO+%9+_P>V zQC(qWh;C)|9eT1*)gq1~sVl7dusX4|Q6+#?n3wlq>pzN?%y2~|20Y2EQDXRYLx};8 zH>kw0G6Y|sI;O;MwYzIlVYt@aHGTBjceh5f;k^yb2Knyr6i|^*0cWJ~O5);FVz)+0 z<-x$xIu?Pg54~cI&(=e)%lyvOP6g2>5(!3Iw6e+^**HHhlSOJQo`=u zAt0I7OlvM1N{7<%sLNpybQ%(bpj5?Lr~X}$N5bk_Td$Wqa(rHUJ$#Xxy>Zq+){l;) z5mVG5om-{h7n{TwFPYDl#(a_~eG4I|!RYfiY-UqSTAywl+pw;C%>;$z9y4`3psl#d3c@*_Bn#Dp@+1?j+8_y1>g9Pp+@wsoZuVLviKZ-@ zy0MYLYHv5HO=c#ulk2C@*bv=V#nc)^Z&iZ|bmeEi{)zq8RYvBzrX0GiFl^F!o^@}> z+}xzJBe034+`Ut(WJ6S&wZ^j&EVrQ?9xodGJ!h+C^e#tEIJMlg&Mn+9k}d=@xD~>r%;iuIDe@o z9Y;g%VrRE}s+1JQ-pCZjTC15B9lg5JnpSferL}@%Rc7ruJYO_xtbK`{Ei@}WYNam_ zD{&&~=5)}js;liM%otikv+c_2Y6ZvTrPXdY+BteTUA2!$chXRoOCal{uBfI4iHo#I zc%_zdgy$AD&BAJ04Iza%|^W@p-o5wfw?^oEr3lFAbLd~+>ly>d#>VV){NWk zE4Y(pt-2!Sy>)6#+gO=)1W~KBQ~_$mB2g;&eUcI_o)-JjpfU((fSa=0P$WAR3Hm)Q zThU&`QP$Oai}cY7SFl(lA@f)quJ}xsm9+!aRi5v1lQMXP$3$gF@_lN7A;J;=)w69@M!-^rs)!zf%0C;@4`n4%zX5MjVRim4_QQ3(R} z4!7_Hn^>y6#U>sP(HCyL`(?KfAf50t@*euHL`8-^f~^%X^u@LbW~2ubdWvN{2tXei z1c7meA82}SwyIn66&0~mu<>K~74S3m6-+DhLGl=R`IWyz29AVUq$lj+ z@z7m&z5M<=3B_@MaW)Qm#6wz?RAM+21*T>W@=8=9>7!FTPYAE)*Y(eq2d2<8KHpm% zBR{Q~7vOMV+c!z6fDM>U`T>1l&HJ-e+ZAp^8ool)C@!oH zCA$%1+dK#x*l1qmK2R%x%;C4PL2cZ}n)k1GAMy~(_rXT`Al?TXZZ_luNMz+6c$mXj zEmKVr3Q9V|q1Hc9B6S53J{2gb67%5oqzyvL4pd?j3PQmq3V-*&14qxEy&v`+f^)U5 zL$!C|brUQ1z?(UqSdc+M6r4seqXbSRNyPDh0&p7q28BX1rv;5dgWq5wtipr+hXtjM zx}?AKO-$1N@dqAY-*@)x{mb*G=V5#8eeH7V3j%~$T2?2F$HgdXp;+C5!2e&cO zl^!S-R#LL40i_Ojm6C7j;VWp39P)HcY6GW0rtX3L(^K7D@tDmDg_(bul{ye`f(WF_L~HsO|Q54 z;DP#&>#yNf{9VCk*X!-Ri=O}&sEf7#to<4ubtKAxKso7fB=I%j=rp=QW=q&*s6;Ix zm!W2_|DgWC&Tgkuxk(J#B&lWuRS-R>&lYXKu~J3It8a~YzQa+iAC z%79cCB{l{j3Q86Tz#c~3oKs8@(xM|;q7?+Q!0Vi8OGzwM3Tz9<3#FI7|Jz(o&-dN| z5A7SccwungyB;M#Jn$Mg%wV#Gt2CK_`fU!y=J;P^b`PXBX>rN^D#hqH_SI zfJ7r=*ynXS%}9PqKthd!BQH#>)vtH8La;)`i+x3 z0Y_iS(5)~DM(#hK_83z1Ef%rO7brxn@o?JdO+>AJi`H#*4vqF(2N$(1I6@J41>DbN zh?nHax2rm%fpXLaN)9E}&>Q;+N0bUqxmZt`NrT0-+Yhjg@49PzYL0!%aE(t%*D_w? zQ+Taw-O?=OfWb1g8?D?t>*Ja)7ejIGj>ioL|>*81Bb$-L(JEOm@l< zH+G5TDm4v?(f+La346jX2>yh_k?;#T$Sj(ZVUc!zY;h zXbR9IIP}QWfrsE0E<=>WRkhc{7`7JX=#(IsIGrO6VkyLlp!+rK`RyeA>0s>;VgR_m z?%*;cKni38^9(**VK9M-VpfKvRI=r?2U+#?c}XM^xm-l0bIT8oyA6x`SIwe|x7+!q zKFbJyt=)wxxWn7pCr0{n?vm(BdovwgZzbbR24d|)W`ERTjrjzNKWec=edbS_TtSmD z=r$Q$K|w52l_wW6Tf;ebyw#vf1YAk4$>>YC{3)HG;5WKV8javI%CAqiSoA!vx3u7^ zmr&w|SHRt?Ytjas(uib$)io(~T3tlOHGASUo60jOugNQaYL1a;q&0cvPaR;NlGfyv zKZVyqh6drN@=CXK`88=_9vy{CR(HCbr>n?4ml-Ho%u&CmwLiM)!2C>Z+L17JiKPKB z4vEpetosQ^Tw0R2G;vA3&0mV!=Xc(Gn;6VG+(SJMk1f`ITJLChCzIfJ=yC6dS000> zVRF6Y-n?qLXVzJ6EegK>iI#guymtZ(cQnyA9*#|RN5A4KFvIPTUJC?BXyyHogw4c^ zF*UQ*6NDoaIJ!s_ip`TMB{Ch6rMLw(8i<*gMZqQryw;Ug+Az#BaAJu8x&kEsdrsvF zgbe0b&^9a#41j|djJhGgW`^23FwP3DydTcMW+GxdDVSJzjaw8M0&Fn2Ib^wP;qa?O zBD&)lrPh&l6#Hle*@}|B25KAIG2B4q|AH-O2)2oi*0{4Zo9h+QDqprIx^a^y(Q55T z{A6pQCmS|s1iR1X4U0mX+G#V6bO$qjv&vj_4KM}c$KV8PCOOQec|oB>HIXgX8gr~0?I zMEPnl+qZed;piJTxx+%TL&(^6wuwC%S3aBX@a6k=q!M{sI^Ycidp&-=&B*&4C0{`B zr<`I|!*?fqX`g|4;g$Ep%`kZlFT9y~;VtXDu-3^U>Px-w*8S*&_rLp5oI%gZW3T{| z*YAbdw6Y1FxvUq~TGN&5^ukV0PV&N*KIVl*!CUvjKYPk!NPWyAw)q2vh&3KcJABDY zoG>NPmB-*LY$RTiLw)lmAH3fAN@K)K-VB-Y`(hDa&YxpGPU}oZujS*IHVLESot0eN z{7i1jkuY?J%LCBt;;K2>!F8a2JFx4_ZQ)?f;U4U*8xx-pZe`vLO$l~Jdq3O)lWV;j z8{;jKchfe!Tgz|IyMbn~HqX4<%42W`OkUHwZEkqC8B+IdTDSbj{~vp|Xv4YX4Z3*4 zx%pB$V|#!(HM7%bbTTLRl;qs3EiGmPkL~G*f8{ZF8Jq1q&UTY`yTpgAS*2?t8m%*3 z`GdSiHM;4*p_y!x_lQLLv+noH^IZ2HpOWJldA^zRz<8$NJOq<89E!SItMS-C-lMa+jls-- z@%B>yfDLo~gwScm=c`nUL_t_{0~G*vpp=SaWRf$=t@NtVJ0KHJ{!gp%rm>-5L8!}1 zVRyfqw{M4U)!q!*+Vf}5+`Nf$^Ix4iwdrO8B){@2_$hskRLP<00euT4G!>$1zLKU| zbs02T#RTD1Y89`(hXbMqg_0;1TJVIe;*~0v-$s8mjBN*dQCWZ~ifzzLRr`B;y1R<) zt=Ui%8<0ffCWFS8wlt{s^>El`wL1znk^P@a3XV}Z4aXfjG|G+w5u#XJ%nzF!f%1lA z*AcPXxiOY1yG&2LO~XC(26ZxSjhbTvq9y9|xVn9gbSC3;5BS{qlKQ4IO6?(dm#-%r zspdT$ZNsr_Iq9qThTNVZaVVu!nKkOI1|ufRG@H`X@gc8^5G9Ec!WHN_xhGMKBvBPU z1{!UgDS(;vI!+@P)f@p0Suh!R4lF7>egR!*0j(CB_Anw6_J(4Wo&F|W2y=bDOjeWw zlK>krF51L8kW(r+7$%}D#6@MHB*qJID2ZHQ`}XZ~pZ>~ejO})Q?(<9Am!E#y;4Vnc zyy+*A2;38b2eu9V;upX8#o)G~m6clUueNR5Hk7UXuOvQEoDjt(dX9uhjHF49w2_0= zeJK1M0|Gv1A>4$9S8&u~(&Bj)4x0rXM{HIj*P`4JvBS|{o3s1ysg4GAyz7hm9x6a_A{dgUL)=_rrOJ{%!W!-0|8gcGu|SyM=BL@Mq?Pwh1kZ0?=1jWW5v)D_r9>#8TXpFfBmE> zX+H%YdDL&Z11_o!d}OdAsjdAQw%eoaUW0MSV%s+qj1WrtSAGxE^hc6nTD3Lo5A_u8Wcf7gaUVNeW@v^o9Os886+D>rLex{7eY+bUW&bR`y#?ho(ug(wV#J+)EBrP6IDL+^kUXxAJSa(^g;ywerJqrk3FU!D z(Pykd1|B3nxLQF8aVw{i(PTt0n+0ig6a=xvi*cJM6dX}RIMAXqVa&$)5~;XM9TUX> z>Bbw!$9l%bj}6yqrkp$PNL0E<%F!`zQ0NHey~%Q6xESno(Q~yI&b{qz=OFfX+gdEH z7L!IF&ty|}OW9zx8%$b#G?C7mvF$MFgLl#|(|;j6v0`jvHMVdn0>}ylqLRv_IJ|j| zb5HVkhO7SzrtmSCsgf2tGru8a^CQ8?zVUs)L-5A&4c!~Yj}6m%zxTay+PJy@D{9av ziLbmw2dI^}iHP~ske@0QPUNX_ltq9<$t_?7BGb1J8AX8Yxd=>oJwSp1kLVR0cC$&X zB5rW2d29&S@X`%{CuFnREnyXJ3zcFqD2&eee39eRJ@aF+_}Iaop7{;&+N^I=HoM6O zMc?K?#upItnTdnt3QA^AAMScXI02teMQ*(%n!#VoF?4udM?_VpU2IVzu~Gx%Fwqb-uTkSkp2>Hp_MxuW zh-%91QmMK-i|v_IGA@Q(6$Z>()*tWjSc?`OC0?&_ti7v&yC3`Z zCZ*luYcYkq<{>zb$6d}EOu4Uq;7v5Jba?sTpoAj~G92NZwfoYER;}IA;>Y8#*H=Fd z2Zcb=8Cg9JV{f7ha032@(1#>13}Y3QnoOzMvA|fgTWvB4Gq$!a-E+ zG8wdLl7~FcvkrXMJpk-ne;p61yuODa97(R6=Uz>}O+=C;yU3~P@pz095KL4_B6jSLGAyX40L%rQy z9mV$4uJkS$f@wi1r>jCR99uBaKVX3*4gP%C-Wqjgv)OJ_O6ARTMJ6}86FEyc{*4bc zRuBC8Iu{IdCVH|VgT~B&p0JQdpl7rznDJXw=7MXW_KVdOb$vq)BnX{w6a6-cVx4Ur zt)hxL1CH5>5JSbHBAl3$-qfaRbF)D*F#mwR;xE+*Zk|%9ztVxxmyN^l4MrS zb2rQOp@U43y=1<+zhNWFF{;+0#(-oOc(e-Rg%QYdG0RyZIUNtvYi|wcau+6 zL&buhYqFrgV;4~VhGDAKswT>y8k0(TJL;>AKnvhvTWnfv3_op_xolc{o@yEGaPxw_ z+9g&O?QAswPAw`?J?+vBnx3fd1_tyXK)i z6VIbB40r>9Ua!w!Gcag4C%$bwp-2dbXxp&FfXA_x2!QE+Nbp}t4oNY1KB3#eNb@jRxZfI*8!tJ5@+ zwta}I)K8y4&MX~W+&4F~ZDgoaSf9W(;LKhJbo?jJ=oiCX*TkMptF!rmKXx|h7|S9T zqt-+y?etudMPB~5|0kvqGwBsrV6%94Ro9eBmkNNzOB3pp0EPK_Ufr#l@?Z_Uly)ad zq9RJw!fN`R0x+Rn^p6xa%~oxfNxt*fH+PtPzZUF&tzjcd7CY^yFEE6wlT2bRt2)k6 zs^UcpBM~Tpj1jd`p;RmGL9?!gCbN!}?5t^D-N28KDM2u^%x_Ag@yYS>pI|ejeDuuf z8v5oRyM}6?Vma+qXZXi&c-X=6;+RqIgIn0>bx2FZB()ntrV}ceAXUI7y@jyFjLho; zGClhdOt|xnl!Tmce=}Z~635C*R7;;DBB`)SHlUmnfa*aBT)h!0vLP5bG}I&(6CqR4 z2$0rnq!O+8Ja(&2gI%(5QLQFT?T&Jh=^~&aKc2$t%~0#i7fjFmciXm}P;z8fdtur{ z!5V4zM@KEa;?eF?w&v9fPrS%o;V7CvsM|Z6FeV z>!SzXbhxz3nJA+YwZ)Mr`Q6#D1^e6(LXZ3@3NS}x1(=VoRe%YuyqA82)n5gwUM2D$ zA7IQgCXMXI)rn9fh93}W2#<(xzV`iNo9P=j-$)mh2k55`99SM;Sy@6TPtOrO#x^=2 zoEA&YHAvyX?5uQAM9CNk@1avxK{P3NXBt8_2giCjSh!LMF4R8u)E8i}=KA(m;j8qN z;(YD5iUU*N1kV@&QUxP?6^>kkGt1l3sG?Jahru{IO9-s|cI7-hK|hZ*g&*RONfieN zw9wA#@;|rIM@q{Qv-UUS&2aa%uZ@|H-rc`>^{er@HH5&IIXh7ku^ObvQ^HjTsF%x8 z!XeV{!K9j*J*>)pEtb>x7iN2{rL+ct7_=UncC<>D=LrFWQ@SxH7$>Hyv{8bS^RL z4|KPBU76mvHQ=&oEV-o7?=Tu2eu&F|G1>x7i&|rG2B^X444KU#r_tM5jYRtM9%R^= zd=7p6-?jfXID_VBNoxx`oMF3GYY#geVVlu ztX($&j=&;8kYk5j{?5@&k!UoG%ghpEAeuxaa#-v#$W~}C$M`ZlgZrBb0QJH^6=HCgLEiWOH@e0UT`s;B-Ks z6?jzyl)MNEC2Jjm83BX`h>AlUY^8$Vf!t@vSc6UfHfRWt ztt17ngcV{zog$7>vO(WM6=Q%YLdp@kpaM>z;AXH%qhd}83QjRC2uQ58nD7BCg^C07 z6zoqNQ&1Ig>&FH%#o-&14?k7S6b6qb-vAHX<(wbiIDV(|;5h44UM30nGg>7a(IPVu zmCjU31y43yqUeKr3l+0?8{@`<#EL8F}Pb#KFAZg60NED(N90QsK%!Q&0U~ZsLk`gz}AL54M z5!R6?dNvwyigxW^{^iNnog5tnd!|1r_PHH{`BcT`G=zQ#oRTvpOqnRqS6G4xn{x(* zs_@T@Iy&6$H?{a84$W3|%d2>Y)1lJv#i$moteX({KK&8#;fiblj_LsrfR$A)MkU;p zb^dFJYzu;5i$(<#=BzF2yL#h8F|Q_w`$tFJ#mV;0ouRB_DB_MeTfltsZ%@KwGq&Vp zmnb^6THWkkYZPx4?`Gxq^bYzX(n^ZeHlpSTrzY6vksUck+33P%jm8U~Tjcu!a)0&Z@>1@fI?4|NfJsqsQip8w)O# z-lEr7g%%_5YE@qvp0vdSmXWfa4d{%2?=g3NC{a72wV8DaEFP3r&bL{Y^)goLnp>!X zW-SzSNPktZ_-J&J=yVLp?wQo^jD@amQL-hYRa4fKDUnE&6Xmwncq|%WBOHkeQii%| zh#O0Tk+|yvjjM-2fVft00``xN+A~#LA?}Uk((XvkJ{0!ET{z_H?p-d-TRlf9Fp!-cj)Obo52ZE@dd z)uab{u%nlfrPSnV<@(&p8%N5tIo8f{!C~N_zJ+jDIIeR5C)^!%X!q?q`4=ZgN1fS$ zM5N1II#rx5xKu3`15Q1daCOv1(f=7mqdjQX@qKCdm?a*tSjC)MbIIl!ShFZ*ap_Q{ z+Uc^XG%BMjU}|A|ZRI6ynEse7lJio(M`5#z0$r@QIUSUNsJICadrz_EJ-I`9E8#e1 zbVet&*x{GXX?WH!mgsb39}3&C3Pbs?jBJdyvTOC%n8KX=OIqx3UjN6Hu28M4`DL~X z$LhZ-sT^JYyJu&s_J#TV`}WSw?$|ih)zO|$MFd;81#8cnge;|fijlq)K1gwr!_VPi zfCW<(d!6|im&h@guWO?3qWP30`?z8IM8e$~wvLYS=Aft2+F~*(v+>CgCROd>j6E|^ z@`XAllfi+Wk}bV=k2UT$J7TTQ^hldKTp5k{MtyptB{iJy8V+femVypPQs-%izvQbi zQz_<1iEia^(4iK*R)orJ34yye<<{Dw!aJw$d~ah?f+qc}XIxp?M`MGh`+)*$FwABE;)%2wd^%H3C-- zWN8R>8lyM?y3|O)D+JP>H{A5#Yu}qF7(JrpT{Imm4un00bV&1+XPyCTN5U$)jD#b( zmH(zGdXAm*CeaH7jF;tA_cRXJ8_3j#(Y~Hydn)0yN3foJ^>ED`RwMalRq=jqJ-Zs# zWtC|vIl8A?j@|!yRp{~uXfpR*iHBYqW#@bx2{8+Aa(yR+*%PwCwXcB^1uQwYI%)tyy zI3rHI-W7G)MVH>-!djs)RNxN!f{Y?(tEoDQTxXYa7#hvjN#-GCoqUI_oiImVhrA)u?pH~ z(CjoD)jDUi7|Zm<%`tI%i_5AH1}$!@NuzT`@}XpZ+8*%`z+FV1plQO%)dU$Bo9Z>bp1&gww{u#g2WPHnZ{+yf?;-|&r_-t~H_TMk0Hem@5Si(H*IBiKSedDwozkIdb*bx?O$E$|dDB`R|luR$ij7rRUZ&^LtjA`5V?T z^D$1SdkR^#L83j?aV6L@dDB!pwdwTOYSYA?fxGKdl70Hb%4LhVe~wXJE( z=MFswzlY~*S$KXYt~Jlf1vm_ECkez!nh@x#fXb4cV05VUiGV)@Oukkn7if`0?#D{5 zH6-%k(SGX?tK;<13=>t>Z`vW6e5Ph|Af z>nvF*TDcOkh4^wA#P*qfF+MU^nZ7eP=-t^KD8_8INSik{WIYIci$QI+!S33N5up?Q zCET;E9lH#V^z^3-)<_}XZx^lMfFjW|5t}`+@M((;=VEZ>BAudX;v$i12-P1l?Bv6a z5+ynX#A-3L@G9a0mr{)kn9H_^7;Wu~84vmT=SMdj>h;c>Vtq5g(oh84wg26@Fqz3s zA1dSDBg3Ttp~OQ7_0w}#sZ%&i0I+L?LeaafP5}*O2^F%jyx0Z>0e03t1N)|S?yNog zt;Y|-$7t9?qfTrp9!723;y|A$-{n(!BfiTnbjYow(Xn>6rh-%ts2+VSR#ye`5Mc&qYXm zXUjSOW`&wbOK>80=E;v7dvWGPnywvycPxL6rX>%kDARM22h^!Kq}NQKKp>?(lh~qT z)dLD<0X-l{v{=apD$3ux_0!MX^8I_?`+>VY{9f$YMGecprstM_K>hfK05PuoH=Jbi z8mM~BOwxeh!ez3jgwi6NirT`Q+L2~eolPq?9yfGF6Rj?OUZ34DzNvhp+TzTQ=W%WJ zADKvma7U;K;a3aMRMv#pC}pLlYnW`1vQ{L(5%#KmUB~C$*nH_Z*nP#WV#j&<>g- zaYPFJK8+fWnmB!oeau2a251zysbnG^K}RB&@74Lnc${nI8AsxiCq}m3=G)j3NoH-W zqpePFVI*bGr6MicjHSWJNdM946u8^xH?|FxOU{r*6E2U0W25CD0@nFJJ|whnS;Vo_ z5<&|!EoB7i`YVW{Htzs6QJWh(z$TWsTOWPw#E<5GK-0Bff~oeF|M@H&CO}3BAs=Q6 z<(8^Rl2c}a0La*~v)LRyd6K@c9Ft?OZ__kUvQ;2|8{LZnAJXh8iBb@7*I}#~!fDIV zbS=A+00|R9)ig~s$WmHWF|23jG8oA)_be@00SB}Kp;E{OAzLU6OSQMaw`*^KBQ^IF zymIGM?T($ScIE=S4Bo}6l{>5D=GqyeVkHra^&*;j3?GKIl{08^>ipzYUhGxsF0Zq4 z1_XaG?wFrFBh_6FHcEm0CX=KJU}B{+gp$K$1U2OL}T zle@q++gaQ-7y}Y0C!Nk@B@n12oz7GRzJ_n7x7<8&_$^0@{hh<9wtLQGi_z+i=bWhu zDi%1MiHbkak#Z7BLMt!PBDE4LiIP`WHBp;cuRu*r3GQ(+K|9=@V^YIuP9=4+)$mKx1S*IaZu<~n^@a&EfGKp0xi;NVq zy;`n-tGs(K8maCm^zL_`JmJ}KlXXkG*p+lR)7@fW(xy$1&v$gpkEeU`bITXz@)eja zR0Hh;p-8pW+m&Ut$_2QazQ9&wSGCf-A|-x8V=6=F%^BCo%l(N<@_I{wCs--)?3vpm z!K}kGgw=akoxUnmVG{gyJ=67k34X=2DBH=cRZBhREr1dtKvhb`ge2P)Ko)`uSqO6e zdkn?B$UYuVkg{^uC7(btGt=5+rj+SW3WT(^#-k)ig3)L~#NOMXk_?c^kY>HCR!Wi! z@p7ruC||@V=M}*N9kGE{Pqc4ys&&jd*q7Rp4!0iZK6T4kTTibuA9I>~QJXk9l}TY| z`D9A1od#^8!s4>33K*^jOLI2H+A-3j_suP}=pN8Fsw!%%dKd0&1E8tG)N*EL* z;oWO$q!pavY@Ii}S|jaQTO-Zm+4yQT(gSjhv{vFavl{6%A@DT)!kTZZ6O>WWclFz( zFsf0JEy-@KR%BNS0z6%N<*U`vT$|O?k@LgS{QNweZ}EA|hkc@-F8`H07x06+|G@ea z1u}(YX{O91c3H_`2u?IagR}yihSf^D33zkuIpAu`G`;i9TmJ)fE>%mq#MekrKW#6e3OAne~j5lU0q&Y1S(g%6ihz$FMiadNy?? zLTke0FGG@flvN~Emcup0Jt7M)-1F2cetu@tge zRaTpUgO^R+ySvb~>z?V|uSw17!mT~g;?_>Tzhi4DIa-eJs4bvqyWu8f@8PqfBlpes zY#A9dry|bm_}+Z$o{6llwKsGK1gn|$-!xOeyAQ6s#J!&WnA||#E1iA}{Q&d^taw!_ zS?8dpH*~;yx?mCl)o?DGyU;PZh3vmP&B+RuELA6ZgrM?gPS5fo6?Q!0j{Epw3oJ$DEeBHkt%5bIPBqqe2sOh zslZOpY?w+CGcKA4@oG;x+9ap7uFAN=>UBlc{uwb|z6elbHS=cocOK-Vl;_zD*i+vaq-z&w$pKHX#sNz*&F>wS6a6gL- zbEKnMYMznRnIJ?#=Ick55M3+jfLu0~V!4WJQ6nb0mTFN$(g8kGj|$go7NNFTU9pI= zNM#d?hFq94KujE=CH z4u!)zj@u(yNB=fqgQ?IrDi(KDqhkYNN5YobuvfEbWYnAtJB+@ByR&PqSaHQY`bv0{ zE8#KvOJk{?jYd^C-y6zLw7cYUSAnU-Cdooole7sSpSzr!cUHX;XtVZQr9!ZTh3a^& z>T41kNAeZxJXPOYvxpExMURVEiPe%2d5zP<^u$4SwCZhz_T?CiI8%P19x<4_F*}<%LTH$Ni6l{( z2hYe@Oe)tPv!k)3%+t%1d6FdQPiB%fG+YsTdxDkL zNXw`;J2YGF+|lI^mWCtQzPJDfMh{PSI!*pqG2T`cJVE2QJ`wYVI;XSwkwV;TOQhTU z^MoQQ$8av5XjukH>hg4$Z4_lAiLKQTp71P8b)*ZHf<=sryoE2Qf4Akuqt&1Ge|X;~ zFj4o=L-6;{p*6=-f|jOYzH}Ak$A;0rP|M(a(bW z&nqRMSi&%Z6f}qQE{5YC>1TxCPiCunsn?(-Y79dQx2Q6Y(;ypZBBN?IJ_~}w)t?ed@#0sMz7nQbyq{| zpivnS@s)8f3Hc}1sZok9+zc@FAjhIXencE^>uChH@jV40Ajn-^beN}507VT^)B;!_ zgt#YBi`@fPR1@W;EHvudqjlbT`jdNR_Tbf}E-kp;v@0*dJLx%MUW1u4jw8$UL?q0d zzYJy`6^7Eeichm-DjvFFSM_Brj?ln?Djco7Y0HCqi)cECdgb@rkLWq#B~iw#L+(4} zSx*gCBQU8(B#PUI^hFP%GLf(^>W|ulM95~+V1v>=u2KoDcAE?dB5&Zts9bGqQ-_Li zzfOQRJeAwr6%KW6%GI8KN~4SR?dqq$Dpe|_Cl65n&Ue4!+1ii1iun9g8tJ_<+gN%L*1KlwXfDby+prWu2jlT(sQ*RfPeM2 zV5Ii+fu2ga?PT?VCSx9_MT;@=>{m z2}ex$?EsXh0o$|U4^cow!GU4{$&hYFjP!7rj4)#}Bi@t7wn|*VQs6-3kR(@t!y7t} zE>Ha1eKoM%_g^zhOV~)Mri5(mvD)jQSo=IZhwG4iYdt%J&<}GojBu}Hq+5Ju#=95H zQVoNp`CC5I^ab#iH5Zqj=pEb}SqH^rHHNGUf^8JpGXXh^(#TTdUHk&GU^OXu7p8A` z4mBMFz{gM??HqkOoSj{&o!z&D4epoUMqSHY)VTbs)hBod>l`E@ODs*smJnhG9#mKm z1SGCk8W;Uc{d!L{U5XO@%J1n3?qPzRk|(Ph^jfSD;D7*~;6bTUo<&uD1yv~)5fo!J z7-YX%s!&IuAsFy^Tuxiq9yS_UbZQmivD$j2x}9kX0b`XIIIMvzNJO@RO7&rD$*eIX z&B45_wtUAYKXmJPdoo)%HNJ}ubtdCwXq zeLX`sliOA%=?PYaB36Tlh&>=}Bm%(gl{floC5olMwhz;r*mfE^m%ef0>+~GhAKHnN&f!m6Xksgup1TC3JdH7?FH6hMrJcoBQ zCvJmhZn_mM;HN(gR%okzslMWGqvwc;xR8}ZC{Ze?Bz=PsH=0?6g6%gCH)R%_cEM$K zB|?IUB{Oi3t?vGYW!ehMwVS`yy16?P?AqK~`!I~+w*MMEH~);Mys=Q&RQ4X|E0y|x zf|h=W5V|B;VUoH^M%vBJ)Ob@KG8GI4Q^903lnX@|rg&*a8czT=JON-%T8ftGlGwdD zTYCadMtf3@Qd{rX8KWy=`{@tuF|VoikuTarkFl8eXnMHSMb8Bb1EJz>yLn%$J>fTh zOYp_v179(DVvbyQeb08XnZ67+2uDq(6H54JgB!%~&rm~^i*~MdX{xvM!3v*cLbxB$ zb5d_N9jK5mg|=Cx1l0noYjPu{S*i3Wr)*Zq1POwm<$Y-jS|Bva7EC@eJ0x=AufKcW zClB0y@R^r?@1^_x`Sk6l|M^}x1v_fbqZZhz#XyrJ*(1)$?9mmlXt#t#Oa8l#MPs0~ z28(|5`M$57zWrxEyB$_)FN3o+pyz5E;UCbyOE&K8R2UnuIc|=r&?YtYy`^uF zd*0%5UhR0x;;IYu3-r15SZipNy>uB~)q1RTJzElPzh=uB<#qI%k)HYuY(IOd&ibjg zv4>e+8*_xnHsM%x=ChZ@R+OcN04a9#3yR4DC&z~191hCebK1@G%g*-JI zVwR^4%X#Y6bmt|2sjP=3=4S8P(on(bxS`V*?!BSCN%?B>?p^J0qKbcW#XvP`FZ?(=6C2hVnr+1>~&V% z4AT>5t7p}1C$9-iyIqvGr=t=f8>{#5u&?56Vx^3lTq>K@0TXX{YkcbT_{p&o6S2Sg^OGk( z{Na1 zV3!#Vyo2>pv7mgL1@3+E4I`37IwJz}UtC z3T)lO1khQ(<3%Y1k(NNzCJJ(FBVeilsqUpxp^=S!|LN1giJrdgCC8E>SWdK!SeR`I z>GjdU+2V5_%vFzwTmJ}`*e&TH&?s|fE`D$6CrdwJTUzq;k5IP$ zwyjKX-=*h>k=a9@@DH#Pyjv=ES~EI=!0OW2_%KV){$J#7yZD`@pPc^p(>E@zUYZRQ zWxL~BvX@6>OOokWz?6sNLL$T}Wi4wDA5hmhGQ!wH#o2*qbYN$D?c&#A z?9T=VhpT@^&#e%D=M9yPnNB}lSiU&c)3bqa7~OJOX0woUhTakg^JDVtD3x?Cj}=`W zI%PC^TsDi*Y&4q_A(I*nNb~Um2Qpf}i>*r!6=$o_=)jIbZJCZOEr0wnxAE+9_W^bv zQY1XW?!&>NGdY-NK@QT4_SPRi5n}6P%{Nyr`>jitexvklKpZRQ>6_^1NQzXez1VqA zfmuq*AZ3(R!gC=nRFsOeHAlCfoz1rGx=&?K^(IPzj88B2ZqCld zCpyDAcP7|9yrXa7-sjPZzz)+_p2Lwdd%$+W#88X>+=A;DPC_56%_f$epi_4)5>k-9IQs zhxW^LjL5aaPUwYdUWu()FhPT-M;vv=Cv!_x9xQ^Xw=qu%0?#|rA&i$SGM^bEnmU=K z0MEYm-S@s9nXsX*EqU-Qz1xurT1@_=^HI>(egmGCWVsqiZSIXOchN)UP}c3vgpe3a zyeltJ1GSPkDU!6)$<7ET<$-Dh&>f}(;G7k!B_tIgZ*@1E?^BBvqRlX2>Gk*u-;$EsTMK1ks&0aR4VpiVm^ZG zSMhS6;CYYqF~UAITh*Dvk%%Ze5ewp!b({n_X;RaVQc(=^g81~~G*|nt@b2QV+fE*< zb_d-F>#;j$r%oYg@`BHQ=S?SWweQvG9(?Uk?R%1ih2JssM1#H&WF&(_!JPC^0x_T6Cyd9FkJngjuqPV2vjtOr>g7Q-J02WUCvp)q9%K_Xs`H zd)hYLx2r8Xdv^O#)N;)fJ3Pfr9bpwzYtN{nJzLs5U8St?9Vp9MT|7ICf$WZ9rrjFu zoQTh5H}{Gd$>PeuI@}@p+|{asScuJTI=osPgca9#b5c!Ty^e2HmoL{`#s|OE#tOZ` zu_0S#FjL;q6H1QlEpK^KZ$aNSFqItK;A!8GD{U%z5+i#n8}7`}fX-z%6m#y7%c9c< zb3^&^#x_S=>wbOEW65Pb5s$sa5Xf|=id!n)T$oT|UYVd@lp_t+KY=6M7NSzsF;AXy zgw%JLAP6qO#k4nVK@IOoR|+!bDKPvT7~;vBP5!pHPiKNR96wUCEW-Dn((-0^&^k|p zv+q3nEXFubJ_#;LZrXhBfl(&`VqLiazogHR3}!zwpipXnQ`oGOX)7oQM-?14-DAn7 zHG>)n#iE%o&c8*%4jXL=8YIUxnK#ycAr?D4zOdBMF*qF?+EbpmDLUoeQ1G`$Y&*78 zdq$^w^0{#*J(bJtnCaYM((M{)+uRwf6ec1mA&~J@hIW_pnM@cZN0`NW2lp`169@WT zi-97OQH^aE;4Gm8y9O=dewPpik8*0Yi8;{|eb^kgG$+`~OX!`%pDExVe~I6w@WZf3qTRQ0d=PL`#_@GXo1yG^h%%+SDzacTNQ zK?E-YqV;u*dg&?n)vNyTj>-`UlExD)p`>l)C0d|ACQgz;?lZ?MhSNb&CV>H<4JvH} zrV^P%lo<_KAiP07#r854$0djM!O^XT;B2{VrY{m5+TZiCm%r-454F_ZV~>}Dfl|z7 zkC%hNV$??Wns(oiNX3Wulq++?vG=_5eIE-X_tZ{Dd$TTQswX0LryTZV2jP&v3>T@6 zVP#>==c)mzL_E|%GYqGZ8snW**UJ(-Fy(QZ1t6h-JM0Nd_?b~pOklzYNh)%YT3@Kd zkl?6;`;EWAythrXhLhRC{!O*t|5qp;6kqXrF&P*ClIpBt-V+`X^aF*FNviwTsOU?) z?z`DQAoC^yWS9_mE7djnA~4J8U1vElI19mBe|j9Y!-s2AREMijSed7T>^T_*uUxZ- zy_1*hVTa&gd)RJTvxjYL4@U)&SE+cx=L|XowE(k&`)hwT2WMZS*9V;Y6u!QNjc={p zaPg5xF2dIR`_2RjMaEO3JGmS^vteG>m0VmU*+j?`_7-2?k{ZjP)?z!V%eADw{>IbS z)m&Pt72xbtM{J~AEm$>FNswuYJqZ*>e*WQ_Tg2uwvnqL^DXe^Q!I(*0(k0XqfNg>GYF zn2&|GwTj(oXKSjn&sW@#Uh1nPC$nuYi$?S1c&OYCUkwJ$p|(J#U!@tZM7qVm;4mT7M0G^7E_2|$a^~QJ&~n4^+V5wNzYR_;zX*%9w@@9S@|9j-w)5bV zvgwos4*6lv8L*mOM|lkB)BV`e|D> z)5iU{ezWw2p1!`GL?Dn@{->t;mDA)>c z-|b)c&Rzeb?fCH|)v<*@buVB%p<1~BKc_k(Fx$;>%maI+f*?7eWD^7%JL}4+Mp5#& zDu2Rj(Fibm;x&3hux+fchdO$WZGY?Xi}3gR7w(@9qLv05@6+}BR!faRkyA`4+_Uz^ zQC%B7M3fcm$aH1c_2{W%f6@8SvD4pz_T?90N9_VAYmcD?lCG^~6}{+pWbrA?g?XED zVX~f=rNH?0BBt9v`19k(e}4QpbbopI#qWMsvSw&ax~O$MBFxskgy}`rv2QQ28iq^R zx7llT=tgR4xr~C=^6RDTx!H5V1*(&(M(aT`F8w+d#&otqOmRa9!G+`BI}RU($7?r8 zD}E(SXBc-kiQL_2M9r<^?$Uh-UwWIkyAgB%ery|t++8omz6`S!FY_6hyBqY|lJ;ba z76ptjohDh;SezAKVU#2};&{`Up11iqIMKh~d-8yPUr%}0U^Lt}vqS8ZSU9#^!mrW> z<2h|lzV=!A{k^RnsQ%qKKc3#}Z?9s54zI}@wZGb#@|z_FEVWZB5iv&ade+rPv592Q z5aFiciD+aE?%Z5+A@y-V;4c^(JJh%37T=AQYCP1La=Ox;L2Dx9QXO~SxvlrmSR7Q9 zgA?ho?)5ENx+gP}j4x>+1fH+Y9Kx7&_j<|9ArSECcbBWP(D<$kWjSByWImhDg#=ZlC;a9xu$v4L1sG-y>=&n;KgHCzB8 z#7K-*vz5t7I~*0Mt}f1FW!>HPX*Bnq`P8S+yj-Js`I%3Dit0Wj2p_7QuU+^Dlj$Eo z38?=+yfRM*m_1>6Sx{`nEhd>(tW1WMhuGHx;P1%9mx3Grt!x16~@BI!w@XQE620y1Vx;Kd^djX>2H~ zgzuH3WXvcN!h)W9%^f;cxn!5M7?C1kK}ZA{=d^B3L=lgGmU=i0u7%i0DG(?Q$DV&H zsP@NO+ri2&V=9%-K90B##uVt83=DD3Rj~rMfjFZvM95iofmVy# zY4KP+$Z9bm$Yd$3X0$~-ImPSuFnoMpY^2EU;q&mR6DQ8&P3)q&C+c@Wb;~c#%6Gxy z5%?;*3kOM6<4t(8R}$5d0cVrZZZ$eg4hFhA)_#9w^}FTgABjHy`B=VPJka#L_3y;k z?{}0^8%bc??Dbq3brz*F93EDf_rsQbGU}Xwge2|XggT3*0)rTuLFX4^BVAejHf=DL zvigcCkMe*2SmjBU0f@srS4R#*0$88Qa5(Qu6Ei#i@ z+g9wDSoekX9CGQ|{U;CY+;!L$ef#7L=^i?K)~pvs4jDG`!gI4nm;sqNgU;wVs^A>W zm(;FbztGk?*0K)dwwx-XkGe)c>wB)3D>*{T0*F?w+Kb9=WvT=m*( zCjN;tdvxomt;OkWtw1Wy!r8bvJNoQ2F`+tSA^Oo%T}tBQa*&b}s$U0kXZ5-rFx}_a zPRO*pW z7vvB5UfzhVVvbxHlyX-84z14W(k}d}l$*x{rJOlHR{$gj$qZc*fB2_ojh@!Of8K>> z^%|AiH##Xyr$I+0bx24#=R(uJv9-NQ^sxCxF32`)ecBq&03gK|43C&l3;l-mz7q4EOJY!g|Aw3eJx(`cFX_GX%b+1&@;(`&ayZ1k1pJb1|_;HfU)T=FJE9+u18?_D~@5?NobNYe(2h_?HuJ4vAaJ9+P%H|lU~(MzEx1w@@=gz zM@9}T9Hs^snb4~E$O>zO(N$mjB--QTu`v=PT{=r+=IhRm`P#?HJD!n}+_sHfxaM+l zzXilM4@37dwcoALi5RB$5QkTvJ9bvenCR55JrYv;_DBxhxGAJv&%W(@T#`6Gy7xIF zB6?jot)DKBIxjOL>5P^Ut-5EmAKS5C_oOp>_UdqUY6~sh)~qp~N+NpcR|}I(kfa2Q z&Oy_9bF;?JA^eX#y?Wp$6yP+`HG=Q_}kk z%s#)*h+c_j^dEiJIn#TbJu2tSfzc^vrS`ojqs?`ZJ-dzQ)VW*djvW$W+N7S@p~sN3 zT6O6(Y*6QJ@vY)x!ef#z3f~{r%|`_ zP3}upE08q~I(r#vPr%8CwlE<^8*V+nTFF}@DAWW?P;i0gNkb8Bu}KLD1_?mPuDhaR zI`+9BQzo|S)H(Sk*AVhvQqLhhdk*QD=-ETA>ejVe_eYe*^PzL+qU?<7sZI{IuRE=} zUEOKbDcPM69%91BYx(=;Uf1(9DLbLj>DP8@yI*BiBZx0C=NB!Tb(52h?{(a|tVp_R z66Q+O`|tbc-@JK}OS$0zz{-FWT=i|I)S|O_HX}VNr$zCF7Z$Hx-Dc*n%P%TEa>0m; zht)b9`QL+wmE|7UT7O@x}DP)}n?MkshzAZEk)WWCUVxL3Xr$Ni|p%Ie2s>*qqa$ z6JPH(MQXIZC@0YoHh+c3(ZU4Rr3*-5Z2*Ocz(QXdM;VqGhXCYp~drIJ{rGGtAUF zrqb_+NJw(l*{%WOrhXY=K`(nYQ>PDaHjB;(&_293d(2rCbd^ezI`=)NNttKPLAkn8Pe zsjhX1j!a_yAHeiAYdmx3jgKp$?&A zTD0h>pLWz$4VkJ_IhH3~nw`{n*?sqXdE?I(%vt`^2d)_vY~DWdgqeC|Sn#MXbOK=; zqqEB#yrPp9tjc-Bd9K?a zRo1y~L9Bkn(E16&-9ar}cW{885WEodsCz#YslgYz?l9y8U+cQVF+KP#*Bueyjtp)U zqO&WMhA5mLG0=5KqgTYut~WG7nw?uzlv`Su+N02OX3vHPoCo8r0`Kd*@<;AJJ zr>Ex4D=kXxJva4&)ZTfiy)RGg;Wug~SaS?J+Zv9?_Jd8py3Q%f~^X&Vx+~?VtjY8aj0u-SPvr&oyI zkcv*ovGEmPE^;xi!F4Lep#ZZ`h+!x}5%O)gGcdi;$0qz@+iayA)e$Gd#&5Lpr+w18_MV_sx8cuJ_MXG(bH}dTD zu)^0{ux3sHttTPMmVeyZcQz;sVK)h%tnDNt2|pvwbZl@7GWOJZ0jqw^}NvL zk={*3zOC=d9ki8eeV=CUH!*;de?cg05@1Z zP;BGZSe;s>En3^}zGwYQ8C7$wvw1qS*2+<)rFYd1^W4SnjI1 zJ`E)Cv)DMKR`B&ZR9td9{{^zUBB<>NPI!U5DO08)Lc4 z7u1i^uHkA;^i!l^X_-0vU*(4Sb0mPKxd7#sGUck8FHW1&I5ZbD-!zUqmnx@zXzfuM zp&|Qgnue_LE9LrzJ}t7Lt8`MDGzYXCR2mgp`u!y~3nlhWDrTU-$|t2qTQ({|uCo%SF>18MIs8;<*PPPuv}E$!v?w)7Tbh;F<(Q2@ zI2&iXwM26?*UA!&b-GQL$|^_7>U$0!@Z_6HeSa8DOYF;R`_)vA@JYRKHkNYRc2&ZA zHCszUYq93G!#U=-?OFN1SEI*a6viMG7hB$>x#kafOq~$49@UpcDqr-U8bDdycs*)z zaXoS^uk-RDP^xSF9D$*@)Yh4DEC1@|OPO02XWKGOvwTf;53MsZa5gT+2#h(Qcj|KX z`g(ybL9$vu_zE%{S6#@j)pn-4vLV=hX)z4_5RN}1LcjHmXv82Eafn9?B%mb{k%U%g zjW%eDWTc=S+M@%`Kq@+-6FQ>{x}uw|XhTn&iL=lPy^)5qtumN_Ok|-i`eOhFVi3;3 zV0;fla4xbj6vJ>H&c|?!zy%nIQ5cO2F$Nc5EH1_+xD+`Uhs!V?6EG2%V-hCg3QWP3 zxC&EoHF8Z5ev2RB$9M}r!)DxudvO;Y#WQ%)1mjK^6?=GuoxfU6MTe^@h@z_bbN*-_%~j} z4D81J_!6Jv3(Uke?7$tk28Fm5vrvR${2C>=&N8qv%)wHW<9f`+R@{IaF%RFz&A17# z;|cs9=Hmyr1>3O`Z<;6*ZDO#}#F{v)HSsu%Bc_E(FfFmlB!c+bz$BSgrnPBf+L~mO zV%nMZrh_@dq?(SVlj&@_n6B851E!nlZhDxW=1g;z>1BGGG;_8|H+@Wo$uwD}ujyy{ zn*nB^8D!2egU$EM5Oc1{Hbc!YbDlZh3^yap1*pI}Gt!JQqs@h8jJe2+H5Z#p%%vvB zj5C*+@n!AW9~ISHTRkO%>(8^^N@Mi{LK8^JYs%f7MNd}UztbEW9D)5 zYx9Kpjrpy4()`Z+-aKWVHqV$pm}kv%=6UmidC~mQykr)dKbe=!E9O=68h&YBH*c6X z%_8$>^Okwr{KdRu-Zk%;znb^W-^}05Kg?qDPxFEK(0pV*Hvcl8m?h@l=2P>T`P_VA zzBEhCGPB&QFe}X}EX1GiDqh3;cp0zYZ}=hJ!%y%m{*Jft7qi-|F<+Ur=4(@7)|vHY zgV|^{nayU4*=n|#?PiDBiG605*=_ciO0(BgnQBvmyYaZ$XZD)|rq&!Zhs1ZgRWk|eF9 zwX~78k}N6GPTETcIYUyVqjZwa(nY#TH|Z`tq^F!IXGt&VEopMLq)Q*kkW9&vzS2+n z%K#ZDgXA0;EZ>tMa;{{{P#GrY$@wx|M#u#+Qbx&WxlqQ)MKV?{mP_PP$&qn#nT(eS zGEpvDU~uQmpO91 z%#|Btp4=$kmz(5fnJ@n*KagAGhjOd@NPaB0$xq~VxkK)hyX0=UNA8uM%6)RbJRlFs zL-MfvOnxqp$S-7p{8D};kIG~6xcpk4kl)B}gFG8NcKnzzVRMQL z)6<8hyXW&mXXWOVmK4X%E+{Q5$HRG!}*d0u`=d2XK46q)C9hMu37TUt^anr}}L_L!Dir1wipa?3;W z?I~=yOF@B4!ElFy0(*)a?h7umz~>Ab?$TA@oI{5@F%{TT)CGRZqGtHrkr(&^h@9bb zMqiLuGHX_@Lw!_$J9^s?f>TQ7-+3&N*_Fj~p2_S_-d;8tsoF>Kea0Jiny8sGzLun&=Ayh>O0q&c%$< zf`a0r+~WMgywEYZd2`AOLW}GvdQ70dqJWFgF-`^+*;DYC{F3tEqWqHb(6P?@#m@U< z173+P4!8&%>%3p=6hLwA?2@wb(vsOT3nKl_py9_DUY2|A>z@0$=lRLT`Hv{@T(QIJc!@2ja~Uzp^A}O*xnf7v z@e*5D=Q84A&tF7|=Zd|!j+fYyI+qbSp1+7v&lQ_f$4hK!oy&;vp1+7Wo-1~I9WSwS z>Rj3k$>`&hYepZZTr>JO<(koFSV)<#c4WAvo;lE|C7DAV-&vlv4RqnY$C)yeiI@dW(w6!F3 zu02Ie%r7h`EhsB2iyz0xBT9!q3iAqP<(6I>QBYQ1I4ifjAU|9~oLN|! z-@?&u0<@us^0_7UQCW;?LO#7HqNKRM5<0VmJq5lKZ9{RMmPKi*U3aXy{b5AgoOhqa z*$e-}kn;<#rEJU*=~FT(1S_HtNSSzfHY^an9PNtkFOAFU)!)az^P^@VzUxgO5b!z6uD zWS@-D>&Y6q*2y}N+Z!5NNUnN~wb#DrLha3r;EObXv1w&_ajM`35U-{05IaJ>T&!_k zrvZgrpvR!RspY{Jq?P5ha7rlP%}D2tMjcmHcthZ$aJ|+CG3xLU6MVjgUasLrI(5y` zov$~-wSwto@KB}W67@Mp9|Vuo>r2zh@+{ZQN_V7dR=Oiyv(gMlkS$!Poo7KmWzFAH+Owa1$#^1*a*9*@L zr;i&>h8s?X8%~BBPDZ8^e}*FuvN9a4AuGcTH^WU=hD%?Do30EuT^Vk=GTitx-1sxx z_%q!2Gu`;py|YV4x=Tm8OGh8~obJ+-?$Xo8z3$`E<4U=#K5qP(Zg`n)c$scEneKa; zZaA54x-#8xGTn4#y6MVv)0OFk>!vHyO;@Iyu1q&wS#El=-1xKH__N&jv)uTz-1xKH z__N&jv)uTz-1xKH__N&jv)uTz-1xKH__N&j`?~S>b>r{r#^2YCzpopAUpM}~Zv1`S z`1`u?_jTj%>&D;LjlZuOe_uC#SEtT$b?U5vZu|q?_=maI!}{3S2!=$Qommix4(J7= z!^a5M{YC-OJ~7u8l99BBD#9;| z8518JJ}o{vZb|sv;jcyvj>w64B;w78#Stqai=%IfToUt9TPBP-+kMIMUk5I;C-K-_%+zuM>r;%c2=e6;@; z^=f={e21v_qb25}=w8uRMc<_FME@}Q?&t@cUwm}*Bk|GBn=x<4)y7rC-5L0g{xl{$ z=FFJE_BSkMOw5>=2{BV*rpL^VxjyD~C#IOUV?K&oVt*Cx?`JWe#{Dd2S={`%s`w7^ z9pZizA8kXuFRs?Qeirv!+`_o`<37+_iK~d)9Je#B%KmEOYU2?fs&vP9h)<7CkM9>h zIDT0CnE1)@SI6HN|4{tj<9D}6ZZWb&PK%i>e%Rv478MEM3B?I_CoD{OJ>l(y_Y-y| z*0fA)c~#4qEw69+bj!Ds?rpiMWkq6Y;@HI76Yov@Jh3M6P*P;ltU^LYLn3>qxFK;FSp*>Cb~^Vn*nXEY4cFq_%;jM{JG7VHdSpy z+s3zzZ`-PEdfQ=bFKIiWZBg5WFh=L0gz8Qs);8@~rjKru?$p2ZzFptZCuz_0Kq9>e4K zHJ-q4@D!fLGx#GG;XV8lAL3&y!Ke5PUtlR#U^UiYEh?}c8?hN%u^l_G6T7e*dr*lg z>_aUM=~N~YV!}+MT8Py?Y!Xb0wf&}=PNu81_x3brncn7X)5m1G7T$qs$2FtOh2|2I zqZV0{Z>F1>=110&dZ%kcec1fmwV6I@9yh-=zjLjm&zl#`tL6=B|6FEPnXP7*sTD|& zgjic*ghWZK#2?juc!qQeuo?D}G)cF%LeElojtr5Zu0?Q+YX@|!fRiOx@_p7mwe-!l zRz9`qsXgzh4Ewi{=Zsm4)oO|`Fhpa(MEaFzwq9YC=+2nA)x!tDlT?t~1ByySb z=V}?k-^xh7CAqAULN1kA+%L1aNy@li?$GbivP$k}H6qZ8m1xcFXv0lt%P-N6UrRS` zk~FTAEbfqg+=^aEWCW796s@=mt+^F#xDIXkC^W?>+=UKYhsoTFMf?P{NWvkcnH=si zw{xYrldqY(xmAL=)=hVnL~y&ra=XOwO-ZnHKN67kUDBUV%MkujMslHy=N`G5Rg%k9 zQpk5?7B|RjzAUAzlrnCTTe(;6V1?YpFXeu&mB(3wFvM~v+Hn&GaTx}4C$hN`Wwxv~ zAsq4ChIZVEL0p1tE=3u);zm~EJyuIgu0aR}aXqrR1!dgr-rb83_nlS9=6aNIowVe3 zolnO-w!RGFN@VkElyR4|fi?nENrM-nU1 zmhT~%JJ5kO=)|ok;1=A-&3J-)@E$jtU0iP8-C^HVTDI8KWpgdcxJ+7dD}rn}w&Qk5 z;|_#l5I@m!kx=e+YyNI&$+eQiU6Rc8h*VlIn3b5!gP6htCWVX5Kvqd84{AJ;$OF=! z2N8^CcmS{Q01hG6wB!MFLlCzjid9JD%Sd7kT5%m(a}C;XIofg|lDQ7;xWcBWD|cct zzrqx*z%$&5*SHLe_%GBV4u{a*q;QqV;U;rCUo*9=Fo#)Tj<7<4SRo;-kWf}g6n9Ik zZ7JI%k#|TEw@Mps)s#qku9r;imHvDRL0E!V)S@j8p&ud<#0^N~U(l9+!5~&!-mr+< zO$t9Yw{yQF@;T|xHxY?vSb^908`R<~9Kt};i*K0$+-YjL%pBx8bC}D_5&jz;5yUl! z;$|drA(FTZt+*Afxdm-lfwue;lDP~i+=BMDL|36Jm)I6Eh5J#&O}LJm@C-NOHLk%T zEctMYHLR@7O)13ScA2!F$t_eYqaAw4C1Sp%;jbv z-!?g{kq~Z_P%f1SR!S8ADGB^cTJkeV;%Ab~Ph<>2WSnjF8|8AoEm!bEna_XAt=u5D zaiu)QcjR$yMi^d2EZ#sE-b82A;vyWvH8_H9CIn#!!Z}=yvFKnzpkEvtixwsX`fbn! zJOFW@X4~s3d#pv2ttYXpL?XXLSGUy;<`!hL%1zyRlfv!hcJ4ti25~wR;)%FuD6n@9XClg?v^xG;0z4nA`IpRjKu^@=BJp#jab0dSi~=}maDOkUmLL2 zgy1TZz}2QDzcd5+zRBU&=60@-ATE;-E|pL&mnbfiSgw`?ekv{bktEs@`M0#;MoH$! zlEQV;p6eu&Yo$MzTRu~z97xi*8F7f^4#aT_61fFkScyUW8iV;cvMo)uSj$?Iz*;j9 z#;oREX~{j3Xv5lRdC*!6<_=_AKC}x{xC;xoTS6@7QjWDvGFgjg#Ij1i%!@9zbk^DQ zXInXY08?10byh-ID=oQ0GICak(BNp8ehbUy@Yz##UHZrjiC*Ka35k-GMMSmy<8Vq zJ!LHBqY#OF181-rsjNmfE{3i-&>d>BV9*Z+!}$d+;4X~hZj9nCjJCP98<(;gIjqJw z?!slP#(3_=1Xg1r4`34aV=@om3f9_MawQMqDsDy*42oHS>tHaSyYUk)#_e2;JGdBk zaWU@UV%*EcxE}_;f`P6!cnk)Q!{FC2_zevH$S<&nU*khA#>ZTYC0vZpVDJSDmcn2K z47S5yCk%GOpi(#ffHA2srW1_m3S+u)m&xG~GY!V%bFrBTW1fLA@36wW%iZQ6tIQ!* z>CyoK4~u>aCYXnHKO-w~!+2O?VI-c1C4q+}iHD>$4@(}0GLZXa5D&{aJZMW% z_g7L5uC-s&qb)%tOGN{zr#|{17;$_LUAO|-Tx9OCJTIGDVQfoOIZ&s)+Yps6s%+H| z^!p_$`Sf_e-sxGs_NSjz(@fd`aV*gK9CTFYvcJeJl-8|H3%tg!lem85Ymf>i!U zB3DU&>bKh>x!7{h-Dtzl(U#lMj;o{_cSsu7AQW%F;7zneEr#I`rs4?N=~kAAc6m${ z25~8}`ISlylft!THTO#t4@d&{N)jt2nLDLFYY>Sz?sK)V3X{SmW;OTue6`^rtJOO` zgSgph@`+sMY9q?|YOG{h#2v0Ysqx99J@w?#W>+3nV^M%S5|d(e>>7k1*1oeF+1w@F z^!vozpo_Dtw(<{j$n%sunMnn6Bh9c)S?{@ zp_fVF3e$^~s%eYJP{K&?l{Q@o3^%%_k$hNty>8!0oscN)=lx~+GR=Sja zV(aQq-7iynh$e-*ZRyvb3v0X{fJx!M+#0ao)u@!q@2`^=AEB$wZ!a%YBEBO1`4=Q0 zh+7cHkI{vzF^JC~n-8FfpJEo5;5vSa8~GA$<`R>_*UTz@VpempMDa<9`wLo1I}zm8xjmA`N?XG#(Z%+FKEPleL^fArGWTEs_gh_jHLE3r`z4f>lF5U% zFSFH3=rZn=2v$iPcdMqw9Z2NAG(Sy>l_xtTk#|aezHf6X8*xZvHQL#H--5xmU!{HX zgC>Q4G6Q+QthT-3T1oKrIlh!69+dvJ_Z`P7SEu+gpx%9CDU7mOt5ffixe2id2rS;`+W);_))wYK3 zlPE5>eS-upktBX1$$T3zws#iGjY#Ag46?e?*V>~ss>>yCpCs~0TQ}QqpCogi+6}A( z-;XFHvPOn*pN!-l$>n}2WVOuVL7B}hQp$r;#shK}Yvg|JN4QJ#24u5B#_H8$sJt&c>lnKFcr z$Vi(HU&&Rhm8-cya`~VX@^zWTf5>b;ETw!=%J@r}&)4M^zAd-%6}gRX$sJrEckw>C zpAXC9d`UG`%QY*I&1xCKS7anBWDIx8IDRD)xKgg*8XHR?SIRZqEwi~<9^(##$#|}m zt9Vdmag)sFF1eLkk;$GH!oh_gImJF>Z4=5vqS#@+HbD-nY@u0>xf$wkA_t650{IiVYVq4R%=5ER5Kc$dw$}D~=v$;r0 zSs`V%$9+I<;U2k_tK>FT$sLx?w{2^PKrHtn(eg!YxtbS;WHvvrxqgRjRl6ZiT%zMT zzj^Gb75Fu70a(GWxq<7shHLD3IXBjwiT>XXE=2^ukN7d);!f_s0Dk%3p62@CpZUE1 z9$&HbVi8~B^W4jwe4abFnJZb%ZQR9bZe=Ckmds{S+X_TS-G0C#hj|IT*-T*N*6Bj4bs`~!C>^?b=s zHLj9UXkJ{@q<%h&lQzQiT`SKS;qS+IhC(lGdMdtAeR z@t^!aj{slyLg(w;r}6S5erEl-bZ`Y<;aA+wo!rZpxR=|x&U@!nf(!X8Cp_+D6@TA& z*j&Y>T*kHapVDrP;J*J4fbVlzeLu$!e=P(2wLo3m%x&Dl&D?zap*9Zg zE>&&sRN=dzCtIyx{i#avcMDFs`8=2L-R~CVrxtvdmHhhDhUuU=+KiX?T*}pTY4|2M zGAmRb@;QFOm$_GCY^eMHcf;))zQkAg0+(|sdhm}YoZ`?Ee$$21H-uWQeBe%3PP-cX zsfXK}uL`tv{C|8Ga4LG?4)`^f^5Wea~lnw1fu?1&4*)y;vcxevk|eP`ELh8 zOWl#Jf#8b3D?2h#tvLyByZ408x_$I_xLEIb@|f#SU0Xjo_&WD+8K35dd_h~3-Non_ z@Ru+DY*W3|)(ag^Sgq*_)MNOewHdGD8h*tcT*pQH%8pO1;6Ggcu!qlZ4YzSK-{#+} z{rG*iwSUYnz1%n&TuG+&v6?l3F*hIlkiYZ$=HLA8|81ODZvHpHU(^5F(Rf*(T3Pm8 z1efyV?;_o&4$bM){x^b^+ynhqN~7TR#>Rg9Qr$yizK$1xCE)c8y}sdpjzc+;_kS7x z3pv0o{&Cv+;4;3(B@MMy&%$+VG&U3A_`&tIU#NYNf*mK&@dv)$HYTelTWO9BsW zxSLqPY9A+T=4?^5wFZtg)Xnk0@(6_TC;PYa#Qn0NA)Hy&yp#9yCwz&|B91R`1D|Qc z=Qd3@E0ym$nxvvGJ@vuuyx;m-Xpev6vwV#&^KBiKXl@JTXZ)NS{bL%etshGucn@?8 z=wYtrJ@%i^dw93QubCU@(+_UqYJSCyT%z|p&dcpizqe^QYRjj|vgAe`+wr$98^>v% z9~dA#HLrEVAz%i0eeg5h=GdAobykDm_6E}MpmG84-Nq#EcNey&Q_Wq+ke3Iz$Lc2A ztQPIlFq*EDjkl6O{qT69(y0DBN8<$w{=L5MhOj-VgWPRL{Cv9CsR4Jny|$f7C9Am8 zN|OUN*H1}YP6-4aJ-8!nfAOx54!+4poTpsKm+ZLVdcMKe`66HBbNmCJ=kt7y5Aa^z z%Ln-^9|HI^|DdzbxsXpBbvF77T*wc6A-~0E_%dJOBD;#^WxmH}`RviD^24s%@XcxG z1AG|ZQ{Hoj3pusGsU42KsAJmpZ|CFlMOaG)ch{9~4pctS+%lRH5uDiZ?Y%n zw-YwjbM-VvMSxCt+UH?<r!Q+Mqu zrMom-`@YV$@P*MdtVZd#%96uZzjgtr5f8t>u?M)t1 zn*2vA^S1kEIcjTex-{+lz}>u;@A9|G>v-_gwm81a3gxhN#kRYW$Fs6F7g{g<^4Aa6 zYL8W~U42-4!D_?U5+H>Zai8tc`Dd=x)YVEHs}~pWAN(T^Xh^p2*NEn#@%iFvb`M|I zp?Yt5=f<>+rr=T45T1tYho!#SZ&R|pibhiNzk_4TAy%@A)qIHm;KQy3tl8z;9Pl69 zt>JP9_i>-g57sp2O+U1x8>7nBNkAVSMW8mS_EB!O8v0kZRej;uQk#J@k%12N{H4~rKK1D41!-G=rmQ{PBd;)9e>uQ32xOKp%6RNJw?S6fZZyie(d=qf!`_JIme82%0 zvNCX$Q^WUofE(@1jjyd0zTS$cqob+z*F2mYCqMR>k<|K|_JNO}=WtHWc&5Wyg&@$iw zM=N8kdp;39a1@#D=KyeIgYx}d0kS~n1vQx>?$TL=yqE9r39GvuJQ~kAG4LH$=uE^q zI$^yv2gib@zA>uoNN#T4y!>Hp>U> z{3pu?{@$3D+Bp8R`|~uGb9G_o41f>wGrsDy7_WDDYT(-GY#nB;dv4NB(-5`}G_umD zF&X1>4POk};u?FmKKKuA4O~aoST49LQukUdz1b^qPQIVT1C3GBH2ghDe|u;ee2}Xf z=aeUl=F81fi2&QOop;$Z_?5Mc?{)Z-JKnyl{y2c$qim;_x5vlL{XNrfCmQAeH*go1 zc=lKYt8EVK;9jn`{eou8GrLO9H{ar$f+KY;<*r@eSehB%;{HI(f5RQ0Sj(;cHtm61G?gJ!*SPv&EJYT;Ip?k4nD(OfqIHxn)u=N9JecHZhjp& zwmd$)Xi5|EU^VHlxt5=Mqy48Et`^XUL~kDat-3C(T(+}{8q*A#4_0zFH*y_U@qpUP zoBw8W;b;#^?}?$Qyz^U$PaNFJ4|QdkD-G?qG;8YDbMCWq2i$UOPTlh3Kiv|J1xFhC za=@8?x7(Rn=7*~fxHAj`<;Jn`&2z%z2k(P#9{Q;Tm+NfYx?wiPXHPATM<;Yjm3Qz1 z{$AJ7oa!+nMg1H&5qPz)J_79nCknd;LU*=sW`R4ihji!SI?$O5{(G!w?&!b5)62e{ zXt-9)&QNI5s`8(t{BOqv>3|#D4OPa$! zk2PZTpM^7vo=@-@{@PL!qN_5FwGNJd^tgsM-~RN0U)U8*?i#Pt1wPB#K%2m^bX|YC zkH=c}Z3S2I7jF5hRCwDSchz5aTo*cq?A-CBVpH&sxPBXy&UjxEKdAwh3eHO z!aw{vh?j@;bL5*xU>~6|_;=^?5YS)V!m5**kHr1_%4zj_475~mk6$yaZ#QXL4K_}={n_fJnfh}?Vez|-=}_ge4q2KqgD8I&*s64w_$$x+mAv+ zZ>k<^PwH5`T_%KN`-MY6^UbFL~dAZVdc$;4U5f1)t+z_!OVB`*%IZm-(Xe&7&*RZGFG+~BPNJQ^C8M@>WHugh_o3y8mwbv( z+FdXg_}}Le|JWIS;J>fXT_~Gg|D^L|Je*$L>QvMOYjL!icc6|P$o~V~iW5sy{ZLL8 z+8;SVO5A;by|+(Ps{AM67&YPfu{<7d*R8TDXsfdqano&?;HcXKH|8d$^qcIO_QX`;4bmm2SUET}*3ZkPkjec!{e^zuNtR3E3ie{`zh zX<>deymLG_**f5$q3k<3s{Z$I^3wEJAq3j1+*0#><*1=`n{&F`y!kOxJSPwqYavn>*DB~Rrj%| z>-R*^a9sCT6rF1D)24eKe7|8kaKPow*#+v`54$6i`yIQ+&`=sW+?yY81$XMs{B_&q z@xaefjt6zyUBlRqS4JOerDnr;a3NpHJATM@Nc@7jR)=cnfDz<`!$YZ zL-$kTN^gd6bI_2-9!nqmCg9&k#KY;Msv(bUmMmy={($1t*vA@bfDP$9RcItG-`C4d z1P$fbiJ)P6PmZdl@c&yubn2k$tBW}c{n2-6$!ELw$<8T-5!bIGIdvQ7L z!>=(Jzrnk>7JtRZxC@_P34Vr8u@sMBIac5?til@n8f#IB-=fNd<5d%B;_;zLFrDzJ z>0)xQ&Rk|Dm;^J`6q+RSBXhe+HFui3OjmP{xz}_z_nAMMp5{;HO*7iOW8O76W|diG zE;DP)8Z+M13d{rvk}z|nL`a00CQ%Y)@+4MbO}@lSyeW_bNjB4^owPS4a)zXu>!g!( zF=f(CdYS7bP14NGk|CL9zVwq^^8?9~yUcTPkKAv*kcZ`QvjPSo@=J&<|4e%{5Of6G z91cbZLJ@{=L?9ATh(-)z5r=rRKnq{3NkCV0LwEE*Pn?Of&BvA9 z`l28DV*mzX5IUiy@BJY-7ugt!VK@&HaXyA)I7Z+CjKoNc!nv4;(YO#}a1qAhVqAht zk%P{@w-bFXKiUEa_Fwvt+7-myEf-9M~Lk3BFHu*aSl z*5H2@CIejwuC7(}_T-RSNa( z$+!Z*6!ZWv)XlSzHeH@CrPKQ>m0k&GzA6QpJ|`WQT4I6`jMiv_5clXu+Xl6;c}M{) zl_!GpFdP@y{}^0p1GoxPF&-0eHGp;ioNvnN_<0_Hd<;ebreio}U?vK24S;J=1fV@8 z0=OJgG1Y!$Vit-q5#PfYlmIxxC2lq*Syw8qLn$U=DvEIj?m!uSh##Wd@?pLHKiq*i zxE^zH1LoN~-^U%e2{&Ut{trLEE%=GO`xE>Sci@NkzI}cdfE#ctZo_T(5q^xH;CAcl zZp+7iiu-Us9>9Zm5D(eogLv5fe}1v;HUQfPq6?GVgVku&w=~!OWccJ;ZZjg z3$Or>*)Sf#gSZX%;!ZpcgCKbnQTRU?>rZn~>Cvk>C8$uGMp*32eHFD7k(~yTeOv6=} zgh^kEA*s%^Av;ypLs=d-X{(lZy1^j_lmNKPoD)Q?6^-hqbOrL9*+Mb+0eC|n@>i#F;I_s`a zmB#M(bv4@5`3EE4_aBGJjs8OrhERmty3r4r?*B5koHV@+;iOZLga{;Anoa~ttx~8m zHN|qK>6RyW`R1g{^QClpf2Go&^Lds6O`nsFa7#=yqA?zkh;fe&Vl206SPPqjQk0!A z|IGFM+F*)}tOKT4okp)F02pZRmg5Y2XAsUoDh4ADQ}8`>#1Jc8&b5BDOp-9g`pd=? zbhPEs+G<}a-xX6Z!`48c6Q*FY^`+=+zwI;9x)tXG=;B@tvuEYbD*MmF`M4az0W05u z3+(-y0L-*{2Ha34;%0Qid;r~1fGcq&df-fq!f5Nh5{AsN-R@-fbk4(C`$viEWnF{G9m&v_uINIa596cpMx=BCDk~oQx zbV(Bukn()O|3m%8dFaZ-W$<~dl#7Kn1NSyWtq?@Ek zx@1W|H?83?7>RJSLI-rgnMg-J48|}7Nq2RuE|?DG)hFdO{>hG9i*A zArMKHP}}Poj*%FPOE4an;|g3EkTZjjEd6aBWCY|wqO_KFzMMG6=0%jvjU;I!$o`GqXPtyNYpwdXW9B;5NznW1Q%dpU0Q8T zNtM3RN>Ze!WJ-w5*+^T~N6+0zh;))pwtWm2=Zj)Wi<1wqy&Ykp_Xf&F$N3x7$&neqF#fIth2yqjGaAauFqH~vD{i(fKLdaW$kjUbNXD%WcdMhDd zBZNfHTGf%gr+CwAgg^@+Wa!c@>$d*eo9lgqz&(V}-)~%Z{noKD!V$u6BZSyCUUk#u z&ph#++X>-sCh*p;H*HvVne#`#eUZS?Awo!T)20pU-0wR!6F7Q+5R%%oW!sImMd~F4 zj=n&M{a>!S=F)ZV-*EFNffEKH{IMb zxqjO&+b?e*l#dV+{Kp*|)?fbVb?5yfp^dK)LPSCc_Llr`%ROh~{d;FWhd1)W|5!1? za$JNEjSxZ!5TH8<5T2#*hZ7gT14JM^zn9MuLhiEe^m;;I4=Zt+pRG4tcRfP;KSU&B z3=9SYyVQPSEX83fIPSFqza|`eiVz7!?7sgYV+b&|_sm3l zWJ-JFi1$eRNcqUhBSS~F9x;wQaAf$%vqvgNesE;u$dRMusP|~>=&YmVqbrXN9o>4= zIQqcR;iJzUtsMQq(UGG^j*(;DWAS6COq zw&BkH8c#Mco3I=H+1XKxp@vNqb$#_D~7jtnR=!JX_{3jRujp>O&eEl+_Z4vrj2J@aY1!zQjc2!kOQL?UrQh?m6h7gRBs$bgtkq;%@_ z7gI4_^9NK3G~O`ZH}5mw2MMm@q=9@fWgh&}FYY%_9J=P3Lm)sDghSWd3>T!S1lNIN z6*i6hfDY&1JXzwJL*|M5fAJ;rV49)im?05?kTB^c%Lz&QM2VN&w2da(A)}}Dj8D~a z@odr8MccV#JRt_upcahs^Jun*D-}yUQ1V%mQ}E&RWHr%Tmg^H|zAi8YF%d+y&H+~?_O_bVI0JXi8m@EF^8^w!_!M@|=zQMshq0%=P<47uc zcvsu3*|TT0?K&JyRf()9d<*s4eKv=n$j@v$@RTq+oc8AC%ym8sOqYi{ouG2f^@ zX!z-BTk4X_?pyGSKea6_r&8smZGZa3f4otB#;W`Cq9KfsgoUGu7GU$17Q|#iFXT%K zqG>6u6th7^&_p9_K5{+;R3%{cn!TDo5TNIq4>xqed#@{9%Iol6CwG$;Ha~5;BstLJ zdh0D$Q$TdXyRg17khU*{Z@0FZbC%k1!64pPZQBuh?T~hY09;zYwSsUY6Q=`%zZSCQ z>O+Uj)sS5ZJK-kyHiN76^k7jHT6^GD^Nt?#C+3=Of17iRgPHvRC=o_OK-_L78A8%E z49WKhIR05&Xi&;yJSI2TcNG3(AKixlFPPl;C^f6zfOn~*OY|qdPpWH-GHus-~NUQIYhXl#2ld$&BgTGoq&}muz zi=bwm{<9&qXcI$3hP;&&kTRkoA4}=9koT90T2K=uHw08h0Tl9jrX5N>5Y+s*XIncs z(%Cx?o4+>y)%^A0osaKpyP`SfnX&%Lv-ceO!J$28U%7sUC)T`q#=gg^#=xe5flUL{ z_!O4hc^D#}`U>=IiMiWmToGIL>P?#t?K%7GJ%={k^y;$M6*Jo0u`T9{bXk?{;}ow* zO9@D)OxvSLdIDW6BuV=$^uZGck!E@tp-1!@&p#HA575 zvj3I+`(L5^y{@k*YI2Fg-uQs#a_^bh;gzMPU%CSjncey^hsW)_H6z(POZ<)Qf0Vsm z=kxA{mIV%b_(4sUrxw1??vY)$r&!^z=O1M+)v$&Au;rI7jYf*;?1iqdBYmI!s-Wkd zY{Vyj)f>3d?!2z(kX_EenuhG`MjDV=+4lB1XS-YuId#9|%KE~N9XXrZDm*Jf1MKXm z(X!S#K94LQ8!bAde%6I)STH@U_~Je_ihOGiKs=*o;-VxlOq(ERYP(Y|USj;M)(r8i zMv33e=CthgBPN~d*%&q49*!$>9(Q#JDzhYq`OglCyTh=D8Z>zC1dhrG36MzihjmQu`xiw|{hC)lJ)1abIQNd^VlWr$3A6 zMkr|@MBFHFL}BZnb#

{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 diff --git a/scripts/developer/utilities/lib/fonts/hifi-glyphs.ttf b/scripts/developer/utilities/lib/fonts/hifi-glyphs.ttf deleted file mode 100644 index 3db48602b1eb845238497d2f3750fa7d281ccfbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30784 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 diff --git a/scripts/developer/utilities/lib/fonts/hifi-glyphs/icons-reference.html b/scripts/developer/utilities/lib/fonts/hifi-glyphs/icons-reference.html deleted file mode 100644 index 99e826e0b9..0000000000 --- a/scripts/developer/utilities/lib/fonts/hifi-glyphs/icons-reference.html +++ /dev/null @@ -1,1056 +0,0 @@ - - - - - - - Font Reference - HiFi Glyphs - - - - - -

-

HiFi Glyphs

-

This font was created inHigh Fidelity

-

CSS mapping

-
    -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • - - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • - - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
-

Character mapping

-
    -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
  • -
    - -
  • -
-
- - - diff --git a/scripts/developer/utilities/lib/fonts/hifi-glyphs/styles.css b/scripts/developer/utilities/lib/fonts/hifi-glyphs/styles.css deleted file mode 100644 index 66277740fc..0000000000 --- a/scripts/developer/utilities/lib/fonts/hifi-glyphs/styles.css +++ /dev/null @@ -1,421 +0,0 @@ -@charset "UTF-8"; - -@font-face { - font-family: "hifi-glyphs"; - src:url("fonts/hifi-glyphs.eot"); - src:url("fonts/hifi-glyphs.eot?#iefix") format("embedded-opentype"), - url("fonts/hifi-glyphs.woff") format("woff"), - url("fonts/hifi-glyphs.ttf") format("truetype"), - url("fonts/hifi-glyphs.svg#hifi-glyphs") format("svg"); - font-weight: normal; - font-style: normal; - -} - -[data-icon]:before { - font-family: "hifi-glyphs" !important; - content: attr(data-icon); - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -[class^="icon-"]:before, -[class*=" icon-"]:before { - font-family: "hifi-glyphs" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-hmd:before { - content: "\62"; -} -.icon-2d-screen:before { - content: "\63"; -} -.icon-keyboard:before { - content: "\64"; -} -.icon-hand-controllers:before { - content: "\65"; -} -.icon-headphones-mic:before { - content: "\66"; -} -.icon-gamepad:before { - content: "\67"; -} -.icon-headphones:before { - content: "\68"; -} -.icon-mic:before { - content: "\69"; -} -.icon-upload:before { - content: "\6a"; -} -.icon-script:before { - content: "\6b"; -} -.icon-text:before { - content: "\6c"; -} -.icon-cube:before { - content: "\6d"; -} -.icon-sphere:before { - content: "\6e"; -} -.icon-zone:before { - content: "\6f"; -} -.icon-light:before { - content: "\70"; -} -.icon-web:before { - content: "\71"; -} -.icon-web-2:before { - content: "\72"; -} -.icon-edit:before { - content: "\73"; -} -.icon-market:before { - content: "\74"; -} -.icon-directory:before { - content: "\75"; -} -.icon-menu:before { - content: "\76"; -} -.icon-close:before { - content: "\77"; -} -.icon-close-inverted:before { - content: "\78"; -} -.icon-pin:before { - content: "\79"; -} -.icon-pin-inverted:before { - content: "\7a"; -} -.icon-resize-handle:before { - content: "\41"; -} -.icon-diclosure-expand:before { - content: "\42"; -} -.icon-reload-small:before { - content: "\61"; -} -.icon-close-small:before { - content: "\43"; -} -.icon-backward:before { - content: "\45"; -} -.icon-reload:before { - content: "\46"; -} -.icon-minimize:before { - content: "\49"; -} -.icon-maximize:before { - content: "\4a"; -} -.icon-maximize-inverted:before { - content: "\4b"; -} -.icon-disclosure-button-expand:before { - content: "\4c"; -} -.icon-disclosure-button-collapse:before { - content: "\4d"; -} -.icon-script-stop:before { - content: "\4e"; -} -.icon-script-reload:before { - content: "\4f"; -} -.icon-script-run:before { - content: "\50"; -} -.icon-script-new:before { - content: "\51"; -} -.icon-hifi-forum:before { - content: "\32"; -} -.icon-hifi-logo-small:before { - content: "\53"; -} -.icon-avatar-1:before { - content: "\54"; -} -.icon-placemark:before { - content: "\55"; -} -.icon-box:before { - content: "\56"; -} -.icon-community:before { - content: "\30"; -} -.icon-grab-handle:before { - content: "\58"; -} -.icon-search:before { - content: "\59"; -} -.icon-disclosure-collapse:before { - content: "\5a"; -} -.icon-script-upload:before { - content: "\52"; -} -.icon-code:before { - content: "\57"; -} -.icon-avatar:before { - content: "\3c"; -} -.icon-arrows-h:before { - content: "\3a"; -} -.icon-arrows-v:before { - content: "\3b"; -} -.icon-arrows:before { - content: "\60"; -} -.icon-compress:before { - content: "\21"; -} -.icon-expand:before { - content: "\22"; -} -.icon-placemark-1:before { - content: "\23"; -} -.icon-circle:before { - content: "\24"; -} -.icon-hand-pointer:before { - content: "\39"; -} -.icon-plus-square-o:before { - content: "\25"; -} -.icon-square:before { - content: "\27"; -} -.icon-align-center:before { - content: "\38"; -} -.icon-align-justify:before { - content: "\29"; -} -.icon-align-left:before { - content: "\2a"; -} -.icon-align-right:before { - content: "\5e"; -} -.icon-bars:before { - content: "\37"; -} -.icon-circle-slash:before { - content: "\2c"; -} -.icon-sync:before { - content: "\28"; -} -.icon-key:before { - content: "\2d"; -} -.icon-link:before { - content: "\2e"; -} -.icon-location:before { - content: "\2f"; -} -.icon-carat-r:before { - content: "\33"; -} -.icon-carat-l:before { - content: "\34"; -} -.icon-folder-lg:before { - content: "\3e"; -} -.icon-folder-sm:before { - content: "\3f"; -} -.icon-level-up:before { - content: "\31"; -} -.icon-info:before { - content: "\5b"; -} -.icon-question:before { - content: "\5d"; -} -.icon-alert:before { - content: "\2b"; -} -.icon-home:before { - content: "\5f"; -} -.icon-error:before { - content: "\3d"; -} -.icon-settings:before { - content: "\40"; -} -.icon-trash:before { - content: "\7b"; -} -.icon-object-group:before { - content: "\e000"; -} -.icon-cm:before { - content: "\7d"; -} -.icon-msvg:before { - content: "\7e"; -} -.icon-deg:before { - content: "\5c"; -} -.icon-px:before { - content: "\7c"; -} -.icon-m-sq:before { - content: "\e001"; -} -.icon-m-cubed:before { - content: "\e002"; -} -.icon-acceleration:before { - content: "\e003"; -} -.icon-particles:before { - content: "\e004"; -} -.icon-voxels:before { - content: "\e005"; -} -.icon-lock:before { - content: "\e006"; -} -.icon-visible:before { - content: "\e007"; -} -.icon-model:before { - content: "\e008"; -} -.icon-forward:before { - content: "\44"; -} -.icon-avatar-2:before { - content: "\e009"; -} -.icon-arrow-dn:before { - content: "\35"; -} -.icon-arrow-up:before { - content: "\36"; -} -.icon-time:before { - content: "\e00a"; -} -.icon-transparency:before { - content: "\e00b"; -} -.icon-unmuted:before { - content: "\47"; -} -.icon-user:before { - content: "\e00c"; -} -.icon-edit-pencil:before { - content: "\e00d"; -} -.icon-muted:before { - content: "\48"; -} -.icon-vol-0:before { - content: "\e00e"; -} -.icon-vol-1:before { - content: "\e00f"; -} -.icon-vol-2:before { - content: "\e010"; -} -.icon-vol-3:before { - content: "\e011"; -} -.icon-vol-4:before { - content: "\e012"; -} -.icon-vol-x-0:before { - content: "\e013"; -} -.icon-vol-x-1:before { - content: "\e014"; -} -.icon-vol-x-2:before { - content: "\e015"; -} -.icon-vol-x-3:before { - content: "\e016"; -} -.icon-vol-x-4:before { - content: "\e017"; -} -.icon-share-ext:before { - content: "\e018"; -} -.icon-ellipsis:before { - content: "\e019"; -} -.icon-check:before { - content: "\e01a"; -} -.icon-sliders:before { - content: "\26"; -} -.icon-polyline:before { - content: "\e01b"; -} -.icon-source:before { - content: "\e01c"; -} -.icon-playback-play:before { - content: "\e01d"; -} -.icon-stop-square:before { - content: "\e01e"; -} -.icon-avatar-t-pose:before { - content: "\e01f"; -} -.icon-check-2-01:before { - content: "\e020"; -} From 4bef033d6f827c70bb4dd230378e7ccf869e4e6e Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 12 Mar 2018 13:05:03 -0700 Subject: [PATCH 262/267] cleanup, don't compress rcc file to fix corruption --- .gradle/4.6/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/4.6/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes BUILD_ANDROID.md | 2 +- interface/CMakeLists.txt | 22 ++++++--- .../qml/+android/AddressBarDialog.qml | 43 ++++++++---------- .../qml/hifi/+android/AvatarOption.qml | 14 +++--- .../qml/hifi/+android/HifiConstants.qml | 30 ++++++------ interface/src/Application.cpp | 15 ------ interface/src/Application.h | 8 ---- .../Basic2DWindowOpenGLDisplayPlugin.cpp | 2 +- .../src/display-plugins/CompositorHelper.h | 2 +- .../TouchscreenVirtualPadDevice.cpp | 26 +++++------ libraries/shared/src/shared/Storage.cpp | 2 +- libraries/ui/src/VirtualPadManager.cpp | 5 ++ libraries/ui/src/VirtualPadManager.h | 6 +++ 15 files changed, 86 insertions(+), 91 deletions(-) create mode 100644 .gradle/4.6/fileChanges/last-build.bin create mode 100644 .gradle/4.6/fileHashes/fileHashes.lock diff --git a/.gradle/4.6/fileChanges/last-build.bin b/.gradle/4.6/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/4.6/fileHashes/fileHashes.lock b/.gradle/4.6/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..df8552e6be70ec10245728042f4fadb35130f63f GIT binary patch literal 17 TcmZR+F1g?P$d(W03{U_7Ij01j literal 0 HcmV?d00001 diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md index 3d6d056d79..8c9263b6e7 100644 --- a/BUILD_ANDROID.md +++ b/BUILD_ANDROID.md @@ -53,7 +53,7 @@ Enter the repository `android` directory Execute a gradle pre-build setup. This step should only need to be done once -`gradle setupDepedencies` +`gradle setupDependencies` # Building & Running diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 3ed5445493..49877cacc3 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -23,12 +23,22 @@ set(RESOURCES_QRC ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc) set(RESOURCES_RCC ${CMAKE_CURRENT_SOURCE_DIR}/compiledResources/resources.rcc) generate_qrc(OUTPUT ${RESOURCES_QRC} PATH ${CMAKE_CURRENT_SOURCE_DIR}/resources CUSTOM_PATHS ${CUSTOM_INTERFACE_QRC_PATHS} GLOBS *) -add_custom_command( - OUTPUT ${RESOURCES_RCC} - DEPENDS ${RESOURCES_QRC} ${GENERATE_QRC_DEPENDS} - COMMAND "${QT_DIR}/bin/rcc" - ARGS ${RESOURCES_QRC} -binary -o ${RESOURCES_RCC} -) +if (ANDROID) + # on Android, don't compress the rcc binary + add_custom_command( + OUTPUT ${RESOURCES_RCC} + DEPENDS ${RESOURCES_QRC} ${GENERATE_QRC_DEPENDS} + COMMAND "${QT_DIR}/bin/rcc" + ARGS ${RESOURCES_QRC} -no-compress -binary -o ${RESOURCES_RCC} + ) +else () + add_custom_command( + OUTPUT ${RESOURCES_RCC} + DEPENDS ${RESOURCES_QRC} ${GENERATE_QRC_DEPENDS} + COMMAND "${QT_DIR}/bin/rcc" + ARGS ${RESOURCES_QRC} -binary -o ${RESOURCES_RCC} + ) +endif() list(APPEND GENERATE_QRC_DEPENDS ${RESOURCES_RCC}) add_custom_target(resources ALL DEPENDS ${GENERATE_QRC_DEPENDS}) diff --git a/interface/resources/qml/+android/AddressBarDialog.qml b/interface/resources/qml/+android/AddressBarDialog.qml index 50552f0d3b..b8d6b5e270 100644 --- a/interface/resources/qml/+android/AddressBarDialog.qml +++ b/interface/resources/qml/+android/AddressBarDialog.qml @@ -76,33 +76,33 @@ Item { HifiStyles.RalewayRegular { id: notice text: "YOUR LOCATION" - font.pixelSize: (hifi.fonts.pixelSize * 2.15)*(android.dimen.atLeast1440p?1:.75); + font.pixelSize: (hifi.fonts.pixelSize * 2.15) * (android.dimen.atLeast1440p ? 1 : .75); color: "#2CD7FF" anchors { bottom: addressBackground.top - bottomMargin: android.dimen.atLeast1440p?45:34 + bottomMargin: android.dimen.atLeast1440p ? 45 : 34 left: addressBackground.left - leftMargin: android.dimen.atLeast1440p?60:45 + leftMargin: android.dimen.atLeast1440p ? 60 : 45 } } - property int inputAreaHeight: android.dimen.atLeast1440p?210:156 + property int inputAreaHeight: android.dimen.atLeast1440p ? 210 : 156 property int inputAreaStep: (height - inputAreaHeight) / 2 ToolbarButton { id: homeButton - y: android.dimen.atLeast1440p?280:210 + y: android.dimen.atLeast1440p ? 280 : 210 imageURL: "../../icons/home.svg" onClicked: { addressBarDialog.loadHome(); bar.shown = false; } anchors { - leftMargin: android.dimen.atLeast1440p?75:56 + leftMargin: android.dimen.atLeast1440p ? 75 : 56 left: parent.left } - size: android.dimen.atLeast1440p?150:150//112 + size: android.dimen.atLeast1440p ? 150 : 150//112 } ToolbarButton { @@ -111,10 +111,10 @@ Item { onClicked: addressBarDialog.loadBack(); anchors { left: homeButton.right - leftMargin: android.dimen.atLeast1440p?70:52 + leftMargin: android.dimen.atLeast1440p ? 70 : 52 verticalCenter: homeButton.verticalCenter } - size: android.dimen.atLeast1440p?150:150 + size: android.dimen.atLeast1440p ? 150 : 150 } ToolbarButton { id: forwardArrow; @@ -122,10 +122,10 @@ Item { onClicked: addressBarDialog.loadForward(); anchors { left: backArrow.right - leftMargin: android.dimen.atLeast1440p?60:45 + leftMargin: android.dimen.atLeast1440p ? 60 : 45 verticalCenter: homeButton.verticalCenter } - size: android.dimen.atLeast1440p?150:150 + size: android.dimen.atLeast1440p ? 150 : 150 } HifiStyles.FiraSansRegular { @@ -140,25 +140,22 @@ Item { Rectangle { id: addressBackground - x: android.dimen.atLeast1440p?780:585 - y: android.dimen.atLeast1440p?280:235 // tweaking by hand - width: android.dimen.atLeast1440p?1270:952 - height: android.dimen.atLeast1440p?150:112 + x: android.dimen.atLeast1440p ? 780 : 585 + y: android.dimen.atLeast1440p ? 280 : 235 // tweaking by hand + width: android.dimen.atLeast1440p ? 1270 : 952 + height: android.dimen.atLeast1440p ? 150 : 112 color: "#FFFFFF" } TextInput { id: addressLine focus: true - x: android.dimen.atLeast1440p?870:652 - y: android.dimen.atLeast1440p?300:245 // tweaking by hand - width: android.dimen.atLeast1440p?1200:900 - height: android.dimen.atLeast1440p?120:90 + x: android.dimen.atLeast1440p ? 870 : 652 + y: android.dimen.atLeast1440p ? 300 : 245 // tweaking by hand + width: android.dimen.atLeast1440p ? 1200 : 900 + height: android.dimen.atLeast1440p ? 120 : 90 inputMethodHints: Qt.ImhNoPredictiveText //helperText: "Hint is here" - anchors { - //verticalCenter: addressBackground.verticalCenter - } font.pixelSize: hifi.fonts.pixelSize * 3.75 onTextChanged: { //filterChoicesByText(); @@ -228,4 +225,4 @@ Item { } } -} \ No newline at end of file +} diff --git a/interface/resources/qml/hifi/+android/AvatarOption.qml b/interface/resources/qml/hifi/+android/AvatarOption.qml index e7056baa36..85d7e52eb2 100644 --- a/interface/resources/qml/hifi/+android/AvatarOption.qml +++ b/interface/resources/qml/hifi/+android/AvatarOption.qml @@ -26,13 +26,13 @@ ColumnLayout { property string methodName: ""; property string actionText: ""; - spacing: 4*3 + spacing: 4 * 3 signal sendToParentQml(var message); Image { id: itemImage - Layout.preferredWidth: 250*3 - Layout.preferredHeight: 140*3 + Layout.preferredWidth: 250 * 3 + Layout.preferredHeight: 140 * 3 source: thumbnailUrl asynchronous: true fillMode: Image.PreserveAspectFit @@ -81,7 +81,7 @@ ColumnLayout { HifiControlsUit.ImageButton { width: 140*3 height: 35*3 - text: type=="extra"? actionText: "CHOOSE" + text: type=="extra" ? actionText: "CHOOSE" source: "../../../../icons/button.svg" hoverSource: "../../../../icons/button-a.svg" fontSize: 18*3 @@ -102,8 +102,8 @@ ColumnLayout { Image { id: tickImage - width: 35*3 - height: 35*3 + width: 35 * 3 + height: 35 * 3 source: "../../../icons/tick.svg" anchors { horizontalCenter: itemName.horizontalCenter @@ -114,4 +114,4 @@ ColumnLayout { Component.onCompleted:{ sendToParentQml.connect(sendToScript); } -} \ No newline at end of file +} diff --git a/interface/resources/qml/hifi/+android/HifiConstants.qml b/interface/resources/qml/hifi/+android/HifiConstants.qml index fbdf60dcb0..4c161da259 100644 --- a/interface/resources/qml/hifi/+android/HifiConstants.qml +++ b/interface/resources/qml/hifi/+android/HifiConstants.qml @@ -22,26 +22,26 @@ Item { Item { id: dimen readonly property bool atLeast1440p: Screen.width >= 2560 && Screen.height >= 1440 - readonly property real windowLessWidth: atLeast1440p?378:284 - readonly property real windowLessHeight: atLeast1440p?192:144 + readonly property real windowLessWidth: atLeast1440p ? 378 : 284 + readonly property real windowLessHeight: atLeast1440p ? 192 : 144 readonly property real windowZ: 100 - readonly property real headerHeight: atLeast1440p?276:207 + readonly property real headerHeight: atLeast1440p ? 276 : 207 - readonly property real headerIconPosX: atLeast1440p?90:67 - readonly property real headerIconPosY: atLeast1440p?108:81 - readonly property real headerIconWidth: atLeast1440p?111:83 - readonly property real headerIconHeight: atLeast1440p?111:83 - readonly property real headerIconTitleDistance: atLeast1440p?151:113 + readonly property real headerIconPosX: atLeast1440p ? 90 : 67 + readonly property real headerIconPosY: atLeast1440p ? 108 : 81 + readonly property real headerIconWidth: atLeast1440p ? 111 : 83 + readonly property real headerIconHeight: atLeast1440p ? 111 : 83 + readonly property real headerIconTitleDistance: atLeast1440p ? 151 : 113 - readonly property real headerHideWidth: atLeast1440p?150:112 - readonly property real headerHideHeight: atLeast1440p?150:112 - readonly property real headerHideRightMargin: atLeast1440p?110:82 - readonly property real headerHideTopMargin: atLeast1440p?90:67 - readonly property real headerHideIconWidth: atLeast1440p?70:52 - readonly property real headerHideIconHeight: atLeast1440p?45:33 - readonly property real headerHideTextTopMargin: atLeast1440p?36:27 + readonly property real headerHideWidth: atLeast1440p ? 150 : 112 + readonly property real headerHideHeight: atLeast1440p ? 150 : 112 + readonly property real headerHideRightMargin: atLeast1440p ? 110 : 82 + readonly property real headerHideTopMargin: atLeast1440p ? 90 : 67 + readonly property real headerHideIconWidth: atLeast1440p ? 70 : 52 + readonly property real headerHideIconHeight: atLeast1440p ? 45 : 33 + readonly property real headerHideTextTopMargin: atLeast1440p ? 36 : 27 readonly property real botomHudWidth: 366 readonly property real botomHudHeight: 180 diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 719fbf4ae8..08500b0ebf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1998,20 +1998,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(_window, SIGNAL(windowMinimizedChanged(bool)), this, SLOT(windowMinimizedChanged(bool))); qCDebug(interfaceapp, "Startup time: %4.2f seconds.", (double)startupTimer.elapsed() / 1000.0); - { - PROFILE_RANGE(render, "Process Default Skybox"); - auto textureCache = DependencyManager::get(); - - QFileSelector fileSelector; - fileSelector.setExtraSelectors(FileUtils::getFileSelectors()); - auto skyboxUrl = fileSelector.select(PathUtils::resourcesPath() + "images/Default-Sky-9-cubemap.ktx"); - - _defaultSkyboxTexture = gpu::Texture::unserialize(skyboxUrl.toStdString()); - _defaultSkyboxAmbientTexture = _defaultSkyboxTexture; - - _defaultSkybox->setCubemap(_defaultSkyboxTexture); - } - EntityTreeRenderer::setEntitiesShouldFadeFunction([this]() { SharedNodePointer entityServerNode = DependencyManager::get()->soloNodeOfType(NodeType::EntityServer); return entityServerNode && !isPhysicsEnabled(); @@ -2461,7 +2447,6 @@ void Application::initializeGL() { DeadlockWatchdogThread::withPause([&] { // Set up the render engine render::CullFunctor cullFunctor = LODManager::shouldRender; - static const QString RENDER_FORWARD = "HIFI_RENDER_FORWARD"; _renderEngine->addJob("UpdateScene"); #ifndef Q_OS_ANDROID _renderEngine->addJob("SecondaryCameraJob", cullFunctor, !DISABLE_DEFERRED); diff --git a/interface/src/Application.h b/interface/src/Application.h index 53ca90e229..f118424e5c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -272,10 +272,6 @@ public: void shareSnapshot(const QString& filename, const QUrl& href = QUrl("")); - graphics::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; } - gpu::TexturePointer getDefaultSkyboxTexture() const { return _defaultSkyboxTexture; } - gpu::TexturePointer getDefaultSkyboxAmbientTexture() const { return _defaultSkyboxAmbientTexture; } - OverlayID getTabletScreenID() const; OverlayID getTabletHomeButtonID() const; QUuid getTabletFrameID() const; // may be an entity or an overlay @@ -678,10 +674,6 @@ private: ConnectionMonitor _connectionMonitor; - graphics::SkyboxPointer _defaultSkybox { new ProceduralSkybox() } ; - gpu::TexturePointer _defaultSkyboxTexture; - gpu::TexturePointer _defaultSkyboxAmbientTexture; - QTimer _addAssetToWorldResizeTimer; QHash _addAssetToWorldResizeList; diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 56cbcdadf8..97f74fa24e 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -28,7 +28,7 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { auto iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; auto image = QImage(iconPath); qreal dpi = getFullscreenTarget()->physicalDotsPerInch(); - _virtualPadPixelSize = dpi * 512 / 534; // 534 dpi for Pixel XL and Mate 9 Pro + _virtualPadPixelSize = dpi * VirtualPad::Manager::PIXEL_SIZE / VirtualPad::Manager::DPI; if (image.format() != QImage::Format_ARGB32) { image = image.convertToFormat(QImage::Format_ARGB32); diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 234818c740..de115b0554 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -90,7 +90,7 @@ public: glm::vec2 getReticleMaximumPosition() const; glm::mat4 getReticleTransform(const glm::mat4& eyePose = glm::mat4(), const glm::vec3& headPosition = glm::vec3()) const; - glm::mat4 getPoint2DTransform(const glm::vec2& point = glm::vec2(), float sizeX = 512.0f, float sizeY = 512.0f) const; + glm::mat4 getPoint2DTransform(const glm::vec2& point, float sizeX , float sizeY) const; ReticleInterface* getReticleInterface() { return _reticleInterface; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index e323ed8fbc..c6ce179482 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -50,8 +50,8 @@ void TouchscreenVirtualPadDevice::init() { _screenDPIProvided = eventScreen->physicalDotsPerInch(); _screenDPI = eventScreen->physicalDotsPerInch(); - _fixedRadius = _screenDPI * 256 / 534; - _fixedRadiusForCalc = _fixedRadius - _screenDPI * 105 / 534; // 105 is the radius of the stick circle + _fixedRadius = _screenDPI * 0.5f * VirtualPad::Manager::PIXEL_SIZE / VirtualPad::Manager::DPI; + _fixedRadiusForCalc = _fixedRadius - _screenDPI * VirtualPad::Manager::STICK_RADIUS / VirtualPad::Manager::DPI; } auto& virtualPadManager = VirtualPad::Manager::instance(); @@ -69,7 +69,7 @@ void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualP if (_extraBottomMargin == virtualPadManager.extraBottomMargin() && !force) return; // Our only criteria to decide a center change is the bottom margin _extraBottomMargin = virtualPadManager.extraBottomMargin(); - float margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) + float margin = _screenDPI * VirtualPad::Manager::BASE_MARGIN / VirtualPad::Manager::DPI; QScreen* eventScreen = qApp->primaryScreen(); // do not call every time _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); @@ -82,10 +82,10 @@ float clip(float n, float lower, float upper) { } glm::vec2 TouchscreenVirtualPadDevice::clippedPointInCircle(float radius, glm::vec2 origin, glm::vec2 touchPoint) { - float deltaX = touchPoint.x-origin.x; - float deltaY = touchPoint.y-origin.y; + float deltaX = touchPoint.x - origin.x; + float deltaY = touchPoint.y - origin.y; - float distance = sqrt(pow(deltaX,2)+pow(deltaY,2)); + float distance = sqrt(pow(deltaX, 2) + pow(deltaY, 2)); // First case, inside the boundaires, just use the distance if (distance <= radius) { @@ -99,18 +99,18 @@ glm::vec2 TouchscreenVirtualPadDevice::clippedPointInCircle(float radius, glm::v // Third case, calculate point in circumference // line formula - float m = deltaY/deltaX; + float m = deltaY / deltaX; float b = touchPoint.y - m * touchPoint.x; // quadtratic coefs of circumference and line intersection - float qa = pow(m,2)+1; - float qb = 2 * ( m * b - origin.x - origin.y * m ); - float qc = powf(origin.x, 2) - powf(radius,2) + b * b - 2 * b * origin.y + powf(origin.y, 2); + float qa = powf(m, 2.0f) + 1.0f; + float qb = 2.0f * ( m * b - origin.x - origin.y * m); + float qc = powf(origin.x, 2.0f) - powf(radius, 2.0f) + b * b - 2.0f * b * origin.y + powf(origin.y, 2.0f); - float discr = qb * qb - 4 * qa * qc; - float discrSign = deltaX>0?1.0:-1.0; + float discr = qb * qb - 4.0f * qa * qc; + float discrSign = deltaX > 0.0f ? 1.0f : - 1.0f; - float finalX = (- qb + discrSign * sqrtf(discr)) / (2 * qa); + float finalX = (-qb + discrSign * sqrtf(discr)) / (2.0f * qa); float finalY = m * finalX + b; return vec2(finalX, finalY); diff --git a/libraries/shared/src/shared/Storage.cpp b/libraries/shared/src/shared/Storage.cpp index 683903a4e8..8fe1454242 100644 --- a/libraries/shared/src/shared/Storage.cpp +++ b/libraries/shared/src/shared/Storage.cpp @@ -85,7 +85,7 @@ FileStorage::FileStorage(const QString& filename) : _file(filename) { qCDebug(storagelogging) << "Failed to map file, falling back to memory storage " << filename; _fallback = _file.readAll(); _mapped = (uint8_t*)_fallback.data(); - } + } _valid = true; } else { qCWarning(storagelogging) << "Failed to open file " << filename; diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index 486a6c2c71..cb3ef20e67 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -34,6 +34,11 @@ namespace VirtualPad { return _currentTouch; } + const float Manager::DPI = 534.0f; + const float Manager::PIXEL_SIZE = 512.0f; + const float Manager::STICK_RADIUS = 105.0f; + const float Manager::BASE_MARGIN = 59.0f; + Manager::Manager() { } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 3563d333f8..6b68af3acd 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -44,6 +44,12 @@ namespace VirtualPad { void hide(bool hide); int extraBottomMargin(); void setExtraBottomMargin(int margin); + + static const float DPI; + static const float PIXEL_SIZE; + static const float STICK_RADIUS; + static const float BASE_MARGIN; + private: Instance _leftVPadInstance; bool _enabled; From 945858876ebab1979da7f929d9780409fe333c37 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 13 Mar 2018 09:53:25 +1300 Subject: [PATCH 263/267] Use std::vector<> instead of QVector --- libraries/animation/src/AnimSkeleton.cpp | 13 ++++++++----- libraries/animation/src/AnimSkeleton.h | 2 +- libraries/animation/src/Rig.h | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp index 5976231d83..e00cad9bc7 100644 --- a/libraries/animation/src/AnimSkeleton.cpp +++ b/libraries/animation/src/AnimSkeleton.cpp @@ -78,12 +78,15 @@ int AnimSkeleton::getParentIndex(int jointIndex) const { return _joints[jointIndex].parentIndex; } -QVector AnimSkeleton::getChildrenOfJoint(int jointIndex) const { +std::vector AnimSkeleton::getChildrenOfJoint(int jointIndex) const { // Children and grandchildren, etc. - QVector result; - for (int i = jointIndex + 1; i < (int)_joints.size(); i++) { - if (_joints[i].parentIndex == jointIndex || result.contains(_joints[i].parentIndex)) { - result.push_back(i); + std::vector result; + if (jointIndex != -1) { + for (int i = jointIndex + 1; i < (int)_joints.size(); i++) { + if (_joints[i].parentIndex == jointIndex + || (std::find(result.begin(), result.end(), _joints[i].parentIndex) != result.end())) { + result.push_back(i); + } } } return result; diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h index 52f3ac7182..27dbf5ea92 100644 --- a/libraries/animation/src/AnimSkeleton.h +++ b/libraries/animation/src/AnimSkeleton.h @@ -43,7 +43,7 @@ public: const AnimPose& getPostRotationPose(int jointIndex) const; int getParentIndex(int jointIndex) const; - QVector getChildrenOfJoint(int jointIndex) const; + std::vector getChildrenOfJoint(int jointIndex) const; AnimPose getAbsolutePose(int jointIndex, const AnimPoseVec& relativePoses) const; diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 72f9f64482..e30b5d655c 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -269,8 +269,8 @@ protected: int _leftEyeJointIndex { -1 }; int _rightEyeJointIndex { -1 }; - QVector _leftEyeJointChildren; - QVector _rightEyeJointChildren; + std::vector _leftEyeJointChildren; + std::vector _rightEyeJointChildren; int _leftHandJointIndex { -1 }; int _leftElbowJointIndex { -1 }; From 19807676faa900898e26696844f8ac0a78715e92 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 12 Mar 2018 14:19:34 -0700 Subject: [PATCH 264/267] whoops --- .gradle/4.6/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/4.6/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gradle/4.6/fileChanges/last-build.bin delete mode 100644 .gradle/4.6/fileHashes/fileHashes.lock diff --git a/.gradle/4.6/fileChanges/last-build.bin b/.gradle/4.6/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/4.6/fileHashes/fileHashes.lock b/.gradle/4.6/fileHashes/fileHashes.lock deleted file mode 100644 index df8552e6be70ec10245728042f4fadb35130f63f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZR+F1g?P$d(W03{U_7Ij01j From 75189e292d62945570cd28e46280a1c4748cc571 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 13 Mar 2018 10:22:50 +1300 Subject: [PATCH 265/267] Fix OSX / Linux warning --- libraries/animation/src/Rig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index f2f5d48713..848f384687 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1445,7 +1445,7 @@ void Rig::updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm // Update eye joint's children. auto children = index == _leftEyeJointIndex ? _leftEyeJointChildren : _rightEyeJointChildren; - for (int i = 0; i < children.size(); i++) { + for (int i = 0; i < (int)children.size(); i++) { int jointIndex = children[i]; int parentIndex = _animSkeleton->getParentIndex(jointIndex); _internalPoseSet._absolutePoses[jointIndex] = From 25f207a6db25db4a15d733ad0986443e595a7446 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 12 Mar 2018 18:29:57 -0300 Subject: [PATCH 266/267] Add hifi audio codec in Android build --- android/build.gradle | 9 +++++++++ libraries/plugins/src/plugins/PluginManager.cpp | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 22273f9059..1dfef97f91 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -137,6 +137,13 @@ def packages = [ checksum: '20768f298f53b195e71b414b0ae240c4', sharedLibFolder: 'lib/release', includeLibs: ['libtbb.so', 'libtbbmalloc.so'], + ], + hifiAC: [ + file: 'libplugins_libhifiCodec.zip', + versionId: 'mzKhsRCgVmloqq5bvE.0IwYK1NjGQc_G', + checksum: '9412a8e12c88a4096c1fc843bb9fe52d', + sharedLibFolder: '', + includeLibs: ['libplugins_libhifiCodec.so'] ] ] @@ -353,6 +360,7 @@ task verifyGvr(type: Verify) { def p = packages['gvr']; src new File(baseFolder, task verifyOpenSSL(type: Verify) { def p = packages['openssl']; src new File(baseFolder, p['file']); checksum p['checksum'] } task verifyPolyvox(type: Verify) { def p = packages['polyvox']; src new File(baseFolder, p['file']); checksum p['checksum'] } task verifyTBB(type: Verify) { def p = packages['tbb']; src new File(baseFolder, p['file']); checksum p['checksum'] } +task verifyHifiAC(type: Verify) { def p = packages['hifiAC']; src new File(baseFolder, p['file']); checksum p['checksum'] } task verifyDependencyDownloads(dependsOn: downloadDependencies) { } verifyDependencyDownloads.dependsOn verifyQt @@ -362,6 +370,7 @@ verifyDependencyDownloads.dependsOn verifyGvr verifyDependencyDownloads.dependsOn verifyOpenSSL verifyDependencyDownloads.dependsOn verifyPolyvox verifyDependencyDownloads.dependsOn verifyTBB +verifyDependencyDownloads.dependsOn verifyHifiAC task extractDependencies(dependsOn: verifyDependencyDownloads) { doLast { diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index dbd6845676..e9c084e132 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -96,7 +96,9 @@ const LoaderList& getLoadedPlugins() { static std::once_flag once; static LoaderList loadedPlugins; std::call_once(once, [&] { -#ifdef Q_OS_MAC +#if defined(Q_OS_ANDROID) + QString pluginPath = QCoreApplication::applicationDirPath() + "/"; +#elif defined(Q_OS_MAC) QString pluginPath = QCoreApplication::applicationDirPath() + "/../PlugIns/"; #else QString pluginPath = QCoreApplication::applicationDirPath() + "/plugins/"; @@ -106,6 +108,10 @@ const LoaderList& getLoadedPlugins() { pluginDir.setFilter(QDir::Files); if (pluginDir.exists()) { qInfo() << "Loading runtime plugins from " << pluginPath; +#if defined(Q_OS_ANDROID) + // Can be a better filter and those libs may have a better name to destinguish them from qt plugins + pluginDir.setNameFilters(QStringList() << "libplugins_lib*.so"); +#endif auto candidates = pluginDir.entryList(); for (auto plugin : candidates) { qCDebug(plugins) << "Attempting plugin" << qPrintable(plugin); From 4adc357534a61e93d49d0326796f4a7d16eaffc4 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 13 Mar 2018 11:57:14 -0700 Subject: [PATCH 267/267] apply taa to text and web entities/overlays --- interface/src/ui/overlays/Text3DOverlay.cpp | 2 +- .../entities-renderer/src/RenderableTextEntityItem.cpp | 2 +- libraries/render-utils/src/GeometryCache.cpp | 8 ++++---- libraries/render-utils/src/GeometryCache.h | 4 ++-- libraries/render-utils/src/text/Font.cpp | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index bed20be698..9bb1da59d2 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -114,7 +114,7 @@ void Text3DOverlay::render(RenderArgs* args) { glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); - DependencyManager::get()->bindSimpleProgram(batch, false, quadColor.a < 1.0f, false, false, false, false); + DependencyManager::get()->bindSimpleProgram(batch, false, quadColor.a < 1.0f, false, false, false); DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, quadColor, _geometryId); // Same font properties as textSize() diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 968c181940..e58eb540e8 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -111,7 +111,7 @@ void TextEntityRenderer::doRender(RenderArgs* args) { if (!_geometryID) { _geometryID = geometryCache->allocateID(); } - geometryCache->bindSimpleProgram(batch, false, transparent, false, false, false, false); + geometryCache->bindSimpleProgram(batch, false, transparent, false, false, false); geometryCache->renderQuad(batch, minCorner, maxCorner, backgroundColor, _geometryID); float scale = _lineHeight / _textRenderer->getFontSize(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 212cf5eae1..bf265fae8c 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -2110,7 +2110,7 @@ static void buildWebShader(const gpu::ShaderPointer& vertShader, const gpu::Shad gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - PrepareStencil::testMaskDrawShapeNoAA(*state); + PrepareStencil::testMaskDrawShape(*state); pipelinePointerOut = gpu::Pipeline::create(shaderPointerOut, state); } @@ -2122,11 +2122,11 @@ void GeometryCache::bindWebBrowserProgram(gpu::Batch& batch, bool transparent) { gpu::PipelinePointer GeometryCache::getWebBrowserProgram(bool transparent) { static std::once_flag once; std::call_once(once, [&]() { - buildWebShader(simple_vert::getShader(), simple_opaque_web_browser_frag::getShader(), false, _simpleOpaqueWebBrowserShader, _simpleOpaqueWebBrowserPipelineNoAA); - buildWebShader(simple_vert::getShader(), simple_transparent_web_browser_frag::getShader(), true, _simpleTransparentWebBrowserShader, _simpleTransparentWebBrowserPipelineNoAA); + buildWebShader(simple_vert::getShader(), simple_opaque_web_browser_frag::getShader(), false, _simpleOpaqueWebBrowserShader, _simpleOpaqueWebBrowserPipeline); + buildWebShader(simple_vert::getShader(), simple_transparent_web_browser_frag::getShader(), true, _simpleTransparentWebBrowserShader, _simpleTransparentWebBrowserPipeline); }); - return transparent ? _simpleTransparentWebBrowserPipelineNoAA : _simpleOpaqueWebBrowserPipelineNoAA; + return transparent ? _simpleTransparentWebBrowserPipeline : _simpleOpaqueWebBrowserPipeline; } void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool transparent, bool culled, bool unlit, bool depthBiased, bool isAntiAliased) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 998043b80e..3c6b85bed1 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -475,9 +475,9 @@ private: static QHash _simplePrograms; gpu::ShaderPointer _simpleOpaqueWebBrowserShader; - gpu::PipelinePointer _simpleOpaqueWebBrowserPipelineNoAA; + gpu::PipelinePointer _simpleOpaqueWebBrowserPipeline; gpu::ShaderPointer _simpleTransparentWebBrowserShader; - gpu::PipelinePointer _simpleTransparentWebBrowserPipelineNoAA; + gpu::PipelinePointer _simpleTransparentWebBrowserPipeline; static render::ShapePipelinePointer getShapePipeline(bool textured = false, bool transparent = false, bool culled = true, bool unlit = false, bool depthBias = false); diff --git a/libraries/render-utils/src/text/Font.cpp b/libraries/render-utils/src/text/Font.cpp index d3d25431d0..cd171db855 100644 --- a/libraries/render-utils/src/text/Font.cpp +++ b/libraries/render-utils/src/text/Font.cpp @@ -243,7 +243,7 @@ void Font::setupGPU() { state->setBlendFunction(false, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - PrepareStencil::testMaskDrawShapeNoAA(*state); + PrepareStencil::testMaskDrawShape(*state); _pipeline = gpu::Pipeline::create(program, state); auto transparentState = std::make_shared(); @@ -252,7 +252,7 @@ void Font::setupGPU() { transparentState->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - PrepareStencil::testMaskDrawShapeNoAA(*transparentState); + PrepareStencil::testMaskDrawShape(*transparentState); _transparentPipeline = gpu::Pipeline::create(programTransparent, transparentState); }

XDCG$Cn90yW2!TvHc6kUO~pBDt)WIi`>J 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 diff --git a/scripts/developer/utilities/fonts/Raleway-Regular.ttf b/scripts/developer/utilities/fonts/Raleway-Regular.ttf deleted file mode 100644 index e570a2d5c39b2841b5753350a3822bd2b685e771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178520 zcmbrm2Y4Gr+Bp8s?5ew|TUOiEs##jeDwgCT+p;aW$w{2VNvt@DOPqv|N>3=E1p=WT z?T&+^bJSy<&u7i?yBXLic_zVr4q zAOKJ!02->&^Lx7&ELw08;73CM;O!omGyiXhJqFO1y8xc&yXP)V@z22T0GPJ`BpvI|5JIvTVN$N>UIE7047fX$a~bi1p|Pjt>7(qB{p%S z89#gzd4g|(Eg%ygW8k3$E&_n-%MIca3jGdU4iW&o3vUO2i;E?C7b5U209HvT3Lz;_ zHvujT05e<~e&gojPkvj=p%vW-^>6?N&>heYPe40f0%kk`33M+6u>yE( z05^7k5wpPIVW`JOaNxNR!F}L_UC<6MLl^oUSo9F2(f5!*?|_5KKpnmf%J6lN!@mI^ zei3qb403oD zfI0ZrP)-}53~vGnz6h%DNnl49hHwK|5QYdggC7;39o~a5W`V`4A&Xt$!Rx_`v*1B} zV8O?N7k5Jz_Cpp96fVLV$f7EkOlxCPp% zM&Qv|P)(juqYyybz)5AmN8Uxh2Zx9Qf`{9n4E2FeEUy8+^b8I{gxXX16TSyLB7O*t zrY<-Lb~p$N;24IHvJKa5UpWFF;DXCwQ895j+h;4tpRg;)LMksEfJ{SP@TI z@XWkmKU9f$+7Df@zwme14-&i>eA9R$xSDyHpi{gjxSDy{pb`&5RxAlD$ovEzHQ*QP zw?Y~G6%t~d&?=#s8715TkBDf_q z_Mggs7TXEGAZJ#jLqZ27zVQXvMgB3fJOEZ)0X9h+9QGI9frC&@a6J8fX`CWV z8>V4-G%QN6Ex|4eR>E8GHZbDvAb^J;i)Vp}(6C6`gg;KvTM6gWV;?nE37$un)3E%( zULZ%#@bubCYbAIn;e(W&0Mu0gA}>4-+TmG9!IO{@V*P4ebNB$O}&fJGv6QXgSoNOTmq<1V(JLgM;u#v<-H4aX)9%?T5$$D@cEO;fz@J_H}H89u=Y205pDDw8FK!tZg0P&ze0<@zyU_N>p zTG7+cj=lvO?g9%s2o~H87W^Jqs4!S4KXAAS28lc-bK-Jv!k=J}Y5@bbLj~5tAlW;< z7eZpG1p`?R=D~|EhAeJ`8r%tk1Rl5_G_)J^=q}JxTR|h@EdqnM7RvE_;Bf?W@CnRC zU%?>uf=h(gFz|RScnOTL4Osj&4B{JLP=xhO;KK+8@rA$>d5YfwAGHxYcn$C(EEHfT z@FzM2!53Z!gD44R+yfy|PG=y5`#_EDFoIKy{df!(Qoh3!*~NM z7J2>{sKxg_0anyA-h^Si90JsBFibrI!}tTJqM|U2XTdPu1vct+7{;5xh8@6?vBm2N zP-7Vki`Opjku!v!1~pcJNnF=ks&`)F#+7Ej1?A!q!Q737He)IwO@aND^NuVFMf*zj<{pe-r z$5yc7PoW=u1-5A!+Y1!BNo?~FUJUO*KfD7n_^5C(WdkY2i0i=OIvSy0oXZORWMAkm z=*MdTW2dO~5*?IWmZEk{Jq?stvj9!q0RT_KSs;ZDaDofw!F<>PyWlza0%25%94Lfh zs22^OE$A}zGxQSr3;G%Z#@LJ#IEQ!P=kW{pU8<5&Q&&-UQM;(!w3!akBlH#Yq^;cM zvSn<;w&k{Uw)1RP+8(t%VSCy3iR~Y@e=`)LV`>;1<6zuOh-qTd%tmH2b0Kpxa~pF9 za~E?j^C+uj4J^YtST`GF2iau~?2tMt9U6z;QRA>V{Ei;SsAGj|-#5>EM}H?R5bc@) z7r0?Q48l$D1nhO*tIJv@v4jQ)nc#RyYVd)SL#z;7L~2cRuX%6ICNA?df$e;;LmJtSH`PmBNlVTL92!yoBW>{t5jE>+;m>DvGQ-yLx0e;wo; z*b3*vHn;#Tgp1%3xD;N6-@)tf2D}Nshd;poz#m~hyaVsTd+;#Ah(a`yz;<{WUV*pZ zGI$LxMjRf;%kczWfmh*Ua1yuRR@{bDxE*)kH15LPxCi&*KD-jI##!8tkHs0h26y7M z=u&h!`T%{1K1P2+pQ6t}ij`!=Nc{hZADXs=OBV4@{fLE4xBv|jkb(>ppn@_ehYF~K zDo}$4w4eh$7{CbCV1gPjg9WT$13NIlf&(~_Ke)jIUZ@2h_<@H21fdQ>5QYdup&nuo zhXlx>0UDtRnjr}-&)8H5F}5Ej7@ ze_zm0#_roOYgdOkzJP41#L+~g( z2D{)%cmke+J+K>|gJ)qcJdYlS6JQ0bgk#YYuo>=x<6td%7fyjS=o`2kZbAQm6VboW zK{y6Bp}(Ln(f^`L&_7`voPpj00iJ>LVFEUwzoYr+YxD)Ihb`zypkNzZ1UDiVa-*H- z0rUuZ6g`L@f~V2HVIRtZ61|0Xqdn+5^gY@Ir=o|^W9TWk5Uzp?;A;38Tnj&kU%)kR z1N@43CEzx=9d3n(VLMz5$4}AIX^4Z@;B5hTMt}uFnHQMV*(yuDWK&78WkkIfFR=;vQ$;)@<(VGXUGnO)M$=$8BL2zmGe7fD(K8~_}FRK zEBGUEp)8Jq{G0%t0__@QGTXT^f)^29U?wmX7_*R?hLS+JxUqC`3e``%E;t8<$jj4P zoB2{1p&+hfhe}ChhFCMl=6q~GDCZ|J&Il7@>3~qd3uu&KgtE>)vM)v`<2rIeIk}rR z#0ceFM=l^#@{CX=f`oa5hUMG2F`=S!l-WMY2o+oh7Z9rW?BLKOJ(12ih4K~LrhuU4 zvvY^C^NSD7Y|bfY#pfD+5-K|v3{6&6b_!^$L#Xr-Eez)1itmljZ` z0IfR^LgKm6@-PWFGdLtvave-YP;niCk`pAO9n7eJ#vW9w5mZ1&$M(@ljnpq(=r=oZ z0YS%4g4Q1p^!y|urGcNsq%`uA6e+9uNt%=6A>7m37H=@M|dVCt~bhqfHFVi1_JW`D3>75!9bkx0O?k)VKRdBWOMaAlVrMo zVoL&ajx_{?7#}ny148`2brn$O@`iwr;3qK{TuhMZCMRFOuHNn2ySZ*|j2Rj?6VA$Y z?1&?z*ZBfM122FJelV&) zyT^zm5*Ohbofs&x%ENQz0zy*>4h+Kx6897wxMV{>Xr68o5Aw$+xLV?sJNL;-$rF#*1Kcu)(ZVFQzq3xE^Y$EihP&GwE}^P(Xuv!#H^d}!!O0-f`2#}R5v}vg14p!`j%Y2tJ9E6F-)QHB2LH?s zrI$(*cJM-@e>=k@34LvE`01_!-5C^u{(#UaZkdp82`7XsIVQ;jxrV82r1?oX?dl-3 zF4B1kGXI^3yMK(N{$J>pK$x(oB-dbOXHW>6n_6RrpM(Z~2@YNSBsBV2f+e!Zshv!3 zx|gr1*x-pfw{(rJa5FCg^sLc$jivIK4!jtMed+qtn4r22V6 z!a~*`5N7c^0Mh<|Fq_{2h*akAJCOKffZu_{Cv!=kj6WdEBYj9^KIua$gQO3sEZ}zn zK)XL6EaXY(kJJ|NJ5ll35Wf=@pXEqDL|PY1KNI$W*l+4-b4+zW1oTM^B z<|LI-GAF5wkv?7ifG|$_kjiq>hg2p=A5vK%uB*cz5LSxoBDGcGx=8I9ab2XgT3i>Y z9V@Pj)YgdWBDJ;Rx=3vuKM76K2wX4T39bHsu%TFO^9O{D1n8ujkn#tFI`RP1wn zu}b=!Aod{*q|b@`Bs5QtdXji2j(T#jO5Ql7SS8&z@sp^z*kNOoqxyJyB z=Fi4Skaau+&>iI@;3GGwvc>dlx=HSnR?8&vsYj!D5T~UPnw5x;$~tx#c58Q6>{jlU zrY0o{-z2Cz9!ilPxuGCE=|mUI9THL(3{6rK=}9-adrW>7AUbuy^1&g}C6~+PQe{i% z0Xiw?r8P21neP!)I8UH2nZ%IZDVdN$IxR~6|MM>c8Aw8s#FViDpx`GFXZ&K}JFF>u zQ*em!=Qe1AMrg!N>?GrgJ)GE6_^$B1*gkWN{o*M6^e7*TxuB&*i;?qj1(pA}Cxu$Y!6;*Xg)idgO>IcV1nxBbO_tbM2b6~@5KVyb}Lpc$Rs7>3Ppv>mBf(?7hYN zW-VKLX6-w^2H$ml&VP~rPQIESetkN8mowTVzXnX#qN(=;&&w^iLu1f4cUgB4S#7ov+-X|>zlr4KB4)MWL0u`^469} z%Xux2wk~eHq4lx0wzliq{*juWnrts`=i9fnf7&7KnCN(*bD(o==cDPR>FYCuBwtOHWz)`LfL;@{v#MT|&fa+T^=E&1&bo7cbI!ld)t&pmxnFLLZ9R7DzVq1gmY(<9^JC{vod4kY-)(Ez zcJ8)kFECxO=7QTUc;`aXh1)Ou$M(y&KeYXei+V1)^`gIAJbv-D7r%Q++a){2|6aM| z^GlVNHeb5-(i<*4aGCS6xtCpX*@KsTc=_{}zkT^vSF~KQ{)(4=cGk~sxYB&(t5;dB znt#t6h28+7lbGKe{>s_}#e(N7@J#^b8x4n6L z>h{xazw`Dt@2I%r!aLshb>P=`+}V0p&0S-6eSY`KyPvxIt$XD6)ZerGp8M~~-`jWZ zvG+cIU+}(T?z{fJfBh!;n~~pK{+p+M^Y#74`#bO7c>k04e|-P9LbcE-{CZL|dG-$F zj!Sp!-toy!%g%*6x9oiRf%F5nKA3y(o(G?Q@RNsn9@_b^;o*4?pZ4(oKC<+Y9gn>G zsQJ-jAHC|)Zyu|Bto^Z#kL`QB=JBD&uY7#Zo)h-m|8&LE8=ijTnZz?EJ+u4S zx@U9Gp8V`9&-tI*@Z5`g4SRd`KKZ=m`NrorKmX2eYkqseZ-4&V4_+vHq49-PFI@V< zJ1=~{Z{xmQ`}V)6eew7gZ-4RSm#CNcmxf>ZbKKFMs$7`^sIfx?X+w)xZ9( z=XbyU-TSX;Upw}-$6rUUZ+!i+*S~#Z@Qu^nxZ#bb-uUKCFG&{yk_UAYeiJ zU?sedUlPZ2rdSC@Q)EPp0Fvm(#?i*2`e-bw&on!mvGVDspMDxJxB&1ucrTd24!xLH_D1=Z3^_x>1NF~y90VBNiCwt{m6)j1VT5Z;; z)mDv?Y|8ESs3V4`jneBXuuRXz+@6HNU{rg8RII)gCt^{(!C<87gV>{v#F5U1jcTbB z<*g%0OyS1il*83A9C!U}J;$BYBW)OLvO1CrqOOkBK94cb$uC%zzf9|C@h#}b?TioS zzeZ)YKq?gKsjEg~|Wus(c?)0*T+c$CASbJaXf)R6kAV#+5N-t^X z-Vng;4qtZ*Q)@G*#2tluLdI2%I;Xj^rIih^)n($A!n2}gzXw19-oiKdR{T5Af(M#m z4lIBLsd@7eg;1XYVL1W`hE*T|nN%WM1r#OjBb`+tsgxd3BAV`@`&*K=UcC-McP2Tf zWll8gZLV#$TXi12N2LHQ(v~T7eyt;j3F4v=8zw0AL|QS~Cg-TY1O({6v`Y{&BJ`v^ z;jOOrChYcjt>BeJylRVEY$|o7&>$MNNgkLX4%l@ca5)e8W6pg)%~1bBdS2cHNezz=?p z+hpYA3ca88NTu8q1`;L0DmsQ(qE$&Xg zCsJi`lJl3r3OGyT&!&_CPjh?JFGlGoHKovtEIHGR70*0F-rx&w!x#7?P=j=5r38ii zTEbO~6_j3QFv{F+-r$Z}>vaLQDcu}xn}rrfmyeBwO}3$l)uGvsE;cXQQ#|)?!w2{y z(2`LoGKx+r^R!ap0Z!Pc5BgIPYaOdGxdZx`HR>{;#iM(cnFC9P7kWagCx&dM@YvXL zGEyrpLlk}iD!`I5Rg{;hlnS|wrZ6glZX&p#UysNp5}t%H7S$(=GNa5RTjWoxGOmm& z%`-kfcC;FtHNCwxPD87qy`79&54+JCECm&KQckG^Qy2lFUn{IXxHSVnleMHK(_oetH`^vtiq|hHcvb!9d}D_!*3o{Duc42vBcUs2CVZX()sN z@CKL?vn_-k)#M@GI^$U`r2+scNY!duVelJ?q|(b4s*N3{xq~AkgJi|+@Heyqg@6KE z$_(V?1teIz6e9#^)(mteVywO$IsewyCcXu5I*bEF@L%eWT8_X!*-?A*_&Axx41iO3 zZ?Qk2mt+=zEPKWT2yqCf^4?kKExh+o6W$9L5`}MY051@^r8QMUBE}TLgfGI>8S{F* zPFhjzN4g4JI#Gn@$!74nXrvY6fV*=^JiesUT`Du?P^Y)HGh{Z0I%~b1Av1DyY?vDe z%-zt@v0-j7ICn!we5j4%+J@rsp*Dx3ZHVk72!O7^&7gsBDkwn|jrxG5=yQPrj3~TH zDj|?tHoZFyXgIZAE#lgxXJb)y1;xc8tvC@?qigc_T`Kp~MYP65*nzuRTU*h+WtQry zjv9welBdXgJOKJ5&VZjtI=v2yf{rAGBUmNsR&-If0w4^=RvVNkjQ%J&Tg6jB_ysv3 zB{?9gp!BSsFXP(d*0z{K&4yXF-eZvkq>e;iFxV5RamJF>OiRd)CLEb`o2Am~4A`_T zt43R6RfMGsV>0oL_Sz(GS5(389%U~dKigSpHhbWZY92c9C&YVL$=cQesMICe4mId|w z$6M?43)`~`7cVfGXU#KsV)n*G2EL4MNIQeG8tfWJ_zTr|Paqq!w#5B>eQ!E5(A3>% z3)-uq0bh;Zrmm^$@Y)i7E74+&g|ji>W>7*oG^G;dVrm4CT_B9kl_DDGtrGF%Es!9L zVJSs27-j*KsXz%zwOXT=DXRUF7#l-TbyUykU91{SH`c9ZB?3KHj?H zuSncKS6G7%;bsUzf2x;96jW7WOk+Y)n4<9(G2KBTT_Gc%3eZ5U64k#&Q~C`?a}fA_ zwO*F7S#%ne0)i+gSLpm`N|ulVLDV>M0E)t2D&tzIL_ERjSy?=e^x?rar>Apq)SYRn zs|;Ainp~-nxhB}^teaochU8@xGPMpZ%D)q?$)W}}IX@Cx)Z)-OBX&nPX$q#?t`@$! z)+6;bbvp-FwG}LO0>}EoH@FVJ2o8utbE-kB!4x(lT7vt40trn?2<1*mSg9ygi}KRR z1$i#+jJsW4Cjq4Eh%+sU2~mBC$Hfyqy{V!`gX=u$C9#HOoo;t#w7GkumDewB}~FHwGaK-8X?^xR3TNYT+zk?uQx;h*09r7`a1qQ>tE(u5(T~^|i#T+1{%rJ@{4Zu>dE22TpdeB> zi0ydql-?IhML2?M!ajiDdR0lCNM>iSxBkA4R6{(-*Hk-+xik|ZN9zqX>S&%vwDiNM zufW*uO%F$6i`$(hZ?vY`$7sE6bG+U;ZC)+wueR2Ej2WgrWoKI>HYVD}Fl`Zg{y__$ zs4>R_mKuM9&6@DlJXe>ETiM2bzoRL@DwI}tu!ippR#yko{+gi2s#J2pCaW{y*6BSB z4o)l+Xr(n^uc~5#R!hKMrM3qNl{gD4u^l&yRMMJiHX{kG)nH8FJ^(4AB|sBBn8K1D zQvK0{LUf4|YnWyrtvFFsvJz7SQUZnZFrADwbscBr^}`K(PrU^hi-hu>yEAGN2_+q| zTBDt)`$s6{guWkAimQ`Q3Wjz7I1NjGU=6qZH*1(!u@n)TO-)Vcw(;@&lJRlC&{en} zE)d64!q@`}giCsWRf=eg=?#*S2G&Ms2QLMTTX4TQWg+c^XHDq|M>OYBI?*6k(n@*B zB$rL;ZB$WJ=xVAb%7VBQRY_xD3tyvWaTU=kc1jS@!CZQYMDJqJt@+(3m0yZ<-}gTI zO!iyAkcOwx@o1$8iMkXISb`|P)QTC31}!QYKjs>Uv3ggG)u&M~|2hgj9S)xm4g-Qj z;cK*i=KL;6%;kzn(Ej{Vl*;c$w|@0)_L*mUzXuEs0Q3-k6s40RQJqK$QRC0L_7Y|=0_m5t5&I%e0DnVb<98)B=P{Wg1uRU1P+A#cKKtx)RO zkaORfHGrY6u%0T%!>}0E!rIhouLo1K9Vw|1HC8ES&%$y<_mv?4nFM6ygp}l~Qbj3O zfgBWa#d1)o@Cc!TEJ&r|7JE=Xf;Fp`kIfs%_O`brV!Y4ASk1}#br za&+891JYm=bt$RLQ)Ik)Vn3D+Q^}r;M&b$MVWUPHkH=!f-X^@6NON>^-`0sHN~vW+ z4wGFY$Cja3_Z&9X!SWqyl_liz^jI~{xpj$lhk{b+)pl>SB9hzGmEJrYi!9pI?eBG! z*ADu!TbDPstUCWZpRv3%R1&Sqb= z$>6EBxSD&NXB%8KmHyUlbI+Eg@#x~y`?}9q8q;YQovvZU_PGl#9FHCPi!N^QVx7Xk znSIf6a+b>g@U?g^$Uq7Hlvja>M@E8Zz=*~xMHd%wy|kcyxm>Q4E7fXsm6YhCQN(#z z8HXqe#hQ_)Z%Ka7a2EakvMY#k``&vpcX!3Y3XuwYVKdDF+njsceNRdQ> zmV&4@VqU~%vXV8qtYQipK{vQTc z7=4ic*5ItGF^4!kAn+Bw#h2lIB(E~%vRM^!8Y9#YM8LGe5>k(D;BDXde zWkKpN^%RXkLVCWy!Yuo@U#ycIg-D8cmw&sYsN!{ANptkqap)fiob>>9d z!i<9p*~;q&SI3*z&JS0zVb11l@flL9&Ly}bko^_j3uRy;_82kdr<{@$g$Uy*S}X>g zRt;sKVkHW_KdPP?IgJ!6e68=}AZ zWAicVT34Q(?mlOEv$3|(;p}LQ%wN-(Tst?^*m`n2e`{&?7mCm&IHdsrjaCp_n@VPh zgSco_9${mvIW?>1)KN97#usMt!(CnIc5)0+fBpfyH~%b37NH6^mTXkS#gm(|Xi(8KE1I?<_wB*`F1>@Oge4tZ9aW1ut;b==_~Y#kWmjcr z$?V0cT&2O&zo8qg&R;wCyk+&o=o7I_yw@slr#PiTO3`EjL|oumn!=)pFOrW&qZX|` zbySU_#Eh2db6sfLto(Z@JS+d#^YL@}33NmLxB27Iii`G_#%{!WK?3#^`DQwq1%&WY z3YA8cfTZX&AcL}Gxa;uVLz`NQ>!NhxsS2k23YrLX;(Ntp|69li$*hDhfg8f{LF zr(K?|(I!$#T2`Es?mlOtxozdyorI>*F->dchwBHAO*E~U7mf}dTjEml@Ls3@Gm$Xl z>lRF*6+qKd+=|$mEw~@RY*JT31yp!hslq@`bji%))Q5RImqYI0tOmvw&j$bWkv;0v z89g!UyLhjsZJ?H)+v?7Li_+#mGs8CXrkT(&LLISsZDu`H^lC^b2~BM&nI-8gad5&2 zIbs>;H&uIFR!eoAsjk}VkSUCQ*J0sboZC9(FzB#@exlnZS$H4Q37o z`k7p&k#m=T=k6M9W1OuMhauRzHL|?PYC1OUThq|AW?m#ZxF$j1ImPK$;k}>+8$?r~ zvS|s5XuJZZ*ljW^rAl;3>}61cT3y4E#UF;HOv_P6fs-em1Y>QJ^EY#T{rYDmh<;dv zsHeNpBg=n@q#{^@O$^h_6F-$20M8Zm26L*Kz>Hc7ghPRNFo>2QdaXD$r{-cTo_nb4 z5KiF>4sF60h#r+Wh41j~crTbp{EKK9$t)pMk*{QMKLVY$qD&?Q6EYEMbrEB@#9e~L zstu#fow=C4i|Iao-rxycwu~V*)D)e6Y#go3U)OW?cvH*7S!q&lICfqH5DbJ4iTM+R*Befr#N+$ zN-Dupil|K(Q6l#$x~$Y1wN_I_d_O2^OhhRy(U~ZULs6tf6CD#PI#0gu zl7BOc@HV{X`|tCw<)6YQ9cm)_6W)91A|!fV$zMP?VVYaYXhf6c)5LX8#6pQ3sX(RC zXb86?8z@eP20#CNR{krbn04U59Hhv9h4<$7p?Lo1`CAa5e-kZ3#}J-b1%OY(dqECd zijmQX`Z4&(L9UsGkD61XrJwz|KmWg7`7iO_{5fb#z9WASDbX%KKwKsBOHy2dfOv|D zuZehHi|QT;oq`xSEwQ=;@h#{Pt7q-#qr40Ac@DjE=;Z{S+nP9ZKjF?pg}2~U{4vPD zk+K7(5rwI-l5Wr{I%s7eQ>#UZVI)o}byPoeN+RK<${G)?Y$Q9i0ANc=68?m@R*N{a z8tv@Q_fI)%0YRkj7Ti5OHxSVv&Mg|GKbV_n1hJ?(($KKU+la4g{QjS03_q$ve-&xa zGbx=&rz{eY4oTCw6vhahIMby)DTTCF8`W|Y<=@-%T=I^)P#wB9zZxyd-$h<&FFcK& z6n)HYakT&F;UVZ0U|!25xMYVqxIavDf<;KV8t8xSXt8fD?`B#-wm zRRadL@D2Jq)_@xtU|DKdufqtJBN+-hF)gzpkkWmCKt>~(=)5J-%I+-T^dk}yiSEfN zkW^Z_fqt(CK_uj9@HVh^tEJkYsZuGxjoeCw&TpKSPX?nH7b5mqG-A-}bx}Pr-aHoRj0TOhrD>@SuiRb#BJi`08rg zSw?f=MrCVw1>T>3I@TVXH5N^b_xh7ubJkni-^}Tqbv3t`>l`{j;3<5AC0GM4qD@%L zN7+2xqL+uDwujg}t|M)pnR@YIo5$nMj5hVHw{#fhguI!k)mESJn8H4rv{U74%(xmy zyF5sm81MCUHtM|rCea_@XE(AHCPt&P)NxvWcAUVU#Fi6yKbRo|R~CU@?qE&jG$qv{ zpm3jg=Dh^><%*qbMaWNi3c9m$qD;dGEi0j>_NWe`gRLnY!4zfzNEwDY+F>{vC^8Zu2fVz?Z^5| zjS-Gky2A}-Upic4tM66@`o?03<$eB47_}bSVo6eVLo}L9>bN@d&E`6%&e`1W_4PM8 z2y_V60$2kM2tX>;VzZLyT%Qa{08Y2^Lt?Dg@9!Ip%d03~cfGZun$uTV>o_g)`7#lUCDK((IGP0jt-&9I5gJo*6{2t% zLd0cCQKD+lm6Z^uv}oM6Wo1YzZIKcy!3ajR*2SsSaz%|_WW2F@!Yzu1npCeRf?%Sj zXI{6xNw2S{)rTUNUyk00SB$RHREAY$eO*=Yd_bfz7Td7~oX`korYihCM>#E#nyN7k zBz|5qFqCqLltko4_Y`%I@I{93Iq_JuQ~hRQx8k;G@6=Cr%%x0j7lLq|tI^$PH5+sy zJvou{XnKlGSyofgqgMQ*WMzrx+MQe~7w;VBT52;(>ld$g`0Oj2-RY>!c8uHBRL4kE z?oh(QXF?`htVF{)JDTm;hY3sE~zgF!|drMiRlH5iv;skw}=RsVpb1Qc*c+ zCETtJ_v>^BbVi-gpsy&GOGy@rOri73X5gc!or*4Qw#mp=xwRU$rYc?IPc)<-)aZj1 z$_kT1hnsQglCxi8nu?_b}S_mg#n7n zwCJhb8`Ejzn)Um4k?NRR@&0@jvi&~)G9Z{;_!g=0eyAiGog5(`u60oZ6OmQYwOyPT z*3m}Qq9?QH=5)tqrx~ltR$it}=<4El|Do%xtW=VaD`TOlbyM?188I)VuvKf7G_hZc z2SiWwdC7=OiY1b^EKO8wF@kRba!(qiBjo6IPq*b#DvncYIXzb;S6Ggu7eYBwk#NMo zn87GU$Mn>^bW@`(7H}xi4Nc8Ubm>;+n6{2Nir%yM7MB`v!wU`G1e<>vaZ3m1b>{bA z#mULezU28#^Ze*E6>Go znrUaKqXMJa#$_3|C$p@fVI<>mXGXrUMKc~xhNLNFJf3vDP3i9&k0-|ac)o8u5g+gK zqcT3*$gqw5ynj|B%Qnpt^&UTN$C@9}dk8zUf<%Hxh+~8>WHE<`s51mw?IdB3Epo!6 z^rD%4a{pQHAv~i5&>z!#7Idtzr(2kn$@t<9m!oY_w=W|~&)S;CFh`fU>f*}IX#Oeu z-imNbAUj^481M5Zoy}RVufNHm=jv*1vV=ID$oqMmz#3v>!f2DL(Eu+-W;NsrFMcx^USwacWh(N@aKs+l0$GYAMw zg>O*?KMH2z12-cn2?`MZ2Z=@ErL=e&fY>@9x|2BKr`9_~PjZDA28a>skYx4hIW@^( zh$m1+YP7la2Cq%i)05t`3A?JTywpS~mGUx^+k{Sv3qm~qE2~*c6As)}_y(J?0xWP+ zQO#A=lw*vvVn&BqyrZY?ru1MPVZB6JVhp2_X~V=`d`!%=si#H9VW~$hrA1&AbzOx_ zLW2cai0m^u+@j1A^};E2S0vGxRQlzD`RUEJrm&|hU0qg5RofgVDUaKTBKiH3I(I#b zdh&BDNsJhCvZa&kMGNF_)+mae8ItE!bOaM&QS#VIL8=kcyrNW8tBq2hzS*_&fsQw^ zA|FTl4*iRaQVBrWumaRYzf8GOK}(4fLqby&Q4^-zBpR(+LxNbuFGCTB3>DQ9FJ2-l zGvc>9KWNyvq2Ys$Czt0M)9I$%a-udMW&Rti$hUm?=G}L{`Q_AH=yR-qN-|f4Qi>1z zW2PqpfJ&&;X>>$pYmLSPaRPB3k4(mCsiEuT^6Pt_f4+CB#EO?HD__cgn?LkoMa7GV zLQ=A$0*jSc0Xh;3P|1n!R7V`rqNBKtC_g2QGpf;tiO0=Y%!WybKtf`a)3aJ$Dbwh6 zCgVq4dv>r_=$s>CvRrB17?RMHyBGJH?|yE11*g-ezH zYh$?@nRG0!FRRi@QH5632nZGyw!jsX3@9+BbOf2_63QTs7m~J5ayyCnwy^me>ca0& z5&b>~;AL_3@l;fb5M5J7()9WOiA-yY7;MMl4n&vs^bXXXYB4yajSPN&hQc_aFqd>jE7{Dlj!5}zkpvguU2 z3L&WVTFe@?=-;L(s^~70A_*=QFEo8q7wox7KKEuF*I`)^dsDM0BFQ*2h;nTZ86?u+JCL zFn*Jvwzk$7x7i{~TNF~MRH3LZFPACg3VFoQ7^$mPGnE9pF*pN#f<3@MJ+!5gcA12t zz*bWsr!i$zlRx{_$4D{sn5wHPY1B;uV;C(j<&3pa{oy)~ORr_gCl6ZD#!nb!B)L*b zQkaVzPv%LuWA!Ar`6!L}`amb!XzX(Is5M%3udUC}=x{U|yKUW0u8VEfI`|q>z@gPT z0;U??p+z5f^qOwA$Jk)EH5z-Y8I4}A$ymE1EvdS0_APVBsnqCofuu)W zfcHW*$@nrL1eG)Tz59r1ya6w4|V`Cf&5 zfq^u!Y(Ykdd}5hpx>@}j~P zxKiYCG6Z zhvXhjXU2-joF)6k<95f23{qrSN2F5}RXbPdqk$ml?2$^*%|@d;+3R4N!nKuw?pZZq zPqoR-YnQF4ROxMOqPI3RR1=q594>WD*kv$#f;z6d$*Io26VCKjS5%rjbq1r?sH%9T zBF2R>e!aSesq&>OtUim?p^;+wtUggA!JAPT{vVM?MnsP7A(`_C77)gbmWm&M0s1jqh+g=qufJNF zhMVx_Wy_W=0}4Wge^XUcQQuiGB91!P+Y^t`GAZ#O03|^bNuZL-B+^wNQz9D6=v4|a z!FQ2@D1jq#lHfb1__a+}I@uHrduP?on)$7bN}&^%aCEr%=?l^#)6o)E;iL*S7PM!hFdENTz#*>munfA87zZ=~DNe8Kt6_qmD%kz&2D1p`_O5^$wR)*)=A5cyPZ z0nyM&Ko5&wQ%vVoAUzjjV;GY8^U&Ha1u^DJzQs8BfBzQaVe%~oeFU8+AO)*MN?#U6 zQn~2fmSU*{Zz1$f6MCmXA*U59%8(qS61jARsz~oDk=~Uey*D zjrhDXX`Untl4JMZXnrbPUrYqx^jv~iqi&AVqnifKU!F)TKYw7(HbU*&=5%dd9F62Q z_w<}P6p0L-I`=7S#HnixZfH98q}WrnzOeiJACNZ_TDZB7kac9}l&uNsa8)KRX{l$V!RsMQtafT0Ik&_!4e6jTyVtU`t*G%5xxfVeEt7*LdSDM+PlQyF|3Bv51U#~P-EDVc ztJ`u9cDung;4s=T7;Gm@3Gp>x2!tUd7eXKj5Qh7b8$t-VolAIp+yn?*Lkzs|?j?Ci z$R!Dv>$FPuTYH~Vb*fY)l?d;Bk9_&uQXSRVd+llMwbuXt(+R)UI4;Znb#mhIrND@YDm&esb)@|jN~W$iBj0POWu*I7UE8u z7KjI91&8KUV^T1vEtg}3s7G-OMWcNMAdn(YkxN1WO7I!oJrt&bm?cy|&=wUoHj%AQ zk2ZiNq9|PgNxIDABp6QHfvxc7#~g<|b%i~Jh}*-y>%a%Dz!nl|crjgxsUvrvU4;@U zDQxG+}I_2iMN6dqp}-Z4ig|@(7AE8n6ij`iV#|naF+=j312{3afSDL2U6dt3<>w z&oLQI&yquUptCyk#>bczX?aqQTOL9O5XX>>=DP7^+uOR`o166blWq(dVQ7ATm<8iV z*_@WTb@`EKm4{mTl;DsnKfMqeU+mMVtu@?2}%uck((CL@!+M-@lP=e9{N zaLtM|7ENM=hCq_M9i9^kEeJXTJO`q9=VlW@x5My(4FsKIu;BG$T);rkO_#OjzHn9w zgriP(a>!F6pD&fjw5;_zN^YNr)PEWG?;^QCo~Acg-T>4mgoUc*)&M6qCAJNI$F4>CB6KFCmh!k;XL?0bhd8brwN-4vqq zn^1yTn1^HV2phi#mxjVZ!x>TNJOP64w`7*jGx)25cO`|`mGeNH1XLVTqS}aTSLJJ< zDE1u}u`BjdqoV}os-v@`v)uO{A8Yj>`V8;e+p`xzTBbi+ssE`b$KosI^8Ne9K$ByK zI~(=SnoG;Fu9^RKj9g;YyT6nF7GTLzf+-2O+w|WOjcTeCBHF^{vfTHa$n!9*wo(+l zXa01(tsV@3$g{ly`80XXf;_{RK5kcdd3dyeH)BZ(=3gHp9g%0mC!-h5j-MG8k~Ja; z=x}3rnAEyL&&ER>dPc^3!k!5n?Ib+S&`y1b1?h89kP!65pdb=V{Uw&9E+dZu5Pc+RmyFz{$+G-t*`cIJ8f^) zu&zpT_xFjtyxisN_VP*@`6AlhAGkVsckcZ8mL?R=pZ7CPg*<(bBH*b8=&+|WS>q8!H(Kk6#&2C)tuY*l-QVDF*bw?-gn$w}G*>oZ{6bksX zen;M!H#_EP8_=Xt$e(J@l(hBr%fUn>?AE*vA+Pw-L;l!M#On<@g}my|wHP4n?05BP z{Zxv@2VHJgpQoQn(fA;8AJA8j`{*+egDSJgC`;kojW3+i2hr6kTu;V zix49*%)sJB9C>bd{$^i$)q`62XqQ%r#yowCu|_bem5>TD zsPgrW4I2omYIG==97y`T{f+hHXls-;q`{(boTQTN zIucE%m;IU+2xyw0$5?KM8?44F2or3ivzV=;0wC1~A;RrOxsO0jyPRIl8FU5HNy!%2 zA8N6*YjR&h-nsAPbnm|b2=AmfpdUPNOs{DewA(;Tol1pkHe5X-9?#}Q5AzYy4iaxI zN?UHX+v7IL!Q6J+Pys9R@&6EPH;w2|O&}j7->tuboU8v9d24;7zWe4a^7UsC%~z}c zQ|;Mj$q;#7{ln;B=Jw9eU!;Eq$8biCjfMtANt`A`#;e*fqJX#onDUnKmWDO_cto=7 z_A(Y#o5gDB(r|9rn@VDtn1s1*^TuXLgEi}H*`+zyCnzn~Ig)MM=ZY&YyKVFUK&E?k z^>l7%|CR4n@%X*3Io=JUnVBCM5Jnq!LXOm&5uOGI^uwY)*WX78#^_}tBe6;weiE(U z#80}M4XmGvNLUMk5)U6Mit_y0La~XY6mG|Jr}=Ip!p722h-ZT*P;NvPrE4apet{L# zGIYiwve03ujpd{~SXE1Mm9p3Jc5-`Ze*KM245yIOc5eP=6Uf!S^nG#1=W*65|h#dfUphd<2F(qvpz~U|1)By`C9mh@HE!d;67~N zJ#9n*NmQikpvrbC5>>p;@kj;))M3x0;?eM+-|OzPk2pp!M~uf-6A~(PJ^u}`=tmCn z0xUpMq1weG5IDY6c$&wU&~q*1DPhbm1c{+c4nG!c!t(qTtW+HtZsJYl7H|X)IJM(V znJ0ZX=JX?L3&q26r{rI`&&`mrY%T|(08{!z%kC$#LxquJkV{y&w?eigaX1?t>UW7j zDd<5;8r=5K$X2q!_O_EpOY`eHR>)^Zye!)x?>!te+qAe0AsEG(+`e~qYPzZvMiMcP zTM4NlMm}n6n(b7H?XBPCtM%OB?dRL;&Hr+E7c70iism)g)Yq+(-N7e&+vKtH$ulxc z;KZ@oLbXz!7%dL3jjT1N5^_Jb=jGZvbbwEM_yi-X2P~K#X5Ra{EF%_O`B(ZU#ts;U zF*u>?lz>f8&9g{hNq}Wc0&p_S6>-bPcEe&m8TV>x*cP^&KMtIp#%_4%6xHS~&b{F9 zA!cXQ%|Gp7gbC>I0C^Mn6gWWsgbkT;G747S!-a?5QF!>_ z;zJJ?9(uU=aAR)JFG3h{Fp0iFh={aUh{yVgEQxqA7B+CpMs7-qD-BExN(?GYe?)j*bA5Q~9%)iU$7SA;D|90+>c4!anUBF!DJGyeLq z(){{e`!LvSpZh>pAU38W5dAGY4Klph-WT}-efh@1c#_Akmz%4alOLSYE9UDr#xF+{EllzNu z*H%)F)fS!x6`UB+w-XRJVw+LW2~RN0jS0qQ*#ZXK#w#V_!V$Qg$yLe?@HUxeKA;uB zeFbx*+;3T89#w>$LrBalf^_xie(FhEMw1_9dd}SNBiMxfaFU8Q< zY}7dS40&Mmmf2WjW^?qbtE+z=FQ>go=I}*YHOU+vrZ?VPe@(bFA4A@O`ezW6u!q{9 ze+HAdvhsv*PnW0n1i{=v0mMrN-__(q#-B}O-HI(#K(sJ>b(46pkNUNgW<*aAU}9`1 z%0KKpI8dx*yq=j82#!chCbVPG>669b<;fv!C>z+kb$I<+txC2|rRGM0wWV@+WT+2G zgzE|wiYKQd1Nr$>cyc%*x$i$&J~b0TRxXa9eug2a7vMhq`ocUF)crtesR^W3RfYv) z>(fM2+ZdYK&e7ED2acwmt9HUuV-eR+hNs3o=SY}p+>MTctEM00o?5G2UZCGQM}CTC zS(yLnngwI8M>5MsX@31kW;xCxw^pkxAzRu~ZE->TDH;arF!$r{{|)nnUjdI~n_0eJ zAIUryd0@D8J>3CM=&#+sl*A2i+TBzYoR}Rp*a>Vl$0ZkWIQB2CKDM;_`O;!Pz}8$9 zEB(&hdivDH`ttFm#p)e%cXTqG_7g9(?s4ZM+48XioYx~6_*@q^Ry5}1*Nq)ahgazj zceJ@->3&C_V6&+^cG77db24MQxUty}u(h~YW#(Sg7xkrDb)mY@d6v3=Vq=>jgd>?Y zJ$G^LNG3dOMz5`_cp1*XtM#AlXfX%a1c$9LNBfA~&g%d7&(Th1TV269y0x)#X7$X8 zV~ZVky#AluWL=`;M>3((9lBxhE0gOmA$ZNXWbU&*e# zIHi?q$NFZrgKlcKlZ9jJ7re<5eOyRPEe{VbPsM1%$_|@%Sescurjwb;v1;Mu-4#)5 zWn);HiWY}lQ^N_5=9>=sIQhvx7S^UBk*W2(8OKL0)mz#QRv zYFWbm?bIW(+#2@(b|dPapT0v+ccmopKd=(oAMw9MENxtx?#xj#vm)gi(SE^T;&_JP zmnM+;dSaXsnGtdz6vQOtkmVYtTdb@cNF=cijFn?-w4Ilu9T)8H%*(+7X}xoETtbJf zH+~NC``lOKOe4q}l!Xb{(AV%jnM_c`NvlK#L6ngK7g+|3#0_&>$t8slBx=p&Br!LU zn)SoEk6^jy?oe-Cw2Yn%BQOQ0^bO;7no0NE z!F*m-@>BV#@lo6{JZ@z~9bxh7juE+zef%Bn6y4E#FL|zf_jNsX6hvbjIVvR&)3Bpo z$Yv;_M_j}PvSO33u|$cXOjO$hRb}_9HH@N*mz-R#rBL88s={<(dSWaQ3lDlVHE+vX z?!tYROi62`s$=IrH+OOFp5A-T5HY*2?y=+S_6%<|*hH+k7o=~(;#~~UFgmynxtGo5 z*I@1isYH+xi(};BNos3oMOfj#CY}^CH=B%r1n<L43A>c@{-9 zAZJ^{`-Y&EwU?IW*B@PG6FQ4+0HAw61c1L`brp7GWMQ)vQP2CnP*D`SVh=D7wc)3G zwX)X7XIgpLoI(GNf3tv`bMRGTemL;3ZVmtl*5a#C=l`aoTSMrjS(8oBfSh!OuZvB zOdkklvkU~7D+e$P*hY)-gIf!;iN5^$rJ1RnmEqj+?ed8ihV8RU4+id=z5Q~fbbI~n zk@9kGcy%hu2s2j8QTmZ`{^G^${IM5ojbxACQJ%Qtc=p)T(yMB#v18+tiCm=~%O0N` zicPKLP+}l5xr`&-6na$r*&R1$2`b&zHClHnhBARj64C&jiWJ2R5#1A_w? zH6O{P649Z7%3y_2lsNaX@R*Dm-4jS1$V-0Zfa^sEViR(z%PoSRkwwP9lY`crl2}7J z4f9mQ3T6zJGWL_ha!T#|C+sLZlmq1oI{^>lK_S1jqgmQ5v}cs~g5Yiq?*L|$)_cq- zwYQudad#fZ-eR0=hczAjWIVIc-kmZ^U7Ox(Myb8^#^H7T(DpaZtV6rd>;cawozgcz zZKRPTNx5Vrin4F&U`A;jwvL)nYVT0@+xg+s>*fJ#=5YEQa;D1?0)BoMjr|$(Nh|ts zmP~4%*G5KZt(j3;KQyD%*smMADNoq8+vJbuF3vsw&=EGz=0gV<1ULa3;F$#DB8f++A$w)r0-yA@ATtuY=XBYCxs zWxdFeWPaAvQDd9MIz^?5$PmD2aVQ(f8i_5{7AypXA!c;aV1aiJW(924~ zcXGuEq2Z zL`)5`i%tvmOoMnaZTXDz&#;e-QUc?#ZQV~G8fj&q!Mwsj3^W+H?!ZEGAMW+tm}uzt z(4#{=5@goF`%N6)!28>eSDdIu1%!bJ*j@8ClJOe@A2!I`F3$ghG%j4-NoWWqw_ z=bG^u(oP#6@zcV5Y+Lt9Vt63n_j+6on<~boxCbTm_}!>G8%VY_$A(3k8$Nm_^3cbMu#oGl#E~g6#J|y(eU6v!0+yJI+T=}(y-5s>r(e_{|5J7 z6CFBk9xh$`E*K-tZ$N4IRo;6?(obb6Ohg$$fcTSY{ABbu*?KF&tROnVvMgS;ma7yzssvBZrBO8plrgoHK zio4KhGQ4uHz{r}D&RChpCxyG`UO4`nn z1}GT|m-r8`#Zv~|lLd(B{|Qr|(}|-c3QmzkBjVZvvow7nw~iGb5<+ejJ~}Evy<Qww(2%!v^himP6IQDnX(GMIVnGVdy|YZ&$qNCj`9T^>vf=Hcu!izZs48 z`XX%ke7=A$plMnFIoBl4zQZM+kVnq%3pyyhH z@Uze2ycsG4G75PwSARk^v$OCC(7*-qCuAVwg&_atAp1(?@l1AnCQ!;udGSjkb8(IR zJ*xgB_Rcb{`7t;Kx9X=8aZ2bQkx9iyML921ki?BKg!qdxRLOjn3=?(40 ziShaB__2v&zI0}|fQ9r%4;c%K2{}W;=>3C?ecwkkPdlQa3(a91C8svAra|{h;mdJ z4-1bWP|PTa>wt~G&Xd=c=GW`z4gf+ll&P?|YxgVNkPjAhD$XL0Ui66B>UgZtYK%D; zBAG4BZ6m{(4y|ra?QjZBGLEf&f7e7#gIgYb;Ciuh?#99|Z`xUgQLIllBB`0QyZ>-g zk7#IW!(kN;wsxKStk3miZeFuiUp#`vWv;Vkv_F+>wEqC3cW!@YyML6o|95&YJomxt zZ|~Xm7!91&r<+P^qD&;fn?KjoZIxUb9v&_X7yPKahCF|VD6e6yY;WpoQr5?|B&-ll*oonhl4S`5H)6-o!J!3G^BE?bv&BUo%#j zvAjC>zI|)sy*IwP(fiJ$_BHHg%N)A>2pQC36nLY5t{o%85HiLP-F!`FVL=d>!UrNH1&G0v z$;zW)>?NCtXribD2@x^+()K&K5p9Yga;Ap)Nh1_*lPTudCDn|=GhPUJA8duF+>81+(x`9+z?DM-nbkv4;sL zOzWljv#p`^GAt26MqzWNcv9O0yWL17Ic-!?;F9XV+an6{l)F9(%?BACu=!WpdLol1 zFg}`|&CEtwtj6!-=s<@JQY3}<%qBi15JY82ytVsNJ?p`|7CyK(@-B?`5O!{GtSLKa1a?(BCE)a(gyIg zTL8W;C&1u9z~}CFhF#%?wJ~4YV(r$Ov(@mwYrQX8hQM#R4Yt-KEy6|p4r3&oW-}ee zklbtJ(OL_Wj6B*H8;$w7*_p|S(Z#XF_7Q2F{oO~TwKqo?oIkL3w%1{L$YKd|MQ|+k zPkBX@TUNwdYt7N1Ke}?IZ4@RBTo3z7!+x6Uq3l0`$=_4!)y~_@Bi`OS%hZ8`c!yGC zBEZ`ICD5i3jPgyIrbU?6Gg74ckfa;=f314K7$(45cl}&bH<*VDcmSfQA&g$yCR4*I zLIrsx(FjU-xn7JgfmvqQHl<}*VU2BQVx=NI)!Mr*4YUKjJrSQae;w+Qhak9wIP}BbT62 zRtZu79iGztMvo>ZMtq{I#A8TMZipe}co7*o(^!?ZX86Y{b_&xkP0^bIf07j?HGOY_ zntS`6-qu5c!6!nsxPDa83zsIc<)BZM)b-W3e*=eJq4W|GX%X2a*MF)1e zk;P+TdDHEG)2f}<0 zjgP9aNAI;5y=9gakvYdY%RsRal^}h|f%9u*WTZG!^cYhMd3<_Nv&U#z5A&)1#XVWH`{t*j?J36#ks|W z`TaAdm0_UQ8G}C6QKw0wcI3ISW=7zu^lAD0WlgskV3wsVcdhc;(hOYEp|p?nR5#Ho<1&gw1Q4PNJ&9 zB?mJXC<;S;BiFM&)%GV?0mA-{>0fsFvu!`zTsn$>qb&OmYt z_TGKOor-=B2V~cO)Wgs4Lf^>zA`jC=LN-5<)t!s*1V})MMDJBF`nF(J)OTTZlC+eT zV9KBg?Z<}4bN@>H;_52-fZ^9%+npm@^-t0p^*C8jlu zy8P1QBwA;3a+Q3bev#gIIJf%@vrabm@WT(+|K#28#ue0O=(NUgbb?%`RVJcB1XUDp zM_{=H1~9ZJw&MT%DYwlQX;tBDgt5%Jaf^EE;^OinkL*`)eF282{?ZU}rF+i;kRg`E zOyR8sg^2|!3D-duZIpsck@sz36TQVnteOUhMM48e*k@P8l$2s%3XHoVn4)_@?)GZ< zfP!1hPvCxL9Il1NjHW@y7zb3O5rh9 zC!5!EfDSuQ2D##*Ta3L8z*0SiOh#M_H{su2{RFSi5pHGitG&MhfI8EVXjRu;=uKTW z;on^TU6NppHdG}-0PrjuYcFOQkWgNDLLtaxNku-+2H6*mv*zw|s*329yljlI@{hH( z)wkVVOB zMoT&Rd@B35SC7}&XrP}*VSDdi=o{H=3c%@41sFlcCL=%gV&;XFbCFA;MAp}io zL`y7UO@OK4wynDXko867q;=*Lu5g7zLvJ~i%x$ke5?CqB9820)`^WFR<${il+3pYI zwqCqOUQmC>*`L2_s)+USn|qst=V}!QLk!O8XPrbM4kAiO|BL?>?{=zo0S&D%UjT1t zOPe;nCk+kp8qJ~DP%Ik3TGci}CalrqtE}v2w9G9{MIRA$sMq(&L$g`+ihJ(4`L!-O z(G>dj{)PNM?6e(3?GiHzL6{C9i$Ad1NQ4i8Agl{p8GlYgwHC7^p`|IQWbU8&LHpxY z)0ts}(RTCEy(jiI8P3cLAv{q+g9Aa43Z`_nfNF@G*_tgjCYnv4DVL2kVEg5=4IG*y zF&9ks=NgLH3EsF4ve|P6BQRm@LEN1eQEz555G{sE-f*|s0#mMA?D+on7w>-~o6%MJ zI7RIw4@Q7Ax63X{0#JHiO zZKF1DAnzpCFDJy1Cq1%uxvlWo1KIb7oJf@IhCQl zZZcwJQksV?rCg<~w5g=OxHP~1N~==3AZa`Aw2GzUj##BtHh-Mx`Ls+MPM_2u-QAQe zGsmeo9d>ixsIBuR;U}XwKtEn3?=mKe(Z5^vs!a7=h5#~6_7hQX6G=30hQ@T|tJDw? zS}|V>;Pbc~s=_A*it`y0Lul*vllbm?to>$<5Z>R`a{yXpC$ce$jD46n=e>^Nt8f%w zze?W4lH%EBFP|ePjI%zgr<^G7g+oX;kS4BK1G*x#3}33PAAet(U;h_tH`rS&QuoG8 zq&GkU8`e>RAQO=YA_CkQ!&akGLPmW!n`~1RE`x^V!_y$aP)OUW3&d_I`$&w4$Hu$!LP{S3Xa`$@XFn@m+lf{l9xuA9xhO}74W@O-^LzA57&H0ENfH3#=2$k&zU4(bZBq@L2RlFIg&%E3dz!9&5$s{4wVF|aHCH7-Mghj5PX!?8RSOu_ zZ&^WjSy`c5HnmAl?e(DBi>^wr7vl74rmE+&RsF4pFQc5c^CE4h7yfh#1^NKf8WKP; z)rKV8o$+q)GOq_?atx1VH1mwn3UruWguJ&Vw*pooW2~sn66n9Su1B=QdM8VmuV~*& z+DH0tjV8S1&^5{1xI1+CvSbws;vMvhSnG|kf*_GZfhaN)yFyuT)bSB{ZO8H^iu+*U zD;jALwvq{eVm>jIoPs#SF)c8h(O6xAKf$y|&H9We4NjZ7FcKpsFeHh5Q7Yb1AJ(Rq z&z3eGxnlx}wnuMWE^Fk=^;eSH>c3t8IMQq9Rxi)tf3vHXYqd}2mM4eI%`!5%oc$zI zk`c@2?w_sRf7?X)-2Iig`)`}z8NMG0e@8t~f@81+&(m*n5t~v-#8EPL!%1u)h&JJx zN)*McKyY9>stFoBetc|{!11l)TkEUU%ILANW4X*wDB#!n9X1rRZ7pXEn52F!jDDju zC(G?>=q95d8J@XoWq5e?uFBRc!$Yq)Q@ymDtsiF;e&KQ%Ho7O@rsS% zm2!h`C|X{j9}?nI%h}xV$r!cg*RRf2?>U*@-n!-X{4Eb0A6c7<_6?-`?#Ou38!Rkj zwr*dDSGS7AQ`JOb?v`S4s}lcygSL-X{$Cf~0Rs3Ti5@>5Ep8%U6eMs*7e+eVn&dnFl8%Xh-TdU@j`acl4{v25jkIu!B<(c2G$Z59vG>p+` zxCc2EYP~&j>PF^(EYdBn=G7S34cD7jmYdE+@XMw7_58}c{$)LKbyk&d{nY=7t}oU9 zfZATYuuO0!VT9&7yA2IM2F~iYc!{K#*C8&^(afc*s<6YtHg=p%i<`D)$R?8t4=Mu+ z3X1wVWYTj77;P9Y9Y5@5G&980-Dp7JlIc8ZWs7H;wpX}xh{!dw;> zV6uBtBQyx$(NN;XjQ(K2$%y{68gvU=`kkglS=;E_tR`*FH}^K!6#pRwBX-YHzZr30~(= zOBzJ1<1i>RSLoK%WHKHaNHKPI79&7B5hE52n!IQYIqp%KGfPC4UMO2-TS*!0@)!qsRZa$5;?u>0Z@smZN!=tV3}GBlhWO{dFafk;5JIRZl?vD`w= zmx~WaqmF^hpg-j8SDgd#(Zu>W?3X!GGE^J-EFx56(L)BSGM!09!Z{78_>I(z)a!VC z)~Jo}9%0DNuzbmLM;Nr`n8`5P(Crc+opRU@8#YxL&L(30E@f7oZ4qkddE_49eZ0N* z!82)Ijxv4(;(KT4BK;z4p_XKRq`yxTB%Kfi8Em(RifVKUQc*B9Iu+ErEhSXA^bFUR z(Sg@Si@8kJn@S=xMhiP_Q<=48;j#H@U7@W+wg228sx7|fC0*8HvSkh=7tfbFsMMX6 zu69|Pv#k?iY-KD&n}T&fAhLIce4ct>6YVoHj1XdJ$*|AnLH1#gM{b{Wx^;5x#If39 zsgO-)I@-sGV;s7mTMhJ)hJo_c=VyCbvi@2-^L+QZ5jE4H|!6vGq3)!*3s^D&o&5K!`ug%i57Ep( zq$qnFgO#O627;AN$x${k@T}SFA{WvAHc#Kzg>btO}x!aow7@Z4sERk}*u& zCDSym)g?=5YnM6dyZ-HA_BRp&k!PrF`_V{4ZQWY z85D~`8EA2ZY%xRmGaiI^pc^J|l8XICBEHi6dPWXLv;M$v)MK#%BQE2F62uzp9M++mUq8O@%t4*0Ltn%(Gv(>${u!H#4 zL3$fqMY-r+H%`wc_uvpLn7C(0gJzNO(S=+F!(s#TJOXyrMP*`_uY;o4E^!v57RE(G z*Z>QcyFber7`e6tC*C#wY+Fx7BLrq=m>yp?m53}v7h3rk5od7_A7gi`c3^3oIG{GN zJA30Bx?7dcp2wIT+q6CjqCzAhO4sGN7B)SjI`&qA>t9S(WnYJ7O9}Ntfo1=j%IG0T)qmj@^c%(TZ z*uu^u(jGB?c%Qsl3%^$PVH&hX#;xnJ2=D80yiyGeILB1Cj2R=bLmGn7j!*G%<4kva zEgFBYt;cXJ=0|dwL_AWA7F)*-_q7AZt~G1YVHjO4DTHo(k@VNB_Azzy5LF$72^?Dh z6{B{ja1KNg2+NTyY+}IK6wezRa5;;GY&sSlm>8Teb({$7y4h@O}E;CJ9MA0 z{BEV&yg=JES9t^yxZlRYO#c##nnXhY)4JypNW>#U&DD(w<1VY)NZ52()`F2h>AIrn z-}B^-$@fas43tQI?J`bW_d_iq)`462{qy1q2D5}3ZDF)FK%URe+rq}>4ROZwGEj*)xo z@0z{u)=9ketnQtqVQPa6Jj_Q%OSvc|F)sy5HwFhNtcBU{#FpO~E6{7%WKH3KupR=D zP$JSt`KMM@fo)wQ;L-Z~Y>FhBUF|dm7E*$2c6wTtt%G1t6AWwKz}1B z-00s~^I=r=2KF#fr8~GP(tVOECV3Od$q9Z!>Bu%lbI0tt2P{D+(qF z0wD~d!tSE%HqPfP)@B=JmL!2bbHbk>XE9Cq5c%tRh8F87@~z!3u|n-%qi1WC-H+CA z^kV>oE9JO4z0s&6-QmbzBTRF^8)bas=gH;zhsdwh-%swU-_CB_=g5c3qxCyj9iQ1p z8@TZPkI6G&WyOq$5bq3#{4{9Nun3)(J=yJcm)+&jJer0aCY5F{r_27BwU5MAs~A0G zfEi0K@tyPfZ1bH~8bIT%Ea7?RTM=p!v-b0IwNay!2J@iVPpns*(aTOks6sGr-iWCn zn@E@8o%lJn2 zo}>SPevvU!>H4D2%jz^ycupiJFTsocmzjb?gPWMQGvX0^^uEHlx|9;l?&zca<$+%?pfHnV|4kU3sdC_53Q6h ztmK8=n?iB*PI>n7;~O@gSiQPF?8}s6(X2iis^0x`TbqwxsVohzU8z>DtPSHC8Qt3? ze@DLuIXJ1WVpYcgL4tIQ2mui{WFjaA2O6vFhDP>cRoX)G*m!Ixtt0uew#LzO4|Z8~s@u}t35rpvAhf*@Y9IVFL4TE^RFEMw5|FLnTHK=_|a zsOKO_>(W+O-vCf#1!Np){)g<^yT;#Y99gKR$Nyy0WvAvo$Nz19B5iGN>(SAYN2^v! z$3~CkGN~l4U#;jVviaYKN2@`o+L-@V&J(SC5ci-k&|$>uZ|jYy(n!9TJFLBD&Ps+8 z6}~}lfCmOpWhHRtj!$_A1+o$Tl!r(_@J<~#bBFHZVIfW}FH4ja+J*TPiZ(x!cJQ=Z zG@b+gls?2CU;r!rIT+C;)ZN+E`@CN7fOkOiX8cJ;KGqJClo)`AzMvH*Sr=EyyV@b9 zsCn>Eja3tE(!XMLqCtqjdHq(A5CwN;L?*aO5WAnooRaaJ6JC* z6z;ia_f2NIZ`s=6g7EN#C8in5|?VZ*U{V{o9g z*}SN?Q?oN|Kqlha*Ma(ntiYzuJ-Nq%bwa;td+%Swr`Ze}f@^#-IR?BG2+lJWOE-QJ zfW^|;Y?DN4z_;m+EbtPzus&e?nxkQ?b4a)2B4pDiT-Y~#h*`Ct60)sRX!p$=;L$#d zXv%{0z{<2u;a$du_R>l&F?V*Nn4bDmCdj!m6^%}<H=qpn$j6~;0xMD#)X=?$c9Ucxte2B24N{F8pw(RzJG!nK4 z?0)n*H5(GNHcs2l-X{HKi<|jqM>o^F40d*&cqOIywnl3o(e2IqA>Y%IAj@XvyKzfw zZG2cSb$SRC#q1zXH1prW*0%2XN&5S@*4tMXr?GJly)k?Fv6E+?*eR2H^!slq?0&j* z`hM)M=`CUeaE=%Uy&pSWETn=W1-y?78xbOy9%7)=hp5=s{6J~`6**~ogJ`%K%NX+l zmZeRnO%d=4s5(S}jk@6lj&^&JUH^?g6OmimQ2#pK_ydE22=me`Y`|&;%tw)w+6*G_ zf196(=$%AzS%-acJUf@0i${mTg9CoAJ>$sW{Bzj`Ec35-Z;!s&Iz~OZdFGh)?%r8= z>jd=q^%_Qt0)8qBS@CG3nOJkqD=K;-B73AXzy8KUdB|9#=_`lOkeM7}hyodgMffG% zgS{9V&1#~oM27yqAj-^-NaA#PWHG;(h=m5c$Ui?U4LA7bo3N5zX~HU{`Sq6^l_d-n z)MH2H2s0JO-VS~kfHZPv1YNR#mGvMB;u9d)h^z?mbrt=6kjTBDC<~?_QD`s_h(`z0 zp>$v%FrWoAEr=ZCBoOfXWQA~PB2E%qDSHLMixrhvg)}{tB@g-ryc&sZaH*n%=1WJC z>!VLT^^_J2YVN@SVMK`qd{K4x)U(gh-&JG2aEiWQ_ca&_Cw0H31p=Dp2aq7K_apK{ z;Xy;QY#q+Q8}y%_BQ|xv9+k8Ks!e?YoM0E6_UD^IX8pwBU_MEclwge|hAv4iCS=yf zh0NFwu(fe=I7i^jEho=yoLgHtwzM$cNt(*d5=ABgr;}#rc^>c2(a zS|6$JzIls${aM^5zRUnfwP&9tL*#k&4}*wvLU`8Ppx-5)kWP5q9TX^LW-6?jluMMEa3!DIidf3#`UEyD zD%ot#gbFkeOP|9S`KQxMW1)EU%y?=wLKW4%v5-4g9Jqehu{(qD=Py++t>j33p23&~ zC-Vv0g0nckl3jUmN-Nin_04Pt-PCR;3&++kc#|dixR97y9v)tvicwx^Z;D?zY~EpQ zW+5IeEzeAjRSPHYu85kDUz>_>WYbv6yEGLo4!Nd=6CTYs9rP_s4CG^;e{A5Inux_P zr8LmbZU)ZTwt1a;h@3fL{0bZRu#eT*#8S z$ngxi+_bNlt>2j6z<=*SX?~sFI6wX5=GxpT|k(vQ*%L6aldH@xTr>9ypjcrHPG{(*92)f3fFU_wXMcbIv zv>gx)<;Axfx|obp9idPnNC@zyn1%uA38j-drmDL8oeooRk%8mN#?d4QC_kSo2bDId z#h+QKX8v5SW{{@r*=LEL`&o| z8>RkKHrqBEo(d%Mvv~wijR>u(sXN1=!kjyt@egJ3*lQ|pPOw>#Wy+gB2NZzb&MF#E zgcF$XrYg4yZ?-n!%`NZz57zgzD{nrkKeFG`5jPyfrV6S}K-EP>B+B(ZqN?^wV7Kp| zK)j&T#l0M(qSTb%Jht@ziu`74caJom)~&WV(xiHGs~x#2%-b1)+>5zJwu-G-dJe%x zBn8KlB2t-U1{Ud-s;XX<@xl7MZX1?+n45{eDTzTQjmb|&EpiQSXOnw3(3ER1@a!e# zvnY^Tc_`k1(Y1BDRVdih!gOJJVk{904|+8< zZ_9h#tYXh-UJs%TL^E2was=51-lsS9DBIA~$moYKa`WR_k$^~#0>uy`h3lYzYD4OD zSvC@JST=1Yn%!;!?ywt6KM>37^=PifqQVW1w9YWEbx^jfGw5rUfq6-Dg53N+Eu+Jk zC2(~5VG*7|qthou47t4#) z%1ADi2oJg^waI4d5!2q*`sO9FP2QwWXb77Wtex`pK5&-JWp}B^(G&Lm1^~WotQ`kd zsX6S5jN;TA0*3CNVBBjMrCTIh05(+;8E=bZ@^2cGaeH;vJR6bsmoE&wVSEb!{=!%d z4&*##YXOr_4feRDO=NUj6mTUvREN*&MtVW>i1KP>?Sk>$;br6G-F+Jpd1CBi006#a z++Y}ohCqP|@F*6ZQ$aMSj$6oRo%T)?xUJJ{do^Pn2G%Ldq{26w9Jt6FJEvE00*OGx zM;rB)48+oirL%eNb+^oKtZZo8K?SX>z0msV%5uxdo@5<2y>Y(hA!|lepV_zT9m*i$ zW(*=7_mjST6g*_x7=`u28ASN_-~5V6FM%;`^t#FO+oRk2`9Iov(i;QFfj!w5tM4~@ zvV157NMkqLxH@CTyl1X%6o|7!wA4y|lu->AvsQ|@f9@`5Qwv#Y<0Pzwg_g2I$ z+()J+^TXjmcS=h&cM#0u9k_#Z7^PQQCy)Q|p|Z^Cn{PaPyqerRyqD|xN~4zzJONXM zGU-=PE9x;q{|nylJ{UN=_QAY|dVzGUoOK30}a&yl~#^U%5xR>vc00H)CT!s9}RaEcj`oeV?~7EHIzpeO87A zlb7OY=!XQ1Vvc)=$SOZ***@9y4^)sPRlbI*4p`%{u<1~c+gDv8LJsdu%lbv69bK?Y{rl#Ds0A0ntl7$Gtl@G=Jv7laH%Zdnjbennt?BM=Uu z!=t&I>m7^3+RlSk;S&?*z7eO#3cl>9Rk}JlXIKCeYVz|hjUJxM20F{QPc)^LsXlBw+MIlTm z6Qi~KQZ{~R)EkAkJHf!Wn+Tnxmle!qvp7n|`XT1Ijn6PROfQ+wZR>uU8e>YMTEEMw zrfqE51{%xOdjPtF*bE!=cR+QRr$|>QM-z3~47#b*-P9|c}!JyygE^5W5kvd#04g&9xgw<5*9md$Q z0(Y0X4m4vls4_kbaoZ7%)w(8#LXyQmL z^r_zI4LG-~dIWL<boIC;HHCLABv42Jg{;u~ z#*rBKdE&!{lMsW?^C39hM9)_lV}T4wWYJ0zTRW*RV2u)nilrUCs=#Jrfd-2nRXp0f zce@n)w|QUETt$=X^IbO+64tr6_&TgCas?Urjic z6d`#W-lW!%9uJ|Zi9)h~DH)praT0IVgwODraJgeic(QtF1sUx>BP7bpnW+n&d1rBM zH9LEGHJ4qvtC~GA85Qb}3-Re?d*S5OisTmaYvo8e?;aXY`U;zO&sMIS%uhw8*YcPM z!PwvoeFwRnF^6VZY%mN!2%Kl-Ae0awrvMLKK@)6#&U`qX@XwHhsn-$&pbs*RbCunO zv3ML9-UH5Qc@VP+kk>+_DlXRLYpttx*;)^~p-vpO~%* zj9M<)N0C%8=uebBd;ZGg?GLT4K79M+mGggC|MtY`nMnG?rG@!RC(@CbTPEt?u9bfE z>dI>_&&^$a&C1nZE!Ap$wc9R_PhUSfF>&_#^!Vl5YJH6PU~{iX6VwKAQ*YiG4cG(% z{m8Je5#~P%#*fA+F+d5x5JLcpmystsj0bpBHtR)_{BuMum>(l^SId)n-0~2xuONhN zJ89#~wzqY=H#h0=C*6t?E+E}IW}1+N-B4J+we+a%dLWug0?V?=p^&=jar*akXCTvYUWNHxyYA z4DiR0k*p?w!w-OBy%|P!p(>#Q(h_sdlNQo;?IXv}Q2UEGXS;94SDGPTtWT3K)@t>S zH2B)d12`$S_b$-)vbl@(^A(g>i?ExvhgMQI1_AAJrEHJ?! zX}avsbgcO&`ee-9f!Qqevu$jGPp*+wV!b(V_x_*7ylG!XE!I+B|5t-Ye(K7Vf3y_kwyGFB|I^++_9C7`jv)Ak zZTL0Z!%VhFL$WTcC#;_{9!bM9Tr;29)_nj$zejWT+s)`K>Uv@Ox@Z{KYQMjqfc@bs zS9V|Dscx3<8_3zIK@^h6IPF9zB66rB(zh{ZFi*Y1mE{C3ITecm#FDXOA|4&`c|ZeA z3nlEfV4>WdT@s7yx4YfX-&i}~PJZ(*%vr{`IbEP3A|BfUWWz=1Is+Dp(iK)zjwkKX zCa}PEUtgcrr}?}Z-gXBIq$S{ih9sw(ckTLKjeN;+$KE}SI}$RLU0{Aa)<(?fmC1pi zfMIUSOW8)#EHqvrTjg?jraUt}H9i_03iy(2UiHdS#@hAc-hKG`b2WObcMtyNcbPRK zdl#4&KLOKNTNoJ<1q8!xFk%<9rNNH5hNf(|Y?G4&CZ{K-r^;AMr^+xvCeURI_UyAO z(`EmUdv@6$ui1O|*Wb;@OWV7^e0BjGs1RVDg}C%gyco+$05C6IHZmVLMtB4^oOE}M z2+TwO;MJ?bXwyHx!2EMOpH}qaF`}}~#W;EJD&NBLq^c$n3qT}nX2NhuvxCEK^4y*tSxeFQxXLMCE`%CVUcWk85G`V zOFIM}+d{v&5B~l=Y=^BK{7&D-+F;rPd7H=e603ys_1kUo!4v_ShnXW+DNFlILfu&6 zRqtpMEO`5BCzIe_VsZntv_(Ty(t*SP&9(&hnS{K%G{62g`%Hp$Vt?Ll5nin!I)t~d znA{-pfDI0K`&@Qe5m9pt9D-dyA>V5@8Bu(A(PUsM^cgX#iN_Htu~~#M(fPqW3o-Ef zO+|iv?&4hihn-C|g}C^ab~Kh?*y`&>OHb;ng9Cn#=9DFoY_Mh$*g^llwrNup0Xfwe zJWVp%>SN$sT;g5Y+QF1#a~J3SYQHHT#%4aa&zOii-@8C>W5@y*>SSPiz=Cz>N0M1r zX;!Ht5TXmz9rvGBsJqmFx-h|2_Q-+-6h)y`jgGNQ5B`>(M?!{ZhmFPlHH;lM z55t*Hz#08iG(rVRHf%%!DoE&`*m)a_`!M581yeL)bTpMBFgh_hF+P?mrAi~Y!Jt=j z*bsTn;eTd zDY&LzHO36=Y9FW9a~Y$Dh3Y2HUfTdVd3b1y4dBVO<>O0>)ymZ5=&7+&?E~50pb#*l z9X`dPEnwDObnpEUhWEJxjML-5le@ZDj;%AMfs4745k1QkiK&1tZ9{Ag_h8FjW~#ZO zN434W%&um*W)UlRfob33cR5fm5kwWWWUioV!U6)VTE41^UyU^ycAMn|HnSFFy38(O zsJwc-)=*mIt2DoNfno2sR**IJ&|0Q&uv8Fke9g;q7qyz(Ytci~-XFYr_5Ft@yN%ri zv3FhD%@78M$pm$3_r8p_y%swxjg7bb!;{yTO}fB%rv@Q{ygH_{&LP^30+khdL=r~a zj5`p5Wor%6srARM&Mn^aznOaz@JO!eZ1~<=-Cey%-Cf;Xy>Hc3z3;o$R!eH_Ju{kp zG~?MvBX2Wau~}>bu?>#d5@QI2B|=CYZ$F5C&osNIt@53|}C|7#lFFZ9JpW z|D0RZt(IoSHkkkUf5TWFsnk_iSK>c15WHodl=Doy!O7`;W!551TM zqrc-j;HiNlLBA!7oEo%ZXl1GpOxdFp)yU0sXPqLM5 z{KeIi%C3t@CoRs5WG-td%$ZK^plk`|&NUR`MYa|R}nH6Y4uk^nh#ciVj zAt?e4=p8mozae2vD1!lMh>mnpG@|yo5moyQ;B2+*Fq5vB629&Q%!b%P#N z1#(s(3OpTmV0!CVb|x?UCdar~)Y zjEyP3#k5}XZ!wJWTTNm>w^B_Kp&3*%V~|L}#{hw85Wu;0NXKzdw`^z2yjZQ@#JMLu z#YwtpLp_52=kvpgu-DvL}*1xyu4r=mj59gZjTzcurlb6EEf_FGaN1-21 zmwj5u&@h0x!ceeU5I|_CeXRT0O^rX*VJY{F&R?t#5q*b^ci8<&H}~%?u)#+)8UpZUZI(!n?tzpo6rHIwb5m z;V__oE|6s6%3PTjxsTm;+xV@w{t>>mfxj)s8}eHbM#;5X@HGsJ?9khZR#!rGoZ&Vt zW^{@a6sz1rfo`da2i(JsD9N1u0~K=gJ|Nqz+>6RSed4y;=pEsn!r19Ce3N|J*y%C( z|00a`V341<7g>9%?2v7-2-K=z2hAg>MiLt;(P-7|5o|WWZN~d!l}gMO z_L$9{Fhn-v2;n;r#DVH4X}~PwgL*B?=(H4Ld7*$$J;}q@@!|I1mZ4+xAB0$xTYE-h zApb$T_YI?M=s3C&-HfhiUiuo$U<$=TofttY2COwrvtKQ5|n)ULD z?Te!$$pr7f=&DmEZd|_cz|!LJ?Z;=PMz)P^D;E>P$>C7I5$EG31F~bgjgqK(4{c_u z5!Rd6#4qym^(t>A#@yU>OpCD#<9`j+6K;2+9tzcxE?2S^g4zvyz0UOzkTq*-#-0`;Wykd{P&2U7=9=I5R;-S zBhid@R4gu0bV5OR=qPGqwBDXlYXU~xrpa^!l>k8Pe)o7`w&3;^XR`U3g42HCC&c{PzQ4iM-n`rF3m)j@id z`9-c$KFjhVSHWk!*dr}1EiE-I!9XGwC zmF?E8!vzzlW1UX6=iMOy-?$HTcm>v&IFxc*y#g1^d6N~dx03W^!-;B^7m_@m3Ojfq z<$$l>wD~2@CIxIFS0uA)U|^w!}@-&!)YQ%>MCW29*rtF682_B z#JPj8IPHG(a10jbOe!)Ai!%+2GviUelJ_Z#^OdiNMf|Wh15rK-i&L~aB0jn}?UEOc zcPO^@G5jGsw%L9!uG{b3o9wp{l727Ke(%1p`OeoB^PL+&7)93Z!A3lVY>>;+Vg~Zl z3?i5zD@dbRT+nHOoplHyw4G9GY{({ZJjby{Pg=`E6lP|`DjdGNU!R z(ymH_)PZ3Y1A>*pSab5ADP?AOftM`deArb;c*|u^BJ5&=8c$*{IydJ}6?rk|>%-c` z_+Td7XRx|Lu29CrIrL$z)5W#Qp>)8;n*6~~e+FSBu6+z2#x0Zw9S}fPH3_JNVhAQo z@2F4;)Z%*Lmd;%y4CRJavr&)oIM34gTW_uw6U8bO{(u8Hs2?c&3x`_4|G?NTy$?Ht zoUhp0-g3FdX1PF|PmNfDw(SLBAmuucuX{7YyYnf3pO-hs!(t*KM66!BG31E^B3vNh znsTs%F>k_ep+0%-9()Xsy@*d~V_P!#P+!Rrl|lD#hZj{-0{iM5a6>+l5i$-~Wo z9-q9~87m`14c~6m-r)0$?sW8b@p+ysn3cm@v$J4UsLz{8Mus!)4|dIp;`1tjB6WGM zpe}F6mY~E(i#K&#UB|k>9C+96!3XfzMxRH=dAs8Cj9s7ScpiKnws(Bq+Q;w;9-}^Q z?gf0_V%O*GMjL#dkyqdT_wspW^7}hIhv>J4x?WH4C|)n-Jx6uVK!+IkL2RN1wx|NxCt1IBsekJHpR=~~$i<>hjVGno~2zw$9JA^$5qr}=B zL`QB%!{~;l%W3a7Y8af&cs&{oGgvMljZOpFg%D|qz~{l}G>f%5o%X8E8G_>Qlr%r9 z1L721g>Hq5w6|UGnx&@6R`w*~wh14|UX_(@t)S8lMy&)`w^J2mR>-iF5eoG!am)=cIFMAu&}BfNq|rmybSqfeCV~rMRmiyokPg|UK zLjM+&NmGe}QK-+Ll1#IP_Ec+Pyg62{mI|W8**RAUkOrz)-QcSlsD|28t8W`jKGVy)^~0HF3vh{#t7wfB7DguSX?biU>AG z%FopXoQXuzQsrOWQoNGYkU-@bkOYCn2?B1SlX`w%m4 zU^NVJ*o|;L#wU53i9wvz!u0i{zGb~m%RoVy8Ta>(_O}c9TsD)2K01=vQAJf=5)RJr zkJU*RL0qhs<7JniG_epAuoD1Jh1(-)>+t`mt6UdE!Bws&|2%N>6(<&sVdG&SjU2(I zW9{Y3ZwkEoV{e2O9B=$M`Sj5 zrqc4iP#v8TV>Xou12}|7(m-^u)LA2iKVpR=$ffaa%OXy8R!|INU z^>VCQ73*&{RCZrCd-#pvI#(PR3DozEr}TJ-P5umn3wHS@eZ`6Gx!~Avi5ub??cK@I z%XSW#ueI%C=56?WgIDY-?U{;*gI&|tWEy>Wb8diHXA_%7V7CqL$Tx$^2xzb`5FNBRg+_rOEgmVdQtAT}; zszkGPkx`BzF__gD1dW2So$h_L#}+W%Kr)ih=~Pd< z)Z0XB%H?aM&7uP$p4qkMah5!$XizotqMKn50}wg^?JouqW(7bb8lFWUJPQXoi(ZF( z*r#P7Fr$q#fosimJf4}byu)dSkX*-e4dzRIA#MYd27L-Q)`4K^C`@P<tPc~w=N3tGIR&bEkIz1U*5-d$f(TP$ZP@0HJ6Q$rM{RPRvOGUr> z6~?`WKSXXP52HS%<5&@EQMixQXnfHuwBT+WMNlgS7Bn$&rKma^P= z5nQXb_lub8aFU7 z8A4-Aq-B<&N{iA~Man6lyH3JwzYjWE`9#0ya@wqV9r9wYo`ptZ>h9}-0|egbv`2I- zFH~bOT$(x@aEg~L3?H3}#ix!A4IP_`%R7R5N~JwPye+iXnF+bYLZ(x_zi?vkov|$b zZZ3ZFO^F;}VEMJPOr3lOX^|VvqAQ!1nE+X>V`Qvh0~*JAL%>g1y_TMWO@IvmhHEme z^l4$%4H%t72Bc>VdO!`RjDhYj=qXL<+Fp-NH#}G=K~p$U@XUH=b#9#-Km-@CsOmH& zVDE(zs$~wp^t1EHF4X_pf7`Bg`htDdh~JjQkG!-qwXciY;~TSCT-9+FQ`QQA#k=G? zUfOvZkb|@MFuoh*p$7RpvW=CcVmU{$hrkWq9({~)-5_NBcC zgEDJpnMv{;6h~Qf5Un&%r0q7wfZCYRFJPA0gLQ1FNVFgsX+U}grW;&4OPFQEBAu4i zt#sg=2Gsi~nm<#Tc0PwdF?42ptT8fB%N@)gRNF!n`9>wGZGodhr} zpnzefwU_cL5YJ}U&N4OCCJdpi=omWC+(+%gK!WIvgxUfYYysp!S(9oDj9?3lNN+H9 zY=ObhX{V{v9X_~w=fd3hSTP?8bj?8j#mxXkSbk58;o9yjU(;(C$W6a5-VV^i3z>^^ zFAtW0T*TU0yn^4R;xgrCp_7YHx<9Qz=@89HsF{e!MpTCV{}h$E>gBz@7NytDGQ;FM zD2vKyH@XbnjP7kZi+&%&XkrQw%aWawL~qony7B{^rH61IhLyL{v+^iPyFu%3eIfdq zHL%9LtM`RIV*MAFnjwr{{mQFPpFDBN{`UOPKsX4rXA1jfaTcV@>=!ar5G9|7`YMJ^ zK@oq?HGbwi^EH+}4>mr~-3a8ZFK6xJ@j^17;?MD>QH3zKMY#Aj6lLoZ9^^8V;OMf>JtVexV-?swiFcZNL zt{99aLpMR(fd25EQzu5(UwiqbM-J`THQlO|HYbarZTL$_7XJa}@?Ty&->g}m$#=h; znIv;Bn73a2KYyr6q}lsvyob)>O-)lz_FgIE6wgoM6NCvq-pS>A0hLU4u0mR*Lt5SP zddi<*OvOdPR}#E!smWg;;m^LLIeaMz{}&!O@S9-8Kq*m+;*`a+8}JYYV_lS2SPOcs zMyuC=E~!?Jdu%%NR-&!AI@Wy(wRi8@xnuicdw!xhP|Ib4{uGeLm5}*m*$pKX-dbNy zUwk>sNj^(c>g&Goxv}hPtY9yN5#m9w9 zhfiGDS3a-?kFL=z>VF{Pz<($n}d8j+eWdN+M5~5%r?J4>A?+(v?Mzj`|5yItL*K@)kxM^#6n~n$MI%2Ue@)XY<0>xX z;65#E!r#P`FT&Yn`7|hwwD8-pX#gbP)}C8CM|P8k5QB90GQi=AV;9zwa%%OMqLceFoixPrmqPLwaO<_?fF|X2OIJekbEZdL)9x1}&e*2!m!QLl6V`03RgqZ1i>Q zKz(LJMl`*7=7x#87nXM7Q}Tb3Z=HJ*4?)bBMfa22NXOc=n&S&uk5;46;(4Raz-Smu zG~_ra*`UK1dVu@2ZJ-5Ww2=tN+ZA$@Nwt-(^-iG_T~#G*Dh&c+X7zQc1)+!D!v>j$ z0vW+;GI=BEfHahFx>JJ@Us~{*j2Ejlfc~ z$0(G>(%N#D-PuDQi60~70$=AjbHwBglO$6vIBO28Io#(J2sx7<>oXK|`et_SgT?8g5T5Vv;cpC zuobJ>CPwN1B6`*jrT5(okHRfb(mogZF21Ti5pc)CA*;=$3!7pAXCxeUIK2AcMZS+) z7H7Y;-)xYq@YSS$r`e(Y-PLdHH|h~aJJDABI{XN-LpGTq1kLvM5zP$72=rtTS=ND! zKeHR!(`gQBp^fGijss?|-3l*YFV|g=wV;3EkfN%KJO5@PGPvui*gO7iJTkcBRP62e z4Xj393*!t%gOj7gZNx6>dI`0v|Ivh9~5I#*OcM zNB)=5!9hIn-ifPDwf<6>r%`<9HIw4?g-R9)l0||7GjcRTJ+;1cB-M z4)tjUG}43z)CO-i0;)jNkv=?s$l$#~2H$?r!h|(AvnRzG& zq^ZVf2#WQGkzPNtpwkd2iR?GAw2L}uag8$VL;|BkB~i|2!$D~E!$E&uMT|=a#7c;j zF=TxyDVwIP=KU)|#BfUxPn2oiJ7mSd9TmZ!$4O*79EOfW1%e5E49#FuXOs zmpq0-up-TvAr_1QgjIzXrWNd!c2et#4RajF$D^DT65DpMTJBK76$=25OC1|0o|v8G zv(p7%A?`PXxJERb4VbaE^$m@^ED-uU#GRJu%T%l_6 zCPTrLuOFX2-I|?sW?R|JWY+2P+v6B|251Ii_h)I*h*u>0J`8mWe(+kLCqM-K3f`O%k`2IdET|7oTq1|p$ zsZ=dhE#{MncuaY%D5qqyyRXpc2y@v(G>mk0_y9d`(^}^9l$2A^y?Waj$$&QgF20wp=BB)BN&a$j?7GsmkNM@ z_ol0=OVKGqRVI`pur#kFUcFnJ1HhCbNrTf`btulX4h1`;Xsdl^CuL(R%G z)eSvpU}>*RBW<6p{so5YFbH@}K|WahPq2XX4ZlqH%S`82mHl$z-&|@smyaJgeCXiP z-mUGSfl4VOadxQ>%C@N<8Eqim8EsH(qds0$ZwoR&E>x(Z9bRZ$;kiI&tw;S0id{ff z3`*3(I#)=t=bLkLtRor>r+s}EyN!gyTP05+>hh;cPHARP5(np^&1+)8eMjA;geR1* zxniwyFj8-c;Ym-wgNu!2t0MvSh8v>Zeh+VDJdDxA7R&e*wSl=bXZ1Coc_Vx12y@t0zMt9 zCy1b32oW2Rs6J7-S=gjbq{kr2E(r$N3utOYMT6>O!$Qkw2 zTy2)b3-ho?y659r)b5;&y>1EWwKtrJI}@gqqOd_`GZ7naN(7ToqIIBD-9IjQ5@oMD z6}BhFwj~nV#uD(HflAyp6|OWxLZcK6m&d~4u~JC>q(4*l`f6FfH$4yx)KlIsY{<%m zXihGMr|}ATMCGNIn)wbE+{J)l)Q)%P>4J6xK@TE?-yb}GS)_D)e;4@sJxJ-4C43hD zh{RDIlpgaPJt(9UikiCmc}WxeFn57ZDMoRv%<&g)7}Nim0WYhuy;MY7lYtyYP-qgqS!npgt6D zN(LRALhw8TtcI}#Eu{ZPY1*d`_1SEkO=obY1%?r687v$JN#c*+H1nyMcfM)-P4Arf z6#jsGh#2HH{s;K8`Ygi8yp|>=Vn8MoX@-m}Rg6BJohey@Q;Y3)(38q&&W`T7^+f|>)e5Y0<69( zmjMTN9{)%_h2JFK3q-1c0U`~2rt$^wypaF+5Plow$;X-^!iXW50XRm9iD<^Or^;yq z_M(=YZQ9f?TIHmDQII zlzNck7XX75hB>7$Z3glIsQbe(%;gthm;)>K8A8YzlmT6()Jv#XqbrG~duM@u1tD@M z==ai!wG7UH1{~hZj_<4`rDUyE7kGiK)v&LyyCKCV_LtkQ3gvvqhN8`a&zoyV`JLV- zHuRZU&Vl#JkCwb`{CQzyXQ{fU5t$#0l!iUoW-L0I@uXt9ejrOagjgiA{?qhYxgFRY3@Kr7-c0X00%Ww_f@ZqVMBSYSXJw02E zjc!e1UVduecsrACAFslHr?!qp5kX#rh@G5ykqQRT-`8kHH&rlzv8;mbFVrIQQGvrZ z${)nn=J)NBKZ?B%jN*soTH}Fp_y}TX48#)&L6`6pL><j&0FpJZlWx3#kC8{{ z=$DkW}P=_^Gvt_Ai*-)Da@YeB?N35J(Z0X3A!p;j8{&?19l)a+?gw+<_>Z|CY<=KM?f-ZHnhufO zs~;n0R^LmG!XLQ9+H?34BEmd3{WeUA7O;@1rX?bzLfTP2!suOT8Z`8*;CRe7EM=>Ix_40E>k`q6o zYOrbaHu9ge{yfz5cX;fonxpy>CS>T6iFP#0p|+_40;U#4P2E)OoKw2v8ezxJT8G_QH%aMykR)y z(Sw>xfwD8P*~?pt*Z523M6Tqn?x_2P;q7@(rI<8VEtT=vNaN&u5<82>wiYIw5=Bn8j!=(hj{+Pe$%NN?-z0$!{#`yTw4sVByM zNF@1tI3j=Kp@;Dj!e~1}=p9s_+1|9$HoS_|Do2}Y!hCLTwa6o@F*O$ZE|HLyt^@UM zWAC*-&?_EL#o+w2p4T30jJto7E_ARR4xSm_klbc!A# zcwHv?sj&ktV`lzXwSIg)Jz2SY_3UMpF}y!elpN8Kb}ZE%jLcJ?7{(L$ z3i1f8>U%@;{90z;`pTmOgKkN)pn(!)$Kt+bK;<5+{|LN3B@+1=>OR%t zg21tG2&FR*$FNOT0E2l{xen2*mYN(wTLD73!z$?YCT)bAT z(u!VnCE#~SR}MwT^4|E^mUwN^v2`l3Gvm%4tChD_eY?4tdH-NO=!j%JxkEb&8R*fS z9EsU%hJ0&BIG7E@gY|Y!{^#o)_T9cdZ!+jj1v#s()4S6G$A}DgP`ka%k>lTxzS$Um{PA&oul#p-o4kcc^4<8#)kiz` zn4|VI*z{>(eSqF8L>QpflSAP9sS$;C1WH}PU5x^M!&nXft-PH`@*KWTK?WiSVIzLW zhKg(rqq((1A6~D>_R%wTw<4Q`GxiHsWM|H=$W9@I-%P%W92czrZmIR(s_rO4$blSD zTK}yGV0P=jHBkTkX8DtE)JL-g2NxAXE;F8LG#X^8FW|E^&Ai8H!K+uPV}&8^qrL~~ zPc*hC*cgXi)xBLW=1|FzAN3Hcaa*)I~pU!De zpx_48O{a4`!0kPB`U^D#oEp1yE}33f85vudPox)4%1?#|7mKCE!C-i3TcNZ#7}Dgo zo~YKA+quHF6Xp7eEm`bLFOEiIW80GH#Zf6XwoS3RX%Zwhmw z#qVIHZ0Ozsc4r(+j-Z%bRfFO}*DN(%ZWl(P;7YsGkdreRkP|!CJH05OwslK8o=7HA630t@kn>Yn7m!7z$qF3|LvOC4H=^y>S+xWxNN9S3VxVL&nBdib{v*LpG)8!p@P8W7LJyy#}=|K-ZLtW zZi|fUEYkFYgMqQmteqnj5=T*}&$U{JmV_v|`Ml*)Rseq(+bWQZY>8+>VD-Lql(HK- zZ{3r?DVOTBbXUak_A5qC&Zm;|%Om?v2a5hfLxrvNU}ShPcXG$ApRTnR3tN|~_2cdA zL{%u|qK(B=c5zhPx1%8c0-n)}5I%t4hP24lbaZ=fsq~y)f|*)hf1K9WV-!M&7%2m* zM~#MJJfliwzQL7-U>b|~ujJR`r{s6F$s5O3hZK8p7GH<&qH)Y%v(~FlfDshJ0x^V2 z26e-f$R=$9_Wvzyg40?2ofkp(W^`x~ zC{S_Cgw~p$FD*p!@z#0>J#%#+!|xx=%$5V|A#^zqR6=O@`Xofq$@W!KS3(5cNR&rY z+peD*o{o<1dooahNE_<=CS$RQvZ5S;C-8M@j5*M(_Rh`voIo@44UAF=A>?s69eqYLgoiqACr(SRRBUylXiJ9?r(=}_F%IN+ zG!nWL36y72vGIa0JhH12i5$Din;j7*4%zeO{P2`i-ZLi6w4|Y=Gtt^_aHmJ3F>fjE zc1Y!*P>I@yo6S&Jatx(&zI4zUtj?xJw{fgc7!k5FC7*g~3sJ4wBwB77k~{}2vEEY~ zZJ15L;~Dit27pWV)YkiBpkJxSwoc$~MfB7Lk)1suvIf_AaXVM$n03A%^*H!D!Q+E! zgQfDsiEyiBh!+QZsaDY&tjr|6Lq(A}S{UBYSt*8h`3j<=6D>HzJS+%QK!{k#S5XEu zft>CatQm6S0Bh5}JeSA*Rt)uNG$&CiYB9?}&u5{U6wu^CrwXZTZ=S z|G42vBCS69;Sb|)Jg@9VEE5Ttkq@Pt2~f@@3|e-dpP61PszJS#)^S2uE96l>98GPG)8E?n3c$Y{YSx23o}rpo8ZD#M zFt>C9?K0gd=rG)-irOA`JR0!3^Papr5drE$RAE*sv4*pjQf&|H}v=?}83fS%Qlx zm#Uu#QuSbs_fOwBbYKWRUFk6bvt?fU4gOPdW)s3rxr{VZBq<0xdjW(!;+#s?#v{gQ zOW~5O`DJCN|3=QBAWBnZc3`;^7Iuk}-B{2AQpFqw zrlOBgAjNbz&2tICWi>$4#)h_D7rKlUQQ$<@%!o8ur8qR5BN_>MdA$W+_NDyRdMGro zB`5##F=Jn}zNJEbC{;wx8mUFU)WGKG_{v=;?vuaftF#M+cFj-jxaBQhdhPIpGhPja zDluOEK0NaQgqUBEGsuZV;BRO#qsNG4&@yPUdlx_o8y{2$-tCHnU7}k|2yo)H8d;x0 zqAzm-=-hU8y3q5yq+fpf)D%87^_A|^{scQZkNFjRK>jc}BYzEN*PnB==K(RbXYV0r zkPFWK77FrEMF=fISc_KRDODD}`jB>Ls%VcutH-EP(x%e<1=>)~$@3!FJF!qb9G&_M zamYW39jhI?y!E}^bCH1jd2&aiA^+AJI&t|=l(8X)n0FusS>f&&6Qrl@EMeeog{FE8 z)+_@h(o5-)J_ZuTHfYrYLldu;nXpTWcO z|Cav*Z;?T!17VmEa;TGM0w9RW&r#C7mJ)B_ohkR8vvIVN!QOk9_x0QWziGpV)7d6> z(KqUc_y))p2%6(zG7q=D6*QWaMx}5A8|ScUS*5i-1JVv023*KBGm`lV{>Pzdd0TUe zdB;I+b%GpR9U?ndKe7G>chQbG3eH3mZWwkjUEf_Im2cKY9h-@`^~aW_t%b;m5Xz>P{41IpP&EkH|FIvS1Of# zb!#h54`Ra>j7x1uDrN%1u8*--cbjM2d?tTWaLvl>9*C_J>nQw15^X;RV?@TzYWWE7! zykO=VQsE7P=?Q__R&p#{n@!4phxbHBQm$HIbY|KnWWDmwvB8%Y9r6vo_GZI2E|l_o zDlu8~ku%})xKLYi+KyGd#i&dEl`~qz|1Cf7l=5C*K?D`={WKPXzDb}{zKMqf($ma@b->QTSdVpDtXrm4PhQ|TYqdUY zn|COtiQ_mU8%W#1GJ(;yLuyk|pJK#c{MX{=Zr^hIXSaX->Fr;A+m^R|bvwQq?}53Z ze^fICrb>A`hNpJwB8atDL97*@-$AS)@Zzut?M2HNmpSrPc{M4oPS0WWR z`e|}T_TtAOE>K4CPCAO4BP_5dop!ptqu1NJl-#NIErn&i-nEpfpqwRNAP;XwWQBFU z)CHJaFN(;%@?vcq9vIOBm?ORYUm-bNm}NG_ZXGR=iY)Li&_Ch9yeRn3K`vU_e>>?&q8 zk4;9BGe-w|M6%{yy|0KbZNB!zn5vFd*>zcM_{yEdt}s?}(r~zF+>yAfZ0>;jBJk-_1Y_^a;u))=+ z-o=|0d%X){kg)b0@-K`Ac~BU|ffe14F^LOduLc|=ZHRz0NON0HBLVQ4XdCC{+|;8- z*98$3n1JQQI#h+m;-XFmnoW4e^flYkscqNHOix|4C7IfCdTM(5idWruYWnI|-*mdE z$!)!|HF;_=uRU@^n_oON*}8ITPP6=B!_B8oy+*Hp&8gEjL&cRAA#xqvyTIYtz_sWG z1IqEpX0w5C2y}(PBEyIn@A~nNx5!Up!bsrpR@8gC|> zF&EY#4b&!f`r)o9VT>Y=7Ue}wjgM&70*c$J)p9pw{Q2qW*skHmo~nDAi#KwE2i(*K zRjpQWZ2!PN-&38>@h+RP*O@u`4$)==B=$DHK<^0>;xYOP%BwJQtF|d@nZ_2n`PDZe zcc^2-{4F_yEYxzch`o&>0A8hXYQyMo9IbHcj*mJ<%r)npoW_kiAL(L$rg3pgtE<4CoqRn4H_7b zgRG8FYv=d-L;jF0AtVGV?YrJ{Y!U10PlCBJcVOzHmEEHeaddb2r&H>qjHW({e>vUz zG^3qIk>5bRusW>9*ah`@Am&q#2{d%-5TWRRBm}y8F7^x;x&H-k4znFxd!GC$c?hLY zvpGujohZhrXy9Omz&VuC1cY^rQB`;HxF9FjXGAHS0(B?wavhAZE>s0o)Uc}vZ6>&p zUs@Qp4cRIqXF+|?t1;+OkwF}oijC>2#Q6)l3h44 zFkC!1m+21{#7JxJ*ooIRTeq$>Y1FxPmiY*I7gqpgGWf&I;hwy^ir^YZ=VjQqgDt9IvVM{nD@K+P38BW`dGEXT|aY*adz{ym*U9i6bM2hgx zVj;03ymczEEA3uBeC%ouXYd9vkxu2SOD=;UG8dcOZx?b#AX7w!QZ93UerkI-m~EXt z`jmf!@w$@vQY9f6c*E{~^GFdyVqrdL^i4Z!TA-Vc#Z0gcgaEM)XbMUPQ?;e0cY)TP ztL_3C!gu3I{ibLfTB!9#1t0y#(pXSpdeiKo>Rh8LkEU#UOy-(kk_iQ+fS9oJ!{X9 z_meXygl_G_8O?(>h9!jIilh=Hr6va zUB62&``@LJJJ1>5USyzK@8C_&|Z+v^@ahJgjh5afmyc$>kK-8 zs4W+I>6q*78K_QIF?4kD=oO>Gvy0N$Qf2nqz<_JlfHa!%TzRBe+<9POq_mYM*QWA& zwvX;M8;{QBw+@C!E2&hGkJW^k?PKG^^?E$4?i+F!b2qXe4|rbQN+5HmhmI2XRzwhV zM_Pg1t{@gZZ5ttwd3M-s9I_ybWQ!O;#YT}$FH;6{tqx~<1urBvvZdA9Lef@$%#|M0 z$p6^E`k1>5gM)>Bx6Kp{ocnqY@CRD0YiCK0Rx=6B;JWvu*-;3>BM{cRI0xX9b~7W! zm1z_?@hru{`__T-smF*BknhP3CJt^A-h6QF8R8{BL|&9Z%S{u77U#Vlf@T#pdb=ui z(&Yh5v;_>XF!_%D5zRl*tpPv0;IAw#-51LxqSWGm;JMmXgBI_?2Cvs$>s6kVIe_Q) zt@MX387c1?6(Y?8gV((>I(1^~FZ$&_ac9Tk@v*G?&|gnvK`$bkYV0hwqc2HF#gJMbO^?Lc4g zFX%hv7(Uz%1)V%b@n|p+O8C8ez!|V}z?y|vt5fXLS*#-Gf{h;&MczeYdiXEA#h(}L z2AkiWDY=pZ!r8}?g+%Iq{XH+b&BgRT5Q9U^`D~Kl)AzLs;Yy4rhQ})jv2yRvt-gp| z8u%xK0R_Z&5<|C#1hvBcO;#9!J^|l(b`m%6*X1-Zzzo~g4ikYGkX6YaY_tvjg^jj> zg9YWHw!zu44Ghi4tlI{ijJ|bkxP%h|NW2R zcU^zeoBfCYSF78HuNmt+~gVx!!}}17i@CXn+H&ACg-%fI$fHhzFpN4y6guMi-?=)XS_L zYOuws$cpy(6?dFyow#G+&p*E9t*2X8y>-jS{+t+|eDcXB&&j`f>Zzxm!u{uK6v2;gmZb&4)wvd}W}TO^FGoS6!{E#DEN&vLF77XFuMC z>-962@p;A7yL+BT*@xfl)B_Vt zl=BV2TCxmqm%o#FpmVQiY;|UwEAwUiy7m{o(f-Hz$;lQmoRfd`v!4;e-A{l-TI?QifUQCg0qQmXOJ&reMJZQ`EE*8j$bSD(dyB7YGN%2$JJ zQAXn#TD=S&N|nWe44uCxLr1eO-n1P^$ZFdEZCIL|lpmd(#EI{(KKu03ilqWe0lmoW z3S!!+i=|6i;Rj2b_`&B{1oQcA$CEGCblmvj9mkb7eVhPg1h8l|n1o*V1Hy)^sF+T^yD4%qDg*ISkOLzgNi)%zF@ADzJEeS7-ZQZrYK?|Zj@0%~ zL?dH+XHrutLujxlYWkx2nsKr$f0lf2xj33#I9912n@^8O!wZR2dnm$-dGGuD1rZ`Z zm_seGp(xaU`F)$}zvxubcaW6UAR91ml`^=g{wp4vIx;kW+CSmkwyEumDK$719Xv7} z$GZBlxzyy~=0-E%cGC;TV5Ra1;V*RN53++D2fBIw=nBQ=iBI8sK83$BJd7~1tVM{C z+WvS`QhH|d7-TuP*8iD)@ZRxX zSwce8nRVZ3Hd>;Mf>O7?`u=z&-0wyVim#=~Ysn)jy4`A80NHjS9VSMa_*FRRR;1>8 zBk&ACVE$MYB)n{qD{{n8W=n@mDK+Gmo=&BLxTf{XVTh-4+t4wo!5XQ78*CzH3 z%SVVoF2N3c^!>0xpu*yAI?JH(4P90hbL~TIyU2?aw-l64Nh;1UETUOAT3C-!>Zjg~|9^UOzv|^*zjbN4W=l~F%52WSS zFe>o5dxuxwzW&+D*bvw~BuryS56y=oM8lp=?IHMHmEhyUZ5!uyavqz9;}T(-5AWu} zsmhqW6Ckf$BQ*{i1u?8XJET5^5{ukJpTY$QK@Y0!SERuXDcFkD;&fPCRu={PT^sLT zztFw^Ve@@E_k`H*S^NyKqZq`_UJn6rK7ucRXp73Z5RNa@O9uTe9xD8ddcY?)^ebp| z0qq{GYcu)P%nhDOUo=y2MJLMwBmV{)w86q;BD2qz_nvHz9-S1W$s>mGQI}hC^#PZ* z9-Sx!lSN;t1tkQPqwO4w(%LiRv$V5D3SFuIXkk4>`#LQFEL-v9B4FA0Fj!)GXiThM z0_Cah62coyd399NCueWb)Z}6F+|CQE=BT5?ML~TCf?YQ zuPu#<(eZti(vDF{vu9%BU6-^I;~DpnE%8Rig{9h3Ba)muG1NFd9TUg)*PbATABIny z4%W96j$ak5Z-o;Th%J1O?lmv)PoVKS4FEe-&~DgfwOYMaPlV&RIPBt1$5{x2L{`LA z1>Sa+KUQdXvtzOQC$G6}3!b>1j|Xk_>{rbTW8z5Kz548#GZ_E7*%x!?2B>d<^VB0K zg0iTHZf^D!3k2&R*+Du=UJ@Nl2F6+DmgiVimS$D)MQK_hkp(y<2J zvWYP=P`0Mhj`Vt(0}^4CX%6=(AZ|Ks&}%dZrK{;`F)xImOQ=3&NcG^(<{sRc>4N>h zD!t&FKR9$?=)~aR>3DqV$iU#?Rt(D%j8K`3c}l5>VYn|dH2vp{07VY1a)=?XI&|pJ zq1Bty3&#fPN9WS%`6D&Gl}XK10%o_!TLXE~j#H_rlHXsNhCW`*+5%z7BPfeL)U?FC zgdqk@nTr@oMxBfMnlTn@^;l!jYL;ml9D!K37Y>M256@5c76V1KApa)yTx~#vF_4uF zzeV|)K3Ftb9rPXSeDbDi>19hxO>;U)y)Pe+O2D?!DqxS&010Fp6qrY0CaRSKG(vUq zgz=;Y!{H%5(jRr$MXzxn14S5EET>4MCs-I41znLQB)4(?m><(pCY zELkk?-CO>7YwNXF!A@0BlSdGP3~1_;3LLJyEwAJvyMer7xk0D87cHmAmXEZT?t`N| z4ORg!r#QBMI!axt}m3B9IG#-l76}ckOj30DvOR zCrMc9WFWiXw-Ot7z;D`U2q#C5Oi1G7kbBm&sN=ZOs!f!!JKYZwh?ptUfgHa?6cy=PqhpID)kz+w2uruq+ zi4JqPD3;n~?`dNqmXoA%-WhOm29wjD48=#{j(9i`44T|g5AU^G^nLDdPMF=L%rE*A zI=?JxD--JiW^pG+0l@+AIel=5;t>JxOJP!XzrWP9!M5+&=Ag+2u@R7{+n~o`Sbdh< zaN-2DFbI7^wKXQFhhrICuVn$(rB@=j7hq`H)!Y@sl{t3kz|fs7b@RUwZiNt8d-K`? z`ZKB&Mh)&TK9zU$Agl#43oU?OPwV&zaQ_jb!y3ZCo>wk{vmM{}$jy*y3HZ{~O)W$-DTI-N2&(By!0TKS_rU4Rwgo9lv1tb~oJiN^%=J zG1y_(DPblg+~~(nRFkk1^6hd|tx`@Ec1pi{kiQ7PL_k00)!FY$#|lD1Z)xbu4QA4$ zteAE>L%eO<o%0*uC^^Q0heXz-k}ILA>p28(i!0hk#Ki0Lmf*|mn>byiCa7$ zbskR2(pkK16P;=0%7i-vo7E2XKVwvCz_M1*_KHva#x>7|xB`)g#d%pV`pwr+RoUQC zm1y(N=}WlNv%Ba`gx*r;=A>7xL04^Lfoa==GCD-~jhCmKH>_Wf0rS%<+Cp6W!AD3! z51f@X%&{OOSqlQf5o*FiXSC5Ns?Kz$f(v`^ReVhsyA zlG3C1$=;}wW80k3wnJn@d{WmWYiBsLJMOezF&*Q~&^mU`1tG>nrkpj{wL4tZQ-_K} z{^Z#_o!+%sB2jMd+M846tTeh()k%Hc|iW$NEn_X z})MvNf8ri*AzvBi+<6-gutgOro1_j01}Yk zd=F9QN%cy0KZiKbnJu4ew%vE`z4sm}zi`Xe3l8ntnfBIOY2D15hi*3W4vn1KP)r)Kquu-_eZOnfSmaD~pzvR#|*;bYpiJyE|OscR-ObRnfk1qlK~jWZB>v{Q zLxcQ;VWQEwii&W=o2k0GEmTdsSDQlDZ4f8RT(=-jHo5K)+#yx2J2c2o7@iB6=iU!T z_fVbvtzkwWJ5;9tsJjiOhyKQOM+Uj0LfePw_fFMMG|q`so0z&|&@Xa|>y9-kk+-|< zIAlgWd3Mq48;bL1%q&gmliN2XJ#9c*N`F0N^h>!gr?fQX!rak?zT!gP4JmzQ<&>6Y z&Cb8xS5Pv$*q4)+np-rhZ@-j_bEXv(rHr06JEx!^r#L^QPrm2OnlURUzrgjDU6fax zKcgt++&R9&8*>Ws^Kw%9%=8r$6lE1p_usO9Q|9KE&P>VnmH3LU^W~+STU1z@GB#(H zFQrFzPJwT3&JEr<+c#rQK~AyK=_j+FCC5)qKR4PytV2`WP*U92huY*$@D-Qj7Zs*t zq^6~%%{U{av~+sToYJD1`Gut^eXbjjIXCGa&IUuNa;T}<-C;sxhefGOX=ZJ+TV=}XQK$SaRZ8xj~SSWQly{{a?uwl zNJkn5APp(#@4w1GKcwJ7zkC_h-4!voIU^xE?+fpaio~3?Fik zhg9UE2(!@FhITP>FbxGLLJCG>7G@&{1t>s{rAq0^Z*VsYGi)sRD5w`&Hj0qvrbk0O z7jxi4A#Svx<|7X|Hq4opDvdP@#hBiRuK<-Pn2UUrVkT0M4IfHudar{Ic{YY36x!Sv ziyX{?4=Lz@Y#W~sbCH7^8eD5AGcdBO+M9j(R58#A1$e!hof8b zMq85BoE$gbORTE|{oOj5Z&Oi<8!#I_TT;2UK5CiGvaRI?q}p~?Xlr!7+t#$*=GmI9 zd_dc?*6eBaep7j(`RV1V)|x`huoP-dacYOQ9iN}OXdY-w(!0)^K3s2Ge4&kBV|D73 zwq0$hL+XW)QYS4QjZNpghNR)QEdLz}yf%>@^maZj@N>FA{*1;9OS4j}d8NEmbJxjd zO>3a$cqHj6zEA<+eM~y>ou8pzOu5UY|BPv#kE$pG)9fKIER}m?V3{>o|a6mn---;X-l=TxfHW86sO@dx0Yy*=2%Xy zu}-(?QmN#~Q+?0j1D+&P`5p+PY1w?KZNHkzbN%vdoQzMV!9|ugX|4rA9#ba-tw;4GkxCc+rvy<}H(rmL99)MS%j>*+2$tVk zKhMQ*Tw?1?sg-_p^QFYCi?eN+rdqzHT87q{88{6W;arS4s&~}RV!@Y@?zrkgeg_!+ zT0{s!?bjD0a5~!HO+@M!z!8I3#33FDXbYWTk%VNlM+bC7Cv-*^bVWCG#|cQmiRgio z&=bATTjyb*FHXU!=!gDD#c5WrOGgGWF%W|=7(*}=XJ8oq4`<>mWMMc);B1_OkvJFU zVH8H=d|ZGrxDaD;5iZ6h$i_Hait(6$iMR}tFd3I)3a-GFn2M{AV?yu;{1iXKTlfXG z;8xs&JMmjQg~v@O?l57v1rMMSdvG^?iQ7#$)?hat#h+1aB1{`pnMl-_DEuDJ;$QeD zmf<-p$28<(HSR?oK71?`~uBMymZcZ>M=0wxOoMd{M zUf75IrnfoS^f7(SDdtqu&-6E`<}{OL2AFh{VKU7?bGjL12Ad&fs5!$7GyiAKG-sJC zGu(_YXPa}(NOP_^4`o&j z$xJqvn);%<}P!$ zxySt6+-vSL_nQaIgXSUg3-e3!u=$mF#QfU)#{AYiY8IH^na9lU%^%F;=8xu2<_Ytp zdCL6RJZ+va&zk4V^X3KfqFHGEVqP*Yn^(-M__cY>yl&nwi_DwmE%Ubdt9i$~Yu+<| zGw++fn}3*pn#JZ{<^%Jg`N({1{%t-nOU$R{GxNFm!hC7IGE2=ev)rsOE6pk_#9#0V zUd8)(2`}UCxEb%^Hav}g;BEZXtTt=RTC>i4ZOY7gv%zdMo6Kgj#cVa(%yzTG>@>Tu z*OZ$Iv)fdfJ*LW3n;P7O1!k|=XZD*~bHE%l-RL+oL@_%xsoF!Q@ zTt>**a*m9YbLBi4C8Onhxj@Fqg)&wyl8faM$(C_)sf?EiGEpv*Nitb3mnm|ETq#rK zD#?*)k}G-Qlj$-;W=g(XE!Rka%#uPWlG$>t6ibPe${e{)=F0VQgWM=TkRQsAWS;z3 zej+!?&2o$URDLG6%58GH%$GalPPt3&mV4yqa#)34K2tkDh(g&ykF?NKQ`!R&n-dyD5O_4ptUNmz~;f$Q(IkO6K=9I=31z&|{ zJLD8Qpr zmD*G2rCRQ#TJGbWa-ZXr`*=5PbKJCzchWY;p2Ef#=NHZho1@3r@xdvJofCW&G2X2o zbDVSZ!~mVqbA#NIg4{O*+~Jd*6yIo1QIq|(E9yqSGi+S$%(*#E>dww|&ja1_>F#-u zdmikbhq&kA?s+W7X{pr!}F#U%qY&e&SzuENIN$&$Ga0ZJiqWdUva4~&t|;i zVZea6oI1B7M|%DveV!|BWF0SYzB-qYqdk9-`JO9obR92o`E@QMFY^3F7J06?i|TlZ zE2?uDneF+DEcRS+*>$|c71z0p9Pjyyoa4FT#@F!@H>b{}&5-l~PPwKJaLP4(fK#sN z14e|E_-jYHTk07@oLZ7G-0__;;_S$C@`_5Q`3j2WDr2&a$UMJml;1Veb488y*T1Mj zzcVu1dmdTrca8JAO8l-%{jO5a6+Y3{fbhA_X`-zq;dAXNa$;V-uh>_TUlKXj@6yKL zP^xXgajB4TTqVvKan=79iLi~8)&Y6q*2y}N+Z!5NSdMy) zv)BIU!tKrU&y%K? zn^DdkjXJ(0|N7uZZS-0n#HzzjOz1fpdZ~sR<TsSk$k*=9(XFKn?+&MGt9QWFL&(T>j z(;S^8bAZ!j$QAy^v!gtVOr(@H~s-$xL$Z}I0M{p(%o><-Eh*~aMClJ_|qME zkeTji4Vmd~xan@X(p~z}-E^h9=}LFgmF~u$?#7?)#-HxSpW()z=AB(S(p);yTsj80 z=QNj|G?$(M?)3nd9#_g`4sheoaKp=R!^?2P$#CDxaKp)P)0N?dli{W-!%bI)o30Em zTsK`AZn`qubY-~d%5>9{>BgVw#-HiNpXtV*>BgVw#-HiNpXtV*>BgVw#-HiNpXtV* z>BgVw#-HiNKhTYTpd0@{H~xWc`~%(i2fFbObmJfB#y`-Ff1n%xKsWw@Zu|q?_y@Z2 zyE=8It5atVapNE2#y`Tn9x=eq8Zac{?F@h@bVolJ9SBAngsPR1v`@@6zGA)S%rY># zudcOAMs+HKk$&pev<=M;y({$o__EO7g#JEsN!Tf2X<_ri9uJ=oUK;+3@Mpr`3ttsp z8GbM#HDYjlS$tW<*oZ0d_eRW%xj!K$;>n0N;>+4x8apN-rp>g3nD`}a?rQT& z$cH1}h+G`GBC0UvhfzynKZ+V0H6f}nDle)~@5KBtsx)d|)K8=Ci25MvwWtrGmPCCO zwJK^;)Q+gigwvxAMt4sb7Ckur-k@J?%>D7T&MzS*@QZ#WAts@F^!qUq`%z54m@8v` zsPDww9CKI9{mw5TCg$OU80XE{x8rN$%i`|{{>OY4+a~su*kSfJB6dvdnAi!iQ(~vb z&W^n<_BAJ_*tcUpieF-XW$y16v7g2NB6eB)y!fhw?g`!Ff0__uL%lb?*1CQX|4jVC z`1j*K&|HZxi{BEzE56G9YU67YkPxnPCv;CpOGryNJz-eFh=ef-lM}8=xG~|ugnuMd zwC&t>RNL&fGuz(W_VKo5iER=K6Yok~nD|=a+llWd?nu*Y3%7Zztc= zZdJRoq?DwwNw+86lk`PWP13>SsN~C%?@4|z`Mu-~?Ni%NX@5ui$J_tAeMN^69e&s` zy<>WZM>@RJVOz(Tj_Dl-cf7jegPjsOF6{Vb$2A?RI)!&i=#(>6c%&aooOu4BQosk%3ZHbW*Epd`?So`4#(j&-b z*iTX=&Dsh*OW_%ErVMv2f@54epkoD`EIE?rxAv)}Z??7asZCGqc|VhTtmW=O`K4Ov z5Qm{$gJG<~WNtL=SZVIydI{qe3Fiih<`zk0nY80ZN#a&XW|?&6*D{D@b{~og{rVzn z(3Ryd_z5c!jiLM)!_Wqkxzh~cY6)Ytgmb4vbGamPtF+^4N#+*m%r$6_SXLvMyU>L- zn9NEn;!e~e3I}nL$!3+gomCRX8VToaiR5mHW2MA%mn5=Ul3694Sta^C+VQNAS*(y- zxI-3jkKKW}2JNtj+fa)WaS)wNHuss^Z3^F&5Y|W%m&qWmmNWSW8O66GhgFi#r80~A zWHvWT3HQl-*2tZ#lKWVVNVI1qI&cR%ax*&dD|F@8(wmzll`AEaJLPn4Lq8-j63JYO z_AEySZbL_|M<@Okn&K`jM|ZBrWbVNteu7#g;~-K^Hp|WJTxss$tL83llMt?R(_JNz z+#zw?A@O`e5-r^i2c^AS2JuNblfRZxTqxtYTdrc2gq!6S z?veQ{lRNp9+{bmYfHjCf9Cx8BH)AN5VHkHIiz`uL%W5;)Ac5P_mAf#MOOVB-DB(8T z$ZEXDYH7zc2*XfrKo+;6gca`HJqUB(S%oZaKnd4NJMKU@61dyem!VvVEPjm=mPuH|Mt#VvT1Yp{rmP>Yjr5Q9w@es214lgZ{* zb35Oc5H5B3O^w8HizIQOWN@Dh;vW&_55ar8A2*>bLRf`l?#5(pMFDr=TJFLku176; z;vmj4UAWw2bA!u?c1k$6NgQ|EmYA&jy098;@Cd8%6j$L@zJ+zHMlCwyATmuNt4%*H zMhITzKGY&bTRTGW2y3v2HCV?QlgJu$Kv!2)u$gyp9OG zfs;^+3vm!v;}CkAFhn2(XK*>jqPq!$et~Q(+L|zQg25x)4{@Jn+3PBMtVOh~CvmJq z62C$(x77~gR%EftP2C35g*(jc+>KBSb2mD$5*@h_o%kDc<~DTaDv9T-2uFKXqa!z<6DyRTNpDt2 zD$8&JhH?>xaU;fJ0w(h_OyMRx!qr&Budt4*v6o*Pu-1g(N|VUdrX9aBL-@YQ=GW$S zu8!lmlO9t1;ATGCjrb;=G zq;d=55yzc~=T;Gnrg9*wI-3ZW(bT~%{|hNyCunnwafCLbr{B- z$g+H>98*}1M_3_YmUAh`+AbNaMGWFtg?R2mPg^?cZThpUoZXKptkgOy;jEQ*+$kA6 zhzPXj4mWp|C#g*MN_t!VxZ0N0Zd)Fc%n<$)24m3|#th+3{R{_sAq#ym9362kVlW0V zxDYY82r(#VA(c0#;!>t8f|j;t|$j5%*{=U^lBY zCnSYc(w9{-kX15>wP=GloQ!xxBMYZtINBly?aeC)H?JeytVX)dkwy>1qqF)jtC3;p z)pY{O?Ud80E5Z!nkL;5%{_EEv$U>-D4V|mK1QAHEykQErO9(%ZFz&ECAlgdhO_IoM zlElBd{B@^v<~HfV&C<=5gVum|Z45fQ`d-ATWH8gA^T{8vddgVLLq3xDI!<6UQdo`N zT#P>YO)wZ_!r*imjO3R%kL4J}3XEns&bPT%flFA8Y*u3&%W)~IF`gBez-mn7eoW#% zOy+)E&RSbbuHXS&$t@^=K_SacJ{bH42ET>D zqcB(igWtj6_b_;YUt$rz#)n*tkGU92xEP;_P&)7%>BuVS!~@cqHPV&eNH^}16jn$NekmvM8|le!t0ej@`}A%pn34CXg7g!^PDzmYR|z?R~PFqVUB?bq~ZOHj#D)COYgKBPE?j3;bDuXmh;knA!mtq+ABa5rFoJ|+5wJD8er6jV# z>XjW?EuFbVy78b4Vih70!ZQ7O43fA6y;zB1tTA1tvINPt zkFf`xxCEWK30+u)?kqf4encpQ}+Rm)}<>FFryqo8Mkus6>2O2Jx>*L$A6W{ct=8()yUyH(}$?Qf??!-`jfnnT)EG~2NWw{&c21(>j zN#bTn<_=d&S}omJDTBBJZ4kokNaA)|+lTUit!<0A(RATTb31Enz1gha#ERLIy#5EXdb)~PhM{877RzKDzm&^ZEthkx)!T37S4c!W-$YL? zLl$3_aePC@vrI1IJ90S}%ayFLam=)F?2&o=Qf}cgtL@L{0l80igXLmbz!iu_PwtUX ztdt4dFIVw^`CKVivqENbi#*Dmh>-DIDOd7<%;IL5$8x!a+vHZ3 z%L4Az^?a5`>_8Tm%RKIuTUj9sSczD~a~*nev+DOUiq$fXU&#cP%Vn&!vE|zoYpHxD zH*ufb%BB9isde+_fL!k8kCxw^tVN`ZVwH@u`C99i>Q=dl2jmtT#txfcy?d?SFvMHQP>n3Ew;?Gdp~^8O z$JWJn#wpCR?9=lk_b$6~E$V+{oQ5=N4{Y4a@lLoZEs!J|1w=%h&i9zQ`r~cikK~R_;@8`%7sAWK)7O0C`xSdKog)RG=LV;(>h~%Cx8T%JKF?Lko&Fc$NO(TamHZ@-en+1D zFM*3x|FbF9d1Cl(@qyzF)n-_Jykzb70sM&X@C%Ppr!8=)YJ07P?}MIfwSo<;mE!Lg zoOJV9F5|o3FUngNe3zB{x^=^J&=PIN%X=>6>bf+18yuNsDi8S#KjBND8?(m-Q zX}6F54j1b^Pabna>$Ua6gRgNnm+?t{$mg_0;js4d00QO9H*Kny+Ipem39B_-!Fmio zv^L}QT*I~8$@N^swRU`J1^?;thuwUNYq*_T_%{D;?Z@xCt^H$u<>kiV;7T&BkJYRR zj=AOFhx}u}H~$`R|8L{ya`V3lftvo`j>gNnb!FN25nRfbzK?Xb9$M0;{ci*-xm&-k z)i}7Lv9X_kRQJ%BuOmfp33xq2uW$ID<4}&|{a?oaLJn|iV4Su-xQwrINkc8wvv4(! z#%3ZMIk>_03$<^!S>NVrZsz9ZG{>f(dM&^=_%}YQ`YN=q__Z@5BB%vcavyiIlC|7p z^?(12iKbg6SMqN*e5ZfBjcd4!oAi$s_wTuhUvmc+d8r7F(d&UZ)*XGqH(AbQe3@JL z8Mp8w{*3?PJHdRVAzYn)2iNle4>Wv!>^MH5wjOM+Vn3?`<=S#^e{+6WeXQwkK8~gk zs5^%TH}h+*lm9cF7FP?~(j3C~Mc)8IO9 z%pkx4Jg|maxRtePCsE1lNruL?Y7gG*Oeb7!vn^Wt&-&l!`Dz-rl{%xknxnPB`i5Gh z>|Hy@qA^Fn%9r@Ij!Lw&h4OQL!A*fN4c69=B^bOLItKI*SMzTB&*R;^%i-6|3HBKPH*+=D zaub*6J&*HphtuzET8`TCX|gQ2Nyl~qt;@!7+~)@dNl(pd9dQVn0bU>coVPl*W=oyb zAh@G}G(4bOzcYAHSluA}{mz5^_ZLYUUTuuoDA3eAuZGZKy4-dY< zhn=Tf$QSLn;Re3W*Z4f2=QI2>pXIZBhWGOx-opp@G#>=`B>$|l(7BM09dWuKyli(;0^P+~XjuvZYtWJ;C+f#?hp<+4}I}Z>sJGperVt1OMhp z8t!3@yCUKdwb*0Rp_^$l&z>9B`%W7r1po*EH$eu2h}cEk9k&RnC1LhiML~sRicI@O7QR;;o6~PL~r}{oT=0oPN9Z@>@2X=tYxjI`!}XJ94+dm;kyQ> zh43zZ$R}8-S538ciR#RvX6FAStwndu@*{FmtV@ zu2$k$z4!?K$rrd^L$ZCpMl=_V&mUKdd-%Ez)qBf3H>Pbg1&^wR@HFHAEcMj^o09ES zG?JSC9W*b8Sjj3@^FjWT54jew7ME{Jz<;tr!{tuykhf{E}#%VRD?Oe~YU~N?GqugRO^tHBCed*XzTYyuL zj_&pRrPRA_ef0K%v@JkWR-Xnx91V+i@B=>S)`3>BTzF6m0r$IQzt24%#Txp$nqUBK z9q{Xfs%vvcK%e7V&B=mq0}g%v88pua9B?5kgI75zt1auD#E1n{68Ek2~x*XpLHR zxjZ2M`9@>!x)jdmhkTky8g_sfH1fzAtR zGDR%cS%kcY@9;6JyB#P zaaxSmJ8T`eb~;;!S?ivgw9_<%tpkm$G-^!7xLm^@gSNQF-mMS*liPyVku{bJ?uyhs zR!eX3N}OZwXK{aH)HIDiPcqORng$=>>c%>g#iyu3X!ZXW2FemBuD2e^^tT;kbd6|A;7u#sGkEz1F!bgN3eb1Xkpht=*||- zEO2M`knUVu2Rd^haF1mz9sO5$df9gq4cCg<8468WRsPe~*W)3tjtu{K3Yx>Q*ShA$ z430l9`?kTyxzw`{cryRHh2u>XpX4(C{LiD-Ucb-a6I|!5qH0|Pk3N2T2Bc zHqB$}XEu(*>2u!|sC4Ha1ADXn?{PwI;wyH}zq5YTt|jHprpH{l*3%kWqI-B2=I<)B z-t!r5IMNwjEk|qgjE*O49Z(C2ojc;zf$dH2V$L;Q+YZQ`!{fVN2Nbq96g1Phxlyrz zRrOn#Ra?)xaD1RU^9Abw&CU1=$^riv<@Xg%y7?$qdTT&~bK-CaNceB7pV$(rjuu?T zg}Tzn8B=igE&n+1ot4JG#h$gKCH%9w5v%_!oLTgIj8E}*mXa`CmC@WfIKJR<4R5~v z@dLlKE1KLjUdIc3nzg|;f#!7GK)R2_TJ~K9SMpbG`KwfT+aAm7uRE>_9Yc2Rcv7(` z1V&uHi_le=tm0$*)LUVAB&DkP(6m;_Pq{vL)RG(2Keux;R~%7HO{^UchWg|7ztpks19t&EZDi6;1Apgk6 zy>)|n$CGu3LtqZc;cHiG!CAXne;l(l!HxVS7jnJ3cagWE*WJshHE{ej=i`B+(ZN(x z)Lrb32R+9R4a=vwUeWP@r(1hA zOVxM27k2bK-^&3H&2i%IDpapN8vYT`LA*SypCjKsg8K-KA+S52hoJuQR#qL$d?fDU zTBp_PG1yYU-2u(8zTKoHwyFSBPpuz9T{KqJ@E51Ov14o6=H>f_t&0W=Oi!Wa2KV{M;_d_Ny?wM&G zT6b%sA;k^v90^({M;oaFhuMkcc!6(nk+q8t$_@_vlO$wH3S6c<1Jz{#em4 z2U_~RhvxM1V7XKu$Gd;j+VHfn027Y)BU=&ZT? zPlA8fwQM|K$Ira)DB7=aG!NZRjVrww!Yx5V9^0Hg_-!DtkBEokM^!@}+ag)e===di z>)6K{YJd&tY%Merm;dW!M}vlP>}b$1y~jpXQ~3X_pmA_p!~SJ3nwZgKcXIt6K`;m* z2mug=Fc`E!8wjEiix9*k9^q(<6hxpGvd{q|F%=oeLmtMW5QVr1voRYN<3`+wOE3@f zkd0e0ALDQ*?!-jgjeBqz?#1sg8NbK7xCVd2$G8)pUwpfQLMrm{0{3- zi9evqw81MT$|T@JlW2P2Gt<*#W4*c5OfZRNs>wIW=BMU%lVa{LcbZ=2ZgY=0+1zVh zFn!Hm%p2x>^NxAfWSdoHmATZcF>B0tQ!6kNBt#<26%r|tW|~Axw8@n?i8FbUAPL4N ziPG6jm#)&y6v+vaVy=}Q($kbkZ|P^QlT=AHKazCGF!SVe$uU2XT)ERcBX`Sv=1X}< z7MK+<2$Nq!Z24!{qk-T=z|G-MgdrReXoE;ZAsR7=MI7RhfVODsuQiG2h2A(Beb5)D z;8gTOKlDc`PP48w3_u#vk%@sg9fL3!LogIQ(9Zw*G*8xwI3Mq(t+#d#Qo zQ5cQ0FcIhD0*t|h7>kQ=F)l$iPV&E<#;9R zMql@*Dbimb^h28e2c%)3`x}BYFb-!1{YD@QBix^+$oXAr(=^)s0i$uD`?~~Z;S%)1 znKpLscrvowKdeiSeJ~ub$G#ZR;D0J62K|AF=!bLM|48(!^Y4$5_CFG-I2XWaI4|h$ zT=&B$|9=#ET6Y>oyMIlAQjw1H{r?PHQ0JeCG5-HRT-fM;5H7+HTw?1+Hio+YG{CyE z>y?*xSJSFFrW7bmM+2o+Db%+o<8lB~&9g0iZKyW zQHc4Nj}qLBn^9`{uwMTd^Dzh4VJ@!64ff6tFdsj}k1!8E#!qk)ZnJl9!_AnFoACqt z{7wMZ;}+bCTk%u;47cHS>+3Gd$A6A{aUbr-19$)r+T#Ow$o_wUU*cgrgkRz3_WsZD z2p+&Ac*s5n?!~Wh4}OE+x~X^skKj=o#>033x8fe$fdw!Kk>4U3KZddXGzXO)y_$o3 z0I`04sk~5mW+JXe8g4*4T!-u2(62!f1XGc1^U^zqxL3}#J`2S-3_uvt5pH>P0d90d zNX9gDKznpR4%%ZHa*>N^xDt~v2^}yA?J)@*k%!61L<9z+4NkXj{=j{|F0>@ICdAm1 ztc$t!ayGivy$wL@PtT4Ui1epO>qy|2?f(JU80Y@NF%{F0T<6!p|I-vXzfLwy-V>k$ zCcD2jm}Yf>WJ`m0%tiU0&{ekwDGNo=Ra_jx|PKc#U zpKF-fo}54Y?n#*H{wLvD>#k3g#vbr>6*|`Wha%7aABV|}{=*P~aI~>?<8)-W|4ZF+ z()2cjlTJZ0B9UxqIvOaoN}-hiHz!@5FQwD_E0uwq&$Se2`kZvMvBbn6 z2ICQhSoi24)^e+cwXh{9M#)k0&m8}+Bc|BMx?_sfY4mCWfFbs7DNe9=hT;sQU>I^S z1^!e_=)}LyL#seSL$40bvWgdQAow3 zFaP5oQ&5V*c?J11kX4XBBM0Xe6waB2F-3aJF43o#mCVYW zjVnt^(gq-}q$Dlf$}8na8ka$YJ%-z(_8^Rn(ICva9e-NujMaAA<0F%1erTSQOHG;d zmP_RxHyrJ8T!y|9DZS-%$&`4Bl{85eBPYly(oPbjlSIhL(ocp;sC1B%q^I21)3O9_VAfK?u&rh31ewUuXOS;n4vX+M|$=kBLM-q<=+esWdwlg4c1_^`_W>|qz zMj3@NN*RUHa-A^C3J}aJs|8xhhVu1;wqMIgS&{zdTv^5m@b`QEUwPznbkDixp7ZW? z0|)?G1YkkaI@r~*Y{jw*fE@S$0Q?<&O9uai&JBQvwgNmE>KI&>y1o7SOMpD|GXSQ2 z$zWOKuRpk00KlsNU~FRZ_}1o2F5d!>zY9S2+{E!a_+);*3V_!Dz*FnCuHW49(KZi& zt`(rbxPJV&tpK0_JhTA-6zeygxbC+jExQ4{C4hI{v0-X_l6|cDBmgV{fcStQ>$eJ@1nM#>mT4}+D z+(5688(=rcrOO0D&;SOX=?a5ykRgx(kO#?L0Jt#Q;+s$jUjY!6oM8|-U~T}C z=>vXcZuzYzZa)r^z<AQ3VGxw&__Cf@Cvz z$uKmLK4_4xT?4gff)Ks}O?UFo( z%+(OUtAS_E1|Pi_-vE9N2NVx-oB)^9-VW~Ebwuzpk7xdi+zw6&KNLrEU(|p>!jUHP zC2D|>m%%xYABv*|Uwjp6$p1*!+9h03e9*4!6Wr=203b= zLF!Xlr8Kjkg(smhcTIvJ9jElX8=Mk;C|oFwQMl1F{HK=E{|<0|Ukmp^oiz4e&?lYq zpAx-lP?LETKFK_Zn#||$N#;Y;fEGRhf?9~cCt#;|B40osehewfQ}9XV9Qu`b%MB^% z+X;P?*1xyi0xhHuSZo7U!ZGCq%8LuzWto4HVwfeLK_6KPDGC1+{*(^pT3iDj+Gm%6 zzDVJ*b1%p$0yL20RPu@D!-Qv!Ma+12-N3Kdy&<;)MqGSSZCw z@Zu!Y;~U_TWZ_w0#T&qlyPybv1}?lol7%j;2Pc(}cnR3&=lvW!^YeZVb`q8JrJb-) z&J2TxJpp`-4V;990CqtWy9bt%uc3@7f<_6JE5XNH4Pm+_a|e`Cxy@V&A^KeAI`A{U z1cB~{*#o8YIV1sQvIXSi72rt#cw&Gg8OwYo$@Wh{Ngjk!>;nb<7HaWNFo4fN9G`<` zVuvEK35tmeiplX%%#=Vea~u>ii=miwLO0dN^qE8hCGc}UctA-E&`se&?uC%l zIzUhNL!#gzKY|o#11nh!-4q_AACznx6yiQmGna!x!dnM)lWO3|0Jup#ovBN(K8-3SV@94d$n+VNM=O4fpw>J7#U9R3naWEr%QrO-;`&`K(S zBX>b7Sq!Zb?>9j!IUZW64#E#XFY(U(z)LnsAGG4Xz{4n^l_`_f(9?VIV`wEVFp+Pd zg>Yb=*RjKyukhEiN3u4P;vX-@Ehn8fmW9Bhnq+SWI%q;-$7@Q6qq`(ax7=S@I6&{2q;BQD!jV>(5 z7sC&|;~O-9XVnV&GXF%L2aSSwr3u3;}>XY2)b zkG;*l(mr9|Y(Lw6nf-qIL-ya<|6>2t{w2@w2ELfL^Df@Ym-DrJE5DULkw2gRIe!y> z3x6Ab2Y3Or@;r0s@vqshIq9rC zc)$yTuoP~9hhP@|jtpv0zzU3GH}*?sIEWwNzwj%9gqb_TEP0yz@rW}3Tf$bb7qg;0 z-|n`z+DGhb?VIeU+b^}>XMfQCjQs=qC-yIR!s~epU&8a!8ET|6?BGx5f6o8nd(SZF zTse0Jt;^^tnm@y&bOxYj$h@EVAoG{Z-I)(Ej{{_$$vg{?c`@@6K<1^)%bDM29?v|Q zxj1uNW;%0B=Ge@p^b47?^csNl0f6+X^yd`O=w1GuC*OJEod@4};GO&4nW4VS+yDLchi||2_M312`RzZx{mR=< zzy0gCuXy{iH_GzLxv#h{kMh9ok-VSBq`$8&@Pxkmp>wkHa-Rda4*X-j_y7O71%CM- z7daF5z&UU(oCoK_1@I%d2ws2};br(e`~hBpSK&4I6TA*@z?<+E+=~PmWKjlt;m`0q z{1JW(FTsTuq>FTubz~#yA-&`n(ngLY zEo2j3gcsvG_#S?MAL4)Ee@i}1*4d?g^1=_!d%`)7_=i5(I~ia>1{}yi2`b2k0w@GE zP-|5OdN6o%hYF~KC{#fV z;*bCZR6`BaLLJmY12jStB%v8n&;qT{2JO%RozMl{&;z}&2o}Q<=!1Sq@+^gAupCyv z5Ddcztb|pt8b)CajKMgp1&}at30wx(zzuK<{0eS|JK#6)Yq%3;U_b1GyWnoP5AK2c z;kWQ0JPZ%PBk(93fG6M}%)*oS02~KXunvyFhu}oG4Yt81d=pN9WAPAN3^(GZumk^% zU%&>~g&*TT@bCB|{0uh3ZhQ+wcpT1wN!Ws);2?gEe}ic_6(0r$&V>u$di0gehJTD59Hw=@c=%GU*k9UAe@Bv;&1U0I3Ioj=fUN0DO?Fx!B61|xE8Jh zfSgDD z8xo0U{C))}U}8d8YjrwB7#5*LXx#@0En}&$h#`?5TNf5dh@a%e1AQXv9ogr{yq30! zHj!%^a*B*+cwps_Q*c`M4)J1N-;h&G4qJJ#n)a%PhxwW8?D0v_-#6r(`^AgpbiAC- zJkU49ujBXb9p}ZozM(NIFY!O2g~$kwKKIzo4B&F+By6=h>>6Cx9E@*>y5 z@8$Q37@R4Wc|_LRKQz{79UmAT5{8|_yqFvu5;16{N1Jy{sep4H z_R7$axX8<{f?2e^aJ%U48=^PQ zA8p}H`ILf$)IL=n(>CO^3eMqxGb|Q_W(a8$C&ydEVqr+cF`gImTe|7Fcrjl{4T}Zz z*T4`j76_@~u&564qDBGAEh zZ)k=RvdDT;d-w9vV*^e>#PM9;njNRN5YM<+7;p}Y`7Iq{K}*M&NRC9+4#|ct3@b;RBG?ojE)P6=LfB> z;jm~3&44}_7LB19q^&75LuhLb%`mjJgl1UU7KLVHv@H(JaJ03CX5_Rj3C$>IYYWXN zXn7+5f9njhSj9SklQ^v(}%&kou{AQlAwAI|3p&44`^ z7WvQ&($*Q8A+&XcW*FKEp&6F8?$C^kww}-oM_X@bMowE_XhuO>e`rQY+fazFm)Iv9 z;>Seo7~dj@I7VqMCOy&Xb_FwPIH zwNl9{r1r%TjfOy2tPY7_5;a0fWIZD5k*0~tmf+Ohh`{spd#l4@&5=|1NOmoe6;gC2 zFOE^6k?bGZPk4s6?k8TRcsNA`siKA7D@e12_A!xdIhr5GcoBnHy+K;WCIyjc8K3MM z5=qOrRb*Pms31G~o^gTaMb;~{k5^j-QPI*a5|5~8k)ATff8Rp{`V>KATgE67WS((R z_MKHl);mr$k+ccV*koT;RDS!c;jmbng9Fd=qRcx72cf>7eY>|#k$v1}+N|pj&&qsvnxns13 zW)!R^MQL54^BiRUGZA-uA4&bc&@F{96;bsl7utu?m3}&>Ef^LD=p5P^q;qIz zDV;+*%R>7Bpg9;8mxpNTkM>rC_G9+iP-s79uMN|ANJmHLJgK*m&Xanp=sc;nnm)57 z7#2tAGihfHeJ1UU(Pz@mIGxiT42x^&9NL+nb7*Ih&Y_(tXzgwo9k)3e8|$cEX9-E}d{v zwo50R9GZdp`Snhbeo5=?&UWeaQ?p$<{j|^w)@LW2p6${JXJor{!kM8NXqaE`Ea{iD z-kxliPCq-_rPI#|&0s@z!nxTlop4^ZODCKk+OK3u&R9(aMa7iJxcheH)O48Y&>pd5 zU}y&MqT$~HO773r8IY&$0qBSdG6>Kg$@~#^F6duSsz$Is7%D@b0Q}-n4hyGxob;gb7^$&^3^M+=a$<`S!{q40qVyosel zbjtAX@NhDJ72C(wD?(hcT$UfW4>Mq!e4Ve%Od)5#pmT**Ab z{F7C&0^7u%#~zUBWIJTP=Jebt+|T3=`Cj=x`Iic{qDHYqal7&|<-t5h-sZg9^8Tno z)pFIDs%uowsQ#UA%b2fR|TsIZYnrfkS=r;t}MKuaDU-jYEYM`8`V?lJ?d*U zR?UwzuW2`GpV8&%uF<`sJFH)-KSO_~q0q40aFfwuywZ5k#GBTb9yfhxwwf24&o%Ee ze_=6LMl3g2Zm>LE6e#*tv9@@5@tIbewZr;u$!N*xB{!BlWb3tUvfXL>$R4x5ZvWJ= z%5k&f0AImx;P2)Caxk@o`c3%=8Q z5Bk3F*ZTMPf8~G4f4H=)^yJb%1>%8A1D^$V2R{g5Xj|z1FoqY0e;$4%Vvn3wmRI(Z za(DR~6+0@Om2XDRiyo?)ta>dr5IZq;Y3%;khwVk_L{+(M`~lW zzpC@s{krax`tJIl)&IF+W5Xj2hZ=v{_+}GnI7|8oc5aZ$$$ovF^-x)ygm)qQsNUwbaUszPQ zXlT)Oi#}Xjz4(H~`xn2lqBrkz#j&S z2RjCL58gibm!-y~155WT{cxFk*^ibTT<%(a?(!R#f4XA(iWi2$Lq8uj4DTBL>F_rr z$E@sHdHu>iuBu&i`l>&#E?#~9>Q6@3kG`_ziLqP8t>fpfjjVlTLOwA#apuH}ldY3~ zpNdb3>(uLRSg%-r)B4Xg9Jk?#jSU;m-T3@5iemY9fO)EA% zySZxfEz_@TNo~1rYhvq9x9PUsyIsG1di%lS+&g?b&fDqVdCu`o$6s{9&a;tzIxKhCp~&{^~o2XQglk!DJPzC-zi`1UbFk)skNtyr>RftJMFR4EvIih z{i8E_&Uo+4)n~qVmh!B%XFYM&U-oGCOze5~?EJGgpMBXmOU}9eoWti{Kq{A>2Id%O1T-TT4?>I)_=xa&gZ!hs8K`%&~q*IbmiX!@cDejNVsbwB><;yoAN zck$s%MlX3;`uF!s6_=J?y7JNsFMaqja#{Oj+b_H0vR8k?{N(+gd~tcf{nzeaZ~XP&elz)-Cx7$KotiuA z?>zR-dqqwh5Vwmj%~a29pSfk`%YBXe#`j&i@6mmS_FMM1?BBZo;r$=%|LQKwT`hOr za<}^K3-A7)d$!+m(>+h$3-?yvJ9h7H?&I$}?f#bgueg8T{V)Eu{I@^-?UxV49vFS# z*$3+$yzs$$AN=g0AyA3bJzZ0fPIA3ONC?(xdUw?2N?;~yL>IM{J;`@x?deESLEiIFGnpEb{p z&%XU+$&>4z{KJ#!r>svM_tdLT7d^f6>4%>F`!lW2T=UF*&wTOh@UvGw`;X`J&uw|` zn&+NG!Yvq2do4|8VUq>?_M(+5c+ZtIJ-!{59saz-zs)ZGP>h*JxCnzzP6( zg8U8`kV7b0$|54H27vk=AcR>hLxyQ!dRZ2Lm9uhA1`IG-PH7A#v{9`*7B#Mzo}NC8 zFQ&^6pMO3ONaE+{Aumbmxsy&A!!mS5f&h*9ee39BQDZa~H6}+(NAdGF-gx5;Am9NY z*OFPVf&;pe?HaY5L5?MaK{Az(d3p6cg$e?oTwS0dN@Y{e+%`)}N*pB)yUki$WHFnJ z2E9%@_t9vTwjc`fs8Ns$3F#Y)Cg?XRm%g%uASc&e;N5do*+}^%Wg`{a_IP(+QZ`b4 zarsEauJj@AC0@Mix}}dj_Sj=fuUmZZ;K74`yY4z*K*(H7dYLk)fNE%hlal5j%Ge47 zS$)iIvv3>-W<-wd?h*6*hLQrXG8sD!1d(i!BYSLBuxfwI-dw%Gk4j zAldT+bB2@Z#)d?^ED{cBwN`^dX$fM4@fpo_#%L%ca-$IQdVL8yW2S9{iB&a{L@a7F znaoU;*Jq5!(O@#iI1Udhg-F7tkFThAdRvC0Rh?(XqpCo4i<>LpVoR#5uExR2s^;my zs`jR2Tl(#~`i5HK$TJ(&dMb->?$%g**!}C{KoC2#gg86eAL*n;H>ofMHrG3E~=% zpc1WcIxHqPt2EM+3NFrQu#>st3NGoa(aLzNDnjOt8?7{%@v}T{w1MwvF@{nhdc@L> z(Rlxr4bg&%=HAj&r?s*(LJ#S08%=bc6d?{(k*TmMQtT|!tE9ul7gv}o%Ek(Kt3DF8 zx~-;s>1b8`iIRv5WZ=#mA}^B{K@T3Nfgb3Gk>rXciwT4M$a17xi9~@QBd{K1Am?QA z^}sOFky?9H$Z_nNJY?BUwzsa<=QSD-TAFKn>Ut{5yfwZWht1$IdQ?i#qds402SEeshhw$f?u2iV71Ry|bt= zZORSgCf3BgbRaiPj*D?T``=Y3_AKa=4gPc18UN2jJH0U?2(A+2O8gpy=YVL`qsPpOcz z48eTppvnz;jYtoW@FmQ?s61hoo8>-vU$|Yb7tw6ehYBQ>Cr9*H&q2v3GRP z-BrNDxSc3K1-_)4lM#j>AOll?$gT#KZIa-l0+pn8>e6Jk`w;r1;PTeeK# zkB3e?ap=So0ihvtJ=~D3g1AeDfL&QNp<|E$kS#E$j2kE+YUxF?XTi1MqzV8y;Ivv+ zX$qRDJ~PU@Eba+meEmr$t*1L~fOl{Mwg3b6q!sAR%VHRTXov;dijnA6yR!FMJm zq`LsFg42Pa*w4+!h9j^~Pt>sT^wa56tN`Q`GMk-GsinRLfNp!i0}uryr=*Kc!v7+( zhil0!5Qt_DktkUPdhmfQSxocF3=%3NVUD@{e!rWg>djC{a;!voNG=J!tZ0i?HWCu` zwXIGhMq7Qp*3m>_b(?Ri(HC<#V?LwN7jrsdJ|lWkTl&M{{w=B0mi|bje@iOd9k5WwC4Y3Ljvu$Ex0$1l3o7C$qJTFiC>GSBHf0H&Sg>W*U zM?f9LayQMJ6NL4W5yobXFaRipQhRAgrZfkml(`xiNmLXPxv!C#mn?;h+-dX|x*IEm z#LxR_Rw@PoT4@#;WHXf|-x1%_Rl>DyQ986lxGW zwIPQp&noyWlp6TVX8eXEp%SW-F}FY%wy=O8A>AMYmXWdRbHJgy#ub#v*3h#p@wuID zPbsG?4tlbNiKMAbCP`C!1tB)qad8U|fZH5ZZiCRgs-|~`&|>MWO?C7ww%S`dlhNp6 zb6a6~Lx;DbzmC^ABY)!@k$R!5CvJ;X_Id)<)wQYRP37g`P-&0FXHyqPQhs|pWCH@G z%o#*Y>L3papf;H(kcuaOo&gD-#UTsq9+|{-%VbChj54&wVKG3y3i2RNtJP`cN=r}{ zbH*^LjT!|bMzz?L{v9sw85&Bz@WN@=uf_Y*U6a=%gKBzuN9I_euqSL695Ws*!X$az+_Fo7} z$p(-MjZ7k*a2lQRcpPn&%bEmV+h}~zNqnkgsIsxo=&rDNQ^s+W=NBq;MqHWx+^wy_ z23P&k%GgkotF5jnP}SRHuMiAQp7qyvdxxi|9@Cqsmr$NLM5@TMz(W<(C9Cy1!jK|l zWuzMzkg<%666%~Xjqgnzt_21nnJ-9y%z^+3=z&B2?aa{v4h?om&}A*YLP7$i?W?L{t6P00A!I784WtJA{=t?& zUBD7{8MYLaMvJXcpQXr8TfZg!mB|$_8iOvA!5Oqzf=>PK%9m8zowa>sj(CvI({-0c zIx32a$~z)uJvx;$951qkd5xA2mz0DZS{)z4Zj0MeP*CKtn1rH&!Xh^iaAnpJFR7F0 zqA^)lgfdpIBZMK{035P1V5#BD5ZQOB`)Jaj)iGvc&$Vk zQw`rzhH+S;3_O}LuhHI)B;0-l?;jR3lPMdMo-LXOkynkEXHo^>bj<@ z3lQouALBasow`4@c2STKq1nveUY~)zeig=o~?d!E4j4TJ>gCpDnM*6>(U+#RcjjUQ^N7 zVlL~B3ei$Wfy!+6m%MrEsg!;~nQ6vMR>BAz1NS7Yeq?1nWLO90F>AC$mA42LxEPfR zuDeIn^bI8w`3NAFft)f+PNC+hn7s9%0Hs1X0V)-)p=MQQHc}vUX`~?bzqpgEq2!dk z5fD4EcR1-l*tmXTe4wwVtGOu=3k5ua&1%#as9*#~3cl4cEH$|#CuUAMnap#_CI><4 zT2lKfCzi6m;|cS(o{v5rkHx%H&>Ia@_2W(5=d5dB@(iv@q1a_m65DW9_hM(P#TjT+ z=UF2{XTO1mPZ*jdp;Vjf}_DZ+GVyw3m`|7)0n@m2twzRI< z+;P%yv|`1sj@DfxRYq;dU`R~v9b9q2SoH8AP1xdPbl!*%$p=E;;Um|OS&%~>1e1Ox zvJx4xK#(Qtq;MIH-ZWsZLZQf04$>v`V@UfSgKZK?e>9P<^7o1?psqLzxU$gJf7Uj1-}3fL@;G1AM8+8F9L) zuOaCZr`9Q12%Owxl5~h*r1(MUFEtm*sX|>}IQ?s!_S6T=v5JO{593v3}r%-;|& zCD)%txsXEi7BUO@P(-~o>f_G^HW>z~*vk4dCWBrJ`Ji&jl*V9GJFkNDl+Xn&gk7Cd};ghf)>_r2+#(-TCLvi@jK;8YtS*TJ#lR}=7V_5nCL>iT686p`6S<=zzw30KZjcPH9C@^wk-&S0FO8T$p-~G?c-ru*B%=)G)|7!P8%&@}I_YA&$?V~4sTbG>z?dX{ ziX?+dmKp-sO}$hCcq(0?zDGvcKMS{f$k%CgI!b;{Eh8`#33`20OK$#s;~%!}`uO8r zm`U%(v(iXr(~EIm7Os?c?v$w8p0vt<0AhDGoWNx9tJTr%S%P}H9%`dn;lS1*ykgsG z{4AYMX48O~!*!JVh0NFFIr6L&S@0)4--cbKSRb1uU<9|T*piK~%9Mtn?5Ggx(Ka`p z(7Su2qH5*t?%v(Q7133@)35M#ORM68wRXO4FdAQ4>yR}}o!Q!P=44&dx-(ij&YY;j z4V9yv!EpDg^62W0V7PO2PBtwkvrq_Ds!!;9F@(V>VA(ktMSai)(hFcM(yE~l3jIz_ zX`-B*bN>XRB%36?EA(NYyua4zs9sWj;C_p*M5E(NP5a5Lzj-hi9&Gmg8%GT8a+|$e z&@X_E8OkWn+pR{1kz5xUBV(CUbFNEk4~=!g7-g+C=q<9t^2SBbTv%rBfX{SC0b~A*`NrfyM)8L|x z1{bX)iURI_^_3ISAB?5nC$op2BsEeL4}m5J%@QuWNkOYoaWcX&)IcK0NHQxMztZZo zdYy(wgD`4NL>aw4iUPw37}e{s_m~w!8&5pu&6CrA9@}&FSo+T=y>$$E{9pe{A54Eu zS`XJ^WBM^Nd-y?=QE1WBR4)g) zRx9ZUGYwj4qsGBsG&J~`{Ncm54AY&_$Zc0n_hm)xd~B1ZdZjo&3U~$XKPlZi7q|t4 zNam05()_c5ssriSlJokVXH)$ji)tec4ZrXYlab+XKBH@tVj0m$^yi!5CR>vwGKmK1 z&{+&2h&vXBw`VwL)$5}ai>0%xo>+C|)mVmCrZ-}B`YC!#UFKT6Q;IixrPcng(Qdk! zIp#Fh;f@I@;$23T!%O6KV89~XT|ha3<_dObXr@4Vc+@N}+gQ_1UY|Arfs)K2Qb-Ko zgE)*OR~wNq21HVTa*QA=_aMjG5jd_JSUD$Wxl;i_&Z1n3>C*gWM~@OY4%WzMD!UVU zOZ^Cy<^FhS+{N2UEG8-H=R;qf(hxMyYbKL9n;w$;;?YWz(P%ImsT}tDd>luG?*d=z zci!eQD__@N;pw!c8Uy`7*VN`syKEY>iWgW$Sa0)p7>p%N_PU$#c84Ct9(DxwOU=U1H?y{zzU;`5N+i`uWP* zaL+`%dTm!=)K=ak2+bAtRM}p$r$mb1@|i=#L<}HM`=P{olyB1^#eygrJDFae-*cpI zv(WyfNwBP@n}jr}`q$Lf2#^{l0EcV-Tee)2llpb{?00=v*HSPNK&D>e{dNVoNf3o??+cG|Nr zr*#H^*wLe)W;3i|zHh8m}vJ9Os{6F!GzrubeAYbt-E^}YoMA&or{^gVE5WYVxlJ)>Kc#b z8|6ZEsYzwD>#TJ>m~dA6OeSBolh#H6;2GotFhfl;u0n?7Bhrv6!${^pdykBUswEe; zsYi|+*T7MKzzk-s-XmzW3T1In61cG{DkHM)7-uw61u)j$KC*~!EU~Cd^}f<`&cWN3 z8OOJ3)dR}>+Jt3UdW96#b&@DCfE#Myv}9p0;3{BcT#<#aK)QRx;=ZAzOQIyIFFJa% z6hhM&Z9TxU5>qrYy;kaG!>ikp}fAF zR~4f&?1eq*Qpzi) zr|s(-Dw@1%^mMlAoMCJFY4Updsd&9myC^8hTmTRy4JB1-(UPaEvZV^Usb?;r@jZc9 z>dHw`>FMcdqB{IJ89(tvAekR!n&BSuI%vTNlgT`m*4`i>#W1a>ps{CGvPl}LsB5A} zgEf@$nrSw=2vD+PCXSj$dWVxnoen`~)EN!>e3gO&Eo$YG4x2+!5-_(w8SEQtXXJn&x&V*?#i@ z0G(D(tv;tuE~$z{RIbP0+`3|V`k%X=ef3`h*OS-N6`4P$U!p6wWWK;M@;a!gt*1Z) z8labKGYOq!42a~<3sO2rPvu%P7vS{9TBhw*m90QyNfp;Lk=GADWOFKH%T)!9HFLXW z)=Hc-kW`kKvwB0jD^Z!)yTEPaI{Y^sbY|P z`cC+dK0U3mSs1X!aN|U~*V{4C&@j*&s#)PT-rb;BWq}ogbHk_z=#?;6k5&Mia&|N zj2dp-`uIr7<7!;CLZ~S<6$R@B zW5jRg@_1h)uf9C}Gjrw*Y`UW3$ip&OwLs0kCTbqe>ER;)BF!02nyHoH_u9)H2foPzRdRz*r`iDAkIn-vI z{is%-b@sV=j!aZmnsGyN!Z^Lox}q|#K!$gaL^OSXsCLGisni8?<`BM23=o1uvZ@#v zVr2=<8UQl$ioYW(gK1nqB6NF+#iZaMgrRKkYF@lnri8-pgdD^)9aH6~4g zqM%qPbM~wN1WV=%oFex^5v}7a(i4ux|7qZZCN0ToRw8-eI2g-T1PC-JZFFU0#@V1T zbq#3|uu;%Tr6CENGIj@wBZ8r=ZF>85;xL;7dDgt5!jdqL9n0>xV_Eu*k|K>vs-HSU zVnhX2*p}5=sv;F3sFNx?tkN%b?$=z^pMeTisx1kDG1rzA5mkBs ze{=YAs%u4JkG*x%O>aF$pQHf#Kk=wQO`lYl$B}R2 zFY}K905zx$Is?_jdb2q}Lq3AfCzlI)=9JTw%F~W}wOx{K9nIxqc9m8F%T8?GLvqVf<{RVH0&&egqx_@le0AiozX?(Yi3G7jUy1(>PqN-!-k7$^>!ammF>2dKjSp)yYHebVTvKew)8@-{ zvOVO2ceL)pLbvwg;Q}qP7J*%yuQw{c)T^X;Pk-iAxRa6p=XyZu!S#=x$(;Yq2^8ZM znRnsK+!>1V2_xnCScXOBR4Exxq%%n2>-jTieHJMJrH^Gp6?PIea-30X;ArhvtSU~c zUSbtz$#h)4R%IyG$j?fsH5xU!U|6O9QfbuZFJ=Wx`WtP*@W|I6B#ndED;2^Ah;>5(+EytuEs>t|IxWxBq>uRG!)p&-9;h4 z&t$M_xTXR})LR_(`wRw)TGseixj*348ntSjhOpj%ix&JD=>MrpV0q>nI7pt()r!o& zG(p3+-&Svak5x`H7zv{gJ2*W(jnAda@kROq1rR9BoJSnwY;Zw1>;EB?`b(@PofZ|@ zprMRbtBvO>t~#hA+sRO}ae>Qf)Rs`Pk;RUv`j>mXK5Zi-Wm%0!K+;kv+UTyXhT!+Z*+XvN=txtZDA{D_F`3cg?#&V(o*koI7#|uqS9Fk zd1utAoyL=Fi4f1>fQ&Dz1%#^1zwp1wv(N|w$t4B(1W3S1I9Vb{6kHtT3bq?$EXT^Y zQyFS)(=wrj8AgRds#cJ%0lBA#@7U6+>8MdKnJBAB z=I^|Lo~?|N>W95PA<<{>IpUqAwHt&w%VKXJp06`1@3|f^P-*b!yv>5%W3d+1+04OE z$Wq*FE3S_rZo-rNi$m^YxwX2Y)fOCH>aVe+b%9h1soKC42C{!y{3YBt6Y_wcn zC`x)htt&=>@p>IXTsbS z=+J2S_OeA9tJfH;s|yC}@ME=BtL`XkFKehTZx6Jpbvkuxpu?Q7HAFhf-m{e2wapb3 zO-Vqo&Ap3bp(imRf|@1NK~f;dk*cb79MZZVnuyLrrLvv|0UFp|i`i(Pv20p8sZr6_ zZ|KW6RL##7MEitTR+r&hi*^WCUA66sE1Wx*JaY2E*^}|?u0~teRabR6>btO+2Gc2L z3}j9PQIcJ9YHdihNXU>WT7m?)EXQyN-&c-A`HgX*<5%=A5C~^}iSLnT zp&6D!XR@sbt4m#ub%iCoB|mF?|Y?Dd8GKA)Uc zyi#(^)-2D5D`*WnrCv$y&B>x~ljSDqbr#N(dkKKjuGhzL_<+tBXzF!&n`5N~9em1d z@Y;2{5|?&#bD=_8;;iW|4J0dsf@PX|!Qd&;)CN60^V( zQNYR-4vopCQ*bf`B?;&t>v1W0MUs4#k{tHYYIuZYR1o88>D4d5@56-@O`m)3t7Fx& zRb>72^z<|^5YBwb6whUC7r`27)ummX@fa)TsJ9P{3>jJ_#mOlGc@fGZ-YQ=eZ!fW$jas!z2_E$1 zsTRJ5^gWq~?@vVhqB!W(nf!5QmAACCByKNm@9h~h8?;4M28-I%MWKQMtxxYQ^Wbu= zz0^_^v}-jcPpQEWi}Z9JUxZz($zbH2jXHInCaB~roetSBNN@RZZtMp+kxqsye$Bo>X$TrlLXo79Th-ZNeJV{z@2zwZ$ zZ|5zemN!k#5$P?7`MLDw4Fj;7DUv(o>#ljh+X;2om>-@jw=Dt*U-J%ZK~kc5pA zwU1UHr;x(c9N}byCXJ|#wH{bdDp=)IJ}Q8dDYz+BmgZFw&F4upUsFwKzNw))S(8k} zV^z`0fPW#~)51Q=djE;;=Uyd{()of>NMx0ZV8k2y&zr2So;Uh0kQ1EIV3tgYc&y4tQ#zq|X&@F0l*U`~^Ye5HwJbkh zrdDXl3I15jABtDE78Yvq^EobGQ&`B+@|7m=;}ygW45*4MEF`xg#oR zY3y-MT&h`h?yaS{S8ns@E4MMHQ9rLfqyLAwHvy0As?J5%-e;^yQq85BRD)_zl}b}- zDouSft0nc|p$D~FJy`B;H#VX@;Kasm0^JM=4+60rW=Jkv2oQp~1agxb2!&H zEge##12WhVrpU6l=#8~>^e6p&nLux$XVRIMBZZ07(PN>mUQcQGJLGlQi9({q;_`*P z;Y7mOrv|*OSf1D6mR$qw)7Yvgc@=rFP=G%8wC0WyQHl^j>>^Y^Toy%yto8V5En3;6 zM3I4GFYurT#=_QNHMH`KZI7oevZoMjyVrN^`oKk4MLrETfkZ6S?sm4dSXJmFeG1zG ztANuAjHTjg8pSZ&0r;asC+#W0-H{I!rjF11{ZohAf(d8WsI%L9x<5J5-QHK|8;$fG zBCpD4`Yb-Tqa)nWF&U0Jye&%DKNyKQJ92?!K~=`Hk$i+@Cabw>KeKE*Av{&>s-&tj zBgJ1>DqW=~eVaJ;N4C4^6171T9_Dcphex3V!fuBk5=K}JdZcj zd5q*t%c~)+gHibk=q75TG7&JG+B$b>X)_bNi&g7BJ%Y_sE z&6vw?jb$jcrh10M`2owl)K&?Wutan++~>{3J^A+X_ZaT_8G4-6oCG0?6=}Gx=uHce zB_dE+xS}cu)M6E%WHlObIRgxnmtc2@!Qo=u%W83)NoS8Rf-aX+mQzV*G5OT1iF@JP z`1#?rsl-`-*HCnEl@!Lu$rm5Fap%?)$(H|`WJyw68_SGm{gf=w(`U+mz)peh!&}JX zd*7@Ph&_4N_wlwzz_&dMKY##);B{;+-L35G1`@)Giefo z>GgJoT8)3n$!KvVm7Xm|qs7^DYNir23SBP7WE1cMIK*w3RMVPizUF0$@oxmXoQ7qy_w>Wh589`duykP{>|5a&@(adwRdm*-xU=1 zjCuAhYFjT%U;Iz+FMq9q?Iy1WfO|XJpl4Bc^B*NfYw_@?$xy(6Okc|o>iNx zD1m&jrl~*D8)dwl*=LE^=~uvoyNHhXG=V+QgzpAXjI+R8#WsET?66p)F+@0uckD>e(2K%|m*8K@x8 z6D;0j#lo*6xg0=lA~!K!Lf5aS(4E)McDu#TC(Q&I-Fd#J7~+1%EM{AxeFsyR&bxmRNt%-&^myWP3fM*>CRNSX^yiF`0+SQ{KC91d=gvx`#oMAp{6jU)N_V8S{HMk`Gc9slP*E~KUd%>x zvxzV0VOdjx`3n|eVZLCzQgoF>cwER>r#qe#dD5nK+!O^buLt$q_Ax;F8w}jbV%vH0 zhvX+FJR9Z$aMQu7$@L0~jU_k81)d&mgl9um1Y}m=xoo4rjM2PI2}2lHCTk4jqdwYG@+dAY;h@Z~l-QbeMOy4MHqJ$CQ-i4*1)(D?cD;X{XTtt9AqGEJWc z8G>xzX_X~W5V^zetT_Dqixc`cy-fdfZ69)QR9oTLHLD&*xB?c%P9?BNS8R>oY<8Qf zraR*u;h@jsY_;X=Iiq8ax(Q{W_7>_**5_F2I{R^dA`)(Mx~;;LwY{su7mq|-E}u;} zWD9oJjDW-8bhJ3zh?>qsTiRM$T&+}2XFCwFMDHfAq0d7Hl-P*$;L#|a!gw$`$5#+W zah}Q)MD+7Q?X2k*S%ePKftg#p=p$PW&;0CYuXnc=UTM-QQMZ;i>UQdaMQx6cwL&DD zY87Mz`?Doej~Q%jwb@j))zylD@)lc5)q3paLAFsnWLh_(Z5Tl{Subs2(Nv>FeC7Bc zfw67gB9N>^QIU;E1sPQNO2cLa{Hhua`xAkL*WFrKO*V6r1feEiVjw(+2GezIjPz%+ z{r%ZY|7oY+?{o$NH4Pp~Vss^wS@bwtecm>w2lvV>U4s9?D!%;C&*nLeb>>)Tas>oJ zgi|`GMcDK{+clbLKlEt?(kYj3Bc1J_rwBzM;`f4vh6I-pZKqP< zk_Fd}h-bEO!NiP*w5||Inv_=C+S*)g2Ju*%)e_EQ4Zrb!LrEn`oC0}2`EL1Lq`Ukj za$h<1FONJ*zWfP#YvXepf4TAOvm`}gWtQoTZ_m5YyZL8$W-@jHv-b>@3<^Hrl|k&LhGb+3DnlW7;YuU=yqYk$_wR z1yqZoUIJN`))_gTomec4U1?HWRaH!-t8Ufp!o!#`JDG?H9XkI3))SdW<+Eo`oV{#n zQv!F$t!bl4K*0k5pBA2GZOUk!imX>@0KH*`cLPWw!^I#G9V@IY`jz9?ep~llgr_UB z3qNJEt6+tUM0m-^jxSR%3M^E=EHhF(eyv0IMsVtYZvQ&~39#?7BIcJdSvC1OJyu+4 z8+QthU;E>#gP~6cdd>i(Ri6bLBF;rZRY?(af(Hc8aUhjG<~G%4HIKE$7yD9-EexrL zfdw8^ZJ|0Yo28MljN|0cP#rq^&2MJ-Y%+c)8L5S6f9cM@W*BY03O*t{iFH1>zw1a- z3sFE473m77vXzQN6|Znalny?%SyRbaG}P{Ox3yTiY+ab$#^bOGMirWR6*^4y$z6O4 zGlW%$HSsf$aq_41PlTs=gbV%Qe2x+Z-y}#=WzY+oO`X#>$ zDRXeU!$CH(=a^!zZ##K%sdV)bGu*TxQkU(FSN4YM8YBJ`df?E5c3i(}Hfp-6 zt~Mp81{qBPna-ZQO!WI_Pn`Yby=Rym zQ!o6Fy(gGJ2`-R#kS{#_bvjGAVkKhzG-pn|Tb^_ZE_I z2tg?8&LXUu=vgmJ?I_6#sg=(^f`qe#0br!TbcXOkP5N82{lmqxPaG~BO$HvD=^sLD zefQBsd-+PRowy1^2&pHZ4Yrs6**6eIoISmD_uy+65LoYZCodLXvxHcCucx#8&YqJ= z^2YYU(t2OdiDdaDHb-IkES^COSuH#b?TDJwdL!ZLZi&UdSg8!aP#z3t9ST;F*0@tP zMq1;s-vDhrakaG26mcyKG2AF`5AK2ytYR|lfmoEx3#T!wgQO{v81TE=Y*sNMMXLK> zW9;{vmP%J2+JXOOyWF2N1%X$_2Y0s^BI#@Qww+Bo1NI% zF5N9$Y}zzIA1S^<<8VluFt1Pa#wS*gK36^uvOF*AYctFMWNO?JZ?-lYHuQUEPn>+B1L`#L@4 zA0rxK`zO>+zW{@{uDS_9J`jo=p6v2z?4AJPd7YVSu$c0uk2C1FbP`BC8iP=# zDi55#nJ7Q#oXod-I{U*OcdqCR#hu|yyX|VMbgZXqu^4G>Pq^ofbgy0>J5O4py|GAd z%z00L)*ts;yz#uRY@=#!sTlF+CsM)wY*=>QyEJ@!C`3TeG2G8H4EGq^uU#E0Q9*46 z{N|0J57t$^A5rY&S;b zKJDI7@^c-OvC_|VP%xl-fI+!;sdV)qgVM@k!R9fUgiYie$ zs?ibjM{hrVWMye#Mw=WTIXQZ=(Xcsx)+N?FkbQuWe8VnY>p_OM*)34i?eQ=5oofoN zYcJc!i0k9rYHJZJ7Ioc9YWFV(A8I=v>hbXrHrV4+<5QCpBV!|DjV-k8XB}!Ia&Ulw z9XWgA?12W5g~BW2#rL!sI0`S<9^c1!*}x*$EEW4~Ay%t;zHZa69kjVww9n<^eNTCz^uV2N*zWef;|%qq)2zRL)nv@T=4Vhv0TthX=GxKcPa{*Crqr zij6E0$ud7)91vwm!U}GSL@ZZYhz%s!CS9@;N;#5vamArhEJ0Ru^Sk4YX^p@g>vycL zomySiZlAurG}6yJ+dsVK>ZM!RmyC$HRhXgwIedt&mQg$$wP6GFH!7ULWbj-JWo zuB8W)&cX31+O_C$Q$-=|Bf*K4ws49b5keeK9Hf<@wptxATVD}rR=T^=z4_&h5!FNo z5$W&rOcbNJko~quu+8o0Z&j_uoG0Gi^7X`6m*1Z&B^WFBEaNAc!rVYlp^_UI&~pP* z`^XI}9wawV`|zH*fkizxkk6*{+(2zrnW2YJM;FM+HEMGM|FfDJ$c>(zPB!IH@!xmY z-ykh;o7j8!{9t2lmEk3&vyu`JboP+v8GA@CGI#g(P$DxD5rn)LBqFjrg-IVXlL!)E zECFK@DRkF!iPTbAV9c!{mk0~H?VC>|gYMmaI7P^ZH+`nQ3D60>u&gcO-7^uVqJUkK zK@eF%GV&fETpcJ*Id)P(>RGayN=ag>H`SZ(iiG^$R)^Rrb-FMNyfZ4-uy-X4H=f1m_&8kXvAUn|0ja!VXP06Sk7Ugaj zxog0=k-ToE; zu`o-uB6|$8Q$%U+_(DZdtcumgK;ODE?{*fQK5k>tO~ZJ8lYg_Y{eA47ZXGs^5h#LO zRo}v;e29_tOiH`ubPTTy+wVAg;_Rn3_4#_M-UCQ(|ADY8&uEky?vmXiaq*8JgnN+TDS zy3#YJi(?l}*x8A5PZqmwFMl+U8;vCxp~GlAK9&p6cjPiBPMypwyyR$CYG$q2 ze|kDy%ne`eA1e$E4Te*F&K6E3}<|S?5IA|IbY3h@wX=*OBWt{1{aI*?+#8D z^3lqfhwa{xbHY3_sG0CL90mXu5HpVY?gUoSHU$ zzd5J+*6YXC$vxX|99KrujemD`q1Iv+@k9o-l4z17<-CO`$_~@PoYNAgLOe*$slG$a zFY$Yu*H?B~Gy5>RsU}NEKfTBF{TVY(^V$qcH&st-J?FGo%{eXo%sHp}F~KAH)qBpc zel!~sYy7)&fNREb2fc7-a8j1(&fSjo&GWX5Nu8;!~c4Bd>( zP~7`h>+9=3CQp*LKlD)f-48zasne$`w&Z~zq@WKob*)&mnCt3HilWp`C>4>bT+d5! z)*(G#wM19LA%H?YlnSRH2*Ip7t6Kbdzd1KmtYob+$_S?*(FTs9R2yLNUBsUftf z&^g8oLL1XFoYh8uWKHuDh=gl-Z7@gRN0t#2V9Q`wLV{6@KR4pGxrSSEGkzQTcP#H^ z^i_ZkxXJs9SSN_IQi1vi5wNSqZzTOUIufm&IY*pK2#N2=1sUO8OamhZsKX{PHIOO& z89b0GkF04PNel+O$lznMsA7lI;X-vjersvoSu(R!y88PKn0)v)-mJUkd6gjnzry?K z(k~=2uARiYYx<=`+u1LFPCZtYNGRa>aMW%VD-^RVm)<)encK_x* z7xY=?HaX-S%{H|9byVVB`}&)E}azu0Ij^nJ4FP*9z{2sv^C zs3qqkM67Zcv6T80V`O5r{sxhe7nzLEM{dMqgtv-@Y(`&SDqU^BXe9I_`V-lD^K_iv zVr;!7ZP-CXAwnb(l}UwVz?`$eVX?@w`$*NLbJJzANvE3;=nw<2Sz(&v5>>Kdz!2y- zL4no2`IZMBaLd52>GBaWa%r`vD^T7R-u}Z-_rS4x`a89O zNGbb1XCmZ`3}|?+aNeiCWFr@bIc>T+ZgknAsDdPMv7ZJ5*xv5-wujrpp`bV54R~-k zt<8p0FI;Olq|;|loNY9uNTONA2He!Ey(hGiQCW?F6sGFdKpY0kylV@*E#_)!8)byw zH99d-lC3F~&MhodvMs2)G7Mwzkale!v1~o|kJXgwI;bjFc;-aZs6`9sB`Xj7^RR#O zfIspG{A}sVq4+_9{c|K+37PKAOHC&c`Cp582*ZLl%V$OHdf>E=;;&-R;4A%r%*;nY>cABUp<=7CM zlEce-ie4aY#=)vHsNi*-+z^q!4o(>Y06>osXl=2oqJUhgNcP9L3hEm2j=DELS^Kuy z9NiMUO#8*Xt)_*jU=>uWkpj8bMl2R{cCI%2!LxG<^V5gM$3~V$ml|c}>SOl%rZcba z?*XzN$7+Y>AXc?nJBk#P?K!3e}7{()mfE)W&Gn*?&{v1cEAw^X=$j{#6XD?8GqkrImcrHEGj$f%wdDyp& z;rS5Wo?}e*y)cFP)p0_F7$LNsC}fz3iiOBxPT~wQ29>=8(oJJWK@2M2M)1Togj@Uj z#zy<5`lq~}&QvyUu>|#Ar2S35RzBM8`Ik7(qrZC zR~hZGmqPiYI}@r{e(Wns5{%{kR!JhThEp`vqz#amlnY6fR8X>pj8?}w zDy_zNfiBOciPQEC4!176d9 z!DxTuF@G0t|9{}v)Oz$??wGK+`IPB zZzDrR@BTF0(i?lqxRI@g9s&Xb^a?!9tb3oz9_ZN(Y|twYJ!G1#BxEo~QBiV0AvOjp zVKm=t+o}(+<9Fvv2B8Hu>X z6KJ{(r9EsL!m8h7rea@J-33OEs%!0$%!w1@_a3|V3;S9hPaQfGK7W4eyL+vVMu=6T z;qb7>IGfzOiD!8e==1E`vG>MaCiB&$FRRAAuiwsi@Aa>)^uFfE=U2oK*JL{tQbiE}CXF{E2!MED;EfFP`fK89Y`+Q(c(@v_uk zg?j1#zX&K)l6fh89#Sv{ALdb-mhODgAu85Hn1aHTWK6%XRFq`05)ovSPiI;xQ!8M# z>d7Cwg(?c1S8eb%!31c>9NdMEE)>>eO?bo`f>h2 zym?mfCO$tZOX4lwn>>Kp%+;%#Gc)^DocZ0kv9Y;wn$vYR6P>BxDsM6*sisYWY#|Df zl}kHeq)aXad8sC0)our{x7u4<92GDrMk~x24m&_7=<~F-+9QrgWt=g? zY98nM+ogHTf2H>NSQ-Cs)!q%ORVb)EGzoWUr}dez8%?$8Q*v3)e$|!`>DjLWn~m|Y z;laM%?#aSr{fyMEg61<)7a!RF?7Y3Uzx$i1%Qb^hMH(Zv`scbL(A6@}&gqTHgna6u zhw5gbch~i>qloM0xgLrKSPxe>_BY65=phm~zCFh@hJA?FB7~5`3ZnodaC3L~H~{#- zhwyQq7vbY6=wW^$b7J%*rQeHtxv0kNO3^uK73)QkpNfUoSg?(K30+8GFdQU~q+dnK zyFEC{x?g8T%KwmibL4RoDxG`SFZ^!?%xW~LTx~~E+$`z=Y=UhP66g^Sq_fc8M5K&SH5k;LFK}P0y z&W(WeiF4KZ#Cf9YQKy|Kj$}j#Y9dWFHvvPJ`XBf$o5c5!r#294hjx{zMo&9V2Uv6< z4;s8l^XmN>=$U!B2}Kv3=j49=5v|R?5HkV zZr`75xlnhC?kQvbT|879J1(SvOAxiu{{K8EUihnMDNrY6T$##eUg^dTW#)kEaEOvrq{t4`kz@1*U3 zhBZ|?&Igt8qlapS-fV3-^fBwK4HOGe3G$L~J2MMbpd*cN%z0SNWHPx-&ZV0elK-Uk z-hr^t`zhFnsw(Ti3b3lS!@TD6mYufKZ+^bkZkl{% zO^c5)yBV7to17TmX*0FV0sFNX^r;SNC-#j4n}(am;X1eT^xgD1kf8u)wKczws#1o? zib4cgSVnoE!=Qp9tI8#vpc0kG*`Cc<1BCMyA_(&<2y&T5G511uKG&5^B}45VmldhE zWF!#r<)xA2P|>Tn_cj%>>W`gIerAuO>MxI+K7E7~c0H(=Vsakdw*CKNm5SEEyTf@l zFX3Sn#TN56ii$7q=WU$B_p|S>THCikW@p`RX>NANsg_s=vR(2a;*x=VNI)(Exr~D` zwE`9kr<7h?u@hAl&fC~Xfub-pH{+NdtosPogs{&sea$8xThror_5tiX{div-7GIty zMQ?Iwq{`B;Px~X6u=j}rZdCMJI2~KggC2mo2l{5=N#=nLYenWsh^$sz1k@~`M531! zjKWPARq$2cvxcQfaweT|raT&VepB~&9(kbrwrkhOWr3qOZ{HdtrSc!sTjjqZUHEoG zJaDOe>+Y(OqKhz$g46E3kh6bdjg?KH+`?DzP6 zUT}k(k$~fWEvQJtB1e2+cqA!4LHe+ z^{Q9l`f1ZuU^{Sb{9FZACZa+FRTOY5V3`F57&Pg@;(y*`o5d0_6g;^mY$cRsRC=4V zVFv~_AANMEKI~ZxPW^!{5lgqf3_waOcbUZd3Q8VhVcZpvMGK`M(<_Y13jM`NtaAqF zhy(*j?q^lSq?Bav2aLcX{GoXX?eS~ME+w*z?rLh9AV}x2 z@Jk1E{6||kv#IXZN(6*7<8q|iD5n<@ZnA2UoR$G}*@2>318`w4#>56-swhKtBCfO> z_a49Y9534urkEPV_CElS7N%xVtKB=n0W5oI_r|?5n_nPV)@WVd!U+J|Y_7eSYe3R_ z;f6wx^OA~uo^|>zoM*SI#jYx%SMsts##%tu);izz__fhmr;1HxosUY9ISjtb=8(O+ z@>Z@9`Vya%JSHJ>aUSr`b zI(dZSP5lGM3fGMKhmm5XpkfRtM7QUdwsH%&kdvkQy;WU4tcPQzdXuo)+KObIF0a#z zQfqZ@LT~OB{R7AHo4NGZ=}lh1ft_Iy2Ko)uGiK2-_%xe8<=_@p^d7(Vq7A;%SdR1f z_7CYZ^cD!-5;O6sFADXH{bTEbA#Pj^FFgZ zO@52niozIpUZYv&v=N55r+%>M_N%w28M4d?0a(+VNZl_|!4USwm;(xXqfRqBxOGWyJjj`(w;Koo z(ExSm_yZ{B-AbS;D%Zn=3mWe)6O=B zRm5_x8fO@Ft|wMh)ajmFK^vW>tBL}EY?!SrcAG`_X8!YE(*LLYB-t$ADnCpXANaCfr;8fr7;jwC=AA7TRTQMU)&K)s zvHED43c`*SwY4HCCiiu*MY`WUVv<7t9yaKg4LNk)7_%rkSN={?8`zM&lB=x~qRXxx zP-)$^4P0rRX9OnMo@YUA4g*Jt>2c)Y!aA~ZIM|Z{f+;Pc#p!aPcq~f@JB!Y^mpq24 z-p8+zCm65Q{q)w>J2!xG4R>~4yP=@v@SE*~5(l1&dfAq)6wjEomW0(*(&=K0FEdh9 z>NMSv4*Wlxb=?Kq9~n1e`az;Hrb3_vD>VM#i+Fw z6Zeu7vy~rTBTwiy!aB%$m}e^WGWd|OvXzKJ8<9l)j%D22_{tSU=>ka7lJQ~ykIP|G z6>bzt)hLAej^o>}n|sb$A$+8+?*I({DH!v}*pbFJ{gIt(n*_Rs$^Iry#*3j@XQB6 zCL$3;?&AR=^qgL$A)`K?MYgC4mx03p#N#9G#iRcCHS)xt-NiaUZsQ8Bv)ex==jij$ z3U0*5s)UFZf|8jiUue98ITVa`Ziymiw7bpiNhRBu1+*|D)WvbIa9j0fE?clFyn zRaw^b(3#Qb$<31;FO7z55l35KCRjQ|N~y_Fa$EVwrHP~8s-G!jYZbtOh-oZZv54#v ziYwy=cBb)nU_S-x1d(_3XA+gl8=W88HG z2*HbZ$iha52<{g4q7eQh89%M@2mHLx=suyJSOKD=G6fqA{2kD`8}gcF!Ar8!#T2-a zzPaXxY~23H(WTPWmu&X-1p0Du%jP}N2j_byk}Z6_G{Elad(ubPp45hH)^-IC|Jt(* z+lj=!rh@|jiIf{|N zlq+qxjk-m`-f73LXWzxL@zeCZ^cDo*xYibsP#TX*ISFFL>E=Yzctfp#t)_+5kmd#v z1X0+i{vB4=elL}BIeDS8VMXSI%J9(8r>~tPuYVxiHd<6j{7An1iR?^Y5Tn$bcN(KP$U8l%4FSjm#X>Mf$8KXR zk4(>_b3ad6#H7kQU5S`rg;Owyxu?HLvTxa&*LP}R;e}7`&FX7l=urg~TRx_Z zQ~=czm>$+)7mUXM+rD(5w$}s1-$t@e?}-n;xv;SHpn(cE{%wd3H`uUU}x}szt3*WxHMIIHSYk-w%oV_(*Z>&}i|@hxcAiPT%HD-{uRK z_g+yHQuHL5*W*#To|1%nJl-!JcDtw{AEP((tlkQAyKW+ymUA$1MiFJ_NT3f~yDo7g zmKu$O@rwE_rGB=*qc`CLd#+91#;tu2j3CC~r{Vy84lC6$*5D_SC=f+va$YE|j!H!$ zuS%I)LHQ!A?8QNvgw;eGpgR{IObkK{Vwldzrkt#t!W$n#l(11*5~cnjL-|Hxyb3za zuO~{yfpXH>J2snIdHi&L@yz3gQ?sQWC;3wOoup9yi}LRb-d>8v#%>=NyrUHD7`tO* z<7Q+a_4q0)l7}E~!LOjEV{yrq`52~btz%fa-Xrk`C~(~{HEJp}^OE7L2B^P|HBtw+nIJ0k4?rp(?=x@&7f zeSTDIjZ(kIqr{^E2Ytv)on2=2^NjUbm$^5H4@vjf-Amc7rMpXuo3X@;mr55Fx&&HY z7ed{oxW79UR_=A%-p$9?{qpf-4_b?O{ddZPv|cyyoMY{@dVpxypX_q z3`TR>h#(mNJf77;ffyZ9p@@`a`b04i3;0B@=ye7YE)}8G2*-2A_47h;Co@Se15Z+8SS!`zxQwdM$ULs zeW6fari4Fsbn~as8j9=u!3Gjzv?$Q;i>|iJv3v~ z1N;2s)Kcl{tTkPnj4jT3yJxzGPff&;ZsN8#PZk~h)2m%GOQC_Ko}pudq3ry*k)_9a zgphBu{7bfWU&~-mFy8LAIbuDteZxol{r$Zc9I=qQrx5B4`Rpwn-Q&5z+eX4Y383KL z{t@|ewx;{gI&n=$i70fal!^*LrFtW{W4Palt;JLtBM(c&!a=)L?34Pcf(_MM&S2Wq zB?YN!@hoJ0mr3hV>FU)(PZYX)&-V3~w7LF;ZcoR^a(?`Bw)gPuxspAUj}09e2t2@o zK;f?RLL!+?#-lDrAeM_}r}Dne#LQSS-R5g^sE%N=H@boMum1cKYMbe28` z$BC$g@fCQBV!=I0_T$YJde$C;{aflVjL4m8IcYWZpRjBh(9^s?)0B z)b!wos6wvq`%@?;*jw`{czn;7Y2Edo0Mx{|r_l%L>e||x<~+K(v@km}(ASm8xH}Wb zno>(9oNlsfFyyP*QfrBY|Fudi+`am`Qj>k8SZBPQQ+M{YH=r55Q|Rk%vag)2x8&mC zfuNA75Dx`5h-j#`#?&N@ae#L8b)cy7^^zSXLR&rdPQD ziZZPj(_6sLP`Q43n|}yrx2NVq)!A+KDJ@_B0RRP*%H*0p$LH2DKYM7hvnS>5OdwWb z=e!z)c;bQ)ZExhy7t;lFP>;j8J$V)xxLPxFmXrk*k{cftWZ6in;ngO zpG5?71qi(VeOC7>$b6lt?r}iAn}?#`QE#35JtOsfwq}Dhbrt;(vC%PU-e)~nWKsd6 z=r!XgA=`Yuf0H{aZ{62EYk*PqyU(_4&(hQM79`<+X)S(zYfTarFqUgQep>6QZmlZW z#G)rgBY?oB$AHOj32SY1!OUEiV0-}XcrY<_3x#>U3hI}4R9jX+>~mRzF02Ltd& zS|A>x3Qahus-y`~aXT9zmWp_79#n;ZdJPn0m0=Rjd_0A9>;@~mvRnX*W!i$f8IDmm zene5p^?iK?+2iUS2e5$U9^eTvYP<0-m=?@U;C3{yHiRIS!@vh4{;c4~K_ z*H=fayL)nee)GWxX@}pRv-+K-M5EK=4yiOs7Ek>4Z=WdtO}M>HI;DD~>H$Ha6@ad> z`l1%b8*OkZh?oH-M7Kfi>^q&#T4z7$WOMrs-OGRG+Yfw)F6)4^^8em?C*9aUPcg9l zWAYy6`$o8DFNhI8RT%dThPLX)iiIywrGAO5vf=V3T?oFyYqx;mh90_eq{!i=($y*N zaxU1D^q9tlIknT)_LguVW*!GT8^ZwfGOPOQ($W$kC<9ICB`g(VFb1ZvH7Q`f@xM0K z2qqHB`du7K4#nx^Z-4&t4}AXf-=WKN<7=bk-zBS~U)#WMZ{PkgxlDf#;&}gyhp3g1 zWtC71Ay&$A1Sr9as~lyl4k6$jE^rWIM(6LPuI zbJlmmDnh*DADF!hE#R)%SEC7-)Y;mh#1+M>5~aFoBThaFp#kuNpRR_21cr)zJ^3!w zD-D)HrK+SI;w~CX+BGluZ6I{_$S$?DO$G4ivrWo^YnV{S;X^uWWQ7D319tcm=Rd75 z5p;o7bx@gD(3yv86U2(MBAqv%3swb8giKnhdF-dw7#oT@GmjASy&6qI8Md3oaeQUV=eV zDVA)pD>Af`c4UHWY$r%a(7+T^1Gt;*baGAFs#dg z@wvd%mmxrjYZqzLqmf`fl&`K^Y-8j3*pUtT#T_z+byeNX=jl5&Ssyb$aRJ`G&lyWr zco{gyLCvh`43i-(XUtl|r}@n353gw*xDxZZbZ4w1T!<8EXAgI@-DaYN9P@4v9 zKCADn8K8li4{zz7($ip0f)UipYH642Kw9k-A=pT z!Tbzgo-`47YOGmFI_kxo+ICF6uu`wt^ul+Wt63WSz0b4$6yZ1ZIqy$WS;`swz5Pk5 z>OblHy&0pki0)!kT2r+ozBYrzx5psyZTbn$lY-Q=RdSNH|bzFB&6e z$D2~K5!;2-_rKQ<+o?tjzi+A^xGk+I+pnQj%2j6LxZie!n9eK~{E52IEZcK00LzRL zh{qz~>iWiNh{o$1Md2}H+F)H<^wePU1^rQ;wye%;2s$7MujBLD7LV-U8aIAb$2A_r zimj>I#a!8f^@5(WC9tqPLq9}s zK_|{kfC!WT){pBjwN<<2cp+V))g~z7Jz2&#`-?f-WFLZKy zjt)^9B;kfJJ2py5#6^M9#uQzztcT0-qmIoD{LV)9vy)6-y{jMv8tVqbNoHNKtUR zizF!sNm6vX$rC&bd*6#roxb|$i~jay<*!`0`Kk-$uRQkE7wPDUlmGg!<&wTa0@BQj$&?mM4 zP_8W8iug;E@)dU%7q(e%?iUW(NP&@*76YI%0j{RfVdyxa>lgX zl(?KXp&`-sC~r<9uI-b0tFX=-N8*i4W4Vp_Q6j^FEK5YN$f|%fbe9xL8PthkoE#2| z1;EkfXlre;*ewW&V6w|rlk76qRU>^^WoUl??1{5A<8qd@{NmC1 z@@tP`7mPkyz=16Bh-d&-de7)V@#cVdY@Ngq!zH}5&uX=tsv=Q=rjcIlR z+drkx(&r!n1&nfd+^m`znW{yCdM%v7d2U4^Sha#@!#u2ZCh;G9=UY}>zi%gz*w zXC7b7FPD;Hc~wYH9F@i{{?dF)NbNgbin(HiP(C}`7aZGo<X;KN6SqKK8&Yc_Xhpi?NO>*wLZE?x-k`yh24mT&6@>N)d4}#QnYc=hPj~ zY4N(Rsyvb+A~}rTx3{ODLq}7nN0HDYU$k%s#oZXifdE>by zun#x>B1{uU`+8l@@lx+>-)vW=Gl>h>+2iVA_TPfXuuh9yv41mb(OxvOLb8Fyl&|lf zc2-YB8N0IeKn%2qIQ*gTkMtI}AONprDUgr52nDhn`nU@<2kO+wBgx15S6!o515fRS#O07%+~$ zxE8d$RlY`^sE3EgIqDB<+NNolsbF{^1aDwyUZ3q}bVIF{iUY2F$98#O= zV1>%=-eua;dE}+>#}o`L`Ft)H0bj_6uCCwZb$P3BXHI=u-SHXvoskgnUfxlM5#PG~ z8hOIl-f48}TZljqVvjz$^=_lDv)j|;8+u<;@LJ6kB{J? z=rd^^PTk55vrePC%|C%X4Pif%aRg!1_L7&@H|S-m4u?oa>-t;1U`8c2>iDB3m?F1f z@!iaZ!*Ge4t1aNBK+uv|lwbcz02bwE_AH5%!Ab$>x-9Tg&yW_-f6cLMW-HaKxZs(A zhISe#F%UILp|j3Ne~$yS>g|;Lg$b#}tX259K7$?b%UWy5M&aT6?wMU{H1^(;RI~#@)2}OA~=B^(Mb3JhKjU5904g<>n3l@#=F~S+Fo4Kq0|F9KBFCXg}BiC~Gu)TkmcJ zlw(!*GxSgBa}b3AR5F$rQ3p@~BU0CakXIUVxpTs5HWleXg!)cm)D}GmRgV-Pm-+{e z&b{PVe(+ikuq4}=Pv44t<-#IvZ$5=Eren)Zm&asY9sfEb!pfYp!W7^^? z?-@UI`4zKskKa8d1u;BDzKLb@h2^t-#r4H}VQF1wc^#u3*6x&sRg&~(9d|KLh-Oof ztQT**2Wa(3|G?tdI;y&FOiperrlX_B`g5IQe-y}-;;ha*SBj&yqR!#kvwUs{6&4YE z)OUJuz|ziSaegJO^@dPqQLiiKmE@9(-U18wAX$5-#S0Eu=b=ADP6_L(glr1Js?{2c zMnYDf)r)?!(}IUw#b0RbFVnA?Z+=@3G;$)1t8ZiHkyX8mZ>h9(RXbe04P!tYeJ4g1 z#4g}0@oqF3qj|>v{@I%UP4ne(>uRIsS8ma_MlZbL@NGBNi{zfsbF=9(WaiId9>nl{ zEs%i;avOI-eb|YfLdq{v=md&n3{fH&{%-ZJO3hz2f8}H5Kaj(QZ<}D6mbjVly4yo5 zc8en56;`#00tX~=m%0lSRBWPL1+(@OwEhF=%MR}G0T%Q?qI*O@s+Fw9)Q*qotZ3|& z7&E~(;u{-&0s5|yuB^>EIFOy_nn=VVs9Wf^W^5U>L5C$^vcZG+tn{tssXc(RYRvb6 zoYX3ZrT{stzr{G2$4zCS6KQ)6M&pYB4qi#JA6mpGmr7Uf+=CU7#n?W(D=A`?KU07# zOu`$u8b)tV+9}FPB)lhe?}Z&?yt`5N?tFSp3+B2caj4ienVXDv1OrSNBP(Sq${1C+ z*nUY1k1v(3zU`o#g(rQRTk!)k78>e%zYbmqKqp3;{0>X@7x^TH2Gisf zZlAM-v^~PL)0{2Nj^NN$`-6|X)amy-oq>RmQ)7Nl#Ikkl*=Ol9)`%yRR4#8_M;$ft zg2&nF^R_uXAVGNhN3=zFLRVE>fZO3$wAYLhi`q;lPgw@lqTVn>PrwdV!CukIyV6Q* zHs+pi;u5Zr*1}<44qm>nwAhs;aCCL?_NCjg4tA{6NHVXDC1ea#T|>n*WZPxfu3@uk z8p4c}CK=KL$miX=RJ!^n^-0r%i0J(n-{!aL)2RT$_BR29-(YcdH~3&hTSBatmq(qs zYz~MPLA+!o7EmOM!dQ3p5VR!8>nJ!kDX)4w9-oJ?+T(vNEX2YRG{wLk#=Y^Oq>>~~ zfle=#uKs|0xBM>BUH%feubldqM;;|#{sis~e~Ng*jc1=FDH1Dx9oY=Fe692HZ|Bz zTTml~oL3!OGUwE(`8i2Eb@9~2^}CKAojW;ya&jEO&z*^AIN)n_h_lkHtF3`3&hYRE z${NW^X1G{^`{7cl!2P&fYl|>~CV?3{_B_H(DuBP|F)Q#Ebev*ixAn)TgH)8{L!(`{ z<&#(LJG35*-#syT&q9XK@(Cea7>oJxoniHyqi1rtYw5wHb8vi$b}f3`*rWE5;KWK> zI7N>LA?~*YDTk>T;(J!BBWCL>c0?BDy1UZ7`Q?of)vF{&yL>ip)D?>KcX}p@(Ok%W zTO`=#cJ#NZ)?&^RZ*Tc}1sqtxAwLBnNW%aO!(nY2J;U4;Rlqaky|a8F*}_e+V7#?xTtJ@|9paaTSKp*(RS2wwM3eHxNb-{BujCtMu00 zgRfm!eC5Wt*PXmre9aR2;9gH>`JFu{ljM!%k?zD*PAm@A+U z!clEyfPlP12Oay3vKB^P7gtmUKKm^3;MqW5vFW?H>BDPM8=U z9cgrg@G7aF8( z-Xu%iM5#BKPS+X3BmU&1E0zzocgI|l0){E8HgO~uF(iCDvNa06{md@XOu_dia-`Bz zSZ9I!iWC|P_|`S!9d+-0f6cq<^?QFwd!m_NA}`yBMHN(waJ}AwT8OGz&x6%!HlzP9 zMSSb}d;qgLT{}Dnv91esBZ;Wr5uMG#jb18S&1NWYDs~ln3-OLnyW6Q|Em?OPRy!Dt+lSB#3F>XW zbN^B=yhFdSFR2%ub#Fv?3Y-vu+qGl3S|lLSb)Xmvq;LfkP%WslAj^6p5X-ua`UZ^c zxgxGem__SR9j>a2jawY4GcUJ!Mh@2+&|jP8<)Ya@wx}^ZRRta=48SB@(AN8UsUnl* zO2d)WK~^mCCA{jh3bLscP*wf@4~oJGY?s8II|I z=q!_a>*LZpxp?Y&vOhMSU3;=4#_rKA>-3&1LC+HpC02xF<7B8W+7q22T(h;hf?hFUjcD3CZ>_l&)y>g%n%}GW` zTDQ_SH>Vk42losA(wt@l1n2{U-$nr+)}XSsi_m7HHKe=-0V*#EEIQq8cN-&U)b|HO zN9x3WNOkjBy>;KHAsb;0`d|&$h`|Pg{z4M^;7;wfD3Miu{IY$s>Nlt$OR9Vc6=Ha{ z#HJu)x5W0)zMgcaE9pvNRhQSamp1Ylb|Va$tu>kQzcn4-+J*7%=EKZ%Rv3$r6JogX zgI+3$yo)jrxn@yRxl@7ljX+1ZJ-`H%Tdb-mfRi|}PObiYsGESlsO`qf&GS%WiWh)wP!=^D@_AZY)VL*Hx7Q*im?0^EP|>0jYw6D$JM2y{ zi|#%j+Yf>TTbP8`^F)wKZ)V(0MIlHiSGunLQr3T|*V6~NtHGhii29@#6wGEX(bbR^ z2U)Zi?uf8 z+c|r+OJcj}Bvx@}PAI^C<}+x^N2n}y8W^N}gsS>a`kZAe{WN*v*waHR7$z1k7?`4v z)?0bhKqKw=NF55P0|zLZMg&W!-S2Z1+=c2OHQGdW!yl1s?NHs-XrgPD;nuO;<~z8Z zXUs6j@3X2Mo*;spAd(O#qGZUFp?66DX|-5U9SepscBXkl(ExxGP&jOyCf>wNe*luE z0Mc%K;6Nl4oS5qe2cw{1JWYAVmx3G=w`<4ZM3xdZD#}(yyNfC0DlNV&8@>e6QDC9$ zlF@I}3agU-?9fffREtG+W2E>p_S>=_J_^>|=k`ZNfwz_IJY8daZ!LIVsOc7NPgPlO z6G<9Uq#*8)S&#xWjL)aQidl+ie!!64bgg^eCFq1AG))_KFHfzCxS8TKU}u^Z?l6AJHQ9>`~i} zH9|&h`_g}`wmm(yfmspq9wC$;iTd)L5#_w2cXBy5xv`i@FWfWUF`R9uasL0BfdBFaQK41jrG<16Xhh z7H|HeGRz?#@fgV(iclT^`ckH6pt4&tR={JS4qXO9f-6W?4(9+M1go+vtFr21x_-#n zNs4YkpfBBeHxbUh{=fafi4!O216%JT-zZ0b07}7qnLY=3IktOWBTMNHLB(V`xR^w!7&hwLugf_fC)PBpJCk&|6K#qT%A;I^agbNeah`p1CTBJ;7f$#$V=lifmLb&E**g^O z9#HS4w(^%>KQ=-Z%D<2#=LFgr>htE}o_u@xdz_Jio}pIoBVMtUh@_2xNS75^5OkbT zSf>{yY(fFR5B?P6;82xd9%;ill}nB2g7Yu#KT31=MnkqJ(_9!iL_SbHMLuxxV)>sd zf(v8}&FuL0EPWqSl)`%b4PL7mM=yupPmtwy9a%9L;SE{Gc*!(b4QWwEt_|d3qi2QH zHO(iANZ{}Hifv-6f^6vm6C{&{ir!R1JOW8lS~mfpr_L%B5QIg3EurUSEBcdIxJuSh>m-=E{v$3Mc^&I~nZjulB!$S5e6i89 z*v{5KAP@?Kd?*;whU{qZnle=*=YYY{0G z$Z~}mpQ~Q!5;y?pQK*W{m#cyW2}4D%N#o+^#=q+F7O{sODu2mTKU~!jMQxRPKjCg+ zFXEB{5d<*7I%m{GTnOiU)ulT_THO41#s;f|T>Atz9*oX~Sy?@L4ooYKNmoegI7QP~m)*{gp`vuL?lJ623)e_=7oB+L zZ_n4!&Eo8kdre`7^4B-WZ<~V+TZ7C>4c5ycD8Y-hmLUQ{h)@U;LXnRR0Rl1Hv~h2p z!%|ps9tfFd2$pI~Bc_(tKZ>n&4G#~OhD)O(#r}9lz}LwPeBUIetTR72(50vRR~xkB zKv$j@KF7wxV2SL8K6t6t8YBV@iL|QafddjZ2zM8&DjtlEoV)96?xKtj2S-N1&WETQc}Hhc-N3j|0AEXx<~La1M;fd!WGu?xHOgvGW- z-|xKl&S)f8;9q`U_?fXsqdWJ$<(%_A=Q+QV9#WW!EFR@e7GdJJN z1y|2VlCm8~eB_QNeGaPT>U$>6YL(XLg{jq2pRcvfz8Yz`ZA4=(`y1Hh&`F5Lg_%w? zagENLT8$K;T=5+Bp82^;4^hwDeDgOibA)QBF}#ro#D+Mp%}R+1MGurzg|#?%emkqg z69sF4%Q)63dtfn}m=?n&A`F=3gQ?3XFl3K*j?&LuPJe+KPTHF^7}nm2UaL{4fZd6z zZ&In?IP4ONU2}S2%EBZVIeMQrDwcb0-2Wf~$&Atlo*^lHq`l zZsT!QeCJ&=W<#Mdaa6AU^hsjFgo|l?0M|cVO+%9+_P>V zQC(qWh;C)|9eT1*)gq1~sVl7dusX4|Q6+#?n3wlq>pzN?%y2~|20Y2EQDXRYLx};8 zH>kw0G6Y|sI;O;MwYzIlVYt@aHGTBjceh5f;k^yb2Knyr6i|^*0cWJ~O5);FVz)+0 z<-x$xIu?Pg54~cI&(=e)%lyvOP6g2>5(!3Iw6e+^**HHhlSOJQo`=u zAt0I7OlvM1N{7<%sLNpybQ%(bpj5?Lr~X}$N5bk_Td$Wqa(rHUJ$#Xxy>Zq+){l;) z5mVG5om-{h7n{TwFPYDl#(a_~eG4I|!RYfiY-UqSTAywl+pw;C%>;$z9y4`3psl#d3c@*_Bn#Dp@+1?j+8_y1>g9Pp+@wsoZuVLviKZ-@ zy0MYLYHv5HO=c#ulk2C@*bv=V#nc)^Z&iZ|bmeEi{)zq8RYvBzrX0GiFl^F!o^@}> z+}xzJBe034+`Ut(WJ6S&wZ^j&EVrQ?9xodGJ!h+C^e#tEIJMlg&Mn+9k}d=@xD~>r%;iuIDe@o z9Y;g%VrRE}s+1JQ-pCZjTC15B9lg5JnpSferL}@%Rc7ruJYO_xtbK`{Ei@}WYNam_ zD{&&~=5)}js;liM%otikv+c_2Y6ZvTrPXdY+BteTUA2!$chXRoOCal{uBfI4iHo#I zc%_zdgy$AD&BAJ04Iza%|^W@p-o5wfw?^oEr3lFAbLd~+>ly>d#>VV){NWk zE4Y(pt-2!Sy>)6#+gO=)1W~KBQ~_$mB2g;&eUcI_o)-JjpfU((fSa=0P$WAR3Hm)Q zThU&`QP$Oai}cY7SFl(lA@f)quJ}xsm9+!aRi5v1lQMXP$3$gF@_lN7A;J;=)w69@M!-^rs)!zf%0C;@4`n4%zX5MjVRim4_QQ3(R} z4!7_Hn^>y6#U>sP(HCyL`(?KfAf50t@*euHL`8-^f~^%X^u@LbW~2ubdWvN{2tXei z1c7meA82}SwyIn66&0~mu<>K~74S3m6-+DhLGl=R`IWyz29AVUq$lj+ z@z7m&z5M<=3B_@MaW)Qm#6wz?RAM+21*T>W@=8=9>7!FTPYAE)*Y(eq2d2<8KHpm% zBR{Q~7vOMV+c!z6fDM>U`T>1l&HJ-e+ZAp^8ool)C@!oH zCA$%1+dK#x*l1qmK2R%x%;C4PL2cZ}n)k1GAMy~(_rXT`Al?TXZZ_luNMz+6c$mXj zEmKVr3Q9V|q1Hc9B6S53J{2gb67%5oqzyvL4pd?j3PQmq3V-*&14qxEy&v`+f^)U5 zL$!C|brUQ1z?(UqSdc+M6r4seqXbSRNyPDh0&p7q28BX1rv;5dgWq5wtipr+hXtjM zx}?AKO-$1N@dqAY-*@)x{mb*G=V5#8eeH7V3j%~$T2?2F$HgdXp;+C5!2e&cO zl^!S-R#LL40i_Ojm6C7j;VWp39P)HcY6GW0rtX3L(^K7D@tDmDg_(bul{ye`f(WF_L~HsO|Q54 z;DP#&>#yNf{9VCk*X!-Ri=O}&sEf7#to<4ubtKAxKso7fB=I%j=rp=QW=q&*s6;Ix zm!W2_|DgWC&Tgkuxk(J#B&lWuRS-R>&lYXKu~J3It8a~YzQa+iAC z%79cCB{l{j3Q86Tz#c~3oKs8@(xM|;q7?+Q!0Vi8OGzwM3Tz9<3#FI7|Jz(o&-dN| z5A7SccwungyB;M#Jn$Mg%wV#Gt2CK_`fU!y=J;P^b`PXBX>rN^D#hqH_SI zfJ7r=*ynXS%}9PqKthd!BQH#>)vtH8La;)`i+x3 z0Y_iS(5)~DM(#hK_83z1Ef%rO7brxn@o?JdO+>AJi`H#*4vqF(2N$(1I6@J41>DbN zh?nHax2rm%fpXLaN)9E}&>Q;+N0bUqxmZt`NrT0-+Yhjg@49PzYL0!%aE(t%*D_w? zQ+Taw-O?=OfWb1g8?D?t>*Ja)7ejIGj>ioL|>*81Bb$-L(JEOm@l< zH+G5TDm4v?(f+La346jX2>yh_k?;#T$Sj(ZVUc!zY;h zXbR9IIP}QWfrsE0E<=>WRkhc{7`7JX=#(IsIGrO6VkyLlp!+rK`RyeA>0s>;VgR_m z?%*;cKni38^9(**VK9M-VpfKvRI=r?2U+#?c}XM^xm-l0bIT8oyA6x`SIwe|x7+!q zKFbJyt=)wxxWn7pCr0{n?vm(BdovwgZzbbR24d|)W`ERTjrjzNKWec=edbS_TtSmD z=r$Q$K|w52l_wW6Tf;ebyw#vf1YAk4$>>YC{3)HG;5WKV8javI%CAqiSoA!vx3u7^ zmr&w|SHRt?Ytjas(uib$)io(~T3tlOHGASUo60jOugNQaYL1a;q&0cvPaR;NlGfyv zKZVyqh6drN@=CXK`88=_9vy{CR(HCbr>n?4ml-Ho%u&CmwLiM)!2C>Z+L17JiKPKB z4vEpetosQ^Tw0R2G;vA3&0mV!=Xc(Gn;6VG+(SJMk1f`ITJLChCzIfJ=yC6dS000> zVRF6Y-n?qLXVzJ6EegK>iI#guymtZ(cQnyA9*#|RN5A4KFvIPTUJC?BXyyHogw4c^ zF*UQ*6NDoaIJ!s_ip`TMB{Ch6rMLw(8i<*gMZqQryw;Ug+Az#BaAJu8x&kEsdrsvF zgbe0b&^9a#41j|djJhGgW`^23FwP3DydTcMW+GxdDVSJzjaw8M0&Fn2Ib^wP;qa?O zBD&)lrPh&l6#Hle*@}|B25KAIG2B4q|AH-O2)2oi*0{4Zo9h+QDqprIx^a^y(Q55T z{A6pQCmS|s1iR1X4U0mX+G#V6bO$qjv&vj_4KM}c$KV8PCOOQec|oB>HIXgX8gr~0?I zMEPnl+qZed;piJTxx+%TL&(^6wuwC%S3aBX@a6k=q!M{sI^Ycidp&-=&B*&4C0{`B zr<`I|!*?fqX`g|4;g$Ep%`kZlFT9y~;VtXDu-3^U>Px-w*8S*&_rLp5oI%gZW3T{| z*YAbdw6Y1FxvUq~TGN&5^ukV0PV&N*KIVl*!CUvjKYPk!NPWyAw)q2vh&3KcJABDY zoG>NPmB-*LY$RTiLw)lmAH3fAN@K)K-VB-Y`(hDa&YxpGPU}oZujS*IHVLESot0eN z{7i1jkuY?J%LCBt;;K2>!F8a2JFx4_ZQ)?f;U4U*8xx-pZe`vLO$l~Jdq3O)lWV;j z8{;jKchfe!Tgz|IyMbn~HqX4<%42W`OkUHwZEkqC8B+IdTDSbj{~vp|Xv4YX4Z3*4 zx%pB$V|#!(HM7%bbTTLRl;qs3EiGmPkL~G*f8{ZF8Jq1q&UTY`yTpgAS*2?t8m%*3 z`GdSiHM;4*p_y!x_lQLLv+noH^IZ2HpOWJldA^zRz<8$NJOq<89E!SItMS-C-lMa+jls-- z@%B>yfDLo~gwScm=c`nUL_t_{0~G*vpp=SaWRf$=t@NtVJ0KHJ{!gp%rm>-5L8!}1 zVRyfqw{M4U)!q!*+Vf}5+`Nf$^Ix4iwdrO8B){@2_$hskRLP<00euT4G!>$1zLKU| zbs02T#RTD1Y89`(hXbMqg_0;1TJVIe;*~0v-$s8mjBN*dQCWZ~ifzzLRr`B;y1R<) zt=Ui%8<0ffCWFS8wlt{s^>El`wL1znk^P@a3XV}Z4aXfjG|G+w5u#XJ%nzF!f%1lA z*AcPXxiOY1yG&2LO~XC(26ZxSjhbTvq9y9|xVn9gbSC3;5BS{qlKQ4IO6?(dm#-%r zspdT$ZNsr_Iq9qThTNVZaVVu!nKkOI1|ufRG@H`X@gc8^5G9Ec!WHN_xhGMKBvBPU z1{!UgDS(;vI!+@P)f@p0Suh!R4lF7>egR!*0j(CB_Anw6_J(4Wo&F|W2y=bDOjeWw zlK>krF51L8kW(r+7$%}D#6@MHB*qJID2ZHQ`}XZ~pZ>~ejO})Q?(<9Am!E#y;4Vnc zyy+*A2;38b2eu9V;upX8#o)G~m6clUueNR5Hk7UXuOvQEoDjt(dX9uhjHF49w2_0= zeJK1M0|Gv1A>4$9S8&u~(&Bj)4x0rXM{HIj*P`4JvBS|{o3s1ysg4GAyz7hm9x6a_A{dgUL)=_rrOJ{%!W!-0|8gcGu|SyM=BL@Mq?Pwh1kZ0?=1jWW5v)D_r9>#8TXpFfBmE> zX+H%YdDL&Z11_o!d}OdAsjdAQw%eoaUW0MSV%s+qj1WrtSAGxE^hc6nTD3Lo5A_u8Wcf7gaUVNeW@v^o9Os886+D>rLex{7eY+bUW&bR`y#?ho(ug(wV#J+)EBrP6IDL+^kUXxAJSa(^g;ywerJqrk3FU!D z(Pykd1|B3nxLQF8aVw{i(PTt0n+0ig6a=xvi*cJM6dX}RIMAXqVa&$)5~;XM9TUX> z>Bbw!$9l%bj}6yqrkp$PNL0E<%F!`zQ0NHey~%Q6xESno(Q~yI&b{qz=OFfX+gdEH z7L!IF&ty|}OW9zx8%$b#G?C7mvF$MFgLl#|(|;j6v0`jvHMVdn0>}ylqLRv_IJ|j| zb5HVkhO7SzrtmSCsgf2tGru8a^CQ8?zVUs)L-5A&4c!~Yj}6m%zxTay+PJy@D{9av ziLbmw2dI^}iHP~ske@0QPUNX_ltq9<$t_?7BGb1J8AX8Yxd=>oJwSp1kLVR0cC$&X zB5rW2d29&S@X`%{CuFnREnyXJ3zcFqD2&eee39eRJ@aF+_}Iaop7{;&+N^I=HoM6O zMc?K?#upItnTdnt3QA^AAMScXI02teMQ*(%n!#VoF?4udM?_VpU2IVzu~Gx%Fwqb-uTkSkp2>Hp_MxuW zh-%91QmMK-i|v_IGA@Q(6$Z>()*tWjSc?`OC0?&_ti7v&yC3`Z zCZ*luYcYkq<{>zb$6d}EOu4Uq;7v5Jba?sTpoAj~G92NZwfoYER;}IA;>Y8#*H=Fd z2Zcb=8Cg9JV{f7ha032@(1#>13}Y3QnoOzMvA|fgTWvB4Gq$!a-E+ zG8wdLl7~FcvkrXMJpk-ne;p61yuODa97(R6=Uz>}O+=C;yU3~P@pz095KL4_B6jSLGAyX40L%rQy z9mV$4uJkS$f@wi1r>jCR99uBaKVX3*4gP%C-Wqjgv)OJ_O6ARTMJ6}86FEyc{*4bc zRuBC8Iu{IdCVH|VgT~B&p0JQdpl7rznDJXw=7MXW_KVdOb$vq)BnX{w6a6-cVx4Ur zt)hxL1CH5>5JSbHBAl3$-qfaRbF)D*F#mwR;xE+*Zk|%9ztVxxmyN^l4MrS zb2rQOp@U43y=1<+zhNWFF{;+0#(-oOc(e-Rg%QYdG0RyZIUNtvYi|wcau+6 zL&buhYqFrgV;4~VhGDAKswT>y8k0(TJL;>AKnvhvTWnfv3_op_xolc{o@yEGaPxw_ z+9g&O?QAswPAw`?J?+vBnx3fd1_tyXK)i z6VIbB40r>9Ua!w!Gcag4C%$bwp-2dbXxp&FfXA_x2!QE+Nbp}t4oNY1KB3#eNb@jRxZfI*8!tJ5@+ zwta}I)K8y4&MX~W+&4F~ZDgoaSf9W(;LKhJbo?jJ=oiCX*TkMptF!rmKXx|h7|S9T zqt-+y?etudMPB~5|0kvqGwBsrV6%94Ro9eBmkNNzOB3pp0EPK_Ufr#l@?Z_Uly)ad zq9RJw!fN`R0x+Rn^p6xa%~oxfNxt*fH+PtPzZUF&tzjcd7CY^yFEE6wlT2bRt2)k6 zs^UcpBM~Tpj1jd`p;RmGL9?!gCbN!}?5t^D-N28KDM2u^%x_Ag@yYS>pI|ejeDuuf z8v5oRyM}6?Vma+qXZXi&c-X=6;+RqIgIn0>bx2FZB()ntrV}ceAXUI7y@jyFjLho; zGClhdOt|xnl!Tmce=}Z~635C*R7;;DBB`)SHlUmnfa*aBT)h!0vLP5bG}I&(6CqR4 z2$0rnq!O+8Ja(&2gI%(5QLQFT?T&Jh=^~&aKc2$t%~0#i7fjFmciXm}P;z8fdtur{ z!5V4zM@KEa;?eF?w&v9fPrS%o;V7CvsM|Z6FeV z>!SzXbhxz3nJA+YwZ)Mr`Q6#D1^e6(LXZ3@3NS}x1(=VoRe%YuyqA82)n5gwUM2D$ zA7IQgCXMXI)rn9fh93}W2#<(xzV`iNo9P=j-$)mh2k55`99SM;Sy@6TPtOrO#x^=2 zoEA&YHAvyX?5uQAM9CNk@1avxK{P3NXBt8_2giCjSh!LMF4R8u)E8i}=KA(m;j8qN z;(YD5iUU*N1kV@&QUxP?6^>kkGt1l3sG?Jahru{IO9-s|cI7-hK|hZ*g&*RONfieN zw9wA#@;|rIM@q{Qv-UUS&2aa%uZ@|H-rc`>^{er@HH5&IIXh7ku^ObvQ^HjTsF%x8 z!XeV{!K9j*J*>)pEtb>x7iN2{rL+ct7_=UncC<>D=LrFWQ@SxH7$>Hyv{8bS^RL z4|KPBU76mvHQ=&oEV-o7?=Tu2eu&F|G1>x7i&|rG2B^X444KU#r_tM5jYRtM9%R^= zd=7p6-?jfXID_VBNoxx`oMF3GYY#geVVlu ztX($&j=&;8kYk5j{?5@&k!UoG%ghpEAeuxaa#-v#$W~}C$M`ZlgZrBb0QJH^6=HCgLEiWOH@e0UT`s;B-Ks z6?jzyl)MNEC2Jjm83BX`h>AlUY^8$Vf!t@vSc6UfHfRWt ztt17ngcV{zog$7>vO(WM6=Q%YLdp@kpaM>z;AXH%qhd}83QjRC2uQ58nD7BCg^C07 z6zoqNQ&1Ig>&FH%#o-&14?k7S6b6qb-vAHX<(wbiIDV(|;5h44UM30nGg>7a(IPVu zmCjU31y43yqUeKr3l+0?8{@`<#EL8F}Pb#KFAZg60NED(N90QsK%!Q&0U~ZsLk`gz}AL54M z5!R6?dNvwyigxW^{^iNnog5tnd!|1r_PHH{`BcT`G=zQ#oRTvpOqnRqS6G4xn{x(* zs_@T@Iy&6$H?{a84$W3|%d2>Y)1lJv#i$moteX({KK&8#;fiblj_LsrfR$A)MkU;p zb^dFJYzu;5i$(<#=BzF2yL#h8F|Q_w`$tFJ#mV;0ouRB_DB_MeTfltsZ%@KwGq&Vp zmnb^6THWkkYZPx4?`Gxq^bYzX(n^ZeHlpSTrzY6vksUck+33P%jm8U~Tjcu!a)0&Z@>1@fI?4|NfJsqsQip8w)O# z-lEr7g%%_5YE@qvp0vdSmXWfa4d{%2?=g3NC{a72wV8DaEFP3r&bL{Y^)goLnp>!X zW-SzSNPktZ_-J&J=yVLp?wQo^jD@amQL-hYRa4fKDUnE&6Xmwncq|%WBOHkeQii%| zh#O0Tk+|yvjjM-2fVft00``xN+A~#LA?}Uk((XvkJ{0!ET{z_H?p-d-TRlf9Fp!-cj)Obo52ZE@dd z)uab{u%nlfrPSnV<@(&p8%N5tIo8f{!C~N_zJ+jDIIeR5C)^!%X!q?q`4=ZgN1fS$ zM5N1II#rx5xKu3`15Q1daCOv1(f=7mqdjQX@qKCdm?a*tSjC)MbIIl!ShFZ*ap_Q{ z+Uc^XG%BMjU}|A|ZRI6ynEse7lJio(M`5#z0$r@QIUSUNsJICadrz_EJ-I`9E8#e1 zbVet&*x{GXX?WH!mgsb39}3&C3Pbs?jBJdyvTOC%n8KX=OIqx3UjN6Hu28M4`DL~X z$LhZ-sT^JYyJu&s_J#TV`}WSw?$|ih)zO|$MFd;81#8cnge;|fijlq)K1gwr!_VPi zfCW<(d!6|im&h@guWO?3qWP30`?z8IM8e$~wvLYS=Aft2+F~*(v+>CgCROd>j6E|^ z@`XAllfi+Wk}bV=k2UT$J7TTQ^hldKTp5k{MtyptB{iJy8V+femVypPQs-%izvQbi zQz_<1iEia^(4iK*R)orJ34yye<<{Dw!aJw$d~ah?f+qc}XIxp?M`MGh`+)*$FwABE;)%2wd^%H3C-- zWN8R>8lyM?y3|O)D+JP>H{A5#Yu}qF7(JrpT{Imm4un00bV&1+XPyCTN5U$)jD#b( zmH(zGdXAm*CeaH7jF;tA_cRXJ8_3j#(Y~Hydn)0yN3foJ^>ED`RwMalRq=jqJ-Zs# zWtC|vIl8A?j@|!yRp{~uXfpR*iHBYqW#@bx2{8+Aa(yR+*%PwCwXcB^1uQwYI%)tyy zI3rHI-W7G)MVH>-!djs)RNxN!f{Y?(tEoDQTxXYa7#hvjN#-GCoqUI_oiImVhrA)u?pH~ z(CjoD)jDUi7|Zm<%`tI%i_5AH1}$!@NuzT`@}XpZ+8*%`z+FV1plQO%)dU$Bo9Z>bp1&gww{u#g2WPHnZ{+yf?;-|&r_-t~H_TMk0Hem@5Si(H*IBiKSedDwozkIdb*bx?O$E$|dDB`R|luR$ij7rRUZ&^LtjA`5V?T z^D$1SdkR^#L83j?aV6L@dDB!pwdwTOYSYA?fxGKdl70Hb%4LhVe~wXJE( z=MFswzlY~*S$KXYt~Jlf1vm_ECkez!nh@x#fXb4cV05VUiGV)@Oukkn7if`0?#D{5 zH6-%k(SGX?tK;<13=>t>Z`vW6e5Ph|Af z>nvF*TDcOkh4^wA#P*qfF+MU^nZ7eP=-t^KD8_8INSik{WIYIci$QI+!S33N5up?Q zCET;E9lH#V^z^3-)<_}XZx^lMfFjW|5t}`+@M((;=VEZ>BAudX;v$i12-P1l?Bv6a z5+ynX#A-3L@G9a0mr{)kn9H_^7;Wu~84vmT=SMdj>h;c>Vtq5g(oh84wg26@Fqz3s zA1dSDBg3Ttp~OQ7_0w}#sZ%&i0I+L?LeaafP5}*O2^F%jyx0Z>0e03t1N)|S?yNog zt;Y|-$7t9?qfTrp9!723;y|A$-{n(!BfiTnbjYow(Xn>6rh-%ts2+VSR#ye`5Mc&qYXm zXUjSOW`&wbOK>80=E;v7dvWGPnywvycPxL6rX>%kDARM22h^!Kq}NQKKp>?(lh~qT z)dLD<0X-l{v{=apD$3ux_0!MX^8I_?`+>VY{9f$YMGecprstM_K>hfK05PuoH=Jbi z8mM~BOwxeh!ez3jgwi6NirT`Q+L2~eolPq?9yfGF6Rj?OUZ34DzNvhp+TzTQ=W%WJ zADKvma7U;K;a3aMRMv#pC}pLlYnW`1vQ{L(5%#KmUB~C$*nH_Z*nP#WV#j&<>g- zaYPFJK8+fWnmB!oeau2a251zysbnG^K}RB&@74Lnc${nI8AsxiCq}m3=G)j3NoH-W zqpePFVI*bGr6MicjHSWJNdM946u8^xH?|FxOU{r*6E2U0W25CD0@nFJJ|whnS;Vo_ z5<&|!EoB7i`YVW{Htzs6QJWh(z$TWsTOWPw#E<5GK-0Bff~oeF|M@H&CO}3BAs=Q6 z<(8^Rl2c}a0La*~v)LRyd6K@c9Ft?OZ__kUvQ;2|8{LZnAJXh8iBb@7*I}#~!fDIV zbS=A+00|R9)ig~s$WmHWF|23jG8oA)_be@00SB}Kp;E{OAzLU6OSQMaw`*^KBQ^IF zymIGM?T($ScIE=S4Bo}6l{>5D=GqyeVkHra^&*;j3?GKIl{08^>ipzYUhGxsF0Zq4 z1_XaG?wFrFBh_6FHcEm0CX=KJU}B{+gp$K$1U2OL}T zle@q++gaQ-7y}Y0C!Nk@B@n12oz7GRzJ_n7x7<8&_$^0@{hh<9wtLQGi_z+i=bWhu zDi%1MiHbkak#Z7BLMt!PBDE4LiIP`WHBp;cuRu*r3GQ(+K|9=@V^YIuP9=4+)$mKx1S*IaZu<~n^@a&EfGKp0xi;NVq zy;`n-tGs(K8maCm^zL_`JmJ}KlXXkG*p+lR)7@fW(xy$1&v$gpkEeU`bITXz@)eja zR0Hh;p-8pW+m&Ut$_2QazQ9&wSGCf-A|-x8V=6=F%^BCo%l(N<@_I{wCs--)?3vpm z!K}kGgw=akoxUnmVG{gyJ=67k34X=2DBH=cRZBhREr1dtKvhb`ge2P)Ko)`uSqO6e zdkn?B$UYuVkg{^uC7(btGt=5+rj+SW3WT(^#-k)ig3)L~#NOMXk_?c^kY>HCR!Wi! z@p7ruC||@V=M}*N9kGE{Pqc4ys&&jd*q7Rp4!0iZK6T4kTTibuA9I>~QJXk9l}TY| z`D9A1od#^8!s4>33K*^jOLI2H+A-3j_suP}=pN8Fsw!%%dKd0&1E8tG)N*EL* z;oWO$q!pavY@Ii}S|jaQTO-Zm+4yQT(gSjhv{vFavl{6%A@DT)!kTZZ6O>WWclFz( zFsf0JEy-@KR%BNS0z6%N<*U`vT$|O?k@LgS{QNweZ}EA|hkc@-F8`H07x06+|G@ea z1u}(YX{O91c3H_`2u?IagR}yihSf^D33zkuIpAu`G`;i9TmJ)fE>%mq#MekrKW#6e3OAne~j5lU0q&Y1S(g%6ihz$FMiadNy?? zLTke0FGG@flvN~Emcup0Jt7M)-1F2cetu@tge zRaTpUgO^R+ySvb~>z?V|uSw17!mT~g;?_>Tzhi4DIa-eJs4bvqyWu8f@8PqfBlpes zY#A9dry|bm_}+Z$o{6llwKsGK1gn|$-!xOeyAQ6s#J!&WnA||#E1iA}{Q&d^taw!_ zS?8dpH*~;yx?mCl)o?DGyU;PZh3vmP&B+RuELA6ZgrM?gPS5fo6?Q!0j{Epw3oJ$DEeBHkt%5bIPBqqe2sOh zslZOpY?w+CGcKA4@oG;x+9ap7uFAN=>UBlc{uwb|z6elbHS=cocOK-Vl;_zD*i+vaq-z&w$pKHX#sNz*&F>wS6a6gL- zbEKnMYMznRnIJ?#=Ick55M3+jfLu0~V!4WJQ6nb0mTFN$(g8kGj|$go7NNFTU9pI= zNM#d?hFq94KujE=CH z4u!)zj@u(yNB=fqgQ?IrDi(KDqhkYNN5YobuvfEbWYnAtJB+@ByR&PqSaHQY`bv0{ zE8#KvOJk{?jYd^C-y6zLw7cYUSAnU-Cdooole7sSpSzr!cUHX;XtVZQr9!ZTh3a^& z>T41kNAeZxJXPOYvxpExMURVEiPe%2d5zP<^u$4SwCZhz_T?CiI8%P19x<4_F*}<%LTH$Ni6l{( z2hYe@Oe)tPv!k)3%+t%1d6FdQPiB%fG+YsTdxDkL zNXw`;J2YGF+|lI^mWCtQzPJDfMh{PSI!*pqG2T`cJVE2QJ`wYVI;XSwkwV;TOQhTU z^MoQQ$8av5XjukH>hg4$Z4_lAiLKQTp71P8b)*ZHf<=sryoE2Qf4Akuqt&1Ge|X;~ zFj4o=L-6;{p*6=-f|jOYzH}Ak$A;0rP|M(a(bW z&nqRMSi&%Z6f}qQE{5YC>1TxCPiCunsn?(-Y79dQx2Q6Y(;ypZBBN?IJ_~}w)t?ed@#0sMz7nQbyq{| zpivnS@s)8f3Hc}1sZok9+zc@FAjhIXencE^>uChH@jV40Ajn-^beN}507VT^)B;!_ zgt#YBi`@fPR1@W;EHvudqjlbT`jdNR_Tbf}E-kp;v@0*dJLx%MUW1u4jw8$UL?q0d zzYJy`6^7Eeichm-DjvFFSM_Brj?ln?Djco7Y0HCqi)cECdgb@rkLWq#B~iw#L+(4} zSx*gCBQU8(B#PUI^hFP%GLf(^>W|ulM95~+V1v>=u2KoDcAE?dB5&Zts9bGqQ-_Li zzfOQRJeAwr6%KW6%GI8KN~4SR?dqq$Dpe|_Cl65n&Ue4!+1ii1iun9g8tJ_<+gN%L*1KlwXfDby+prWu2jlT(sQ*RfPeM2 zV5Ii+fu2ga?PT?VCSx9_MT;@=>{m z2}ex$?EsXh0o$|U4^cow!GU4{$&hYFjP!7rj4)#}Bi@t7wn|*VQs6-3kR(@t!y7t} zE>Ha1eKoM%_g^zhOV~)Mri5(mvD)jQSo=IZhwG4iYdt%J&<}GojBu}Hq+5Ju#=95H zQVoNp`CC5I^ab#iH5Zqj=pEb}SqH^rHHNGUf^8JpGXXh^(#TTdUHk&GU^OXu7p8A` z4mBMFz{gM??HqkOoSj{&o!z&D4epoUMqSHY)VTbs)hBod>l`E@ODs*smJnhG9#mKm z1SGCk8W;Uc{d!L{U5XO@%J1n3?qPzRk|(Ph^jfSD;D7*~;6bTUo<&uD1yv~)5fo!J z7-YX%s!&IuAsFy^Tuxiq9yS_UbZQmivD$j2x}9kX0b`XIIIMvzNJO@RO7&rD$*eIX z&B45_wtUAYKXmJPdoo)%HNJ}ubtdCwXq zeLX`sliOA%=?PYaB36Tlh&>=}Bm%(gl{floC5olMwhz;r*mfE^m%ef0>+~GhAKHnN&f!m6Xksgup1TC3JdH7?FH6hMrJcoBQ zCvJmhZn_mM;HN(gR%okzslMWGqvwc;xR8}ZC{Ze?Bz=PsH=0?6g6%gCH)R%_cEM$K zB|?IUB{Oi3t?vGYW!ehMwVS`yy16?P?AqK~`!I~+w*MMEH~);Mys=Q&RQ4X|E0y|x zf|h=W5V|B;VUoH^M%vBJ)Ob@KG8GI4Q^903lnX@|rg&*a8czT=JON-%T8ftGlGwdD zTYCadMtf3@Qd{rX8KWy=`{@tuF|VoikuTarkFl8eXnMHSMb8Bb1EJz>yLn%$J>fTh zOYp_v179(DVvbyQeb08XnZ67+2uDq(6H54JgB!%~&rm~^i*~MdX{xvM!3v*cLbxB$ zb5d_N9jK5mg|=Cx1l0noYjPu{S*i3Wr)*Zq1POwm<$Y-jS|Bva7EC@eJ0x=AufKcW zClB0y@R^r?@1^_x`Sk6l|M^}x1v_fbqZZhz#XyrJ*(1)$?9mmlXt#t#Oa8l#MPs0~ z28(|5`M$57zWrxEyB$_)FN3o+pyz5E;UCbyOE&K8R2UnuIc|=r&?YtYy`^uF zd*0%5UhR0x;;IYu3-r15SZipNy>uB~)q1RTJzElPzh=uB<#qI%k)HYuY(IOd&ibjg zv4>e+8*_xnHsM%x=ChZ@R+OcN04a9#3yR4DC&z~191hCebK1@G%g*-JI zVwR^4%X#Y6bmt|2sjP=3=4S8P(on(bxS`V*?!BSCN%?B>?p^J0qKbcW#XvP`FZ?(=6C2hVnr+1>~&V% z4AT>5t7p}1C$9-iyIqvGr=t=f8>{#5u&?56Vx^3lTq>K@0TXX{YkcbT_{p&o6S2Sg^OGk( z{Na1 zV3!#Vyo2>pv7mgL1@3+E4I`37IwJz}UtC z3T)lO1khQ(<3%Y1k(NNzCJJ(FBVeilsqUpxp^=S!|LN1giJrdgCC8E>SWdK!SeR`I z>GjdU+2V5_%vFzwTmJ}`*e&TH&?s|fE`D$6CrdwJTUzq;k5IP$ zwyjKX-=*h>k=a9@@DH#Pyjv=ES~EI=!0OW2_%KV){$J#7yZD`@pPc^p(>E@zUYZRQ zWxL~BvX@6>OOokWz?6sNLL$T}Wi4wDA5hmhGQ!wH#o2*qbYN$D?c&#A z?9T=VhpT@^&#e%D=M9yPnNB}lSiU&c)3bqa7~OJOX0woUhTakg^JDVtD3x?Cj}=`W zI%PC^TsDi*Y&4q_A(I*nNb~Um2Qpf}i>*r!6=$o_=)jIbZJCZOEr0wnxAE+9_W^bv zQY1XW?!&>NGdY-NK@QT4_SPRi5n}6P%{Nyr`>jitexvklKpZRQ>6_^1NQzXez1VqA zfmuq*AZ3(R!gC=nRFsOeHAlCfoz1rGx=&?K^(IPzj88B2ZqCld zCpyDAcP7|9yrXa7-sjPZzz)+_p2Lwdd%$+W#88X>+=A;DPC_56%_f$epi_4)5>k-9IQs zhxW^LjL5aaPUwYdUWu()FhPT-M;vv=Cv!_x9xQ^Xw=qu%0?#|rA&i$SGM^bEnmU=K z0MEYm-S@s9nXsX*EqU-Qz1xurT1@_=^HI>(egmGCWVsqiZSIXOchN)UP}c3vgpe3a zyeltJ1GSPkDU!6)$<7ET<$-Dh&>f}(;G7k!B_tIgZ*@1E?^BBvqRlX2>Gk*u-;$EsTMK1ks&0aR4VpiVm^ZG zSMhS6;CYYqF~UAITh*Dvk%%Ze5ewp!b({n_X;RaVQc(=^g81~~G*|nt@b2QV+fE*< zb_d-F>#;j$r%oYg@`BHQ=S?SWweQvG9(?Uk?R%1ih2JssM1#H&WF&(_!JPC^0x_T6Cyd9FkJngjuqPV2vjtOr>g7Q-J02WUCvp)q9%K_Xs`H zd)hYLx2r8Xdv^O#)N;)fJ3Pfr9bpwzYtN{nJzLs5U8St?9Vp9MT|7ICf$WZ9rrjFu zoQTh5H}{Gd$>PeuI@}@p+|{asScuJTI=osPgca9#b5c!Ty^e2HmoL{`#s|OE#tOZ` zu_0S#FjL;q6H1QlEpK^KZ$aNSFqItK;A!8GD{U%z5+i#n8}7`}fX-z%6m#y7%c9c< zb3^&^#x_S=>wbOEW65Pb5s$sa5Xf|=id!n)T$oT|UYVd@lp_t+KY=6M7NSzsF;AXy zgw%JLAP6qO#k4nVK@IOoR|+!bDKPvT7~;vBP5!pHPiKNR96wUCEW-Dn((-0^&^k|p zv+q3nEXFubJ_#;LZrXhBfl(&`VqLiazogHR3}!zwpipXnQ`oGOX)7oQM-?14-DAn7 zHG>)n#iE%o&c8*%4jXL=8YIUxnK#ycAr?D4zOdBMF*qF?+EbpmDLUoeQ1G`$Y&*78 zdq$^w^0{#*J(bJtnCaYM((M{)+uRwf6ec1mA&~J@hIW_pnM@cZN0`NW2lp`169@WT zi-97OQH^aE;4Gm8y9O=dewPpik8*0Yi8;{|eb^kgG$+`~OX!`%pDExVe~I6w@WZf3qTRQ0d=PL`#_@GXo1yG^h%%+SDzacTNQ zK?E-YqV;u*dg&?n)vNyTj>-`UlExD)p`>l)C0d|ACQgz;?lZ?MhSNb&CV>H<4JvH} zrV^P%lo<_KAiP07#r854$0djM!O^XT;B2{VrY{m5+TZiCm%r-454F_ZV~>}Dfl|z7 zkC%hNV$??Wns(oiNX3Wulq++?vG=_5eIE-X_tZ{Dd$TTQswX0LryTZV2jP&v3>T@6 zVP#>==c)mzL_E|%GYqGZ8snW**UJ(-Fy(QZ1t6h-JM0Nd_?b~pOklzYNh)%YT3@Kd zkl?6;`;EWAythrXhLhRC{!O*t|5qp;6kqXrF&P*ClIpBt-V+`X^aF*FNviwTsOU?) z?z`DQAoC^yWS9_mE7djnA~4J8U1vElI19mBe|j9Y!-s2AREMijSed7T>^T_*uUxZ- zy_1*hVTa&gd)RJTvxjYL4@U)&SE+cx=L|XowE(k&`)hwT2WMZS*9V;Y6u!QNjc={p zaPg5xF2dIR`_2RjMaEO3JGmS^vteG>m0VmU*+j?`_7-2?k{ZjP)?z!V%eADw{>IbS z)m&Pt72xbtM{J~AEm$>FNswuYJqZ*>e*WQ_Tg2uwvnqL^DXe^Q!I(*0(k0XqfNg>GYF zn2&|GwTj(oXKSjn&sW@#Uh1nPC$nuYi$?S1c&OYCUkwJ$p|(J#U!@tZM7qVm;4mT7M0G^7E_2|$a^~QJ&~n4^+V5wNzYR_;zX*%9w@@9S@|9j-w)5bV zvgwos4*6lv8L*mOM|lkB)BV`e|D> z)5iU{ezWw2p1!`GL?Dn@{->t;mDA)>c z-|b)c&Rzeb?fCH|)v<*@buVB%p<1~BKc_k(Fx$;>%maI+f*?7eWD^7%JL}4+Mp5#& zDu2Rj(Fibm;x&3hux+fchdO$WZGY?Xi}3gR7w(@9qLv05@6+}BR!faRkyA`4+_Uz^ zQC%B7M3fcm$aH1c_2{W%f6@8SvD4pz_T?90N9_VAYmcD?lCG^~6}{+pWbrA?g?XED zVX~f=rNH?0BBt9v`19k(e}4QpbbopI#qWMsvSw&ax~O$MBFxskgy}`rv2QQ28iq^R zx7llT=tgR4xr~C=^6RDTx!H5V1*(&(M(aT`F8w+d#&otqOmRa9!G+`BI}RU($7?r8 zD}E(SXBc-kiQL_2M9r<^?$Uh-UwWIkyAgB%ery|t++8omz6`S!FY_6hyBqY|lJ;ba z76ptjohDh;SezAKVU#2};&{`Up11iqIMKh~d-8yPUr%}0U^Lt}vqS8ZSU9#^!mrW> z<2h|lzV=!A{k^RnsQ%qKKc3#}Z?9s54zI}@wZGb#@|z_FEVWZB5iv&ade+rPv592Q z5aFiciD+aE?%Z5+A@y-V;4c^(JJh%37T=AQYCP1La=Ox;L2Dx9QXO~SxvlrmSR7Q9 zgA?ho?)5ENx+gP}j4x>+1fH+Y9Kx7&_j<|9ArSECcbBWP(D<$kWjSByWImhDg#=ZlC;a9xu$v4L1sG-y>=&n;KgHCzB8 z#7K-*vz5t7I~*0Mt}f1FW!>HPX*Bnq`P8S+yj-Js`I%3Dit0Wj2p_7QuU+^Dlj$Eo z38?=+yfRM*m_1>6Sx{`nEhd>(tW1WMhuGHx;P1%9mx3Grt!x16~@BI!w@XQE620y1Vx;Kd^djX>2H~ zgzuH3WXvcN!h)W9%^f;cxn!5M7?C1kK}ZA{=d^B3L=lgGmU=i0u7%i0DG(?Q$DV&H zsP@NO+ri2&V=9%-K90B##uVt83=DD3Rj~rMfjFZvM95iofmVy# zY4KP+$Z9bm$Yd$3X0$~-ImPSuFnoMpY^2EU;q&mR6DQ8&P3)q&C+c@Wb;~c#%6Gxy z5%?;*3kOM6<4t(8R}$5d0cVrZZZ$eg4hFhA)_#9w^}FTgABjHy`B=VPJka#L_3y;k z?{}0^8%bc??Dbq3brz*F93EDf_rsQbGU}Xwge2|XggT3*0)rTuLFX4^BVAejHf=DL zvigcCkMe*2SmjBU0f@srS4R#*0$88Qa5(Qu6Ei#i@ z+g9wDSoekX9CGQ|{U;CY+;!L$ef#7L=^i?K)~pvs4jDG`!gI4nm;sqNgU;wVs^A>W zm(;FbztGk?*0K)dwwx-XkGe)c>wB)3D>*{T0*F?w+Kb9=WvT=m*( zCjN;tdvxomt;OkWtw1Wy!r8bvJNoQ2F`+tSA^Oo%T}tBQa*&b}s$U0kXZ5-rFx}_a zPRO*pW z7vvB5UfzhVVvbxHlyX-84z14W(k}d}l$*x{rJOlHR{$gj$qZc*fB2_ojh@!Of8K>> z^%|AiH##Xyr$I+0bx24#=R(uJv9-NQ^sxCxF32`)ecBq&03gK|43C&l3;l-mz7q4EOJY!g|Aw3eJx(`cFX_GX%b+1&@;(`&ayZ1k1pJb1|_;HfU)T=FJE9+u18?_D~@5?NobNYe(2h_?HuJ4vAaJ9+P%H|lU~(MzEx1w@@=gz zM@9}T9Hs^snb4~E$O>zO(N$mjB--QTu`v=PT{=r+=IhRm`P#?HJD!n}+_sHfxaM+l zzXilM4@37dwcoALi5RB$5QkTvJ9bvenCR55JrYv;_DBxhxGAJv&%W(@T#`6Gy7xIF zB6?jot)DKBIxjOL>5P^Ut-5EmAKS5C_oOp>_UdqUY6~sh)~qp~N+NpcR|}I(kfa2Q z&Oy_9bF;?JA^eX#y?Wp$6yP+`HG=Q_}kk z%s#)*h+c_j^dEiJIn#TbJu2tSfzc^vrS`ojqs?`ZJ-dzQ)VW*djvW$W+N7S@p~sN3 zT6O6(Y*6QJ@vY)x!ef#z3f~{r%|`_ zP3}upE08q~I(r#vPr%8CwlE<^8*V+nTFF}@DAWW?P;i0gNkb8Bu}KLD1_?mPuDhaR zI`+9BQzo|S)H(Sk*AVhvQqLhhdk*QD=-ETA>ejVe_eYe*^PzL+qU?<7sZI{IuRE=} zUEOKbDcPM69%91BYx(=;Uf1(9DLbLj>DP8@yI*BiBZx0C=NB!Tb(52h?{(a|tVp_R z66Q+O`|tbc-@JK}OS$0zz{-FWT=i|I)S|O_HX}VNr$zCF7Z$Hx-Dc*n%P%TEa>0m; zht)b9`QL+wmE|7UT7O@x}DP)}n?MkshzAZEk)WWCUVxL3Xr$Ni|p%Ie2s>*qqa$ z6JPH(MQXIZC@0YoHh+c3(ZU4Rr3*-5Z2*Ocz(QXdM;VqGhXCYp~drIJ{rGGtAUF zrqb_+NJw(l*{%WOrhXY=K`(nYQ>PDaHjB;(&_293d(2rCbd^ezI`=)NNttKPLAkn8Pe zsjhX1j!a_yAHeiAYdmx3jgKp$?&A zTD0h>pLWz$4VkJ_IhH3~nw`{n*?sqXdE?I(%vt`^2d)_vY~DWdgqeC|Sn#MXbOK=; zqqEB#yrPp9tjc-Bd9K?a zRo1y~L9Bkn(E16&-9ar}cW{885WEodsCz#YslgYz?l9y8U+cQVF+KP#*Bueyjtp)U zqO&WMhA5mLG0=5KqgTYut~WG7nw?uzlv`Su+N02OX3vHPoCo8r0`Kd*@<;AJJ zr>Ex4D=kXxJva4&)ZTfiy)RGg;Wug~SaS?J+Zv9?_Jd8py3Q%f~^X&Vx+~?VtjY8aj0u-SPvr&oyI zkcv*ovGEmPE^;xi!F4Lep#ZZ`h+!x}5%O)gGcdi;$0qz@+iayA)e$Gd#&5Lpr+w18_MV_sx8cuJ_MXG(bH}dTD zu)^0{ux3sHttTPMmVeyZcQz;sVK)h%tnDNt2|pvwbZl@7GWOJZ0jqw^}NvL zk={*3zOC=d9ki8eeV=CUH!*;de?cg05@1Z zP;BGZSe;s>En3^}zGwYQ8C7$wvw1qS*2+<)rFYd1^W4SnjI1 zJ`E)Cv)DMKR`B&ZR9td9{{^zUBB<>NPI!U5DO08)Lc4 z7u1i^uHkA;^i!l^X_-0vU*(4Sb0mPKxd7#sGUck8FHW1&I5ZbD-!zUqmnx@zXzfuM zp&|Qgnue_LE9LrzJ}t7Lt8`MDGzYXCR2mgp`u!y~3nlhWDrTU-$|t2qTQ({|uCo%SF>18MIs8;<*PPPuv}E$!v?w)7Tbh;F<(Q2@ zI2&iXwM26?*UA!&b-GQL$|^_7>U$0!@Z_6HeSa8DOYF;R`_)vA@JYRKHkNYRc2&ZA zHCszUYq93G!#U=-?OFN1SEI*a6viMG7hB$>x#kafOq~$49@UpcDqr-U8bDdycs*)z zaXoS^uk-RDP^xSF9D$*@)Yh4DEC1@|OPO02XWKGOvwTf;53MsZa5gT+2#h(Qcj|KX z`g(ybL9$vu_zE%{S6#@j)pn-4vLV=hX)z4_5RN}1LcjHmXv82Eafn9?B%mb{k%U%g zjW%eDWTc=S+M@%`Kq@+-6FQ>{x}uw|XhTn&iL=lPy^)5qtumN_Ok|-i`eOhFVi3;3 zV0;fla4xbj6vJ>H&c|?!zy%nIQ5cO2F$Nc5EH1_+xD+`Uhs!V?6EG2%V-hCg3QWP3 zxC&EoHF8Z5ev2RB$9M}r!)DxudvO;Y#WQ%)1mjK^6?=GuoxfU6MTe^@h@z_bbN*-_%~j} z4D81J_!6Jv3(Uke?7$tk28Fm5vrvR${2C>=&N8qv%)wHW<9f`+R@{IaF%RFz&A17# z;|cs9=Hmyr1>3O`Z<;6*ZDO#}#F{v)HSsu%Bc_E(FfFmlB!c+bz$BSgrnPBf+L~mO zV%nMZrh_@dq?(SVlj&@_n6B851E!nlZhDxW=1g;z>1BGGG;_8|H+@Wo$uwD}ujyy{ zn*nB^8D!2egU$EM5Oc1{Hbc!YbDlZh3^yap1*pI}Gt!JQqs@h8jJe2+H5Z#p%%vvB zj5C*+@n!AW9~ISHTRkO%>(8^^N@Mi{LK8^JYs%f7MNd}UztbEW9D)5 zYx9Kpjrpy4()`Z+-aKWVHqV$pm}kv%=6UmidC~mQykr)dKbe=!E9O=68h&YBH*c6X z%_8$>^Okwr{KdRu-Zk%;znb^W-^}05Kg?qDPxFEK(0pV*Hvcl8m?h@l=2P>T`P_VA zzBEhCGPB&QFe}X}EX1GiDqh3;cp0zYZ}=hJ!%y%m{*Jft7qi-|F<+Ur=4(@7)|vHY zgV|^{nayU4*=n|#?PiDBiG605*=_ciO0(BgnQBvmyYaZ$XZD)|rq&!Zhs1ZgRWk|eF9 zwX~78k}N6GPTETcIYUyVqjZwa(nY#TH|Z`tq^F!IXGt&VEopMLq)Q*kkW9&vzS2+n z%K#ZDgXA0;EZ>tMa;{{{P#GrY$@wx|M#u#+Qbx&WxlqQ)MKV?{mP_PP$&qn#nT(eS zGEpvDU~uQmpO91 z%#|Btp4=$kmz(5fnJ@n*KagAGhjOd@NPaB0$xq~VxkK)hyX0=UNA8uM%6)RbJRlFs zL-MfvOnxqp$S-7p{8D};kIG~6xcpk4kl)B}gFG8NcKnzzVRMQL z)6<8hyXW&mXXWOVmK4X%E+{Q5$HRG!}*d0u`=d2XK46q)C9hMu37TUt^anr}}L_L!Dir1wipa?3;W z?I~=yOF@B4!ElFy0(*)a?h7umz~>Ab?$TA@oI{5@F%{TT)CGRZqGtHrkr(&^h@9bb zMqiLuGHX_@Lw!_$J9^s?f>TQ7-+3&N*_Fj~p2_S_-d;8tsoF>Kea0Jiny8sGzLun&=Ayh>O0q&c%$< zf`a0r+~WMgywEYZd2`AOLW}GvdQ70dqJWFgF-`^+*;DYC{F3tEqWqHb(6P?@#m@U< z173+P4!8&%>%3p=6hLwA?2@wb(vsOT3nKl_py9_DUY2|A>z@0$=lRLT`Hv{@T(QIJc!@2ja~Uzp^A}O*xnf7v z@e*5D=Q84A&tF7|=Zd|!j+fYyI+qbSp1+7v&lQ_f$4hK!oy&;vp1+7Wo-1~I9WSwS z>Rj3k$>`&hYepZZTr>JO<(koFSV)<#c4WAvo;lE|C7DAV-&vlv4RqnY$C)yeiI@dW(w6!F3 zu02Ie%r7h`EhsB2iyz0xBT9!q3iAqP<(6I>QBYQ1I4ifjAU|9~oLN|! z-@?&u0<@us^0_7UQCW;?LO#7HqNKRM5<0VmJq5lKZ9{RMmPKi*U3aXy{b5AgoOhqa z*$e-}kn;<#rEJU*=~FT(1S_HtNSSzfHY^an9PNtkFOAFU)!)az^P^@VzUxgO5b!z6uD zWS@-D>&Y6q*2y}N+Z!5NNUnN~wb#DrLha3r;EObXv1w&_ajM`35U-{05IaJ>T&!_k zrvZgrpvR!RspY{Jq?P5ha7rlP%}D2tMjcmHcthZ$aJ|+CG3xLU6MVjgUasLrI(5y` zov$~-wSwto@KB}W67@Mp9|Vuo>r2zh@+{ZQN_V7dR=Oiyv(gMlkS$!Poo7KmWzFAH+Owa1$#^1*a*9*@L zr;i&>h8s?X8%~BBPDZ8^e}*FuvN9a4AuGcTH^WU=hD%?Do30EuT^Vk=GTitx-1sxx z_%q!2Gu`;py|YV4x=Tm8OGh8~obJ+-?$Xo8z3$`E<4U=#K5qP(Zg`n)c$scEneKa; zZaA54x-#8xGTn4#y6MVv)0OFk>!vHyO;@Iyu1q&wS#El=-1xKH__N&jv)uTz-1xKH z__N&jv)uTz-1xKH__N&jv)uTz-1xKH__N&j`?~S>b>r{r#^2YCzpopAUpM}~Zv1`S z`1`u?_jTj%>&D;LjlZuOe_uC#SEtT$b?U5vZu|q?_=maI!}{3S2!=$Qommix4(J7= z!^a5M{YC-OJ~7u8l99BBD#9;| z8518JJ}o{vZb|sv;jcyvj>w64B;w78#Stqai=%IfToUt9TPBP-+kMIMUk5I;C-K-_%+zuM>r;%c2=e6;@; z^=f={e21v_qb25}=w8uRMc<_FME@}Q?&t@cUwm}*Bk|GBn=x<4)y7rC-5L0g{xl{$ z=FFJE_BSkMOw5>=2{BV*rpL^VxjyD~C#IOUV?K&oVt*Cx?`JWe#{Dd2S={`%s`w7^ z9pZizA8kXuFRs?Qeirv!+`_o`<37+_iK~d)9Je#B%KmEOYU2?fs&vP9h)<7CkM9>h zIDT0CnE1)@SI6HN|4{tj<9D}6ZZWb&PK%i>e%Rv478MEM3B?I_CoD{OJ>l(y_Y-y| z*0fA)c~#4qEw69+bj!Ds?rpiMWkq6Y;@HI76Yov@Jh3M6P*P;ltU^LYLn3>qxFK;FSp*>Cb~^Vn*nXEY4cFq_%;jM{JG7VHdSpy z+s3zzZ`-PEdfQ=bFKIiWZBg5WFh=L0gz8Qs);8@~rjKru?$p2ZzFptZCuz_0Kq9>e4K zHJ-q4@D!fLGx#GG;XV8lAL3&y!Ke5PUtlR#U^UiYEh?}c8?hN%u^l_G6T7e*dr*lg z>_aUM=~N~YV!}+MT8Py?Y!Xb0wf&}=PNu81_x3brncn7X)5m1G7T$qs$2FtOh2|2I zqZV0{Z>F1>=110&dZ%kcec1fmwV6I@9yh-=zjLjm&zl#`tL6=B|6FEPnXP7*sTD|& zgjic*ghWZK#2?juc!qQeuo?D}G)cF%LeElojtr5Zu0?Q+YX@|!fRiOx@_p7mwe-!l zRz9`qsXgzh4Ewi{=Zsm4)oO|`Fhpa(MEaFzwq9YC=+2nA)x!tDlT?t~1ByySb z=V}?k-^xh7CAqAULN1kA+%L1aNy@li?$GbivP$k}H6qZ8m1xcFXv0lt%P-N6UrRS` zk~FTAEbfqg+=^aEWCW796s@=mt+^F#xDIXkC^W?>+=UKYhsoTFMf?P{NWvkcnH=si zw{xYrldqY(xmAL=)=hVnL~y&ra=XOwO-ZnHKN67kUDBUV%MkujMslHy=N`G5Rg%k9 zQpk5?7B|RjzAUAzlrnCTTe(;6V1?YpFXeu&mB(3wFvM~v+Hn&GaTx}4C$hN`Wwxv~ zAsq4ChIZVEL0p1tE=3u);zm~EJyuIgu0aR}aXqrR1!dgr-rb83_nlS9=6aNIowVe3 zolnO-w!RGFN@VkElyR4|fi?nENrM-nU1 zmhT~%JJ5kO=)|ok;1=A-&3J-)@E$jtU0iP8-C^HVTDI8KWpgdcxJ+7dD}rn}w&Qk5 z;|_#l5I@m!kx=e+YyNI&$+eQiU6Rc8h*VlIn3b5!gP6htCWVX5Kvqd84{AJ;$OF=! z2N8^CcmS{Q01hG6wB!MFLlCzjid9JD%Sd7kT5%m(a}C;XIofg|lDQ7;xWcBWD|cct zzrqx*z%$&5*SHLe_%GBV4u{a*q;QqV;U;rCUo*9=Fo#)Tj<7<4SRo;-kWf}g6n9Ik zZ7JI%k#|TEw@Mps)s#qku9r;imHvDRL0E!V)S@j8p&ud<#0^N~U(l9+!5~&!-mr+< zO$t9Yw{yQF@;T|xHxY?vSb^908`R<~9Kt};i*K0$+-YjL%pBx8bC}D_5&jz;5yUl! z;$|drA(FTZt+*Afxdm-lfwue;lDP~i+=BMDL|36Jm)I6Eh5J#&O}LJm@C-NOHLk%T zEctMYHLR@7O)13ScA2!F$t_eYqaAw4C1Sp%;jbv z-!?g{kq~Z_P%f1SR!S8ADGB^cTJkeV;%Ab~Ph<>2WSnjF8|8AoEm!bEna_XAt=u5D zaiu)QcjR$yMi^d2EZ#sE-b82A;vyWvH8_H9CIn#!!Z}=yvFKnzpkEvtixwsX`fbn! zJOFW@X4~s3d#pv2ttYXpL?XXLSGUy;<`!hL%1zyRlfv!hcJ4ti25~wR;)%FuD6n@9XClg?v^xG;0z4nA`IpRjKu^@=BJp#jab0dSi~=}maDOkUmLL2 zgy1TZz}2QDzcd5+zRBU&=60@-ATE;-E|pL&mnbfiSgw`?ekv{bktEs@`M0#;MoH$! zlEQV;p6eu&Yo$MzTRu~z97xi*8F7f^4#aT_61fFkScyUW8iV;cvMo)uSj$?Iz*;j9 z#;oREX~{j3Xv5lRdC*!6<_=_AKC}x{xC;xoTS6@7QjWDvGFgjg#Ij1i%!@9zbk^DQ zXInXY08?10byh-ID=oQ0GICak(BNp8ehbUy@Yz##UHZrjiC*Ka35k-GMMSmy<8Vq zJ!LHBqY#OF181-rsjNmfE{3i-&>d>BV9*Z+!}$d+;4X~hZj9nCjJCP98<(;gIjqJw z?!slP#(3_=1Xg1r4`34aV=@om3f9_MawQMqDsDy*42oHS>tHaSyYUk)#_e2;JGdBk zaWU@UV%*EcxE}_;f`P6!cnk)Q!{FC2_zevH$S<&nU*khA#>ZTYC0vZpVDJSDmcn2K z47S5yCk%GOpi(#ffHA2srW1_m3S+u)m&xG~GY!V%bFrBTW1fLA@36wW%iZQ6tIQ!* z>CyoK4~u>aCYXnHKO-w~!+2O?VI-c1C4q+}iHD>$4@(}0GLZXa5D&{aJZMW% z_g7L5uC-s&qb)%tOGN{zr#|{17;$_LUAO|-Tx9OCJTIGDVQfoOIZ&s)+Yps6s%+H| z^!p_$`Sf_e-sxGs_NSjz(@fd`aV*gK9CTFYvcJeJl-8|H3%tg!lem85Ymf>i!U zB3DU&>bKh>x!7{h-Dtzl(U#lMj;o{_cSsu7AQW%F;7zneEr#I`rs4?N=~kAAc6m${ z25~8}`ISlylft!THTO#t4@d&{N)jt2nLDLFYY>Sz?sK)V3X{SmW;OTue6`^rtJOO` zgSgph@`+sMY9q?|YOG{h#2v0Ysqx99J@w?#W>+3nV^M%S5|d(e>>7k1*1oeF+1w@F z^!vozpo_Dtw(<{j$n%sunMnn6Bh9c)S?{@ zp_fVF3e$^~s%eYJP{K&?l{Q@o3^%%_k$hNty>8!0oscN)=lx~+GR=Sja zV(aQq-7iynh$e-*ZRyvb3v0X{fJx!M+#0ao)u@!q@2`^=AEB$wZ!a%YBEBO1`4=Q0 zh+7cHkI{vzF^JC~n-8FfpJEo5;5vSa8~GA$<`R>_*UTz@VpempMDa<9`wLo1I}zm8xjmA`N?XG#(Z%+FKEPleL^fArGWTEs_gh_jHLE3r`z4f>lF5U% zFSFH3=rZn=2v$iPcdMqw9Z2NAG(Sy>l_xtTk#|aezHf6X8*xZvHQL#H--5xmU!{HX zgC>Q4G6Q+QthT-3T1oKrIlh!69+dvJ_Z`P7SEu+gpx%9CDU7mOt5ffixe2id2rS;`+W);_))wYK3 zlPE5>eS-upktBX1$$T3zws#iGjY#Ag46?e?*V>~ss>>yCpCs~0TQ}QqpCogi+6}A( z-;XFHvPOn*pN!-l$>n}2WVOuVL7B}hQp$r;#shK}Yvg|JN4QJ#24u5B#_H8$sJt&c>lnKFcr z$Vi(HU&&Rhm8-cya`~VX@^zWTf5>b;ETw!=%J@r}&)4M^zAd-%6}gRX$sJrEckw>C zpAXC9d`UG`%QY*I&1xCKS7anBWDIx8IDRD)xKgg*8XHR?SIRZqEwi~<9^(##$#|}m zt9Vdmag)sFF1eLkk;$GH!oh_gImJF>Z4=5vqS#@+HbD-nY@u0>xf$wkA_t650{IiVYVq4R%=5ER5Kc$dw$}D~=v$;r0 zSs`V%$9+I<;U2k_tK>FT$sLx?w{2^PKrHtn(eg!YxtbS;WHvvrxqgRjRl6ZiT%zMT zzj^Gb75Fu70a(GWxq<7shHLD3IXBjwiT>XXE=2^ukN7d);!f_s0Dk%3p62@CpZUE1 z9$&HbVi8~B^W4jwe4abFnJZb%ZQR9bZe=Ckmds{S+X_TS-G0C#hj|IT*-T*N*6Bj4bs`~!C>^?b=s zHLj9UXkJ{@q<%h&lQzQiT`SKS;qS+IhC(lGdMdtAeR z@t^!aj{slyLg(w;r}6S5erEl-bZ`Y<;aA+wo!rZpxR=|x&U@!nf(!X8Cp_+D6@TA& z*j&Y>T*kHapVDrP;J*J4fbVlzeLu$!e=P(2wLo3m%x&Dl&D?zap*9Zg zE>&&sRN=dzCtIyx{i#avcMDFs`8=2L-R~CVrxtvdmHhhDhUuU=+KiX?T*}pTY4|2M zGAmRb@;QFOm$_GCY^eMHcf;))zQkAg0+(|sdhm}YoZ`?Ee$$21H-uWQeBe%3PP-cX zsfXK}uL`tv{C|8Ga4LG?4)`^f^5Wea~lnw1fu?1&4*)y;vcxevk|eP`ELh8 zOWl#Jf#8b3D?2h#tvLyByZ408x_$I_xLEIb@|f#SU0Xjo_&WD+8K35dd_h~3-Non_ z@Ru+DY*W3|)(ag^Sgq*_)MNOewHdGD8h*tcT*pQH%8pO1;6Ggcu!qlZ4YzSK-{#+} z{rG*iwSUYnz1%n&TuG+&v6?l3F*hIlkiYZ$=HLA8|81ODZvHpHU(^5F(Rf*(T3Pm8 z1efyV?;_o&4$bM){x^b^+ynhqN~7TR#>Rg9Qr$yizK$1xCE)c8y}sdpjzc+;_kS7x z3pv0o{&Cv+;4;3(B@MMy&%$+VG&U3A_`&tIU#NYNf*mK&@dv)$HYTelTWO9BsW zxSLqPY9A+T=4?^5wFZtg)Xnk0@(6_TC;PYa#Qn0NA)Hy&yp#9yCwz&|B91R`1D|Qc z=Qd3@E0ym$nxvvGJ@vuuyx;m-Xpev6vwV#&^KBiKXl@JTXZ)NS{bL%etshGucn@?8 z=wYtrJ@%i^dw93QubCU@(+_UqYJSCyT%z|p&dcpizqe^QYRjj|vgAe`+wr$98^>v% z9~dA#HLrEVAz%i0eeg5h=GdAobykDm_6E}MpmG84-Nq#EcNey&Q_Wq+ke3Iz$Lc2A ztQPIlFq*EDjkl6O{qT69(y0DBN8<$w{=L5MhOj-VgWPRL{Cv9CsR4Jny|$f7C9Am8 zN|OUN*H1}YP6-4aJ-8!nfAOx54!+4poTpsKm+ZLVdcMKe`66HBbNmCJ=kt7y5Aa^z z%Ln-^9|HI^|DdzbxsXpBbvF77T*wc6A-~0E_%dJOBD;#^WxmH}`RviD^24s%@XcxG z1AG|ZQ{Hoj3pusGsU42KsAJmpZ|CFlMOaG)ch{9~4pctS+%lRH5uDiZ?Y%n zw-YwjbM-VvMSxCt+UH?<r!Q+Mqu zrMom-`@YV$@P*MdtVZd#%96uZzjgtr5f8t>u?M)t1 zn*2vA^S1kEIcjTex-{+lz}>u;@A9|G>v-_gwm81a3gxhN#kRYW$Fs6F7g{g<^4Aa6 zYL8W~U42-4!D_?U5+H>Zai8tc`Dd=x)YVEHs}~pWAN(T^Xh^p2*NEn#@%iFvb`M|I zp?Yt5=f<>+rr=T45T1tYho!#SZ&R|pibhiNzk_4TAy%@A)qIHm;KQy3tl8z;9Pl69 zt>JP9_i>-g57sp2O+U1x8>7nBNkAVSMW8mS_EB!O8v0kZRej;uQk#J@k%12N{H4~rKK1D41!-G=rmQ{PBd;)9e>uQ32xOKp%6RNJw?S6fZZyie(d=qf!`_JIme82%0 zvNCX$Q^WUofE(@1jjyd0zTS$cqob+z*F2mYCqMR>k<|K|_JNO}=WtHWc&5Wyg&@$iw zM=N8kdp;39a1@#D=KyeIgYx}d0kS~n1vQx>?$TL=yqE9r39GvuJQ~kAG4LH$=uE^q zI$^yv2gib@zA>uoNN#T4y!>Hp>U> z{3pu?{@$3D+Bp8R`|~uGb9G_o41f>wGrsDy7_WDDYT(-GY#nB;dv4NB(-5`}G_umD zF&X1>4POk};u?FmKKKuA4O~aoST49LQukUdz1b^qPQIVT1C3GBH2ghDe|u;ee2}Xf z=aeUl=F81fi2&QOop;$Z_?5Mc?{)Z-JKnyl{y2c$qim;_x5vlL{XNrfCmQAeH*go1 zc=lKYt8EVK;9jn`{eou8GrLO9H{ar$f+KY;<*r@eSehB%;{HI(f5RQ0Sj(;cHtm61G?gJ!*SPv&EJYT;Ip?k4nD(OfqIHxn)u=N9JecHZhjp& zwmd$)Xi5|EU^VHlxt5=Mqy48Et`^XUL~kDat-3C(T(+}{8q*A#4_0zFH*y_U@qpUP zoBw8W;b;#^?}?$Qyz^U$PaNFJ4|QdkD-G?qG;8YDbMCWq2i$UOPTlh3Kiv|J1xFhC za=@8?x7(Rn=7*~fxHAj`<;Jn`&2z%z2k(P#9{Q;Tm+NfYx?wiPXHPATM<;Yjm3Qz1 z{$AJ7oa!+nMg1H&5qPz)J_79nCknd;LU*=sW`R4ihji!SI?$O5{(G!w?&!b5)62e{ zXt-9)&QNI5s`8(t{BOqv>3|#D4OPa$! zk2PZTpM^7vo=@-@{@PL!qN_5FwGNJd^tgsM-~RN0U)U8*?i#Pt1wPB#K%2m^bX|YC zkH=c}Z3S2I7jF5hRCwDSchz5aTo*cq?A-CBVpH&sxPBXy&UjxEKdAwh3eHO z!aw{vh?j@;bL5*xU>~6|_;=^?5YS)V!m5**kHr1_%4zj_475~mk6$yaZ#QXL4K_}={n_fJnfh}?Vez|-=}_ge4q2KqgD8I&*s64w_$$x+mAv+ zZ>k<^PwH5`T_%KN`-MY6^UbFL~dAZVdc$;4U5f1)t+z_!OVB`*%IZm-(Xe&7&*RZGFG+~BPNJQ^C8M@>WHugh_o3y8mwbv( z+FdXg_}}Le|JWIS;J>fXT_~Gg|D^L|Je*$L>QvMOYjL!icc6|P$o~V~iW5sy{ZLL8 z+8;SVO5A;by|+(Ps{AM67&YPfu{<7d*R8TDXsfdqano&?;HcXKH|8d$^qcIO_QX`;4bmm2SUET}*3ZkPkjec!{e^zuNtR3E3ie{`zh zX<>deymLG_**f5$q3k<3s{Z$I^3wEJAq3j1+*0#><*1=`n{&F`y!kOxJSPwqYavn>*DB~Rrj%| z>-R*^a9sCT6rF1D)24eKe7|8kaKPow*#+v`54$6i`yIQ+&`=sW+?yY81$XMs{B_&q z@xaefjt6zyUBlRqS4JOerDnr;a3NpHJATM@Nc@7jR)=cnfDz<`!$YZ zL-$kTN^gd6bI_2-9!nqmCg9&k#KY;Msv(bUmMmy={($1t*vA@bfDP$9RcItG-`C4d z1P$fbiJ)P6PmZdl@c&yubn2k$tBW}c{n2-6$!ELw$<8T-5!bIGIdvQ7L z!>=(Jzrnk>7JtRZxC@_P34Vr8u@sMBIac5?til@n8f#IB-=fNd<5d%B;_;zLFrDzJ z>0)xQ&Rk|Dm;^J`6q+RSBXhe+HFui3OjmP{xz}_z_nAMMp5{;HO*7iOW8O76W|diG zE;DP)8Z+M13d{rvk}z|nL`a00CQ%Y)@+4MbO}@lSyeW_bNjB4^owPS4a)zXu>!g!( zF=f(CdYS7bP14NGk|CL9zVwq^^8?9~yUcTPkKAv*kcZ`QvjPSo@=J&<|4e%{5Of6G z91cbZLJ@{=L?9ATh(-)z5r=rRKnq{3NkCV0LwEE*Pn?Of&BvA9 z`l28DV*mzX5IUiy@BJY-7ugt!VK@&HaXyA)I7Z+CjKoNc!nv4;(YO#}a1qAhVqAht zk%P{@w-bFXKiUEa_Fwvt+7-myEf-9M~Lk3BFHu*aSl z*5H2@CIejwuC7(}_T-RSNa( z$+!Z*6!ZWv)XlSzHeH@CrPKQ>m0k&GzA6QpJ|`WQT4I6`jMiv_5clXu+Xl6;c}M{) zl_!GpFdP@y{}^0p1GoxPF&-0eHGp;ioNvnN_<0_Hd<;ebreio}U?vK24S;J=1fV@8 z0=OJgG1Y!$Vit-q5#PfYlmIxxC2lq*Syw8qLn$U=DvEIj?m!uSh##Wd@?pLHKiq*i zxE^zH1LoN~-^U%e2{&Ut{trLEE%=GO`xE>Sci@NkzI}cdfE#ctZo_T(5q^xH;CAcl zZp+7iiu-Us9>9Zm5D(eogLv5fe}1v;HUQfPq6?GVgVku&w=~!OWccJ;ZZjg z3$Or>*)Sf#gSZX%;!ZpcgCKbnQTRU?>rZn~>Cvk>C8$uGMp*32eHFD7k(~yTeOv6=} zgh^kEA*s%^Av;ypLs=d-X{(lZy1^j_lmNKPoD)Q?6^-hqbOrL9*+Mb+0eC|n@>i#F;I_s`a zmB#M(bv4@5`3EE4_aBGJjs8OrhERmty3r4r?*B5koHV@+;iOZLga{;Anoa~ttx~8m zHN|qK>6RyW`R1g{^QClpf2Go&^Lds6O`nsFa7#=yqA?zkh;fe&Vl206SPPqjQk0!A z|IGFM+F*)}tOKT4okp)F02pZRmg5Y2XAsUoDh4ADQ}8`>#1Jc8&b5BDOp-9g`pd=? zbhPEs+G<}a-xX6Z!`48c6Q*FY^`+=+zwI;9x)tXG=;B@tvuEYbD*MmF`M4az0W05u z3+(-y0L-*{2Ha34;%0Qid;r~1fGcq&df-fq!f5Nh5{AsN-R@-fbk4(C`$viEWnF{G9m&v_uINIa596cpMx=BCDk~oQx zbV(Bukn()O|3m%8dFaZ-W$<~dl#7Kn1NSyWtq?@Ek zx@1W|H?83?7>RJSLI-rgnMg-J48|}7Nq2RuE|?DG)hFdO{>hG9i*A zArMKHP}}Poj*%FPOE4an;|g3EkTZjjEd6aBWCY|wqO_KFzMMG6=0%jvjU;I!$o`GqXPtyNYpwdXW9B;5NznW1Q%dpU0Q8T zNtM3RN>Ze!WJ-w5*+^T~N6+0zh;))pwtWm2=Zj)Wi<1wqy&Ykp_Xf&F$N3x7$&neqF#fIth2yqjGaAauFqH~vD{i(fKLdaW$kjUbNXD%WcdMhDd zBZNfHTGf%gr+CwAgg^@+Wa!c@>$d*eo9lgqz&(V}-)~%Z{noKD!V$u6BZSyCUUk#u z&ph#++X>-sCh*p;H*HvVne#`#eUZS?Awo!T)20pU-0wR!6F7Q+5R%%oW!sImMd~F4 zj=n&M{a>!S=F)ZV-*EFNffEKH{IMb zxqjO&+b?e*l#dV+{Kp*|)?fbVb?5yfp^dK)LPSCc_Llr`%ROh~{d;FWhd1)W|5!1? za$JNEjSxZ!5TH8<5T2#*hZ7gT14JM^zn9MuLhiEe^m;;I4=Zt+pRG4tcRfP;KSU&B z3=9SYyVQPSEX83fIPSFqza|`eiVz7!?7sgYV+b&|_sm3l zWJ-JFi1$eRNcqUhBSS~F9x;wQaAf$%vqvgNesE;u$dRMusP|~>=&YmVqbrXN9o>4= zIQqcR;iJzUtsMQq(UGG^j*(;DWAS6COq zw&BkH8c#Mco3I=H+1XKxp@vNqb$#_D~7jtnR=!JX_{3jRujp>O&eEl+_Z4vrj2J@aY1!zQjc2!kOQL?UrQh?m6h7gRBs$bgtkq;%@_ z7gI4_^9NK3G~O`ZH}5mw2MMm@q=9@fWgh&}FYY%_9J=P3Lm)sDghSWd3>T!S1lNIN z6*i6hfDY&1JXzwJL*|M5fAJ;rV49)im?05?kTB^c%Lz&QM2VN&w2da(A)}}Dj8D~a z@odr8MccV#JRt_upcahs^Jun*D-}yUQ1V%mQ}E&RWHr%Tmg^H|zAi8YF%d+y&H+~?_O_bVI0JXi8m@EF^8^w!_!M@|=zQMshq0%=P<47uc zcvsu3*|TT0?K&JyRf()9d<*s4eKv=n$j@v$@RTq+oc8AC%ym8sOqYi{ouG2f^@ zX!z-BTk4X_?pyGSKea6_r&8smZGZa3f4otB#;W`Cq9KfsgoUGu7GU$17Q|#iFXT%K zqG>6u6th7^&_p9_K5{+;R3%{cn!TDo5TNIq4>xqed#@{9%Iol6CwG$;Ha~5;BstLJ zdh0D$Q$TdXyRg17khU*{Z@0FZbC%k1!64pPZQBuh?T~hY09;zYwSsUY6Q=`%zZSCQ z>O+Uj)sS5ZJK-kyHiN76^k7jHT6^GD^Nt?#C+3=Of17iRgPHvRC=o_OK-_L78A8%E z49WKhIR05&Xi&;yJSI2TcNG3(AKixlFPPl;C^f6zfOn~*OY|qdPpWH-GHus-~NUQIYhXl#2ld$&BgTGoq&}muz zi=bwm{<9&qXcI$3hP;&&kTRkoA4}=9koT90T2K=uHw08h0Tl9jrX5N>5Y+s*XIncs z(%Cx?o4+>y)%^A0osaKpyP`SfnX&%Lv-ceO!J$28U%7sUC)T`q#=gg^#=xe5flUL{ z_!O4hc^D#}`U>=IiMiWmToGIL>P?#t?K%7GJ%={k^y;$M6*Jo0u`T9{bXk?{;}ow* zO9@D)OxvSLdIDW6BuV=$^uZGck!E@tp-1!@&p#HA575 zvj3I+`(L5^y{@k*YI2Fg-uQs#a_^bh;gzMPU%CSjncey^hsW)_H6z(POZ<)Qf0Vsm z=kxA{mIV%b_(4sUrxw1??vY)$r&!^z=O1M+)v$&Au;rI7jYf*;?1iqdBYmI!s-Wkd zY{Vyj)f>3d?!2z(kX_EenuhG`MjDV=+4lB1XS-YuId#9|%KE~N9XXrZDm*Jf1MKXm z(X!S#K94LQ8!bAde%6I)STH@U_~Je_ihOGiKs=*o;-VxlOq(ERYP(Y|USj;M)(r8i zMv33e=CthgBPN~d*%&q49*!$>9(Q#JDzhYq`OglCyTh=D8Z>zC1dhrG36MzihjmQu`xiw|{hC)lJ)1abIQNd^VlWr$3A6 zMkr|@MBFHFL}BZnb#

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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