[core] make symbol sort order more deterministic

This commit is contained in:
Ansis Brammanis
2016-01-29 00:19:40 -08:00
parent 4e0d1070f6
commit 2cfc624848
3 changed files with 11 additions and 7 deletions

View File

@@ -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"

View File

@@ -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;
});
}

View File

@@ -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;