From 78881831e7c3739b53c8ab905dfb289a932008a3 Mon Sep 17 00:00:00 2001 From: Rakka Rage Date: Wed, 25 Oct 2023 11:00:33 -0400 Subject: [PATCH] Don't modify source `TileMap` `TileSetAtlasSource` when copy from one scene to another --- doc/classes/TileSet.xml | 1 - doc/classes/TileSetSource.xml | 1 - scene/2d/tile_map.cpp | 4 +++- scene/resources/tile_set.cpp | 25 ++----------------------- scene/resources/tile_set.h | 2 -- 5 files changed, 5 insertions(+), 28 deletions(-) diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml index 37f4cc5c0b23..e2706e7c8de5 100644 --- a/doc/classes/TileSet.xml +++ b/doc/classes/TileSet.xml @@ -68,7 +68,6 @@ Adds a [TileSetSource] to the TileSet. If [param atlas_source_id_override] is not -1, also set its source ID. Otherwise, a unique identifier is automatically generated. The function returns the added source ID or -1 if the source could not be added. - [b]Warning:[/b] A source cannot belong to two TileSets at the same time. If the added source was attached to another [TileSet], it will be removed from that one. diff --git a/doc/classes/TileSetSource.xml b/doc/classes/TileSetSource.xml index 70df23324c6e..5b68a7de6079 100644 --- a/doc/classes/TileSetSource.xml +++ b/doc/classes/TileSetSource.xml @@ -8,7 +8,6 @@ Tiles in a source are indexed with two IDs, coordinates ID (of type Vector2i) and an alternative ID (of type int), named according to their use in the [TileSetAtlasSource] class. Depending on the TileSet source type, those IDs might have restrictions on their values, this is why the base [TileSetSource] class only exposes getters for them. You can iterate over all tiles exposed by a TileSetSource by first iterating over coordinates IDs using [method get_tiles_count] and [method get_tile_id], then over alternative IDs using [method get_alternative_tiles_count] and [method get_alternative_tile_id]. - [b]Warning:[/b] [TileSetSource] can only be added to one TileSet at the same time. Calling [method TileSet.add_source] on a second [TileSet] will remove the source from the first one. diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index b6da4d5082bf..0034acf333e6 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -2130,7 +2130,9 @@ TileData *TileMapLayer::get_cell_tile_data(const Vector2i &p_coords, bool p_use_ const Ref &tile_set = tile_map_node->get_tileset(); Ref source = tile_set->get_source(source_id); if (source.is_valid()) { - return source->get_tile_data(get_cell_atlas_coords(p_coords, p_use_proxies), get_cell_alternative_tile(p_coords, p_use_proxies)); + TileData *tile_data = source->get_tile_data(get_cell_atlas_coords(p_coords, p_use_proxies), get_cell_alternative_tile(p_coords, p_use_proxies)); + tile_data->set_tile_set(*tile_set); + return tile_data; } return nullptr; diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 121d29b728d5..95e6ceb937dc 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -479,11 +479,6 @@ int TileSet::add_source(Ref p_tile_set_source, int p_atlas_source sources[new_source_id] = p_tile_set_source; source_ids.push_back(new_source_id); source_ids.sort(); - TileSet *old_tileset = p_tile_set_source->get_tile_set(); - if (old_tileset != this && old_tileset != nullptr) { - // If the source is already in a TileSet (might happen when duplicating), remove it from the other TileSet. - old_tileset->remove_source_ptr(p_tile_set_source.ptr()); - } p_tile_set_source->set_tile_set(this); _compute_next_source_id(); @@ -509,16 +504,6 @@ void TileSet::remove_source(int p_source_id) { emit_changed(); } -void TileSet::remove_source_ptr(TileSetSource *p_tile_set_source) { - for (const KeyValue> &kv : sources) { - if (kv.value.ptr() == p_tile_set_source) { - remove_source(kv.key); - return; - } - } - ERR_FAIL_MSG(vformat("Attempting to remove source from a tileset, but the tileset doesn't have it: %s", p_tile_set_source)); -} - void TileSet::set_source_id(int p_source_id, int p_new_source_id) { ERR_FAIL_COND(p_new_source_id < 0); ERR_FAIL_COND_MSG(!sources.has(p_source_id), vformat("Cannot change TileSet atlas source ID. No tileset atlas source with id %d.", p_source_id)); @@ -3159,11 +3144,9 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else if (components.size() == 2 && components[0] == "sources" && components[1].is_valid_int()) { // Create source only if it does not exists. int source_id = components[1].to_int(); - - if (has_source(source_id)) { - remove_source(source_id); + if (!has_source(source_id)) { + add_source(p_value, source_id); } - add_source(p_value, source_id); return true; } else if (components.size() == 2 && components[0] == "tile_proxies") { ERR_FAIL_COND_V(p_value.get_type() != Variant::ARRAY, false); @@ -3608,10 +3591,6 @@ void TileSetSource::set_tile_set(const TileSet *p_tile_set) { tile_set = p_tile_set; } -TileSet *TileSetSource::get_tile_set() const { - return (TileSet *)tile_set; -} - void TileSetSource::reset_state() { tile_set = nullptr; }; diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 313c4df65de3..69a5399785f2 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -420,7 +420,6 @@ class TileSet : public Resource { int add_source(Ref p_tile_set_source, int p_source_id_override = -1); void set_source_id(int p_source_id, int p_new_id); void remove_source(int p_source_id); - void remove_source_ptr(TileSetSource *p_tile_set_source); // Not exposed bool has_source(int p_source_id) const; Ref get_source(int p_source_id) const; @@ -556,7 +555,6 @@ class TileSetSource : public Resource { // Not exposed. virtual void set_tile_set(const TileSet *p_tile_set); - TileSet *get_tile_set() const; virtual void notify_tile_data_properties_should_change(){}; virtual void add_occlusion_layer(int p_index){}; virtual void move_occlusion_layer(int p_from_index, int p_to_pos){};