summaryrefslogtreecommitdiff
path: root/src/mbgl/layer/circle_layer_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/layer/circle_layer_impl.cpp')
-rw-r--r--src/mbgl/layer/circle_layer_impl.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/mbgl/layer/circle_layer_impl.cpp b/src/mbgl/layer/circle_layer_impl.cpp
new file mode 100644
index 0000000000..b1ba778cd6
--- /dev/null
+++ b/src/mbgl/layer/circle_layer_impl.cpp
@@ -0,0 +1,60 @@
+#include <mbgl/layer/circle_layer_impl.hpp>
+#include <mbgl/style/style_bucket_parameters.hpp>
+#include <mbgl/renderer/circle_bucket.hpp>
+#include <mbgl/geometry/feature_index.hpp>
+#include <mbgl/util/math.hpp>
+#include <mbgl/util/intersection_tests.hpp>
+
+namespace mbgl {
+
+void CircleLayer::Impl::parsePaints(const JSValue& layer) {
+ paint.parse(layer);
+}
+
+void CircleLayer::Impl::cascade(const StyleCascadeParameters& parameters) {
+ paint.cascade(parameters);
+}
+
+bool CircleLayer::Impl::recalculate(const StyleCalculationParameters& parameters) {
+ bool hasTransitions = paint.recalculate(parameters);
+
+ passes = (paint.circleRadius > 0 && paint.circleColor.value[3] > 0 && paint.circleOpacity > 0)
+ ? RenderPass::Translucent : RenderPass::None;
+
+ return hasTransitions;
+}
+
+std::unique_ptr<Bucket> CircleLayer::Impl::createBucket(StyleBucketParameters& parameters) const {
+ auto bucket = std::make_unique<CircleBucket>(parameters.mode);
+
+ auto& name = bucketName();
+ parameters.eachFilteredFeature(filter, [&] (const auto& feature, std::size_t index, const std::string& layerName) {
+ auto geometries = feature.getGeometries();
+ bucket->addGeometry(geometries);
+ parameters.featureIndex.insert(geometries, index, layerName, name);
+ });
+
+ return std::move(bucket);
+}
+
+float CircleLayer::Impl::getQueryRadius() const {
+ const std::array<float, 2>& translate = paint.circleTranslate;
+ return paint.circleRadius + util::length(translate[0], translate[1]);
+}
+
+bool CircleLayer::Impl::queryIntersectsGeometry(
+ const GeometryCollection& queryGeometry,
+ const GeometryCollection& geometry,
+ const float bearing,
+ const float pixelsToTileUnits) const {
+
+ auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
+ queryGeometry, paint.circleTranslate, paint.circleTranslateAnchor, bearing, pixelsToTileUnits);
+
+ auto circleRadius = paint.circleRadius * pixelsToTileUnits;
+
+ return util::multiPolygonIntersectsBufferedMultiPoint(
+ translatedQueryGeometry.value_or(queryGeometry), geometry, circleRadius);
+}
+
+} // namespace mbgl