summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-08-02 16:32:54 -0700
committerMolly Lloyd <molly@mapbox.com>2018-08-27 13:13:47 -0700
commit6182f4d48a99a8c9699d47aeea214db7ec462ee0 (patch)
treecf006b4d7fbce9b21c45d4095f2388f705657aa9
parent87f1a26656437f70ddb02cb1c5513d1547314981 (diff)
downloadqtlocation-mapboxgl-6182f4d48a99a8c9699d47aeea214db7ec462ee0.tar.gz
[core] add CrossfadeParameters and dynamically bind pattern vertex buffers
-rw-r--r--src/mbgl/programs/line_program.cpp10
-rw-r--r--src/mbgl/programs/line_program.hpp2
-rw-r--r--src/mbgl/renderer/image_atlas.hpp6
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp11
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.hpp2
-rw-r--r--src/mbgl/renderer/paint_property_binder.hpp37
-rw-r--r--src/mbgl/renderer/property_evaluation_parameters.hpp19
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;