diff options
| author | iamcheeseman <[hidden email]> | 2026-01-15 20:53:56 -0500 |
|---|---|---|
| committer | iamcheeseman <[hidden email]> | 2026-01-15 20:53:56 -0500 |
| commit | 057997b3578f3ff62457c31e9fdcb301380088ca (patch) | |
| tree | 01a136263c457daef1ad35dd0a24849f6aaa69b2 /src/tail.odin | |
| parent | c353e0b095fb724ee50d6e09fb00cc82b51da250 (diff) | |
scarf
Diffstat (limited to 'src/tail.odin')
| -rw-r--r-- | src/tail.odin | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/tail.odin b/src/tail.odin new file mode 100644 index 0000000..2184444 --- /dev/null +++ b/src/tail.odin @@ -0,0 +1,40 @@ +package demonchime + +import "core:math" +import "core:math/linalg" + +Tail :: struct($N: int) { + points: [N]Vec2, + point_max_dist: f32, + point_rad: f32, + color_start: Color, + color_end: Color, +} + +set_tail_position :: proc(tail: ^Tail($N), pos: Vec2, dt: f32) { + tail.points[0] = pos + for i in 1..<len(tail.points) { + prev := tail.points[i - 1] + cur := &tail.points[i] + + cur.y += 50 * dt + + dist := linalg.length2(prev - cur^) + if dist > tail.point_max_dist*tail.point_max_dist { + dir := linalg.normalize0(cur^ - prev) + cur^ = prev + dir * (tail.point_max_dist - 1) + } + } +} + +draw_tail :: proc(tail: Tail($N)) { + for point, i in tail.points { + renderer.tint = linalg.lerp( + tail.color_start, + tail.color_end, + f32(i)/len(tail.points), + ) + draw_circle(point, tail.point_rad) + } + renderer.tint = {1, 1, 1, 1} +} |
