summaryrefslogtreecommitdiff
path: root/src/mbgl/style/layers
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/layers')
-rw-r--r--src/mbgl/style/layers/circle_layer.cpp34
-rw-r--r--src/mbgl/style/layers/circle_layer_impl.cpp3
-rw-r--r--src/mbgl/style/layers/circle_layer_impl.hpp1
-rw-r--r--src/mbgl/style/layers/circle_layer_properties.hpp9
-rw-r--r--src/mbgl/style/layers/layer.cpp.ejs5
5 files changed, 45 insertions, 7 deletions
diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp
index ad34ba8223..bf415ea42d 100644
--- a/src/mbgl/style/layers/circle_layer.cpp
+++ b/src/mbgl/style/layers/circle_layer.cpp
@@ -24,7 +24,7 @@ const LayerTypeInfo* CircleLayer::Impl::staticTypeInfo() noexcept {
const static LayerTypeInfo typeInfo{"circle",
LayerTypeInfo::Source::Required,
LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::Layout::Required,
LayerTypeInfo::FadingTiles::NotRequired,
LayerTypeInfo::CrossTileIndex::NotRequired,
LayerTypeInfo::TileKind::Geometry};
@@ -57,11 +57,27 @@ std::unique_ptr<Layer> CircleLayer::cloneRef(const std::string& id_) const {
return std::make_unique<CircleLayer>(std::move(impl_));
}
-void CircleLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const {
+void CircleLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>& writer) const {
+ layout.stringify(writer);
}
// Layout properties
+PropertyValue<float> CircleLayer::getDefaultCircleSortKey() {
+ return CircleSortKey::defaultValue();
+}
+
+const PropertyValue<float>& CircleLayer::getCircleSortKey() const {
+ return impl().layout.get<CircleSortKey>();
+}
+
+void CircleLayer::setCircleSortKey(const PropertyValue<float>& value) {
+ if (value == getCircleSortKey()) return;
+ auto impl_ = mutableImpl();
+ impl_->layout.get<CircleSortKey>() = value;
+ baseImpl = std::move(impl_);
+ observer->onLayerChanged(*this);
+}
// Paint properties
@@ -391,6 +407,7 @@ enum class Property : uint8_t {
CircleStrokeWidthTransition,
CircleTranslateTransition,
CircleTranslateAnchorTransition,
+ CircleSortKey = kPaintPropertyCount,
};
template <typename T>
@@ -420,7 +437,8 @@ MAPBOX_ETERNAL_CONSTEXPR const auto layerProperties = mapbox::eternal::hash_map<
{"circle-stroke-opacity-transition", toUint8(Property::CircleStrokeOpacityTransition)},
{"circle-stroke-width-transition", toUint8(Property::CircleStrokeWidthTransition)},
{"circle-translate-transition", toUint8(Property::CircleTranslateTransition)},
- {"circle-translate-anchor-transition", toUint8(Property::CircleTranslateAnchorTransition)}});
+ {"circle-translate-anchor-transition", toUint8(Property::CircleTranslateAnchorTransition)},
+ {"circle-sort-key", toUint8(Property::CircleSortKey)}});
StyleProperty getLayerProperty(const CircleLayer& layer, Property property) {
switch (property) {
@@ -468,6 +486,8 @@ StyleProperty getLayerProperty(const CircleLayer& layer, Property property) {
return makeStyleProperty(layer.getCircleTranslateTransition());
case Property::CircleTranslateAnchorTransition:
return makeStyleProperty(layer.getCircleTranslateAnchorTransition());
+ case Property::CircleSortKey:
+ return makeStyleProperty(layer.getCircleSortKey());
}
return {};
}
@@ -500,7 +520,8 @@ optional<Error> CircleLayer::setPropertyInternal(const std::string& name, const
auto property = static_cast<Property>(it->second);
if (property == Property::CircleBlur || property == Property::CircleOpacity || property == Property::CircleRadius ||
- property == Property::CircleStrokeOpacity || property == Property::CircleStrokeWidth) {
+ property == Property::CircleStrokeOpacity || property == Property::CircleStrokeWidth ||
+ property == Property::CircleSortKey) {
Error error;
const auto& typedValue = convert<PropertyValue<float>>(value, error, true, false);
if (!typedValue) {
@@ -531,6 +552,11 @@ optional<Error> CircleLayer::setPropertyInternal(const std::string& name, const
setCircleStrokeWidth(*typedValue);
return nullopt;
}
+
+ if (property == Property::CircleSortKey) {
+ setCircleSortKey(*typedValue);
+ return nullopt;
+ }
}
if (property == Property::CircleColor || property == Property::CircleStrokeColor) {
Error error;
diff --git a/src/mbgl/style/layers/circle_layer_impl.cpp b/src/mbgl/style/layers/circle_layer_impl.cpp
index bf0688ac8b..d40cc4bf9a 100644
--- a/src/mbgl/style/layers/circle_layer_impl.cpp
+++ b/src/mbgl/style/layers/circle_layer_impl.cpp
@@ -6,8 +6,7 @@ namespace style {
bool CircleLayer::Impl::hasLayoutDifference(const Layer::Impl& other) const {
assert(other.getTypeInfo() == getTypeInfo());
const auto& impl = static_cast<const style::CircleLayer::Impl&>(other);
- return filter != impl.filter ||
- visibility != impl.visibility ||
+ return filter != impl.filter || visibility != impl.visibility || layout != impl.layout ||
paint.hasDataDrivenPropertyDifference(impl.paint);
}
diff --git a/src/mbgl/style/layers/circle_layer_impl.hpp b/src/mbgl/style/layers/circle_layer_impl.hpp
index 9b3ce48706..4826e58a63 100644
--- a/src/mbgl/style/layers/circle_layer_impl.hpp
+++ b/src/mbgl/style/layers/circle_layer_impl.hpp
@@ -14,6 +14,7 @@ public:
bool hasLayoutDifference(const Layer::Impl&) const override;
void stringifyLayout(rapidjson::Writer<rapidjson::StringBuffer>&) const override;
+ CircleLayoutProperties::Unevaluated layout;
CirclePaintProperties::Transitionable paint;
DECLARE_LAYER_TYPE_INFO;
diff --git a/src/mbgl/style/layers/circle_layer_properties.hpp b/src/mbgl/style/layers/circle_layer_properties.hpp
index 5204421d0b..c8ec81eed5 100644
--- a/src/mbgl/style/layers/circle_layer_properties.hpp
+++ b/src/mbgl/style/layers/circle_layer_properties.hpp
@@ -16,6 +16,11 @@
namespace mbgl {
namespace style {
+struct CircleSortKey : DataDrivenLayoutProperty<float> {
+ static constexpr const char *name() { return "circle-sort-key"; }
+ static float defaultValue() { return 0; }
+};
+
struct CircleBlur : DataDrivenPaintProperty<float, attributes::blur, uniforms::blur> {
static float defaultValue() { return 0; }
};
@@ -60,6 +65,10 @@ struct CircleTranslateAnchor : PaintProperty<TranslateAnchorType> {
static TranslateAnchorType defaultValue() { return TranslateAnchorType::Map; }
};
+class CircleLayoutProperties : public Properties<
+ CircleSortKey
+> {};
+
class CirclePaintProperties : public Properties<
CircleBlur,
CircleColor,
diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs
index fd5bf619f7..8fd4b1fef0 100644
--- a/src/mbgl/style/layers/layer.cpp.ejs
+++ b/src/mbgl/style/layers/layer.cpp.ejs
@@ -73,7 +73,10 @@ layerCapabilities['symbol'] = defaults.require('Source')
.require('CrossTileIndex')
.set('TileKind', 'Geometry')
.finalize();
-layerCapabilities['circle'] = defaults.require('Source').set('TileKind', 'Geometry').finalize();
+layerCapabilities['circle'] = defaults.require('Source')
+ .require('Layout')
+ .set('TileKind', 'Geometry')
+ .finalize();
layerCapabilities['line'] = layerCapabilities['fill'];
layerCapabilities['heatmap'] = defaults.require('Source')
.require('Pass3D')