From b1ab8c1a31ac568c9be38c5c7d40a199898bc88d Mon Sep 17 00:00:00 2001 From: Adam Scott Date: Mon, 15 Jan 2024 16:23:35 -0500 Subject: [PATCH] Stabilize snapping 2D transforms to pixel Co-authored-by: Danni <34800072+KeyboardDanni@users.noreply.github.com> --- scene/2d/animated_sprite_2d.cpp | 3 --- scene/2d/sprite_2d.cpp | 8 -------- servers/rendering/renderer_canvas_cull.cpp | 20 +++++++++++--------- servers/rendering/renderer_viewport.cpp | 8 -------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/scene/2d/animated_sprite_2d.cpp b/scene/2d/animated_sprite_2d.cpp index b3a20edea892..9022bf978ff7 100644 --- a/scene/2d/animated_sprite_2d.cpp +++ b/scene/2d/animated_sprite_2d.cpp @@ -267,9 +267,6 @@ void AnimatedSprite2D::_notification(int p_what) { ofs -= s / 2; } - if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) { - ofs = ofs.floor(); - } Rect2 dst_rect(ofs, s); if (hflip) { diff --git a/scene/2d/sprite_2d.cpp b/scene/2d/sprite_2d.cpp index d3be5b9c6527..a79e6392d466 100644 --- a/scene/2d/sprite_2d.cpp +++ b/scene/2d/sprite_2d.cpp @@ -98,10 +98,6 @@ void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_c dest_offset -= frame_size / 2; } - if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) { - dest_offset = dest_offset.floor(); - } - r_dst_rect = Rect2(dest_offset, frame_size); if (hflip) { @@ -401,10 +397,6 @@ Rect2 Sprite2D::get_rect() const { ofs -= Size2(s) / 2; } - if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) { - ofs = ofs.floor(); - } - if (s == Size2(0, 0)) { s = Size2(1, 1); } diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index caeac5cd958b..8c2c4f4239cc 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -247,13 +247,15 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 } } - Transform2D xform = ci->xform; + Transform2D ci_xform = ci->xform; + Transform2D xform = p_transform; if (snapping_2d_transforms_to_pixel) { - xform.columns[2] = xform.columns[2].floor(); + ci_xform.columns[2] = ci_xform.columns[2].round(); + xform.columns[2] = xform.columns[2].round(); } - xform = p_transform * xform; + ci_xform = xform * ci_xform; - Rect2 global_rect = xform.xform(rect); + Rect2 global_rect = ci_xform.xform(rect); global_rect.position += p_clip_rect.position; if (ci->use_parent_material && p_material_owner) { @@ -318,7 +320,7 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 sorter.sort(child_items, child_item_count); for (i = 0; i < child_item_count; i++) { - _cull_canvas_item(child_items[i], xform * child_items[i]->ysort_xform, p_clip_rect, modulate * child_items[i]->ysort_modulate, child_items[i]->ysort_parent_abs_z_index, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, (Item *)child_items[i]->material_owner, false, p_canvas_cull_mask); + _cull_canvas_item(child_items[i], ci_xform * child_items[i]->ysort_xform, p_clip_rect, modulate * child_items[i]->ysort_modulate, child_items[i]->ysort_parent_abs_z_index, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, (Item *)child_items[i]->material_owner, false, p_canvas_cull_mask); } } else { RendererCanvasRender::Item *canvas_group_from = nullptr; @@ -328,7 +330,7 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 canvas_group_from = r_z_last_list[zidx]; } - _attach_canvas_item_for_draw(ci, p_canvas_clip, r_z_list, r_z_last_list, xform, p_clip_rect, global_rect, modulate, p_z, p_material_owner, use_canvas_group, canvas_group_from); + _attach_canvas_item_for_draw(ci, p_canvas_clip, r_z_list, r_z_last_list, ci_xform, p_clip_rect, global_rect, modulate, p_z, p_material_owner, use_canvas_group, canvas_group_from); } } else { RendererCanvasRender::Item *canvas_group_from = nullptr; @@ -342,14 +344,14 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 if (!child_items[i]->behind && !use_canvas_group) { continue; } - _cull_canvas_item(child_items[i], xform, p_clip_rect, modulate, p_z, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, p_material_owner, true, p_canvas_cull_mask); + _cull_canvas_item(child_items[i], ci_xform, p_clip_rect, modulate, p_z, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, p_material_owner, true, p_canvas_cull_mask); } - _attach_canvas_item_for_draw(ci, p_canvas_clip, r_z_list, r_z_last_list, xform, p_clip_rect, global_rect, modulate, p_z, p_material_owner, use_canvas_group, canvas_group_from); + _attach_canvas_item_for_draw(ci, p_canvas_clip, r_z_list, r_z_last_list, ci_xform, p_clip_rect, global_rect, modulate, p_z, p_material_owner, use_canvas_group, canvas_group_from); for (int i = 0; i < child_item_count; i++) { if (child_items[i]->behind || use_canvas_group) { continue; } - _cull_canvas_item(child_items[i], xform, p_clip_rect, modulate, p_z, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, p_material_owner, true, p_canvas_cull_mask); + _cull_canvas_item(child_items[i], ci_xform, p_clip_rect, modulate, p_z, r_z_list, r_z_last_list, (Item *)ci->final_clip_owner, p_material_owner, true, p_canvas_cull_mask); } } } diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index 7a2415442d15..7beff8a0e08f 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -43,19 +43,11 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport, float scale = 1.0; if (p_viewport->canvas_map.has(p_canvas->parent)) { Transform2D c_xform = p_viewport->canvas_map[p_canvas->parent].transform; - if (p_viewport->snap_2d_transforms_to_pixel) { - c_xform.columns[2] = c_xform.columns[2].floor(); - } xf = xf * c_xform; scale = p_canvas->parent_scale; } Transform2D c_xform = p_canvas_data->transform; - - if (p_viewport->snap_2d_transforms_to_pixel) { - c_xform.columns[2] = c_xform.columns[2].floor(); - } - xf = xf * c_xform; if (scale != 1.0 && !RSG::canvas->disable_scale) {