diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-07-23 11:44:15 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-07-23 11:44:15 +0300 |
commit | 71230065e58e773eabf425a37fd0c233f18c1b93 (patch) | |
tree | 1e90b3dbf0b709955bc57288679b440406dc4455 | |
parent | 533e2a37e3e69e300d0ce3dd4578c5cb753f984e (diff) | |
download | qtlocation-mapboxgl-upstream/alexshalamov_wip_qrf.tar.gz |
offset line returns geometrycollectionupstream/alexshalamov_wip_qrf
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 5c56826bd7..54e2faf962 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -214,16 +214,12 @@ void RenderLineLayer::render(PaintParameters& parameters) { } } -optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const double offset) { - if (offset == 0) return {}; +GeometryCollection offsetLine(GeometryCollection rings, const double offset) { + if (offset == 0 || rings.empty()) return rings; - GeometryCollection newRings; - Point<double> zero(0, 0); - for (const auto& ring : rings) { - newRings.emplace_back(); - auto& newRing = newRings.back(); - - for (auto i = ring.begin(); i != ring.end(); i++) { + const Point<double> zero(0, 0); + for (auto& ring : rings) { + for (auto i = ring.begin(); i != ring.end(); ++i) { auto& p = *i; Point<double> aToB = i == ring.begin() ? @@ -237,11 +233,11 @@ optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const d const double cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; extrude *= (1.0 / cosHalfAngle); - newRing.push_back(convertPoint<int16_t>(extrude * offset) + p); + ring = {convertPoint<int16_t>(extrude * offset) + p}; } } - return newRings; + return rings; } bool RenderLineLayer::queryIntersectsFeature( @@ -264,14 +260,12 @@ bool RenderLineLayer::queryIntersectsFeature( auto offset = evaluated.get<style::LineOffset>() .evaluate(feature, zoom, style::LineOffset::defaultValue()) * pixelsToTileUnits; - // Apply offset to geometry - auto offsetGeometry = offsetLine(feature.getGeometries(), offset); - // Test intersection const float halfWidth = getLineWidth(feature, zoom) / 2.0 * pixelsToTileUnits; return util::polygonIntersectsBufferedMultiLine( translatedQueryGeometry.value_or(queryGeometry), - offsetGeometry.value_or(feature.getGeometries()), + // Apply offset to geometry if offset is > 0; + offsetLine(feature.getGeometries(), offset), halfWidth); } |