TileMap: Properly flip/rotate tiles with non-square region

This commit is contained in:
Ignacio Etcheverry 2016-01-04 15:28:11 +01:00
parent e22e0cecf7
commit a9dbe83155
2 changed files with 45 additions and 16 deletions

View file

@ -223,6 +223,14 @@ void TileMap::_fix_cell_transform(Matrix32& xform,const Cell& p_cell, const Vect
Size2 s=p_sc; Size2 s=p_sc;
Vector2 offset = p_offset; 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) { if (p_cell.transpose) {
SWAP(xform.elements[0].x, xform.elements[0].y); SWAP(xform.elements[0].x, xform.elements[0].y);
SWAP(xform.elements[1].x, xform.elements[1].y); SWAP(xform.elements[1].x, xform.elements[1].y);
@ -376,6 +384,14 @@ void TileMap::_update_dirty_quadrants() {
rect.pos=offset.floor(); rect.pos=offset.floor();
rect.size=s; 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.x+=fp_adjust;
rect.size.y+=fp_adjust;*/ rect.size.y+=fp_adjust;*/

View file

@ -680,18 +680,6 @@ void TileMapEditor::_canvas_draw() {
Rect2 r = ts->tile_get_region(st); Rect2 r = ts->tile_get_region(st);
Size2 sc = xform.get_scale(); 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; Rect2 rect;
if (r==Rect2()) { if (r==Rect2()) {
rect=Rect2(from,t->get_size()); rect=Rect2(from,t->get_size());
@ -700,6 +688,31 @@ void TileMapEditor::_canvas_draw() {
rect=Rect2(from,r.get_size()); 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) { if (node->get_tile_origin()==TileMap::TILE_ORIGIN_TOP_LEFT) {
rect.pos+=tile_ofs; rect.pos+=tile_ofs;
@ -710,12 +723,12 @@ void TileMapEditor::_canvas_draw() {
Vector2 center = (s/2) - tile_ofs; Vector2 center = (s/2) - tile_ofs;
if (mirror_x->is_pressed()) if (flip_h)
rect.pos.x-=s.x-center.x; rect.pos.x-=s.x-center.x;
else else
rect.pos.x-=center.x; rect.pos.x-=center.x;
if (mirror_y->is_pressed()) if (flip_v)
rect.pos.y-=s.y-center.y; rect.pos.y-=s.y-center.y;
else else
rect.pos.y-=center.y; rect.pos.y-=center.y;
@ -726,10 +739,10 @@ void TileMapEditor::_canvas_draw() {
if (r==Rect2()) { 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 { } 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);
} }
} }
} }