Commit Graph

115 Commits

Author SHA1 Message Date
Mikhail Pozdnyakov
a32672b9e6 [core] Introduce PlacementContext
Make `placeSymbol()` a method and introduce copiable `PlacementContext`.
2020-04-08 11:19:37 +03:00
Mikhail Pozdnyakov
c3b68fe91b [core] PlacedSymbolData includes viewport padding 2020-04-02 11:50:52 +03:00
Mikhail Pozdnyakov
3412331e4a [core][tile mode] Implement API to collect placed symbols data 2020-04-02 11:50:52 +03:00
Mikhail Pozdnyakov
5f4e33b1a3 [core] Introduce API to collect placed symbols data
The following methods are added to the `Renderer` class:
- `collectPlacedSymbolData()`
  enables or disables collecting of the placed symbols data

- `getPlacedSymbolsData()`
  if collecting of the placed symbols data is enabled, returns the
  reference to the `PlacedSymbolData` vector holding the collected data.
2020-04-02 11:50:52 +03:00
Mikhail Pozdnyakov
735fc0a4dc [core][tile mode] Share seenCrossTileIDs across all placeLayer() calls
Thus we obviate lots of repeated operations for already placed symbols.
2020-03-25 15:11:41 +02:00
Mikhail Pozdnyakov
313844b1da [core][tile mode] Place tile intersecting labels first, across all layers
Thus, we reduce the amount of label cut-offs in Tile mode.

Before, labels were arranged within one symbol layer (one bucket),
which was not enough for several symbol layers being placed at the
same time.
2020-03-25 15:11:41 +02:00
Mikhail Pozdnyakov
f5430ca33c [core] Introduce map mode specific Placement implementations 2020-03-25 15:11:41 +02:00
Mikhail Pozdnyakov
7ba5d5e2dd [core] Introduce Placement::placeLayers() 2020-03-25 15:11:41 +02:00
Mikhail Pozdnyakov
a70b33be8b [core] Fix crash at Placement::getSymbolPlacement() 2020-03-13 14:30:17 +02:00
Mikhail Pozdnyakov
05657e9573 [core] Binary size fixup 2020-03-12 23:35:55 +02:00
Mikhail Pozdnyakov
57810759ef [core] Variable labels stick to latest anchor if the view is tilted
This is done in order to improve labels stability and for the performace reasons.
2020-03-12 23:35:55 +02:00
Mikhail Pozdnyakov
f29865f31d [core] Do not squeeze placement period if the view is tilted
If the view is not tilted, we want the new symbols to show up faster, so we squeeze the placement period.

On contrary, with the tilted view it's more important to make placement rarely for performance reasons and as the new symbols are normally "far away" and the user is not that interested to see them ASAP.
2020-03-12 23:35:55 +02:00
Mikhail Pozdnyakov
7a2126bebb [core] Place already visible symbols first and hidden symbols last 2020-03-12 23:35:55 +02:00
Mikhail Pozdnyakov
cc5e86b186 [core][tile mode] Fix assertion at line-center placement handling
The `symbolIntersectsTileEdges` algorithm should not be applied to the symbols with `line-center` placement
2020-03-10 20:32:34 +02:00
Mikhail Pozdnyakov
260148878c [core] CollisionIndex::intercectsTileEdges -> intersectsTileEdges 2020-03-06 23:46:52 +02:00
Mikhail Pozdnyakov
42068691c8 [core] Tile mode placement algorithm must consider icons bounding boxes
Tile mode placement algorithm now checks if bounding boxes for both label text and icon are intersecting the edges of the tiles.

Before, it checked only text bounding boxes and thus label icons might have got cut off.
2020-03-06 23:46:52 +02:00
Mikhail Pozdnyakov
44ac1f008a [core] Drop BucketPlacementParameters 2020-03-03 16:13:48 +02:00
Mikhail Pozdnyakov
f748972fe9 [core] Get rid of LayerPlacementData::firstInBucket 2020-03-03 16:13:48 +02:00
Mikhail Pozdnyakov
dea1063319 [core] Encapsulate placement code handling symbols sort ranges 2020-03-03 16:13:48 +02:00
Ansis Brammanis
4f18d5fa92 [core] sort symbols using symbol-sort-key before placement (#16023)
fix #15964
partially port mapbox/mapbox-gl-js#9054
2020-02-11 11:24:14 -05:00
Mikhail Pozdnyakov
1f5c6beb64 [tile mode] Improvements in symbol placement on tile borders
This change fixes the following problems:
1) Before this change, when multiple symbols were grouped close to the
tile borders, different tiles could place different symbols, because each
tile arbitrary assigned feature ids, and these ids defined the placement
order being applied. This caused artifacts at the tile boundaries.

With this change, in tile mode the placement order of two symbols crossing
a tile border is defined by their anchor `y` values. It means that the
symbols are being placed the same order across all the tiles.

