diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-08-02 16:32:54 -0700 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-08-27 13:13:47 -0700 |
commit | 6182f4d48a99a8c9699d47aeea214db7ec462ee0 (patch) | |
tree | cf006b4d7fbce9b21c45d4095f2388f705657aa9 | |
parent | 87f1a26656437f70ddb02cb1c5513d1547314981 (diff) | |
download | qtlocation-mapboxgl-6182f4d48a99a8c9699d47aeea214db7ec462ee0.tar.gz |
[core] add CrossfadeParameters and dynamically bind pattern vertex buffers
-rw-r--r-- | src/mbgl/programs/line_program.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/programs/line_program.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/image_atlas.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_property_binder.hpp | 37 | ||||
-rw-r--r-- | src/mbgl/renderer/property_evaluation_parameters.hpp | 19 |
7 files changed, 57 insertions, 30 deletions
diff --git a/src/mbgl/programs/line_program.cpp b/src/mbgl/programs/line_program.cpp index 205f615264..1771cf8b03 100644 --- a/src/mbgl/programs/line_program.cpp +++ b/src/mbgl/programs/line_program.cpp @@ -87,13 +87,9 @@ LinePatternProgram::uniformValues(const RenderLinePaintProperties::PossiblyEvalu const TransformState& state, const std::array<float, 2>& pixelsToGLUnits, const Size atlasSize, - const Faded<std::string> pattern, + const CrossfadeParameters crossfade, const float pixelRatio) { - const auto linepattern = properties.get<LinePattern>(); - // TODO get real crossfade values - const auto linePatternValue = linepattern.constantOr(mbgl::Faded<std::basic_string<char> >{ "", "", 1.0f, 2.0f, 1.0f}); - const auto tileRatio = 1 / tile.id.pixelsToTileUnits(1, state.getIntegerZoom()); return makeValues<LinePatternProgram::UniformValues>( @@ -101,9 +97,9 @@ LinePatternProgram::uniformValues(const RenderLinePaintProperties::PossiblyEvalu tile, state, pixelsToGLUnits, - uniforms::u_scale::Value{ {{ pixelRatio, tileRatio, pattern.fromScale, pattern.toScale}} }, + uniforms::u_scale::Value{ {{ pixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale}} }, uniforms::u_texsize::Value{ atlasSize }, - uniforms::u_fade::Value{ linePatternValue.t }, + uniforms::u_fade::Value{ crossfade.t }, uniforms::u_image::Value{ 0 } ); } diff --git a/src/mbgl/programs/line_program.hpp b/src/mbgl/programs/line_program.hpp index f6fe5c09c8..9707778f26 100644 --- a/src/mbgl/programs/line_program.hpp +++ b/src/mbgl/programs/line_program.hpp @@ -121,7 +121,7 @@ public: const TransformState&, const std::array<float, 2>& pixelsToGLUnits, Size atlasSize, - const Faded<std::string> pattern, + const CrossfadeParameters crossfade, const float pixelRatio); }; diff --git a/src/mbgl/renderer/image_atlas.hpp b/src/mbgl/renderer/image_atlas.hpp index 56c47e19a0..3af31a75f8 100644 --- a/src/mbgl/renderer/image_atlas.hpp +++ b/src/mbgl/renderer/image_atlas.hpp @@ -30,6 +30,12 @@ public: }}; } + std::array<uint16_t, 4> tlbr() const { + const auto _tl = tl(); + const auto _br = br(); + return {{ _tl[0], _tl[1], _br[0], _br[1] }}; + } + std::array<float, 2> displaySize() const { return {{ textureRect.w / pixelRatio, diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 1ba94f6eef..aa84edfcb5 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -56,6 +56,8 @@ void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) { evaluated = RenderLinePaintProperties::PossiblyEvaluated( unevaluated.evaluate(parameters).concat(extra.evaluate(dashArrayParams))); + crossfade = parameters.getCrossfadeParameters(); + passes = (evaluated.get<style::LineOpacity>().constantOr(1.0) > 0 && evaluated.get<style::LineColor>().constantOr(Color::black()).a > 0 && evaluated.get<style::LineWidth>().constantOr(1.0) > 0) @@ -83,7 +85,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - paintPropertyBinders.setConstantPatternPositions(patternPositionA, patternPositionB); + paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade); const auto allUniformValues = programInstance.computeAllUniformValues( std::move(uniformValues), @@ -114,8 +116,9 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { }; const auto linepattern = evaluated.get<LinePattern>(); // TODO get real crossfade parameters - // need a placeholder value that will trigger line pattern program if the line-pattern value is non-constant - const auto linePatternValue = linepattern.constantOr(mbgl::Faded<std::basic_string<char> >{ "temp", "temp", 0.5f, 1.0f, 1.0f}); + // need a non-empty placeholder value that will result in the LinePattern program to be + // used if the line-pattern value is non-constant + const auto linePatternValue = linepattern.constantOr(mbgl::Faded<std::basic_string<char> >{ "temp", "temp", 0.0f, 0.0f, 0.0f}); if (!evaluated.get<LineDasharray>().from.empty()) { const LinePatternCap cap = bucket.layout.get<LineCap>() == LineCapType::Round @@ -152,7 +155,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { parameters.state, parameters.pixelsToGLUnits, texsize, - linePatternValue, + crossfade, parameters.pixelRatio), *posA, *posB)); diff --git a/src/mbgl/renderer/layers/render_line_layer.hpp b/src/mbgl/renderer/layers/render_line_layer.hpp index 7694466e41..e02e7e6b03 100644 --- a/src/mbgl/renderer/layers/render_line_layer.hpp +++ b/src/mbgl/renderer/layers/render_line_layer.hpp @@ -5,7 +5,6 @@ #include <mbgl/style/layers/line_layer_properties.hpp> #include <mbgl/programs/uniforms.hpp> #include <mbgl/style/image_impl.hpp> -#include <mbgl/style/image_impl.hpp> namespace mbgl { @@ -54,6 +53,7 @@ public: private: float getLineWidth(const GeometryTileFeature&, const float) const; + CrossfadeParameters crossfade; PremultipliedImage colorRamp; optional<gl::Texture> colorRampTexture; }; diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 96b1f14d3e..cf3f9716df 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -84,7 +84,7 @@ public: virtual void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&) = 0; virtual void upload(gl::Context& context) = 0; - virtual void setConstantPatternPositions(const optional<ImagePosition>&, const optional<ImagePosition>&) = 0; + virtual void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, CrossfadeParameters&) = 0; virtual std::tuple<ExpandToType<As, optional<gl::AttributeBinding>>...> attributeBinding(const PossiblyEvaluatedType& currentValue) const = 0; virtual std::tuple<ExpandToType<As, float>...> interpolationFactor(float currentZoom) const = 0; virtual std::tuple<ExpandToType<As, UniformValueType>...> uniformValue(const PossiblyEvaluatedType& currentValue) const = 0; @@ -103,7 +103,7 @@ public: void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&) override {} void upload(gl::Context&) override {} - void setConstantPatternPositions(const optional<ImagePosition>&, const optional<ImagePosition>&) override {}; + void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, CrossfadeParameters&) override {}; std::tuple<optional<gl::AttributeBinding>> attributeBinding(const PossiblyEvaluatedPropertyValue<T>&) const override { return std::tuple<optional<gl::AttributeBinding>> {}; @@ -131,11 +131,11 @@ public: void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&) override {} void upload(gl::Context&) override {} - void setConstantPatternPositions(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB) override { + void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, CrossfadeParameters&) override { if (!posA && !posB) { return; } else { - constantPatternPositions = std::tuple<std::array<uint16_t, 4>, std::array<uint16_t, 4>> { {{posB->tl()[0], posB->tl()[1], posB->br()[0], posB->br()[1]}}, {{posA->tl()[0], posA->tl()[1], posA->br()[0], posA->br()[1]}} }; + constantPatternPositions = std::tuple<std::array<uint16_t, 4>, std::array<uint16_t, 4>> { posB->tlbr(), posA->tlbr() }; } } @@ -168,7 +168,7 @@ public: : expression(std::move(expression_)), defaultValue(std::move(defaultValue_)) { } - void setConstantPatternPositions(const optional<ImagePosition>&, const optional<ImagePosition>&) override {}; + void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, CrossfadeParameters&) override {}; void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&) override { auto evaluated = expression.evaluate(feature, defaultValue); this->statistics.add(evaluated); @@ -223,7 +223,7 @@ public: defaultValue(std::move(defaultValue_)), zoomRange({zoom, zoom + 1}) { } - void setConstantPatternPositions(const optional<ImagePosition>&, const optional<ImagePosition>&) override {}; + void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, CrossfadeParameters&) override {}; void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&) override { Range<T> range = expression.evaluate(zoomRange, feature, defaultValue); this->statistics.add(range.min); @@ -295,7 +295,9 @@ public: zoomRange({zoom, zoom + 1}) { } - void setConstantPatternPositions(const optional<ImagePosition>&, const optional<ImagePosition>&) override {}; + void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, CrossfadeParameters& crossfade_) override { + crossfade = crossfade_; + }; void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions& patternPositions) override { std::array<T, 3> range; @@ -318,14 +320,10 @@ public: const ImagePosition imageMid = mid->second; const ImagePosition imageMax = max->second; - const BaseAttributeValue patternTo = {{ imageMid.tl()[0], imageMid.tl()[1], imageMid.br()[0], imageMid.br()[1] }}; - const BaseAttributeValue2 patternFromZoomIn = {{ imageMin.tl()[0], imageMin.tl()[1], imageMin.br()[0], imageMin.br()[1] }}; - const BaseAttributeValue2 patternFromZoomOut = {{ imageMax.tl()[0], imageMax.tl()[1], imageMax.br()[0], imageMax.br()[1] }}; - for (std::size_t i = zoomInVertexVector.vertexSize(); i < length; ++i) { - patternToVertexVector.emplace_back(Vertex { patternTo }); - zoomInVertexVector.emplace_back(Vertex2 { patternFromZoomIn }); - zoomOutVertexVector.emplace_back(Vertex2 { patternFromZoomOut }); + patternToVertexVector.emplace_back(Vertex { imageMid.tlbr() }); + zoomInVertexVector.emplace_back(Vertex2 { imageMin.tlbr() }); + zoomOutVertexVector.emplace_back(Vertex2 { imageMax.tlbr() }); } } } @@ -340,7 +338,11 @@ public: if (currentValue.isConstant()) { return {}; } else { - return std::tuple<optional<gl::AttributeBinding>, optional<gl::AttributeBinding>> { AttributeType::binding(*patternToVertexBuffer, 0, BaseAttribute::Dimensions), AttributeType2::binding(*zoomInVertexBuffer, 0, BaseAttribute2::Dimensions) }; + return std::tuple<optional<gl::AttributeBinding>, optional<gl::AttributeBinding>> { + AttributeType::binding(*patternToVertexBuffer, 0, BaseAttribute::Dimensions), + AttributeType2::binding( + crossfade.fromScale == 2 ? *zoomInVertexBuffer : *zoomOutVertexBuffer, + 0, BaseAttribute2::Dimensions) }; } } @@ -363,6 +365,7 @@ private: optional<gl::VertexBuffer<Vertex>> patternToVertexBuffer; optional<gl::VertexBuffer<Vertex2>> zoomInVertexBuffer; optional<gl::VertexBuffer<Vertex2>> zoomOutVertexBuffer; + CrossfadeParameters crossfade; }; template <class T, class PossiblyEvaluatedType> @@ -461,9 +464,9 @@ public: }); } - void setConstantPatternPositions(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB) const { + void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, CrossfadeParameters& crossfade) const { util::ignore({ - (binders.template get<Ps>()->setConstantPatternPositions(posA, posB), 0)... + (binders.template get<Ps>()->setPatternParameters(posA, posB, crossfade), 0)... }); } diff --git a/src/mbgl/renderer/property_evaluation_parameters.hpp b/src/mbgl/renderer/property_evaluation_parameters.hpp index da6a4a0892..0e1c317294 100644 --- a/src/mbgl/renderer/property_evaluation_parameters.hpp +++ b/src/mbgl/renderer/property_evaluation_parameters.hpp @@ -5,6 +5,13 @@ namespace mbgl { +class CrossfadeParameters { +public: + float fromScale; + float toScale; + float t; +}; + class PropertyEvaluationParameters { public: explicit PropertyEvaluationParameters(float z_) @@ -24,6 +31,18 @@ public: defaultFadeDuration(std::move(defaultFadeDuration_)), useIntegerZoom(useIntegerZoom_) {} + CrossfadeParameters getCrossfadeParameters() const { + const float fraction = z - std::floor(z); + const std::chrono::duration<float> d = defaultFadeDuration; + const float t = d != std::chrono::duration<float>::zero() + ? std::min((now - zoomHistory.lastIntegerZoomTime) / d, 1.0f) + : 1.0f; + + return z > zoomHistory.lastIntegerZoom + ? CrossfadeParameters { 2.0f, 1.0f, fraction + (1.0f - fraction) * t } + : CrossfadeParameters { 0.5f, 1.0f, 1 - (1 - t) * fraction }; + } + float z; TimePoint now; ZoomHistory zoomHistory; |