Просмотр исходного кода

Merge pull request #63496 from groud/fix_tile_set_not_saving

Fix TileSet not loading correctly when embedded in a scene
Rémi Verschelde 3 лет назад
Родитель
Сommit
222e489dfd

+ 5 - 5
editor/plugins/tiles/tiles_editor_plugin.cpp

@@ -226,14 +226,14 @@ void TilesEditorPlugin::synchronize_sources_list(Object *p_current_list, Object
 	}
 
 	if (item_list->is_visible_in_tree()) {
+		// Make sure the selection is not overwritten after sorting.
+		int atlas_sources_lists_current_mem = atlas_sources_lists_current;
+		item_list->emit_signal(SNAME("sort_request"));
+		atlas_sources_lists_current = atlas_sources_lists_current_mem;
+
 		if (atlas_sources_lists_current < 0 || atlas_sources_lists_current >= item_list->get_item_count()) {
 			item_list->deselect_all();
 		} else {
-			// Make sure the selection is not overwritten after sorting.
-			int atlas_sources_lists_current_mem = atlas_sources_lists_current;
-			item_list->emit_signal(SNAME("sort_request"));
-			atlas_sources_lists_current = atlas_sources_lists_current_mem;
-
 			item_list->set_current(atlas_sources_lists_current);
 			item_list->ensure_current_is_visible();
 			item_list->emit_signal(SNAME("item_selected"), atlas_sources_lists_current);

+ 45 - 10
scene/resources/tile_set.cpp

@@ -2467,9 +2467,42 @@ Vector<Point2> TileSet::_get_half_offset_side_terrain_peering_bit_polygon(Vector
 }
 
 void TileSet::reset_state() {
+	// Rendering
 	occlusion_layers.clear();
+	tile_lines_mesh.instantiate();
+	tile_filled_mesh.instantiate();
+	tile_meshes_dirty = true;
+
+	// Physics
 	physics_layers.clear();
+
+	// Terrains
+	terrain_sets.clear();
+	terrain_meshes.clear();
+	terrain_peering_bits_meshes.clear();
+	per_terrain_pattern_tiles.clear();
+	terrains_cache_dirty = true;
+
+	// Navigation
+	navigation_layers.clear();
+
 	custom_data_layers.clear();
+	custom_data_layers_by_name.clear();
+
+	// Proxies
+	source_level_proxies.clear();
+	coords_level_proxies.clear();
+	alternative_level_proxies.clear();
+
+#ifndef DISABLE_DEPRECATED
+	for (const KeyValue<int, CompatibilityTileData *> &E : compatibility_data) {
+		memdelete(E.value);
+	}
+	compatibility_data.clear();
+#endif // DISABLE_DEPRECATED
+	while (!source_ids.is_empty()) {
+		remove_source(source_ids[0]);
+	}
 }
 
 const Vector2i TileSetSource::INVALID_ATLAS_COORDS = Vector2i(-1, -1);
@@ -3457,6 +3490,10 @@ void TileSetSource::set_tile_set(const TileSet *p_tile_set) {
 	tile_set = p_tile_set;
 }
 
+void TileSetSource::reset_state() {
+	tile_set = nullptr;
+};
+
 void TileSetSource::_bind_methods() {
 	// Base tiles
 	ClassDB::bind_method(D_METHOD("get_tiles_count"), &TileSetSource::get_tiles_count);
@@ -3640,12 +3677,17 @@ void TileSetAtlasSource::remove_custom_data_layer(int p_index) {
 }
 
 void TileSetAtlasSource::reset_state() {
-	// Reset all TileData.
+	tile_set = nullptr;
+
 	for (KeyValue<Vector2i, TileAlternativesData> &E_tile : tiles) {
-		for (KeyValue<int, TileData *> &E_alternative : E_tile.value.alternatives) {
-			E_alternative.value->reset_state();
+		for (const KeyValue<int, TileData *> &E_tile_data : E_tile.value.alternatives) {
+			memdelete(E_tile_data.value);
 		}
 	}
+	_coords_mapping_cache.clear();
+	tiles.clear();
+	tiles_ids.clear();
+	_queue_update_padded_texture();
 }
 
 void TileSetAtlasSource::set_texture(Ref<Texture2D> p_texture) {
@@ -4975,13 +5017,6 @@ void TileData::remove_custom_data_layer(int p_index) {
 	custom_data.remove_at(p_index);
 }
 
-void TileData::reset_state() {
-	occluders.clear();
-	physics.clear();
-	navigation.clear();
-	custom_data.clear();
-}
-
 void TileData::set_allow_transform(bool p_allow_transform) {
 	allow_transform = p_allow_transform;
 }

+ 1 - 2
scene/resources/tile_set.h

@@ -569,7 +569,7 @@ public:
 	virtual void add_custom_data_layer(int p_index){};
 	virtual void move_custom_data_layer(int p_from_index, int p_to_pos){};
 	virtual void remove_custom_data_layer(int p_index){};
-	virtual void reset_state() override{};
+	virtual void reset_state() override;
 
 	// Tiles.
 	virtual int get_tiles_count() const = 0;
@@ -847,7 +847,6 @@ public:
 	void add_custom_data_layer(int p_index);
 	void move_custom_data_layer(int p_from_index, int p_to_pos);
 	void remove_custom_data_layer(int p_index);
-	void reset_state();
 	void set_allow_transform(bool p_allow_transform);
 	bool is_allowing_transform() const;