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:
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:
|
||||
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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue