From 23f591a8626c12fd7e6344ab59f8e33b8d20cb99 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas Date: Mon, 4 Jul 2022 20:44:23 +0300 Subject: [PATCH] Support even-numbered rectangle and ellipse sizes in the shape tools Needs testing. --- src/Tools/EllipseTool.gd | 6 +++--- src/Tools/RectangleTool.gd | 17 +++++++++-------- src/Tools/ShapeDrawer.gd | 11 ++++++----- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/Tools/EllipseTool.gd b/src/Tools/EllipseTool.gd index 2ce3a6a8e..deffea25d 100644 --- a/src/Tools/EllipseTool.gd +++ b/src/Tools/EllipseTool.gd @@ -2,7 +2,7 @@ extends "res://src/Tools/ShapeDrawer.gd" func _get_shape_points_filled(size: Vector2) -> PoolVector2Array: - var offseted_size := size + Vector2(2, 2) * (_thickness - 1) + var offseted_size := size + Vector2.ONE * (_thickness - 1) var border := _get_ellipse_points(Vector2.ZERO, offseted_size) var filling := [] var bitmap := _fill_bitmap_with_points(border, offseted_size) @@ -38,9 +38,9 @@ func _get_shape_points(size: Vector2) -> PoolVector2Array: if _thickness == 1: return PoolVector2Array(_get_ellipse_points(Vector2.ZERO, size)) - var size_offset := Vector2.ONE * 2 * (_thickness - 1) + var size_offset := Vector2.ONE * (_thickness - 1) var new_size := size + size_offset - var inner_ellipse_size = new_size - 2 * size_offset + var inner_ellipse_size = new_size - size_offset # The inner ellipse is to small to create a gap in the middle of the ellipse, # just return a filled ellipse diff --git a/src/Tools/RectangleTool.gd b/src/Tools/RectangleTool.gd index 5700a883f..a19c9764c 100644 --- a/src/Tools/RectangleTool.gd +++ b/src/Tools/RectangleTool.gd @@ -5,8 +5,8 @@ func _get_shape_points_filled(size: Vector2) -> PoolVector2Array: var array := [] var t_of := _thickness - 1 - for y in range(size.y + t_of * 2): - for x in range(size.x + t_of * 2): + for y in range(size.y + t_of): + for x in range(size.x + t_of): array.append(Vector2(x, y)) return PoolVector2Array(array) @@ -15,13 +15,14 @@ func _get_shape_points_filled(size: Vector2) -> PoolVector2Array: func _get_shape_points(size: Vector2) -> PoolVector2Array: if _thickness == 1: return PoolVector2Array(_get_rectangle_points(Vector2(0, 0), size)) - else: - var array := [] - var t_of := _thickness - 1 - for i in range(1 + 2 * t_of): - array += _get_rectangle_points(Vector2(i, i), size + Vector2(2, 2) * (t_of - i)) - return PoolVector2Array(array) + var array := [] + var t_of := _thickness - 1 + for i in range(_thickness): + var point_size := size + Vector2(2, 2) * (t_of - i) - Vector2.ONE * t_of + array += _get_rectangle_points(Vector2(i, i), point_size) + + return PoolVector2Array(array) func _get_rectangle_points(pos: Vector2, size: Vector2) -> Array: diff --git a/src/Tools/ShapeDrawer.gd b/src/Tools/ShapeDrawer.gd index d431b6599..81ed66e0e 100644 --- a/src/Tools/ShapeDrawer.gd +++ b/src/Tools/ShapeDrawer.gd @@ -32,7 +32,7 @@ func update_indicator() -> void: var points := _get_points(rect.size) var t_offset := _thickness - 1 var t_offsetv := Vector2(t_offset, t_offset) - indicator.create(rect.size + t_offsetv * 2) + indicator.create(rect.size + t_offsetv) for point in points: indicator.set_bit(point, 1) @@ -137,11 +137,12 @@ func draw_preview() -> void: var points := _get_points(rect.size) var t_offset := _thickness - 1 var t_offsetv := Vector2(t_offset, t_offset) - indicator.create(rect.size + t_offsetv * 2) + indicator.create(rect.size + t_offsetv) for point in points: indicator.set_bit(point, 1) - canvas.draw_set_transform(rect.position - t_offsetv, canvas.rotation, canvas.scale) + var transform_pos: Vector2 = rect.position - t_offsetv + Vector2(0.5, 0.5) * (t_offset - 1) + canvas.draw_set_transform(transform_pos.ceil(), canvas.rotation, canvas.scale) for line in _create_polylines(indicator): canvas.draw_polyline(PoolVector2Array(line), Color.black) @@ -156,8 +157,8 @@ func _draw_shape(origin: Vector2, dest: Vector2) -> void: for point in points: # Reset drawer every time because pixel perfect sometimes breaks the tool _drawer.reset() - # Draw each point offseted based on the shape's thickness - draw_tool(rect.position + point - Vector2.ONE * (_thickness - 1)) + # Draw each point offsetted based on the shape's thickness + draw_tool(rect.position + point - Vector2(0.5, 0.5) * (_thickness - 1)) commit_undo()