netfishing/ui/components/bubble_menu/notepad_ink_outline.gd

64 lines
1.8 KiB
GDScript

class_name NotepadInkOutline
extends Control
@export var ink_color := Color(0.20, 0.17, 0.13, 0.9)
@export_range(0.5, 6.0, 0.1) var stroke_width: float = 2.0
@export_range(0.0, 16.0, 0.5) var padding: float = 3.0
@export_range(0, 1000000, 1) var shape_seed: int = 17
var _mark_strength: float = 0.0
func _ready() -> void:
mouse_filter = Control.MOUSE_FILTER_IGNORE
func set_mark_strength(strength: float) -> void:
_mark_strength = clampf(strength, 0.0, 1.0)
visible = _mark_strength > 0.001
queue_redraw()
func _draw() -> void:
if _mark_strength <= 0.001:
return
var center: Vector2 = size * 0.5
var radius := Vector2(
maxf(size.x * 0.5 - padding, 1.0),
maxf(size.y * 0.5 - padding, 1.0),
)
var primary := _build_rough_loop(center, radius, 0)
var secondary := _build_rough_loop(
center + Vector2(0.7, -0.45),
radius - Vector2(1.2, 0.8),
41,
)
var primary_color: Color = ink_color
primary_color.a *= _mark_strength
var secondary_color: Color = ink_color
secondary_color.a *= _mark_strength * 0.36
draw_polyline(primary, primary_color, stroke_width, true)
draw_polyline(secondary, secondary_color, maxf(stroke_width * 0.62, 0.8), true)
func _build_rough_loop(
center: Vector2,
radius: Vector2,
seed_offset: int,
) -> PackedVector2Array:
const POINT_COUNT: int = 26
var points := PackedVector2Array()
for index: int in POINT_COUNT:
var angle: float = TAU * float(index) / float(POINT_COUNT)
var wobble: float = (
sin(float(shape_seed + seed_offset) * 0.73 + float(index) * 2.17)
+ sin(float(shape_seed + seed_offset) * 0.31 + float(index) * 4.03)
* 0.45
)
var radial_scale: float = 1.0 + wobble * 0.018
points.append(
center
+ Vector2(cos(angle), sin(angle)) * radius * radial_scale
)
points.append(points[0])
return points