64 lines
1.8 KiB
GDScript
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
|