From a9dbe83155ec707f87f5eb6fae782e4947d84aa5 Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Mon, 4 Jan 2016 15:28:11 +0100 Subject: [PATCH] TileMap: Properly flip/rotate tiles with non-square region --- scene/2d/tile_map.cpp | 16 +++++++ .../editor/plugins/tile_map_editor_plugin.cpp | 45 ++++++++++++------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 70937c68dac..179d1f451a6 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -223,6 +223,14 @@ void TileMap::_fix_cell_transform(Matrix32& xform,const Cell& p_cell, const Vect Size2 s=p_sc; Vector2 offset = p_offset; + if (s.y > s.x) { + if ((p_cell.flip_h && (p_cell.flip_v || p_cell.transpose)) || (p_cell.flip_v && !p_cell.transpose)) + offset.y += s.y - s.x; + } else if (s.y < s.x) { + if ((p_cell.flip_v && (p_cell.flip_h || p_cell.transpose)) || (p_cell.flip_h && !p_cell.transpose)) + offset.x += s.x - s.y; + } + if (p_cell.transpose) { SWAP(xform.elements[0].x, xform.elements[0].y); SWAP(xform.elements[1].x, xform.elements[1].y); @@ -376,6 +384,14 @@ void TileMap::_update_dirty_quadrants() { rect.pos=offset.floor(); rect.size=s; + if (rect.size.y > rect.size.x) { + if ((c.flip_h && (c.flip_v || c.transpose)) || (c.flip_v && !c.transpose)) + tile_ofs.y += rect.size.y - rect.size.x; + } else if (rect.size.y < rect.size.x) { + if ((c.flip_v && (c.flip_h || c.transpose)) || (c.flip_h && !c.transpose)) + tile_ofs.x += rect.size.x - rect.size.y; + } + /* rect.size.x+=fp_adjust; rect.size.y+=fp_adjust;*/ diff --git a/tools/editor/plugins/tile_map_editor_plugin.cpp b/tools/editor/plugins/tile_map_editor_plugin.cpp index 5ee0259d56a..29326a22222 100644 --- a/tools/editor/plugins/tile_map_editor_plugin.cpp +++ b/tools/editor/plugins/tile_map_editor_plugin.cpp @@ -680,18 +680,6 @@ void TileMapEditor::_canvas_draw() { Rect2 r = ts->tile_get_region(st); Size2 sc = xform.get_scale(); - if (transpose->is_pressed()) - SWAP(tile_ofs.x, tile_ofs.y); - - if (mirror_x->is_pressed()) { - sc.x*=-1.0; - tile_ofs.x*=-1.0; - } - if (mirror_y->is_pressed()) { - sc.y*=-1.0; - tile_ofs.y*=-1.0; - } - Rect2 rect; if (r==Rect2()) { rect=Rect2(from,t->get_size()); @@ -700,6 +688,31 @@ void TileMapEditor::_canvas_draw() { rect=Rect2(from,r.get_size()); } + bool transp = transpose->is_pressed(); + bool flip_h = mirror_x->is_pressed(); + bool flip_v = mirror_y->is_pressed(); + + if (rect.size.y > rect.size.x) { + if ((flip_h && (flip_v || transp)) || (flip_v && !transp)) + tile_ofs.y += rect.size.y - rect.size.x; + } else if (rect.size.y < rect.size.x) { + if ((flip_v && (flip_h || transp)) || (flip_h && !transp)) + tile_ofs.x += rect.size.x - rect.size.y; + } + + if (transp) { + SWAP(tile_ofs.x, tile_ofs.y); + } + + if (flip_h) { + sc.x*=-1.0; + tile_ofs.x*=-1.0; + } + if (flip_v) { + sc.y*=-1.0; + tile_ofs.y*=-1.0; + } + if (node->get_tile_origin()==TileMap::TILE_ORIGIN_TOP_LEFT) { rect.pos+=tile_ofs; @@ -710,12 +723,12 @@ void TileMapEditor::_canvas_draw() { Vector2 center = (s/2) - tile_ofs; - if (mirror_x->is_pressed()) + if (flip_h) rect.pos.x-=s.x-center.x; else rect.pos.x-=center.x; - if (mirror_y->is_pressed()) + if (flip_v) rect.pos.y-=s.y-center.y; else rect.pos.y-=center.y; @@ -726,10 +739,10 @@ void TileMapEditor::_canvas_draw() { if (r==Rect2()) { - canvas_item_editor->draw_texture_rect(t,rect,false,Color(1,1,1,0.5),transpose->is_pressed()); + canvas_item_editor->draw_texture_rect(t,rect,false,Color(1,1,1,0.5),transp); } else { - canvas_item_editor->draw_texture_rect_region(t,rect,r,Color(1,1,1,0.5),transpose->is_pressed()); + canvas_item_editor->draw_texture_rect_region(t,rect,r,Color(1,1,1,0.5),transp); } } }