Skip to content

Commit

Permalink
examples: add examples/gg/easing_animation.v (follow up to e6c1637) (
Browse files Browse the repository at this point in the history
  • Loading branch information
spytheman authored Dec 24, 2024
1 parent ba036eb commit 4cd3009
Showing 1 changed file with 111 additions and 0 deletions.
111 changes: 111 additions & 0 deletions examples/gg/easing_animation.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
module main

import gg
import gx
import math.easing

const all = {
'in_functions': {
'linear': voidptr(easing.linear)
'in_sine': easing.in_sine
'in_quad': easing.in_quad
'in_cubic': easing.in_cubic
'in_quart': easing.in_quart
'in_quint': easing.in_quint
'in_expo': easing.in_expo
'in_circ': easing.in_circ
'in_back': easing.in_back
'in_elastic': easing.in_elastic
'in_bounce': easing.in_bounce
}
'out_functions': {
'linear': voidptr(easing.linear)
'out_sine': easing.out_sine
'out_quad': easing.out_quad
'out_cubic': easing.out_cubic
'out_quart': easing.out_quart
'out_quint': easing.out_quint
'out_expo': easing.out_expo
'out_circ': easing.out_circ
'out_back': easing.out_back
'out_elastic': easing.out_elastic
'out_bounce': easing.out_bounce
}
'in_out_functions': {
'linear': voidptr(easing.linear)
'in_out_sine': easing.in_out_sine
'in_out_quad': easing.in_out_quad
'in_out_cubic': easing.in_out_cubic
'in_out_quart': easing.in_out_quart
'in_out_quint': easing.in_out_quint
'in_out_expo': easing.in_out_expo
'in_out_circ': easing.in_out_circ
'in_out_back': easing.in_out_back
'in_out_elastic': easing.in_out_elastic
'in_out_bounce': easing.in_out_bounce
}
}
const all_keys = all.keys()

@[heap]
struct App {
mut:
gg &gg.Context = unsafe { nil }
x f64
t f64
h f64
kind string = all_keys.first()
}

fn (mut app App) draw_circle(label string, f easing.EasingFN) {
offset := 30
app.gg.draw_text_def(int(app.x) - 30, 5, label)
app.gg.draw_line(f32(app.x), offset, f32(app.x), f32(app.h + offset), gx.gray)
app.gg.draw_circle_filled(f32(app.x), f32(offset + f(app.t) * app.h), 10, gx.rgb(0,
0, 255))
app.x += 120
}

fn (mut app App) frame() {
size := gg.window_size()
period := u64(240)
app.t = f32_min(1.0, f32(app.gg.frame % period) / f32(period - 30))
app.x = 80
app.h = size.height - 100
app.gg.begin()
app.gg.draw_line(0, f32(app.h + 30), size.width, f32(app.h + 30), gx.gray)
current_map := unsafe { all[app.kind].clone() }
for k, e in current_map {
app.draw_circle(k, e)
}
app.gg.draw_text_def(50, int(app.h + 50), 'Note: use left and right arrows to change functions. Frame: ${app.gg.frame:010} | t: ${app.t:6.3f} | kind: ${app.kind}.')
app.gg.end()
}

fn (mut app App) change_functions(direction int) {
idx := (all_keys.len + all_keys.index(app.kind) + direction) % all_keys.len
app.kind = all_keys[idx]
}

fn (mut app App) on_event(ev &gg.Event, x voidptr) {
if ev.typ != .key_down {
return
}
if ev.key_code == .left {
app.change_functions(-1)
} else if ev.key_code == .right {
app.change_functions(1)
}
}

mut app := &App{}
app.gg = gg.new_context(
bg_color: gx.rgb(174, 198, 255)
width: 1350
height: 800
window_title: 'Easing functions'
frame_fn: app.frame
event_fn: app.on_event
user_data: app
)
app.gg.run()

0 comments on commit 4cd3009

Please sign in to comment.