Skip to content

Commit b94eb58

Browse files
committed
Merge pull request #85893 from groud/fix_tilemap_occluders
Fix TileMap occluders
2 parents 5c95fd5 + fcb8d19 commit b94eb58

File tree

2 files changed

+50
-27
lines changed

2 files changed

+50
-27
lines changed

scene/2d/tile_map.cpp

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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() {
9981021
void 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 &region = 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 &region = 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

35283551
int 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", "");

scene/2d/tile_map.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ struct CellData {
104104
// Rendering.
105105
Ref<RenderingQuadrant> rendering_quadrant;
106106
SelfList<CellData> rendering_quadrant_list_element;
107-
List<RID> occluders;
107+
LocalVector<RID> occluders;
108108

109109
// Physics.
110110
LocalVector<RID> bodies;

0 commit comments

Comments
 (0)