Skip to content

Commit 9050ee1

Browse files
authored
Merge pull request #87297 from adamscott/2d-pixel-art-stability
Stabilize snapping 2D transforms to pixel
2 parents e57fee9 + 35b6401 commit 9050ee1

File tree

5 files changed

+12
-15
lines changed

5 files changed

+12
-15
lines changed

scene/2d/animated_sprite_2d.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,9 @@ void AnimatedSprite2D::_notification(int p_what) {
268268
}
269269

270270
if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
271-
ofs = ofs.floor();
271+
ofs = ofs.round();
272272
}
273+
273274
Rect2 dst_rect(ofs, s);
274275

275276
if (hflip) {

scene/2d/sprite_2d.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_c
9999
}
100100

101101
if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
102-
dest_offset = dest_offset.floor();
102+
dest_offset = dest_offset.round();
103103
}
104104

105105
r_dst_rect = Rect2(dest_offset, frame_size);
@@ -402,7 +402,7 @@ Rect2 Sprite2D::get_rect() const {
402402
}
403403

404404
if (get_viewport() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
405-
ofs = ofs.floor();
405+
ofs = ofs.round();
406406
}
407407

408408
if (s == Size2(0, 0)) {

servers/rendering/renderer_canvas_cull.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ void RendererCanvasCull::_attach_canvas_item_for_draw(RendererCanvasCull::Item *
223223
}
224224
}
225225

226-
void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RendererCanvasRender::Item **r_z_list, RendererCanvasRender::Item **r_z_last_list, Item *p_canvas_clip, Item *p_material_owner, bool p_allow_y_sort, uint32_t p_canvas_cull_mask) {
226+
void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2D &p_parent_xform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RendererCanvasRender::Item **r_z_list, RendererCanvasRender::Item **r_z_last_list, Item *p_canvas_clip, Item *p_material_owner, bool p_allow_y_sort, uint32_t p_canvas_cull_mask) {
227227
Item *ci = p_canvas_item;
228228

229229
if (!ci->visible) {
@@ -248,10 +248,14 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2
248248
}
249249

250250
Transform2D xform = ci->xform;
251+
Transform2D parent_xform = p_parent_xform;
252+
251253
if (snapping_2d_transforms_to_pixel) {
252-
xform.columns[2] = xform.columns[2].floor();
254+
xform.columns[2] = xform.columns[2].round();
255+
parent_xform.columns[2] = parent_xform.columns[2].round();
253256
}
254-
xform = p_transform * xform;
257+
258+
xform = parent_xform * xform;
255259

256260
Rect2 global_rect = xform.xform(rect);
257261
global_rect.position += p_clip_rect.position;

servers/rendering/renderer_canvas_cull.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class RendererCanvasCull {
188188

189189
private:
190190
void _render_canvas_item_tree(RID p_to_render_target, Canvas::ChildItem *p_child_items, int p_child_item_count, Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RendererCanvasRender::Light *p_lights, RendererCanvasRender::Light *p_directional_lights, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, uint32_t p_canvas_cull_mask, RenderingMethod::RenderInfo *r_render_info = nullptr);
191-
void _cull_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RendererCanvasRender::Item **r_z_list, RendererCanvasRender::Item **r_z_last_list, Item *p_canvas_clip, Item *p_material_owner, bool p_allow_y_sort, uint32_t p_canvas_cull_mask);
191+
void _cull_canvas_item(Item *p_canvas_item, const Transform2D &p_parent_xform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RendererCanvasRender::Item **r_z_list, RendererCanvasRender::Item **r_z_last_list, Item *p_canvas_clip, Item *p_material_owner, bool p_allow_y_sort, uint32_t p_canvas_cull_mask);
192192

193193
static constexpr int z_range = RS::CANVAS_ITEM_Z_MAX - RS::CANVAS_ITEM_Z_MIN + 1;
194194

servers/rendering/renderer_viewport.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,11 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport,
4343
float scale = 1.0;
4444
if (p_viewport->canvas_map.has(p_canvas->parent)) {
4545
Transform2D c_xform = p_viewport->canvas_map[p_canvas->parent].transform;
46-
if (p_viewport->snap_2d_transforms_to_pixel) {
47-
c_xform.columns[2] = c_xform.columns[2].floor();
48-
}
4946
xf = xf * c_xform;
5047
scale = p_canvas->parent_scale;
5148
}
5249

5350
Transform2D c_xform = p_canvas_data->transform;
54-
55-
if (p_viewport->snap_2d_transforms_to_pixel) {
56-
c_xform.columns[2] = c_xform.columns[2].floor();
57-
}
58-
5951
xf = xf * c_xform;
6052

6153
if (scale != 1.0 && !RSG::canvas->disable_scale) {

0 commit comments

Comments
 (0)