aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/gg/bezier_anim.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/examples/gg/bezier_anim.v')
-rw-r--r--v_windows/v/examples/gg/bezier_anim.v68
1 files changed, 68 insertions, 0 deletions
diff --git a/v_windows/v/examples/gg/bezier_anim.v b/v_windows/v/examples/gg/bezier_anim.v
new file mode 100644
index 0000000..2f54ac9
--- /dev/null
+++ b/v_windows/v/examples/gg/bezier_anim.v
@@ -0,0 +1,68 @@
+module main
+
+import gg
+import gx
+
+const rate = f32(1) / 60 * 10
+
+struct App {
+mut:
+ gg &gg.Context
+ anim &Anim
+}
+
+struct Anim {
+mut:
+ time f32
+ reverse bool
+}
+
+fn (mut anim Anim) advance() {
+ if anim.reverse {
+ anim.time -= 1 * rate
+ } else {
+ anim.time += 1 * rate
+ }
+ // Use some arbitrary value that fits 60 fps
+ if anim.time > 80 * rate || anim.time < -80 * rate {
+ anim.reverse = !anim.reverse
+ }
+}
+
+fn main() {
+ mut app := &App{
+ gg: 0
+ anim: &Anim{}
+ }
+ app.gg = gg.new_context(
+ bg_color: gx.rgb(174, 198, 255)
+ width: 600
+ height: 400
+ window_title: 'Animated cubic Bézier curve'
+ frame_fn: frame
+ user_data: app
+ )
+ app.gg.run()
+}
+
+fn frame(mut app App) {
+ time := app.anim.time
+
+ p1_x := f32(200.0)
+ p1_y := f32(200.0) + (10 * time)
+
+ p2_x := f32(400.0)
+ p2_y := f32(200.0) + (10 * time)
+
+ ctrl_p1_x := f32(200.0) + (40 * time)
+ ctrl_p1_y := f32(100.0)
+ ctrl_p2_x := f32(400.0) + (-40 * time)
+ ctrl_p2_y := f32(100.0)
+
+ points := [p1_x, p1_y, ctrl_p1_x, ctrl_p1_y, ctrl_p2_x, ctrl_p2_y, p2_x, p2_y]
+
+ app.gg.begin()
+ app.gg.draw_cubic_bezier(points, gx.blue)
+ app.gg.end()
+ app.anim.advance()
+}