@@ -447,9 +447,11 @@ void TileMapLayer::_rendering_update() {
447447 for (KeyValue<Vector2i, CellData> &kv : tile_map) {
448448 CellData &cell_data = kv.value ;
449449 for (const RID &occluder : cell_data.occluders ) {
450- Transform2D xform (0 , tile_map_node->map_to_local (kv.key ));
451- rs->canvas_light_occluder_attach_to_canvas (occluder, tile_map_node->get_canvas ());
452- rs->canvas_light_occluder_set_transform (occluder, tile_map_node->get_global_transform () * xform);
450+ if (occluder.is_valid ()) {
451+ Transform2D xform (0 , tile_map_node->map_to_local (kv.key ));
452+ rs->canvas_light_occluder_attach_to_canvas (occluder, tile_map_node->get_canvas ());
453+ rs->canvas_light_occluder_set_transform (occluder, tile_map_node->get_global_transform () * xform);
454+ }
453455 }
454456 }
455457 }
@@ -565,6 +567,15 @@ void TileMapLayer::_rendering_occluders_update_cell(CellData &r_cell_data) {
565567 const Ref<TileSet> &tile_set = tile_map_node->get_tileset ();
566568 RenderingServer *rs = RenderingServer::get_singleton ();
567569
570+ // Free unused occluders then resize the occluders array.
571+ for (uint32_t i = tile_set->get_occlusion_layers_count (); i < r_cell_data.occluders .size (); i++) {
572+ RID occluder_id = r_cell_data.occluders [i];
573+ if (occluder_id.is_valid ()) {
574+ rs->free (occluder_id);
575+ }
576+ }
577+ r_cell_data.occluders .resize (tile_set->get_occlusion_layers_count ());
578+
568579 TileSetSource *source;
569580 if (tile_set->has_source (r_cell_data.cell .source_id )) {
570581 source = *tile_set->get_source (r_cell_data.cell .source_id );
@@ -580,18 +591,30 @@ void TileMapLayer::_rendering_occluders_update_cell(CellData &r_cell_data) {
580591 tile_data = atlas_source->get_tile_data (r_cell_data.cell .get_atlas_coords (), r_cell_data.cell .alternative_tile );
581592 }
582593
583- // Update/create occluders.
584- for (int i = 0 ; i < tile_set->get_occlusion_layers_count (); i++) {
585- Transform2D xform;
586- xform.set_origin (tile_map_node->map_to_local (r_cell_data.coords ));
587- if (tile_data->get_occluder (i).is_valid ()) {
588- RID occluder_id = rs->canvas_light_occluder_create ();
589- rs->canvas_light_occluder_set_enabled (occluder_id, node_visible);
590- rs->canvas_light_occluder_set_transform (occluder_id, tile_map_node->get_global_transform () * xform);
591- rs->canvas_light_occluder_set_polygon (occluder_id, tile_map_node->get_transformed_polygon (Ref<Resource>(tile_data->get_occluder (i)), r_cell_data.cell .alternative_tile )->get_rid ());
592- rs->canvas_light_occluder_attach_to_canvas (occluder_id, tile_map_node->get_canvas ());
593- rs->canvas_light_occluder_set_light_mask (occluder_id, tile_set->get_occlusion_layer_light_mask (i));
594- r_cell_data.occluders .push_back (occluder_id);
594+ // Create, update or clear occluders.
595+ for (uint32_t occlusion_layer_index = 0 ; occlusion_layer_index < r_cell_data.occluders .size (); occlusion_layer_index++) {
596+ Ref<OccluderPolygon2D> occluder_polygon = tile_data->get_occluder (occlusion_layer_index);
597+
598+ RID &occluder = r_cell_data.occluders [occlusion_layer_index];
599+
600+ if (occluder_polygon.is_valid ()) {
601+ // Create or update occluder.
602+ Transform2D xform;
603+ xform.set_origin (tile_map_node->map_to_local (r_cell_data.coords ));
604+ if (!occluder.is_valid ()) {
605+ occluder = rs->canvas_light_occluder_create ();
606+ }
607+ rs->canvas_light_occluder_set_enabled (occluder, node_visible);
608+ rs->canvas_light_occluder_set_transform (occluder, tile_map_node->get_global_transform () * xform);
609+ rs->canvas_light_occluder_set_polygon (occluder, tile_map_node->get_transformed_polygon (Ref<Resource>(tile_data->get_occluder (occlusion_layer_index)), r_cell_data.cell .alternative_tile )->get_rid ());
610+ rs->canvas_light_occluder_attach_to_canvas (occluder, tile_map_node->get_canvas ());
611+ rs->canvas_light_occluder_set_light_mask (occluder, tile_set->get_occlusion_layer_light_mask (occlusion_layer_index));
612+ } else {
613+ // Clear occluder.
614+ if (occluder.is_valid ()) {
615+ rs->free (occluder);
616+ occluder = RID ();
617+ }
595618 }
596619 }
597620
@@ -778,7 +801,7 @@ void TileMapLayer::_physics_update_cell(CellData &r_cell_data) {
778801 }
779802
780803 // Free unused bodies then resize the bodies array.
781- for (unsigned int i = tile_set->get_physics_layers_count (); i < r_cell_data.bodies .size (); i++) {
804+ for (uint32_t i = tile_set->get_physics_layers_count (); i < r_cell_data.bodies .size (); i++) {
782805 RID body = r_cell_data.bodies [i];
783806 if (body.is_valid ()) {
784807 bodies_coords.erase (body);
@@ -787,7 +810,7 @@ void TileMapLayer::_physics_update_cell(CellData &r_cell_data) {
787810 }
788811 r_cell_data.bodies .resize (tile_set->get_physics_layers_count ());
789812
790- for (int tile_set_physics_layer = 0 ; tile_set_physics_layer < tile_set->get_physics_layers_count (); tile_set_physics_layer++) {
813+ for (uint32_t tile_set_physics_layer = 0 ; tile_set_physics_layer < ( uint32_t ) tile_set->get_physics_layers_count (); tile_set_physics_layer++) {
791814 Ref<PhysicsMaterial> physics_material = tile_set->get_physics_layer_physics_material (tile_set_physics_layer);
792815 uint32_t physics_layer = tile_set->get_physics_layer_collision_layer (tile_set_physics_layer);
793816 uint32_t physics_mask = tile_set->get_physics_layer_collision_mask (tile_set_physics_layer);
@@ -998,7 +1021,7 @@ void TileMapLayer::_navigation_update() {
9981021void TileMapLayer::_navigation_clear_cell (CellData &r_cell_data) {
9991022 NavigationServer2D *ns = NavigationServer2D::get_singleton ();
10001023 // Clear navigation shapes.
1001- for (unsigned int i = 0 ; i < r_cell_data.navigation_regions .size (); i++) {
1024+ for (uint32_t i = 0 ; i < r_cell_data.navigation_regions .size (); i++) {
10021025 const RID ®ion = r_cell_data.navigation_regions [i];
10031026 if (region.is_valid ()) {
10041027 ns->region_set_map (region, RID ());
@@ -1031,7 +1054,7 @@ void TileMapLayer::_navigation_update_cell(CellData &r_cell_data) {
10311054 }
10321055
10331056 // Free unused regions then resize the regions array.
1034- for (unsigned int i = tile_set->get_navigation_layers_count (); i < r_cell_data.navigation_regions .size (); i++) {
1057+ for (uint32_t i = tile_set->get_navigation_layers_count (); i < r_cell_data.navigation_regions .size (); i++) {
10351058 RID ®ion = r_cell_data.navigation_regions [i];
10361059 if (region.is_valid ()) {
10371060 ns->region_set_map (region, RID ());
@@ -1042,7 +1065,7 @@ void TileMapLayer::_navigation_update_cell(CellData &r_cell_data) {
10421065 r_cell_data.navigation_regions .resize (tile_set->get_navigation_layers_count ());
10431066
10441067 // Create, update or clear regions.
1045- for (unsigned int navigation_layer_index = 0 ; navigation_layer_index < r_cell_data.navigation_regions .size (); navigation_layer_index++) {
1068+ for (uint32_t navigation_layer_index = 0 ; navigation_layer_index < r_cell_data.navigation_regions .size (); navigation_layer_index++) {
10461069 Ref<NavigationPolygon> navigation_polygon;
10471070 navigation_polygon = tile_data->get_navigation_polygon (navigation_layer_index);
10481071 navigation_polygon = tile_map_node->get_transformed_polygon (Ref<Resource>(navigation_polygon), c.alternative_tile );
@@ -3250,7 +3273,7 @@ void TileMap::add_layer(int p_to_pos) {
32503273 new_layer.instantiate ();
32513274 new_layer->set_tile_map (this );
32523275 layers.insert (p_to_pos, new_layer);
3253- for (unsigned int i = 0 ; i < layers.size (); i++) {
3276+ for (uint32_t i = 0 ; i < layers.size (); i++) {
32543277 layers[i]->set_layer_index_in_tile_map_node (i);
32553278 }
32563279 queue_internal_update ();
@@ -3269,7 +3292,7 @@ void TileMap::move_layer(int p_layer, int p_to_pos) {
32693292 Ref<TileMapLayer> layer = layers[p_layer];
32703293 layers.insert (p_to_pos, layer);
32713294 layers.remove_at (p_to_pos < p_layer ? p_layer + 1 : p_layer);
3272- for (unsigned int i = 0 ; i < layers.size (); i++) {
3295+ for (uint32_t i = 0 ; i < layers.size (); i++) {
32733296 layers[i]->set_layer_index_in_tile_map_node (i);
32743297 }
32753298 queue_internal_update ();
@@ -3289,7 +3312,7 @@ void TileMap::remove_layer(int p_layer) {
32893312
32903313 // Clear before removing the layer.
32913314 layers.remove_at (p_layer);
3292- for (unsigned int i = 0 ; i < layers.size (); i++) {
3315+ for (uint32_t i = 0 ; i < layers.size (); i++) {
32933316 layers[i]->set_layer_index_in_tile_map_node (i);
32943317 }
32953318 queue_internal_update ();
@@ -3526,7 +3549,7 @@ Vector2i TileMap::get_coords_for_body_rid(RID p_physics_body) {
35263549}
35273550
35283551int TileMap::get_layer_for_body_rid (RID p_physics_body) {
3529- for (unsigned int i = 0 ; i < layers.size (); i++) {
3552+ for (uint32_t i = 0 ; i < layers.size (); i++) {
35303553 if (layers[i]->has_body_rid (p_physics_body)) {
35313554 return i;
35323555 }
@@ -3576,7 +3599,7 @@ Rect2 TileMap::_edit_get_rect() const {
35763599 bool changed = false ;
35773600 Rect2 rect = layers[0 ]->get_rect (changed);
35783601 any_changed |= changed;
3579- for (unsigned int i = 1 ; i < layers.size (); i++) {
3602+ for (uint32_t i = 1 ; i < layers.size (); i++) {
35803603 rect = rect.merge (layers[i]->get_rect (changed));
35813604 any_changed |= changed;
35823605 }
@@ -3755,7 +3778,7 @@ void TileMap::_get_property_list(List<PropertyInfo> *p_list) const {
37553778 p_list->push_back (PropertyInfo (m_type, property_name, PROPERTY_HINT_NONE, m_hint, (get (property_name) == property_get_revert (property_name)) ? PROPERTY_USAGE_EDITOR : PROPERTY_USAGE_DEFAULT)); \
37563779 }
37573780
3758- for (unsigned int i = 0 ; i < layers.size (); i++) {
3781+ for (uint32_t i = 0 ; i < layers.size (); i++) {
37593782 MAKE_LAYER_PROPERTY (Variant::STRING, " name" , " " );
37603783 MAKE_LAYER_PROPERTY (Variant::BOOL, " enabled" , " " );
37613784 MAKE_LAYER_PROPERTY (Variant::COLOR, " modulate" , " " );
0 commit comments