Skip to content

Commit

Permalink
Stabilize snapping 2D transforms to pixel
Browse files Browse the repository at this point in the history
Co-authored-by: Danni <34800072+KeyboardDanni@users.noreply.github.com>
  • Loading branch information
adamscott and KeyboardDanni committed Jan 24, 2024
1 parent 442bbb5 commit b1ab8c1
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 28 deletions.
3 changes: 0 additions & 3 deletions scene/2d/animated_sprite_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 0 additions & 8 deletions scene/2d/sprite_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
Expand Down
20 changes: 11 additions & 9 deletions servers/rendering/renderer_canvas_cull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);
}
}
}
Expand Down
8 changes: 0 additions & 8 deletions servers/rendering/renderer_viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit b1ab8c1

Please sign in to comment.