Skip to content

Commit

Permalink
Physics Interpolation - automatic resets for Camera2D and TileMap.
Browse files Browse the repository at this point in the history
Extra reset required for Camera2D. TileMaps require resetting by quadrant.
  • Loading branch information
lawnjelly committed Aug 24, 2023
1 parent 17b403a commit 09b79ea
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
8 changes: 8 additions & 0 deletions scene/2d/camera_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,14 @@ void Camera2D::_notification(int p_what) {
first = true;
_set_current(current);

// Note that NOTIFICATION_RESET_PHYSICS_INTERPOLATION
// is automatically called before this because Camera2D is inherited
// from CanvasItem. However, the camera transform is not up to date
// until this point, so we do an extra manual reset.
if (is_physics_interpolated_and_enabled()) {
_interpolation_data.xform_curr = get_camera_transform();
_interpolation_data.xform_prev = _interpolation_data.xform_curr;
}
} break;
case NOTIFICATION_EXIT_TREE: {
const bool viewport_valid = !custom_viewport || ObjectDB::get_instance(custom_viewport_id);
Expand Down
18 changes: 18 additions & 0 deletions scene/2d/tile_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,17 @@ void TileMap::_notification(int p_what) {
}

} break;

case NOTIFICATION_RESET_PHYSICS_INTERPOLATION: {
if (is_visible_in_tree() && is_physics_interpolated_and_enabled()) {
for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) {
Quadrant &q = E->get();
for (List<RID>::Element *F = q.canvas_items.front(); F; F = F->next()) {
VisualServer::get_singleton()->canvas_item_reset_physics_interpolation(F->get());
}
}
}
} break;
}
}

Expand Down Expand Up @@ -744,6 +755,13 @@ void TileMap::update_dirty_quadrants() {
VisualServerCanvasHelper::tilemap_end();
}

// Reset physics interpolation for any recreated canvas items.
if (is_physics_interpolated_and_enabled() && is_visible_in_tree()) {
for (List<RID>::Element *F = q.canvas_items.front(); F; F = F->next()) {
VisualServer::get_singleton()->canvas_item_reset_physics_interpolation(F->get());
}
}

dirty_quadrant_list.remove(dirty_quadrant_list.first());
quadrant_order_dirty = true;
}
Expand Down

0 comments on commit 09b79ea

Please sign in to comment.