summaryrefslogtreecommitdiff
path: root/src/mbgl/text/placement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/text/placement.cpp')
-rw-r--r--src/mbgl/text/placement.cpp68
1 files changed, 33 insertions, 35 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp
index bcb193d02a..49a57ae7c0 100644
--- a/src/mbgl/text/placement.cpp
+++ b/src/mbgl/text/placement.cpp
@@ -73,15 +73,13 @@ Placement::Placement(const TransformState& state_, MapMode mapMode_, style::Tran
void Placement::placeLayer(const RenderLayer& layer, const mat4& projMatrix, bool showCollisionBoxes) {
- std::unordered_set<uint32_t> seenCrossTileIDs;
+ std::set<uint32_t> seenCrossTileIDs;
for (const auto& item : layer.getPlacementData()) {
RenderTile& renderTile = item.tile;
assert(renderTile.tile.kind == Tile::Kind::Geometry);
auto& geometryTile = static_cast<GeometryTile&>(renderTile.tile);
-
Bucket& bucket = item.bucket;
- auto& symbolBucket = static_cast<SymbolBucket&>(bucket);
const float pixelsToTileUnits = renderTile.id.pixelsToTileUnits(1, state.getZoom());
@@ -103,17 +101,27 @@ void Placement::placeLayer(const RenderLayer& layer, const mat4& projMatrix, boo
item.rotateWithMap,
state,
pixelsToTileUnits);
-
+
+ const auto& collisionGroup = collisionGroups.get(geometryTile.sourceID);
+ BucketPlacementParameters params{
+ posMatrix,
+ textLabelPlaneMatrix,
+ iconLabelPlaneMatrix,
+ scale,
+ textPixelRatio,
+ showCollisionBoxes,
+ renderTile.tile.holdForFade(),
+ collisionGroup};
+ auto bucketInstanceId = bucket.place(*this, params, seenCrossTileIDs);
+ assert(bucketInstanceId != 0u);
// As long as this placement lives, we have to hold onto this bucket's
// matching FeatureIndex/data for querying purposes
retainedQueryData.emplace(std::piecewise_construct,
- std::forward_as_tuple(symbolBucket.bucketInstanceId),
- std::forward_as_tuple(symbolBucket.bucketInstanceId, geometryTile.getFeatureIndex(), geometryTile.id));
+ std::forward_as_tuple(bucketInstanceId),
+ std::forward_as_tuple(bucketInstanceId, geometryTile.getFeatureIndex(), geometryTile.id));
- const auto collisionGroup = collisionGroups.get(geometryTile.sourceID);
-
- placeLayerBucket(symbolBucket, posMatrix, textLabelPlaneMatrix, iconLabelPlaneMatrix, scale, textPixelRatio, showCollisionBoxes, seenCrossTileIDs, renderTile.tile.holdForFade(), collisionGroup);
+
}
}
@@ -132,15 +140,8 @@ Point<float> calculateVariableLayoutOffset(style::SymbolAnchorType anchor, float
void Placement::placeLayerBucket(
SymbolBucket& bucket,
- const mat4& posMatrix,
- const mat4& textLabelPlaneMatrix,
- const mat4& iconLabelPlaneMatrix,
- const float scale,
- const float textPixelRatio,
- const bool showCollisionBoxes,
- std::unordered_set<uint32_t>& seenCrossTileIDs,
- const bool holdingForFade,
- const CollisionGroups::CollisionGroup& collisionGroup) {
+ const BucketPlacementParameters& params,
+ std::set<uint32_t>& seenCrossTileIDs) {
auto partiallyEvaluatedTextSize = bucket.textSizeBinder->evaluateForZoom(state.getZoom());
auto partiallyEvaluatedIconSize = bucket.iconSizeBinder->evaluateForZoom(state.getZoom());
@@ -149,7 +150,7 @@ void Placement::placeLayerBucket(
if (mapMode == MapMode::Tile &&
(bucket.layout.get<style::SymbolAvoidEdges>() ||
bucket.layout.get<style::SymbolPlacement>() == style::SymbolPlacementType::Line)) {
- avoidEdges = collisionIndex.projectTileBoundaries(posMatrix);
+ avoidEdges = collisionIndex.projectTileBoundaries(params.posMatrix);
}
const bool textAllowOverlap = bucket.layout.get<style::TextAllowOverlap>();
@@ -179,7 +180,7 @@ void Placement::placeLayerBucket(
auto placeSymbol = [&] (SymbolInstance& symbolInstance) {
if (seenCrossTileIDs.count(symbolInstance.crossTileID) != 0u) return;
- if (holdingForFade) {
+ if (params.holdingForFade) {
// Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't
// know yet if we have a duplicate in a parent tile that _should_ be placed.
placements.emplace(symbolInstance.crossTileID, JointPlacement(false, false, false));
@@ -196,11 +197,11 @@ void Placement::placeLayerBucket(
const float fontSize = evaluateSizeForFeature(partiallyEvaluatedTextSize, placedSymbol);
if (variableTextAnchors.empty()) {
auto placed = collisionIndex.placeFeature(textCollisionFeature, {},
- posMatrix, textLabelPlaneMatrix, textPixelRatio,
- placedSymbol, scale, fontSize,
+ params.posMatrix, params.textLabelPlaneMatrix, params.pixelRatio,
+ placedSymbol, params.scale, fontSize,
bucket.layout.get<style::TextAllowOverlap>(),
pitchWithMap,
- showCollisionBoxes, avoidEdges, collisionGroup.second);
+ params.showCollisionBoxes, avoidEdges, params.collisionGroup.second);
placeText = placed.first;
offscreen &= placed.second;
} else if (!textCollisionFeature.alongLine && !textCollisionFeature.boxes.empty()) {
@@ -235,11 +236,11 @@ void Placement::placeLayerBucket(
}
auto placed = collisionIndex.placeFeature(textCollisionFeature, shift,
- posMatrix, mat4(), textPixelRatio,
- placedSymbol, scale, fontSize,
+ params.posMatrix, mat4(), params.pixelRatio,
+ placedSymbol, params.scale, fontSize,
bucket.layout.get<style::TextAllowOverlap>(),
pitchWithMap,
- showCollisionBoxes, avoidEdges, collisionGroup.second);
+ params.showCollisionBoxes, avoidEdges, params.collisionGroup.second);
if (placed.first) {
assert(symbolInstance.crossTileID != 0u);
@@ -290,11 +291,11 @@ void Placement::placeLayerBucket(
const float fontSize = evaluateSizeForFeature(partiallyEvaluatedIconSize, placedSymbol);
auto placed = collisionIndex.placeFeature(symbolInstance.iconCollisionFeature, {},
- posMatrix, iconLabelPlaneMatrix, textPixelRatio,
- placedSymbol, scale, fontSize,
+ params.posMatrix, params.iconLabelPlaneMatrix, params.pixelRatio,
+ placedSymbol, params.scale, fontSize,
bucket.layout.get<style::IconAllowOverlap>(),
pitchWithMap,
- showCollisionBoxes, avoidEdges, collisionGroup.second);
+ params.showCollisionBoxes, avoidEdges, params.collisionGroup.second);
placeIcon = placed.first;
offscreen &= placed.second;
}
@@ -312,11 +313,11 @@ void Placement::placeLayerBucket(
}
if (placeText) {
- collisionIndex.insertFeature(symbolInstance.textCollisionFeature, bucket.layout.get<style::TextIgnorePlacement>(), bucket.bucketInstanceId, collisionGroup.first);
+ collisionIndex.insertFeature(symbolInstance.textCollisionFeature, bucket.layout.get<style::TextIgnorePlacement>(), bucket.bucketInstanceId, params.collisionGroup.first);
}
if (placeIcon) {
- collisionIndex.insertFeature(symbolInstance.iconCollisionFeature, bucket.layout.get<style::IconIgnorePlacement>(), bucket.bucketInstanceId, collisionGroup.first);
+ collisionIndex.insertFeature(symbolInstance.iconCollisionFeature, bucket.layout.get<style::IconIgnorePlacement>(), bucket.bucketInstanceId, params.collisionGroup.first);
}
assert(symbolInstance.crossTileID != 0);
@@ -398,10 +399,7 @@ void Placement::commit(TimePoint now) {
void Placement::updateLayerOpacities(const RenderLayer& layer) {
std::set<uint32_t> seenCrossTileIDs;
for (const auto& item : layer.getPlacementData()) {
- Bucket& bucket = item.bucket;
- auto& symbolBucket = static_cast<SymbolBucket&>(bucket);
-
- updateBucketOpacities(symbolBucket, seenCrossTileIDs);
+ item.bucket.get().updateOpacities(*this, seenCrossTileIDs);
}
}