diff options
author | Chris Loer <chris.loer@gmail.com> | 2018-01-04 13:37:41 -0800 |
---|---|---|
committer | Chris Loer <chris.loer@mapbox.com> | 2018-01-04 14:24:37 -0800 |
commit | 5bfa20d71dc099416c5d715e7857ae836db160ed (patch) | |
tree | 1881ce247b0e4db8e490d41765a14315fc7ce109 /src/mbgl/text | |
parent | c62b0af24fc76b4bb2eb34100611dd3ee9ee5536 (diff) | |
download | qtlocation-mapboxgl-5bfa20d71dc099416c5d715e7857ae836db160ed.tar.gz |
Fix distant collision perspective ratios (#10794).
Analog of GL JS issue #5911.
Add native ignore for tilejson-bounds.
Diffstat (limited to 'src/mbgl/text')
-rw-r--r-- | src/mbgl/text/collision_index.cpp | 21 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 2 |
2 files changed, 14 insertions, 9 deletions
diff --git a/src/mbgl/text/collision_index.cpp b/src/mbgl/text/collision_index.cpp index 8014efe6c7..833658c33e 100644 --- a/src/mbgl/text/collision_index.cpp +++ b/src/mbgl/text/collision_index.cpp @@ -78,10 +78,10 @@ std::pair<bool,bool> CollisionIndex::placeFeature(CollisionFeature& feature, CollisionBox& box = feature.boxes.front(); const auto projectedPoint = projectAndGetPerspectiveRatio(posMatrix, box.anchor); const float tileToViewport = textPixelRatio * projectedPoint.second; - box.px1 = box.x1 / tileToViewport + projectedPoint.first.x; - box.py1 = box.y1 / tileToViewport + projectedPoint.first.y; - box.px2 = box.x2 / tileToViewport + projectedPoint.first.x; - box.py2 = box.y2 / tileToViewport + projectedPoint.first.y; + box.px1 = box.x1 * tileToViewport + projectedPoint.first.x; + box.py1 = box.y1 * tileToViewport + projectedPoint.first.y; + box.px2 = box.x2 * tileToViewport + projectedPoint.first.x; + box.py2 = box.y2 * tileToViewport + projectedPoint.first.y; if (!isInsideGrid(box) || (!allowOverlap && collisionGrid.hitTest({{ box.px1, box.py1 }, { box.px2, box.py2 }}))) { @@ -130,8 +130,10 @@ std::pair<bool,bool> CollisionIndex::placeLineFeature(CollisionFeature& feature, bool entirelyOffscreen = true; const auto tileToViewport = projectedAnchor.first * textPixelRatio; + // pixelsToTileUnits is used for translating line geometry to tile units + // ... so we care about 'scale' but not 'perspectiveRatio' // equivalent to pixel_to_tile_units - const auto pixelsToTileUnits = tileToViewport / scale; + const auto pixelsToTileUnits = 1 / (textPixelRatio * scale); float firstTileDistance = 0, lastTileDistance = 0; if (firstAndLastGlyph) { @@ -155,7 +157,7 @@ std::pair<bool,bool> CollisionIndex::placeLineFeature(CollisionFeature& feature, const auto projectedPoint = projectPoint(posMatrix, circle.anchor); const float tileUnitRadius = (circle.x2 - circle.x1) / 2; - const float radius = tileUnitRadius / tileToViewport; + const float radius = tileUnitRadius * tileToViewport; if (atLeastOneCirclePlaced) { const CollisionBox& previousCircle = feature.boxes[i - 1]; @@ -330,7 +332,7 @@ std::pair<float,float> CollisionIndex::projectAnchor(const mat4& posMatrix, cons vec4 p = {{ point.x, point.y, 0, 1 }}; matrix::transformMat4(p, p, posMatrix); return std::make_pair( - 0.5 + 0.5 * (p[3] / transformState.getCameraToCenterDistance()), + 0.5 + 0.5 * (transformState.getCameraToCenterDistance() / p[3]), p[3] ); } @@ -343,7 +345,10 @@ std::pair<Point<float>,float> CollisionIndex::projectAndGetPerspectiveRatio(cons (((p[0] / p[3] + 1) / 2) * transformState.getSize().width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * transformState.getSize().height) + viewportPadding ), - 0.5 + 0.5 * (p[3] / transformState.getCameraToCenterDistance()) + // See perspective ratio comment in symbol_sdf.vertex + // We're doing collision detection in viewport space so we need + // to scale down boxes in the distance + 0.5 + 0.5 * (transformState.getCameraToCenterDistance() / p[3]) ); } diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 334748dda6..b27d8f5baf 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -59,7 +59,7 @@ void Placement::placeLayer(RenderSymbolLayer& symbolLayer, const mat4& projMatri const float pixelsToTileUnits = renderTile.id.pixelsToTileUnits(1, state.getZoom()); const float scale = std::pow(2, state.getZoom() - renderTile.tile.id.overscaledZ); - const float textPixelRatio = util::EXTENT / (util::tileSize * renderTile.tile.id.overscaleFactor()); + const float textPixelRatio = (util::tileSize * renderTile.tile.id.overscaleFactor()) / util::EXTENT; mat4 posMatrix; state.matrixFor(posMatrix, renderTile.id); |