Browse Source

Merge pull request #13991 from CyanBlob/master

TileMap: Add update_bitmask_region(2), expose update_bitmask_area(1) …
Rémi Verschelde 7 years ago
parent
commit
caf3a405ab
2 changed files with 24 additions and 0 deletions
  1. 23 0
      scene/2d/tile_map.cpp
  2. 1 0
      scene/2d/tile_map.h

+ 23 - 0
scene/2d/tile_map.cpp

@@ -739,6 +739,26 @@ void TileMap::update_bitmask_area(const Vector2 &p_pos) {
 	}
 	}
 }
 }
 
 
+void TileMap::update_bitmask_region(const Vector2 &p_start, const Vector2 &p_end) {
+
+	if ((p_end.x < p_start.x || p_end.y < p_start.y) || (p_end.x == p_start.x && p_end.y == p_start.y)) {
+		int i;
+		Array a = get_used_cells();
+		for (i = 0; i < a.size(); i++) {
+			// update_bitmask_area() in order to update cells adjacent to the
+			// current cell, since ordering in array may not be reliable
+			Vector2 vector = (Vector2)a[i];
+			update_bitmask_area(Vector2(vector.x, vector.y));
+		}
+		return;
+	}
+	for (int x = p_start.x - 1; x <= p_end.x + 1; x++) {
+		for (int y = p_start.y - 1; y <= p_end.y + 1; y++) {
+			update_cell_bitmask(x, y);
+		}
+	}
+}
+
 void TileMap::update_cell_bitmask(int p_x, int p_y) {
 void TileMap::update_cell_bitmask(int p_x, int p_y) {
 
 
 	PosKey p(p_x, p_y);
 	PosKey p(p_x, p_y);
@@ -1507,6 +1527,9 @@ void TileMap::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_recreate_quadrants"), &TileMap::_recreate_quadrants);
 	ClassDB::bind_method(D_METHOD("_recreate_quadrants"), &TileMap::_recreate_quadrants);
 	ClassDB::bind_method(D_METHOD("_update_dirty_quadrants"), &TileMap::_update_dirty_quadrants);
 	ClassDB::bind_method(D_METHOD("_update_dirty_quadrants"), &TileMap::_update_dirty_quadrants);
 
 
+	ClassDB::bind_method(D_METHOD("update_bitmask_area"), &TileMap::update_bitmask_area);
+	ClassDB::bind_method(D_METHOD("update_bitmask_region", "start", "end"), &TileMap::update_bitmask_region, DEFVAL(Vector2()), DEFVAL(Vector2()));
+
 	ClassDB::bind_method(D_METHOD("_set_tile_data"), &TileMap::_set_tile_data);
 	ClassDB::bind_method(D_METHOD("_set_tile_data"), &TileMap::_set_tile_data);
 	ClassDB::bind_method(D_METHOD("_get_tile_data"), &TileMap::_get_tile_data);
 	ClassDB::bind_method(D_METHOD("_get_tile_data"), &TileMap::_get_tile_data);
 
 

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

@@ -245,6 +245,7 @@ public:
 
 
 	void make_bitmask_area_dirty(const Vector2 &p_pos);
 	void make_bitmask_area_dirty(const Vector2 &p_pos);
 	void update_bitmask_area(const Vector2 &p_pos);
 	void update_bitmask_area(const Vector2 &p_pos);
+	void update_bitmask_region(const Vector2 &p_start = Vector2(), const Vector2 &p_end = Vector2());
 	void update_cell_bitmask(int p_x, int p_y);
 	void update_cell_bitmask(int p_x, int p_y);
 	void update_dirty_bitmask();
 	void update_dirty_bitmask();