[core] don't assign clip IDs to tiles that aren't rendered

This commit is contained in:
Konstantin Käfer
2016-11-01 16:14:33 +01:00
parent 3b38cf48b7
commit bcdbbbcac2
9 changed files with 44 additions and 3 deletions

View File

@@ -15,6 +15,10 @@ void ClipIDGenerator::update(Renderables& renderables) {
for (auto it = renderables.begin(); it != end; it++) {
auto& tileID = it->first;
auto& renderable = it->second;
if (!renderable.used) {
continue;
}
renderable.clip = {};
Leaf leaf{ renderable.clip };
@@ -58,6 +62,9 @@ void ClipIDGenerator::update(Renderables& renderables) {
uint8_t count = 1;
for (auto& pair : renderables) {
auto& renderable = pair.second;
if (!renderable.used) {
continue;
}
renderable.clip.mask |= mask;
// Assign only to clip IDs that have no value yet.

View File

@@ -24,6 +24,7 @@ public:
Tile& tile;
ClipID clip;
mat4 matrix;
bool used = false;
mat4 translatedMatrix(const std::array<float, 2>& translate,
style::TranslateAnchorType anchor,

View File

@@ -70,11 +70,13 @@ void Source::Impl::startRender(algorithm::ClipIDGenerator& generator,
void Source::Impl::finishRender(Painter& painter) {
for (auto& pair : renderTiles) {
auto& tile = pair.second;
painter.renderTileDebug(tile);
if (tile.used) {
painter.renderTileDebug(tile);
}
}
}
const std::map<UnwrappedTileID, RenderTile>& Source::Impl::getRenderTiles() const {
std::map<UnwrappedTileID, RenderTile>& Source::Impl::getRenderTiles() {
return renderTiles;
}

View File

@@ -63,7 +63,7 @@ public:
const TransformState&);
void finishRender(Painter&);
const std::map<UnwrappedTileID, RenderTile>& getRenderTiles() const;
std::map<UnwrappedTileID, RenderTile>& getRenderTiles();
std::unordered_map<std::string, std::vector<Feature>>
queryRenderedFeatures(const QueryParameters&) const;

View File

@@ -404,6 +404,7 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions) const {
auto bucket = tile.tile.getBucket(*layer);
if (bucket) {
result.order.emplace_back(*layer, &tile, bucket);
tile.used = true;
}
}
}

View File

@@ -6,6 +6,7 @@ using namespace mbgl;
struct Renderable {
ClipID clip;
bool used = true;
bool operator==(const Renderable& rhs) const {
return clip == rhs.clip;

View File

@@ -419,3 +419,32 @@ TEST(Annotations, VisibleFeatures) {
features.erase(std::unique(features.begin(), features.end(), sameID), features.end());
EXPECT_EQ(features.size(), ids.size());
}
TEST(Annotations, DebugEmpty) {
// This test should render nothing, not even the tile borders. Tile borders are only rendered
// when there is an actual tile we're trying to render, but since there is no annotation, we
// should not render them.
AnnotationTest test;
test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"));
test.map.setDebug(MapDebugOptions::TileBorders);
test.map.setZoom(1);
test.checkRendering("debug_empty");
}
TEST(Annotations, DebugSparse) {
// This test should only render the top right tile with the associated tile border, but no other
// tiles because they're all empty.
AnnotationTest test;
test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"));
test.map.setDebug(MapDebugOptions::TileBorders);
test.map.setZoom(1);
test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png"));
test.map.addAnnotation(SymbolAnnotation { Point<double>(10, 10), "default_marker" });
test.checkRendering("debug_sparse");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB