diff options
author | zmiao <miao.zhao@mapbox.com> | 2019-08-30 08:24:03 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-30 08:24:03 +0300 |
commit | 6ef2710e5cfb5ee4258583a20d55320e90faa8a5 (patch) | |
tree | 1c840291ea93ec38c2745348678879f10217bf7c /src/mbgl/layout | |
parent | 29b11a503766efb469036b38f010400cea57967e (diff) | |
download | qtlocation-mapboxgl-6ef2710e5cfb5ee4258583a20d55320e90faa8a5.tar.gz |
[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
Diffstat (limited to 'src/mbgl/layout')
-rw-r--r-- | src/mbgl/layout/symbol_layout.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index fe169785ce..0ee4143894 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -812,12 +812,15 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) { return; } - for (const SymbolInstance &symbolInstance : symbolInstances) { - auto populateCollisionBox = [&](const auto& feature) { - SymbolBucket::CollisionBuffer& collisionBuffer = feature.alongLine ? - static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateCollisionCircleBuffer()) : - static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateCollisionBox()); - for (const CollisionBox &box : feature.boxes) { + for (const SymbolInstance& symbolInstance : symbolInstances) { + auto populateCollisionBox = [&](const auto& feature, bool isText) { + SymbolBucket::CollisionBuffer& collisionBuffer = + feature.alongLine ? (isText ? static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateTextCollisionCircleBuffer()) + : static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateIconCollisionCircleBuffer())) + : (isText ? static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateTextCollisionBox()) + : static_cast<SymbolBucket::CollisionBuffer&>(bucket.getOrCreateIconCollisionBox())); + + for (const CollisionBox& box : feature.boxes) { auto& anchor = box.anchor; Point<float> tl{box.x1, box.y1}; @@ -829,8 +832,11 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) { const std::size_t indexLength = feature.alongLine ? 6 : 8; if (collisionBuffer.segments.empty() || collisionBuffer.segments.back().vertexLength + vertexLength > std::numeric_limits<uint16_t>::max()) { - collisionBuffer.segments.emplace_back(collisionBuffer.vertices.elements(), - feature.alongLine ? bucket.collisionCircle->triangles.elements() : bucket.collisionBox->lines.elements()); + collisionBuffer.segments.emplace_back( + collisionBuffer.vertices.elements(), + feature.alongLine + ? (isText ? bucket.textCollisionCircle->triangles.elements() : bucket.iconCollisionCircle->triangles.elements()) + : (isText ? bucket.textCollisionBox->lines.elements() : bucket.iconCollisionBox->lines.elements())); } auto& segment = collisionBuffer.segments.back(); @@ -850,27 +856,29 @@ void SymbolLayout::addToDebugBuffers(SymbolBucket& bucket) { collisionBuffer.dynamicVertices.emplace_back(dynamicVertex); if (feature.alongLine) { - bucket.collisionCircle->triangles.emplace_back(index, index + 1, index + 2); - bucket.collisionCircle->triangles.emplace_back(index, index + 2, index + 3); + auto& collisionCircle = (isText ? bucket.textCollisionCircle : bucket.iconCollisionCircle); + collisionCircle->triangles.emplace_back(index, index + 1, index + 2); + collisionCircle->triangles.emplace_back(index, index + 2, index + 3); } else { - bucket.collisionBox->lines.emplace_back(index + 0, index + 1); - bucket.collisionBox->lines.emplace_back(index + 1, index + 2); - bucket.collisionBox->lines.emplace_back(index + 2, index + 3); - bucket.collisionBox->lines.emplace_back(index + 3, index + 0); + auto& collisionBox = (isText ? bucket.textCollisionBox : bucket.iconCollisionBox); + collisionBox->lines.emplace_back(index + 0, index + 1); + collisionBox->lines.emplace_back(index + 1, index + 2); + collisionBox->lines.emplace_back(index + 2, index + 3); + collisionBox->lines.emplace_back(index + 3, index + 0); } segment.vertexLength += vertexLength; segment.indexLength += indexLength; } }; - populateCollisionBox(symbolInstance.textCollisionFeature); + populateCollisionBox(symbolInstance.textCollisionFeature, true /*isText*/); if (symbolInstance.verticalTextCollisionFeature) { - populateCollisionBox(*symbolInstance.verticalTextCollisionFeature); + populateCollisionBox(*symbolInstance.verticalTextCollisionFeature, true /*isText*/); } if (symbolInstance.verticalIconCollisionFeature) { - populateCollisionBox(*symbolInstance.verticalIconCollisionFeature); + populateCollisionBox(*symbolInstance.verticalIconCollisionFeature, false /*isText*/); } - populateCollisionBox(symbolInstance.iconCollisionFeature); + populateCollisionBox(symbolInstance.iconCollisionFeature, false /*isText*/); } } |