summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/buckets
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/buckets')
-rw-r--r--src/mbgl/renderer/buckets/circle_bucket.cpp6
-rw-r--r--src/mbgl/renderer/buckets/circle_bucket.hpp5
-rw-r--r--src/mbgl/renderer/buckets/fill_bucket.cpp25
-rw-r--r--src/mbgl/renderer/buckets/fill_bucket.hpp17
-rw-r--r--src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp30
-rw-r--r--src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp17
-rw-r--r--src/mbgl/renderer/buckets/heatmap_bucket.cpp6
-rw-r--r--src/mbgl/renderer/buckets/heatmap_bucket.hpp4
-rw-r--r--src/mbgl/renderer/buckets/line_bucket.cpp40
-rw-r--r--src/mbgl/renderer/buckets/line_bucket.hpp24
10 files changed, 127 insertions, 47 deletions
diff --git a/src/mbgl/renderer/buckets/circle_bucket.cpp b/src/mbgl/renderer/buckets/circle_bucket.cpp
index d07c1f8dbe..820cf9f525 100644
--- a/src/mbgl/renderer/buckets/circle_bucket.cpp
+++ b/src/mbgl/renderer/buckets/circle_bucket.cpp
@@ -39,7 +39,9 @@ bool CircleBucket::hasData() const {
}
void CircleBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry) {
+ const GeometryCollection& geometry,
+ const ImagePositions&,
+ const PatternLayerMap&) {
constexpr const uint16_t vertexLength = 4;
for (auto& circle : geometry) {
@@ -87,7 +89,7 @@ void CircleBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.vertexSize());
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), {}, {});
}
}
diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp
index 3c5f96fb15..db61a0c112 100644
--- a/src/mbgl/renderer/buckets/circle_bucket.hpp
+++ b/src/mbgl/renderer/buckets/circle_bucket.hpp
@@ -18,7 +18,10 @@ public:
CircleBucket(const BucketParameters&, const std::vector<const RenderLayer*>&);
void addFeature(const GeometryTileFeature&,
- const GeometryCollection&) override;
+ const GeometryCollection&,
+ const ImagePositions&,
+ const PatternLayerMap&) override;
+
bool hasData() const override;
void upload(gl::Context&) override;
diff --git a/src/mbgl/renderer/buckets/fill_bucket.cpp b/src/mbgl/renderer/buckets/fill_bucket.cpp
index 14be98c3af..3b1b7ec00f 100644
--- a/src/mbgl/renderer/buckets/fill_bucket.cpp
+++ b/src/mbgl/renderer/buckets/fill_bucket.cpp
@@ -27,20 +27,26 @@ using namespace style;
struct GeometryTooLongException : std::exception {};
-FillBucket::FillBucket(const BucketParameters& parameters, const std::vector<const RenderLayer*>& layers)
+FillBucket::FillBucket(const FillBucket::PossiblyEvaluatedLayoutProperties,
+ std::map<std::string, FillBucket::PossiblyEvaluatedPaintProperties> layerPaintProperties,
+ const float zoom,
+ const uint32_t)
: Bucket(LayerType::Fill) {
- for (const auto& layer : layers) {
+
+ for (const auto& pair : layerPaintProperties) {
paintPropertyBinders.emplace(
std::piecewise_construct,
- std::forward_as_tuple(layer->getID()),
+ std::forward_as_tuple(pair.first),
std::forward_as_tuple(
- layer->as<RenderFillLayer>()->evaluated,
- parameters.tileID.overscaledZ));
+ pair.second,
+ zoom));
}
}
void FillBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry) {
+ const GeometryCollection& geometry,
+ const ImagePositions& patternPositions,
+ const PatternLayerMap& patternDependencies) {
for (auto& polygon : classifyRings(geometry)) {
// Optimize polygons with many interior rings for earcut tesselation.
limitHoles(polygon, 500);
@@ -105,7 +111,12 @@ void FillBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.vertexSize());
+ const auto it = patternDependencies.find(pair.first);
+ if (it != patternDependencies.end()){
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, it->second);
+ } else {
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, {});
+ }
}
}
diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp
index 20b65da39c..47e273d4d2 100644
--- a/src/mbgl/renderer/buckets/fill_bucket.hpp
+++ b/src/mbgl/renderer/buckets/fill_bucket.hpp
@@ -13,13 +13,26 @@
namespace mbgl {
class BucketParameters;
+class RenderFillLayer;
class FillBucket : public Bucket {
public:
- FillBucket(const BucketParameters&, const std::vector<const RenderLayer*>&);
+
+ // These aliases are used by the PatternLayout template
+ using RenderLayerType = RenderFillLayer;
+ using PossiblyEvaluatedPaintProperties = style::FillPaintProperties::PossiblyEvaluated;
+ using PossiblyEvaluatedLayoutProperties = style::Properties<>::PossiblyEvaluated;
+
+ FillBucket(const PossiblyEvaluatedLayoutProperties layout,
+ std::map<std::string, PossiblyEvaluatedPaintProperties> layerPaintProperties,
+ const float zoom,
+ const uint32_t overscaling);
void addFeature(const GeometryTileFeature&,
- const GeometryCollection&) override;
+ const GeometryCollection&,
+ const mbgl::ImagePositions&,
+ const PatternLayerMap&) override;
+
bool hasData() const override;
void upload(gl::Context&) override;
diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
index c6dba38db1..fe742828b8 100644
--- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
+++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
@@ -34,19 +34,26 @@ using namespace style;
struct GeometryTooLongException : std::exception {};
-FillExtrusionBucket::FillExtrusionBucket(const BucketParameters& parameters, const std::vector<const RenderLayer*>& layers)
+FillExtrusionBucket::FillExtrusionBucket(const FillExtrusionBucket::PossiblyEvaluatedLayoutProperties,
+ std::map<std::string, FillExtrusionBucket::PossiblyEvaluatedPaintProperties> layerPaintProperties,
+ const float zoom,
+ const uint32_t)
: Bucket(LayerType::FillExtrusion) {
- for (const auto& layer : layers) {
- paintPropertyBinders.emplace(std::piecewise_construct,
- std::forward_as_tuple(layer->getID()),
- std::forward_as_tuple(
- layer->as<RenderFillExtrusionLayer>()->evaluated,
- parameters.tileID.overscaledZ));
+
+ for (const auto& pair : layerPaintProperties) {
+ paintPropertyBinders.emplace(
+ std::piecewise_construct,
+ std::forward_as_tuple(pair.first),
+ std::forward_as_tuple(
+ pair.second,
+ zoom));
}
}
void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry) {
+ const GeometryCollection& geometry,
+ const ImagePositions& patternPositions,
+ const PatternLayerMap& patternDependencies) {
for (auto& polygon : classifyRings(geometry)) {
// Optimize polygons with many interior rings for earcut tesselation.
limitHoles(polygon, 500);
@@ -143,7 +150,12 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.vertexSize());
+ const auto it = patternDependencies.find(pair.first);
+ if (it != patternDependencies.end()){
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, it->second);
+ } else {
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, {});
+ }
}
}
diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
index ed98e01292..362a9f4c99 100644
--- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
+++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
@@ -11,13 +11,26 @@
namespace mbgl {
class BucketParameters;
+class RenderFillExtrusionLayer;
class FillExtrusionBucket : public Bucket {
public:
- FillExtrusionBucket(const BucketParameters&, const std::vector<const RenderLayer*>&);
+
+ // These aliases are used by the PatternLayout template
+ using RenderLayerType = RenderFillExtrusionLayer;
+ using PossiblyEvaluatedPaintProperties = style::FillExtrusionPaintProperties::PossiblyEvaluated;
+ using PossiblyEvaluatedLayoutProperties = style::Properties<>::PossiblyEvaluated;
+
+ FillExtrusionBucket(const PossiblyEvaluatedLayoutProperties,
+ std::map<std::string, PossiblyEvaluatedPaintProperties>,
+ const float,
+ const uint32_t);
void addFeature(const GeometryTileFeature&,
- const GeometryCollection&) override;
+ const GeometryCollection&,
+ const mbgl::ImagePositions&,
+ const PatternLayerMap&) override;
+
bool hasData() const override;
void upload(gl::Context&) override;
diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.cpp b/src/mbgl/renderer/buckets/heatmap_bucket.cpp
index eff0c60280..46d5f31599 100644
--- a/src/mbgl/renderer/buckets/heatmap_bucket.cpp
+++ b/src/mbgl/renderer/buckets/heatmap_bucket.cpp
@@ -39,7 +39,9 @@ bool HeatmapBucket::hasData() const {
}
void HeatmapBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry) {
+ const GeometryCollection& geometry,
+ const ImagePositions&,
+ const PatternLayerMap&) {
constexpr const uint16_t vertexLength = 4;
for (auto& points : geometry) {
@@ -87,7 +89,7 @@ void HeatmapBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.vertexSize());
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), {}, {});
}
}
diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp
index 86b6f10296..b2d866d2a2 100644
--- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp
+++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp
@@ -18,7 +18,9 @@ public:
HeatmapBucket(const BucketParameters&, const std::vector<const RenderLayer*>&);
void addFeature(const GeometryTileFeature&,
- const GeometryCollection&) override;
+ const GeometryCollection&,
+ const ImagePositions&,
+ const PatternLayerMap&) override;
bool hasData() const override;
void upload(gl::Context&) override;
diff --git a/src/mbgl/renderer/buckets/line_bucket.cpp b/src/mbgl/renderer/buckets/line_bucket.cpp
index 80149edafe..2efb60c9ac 100644
--- a/src/mbgl/renderer/buckets/line_bucket.cpp
+++ b/src/mbgl/renderer/buckets/line_bucket.cpp
@@ -1,5 +1,4 @@
#include <mbgl/renderer/buckets/line_bucket.hpp>
-#include <mbgl/renderer/layers/render_line_layer.hpp>
#include <mbgl/renderer/bucket_parameters.hpp>
#include <mbgl/style/layers/line_layer_impl.hpp>
#include <mbgl/util/math.hpp>
@@ -11,34 +10,45 @@ namespace mbgl {
using namespace style;
-LineBucket::LineBucket(const BucketParameters& parameters,
- const std::vector<const RenderLayer*>& layers,
- const style::LineLayoutProperties::Unevaluated& layout_)
+LineBucket::LineBucket(const style::LineLayoutProperties::PossiblyEvaluated layout_,
+ std::map<std::string, RenderLinePaintProperties::PossiblyEvaluated> layerPaintProperties,
+ const float zoom_,
+ const uint32_t overscaling_)
: Bucket(LayerType::Line),
- layout(layout_.evaluate(PropertyEvaluationParameters(parameters.tileID.overscaledZ))),
- overscaling(parameters.tileID.overscaleFactor()),
- zoom(parameters.tileID.overscaledZ) {
- for (const auto& layer : layers) {
+ layout(layout_),
+ zoom(zoom_),
+ overscaling(overscaling_) {
+
+ for (const auto& pair : layerPaintProperties) {
paintPropertyBinders.emplace(
std::piecewise_construct,
- std::forward_as_tuple(layer->getID()),
+ std::forward_as_tuple(pair.first),
std::forward_as_tuple(
- layer->as<RenderLineLayer>()->evaluated,
- parameters.tileID.overscaledZ));
+ pair.second,
+ zoom));
}
}
+
void LineBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometryCollection) {
+ const GeometryCollection& geometryCollection,
+ const ImagePositions& patternPositions,
+ const PatternLayerMap& patternDependencies) {
for (auto& line : geometryCollection) {
addGeometry(line, feature);
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.vertexSize());
+ const auto it = patternDependencies.find(pair.first);
+ if (it != patternDependencies.end()){
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, it->second);
+ } else {
+ pair.second.populateVertexVectors(feature, vertices.vertexSize(), patternPositions, {});
+ }
}
}
+
/*
* Sharp corners cause dashed lines to tilt because the distance along the line
* is the same at both the inner and outer corners. To improve the appearance of
@@ -130,7 +140,9 @@ void LineBucket::addGeometry(const GeometryCoordinates& coordinates, const Geome
const float miterLimit = joinType == LineJoinType::Bevel ? 1.05f : float(layout.get<LineMiterLimit>());
- const double sharpCornerOffset = SHARP_CORNER_OFFSET * (float(util::EXTENT) / (util::tileSize * overscaling));
+ const double sharpCornerOffset = overscaling == 0 ?
+ SHARP_CORNER_OFFSET * (float(util::EXTENT) / util::tileSize) :
+ SHARP_CORNER_OFFSET * (float(util::EXTENT) / (util::tileSize * overscaling));
const GeometryCoordinate firstCoordinate = coordinates[first];
const LineCapType beginCap = layout.get<LineCap>();
diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp
index 23d30ca416..6bd37076de 100644
--- a/src/mbgl/renderer/buckets/line_bucket.hpp
+++ b/src/mbgl/renderer/buckets/line_bucket.hpp
@@ -1,5 +1,4 @@
#pragma once
-
#include <mbgl/renderer/bucket.hpp>
#include <mbgl/tile/geometry_tile_data.hpp>
#include <mbgl/gl/vertex_buffer.hpp>
@@ -7,6 +6,7 @@
#include <mbgl/programs/segment.hpp>
#include <mbgl/programs/line_program.hpp>
#include <mbgl/style/layers/line_layer_properties.hpp>
+#include <mbgl/style/image_impl.hpp>
#include <vector>
@@ -17,19 +17,29 @@ class RenderLineLayer;
class LineBucket : public Bucket {
public:
- LineBucket(const BucketParameters&,
- const std::vector<const RenderLayer*>&,
- const style::LineLayoutProperties::Unevaluated&);
+
+ // These aliases are used by the PatternLayout template
+ using RenderLayerType = RenderLineLayer;
+ using PossiblyEvaluatedPaintProperties = RenderLinePaintProperties::PossiblyEvaluated;
+ using PossiblyEvaluatedLayoutProperties = style::LineLayoutProperties::PossiblyEvaluated;
+
+ LineBucket(const PossiblyEvaluatedLayoutProperties layout,
+ std::map<std::string, PossiblyEvaluatedPaintProperties> layerPaintProperties,
+ const float zoom,
+ const uint32_t overscaling);
void addFeature(const GeometryTileFeature&,
- const GeometryCollection&) override;
+ const GeometryCollection&,
+ const mbgl::ImagePositions& patternPositions,
+ const PatternLayerMap&) override;
+
bool hasData() const override;
void upload(gl::Context&) override;
float getQueryRadius(const RenderLayer&) const override;
- style::LineLayoutProperties::PossiblyEvaluated layout;
+ PossiblyEvaluatedLayoutProperties layout;
gl::VertexVector<LineLayoutVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
@@ -63,8 +73,8 @@ private:
std::ptrdiff_t e2;
std::ptrdiff_t e3;
- const uint32_t overscaling;
const float zoom;
+ const uint32_t overscaling;
float getLineWidth(const RenderLineLayer& layer) const;
};