Skip to content

Commit

Permalink
Use bresenham line in freehand tilemap painting to fill discontinuities
Browse files Browse the repository at this point in the history
  • Loading branch information
Zylann committed Oct 22, 2017
1 parent b4f0f59 commit e9f6ff5
Showing 1 changed file with 31 additions and 14 deletions.
45 changes: 31 additions & 14 deletions editor/plugins/tile_map_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -945,6 +945,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
if (mm.is_valid()) {

Point2i new_over_tile = node->world_to_map(xform_inv.xform(mm->get_position()));
Point2i old_over_tile = over_tile;

if (new_over_tile != over_tile) {

Expand All @@ -963,17 +964,43 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {

if (tool == TOOL_PAINTING) {

// Paint using bresenham line to prevent holes in painting if the user moves fast

Vector<Point2i> points = line(old_over_tile.x, over_tile.x, old_over_tile.y, over_tile.y);
int id = get_selected_tile();
if (id != TileMap::INVALID_CELL) {

for (int i = 0; i < points.size(); ++i) {

Point2i pos = points[i];

if (!paint_undo.has(over_tile)) {
paint_undo[over_tile] = _get_op_from_cell(over_tile);
paint_undo[pos] = _get_op_from_cell(pos);
}

_set_cell(over_tile, id, flip_h, flip_v, transpose);
_set_cell(pos, id, flip_h, flip_v, transpose);
}

return true;
return true;
}

if (tool == TOOL_ERASING) {

// erase using bresenham line to prevent holes in painting if the user moves fast

Vector<Point2i> points = line(old_over_tile.x, over_tile.x, old_over_tile.y, over_tile.y);

for (int i = 0; i < points.size(); ++i) {

Point2i pos = points[i];

if (!paint_undo.has(over_tile)) {
paint_undo[pos] = _get_op_from_cell(pos);
}

_set_cell(pos, TileMap::INVALID_CELL);
}

return true;
}

if (tool == TOOL_SELECTING) {
Expand Down Expand Up @@ -1044,16 +1071,6 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {

return true;
}
if (tool == TOOL_ERASING) {

if (!paint_undo.has(over_tile)) {
paint_undo[over_tile] = _get_op_from_cell(over_tile);
}

_set_cell(over_tile, TileMap::INVALID_CELL);

return true;
}
if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) {

_pick_tile(over_tile);
Expand Down

0 comments on commit e9f6ff5

Please sign in to comment.