2) Before this change, the engine did not place with priority the symbols
crossing the borders between two neighboring tiles. Now it does, and it
improves a lot symbol placement stability in the tile map mode.
2020-02-03 21:26:35 +02:00
Mikhail Pozdnyakov
951b90c778 [tile mode] Fix variable symbols placement
This commit allows the variable symbols to cross the tile border only
if their anchor is the first anchor from the `text-variable-anchor` list.
2020-01-27 17:51:07 +02:00
Mikhail Pozdnyakov
a9d04d7b1a [core] Do not index and place the off-screen symbols for overscaled tiles
For overscaled tiles the viewport might be showing only a small part of the
tile, so we filter out the off-screen symbols to improve the performance.
2020-01-22 14:30:26 +02:00
Mikhail Pozdnyakov
4dac2f61c2 [core] Simplify Placement::addLayer() 2020-01-22 14:30:26 +02:00
Mikhail Pozdnyakov
5a4568b2ac [core] Avoid repeated calculations in symbol placement 2020-01-22 14:30:26 +02:00
Mikhail Pozdnyakov
f70cadf2e0 [core] Cache showCollisionBoxes in Placement 2020-01-22 14:30:26 +02:00
Mikhail Pozdnyakov
769a822fec [core] Pass UpdateParameters to Placement constructor 2020-01-22 14:30:26 +02:00
Mikhail Pozdnyakov
5af128f205 [core] Pass placement commit parameters in constructor 2020-01-22 14:30:26 +02:00
Konstantin Käfer
4b171cccf1 [core] getGlyphQuad -> getGlyphQuads 2020-01-15 15:02:11 +02:00
Mikhail Pozdnyakov
0379615388 [core] Introduce CollisionIndex::getProjectedCollisionBoundaries()
In order to remove the repeated code.
2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
141e4e7935 [core] Introduce CollisionBoundaries and use it in CollisionIndex 2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
cf2946c8ff [core] Use only the first variable anchor for the symbols intersecting tile borders
Do not try the following variable anchors, if the first variable anchor placement failed.
2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
c25fbe9a94 [core] Performance fix for placement in tile mode 2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
2040d4d6f5 [core] In tile mode, place labels from tile borders first 2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
7e5dc5608a [core] Pre-defined variable anchor at tile borders
In tile mode, stick to the first variable anchor if the label intersects tile borders.
2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
2125548a6e [core] Consolidate more logic in calculateVariableLayoutOffset() 2020-01-08 12:43:26 +02:00
Mikhail Pozdnyakov
1829fb5e40 [core] Placement::commit() handles absence of previuos placement 2019-12-09 17:32:49 +02:00
Mikhail Pozdnyakov
ffd378c68e [core] Simplify placement code path for still and tile modes 2019-12-09 17:32:49 +02:00
Ansis Brammanis
cdee5b8249 [core] increase padding in CollisionIndex for MapMode::Tile (#15880)
* [core] fix cutoff cross-tile labels in MapMode::Tile

Increase the CollisionIndex's padding so that more of a tile's data gets
considered when checking for collisions. This should fix clipped
variable placement text labels.
2019-12-06 18:11:25 -05:00
Ansis Brammanis
4fb75ba32c [core] avoid edges for labels that use text-variable-anchors
to prevent clipped labels in rendered image tiles.
2019-10-24 15:39:10 +03:00
Ansis Brammanis
99feb9bb30 [core] fix collisions with icon-text-fit and variable placement (#15828)
port 61a61a1982cb8c637d467f91da5b0817a61a9de6
2019-10-22 20:30:55 -04:00
Mikhail Pozdnyakov
097cf5fc39 [core] Clang format fix 2019-09-19 14:51:32 +03:00
Mikhail Pozdnyakov
f04efb69c0 [core] Immutable/Mutable pattern for Placement 2019-09-19 14:51:32 +03:00
Mikhail Pozdnyakov
870f306f68 [core] Update buckets in Renderer 2019-09-19 14:51:32 +03:00
Mikhail Pozdnyakov
f997ae00ae [core] Fix Placement constness
Update buckets methods do not mutate placement, placement methods do not mutate buckets.
2019-09-19 14:51:32 +03:00
Mikhail Pozdnyakov
0d9e4afd20 [core] Coalesce buckets updates from several tiles 2019-09-13 13:45:48 +03:00
Mikhail Pozdnyakov
f9c15f708e [core] Fix placement for updated buckets
Buckets update initiates new placement, so that
newly added symbols are placed and shown immediately.
2019-09-13 13:45:48 +03:00
Mikhail Pozdnyakov
3b5a43c722 [core] Enable text-offset with variable label placement
Port of https://github.com/mapbox/mapbox-gl-js/pull/8642
2019-09-03 11:45:17 +03:00
zmiao
6ef2710e5c [core] fix collisionBox alignment when Icon/text translation is enabled (#15467)
* add initial fix

* fix bug for collision circle

* refind code structure

* fix indentation

* update test

* refind code structure

* Add changelog

* Add comment for boolean
2019-08-30 08:24:03 +03:00
zmiao
c770c23262 [core] fix mixed sdf + non-sdf icon rendering in one layer (#15456)
* [core] fix icon symbol rendring when sdf and non-sdf icon in the same symbol layer

* fix build error

* fix typo

* revert renderableSegment change

* simplify codes

* fix build error

* refine sdf icon flag

* [core] fix mixed sdf + non-sdf icon rendering in one layer

* remove iconstatus getter in stymbol bucket

* fix review findings

* provide bitwise operator for SymbolContent enum

* use MBGL_MBGL_CONSTEXPR

* add one missing update for sdfIcon

* make renderer symbol type as enum
2019-08-26 21:54:59 +03:00