diff options
Diffstat (limited to 'src/mbgl/style/layers')
-rw-r--r-- | src/mbgl/style/layers/circle_layer.cpp | 34 | ||||
-rw-r--r-- | src/mbgl/style/layers/circle_layer_impl.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/layers/circle_layer_impl.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/style/layers/circle_layer_properties.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/style/layers/layer.cpp.ejs | 5 |
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') |