1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-20 12:33:14 +00:00

Support even-numbered rectangle and ellipse sizes in the shape tools

Needs testing.
This commit is contained in:
Emmanouil Papadeas 2022-07-04 20:44:23 +03:00
parent 55935bcfd2
commit 23f591a862
3 changed files with 18 additions and 16 deletions

View file

@ -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

View file

@ -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:

View file

@ -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()