diff options
Diffstat (limited to 'scene/2d/tile_map.cpp')
| -rw-r--r-- | scene/2d/tile_map.cpp | 28 | 
1 files changed, 24 insertions, 4 deletions
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index d88e148b2c..1d60037287 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -466,10 +466,12 @@ void TileMap::_update_dirty_quadrants() {  						Transform2D xform;  						xform.set_origin(offset.floor()); -						Vector2 shape_ofs = tile_set->tile_get_shape_offset(c.id, i); +						Vector2 shape_ofs = shapes[i].shape_transform.get_origin();  						_fix_cell_transform(xform, c, shape_ofs + center_ofs, s); +						xform *= shapes[i].shape_transform.untranslated(); +  						if (debug_canvas_item.is_valid()) {  							vs->canvas_item_add_set_transform(debug_canvas_item, xform);  							shape->draw(debug_canvas_item, debug_collision_color); @@ -706,7 +708,7 @@ void TileMap::_erase_quadrant(Map<PosKey, Quadrant>::Element *Q) {  	rect_cache_dirty = true;  } -void TileMap::_make_quadrant_dirty(Map<PosKey, Quadrant>::Element *Q) { +void TileMap::_make_quadrant_dirty(Map<PosKey, Quadrant>::Element *Q, bool update) {  	Quadrant &q = Q->get();  	if (!q.dirty_list.in_list()) @@ -717,7 +719,10 @@ void TileMap::_make_quadrant_dirty(Map<PosKey, Quadrant>::Element *Q) {  	pending_update = true;  	if (!is_inside_tree())  		return; -	_update_dirty_quadrants(); + +	if (update) { +		_update_dirty_quadrants(); +	}  }  void TileMap::set_cellv(const Vector2 &p_pos, int p_tile, bool p_flip_x, bool p_flip_y, bool p_transpose) { @@ -725,6 +730,11 @@ void TileMap::set_cellv(const Vector2 &p_pos, int p_tile, bool p_flip_x, bool p_  	set_cell(p_pos.x, p_pos.y, p_tile, p_flip_x, p_flip_y, p_transpose);  } +void TileMap::set_celld(const Vector2 &p_pos, const Dictionary &p_data) { + +	set_cell(p_pos.x, p_pos.y, p_data["id"], p_data["flip_h"], p_data["flip_y"], p_data["transpose"], p_data["auto_coord"]); +} +  void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_y, bool p_transpose, Vector2 p_autotile_coord) {  	PosKey pk(p_x, p_y); @@ -977,6 +987,14 @@ void TileMap::set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord)  	c.autotile_coord_x = p_coord.x;  	c.autotile_coord_y = p_coord.y;  	tile_map[pk] = c; + +	PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size()); +	Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk); + +	if (!Q) +		return; + +	_make_quadrant_dirty(Q);  }  Vector2 TileMap::get_cell_autotile_coord(int p_x, int p_y) const { @@ -1006,8 +1024,9 @@ void TileMap::_recreate_quadrants() {  		}  		Q->get().cells.insert(E->key()); -		_make_quadrant_dirty(Q); +		_make_quadrant_dirty(Q, false);  	} +	_update_dirty_quadrants();  }  void TileMap::_clear_quadrants() { @@ -1602,6 +1621,7 @@ void TileMap::_bind_methods() {  	ClassDB::bind_method(D_METHOD("set_cell", "x", "y", "tile", "flip_x", "flip_y", "transpose", "autotile_coord"), &TileMap::set_cell, DEFVAL(false), DEFVAL(false), DEFVAL(false), DEFVAL(Vector2()));  	ClassDB::bind_method(D_METHOD("set_cellv", "position", "tile", "flip_x", "flip_y", "transpose"), &TileMap::set_cellv, DEFVAL(false), DEFVAL(false), DEFVAL(false)); +	ClassDB::bind_method(D_METHOD("set_celld", "data"), &TileMap::set_celld);  	ClassDB::bind_method(D_METHOD("get_cell", "x", "y"), &TileMap::get_cell);  	ClassDB::bind_method(D_METHOD("get_cellv", "position"), &TileMap::get_cellv);  	ClassDB::bind_method(D_METHOD("is_cell_x_flipped", "x", "y"), &TileMap::is_cell_x_flipped);  |