From c09fb0f5197be81cca8e925bcfd46c11b871b94e Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 5 Jul 2016 12:27:00 -0700 Subject: [PATCH] [core] Add support for circle-pitch-scale --- .../style/conversion/make_property_setters.hpp | 1 + include/mbgl/style/layers/circle_layer.hpp | 3 +++ include/mbgl/style/types.hpp | 5 +++++ package.json | 6 +++--- src/mbgl/renderer/painter_circle.cpp | 16 ++++++++++++---- src/mbgl/shader/circle_shader.hpp | 1 + src/mbgl/style/layers/circle_layer.cpp | 8 ++++++++ .../style/layers/circle_layer_properties.cpp | 2 ++ .../style/layers/circle_layer_properties.hpp | 1 + src/mbgl/style/property_evaluator.cpp | 2 ++ src/mbgl/style/types.cpp | 5 +++++ 11 files changed, 43 insertions(+), 7 deletions(-) diff --git a/include/mbgl/style/conversion/make_property_setters.hpp b/include/mbgl/style/conversion/make_property_setters.hpp index 4c0089dea..3da04e4a6 100644 --- a/include/mbgl/style/conversion/make_property_setters.hpp +++ b/include/mbgl/style/conversion/make_property_setters.hpp @@ -112,6 +112,7 @@ auto makePaintPropertySetters() { result["circle-opacity"] = makePropertySetter(&CircleLayer::setCircleOpacity); result["circle-translate"] = makePropertySetter(&CircleLayer::setCircleTranslate); result["circle-translate-anchor"] = makePropertySetter(&CircleLayer::setCircleTranslateAnchor); + result["circle-pitch-scale"] = makePropertySetter(&CircleLayer::setCirclePitchScale); result["raster-opacity"] = makePropertySetter(&RasterLayer::setRasterOpacity); result["raster-hue-rotate"] = makePropertySetter(&RasterLayer::setRasterHueRotate); diff --git a/include/mbgl/style/layers/circle_layer.hpp b/include/mbgl/style/layers/circle_layer.hpp index c8d99ab30..873f95bcf 100644 --- a/include/mbgl/style/layers/circle_layer.hpp +++ b/include/mbgl/style/layers/circle_layer.hpp @@ -44,6 +44,9 @@ public: PropertyValue getCircleTranslateAnchor() const; void setCircleTranslateAnchor(PropertyValue, const optional& klass = {}); + PropertyValue getCirclePitchScale() const; + void setCirclePitchScale(PropertyValue, const optional& klass = {}); + // Private implementation class Impl; diff --git a/include/mbgl/style/types.hpp b/include/mbgl/style/types.hpp index 28ebda9fb..34e5642ec 100644 --- a/include/mbgl/style/types.hpp +++ b/include/mbgl/style/types.hpp @@ -45,6 +45,11 @@ enum class RotateAnchorType : bool { Viewport, }; +enum class CirclePitchScaleType : bool { + Map, + Viewport, +}; + enum class SymbolPlacementType : bool { Point, Line, diff --git a/package.json b/package.json index 89d361bb9..ac3cd446c 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,9 @@ "csscolorparser": "^1.0.2", "ejs": "^2.4.1", "express": "^4.11.1", - "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#d3a10d1a46b99d3da264cf2d1903cbde6fea3185", - "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#194fc55b6a7dd54c1e2cf2dd9048fbb5e836716d", - "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#725bd7410b612d5ddba918f6da82045e3340644e", + "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#4d1f89514bf03536c8e682439df165c33a37122a", + "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae", + "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#d4c5c157397a2df619ba1eecf69a08b34159b3e1", "node-gyp": "^3.3.1", "request": "^2.72.0", "tape": "^4.5.1" diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp index 5bc31f7f8..8e9f1909b 100644 --- a/src/mbgl/renderer/painter_circle.cpp +++ b/src/mbgl/renderer/painter_circle.cpp @@ -32,10 +32,18 @@ void Painter::renderCircle(CircleBucket& bucket, config.program = circleShader.getID(); circleShader.u_matrix = vtxMatrix; - circleShader->u_extrude_scale = {{ - pixelsToGLUnits[0] * state.getAltitude(), - pixelsToGLUnits[1] * state.getAltitude() - }}; + + if (properties.circlePitchScale == CirclePitchScaleType::Map) { + circleShader.u_extrude_scale = {{ + pixelsToGLUnits[0] * state.getAltitude(), + pixelsToGLUnits[1] * state.getAltitude() + }}; + circleShader.u_scale_with_map = true; + } else { + circleShader.u_extrude_scale = pixelsToGLUnits; + circleShader.u_scale_with_map = false; + } + circleShader.u_devicepixelratio = frame.pixelRatio; circleShader.u_color = properties.circleColor; circleShader.u_radius = properties.circleRadius; diff --git a/src/mbgl/shader/circle_shader.hpp b/src/mbgl/shader/circle_shader.hpp index 34466ace0..c454fc133 100644 --- a/src/mbgl/shader/circle_shader.hpp +++ b/src/mbgl/shader/circle_shader.hpp @@ -19,6 +19,7 @@ public: Uniform u_radius = {"u_radius", *this}; Uniform u_blur = {"u_blur", *this}; Uniform u_opacity = {"u_opacity", *this}; + Uniform u_scale_with_map = {"u_scale_with_map", *this}; }; } // namespace mbgl diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp index a47d72354..96cc0b610 100644 --- a/src/mbgl/style/layers/circle_layer.cpp +++ b/src/mbgl/style/layers/circle_layer.cpp @@ -109,5 +109,13 @@ void CircleLayer::setCircleTranslateAnchor(PropertyValue va impl->paint.circleTranslateAnchor.set(value, klass); } +PropertyValue CircleLayer::getCirclePitchScale() const { + return impl->paint.circlePitchScale.get(); +} + +void CircleLayer::setCirclePitchScale(PropertyValue value, const optional& klass) { + impl->paint.circlePitchScale.set(value, klass); +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layers/circle_layer_properties.cpp b/src/mbgl/style/layers/circle_layer_properties.cpp index 045c73ba6..7243cf87f 100644 --- a/src/mbgl/style/layers/circle_layer_properties.cpp +++ b/src/mbgl/style/layers/circle_layer_properties.cpp @@ -12,6 +12,7 @@ void CirclePaintProperties::cascade(const CascadeParameters& parameters) { circleOpacity.cascade(parameters); circleTranslate.cascade(parameters); circleTranslateAnchor.cascade(parameters); + circlePitchScale.cascade(parameters); } bool CirclePaintProperties::recalculate(const CalculationParameters& parameters) { @@ -23,6 +24,7 @@ bool CirclePaintProperties::recalculate(const CalculationParameters& parameters) hasTransitions |= circleOpacity.calculate(parameters); hasTransitions |= circleTranslate.calculate(parameters); hasTransitions |= circleTranslateAnchor.calculate(parameters); + hasTransitions |= circlePitchScale.calculate(parameters); return hasTransitions; } diff --git a/src/mbgl/style/layers/circle_layer_properties.hpp b/src/mbgl/style/layers/circle_layer_properties.hpp index 40d37dc39..227a67eb6 100644 --- a/src/mbgl/style/layers/circle_layer_properties.hpp +++ b/src/mbgl/style/layers/circle_layer_properties.hpp @@ -23,6 +23,7 @@ public: PaintProperty circleOpacity { 1 }; PaintProperty> circleTranslate { {{ 0, 0 }} }; PaintProperty circleTranslateAnchor { TranslateAnchorType::Map }; + PaintProperty circlePitchScale { CirclePitchScaleType::Map }; }; } // namespace style diff --git a/src/mbgl/style/property_evaluator.cpp b/src/mbgl/style/property_evaluator.cpp index fd31451d7..abb3681ef 100644 --- a/src/mbgl/style/property_evaluator.cpp +++ b/src/mbgl/style/property_evaluator.cpp @@ -24,6 +24,7 @@ template <> std::array defaultStopsValue() { return {{ 0, 0, 0, 0 }}; template <> std::string defaultStopsValue() { return {}; } template <> TranslateAnchorType defaultStopsValue() { return {}; } template <> RotateAnchorType defaultStopsValue() { return {}; } +template <> CirclePitchScaleType defaultStopsValue() { return {}; } template <> LineCapType defaultStopsValue() { return {}; } template <> LineJoinType defaultStopsValue() { return {}; } template <> SymbolPlacementType defaultStopsValue() { return {}; } @@ -94,6 +95,7 @@ template class PropertyEvaluator>; template class PropertyEvaluator; template class PropertyEvaluator; template class PropertyEvaluator; +template class PropertyEvaluator; template class PropertyEvaluator; template class PropertyEvaluator; template class PropertyEvaluator; diff --git a/src/mbgl/style/types.cpp b/src/mbgl/style/types.cpp index 25a175387..be0b21713 100644 --- a/src/mbgl/style/types.cpp +++ b/src/mbgl/style/types.cpp @@ -28,6 +28,11 @@ MBGL_DEFINE_ENUM(RotateAnchorType, { { RotateAnchorType::Viewport, "viewport" }, }); +MBGL_DEFINE_ENUM(CirclePitchScaleType, { + { CirclePitchScaleType::Map, "map" }, + { CirclePitchScaleType::Viewport, "viewport" }, +}); + MBGL_DEFINE_ENUM(LineCapType, { { LineCapType::Round, "round" }, { LineCapType::Butt, "butt" },