Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] CP #14517 - Store type of renderable segment when sorting symb…
Browse files Browse the repository at this point in the history
…ols by key
  • Loading branch information
alexshalamov committed Apr 26, 2019
1 parent 5276a2f commit e07f8fd
Showing 1 changed file with 31 additions and 15 deletions.
46 changes: 31 additions & 15 deletions src/mbgl/renderer/layers/render_symbol_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,25 +74,41 @@ struct RenderableSegment {
const RenderTile& tile_,
const LayerRenderData& renderData_,
const SymbolBucket::PaintProperties& bucketPaintProperties_,
float sortKey_) :
float sortKey_,
bool isText_) :
segment(std::move(segment_)),
tile(tile_),
renderData(renderData_),
bucketPaintProperties(bucketPaintProperties_),
sortKey(sortKey_) {}
sortKey(sortKey_),
isText(isText_) {}

SegmentWrapper segment;
const RenderTile& tile;
const LayerRenderData& renderData;
const SymbolBucket::PaintProperties& bucketPaintProperties;
float sortKey;

bool hasIconData() const {
return static_cast<const SymbolBucket&>(*renderData.bucket).hasIconData();
}
bool isText;

friend bool operator < (const RenderableSegment& lhs, const RenderableSegment& rhs) {
return lhs.sortKey < rhs.sortKey;
// Sort renderable segments by a sort key.
if (lhs.sortKey < rhs.sortKey) {
return true;
}

// In cases when sort key is the same, sort by the type of a segment (text over icons),
// and for segments of the same type with the same sort key, sort by a tile id.
if (lhs.sortKey == rhs.sortKey) {
if (!lhs.isText && rhs.isText) {
return true;
}

if (lhs.isText == rhs.isText) {
return lhs.tile.id < rhs.tile.id;
}
}

return false;
}
};

Expand Down Expand Up @@ -383,7 +399,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
}

const bool sortFeaturesByKey = !impl(baseImpl).layout.get<SymbolSortKey>().isUndefined();
std::set<RenderableSegment> renderableSegments;
std::multiset<RenderableSegment> renderableSegments;

const auto draw = [&parameters, this] (auto& programInstance,
const auto& uniformValues,
Expand Down Expand Up @@ -464,23 +480,23 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end());
const auto& bucketPaintProperties = bucket.paintProperties.at(getID());

auto addRenderables = [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()] (auto& segments) mutable {
auto addRenderables = [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()] (auto& segments, bool isText) mutable {
for (auto& segment : segments) {
it = renderableSegments.emplace_hint(it, SegmentWrapper{std::ref(segment)}, tile, *renderData, bucketPaintProperties, segment.sortKey);
it = renderableSegments.emplace_hint(it, SegmentWrapper{std::ref(segment)}, tile, *renderData, bucketPaintProperties, segment.sortKey, isText);
}
};

if (bucket.hasIconData()) {
if (sortFeaturesByKey) {
addRenderables(bucket.icon.segments);
addRenderables(bucket.icon.segments, false /*isText*/);
} else {
drawIcon(draw, tile, *renderData, std::ref(bucket.icon.segments), bucketPaintProperties, parameters);
}
}

if (bucket.hasTextData()) {
if (sortFeaturesByKey) {
addRenderables(bucket.text.segments);
addRenderables(bucket.text.segments, true /*isText*/);
} else {
drawText(draw, tile, *renderData, std::ref(bucket.text.segments), bucketPaintProperties, parameters);
}
Expand Down Expand Up @@ -565,10 +581,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {

if (sortFeaturesByKey) {
for (auto& renderable : renderableSegments) {
if (renderable.hasIconData()) {
drawIcon(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters);
} else {
if (renderable.isText) {
drawText(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters);
} else {
drawIcon(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters);
}
}
}
Expand Down

0 comments on commit e07f8fd

Please sign in to comment.