Browse Source

Merge pull request #51286 from KoBeWi/get_used_REKT

Fix get_used_rect() calculation
Rémi Verschelde 4 years ago
parent
commit
0ee6f1ac91
2 changed files with 17 additions and 11 deletions
  1. 15 9
      scene/2d/tile_map.cpp
  2. 2 2
      scene/2d/tile_map.h

+ 15 - 9
scene/2d/tile_map.cpp

@@ -1576,7 +1576,7 @@ void TileMap::set_cell(int p_layer, const Vector2i &p_coords, int p_source_id, c
 			_make_quadrant_dirty(Q);
 			_make_quadrant_dirty(Q);
 		}
 		}
 
 
-		used_size_cache_dirty = true;
+		used_rect_cache_dirty = true;
 	} else {
 	} else {
 		if (!E) {
 		if (!E) {
 			// Insert a new cell in the tile map.
 			// Insert a new cell in the tile map.
@@ -1604,7 +1604,7 @@ void TileMap::set_cell(int p_layer, const Vector2i &p_coords, int p_source_id, c
 		c.alternative_tile = alternative_tile;
 		c.alternative_tile = alternative_tile;
 
 
 		_make_quadrant_dirty(Q);
 		_make_quadrant_dirty(Q);
-		used_size_cache_dirty = true;
+		used_rect_cache_dirty = true;
 	}
 	}
 }
 }
 
 
@@ -1800,7 +1800,7 @@ void TileMap::clear_layer(int p_layer) {
 	_clear_layer_internals(p_layer);
 	_clear_layer_internals(p_layer);
 	layers[p_layer].tile_map.clear();
 	layers[p_layer].tile_map.clear();
 
 
-	used_size_cache_dirty = true;
+	used_rect_cache_dirty = true;
 }
 }
 
 
 void TileMap::clear() {
 void TileMap::clear() {
@@ -1809,7 +1809,7 @@ void TileMap::clear() {
 	for (unsigned int i = 0; i < layers.size(); i++) {
 	for (unsigned int i = 0; i < layers.size(); i++) {
 		layers[i].tile_map.clear();
 		layers[i].tile_map.clear();
 	}
 	}
-	used_size_cache_dirty = true;
+	used_rect_cache_dirty = true;
 }
 }
 
 
 void TileMap::_set_tile_data(int p_layer, const Vector<int> &p_data) {
 void TileMap::_set_tile_data(int p_layer, const Vector<int> &p_data) {
@@ -2666,25 +2666,31 @@ TypedArray<Vector2i> TileMap::get_used_cells(int p_layer) const {
 
 
 Rect2 TileMap::get_used_rect() { // Not const because of cache
 Rect2 TileMap::get_used_rect() { // Not const because of cache
 	// Return the rect of the currently used area
 	// Return the rect of the currently used area
-	if (used_size_cache_dirty) {
+	if (used_rect_cache_dirty) {
 		bool first = true;
 		bool first = true;
+		used_rect_cache = Rect2i();
+
 		for (unsigned int i = 0; i < layers.size(); i++) {
 		for (unsigned int i = 0; i < layers.size(); i++) {
 			const Map<Vector2i, TileMapCell> &tile_map = layers[i].tile_map;
 			const Map<Vector2i, TileMapCell> &tile_map = layers[i].tile_map;
 			if (tile_map.size() > 0) {
 			if (tile_map.size() > 0) {
 				if (first) {
 				if (first) {
-					used_size_cache = Rect2(tile_map.front()->key().x, tile_map.front()->key().y, 1, 1);
+					used_rect_cache = Rect2i(tile_map.front()->key().x, tile_map.front()->key().y, 0, 0);
 					first = false;
 					first = false;
 				}
 				}
 
 
 				for (Map<Vector2i, TileMapCell>::Element *E = tile_map.front(); E; E = E->next()) {
 				for (Map<Vector2i, TileMapCell>::Element *E = tile_map.front(); E; E = E->next()) {
-					used_size_cache.expand_to(Vector2(E->key().x + 1, E->key().y + 1));
+					used_rect_cache.expand_to(Vector2i(E->key().x, E->key().y));
 				}
 				}
 			}
 			}
 		}
 		}
-		used_size_cache_dirty = false;
+
+		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_dirty = false;
 	}
 	}
 
 
-	return used_size_cache;
+	return used_rect_cache;
 }
 }
 
 
 // --- Override some methods of the CanvasItem class to pass the changes to the quadrants CanvasItems ---
 // --- Override some methods of the CanvasItem class to pass the changes to the quadrants CanvasItems ---

+ 2 - 2
scene/2d/tile_map.h

@@ -213,8 +213,8 @@ private:
 	// Rect.
 	// Rect.
 	Rect2 rect_cache;
 	Rect2 rect_cache;
 	bool rect_cache_dirty = true;
 	bool rect_cache_dirty = true;
-	Rect2 used_size_cache;
-	bool used_size_cache_dirty = true;
+	Rect2i used_rect_cache;
+	bool used_rect_cache_dirty = true;
 
 
 	// TileMap layers.
 	// TileMap layers.
 	struct TileMapLayer {
 	struct TileMapLayer {