diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-04-06 15:53:13 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-04-06 15:53:13 +0300 |
commit | 3911ef6a0f4a47343429482e0e37a90e5b2fd606 (patch) | |
tree | eebbf194de400d82567aa56ecfcda9217a419b7b | |
parent | 4e136b2743511210d14dd1ff7f56f1742eb4f339 (diff) | |
download | qtlocation-mapboxgl-3911ef6a0f4a47343429482e0e37a90e5b2fd606.tar.gz |
Interpolate rotation
22 files changed, 149 insertions, 62 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b66269784..2617a913f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,6 +150,7 @@ set( ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/light.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/position.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/property_value.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/rotation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/tileset.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/transition_options.hpp @@ -207,6 +208,7 @@ set( ${PROJECT_SOURCE_DIR}/include/mbgl/style/position.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/property_expression.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/property_value.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/rotation.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/custom_geometry_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/geojson_source.hpp @@ -538,6 +540,7 @@ set( ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/light.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/position.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/property_value.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/rotation.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/stringify.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/tileset.cpp diff --git a/include/mbgl/style/conversion_impl.hpp b/include/mbgl/style/conversion_impl.hpp index 79e9301842..58d087a07f 100644 --- a/include/mbgl/style/conversion_impl.hpp +++ b/include/mbgl/style/conversion_impl.hpp @@ -5,6 +5,7 @@ #include <mbgl/style/expression/image.hpp> #include <mbgl/style/layer.hpp> #include <mbgl/style/property_value.hpp> +#include <mbgl/style/rotation.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/util/feature.hpp> #include <mbgl/util/geojson.hpp> @@ -343,6 +344,13 @@ struct ValueFactory<Position> { } }; +template <> +struct ValueFactory<Rotation> { + static Value make(const Rotation& rotation) { + return {rotation.getAngle()}; + } +}; + template <typename T> Value makeValue(T&& arg) { return ValueFactory<std::decay_t<T>>::make(std::forward<T>(arg)); diff --git a/include/mbgl/style/expression/value.hpp b/include/mbgl/style/expression/value.hpp index 902f5ae209..6f12bb9336 100644 --- a/include/mbgl/style/expression/value.hpp +++ b/include/mbgl/style/expression/value.hpp @@ -5,6 +5,7 @@ #include <mbgl/style/expression/image.hpp> #include <mbgl/style/expression/type.hpp> #include <mbgl/style/position.hpp> +#include <mbgl/style/rotation.hpp> #include <mbgl/style/types.hpp> #include <mbgl/util/color.hpp> #include <mbgl/util/enum.hpp> @@ -147,6 +148,13 @@ std::vector<optional<T>> fromExpressionValues(const std::vector<optional<Value>> return result; } +template <> +struct ValueConverter<Rotation> { + static type::Type expressionType() { return type::Number; } + static Value toExpressionValue(const mbgl::style::Rotation& value); + static optional<Rotation> fromExpressionValue(const Value& v); +}; + } // namespace expression } // namespace style } // namespace mbgl diff --git a/include/mbgl/style/layers/background_layer.hpp b/include/mbgl/style/layers/background_layer.hpp index 9fdfd3ac92..2a46b2fc21 100644 --- a/include/mbgl/style/layers/background_layer.hpp +++ b/include/mbgl/style/layers/background_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/circle_layer.hpp b/include/mbgl/style/layers/circle_layer.hpp index dd5b674002..f0e9787caa 100644 --- a/include/mbgl/style/layers/circle_layer.hpp +++ b/include/mbgl/style/layers/circle_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/fill_extrusion_layer.hpp b/include/mbgl/style/layers/fill_extrusion_layer.hpp index ca33c6c3f8..3e4973b82c 100644 --- a/include/mbgl/style/layers/fill_extrusion_layer.hpp +++ b/include/mbgl/style/layers/fill_extrusion_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/fill_layer.hpp b/include/mbgl/style/layers/fill_layer.hpp index 4a1f09cca0..fb386c4b11 100644 --- a/include/mbgl/style/layers/fill_layer.hpp +++ b/include/mbgl/style/layers/fill_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/heatmap_layer.hpp b/include/mbgl/style/layers/heatmap_layer.hpp index 588aaa81df..371e9a8aa4 100644 --- a/include/mbgl/style/layers/heatmap_layer.hpp +++ b/include/mbgl/style/layers/heatmap_layer.hpp @@ -8,7 +8,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/hillshade_layer.hpp b/include/mbgl/style/layers/hillshade_layer.hpp index c501e80b8d..7149fb46dd 100644 --- a/include/mbgl/style/layers/hillshade_layer.hpp +++ b/include/mbgl/style/layers/hillshade_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/style/layers/layer.hpp.ejs b/include/mbgl/style/layers/layer.hpp.ejs index a083829f60..a81aaa9e16 100644 --- a/include/mbgl/style/layers/layer.hpp.ejs +++ b/include/mbgl/style/layers/layer.hpp.ejs @@ -15,7 +15,12 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> +<% if (type === 'location-indicator') { -%> +#include <mbgl/style/rotation.hpp> +<% } -%> +<% if (type === 'symbol') { -%> #include <mbgl/style/expression/formatted.hpp> +<% } -%> #include <mbgl/util/color.hpp> <% if (type === 'line' || type === 'symbol') { -%> diff --git a/include/mbgl/style/layers/line_layer.hpp b/include/mbgl/style/layers/line_layer.hpp index 2186f16669..7d7da47bf9 100644 --- a/include/mbgl/style/layers/line_layer.hpp +++ b/include/mbgl/style/layers/line_layer.hpp @@ -8,7 +8,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> #include <vector> diff --git a/include/mbgl/style/layers/location_indicator_layer.hpp b/include/mbgl/style/layers/location_indicator_layer.hpp index e9e67c1a20..f112664dab 100644 --- a/include/mbgl/style/layers/location_indicator_layer.hpp +++ b/include/mbgl/style/layers/location_indicator_layer.hpp @@ -7,7 +7,7 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> +#include <mbgl/style/rotation.hpp> #include <mbgl/util/color.hpp> namespace mbgl { @@ -22,10 +22,6 @@ public: // Layout properties - static PropertyValue<float> getDefaultBearing(); - const PropertyValue<float>& getBearing() const; - void setBearing(const PropertyValue<float>&); - static PropertyValue<expression::Image> getDefaultBearingImage(); const PropertyValue<expression::Image>& getBearingImage() const; void setBearingImage(const PropertyValue<expression::Image>&); @@ -66,6 +62,12 @@ public: void setAccuracyRadiusColorTransition(const TransitionOptions&); TransitionOptions getAccuracyRadiusColorTransition() const; + static PropertyValue<Rotation> getDefaultBearing(); + const PropertyValue<Rotation>& getBearing() const; + void setBearing(const PropertyValue<Rotation>&); + void setBearingTransition(const TransitionOptions&); + TransitionOptions getBearingTransition() const; + static PropertyValue<float> getDefaultBearingImageSize(); const PropertyValue<float>& getBearingImageSize() const; void setBearingImageSize(const PropertyValue<float>&); diff --git a/include/mbgl/style/layers/raster_layer.hpp b/include/mbgl/style/layers/raster_layer.hpp index df82c93660..78fa3db23b 100644 --- a/include/mbgl/style/layers/raster_layer.hpp +++ b/include/mbgl/style/layers/raster_layer.hpp @@ -7,7 +7,6 @@ #include <mbgl/style/layer.hpp> #include <mbgl/style/filter.hpp> #include <mbgl/style/property_value.hpp> -#include <mbgl/style/expression/formatted.hpp> #include <mbgl/util/color.hpp> namespace mbgl { diff --git a/include/mbgl/util/interpolate.hpp b/include/mbgl/util/interpolate.hpp index aff730a0a2..1de626f701 100644 --- a/include/mbgl/util/interpolate.hpp +++ b/include/mbgl/util/interpolate.hpp @@ -3,6 +3,7 @@ #include <mbgl/util/color.hpp> #include <mbgl/util/range.hpp> #include <mbgl/style/position.hpp> +#include <mbgl/style/rotation.hpp> #include <mbgl/style/expression/value.hpp> #include <array> @@ -102,6 +103,27 @@ public: } }; +template <> +struct Interpolator<style::Rotation> { +public: + style::Rotation operator()(const style::Rotation& a, const style::Rotation& b, const double t) { + assert(a.period() == b.period()); + auto period = a.period(); + auto aAngle = std::fmod(a.getAngle(), period); + auto bAngle = std::fmod(b.getAngle(), period); + + if (aAngle - bAngle > period * 0.5) { + return {std::fmod(aAngle * (1.0 - t) + (bAngle + period) * t, period)}; + } + + if (aAngle - bAngle < period * -0.5) { + return {std::fmod((aAngle + period) * (1.0 - t) + bAngle * t, period)}; + } + + return {aAngle * (1.0 - t) + bAngle * t}; + } +}; + struct Uninterpolated { template <class T> T operator()(const T& a, const T&, const double) const { diff --git a/scripts/generate-style-code.js b/scripts/generate-style-code.js index 08fd1fba19..c9191d59e1 100755 --- a/scripts/generate-style-code.js +++ b/scripts/generate-style-code.js @@ -64,6 +64,13 @@ global.evaluatedType = function (property) { case 'boolean': return 'bool'; case 'number': + // TODO: Check if 'Rotation' should be used for other properties, + // such as icon-rotate + if (/bearing$/.test(property.name) && + property.period == 360 && + property.units =='degrees') { + return 'Rotation'; + } return /location$/.test(property.name) ? 'double' : 'float'; case 'resolvedImage': return 'expression::Image'; diff --git a/scripts/style-spec.js b/scripts/style-spec.js index c0acbebd91..26df39a665 100644 --- a/scripts/style-spec.js +++ b/scripts/style-spec.js @@ -47,20 +47,6 @@ referenceSpec["layout_location-indicator"] = { }, "doc": "The amount of the perspective compensation, between 0 and 1. A value of 1 produces a location indicator of constant width across the screen. A value of 0 makes it scale naturally according to the viewing projection." }, - "bearing": { - "type": "number", - "default": "0", - "default": 0, - "period": 360, - "units": "degrees", - "property-type": "data-constant", - "expression": { - "interpolated": false, - "parameters": [ ] - }, - "transition": false, - "doc": "The bearing of the location indicator." - }, "image-tilt-displacement": { "type": "number", "property-type": "data-constant", @@ -176,6 +162,20 @@ referenceSpec["paint_location-indicator"] = { }, "transition": true, "doc": "The color for drawing the accuracy radius border. To adjust transparency, set the alpha component of the color accordingly." + }, + "bearing": { + "type": "number", + "default": "0", + "default": 0, + "period": 360, + "units": "degrees", + "property-type": "data-constant", + "expression": { + "interpolated": false, + "parameters": [ ] + }, + "transition": false, + "doc": "The bearing of the location indicator." } }; diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index 84b8a1a0af..c05d575825 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -718,13 +718,12 @@ void RenderLocationIndicatorLayer::evaluate(const PropertyEvaluationParameters& renderImpl->parameters.puckSizePx = evaluated.get<style::BearingImageSize>(); renderImpl->parameters.puckHatSizePx = evaluated.get<style::TopImageSize>(); renderImpl->parameters.puckShadowSizePx = evaluated.get<style::ShadowImageSize>(); + renderImpl->parameters.puckBearing = evaluated.get<style::Bearing>().getAngle(); const std::array<double, 3> pos = evaluated.get<style::Location>(); renderImpl->parameters.puckPosition = LatLng{pos[0], pos[1]}; // layout - if (!layout.get<style::Bearing>().isUndefined()) - renderImpl->parameters.puckBearing = layout.get<style::Bearing>().asConstant(); if (!layout.get<style::BearingImage>().isUndefined()) renderImpl->parameters.puckImagePath = layout.get<style::BearingImage>().asConstant().id(); if (!layout.get<style::ShadowImage>().isUndefined()) diff --git a/src/mbgl/style/conversion/function.cpp b/src/mbgl/style/conversion/function.cpp index 6c2bcdf10f..cedbb8a1bd 100644 --- a/src/mbgl/style/conversion/function.cpp +++ b/src/mbgl/style/conversion/function.cpp @@ -1,5 +1,6 @@ #include <mbgl/style/conversion/function.hpp> #include <mbgl/style/conversion/position.hpp> +#include <mbgl/style/conversion/rotation.hpp> #include <mbgl/style/conversion_impl.hpp> #include <mbgl/style/expression/case.hpp> #include <mbgl/style/expression/dsl.hpp> @@ -159,6 +160,8 @@ template optional<PropertyExpression<Formatted>> template optional<PropertyExpression<std::vector<TextWritingModeType>>> convertFunctionToExpression<std::vector<TextWritingModeType>>(const Convertible&, Error&, bool); template optional<PropertyExpression<Image>> convertFunctionToExpression<Image>(const Convertible&, Error&, bool); +template optional<PropertyExpression<Rotation>> + convertFunctionToExpression<Rotation>(const Convertible&, Error&, bool); // Ad-hoc Converters for double and int64_t. We should replace float with double wholesale, // and promote the int64_t Converter to general use (and it should check that the input is diff --git a/src/mbgl/style/conversion/property_value.cpp b/src/mbgl/style/conversion/property_value.cpp index 1a0e686850..40264d9f27 100644 --- a/src/mbgl/style/conversion/property_value.cpp +++ b/src/mbgl/style/conversion/property_value.cpp @@ -1,5 +1,6 @@ #include <mbgl/style/conversion/property_value.hpp> #include <mbgl/style/conversion/position.hpp> +#include <mbgl/style/conversion/rotation.hpp> #include <mbgl/style/conversion_impl.hpp> namespace mbgl { @@ -107,6 +108,8 @@ mbgl::style::conversion::Converter<PropertyValue<std::array<double, 3>>, void>:: return r; } +template optional<PropertyValue<Rotation>> Converter<PropertyValue<Rotation>>::operator()(conversion::Convertible const&, conversion::Error&, bool, bool) const; + } // namespace conversion } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/expression/value.cpp b/src/mbgl/style/expression/value.cpp index 9f40d17b02..2ceac4588b 100644 --- a/src/mbgl/style/expression/value.cpp +++ b/src/mbgl/style/expression/value.cpp @@ -269,6 +269,15 @@ optional<Position> ValueConverter<Position>::fromExpressionValue(const Value& v) return pos ? optional<Position>(Position(*pos)) : optional<Position>(); } +Value ValueConverter<Rotation>::toExpressionValue(const mbgl::style::Rotation& value) { + return ValueConverter<float>::toExpressionValue(value.getAngle()); +} + +optional<Rotation> ValueConverter<Rotation>::fromExpressionValue(const Value& v) { + auto angle = ValueConverter<float>::fromExpressionValue(v); + return angle ? optional<Rotation>(Rotation(*angle)) : optional<Rotation>(); +} + template <typename T> Value ValueConverter<T, std::enable_if_t< std::is_enum<T>::value >>::toExpressionValue(const T& value) { return std::string(Enum<T>::toString(value)); @@ -317,6 +326,7 @@ template struct ValueConverter<std::array<double, 3>>; // layout/paint property types template type::Type valueTypeToExpressionType<float>(); template type::Type valueTypeToExpressionType<Position>(); +template type::Type valueTypeToExpressionType<Rotation>(); template type::Type valueTypeToExpressionType<std::array<float, 2>>(); template struct ValueConverter<std::array<float, 2>>; diff --git a/src/mbgl/style/layers/location_indicator_layer.cpp b/src/mbgl/style/layers/location_indicator_layer.cpp index 03b826cc18..178fd104ad 100644 --- a/src/mbgl/style/layers/location_indicator_layer.cpp +++ b/src/mbgl/style/layers/location_indicator_layer.cpp @@ -63,21 +63,6 @@ void LocationIndicatorLayer::Impl::stringifyLayout(rapidjson::Writer<rapidjson:: // Layout properties -PropertyValue<float> LocationIndicatorLayer::getDefaultBearing() { - return Bearing::defaultValue(); -} - -const PropertyValue<float>& LocationIndicatorLayer::getBearing() const { - return impl().layout.get<Bearing>(); -} - -void LocationIndicatorLayer::setBearing(const PropertyValue<float>& value) { - if (value == getBearing()) return; - auto impl_ = mutableImpl(); - impl_->layout.get<Bearing>() = value; - baseImpl = std::move(impl_); - observer->onLayerChanged(*this); -} PropertyValue<expression::Image> LocationIndicatorLayer::getDefaultBearingImage() { return BearingImage::defaultValue(); } @@ -237,6 +222,33 @@ TransitionOptions LocationIndicatorLayer::getAccuracyRadiusColorTransition() con return impl().paint.template get<AccuracyRadiusColor>().options; } +PropertyValue<Rotation> LocationIndicatorLayer::getDefaultBearing() { + return {0}; +} + +const PropertyValue<Rotation>& LocationIndicatorLayer::getBearing() const { + return impl().paint.template get<Bearing>().value; +} + +void LocationIndicatorLayer::setBearing(const PropertyValue<Rotation>& value) { + if (value == getBearing()) + return; + auto impl_ = mutableImpl(); + impl_->paint.template get<Bearing>().value = value; + baseImpl = std::move(impl_); + observer->onLayerChanged(*this); +} + +void LocationIndicatorLayer::setBearingTransition(const TransitionOptions& options) { + auto impl_ = mutableImpl(); + impl_->paint.template get<Bearing>().options = options; + baseImpl = std::move(impl_); +} + +TransitionOptions LocationIndicatorLayer::getBearingTransition() const { + return impl().paint.template get<Bearing>().options; +} + PropertyValue<float> LocationIndicatorLayer::getDefaultBearingImageSize() { return {0}; } @@ -349,12 +361,13 @@ using namespace conversion; namespace { -constexpr uint8_t kPaintPropertyCount = 14u; +constexpr uint8_t kPaintPropertyCount = 16u; enum class Property : uint8_t { AccuracyRadius, AccuracyRadiusBorderColor, AccuracyRadiusColor, + Bearing, BearingImageSize, Location, ShadowImageSize, @@ -362,12 +375,12 @@ enum class Property : uint8_t { AccuracyRadiusTransition, AccuracyRadiusBorderColorTransition, AccuracyRadiusColorTransition, + BearingTransition, BearingImageSizeTransition, LocationTransition, ShadowImageSizeTransition, TopImageSizeTransition, - Bearing = kPaintPropertyCount, - BearingImage, + BearingImage = kPaintPropertyCount, ImageTiltDisplacement, PerspectiveCompensation, ShadowImage, @@ -383,6 +396,7 @@ MAPBOX_ETERNAL_CONSTEXPR const auto layerProperties = mapbox::eternal::hash_map< {{"accuracy-radius", toUint8(Property::AccuracyRadius)}, {"accuracy-radius-border-color", toUint8(Property::AccuracyRadiusBorderColor)}, {"accuracy-radius-color", toUint8(Property::AccuracyRadiusColor)}, + {"bearing", toUint8(Property::Bearing)}, {"bearing-image-size", toUint8(Property::BearingImageSize)}, {"location", toUint8(Property::Location)}, {"shadow-image-size", toUint8(Property::ShadowImageSize)}, @@ -390,11 +404,11 @@ MAPBOX_ETERNAL_CONSTEXPR const auto layerProperties = mapbox::eternal::hash_map< {"accuracy-radius-transition", toUint8(Property::AccuracyRadiusTransition)}, {"accuracy-radius-border-color-transition", toUint8(Property::AccuracyRadiusBorderColorTransition)}, {"accuracy-radius-color-transition", toUint8(Property::AccuracyRadiusColorTransition)}, + {"bearing-transition", toUint8(Property::BearingTransition)}, {"bearing-image-size-transition", toUint8(Property::BearingImageSizeTransition)}, {"location-transition", toUint8(Property::LocationTransition)}, {"shadow-image-size-transition", toUint8(Property::ShadowImageSizeTransition)}, {"top-image-size-transition", toUint8(Property::TopImageSizeTransition)}, - {"bearing", toUint8(Property::Bearing)}, {"bearing-image", toUint8(Property::BearingImage)}, {"image-tilt-displacement", toUint8(Property::ImageTiltDisplacement)}, {"perspective-compensation", toUint8(Property::PerspectiveCompensation)}, @@ -409,6 +423,8 @@ StyleProperty getLayerProperty(const LocationIndicatorLayer& layer, Property pro return makeStyleProperty(layer.getAccuracyRadiusBorderColor()); case Property::AccuracyRadiusColor: return makeStyleProperty(layer.getAccuracyRadiusColor()); + case Property::Bearing: + return makeStyleProperty(layer.getBearing()); case Property::BearingImageSize: return makeStyleProperty(layer.getBearingImageSize()); case Property::Location: @@ -423,6 +439,8 @@ StyleProperty getLayerProperty(const LocationIndicatorLayer& layer, Property pro return makeStyleProperty(layer.getAccuracyRadiusBorderColorTransition()); case Property::AccuracyRadiusColorTransition: return makeStyleProperty(layer.getAccuracyRadiusColorTransition()); + case Property::BearingTransition: + return makeStyleProperty(layer.getBearingTransition()); case Property::BearingImageSizeTransition: return makeStyleProperty(layer.getBearingImageSizeTransition()); case Property::LocationTransition: @@ -431,8 +449,6 @@ StyleProperty getLayerProperty(const LocationIndicatorLayer& layer, Property pro return makeStyleProperty(layer.getShadowImageSizeTransition()); case Property::TopImageSizeTransition: return makeStyleProperty(layer.getTopImageSizeTransition()); - case Property::Bearing: - return makeStyleProperty(layer.getBearing()); case Property::BearingImage: return makeStyleProperty(layer.getBearingImage()); case Property::ImageTiltDisplacement: @@ -475,7 +491,7 @@ optional<Error> LocationIndicatorLayer::setPropertyInternal(const std::string& n auto property = static_cast<Property>(it->second); if (property == Property::AccuracyRadius || property == Property::BearingImageSize || - property == Property::ShadowImageSize || property == Property::TopImageSize || property == Property::Bearing || + property == Property::ShadowImageSize || property == Property::TopImageSize || property == Property::ImageTiltDisplacement || property == Property::PerspectiveCompensation) { Error error; const auto& typedValue = convert<PropertyValue<float>>(value, error, false, false); @@ -503,11 +519,6 @@ optional<Error> LocationIndicatorLayer::setPropertyInternal(const std::string& n return nullopt; } - if (property == Property::Bearing) { - setBearing(*typedValue); - return nullopt; - } - if (property == Property::ImageTiltDisplacement) { setImageTiltDisplacement(*typedValue); return nullopt; @@ -535,6 +546,16 @@ optional<Error> LocationIndicatorLayer::setPropertyInternal(const std::string& n return nullopt; } } + if (property == Property::Bearing) { + Error error; + const auto& typedValue = convert<PropertyValue<Rotation>>(value, error, false, false); + if (!typedValue) { + return error; + } + + setBearing(*typedValue); + return nullopt; + } if (property == Property::Location) { Error error; const auto& typedValue = convert<PropertyValue<std::array<double, 3>>>(value, error, false, false); @@ -589,6 +610,11 @@ optional<Error> LocationIndicatorLayer::setPropertyInternal(const std::string& n return nullopt; } + if (property == Property::BearingTransition) { + setBearingTransition(*transition); + return nullopt; + } + if (property == Property::BearingImageSizeTransition) { setBearingImageSizeTransition(*transition); return nullopt; diff --git a/src/mbgl/style/layers/location_indicator_layer_properties.hpp b/src/mbgl/style/layers/location_indicator_layer_properties.hpp index d1f0879f74..d73ce33eb9 100644 --- a/src/mbgl/style/layers/location_indicator_layer_properties.hpp +++ b/src/mbgl/style/layers/location_indicator_layer_properties.hpp @@ -16,11 +16,6 @@ namespace mbgl { namespace style { -struct Bearing : LayoutProperty<float> { - static constexpr const char *name() { return "bearing"; } - static float defaultValue() { return 0; } -}; - struct BearingImage : LayoutProperty<expression::Image> { static constexpr const char *name() { return "bearing-image"; } static expression::Image defaultValue() { return {}; } @@ -58,6 +53,10 @@ struct AccuracyRadiusColor : PaintProperty<Color> { static Color defaultValue() { return Color::white(); } }; +struct Bearing : PaintProperty<Rotation> { + static Rotation defaultValue() { return 0; } +}; + struct BearingImageSize : PaintProperty<float> { static float defaultValue() { return 0; } }; @@ -75,7 +74,6 @@ struct TopImageSize : PaintProperty<float> { }; class LocationIndicatorLayoutProperties : public Properties< - Bearing, BearingImage, ImageTiltDisplacement, PerspectiveCompensation, @@ -87,6 +85,7 @@ class LocationIndicatorPaintProperties : public Properties< AccuracyRadius, AccuracyRadiusBorderColor, AccuracyRadiusColor, + Bearing, BearingImageSize, Location, ShadowImageSize, |