Merge pull request #81423 from kleonc/tile-map-get-used-rect-fix
Fix `TileMap::get_used_rect` incorrectly handling empty layers
This commit is contained in:
commit
64fce49dc6
1 changed files with 15 additions and 15 deletions
|
@ -2288,21 +2288,14 @@ TypedArray<Vector2i> TileMapLayer::get_used_cells_by_id(int p_source_id, const V
|
||||||
Rect2i TileMapLayer::get_used_rect() const {
|
Rect2i TileMapLayer::get_used_rect() const {
|
||||||
// Return the rect of the currently used area.
|
// Return the rect of the currently used area.
|
||||||
if (used_rect_cache_dirty) {
|
if (used_rect_cache_dirty) {
|
||||||
bool first = true;
|
|
||||||
used_rect_cache = Rect2i();
|
used_rect_cache = Rect2i();
|
||||||
|
|
||||||
if (tile_map.size() > 0) {
|
if (tile_map.size() > 0) {
|
||||||
if (first) {
|
|
||||||
used_rect_cache = Rect2i(tile_map.begin()->key.x, tile_map.begin()->key.y, 0, 0);
|
used_rect_cache = Rect2i(tile_map.begin()->key.x, tile_map.begin()->key.y, 0, 0);
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const KeyValue<Vector2i, CellData> &E : tile_map) {
|
for (const KeyValue<Vector2i, CellData> &E : tile_map) {
|
||||||
used_rect_cache.expand_to(Vector2i(E.key.x, E.key.y));
|
used_rect_cache.expand_to(E.key);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!first) { // first is true if every layer is empty.
|
|
||||||
used_rect_cache.size += Vector2i(1, 1); // The cache expands to top-left coordinate, so we add one full tile.
|
used_rect_cache.size += Vector2i(1, 1); // The cache expands to top-left coordinate, so we add one full tile.
|
||||||
}
|
}
|
||||||
used_rect_cache_dirty = false;
|
used_rect_cache_dirty = false;
|
||||||
|
@ -4239,12 +4232,19 @@ TypedArray<Vector2i> TileMap::get_used_cells_by_id(int p_layer, int p_source_id,
|
||||||
|
|
||||||
Rect2i TileMap::get_used_rect() const {
|
Rect2i TileMap::get_used_rect() const {
|
||||||
// Return the visible rect of the tilemap.
|
// Return the visible rect of the tilemap.
|
||||||
if (layers.is_empty()) {
|
bool first = true;
|
||||||
return Rect2i();
|
Rect2i rect = Rect2i();
|
||||||
|
for (const Ref<TileMapLayer> &layer : layers) {
|
||||||
|
Rect2i layer_rect = layer->get_used_rect();
|
||||||
|
if (layer_rect == Rect2i()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (first) {
|
||||||
|
rect = layer_rect;
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
rect = rect.merge(layer_rect);
|
||||||
}
|
}
|
||||||
Rect2 rect = layers[0]->get_used_rect();
|
|
||||||
for (unsigned int i = 1; i < layers.size(); i++) {
|
|
||||||
rect = rect.merge(layers[i]->get_used_rect());
|
|
||||||
}
|
}
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue