mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-02-22 13:33:13 +00:00
Support even-numbered rectangle and ellipse sizes in the shape tools
Needs testing.
This commit is contained in:
parent
55935bcfd2
commit
23f591a862
3 changed files with 18 additions and 16 deletions
|
@ -2,7 +2,7 @@ extends "res://src/Tools/ShapeDrawer.gd"
|
||||||
|
|
||||||
|
|
||||||
func _get_shape_points_filled(size: Vector2) -> PoolVector2Array:
|
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 border := _get_ellipse_points(Vector2.ZERO, offseted_size)
|
||||||
var filling := []
|
var filling := []
|
||||||
var bitmap := _fill_bitmap_with_points(border, offseted_size)
|
var bitmap := _fill_bitmap_with_points(border, offseted_size)
|
||||||
|
@ -38,9 +38,9 @@ func _get_shape_points(size: Vector2) -> PoolVector2Array:
|
||||||
if _thickness == 1:
|
if _thickness == 1:
|
||||||
return PoolVector2Array(_get_ellipse_points(Vector2.ZERO, size))
|
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 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,
|
# The inner ellipse is to small to create a gap in the middle of the ellipse,
|
||||||
# just return a filled ellipse
|
# just return a filled ellipse
|
||||||
|
|
|
@ -5,8 +5,8 @@ func _get_shape_points_filled(size: Vector2) -> PoolVector2Array:
|
||||||
var array := []
|
var array := []
|
||||||
var t_of := _thickness - 1
|
var t_of := _thickness - 1
|
||||||
|
|
||||||
for y in range(size.y + t_of * 2):
|
for y in range(size.y + t_of):
|
||||||
for x in range(size.x + t_of * 2):
|
for x in range(size.x + t_of):
|
||||||
array.append(Vector2(x, y))
|
array.append(Vector2(x, y))
|
||||||
|
|
||||||
return PoolVector2Array(array)
|
return PoolVector2Array(array)
|
||||||
|
@ -15,11 +15,12 @@ func _get_shape_points_filled(size: Vector2) -> PoolVector2Array:
|
||||||
func _get_shape_points(size: Vector2) -> PoolVector2Array:
|
func _get_shape_points(size: Vector2) -> PoolVector2Array:
|
||||||
if _thickness == 1:
|
if _thickness == 1:
|
||||||
return PoolVector2Array(_get_rectangle_points(Vector2(0, 0), size))
|
return PoolVector2Array(_get_rectangle_points(Vector2(0, 0), size))
|
||||||
else:
|
|
||||||
var array := []
|
var array := []
|
||||||
var t_of := _thickness - 1
|
var t_of := _thickness - 1
|
||||||
for i in range(1 + 2 * t_of):
|
for i in range(_thickness):
|
||||||
array += _get_rectangle_points(Vector2(i, i), size + Vector2(2, 2) * (t_of - i))
|
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)
|
return PoolVector2Array(array)
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ func update_indicator() -> void:
|
||||||
var points := _get_points(rect.size)
|
var points := _get_points(rect.size)
|
||||||
var t_offset := _thickness - 1
|
var t_offset := _thickness - 1
|
||||||
var t_offsetv := Vector2(t_offset, t_offset)
|
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:
|
for point in points:
|
||||||
indicator.set_bit(point, 1)
|
indicator.set_bit(point, 1)
|
||||||
|
|
||||||
|
@ -137,11 +137,12 @@ func draw_preview() -> void:
|
||||||
var points := _get_points(rect.size)
|
var points := _get_points(rect.size)
|
||||||
var t_offset := _thickness - 1
|
var t_offset := _thickness - 1
|
||||||
var t_offsetv := Vector2(t_offset, t_offset)
|
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:
|
for point in points:
|
||||||
indicator.set_bit(point, 1)
|
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):
|
for line in _create_polylines(indicator):
|
||||||
canvas.draw_polyline(PoolVector2Array(line), Color.black)
|
canvas.draw_polyline(PoolVector2Array(line), Color.black)
|
||||||
|
@ -156,8 +157,8 @@ func _draw_shape(origin: Vector2, dest: Vector2) -> void:
|
||||||
for point in points:
|
for point in points:
|
||||||
# Reset drawer every time because pixel perfect sometimes breaks the tool
|
# Reset drawer every time because pixel perfect sometimes breaks the tool
|
||||||
_drawer.reset()
|
_drawer.reset()
|
||||||
# Draw each point offseted based on the shape's thickness
|
# Draw each point offsetted based on the shape's thickness
|
||||||
draw_tool(rect.position + point - Vector2.ONE * (_thickness - 1))
|
draw_tool(rect.position + point - Vector2(0.5, 0.5) * (_thickness - 1))
|
||||||
|
|
||||||
commit_undo()
|
commit_undo()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue