[core] make symbol sort order more deterministic
This commit is contained in:
@@ -26,7 +26,7 @@
|
||||
],
|
||||
"devDependencies": {
|
||||
"aws-sdk": "^2.2.21",
|
||||
"mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#67fe48d058c23dbb4a8ac36ce0270185da3045a8",
|
||||
"mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#7ebad0438ea47721235434f56eb0dba2db66ddb5",
|
||||
"node-gyp": "^3.2.1",
|
||||
"request": "^2.67.0",
|
||||
"tape": "^4.2.2"
|
||||
|
||||
@@ -31,12 +31,13 @@ namespace mbgl {
|
||||
|
||||
SymbolInstance::SymbolInstance(Anchor& anchor, const std::vector<Coordinate>& line,
|
||||
const Shaping& shapedText, const PositionedIcon& shapedIcon,
|
||||
const SymbolLayoutProperties& layout, const bool addToBuffers,
|
||||
const SymbolLayoutProperties& layout, const bool addToBuffers, const uint32_t index_,
|
||||
const float textBoxScale, const float textPadding, const float textAlongLine,
|
||||
const float iconBoxScale, const float iconPadding, const float iconAlongLine,
|
||||
const GlyphPositions& face) :
|
||||
x(anchor.x),
|
||||
y(anchor.y),
|
||||
index(index_),
|
||||
hasText(shapedText),
|
||||
hasIcon(shapedIcon),
|
||||
|
||||
@@ -333,7 +334,7 @@ void SymbolBucket::addFeature(const std::vector<std::vector<Coordinate>> &lines,
|
||||
// TODO remove the `&& false` when is #1673 implemented
|
||||
const bool addToBuffers = (mode == MapMode::Still) || inside || (mayOverlap && false);
|
||||
|
||||
symbolInstances.emplace_back(anchor, line, shapedText, shapedIcon, layout, addToBuffers,
|
||||
symbolInstances.emplace_back(anchor, line, shapedText, shapedIcon, layout, addToBuffers, symbolInstances.size(),
|
||||
textBoxScale, textPadding, textAlongLine,
|
||||
iconBoxScale, iconPadding, iconAlongLine,
|
||||
face);
|
||||
@@ -382,9 +383,11 @@ void SymbolBucket::placeFeatures(CollisionTile& collisionTile) {
|
||||
const float cos = std::cos(collisionTile.config.angle);
|
||||
|
||||
std::sort(symbolInstances.begin(), symbolInstances.end(), [sin, cos](SymbolInstance &a, SymbolInstance &b) {
|
||||
const float aRotated = sin * a.x + cos * a.y;
|
||||
const float bRotated = sin * b.x + cos * b.y;
|
||||
return aRotated < bRotated;
|
||||
const int32_t aRotated = sin * a.x + cos * a.y;
|
||||
const int32_t bRotated = sin * b.x + cos * b.y;
|
||||
return aRotated != bRotated ?
|
||||
aRotated < bRotated :
|
||||
a.index > b.index;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -46,12 +46,13 @@ class SymbolInstance {
|
||||
public:
|
||||
explicit SymbolInstance(Anchor& anchor, const std::vector<Coordinate>& line,
|
||||
const Shaping& shapedText, const PositionedIcon& shapedIcon,
|
||||
const SymbolLayoutProperties& layout, const bool inside,
|
||||
const SymbolLayoutProperties& layout, const bool inside, const uint32_t index,
|
||||
const float textBoxScale, const float textPadding, const float textAlongLine,
|
||||
const float iconBoxScale, const float iconPadding, const float iconAlongLine,
|
||||
const GlyphPositions& face);
|
||||
float x;
|
||||
float y;
|
||||
uint32_t index;
|
||||
bool hasText;
|
||||
bool hasIcon;
|
||||
SymbolQuads glyphQuads;
|
||||
|
||||
Reference in New Issue
Block a user