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

[core] Store type of renderable segment when sorting symbols by key #14517

Merged
merged 1 commit into from
Apr 26, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
alexshalamov marked this conversation as resolved.
Show resolved Hide resolved
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