Skip to content

Commit

Permalink
Merge pull request #84968 from groud/fix_tilemap_reparenting
Browse files Browse the repository at this point in the history
Update tilemap physics' world2D on reparenting
  • Loading branch information
akien-mga committed Nov 16, 2023
2 parents 7e679ea + dae6416 commit 4065266
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions scene/2d/tile_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -686,26 +686,30 @@ void TileMapLayer::_physics_update() {

void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_what) {
Transform2D gl_transform = tile_map_node->get_global_transform();
PhysicsServer2D *ps = PhysicsServer2D::get_singleton();

bool in_editor = false;
#ifdef TOOLS_ENABLED
in_editor = Engine::get_singleton()->is_editor_hint();
#endif

if (p_what == DIRTY_FLAGS_TILE_MAP_XFORM) {
if (tile_map_node->is_inside_tree() && (!tile_map_node->is_collision_animatable() || in_editor)) {
// Move the collisison shapes along with the TileMap.
for (KeyValue<Vector2i, CellData> &kv : tile_map) {
const CellData &cell_data = kv.value;

for (RID body : cell_data.bodies) {
if (body.is_valid()) {
Transform2D xform(0, tile_map_node->map_to_local(bodies_coords[body]));
xform = gl_transform * xform;
PhysicsServer2D::get_singleton()->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform);
ps->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform);
}
}
}
}
} else if (p_what == DIRTY_FLAGS_TILE_MAP_LOCAL_XFORM) {
// With collisions animatable, move the collisison shapes along with the TileMap only on local xform change (they are synchornized on physics tick instead).
if (tile_map_node->is_inside_tree() && tile_map_node->is_collision_animatable() && !in_editor) {
for (KeyValue<Vector2i, CellData> &kv : tile_map) {
const CellData &cell_data = kv.value;
Expand All @@ -714,7 +718,22 @@ void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_wha
if (body.is_valid()) {
Transform2D xform(0, tile_map_node->map_to_local(bodies_coords[body]));
xform = gl_transform * xform;
PhysicsServer2D::get_singleton()->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform);
ps->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform);
}
}
}
}
} else if (p_what == DIRTY_FLAGS_TILE_MAP_IN_TREE) {
// Changes in the tree may cause the space to change (e.g. when reparenting to a SubViewport).
if (tile_map_node->is_inside_tree()) {
RID space = tile_map_node->get_world_2d()->get_space();

for (KeyValue<Vector2i, CellData> &kv : tile_map) {
const CellData &cell_data = kv.value;

for (RID body : cell_data.bodies) {
if (body.is_valid()) {
ps->body_set_space(body, space);
}
}
}
Expand Down

0 comments on commit 4065266

Please sign in to comment.