소스 검색

Merge pull request #107559 from groud/remove_get_used_cells_where_possible

Remove `get_used_cells` to avoid unecessary allocations in navigation baking
Rémi Verschelde 1 개월 전
부모
커밋
31892b13b5
2개의 변경된 파일15개의 추가작업 그리고 18개의 파일을 삭제
  1. 13 15
      editor/plugins/tiles/tiles_editor_plugin.cpp
  2. 2 3
      scene/2d/tile_map_layer.cpp

+ 13 - 15
editor/plugins/tiles/tiles_editor_plugin.cpp

@@ -93,25 +93,23 @@ void TilesEditorUtils::_thread() {
 				viewport->set_transparent_background(true);
 				viewport->set_update_mode(SubViewport::UPDATE_ONCE);
 
-				TileMap *tile_map = memnew(TileMap);
-				tile_map->set_tileset(item.tile_set);
-				tile_map->set_pattern(0, Vector2(), item.pattern);
-				viewport->add_child(tile_map);
-
-				TypedArray<Vector2i> used_cells = tile_map->get_used_cells(0);
+				TileMapLayer *tile_map_layer = memnew(TileMapLayer);
+				tile_map_layer->set_tile_set(item.tile_set);
+				tile_map_layer->set_pattern(Vector2(), item.pattern);
+				viewport->add_child(tile_map_layer);
 
 				Rect2 encompassing_rect;
-				encompassing_rect.set_position(tile_map->map_to_local(used_cells[0]));
-				for (int i = 0; i < used_cells.size(); i++) {
-					Vector2i cell = used_cells[i];
-					Vector2 world_pos = tile_map->map_to_local(cell);
+				encompassing_rect.set_position(tile_map_layer->map_to_local(tile_map_layer->get_tile_map_layer_data().begin()->key));
+				for (KeyValue<Vector2i, CellData> kv : tile_map_layer->get_tile_map_layer_data()) {
+					Vector2i cell = kv.key;
+					Vector2 world_pos = tile_map_layer->map_to_local(cell);
 					encompassing_rect.expand_to(world_pos);
 
 					// Texture.
-					Ref<TileSetAtlasSource> atlas_source = item.tile_set->get_source(tile_map->get_cell_source_id(0, cell));
+					Ref<TileSetAtlasSource> atlas_source = item.tile_set->get_source(tile_map_layer->get_cell_source_id(cell));
 					if (atlas_source.is_valid()) {
-						Vector2i coords = tile_map->get_cell_atlas_coords(0, cell);
-						int alternative = tile_map->get_cell_alternative_tile(0, cell);
+						Vector2i coords = tile_map_layer->get_cell_atlas_coords(cell);
+						int alternative = tile_map_layer->get_cell_alternative_tile(cell);
 
 						if (atlas_source->has_tile(coords) && atlas_source->has_alternative_tile(coords, alternative)) {
 							Vector2 center = world_pos - atlas_source->get_tile_data(coords, alternative)->get_texture_origin();
@@ -122,8 +120,8 @@ void TilesEditorUtils::_thread() {
 				}
 
 				Vector2 scale = thumbnail_size2 / MAX(encompassing_rect.size.x, encompassing_rect.size.y);
-				tile_map->set_scale(scale);
-				tile_map->set_position(-(scale * encompassing_rect.get_center()) + thumbnail_size2 / 2);
+				tile_map_layer->set_scale(scale);
+				tile_map_layer->set_position(-(scale * encompassing_rect.get_center()) + thumbnail_size2 / 2);
 
 				// Add the viewport at the last moment to avoid rendering too early.
 				callable_mp((Node *)EditorNode::get_singleton(), &Node::add_child).call_deferred(viewport, false, Node::INTERNAL_MODE_DISABLED);

+ 2 - 3
scene/2d/tile_map_layer.cpp

@@ -3447,9 +3447,8 @@ void TileMapLayer::navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p
 
 	const Transform2D tilemap_xform = p_source_geometry_data->root_node_transform * tile_map_layer->get_global_transform();
 
-	TypedArray<Vector2i> used_cells = tile_map_layer->get_used_cells();
-	for (int used_cell_index = 0; used_cell_index < used_cells.size(); used_cell_index++) {
-		const Vector2i &cell = used_cells[used_cell_index];
+	for (KeyValue<Vector2i, CellData> kv : tile_map_layer->get_tile_map_layer_data()) {
+		const Vector2i &cell = kv.key;
 
 		const TileData *tile_data = tile_map_layer->get_cell_tile_data(cell);
 		if (tile_data == nullptr) {