From 344db13b6c1dc1c2de64d646b31bca31076c472e Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sat, 20 Feb 2021 14:02:14 -0600 Subject: [PATCH] added ridiculous wiper animation --- dist/index.js | 12 ++++ dist/prez.wasm | Bin 38399 -> 38921 bytes onyx.prez | 61 +++++++++++++---- src/canvas.onyx | 3 + src/show_parser.onyx | 3 +- src/slides.onyx | 159 ++++++++++++++++++++++++++++--------------- 6 files changed, 170 insertions(+), 68 deletions(-) diff --git a/dist/index.js b/dist/index.js index d966c3d..c44496f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -161,6 +161,18 @@ let canvas_import_obj = { data_view.setFloat32(20, transform.f, true); }, + setScissor(canvas, x, y, w, h) { + canvasCtx.save(); + + canvasCtx.beginPath(); + canvasCtx.rect(x, y, w, h); + canvasCtx.clip(); + }, + + clearScissor(canvas) { + canvasCtx.restore(); + }, + measureText(canvas, text_ptr, text_len, measure_ptr) { const data = new Uint8Array(wasm_instance.exports.memory.buffer, text_ptr, text_len); const text = new TextDecoder().decode(data); diff --git a/dist/prez.wasm b/dist/prez.wasm index 7978033d617b2b6719fd8ac70c8cabf8b067b557..f8fed65ff1a2e7f8064b4f6c70aecfa5e0d65e49 100644 GIT binary patch delta 10154 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 delta 9709 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 void #foreign "canvas" "setTransform" --- get_transform :: (handle: Handle, out_matrix: TransformMatrix) -> void #foreign "canvas" "getTransform" --- + + set_scissor :: (handle: Handle, x: f32, y: f32, w: f32, h: f32) -> void #foreign "canvas" "setScissor" --- + clear_scissor :: (handle: Handle) -> void #foreign "canvas" "clearScissor" --- TextMetrics :: struct { width : f32; diff --git a/src/show_parser.onyx b/src/show_parser.onyx index 5939e72..591d693 100644 --- a/src/show_parser.onyx +++ b/src/show_parser.onyx @@ -30,10 +30,11 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { variables := map.make(str, u32); defer map.free(^variables); - animations := map.make(str, #type (Allocator) -> ^Slide_Animation, default=null_proc, hash_count=2); + animations := map.make(str, #type (Allocator) -> ^Slide_Animation, default=null_proc, hash_count=4); defer map.free(^animations); map.put(^animations, "swipe", Slide_Animation_Swipe.make); map.put(^animations, "fade", Slide_Animation_Fade.make); + map.put(^animations, "wiper", Slide_Animation_Wiper.make); parse_context := ParseContext.{ ^show_reader, ^variables }; diff --git a/src/slides.onyx b/src/slides.onyx index ea6717b..413ba1a 100644 --- a/src/slides.onyx +++ b/src/slides.onyx @@ -372,9 +372,9 @@ Slide_Animation :: struct { Slide_Animation_Swipe :: struct { use base := Slide_Animation.{ - init = swipe_animation_init, - update = swipe_animation_update, - render = swipe_animation_render + init = init, + update = update, + render = render }; t : f32 = 0; @@ -387,47 +387,45 @@ Slide_Animation_Swipe :: struct { return anim; } -} -#private_file -swipe_animation_init :: (use anim: ^Slide_Animation_Swipe, source := -1, target := -1) { - source_slide = source; - target_slide = target; + init :: (use anim: ^Slide_Animation_Swipe, source := -1, target := -1) { + source_slide = source; + target_slide = target; - t = 0; -} + t = 0; + } -#private_file -swipe_animation_update :: (use anim: ^Slide_Animation_Swipe) -> bool { - t += dt; - return t >= 1; -} + update :: (use anim: ^Slide_Animation_Swipe) -> bool { + t += dt; + return t >= 1; + } -#private_file -swipe_animation_render :: (use anim: ^Slide_Animation_Swipe, slideshow: ^Slideshow) { - source := ^slideshow.slides[source_slide]; - target := ^slideshow.slides[target_slide]; + render :: (use anim: ^Slide_Animation_Swipe, slideshow: ^Slideshow) { + source := ^slideshow.slides[source_slide]; + target := ^slideshow.slides[target_slide]; - canvas_width := cast(f32) Canvas.get_width(canvas); + canvas_width := cast(f32) Canvas.get_width(canvas); - multiplier := -1.0f; - if target_slide < source_slide do multiplier = 1; + multiplier := -1.0f; + if target_slide < source_slide do multiplier = 1; - offset := (1 - math.pow(1 - t, 3)) * canvas_width * multiplier; - trans := f32.[ 1, 0, 0, 1, offset, 0 ]; - Canvas.set_transform(canvas, trans); - slide_render(source); + offset := (1 - math.pow(1 - t, 3)) * canvas_width * multiplier; + trans := f32.[ 1, 0, 0, 1, offset, 0 ]; + Canvas.set_transform(canvas, trans); + slide_render(source); - trans[4] -= canvas_width * multiplier; - Canvas.set_transform(canvas, trans); - slide_render(target); + trans[4] -= canvas_width * multiplier; + Canvas.set_transform(canvas, trans); + slide_render(target); + } } + Slide_Animation_Fade :: struct { use base := Slide_Animation.{ - init = fade_animation_init, - update = fade_animation_update, - render = fade_animation_render + init = init, + update = update, + render = render }; t : f32 = 0; @@ -440,39 +438,92 @@ Slide_Animation_Fade :: struct { return anim; } -} -#private_file -fade_animation_init :: (use anim: ^Slide_Animation_Fade, source := -1, target := -1) { - source_slide = source; - target_slide = target; + init :: (use anim: ^Slide_Animation_Fade, source := -1, target := -1) { + source_slide = source; + target_slide = target; - t = 0; -} + t = 0; + } + + update :: (use anim: ^Slide_Animation_Fade) -> bool { + t += dt; + return t >= 1; + } + + render :: (use anim: ^Slide_Animation_Fade, slideshow: ^Slideshow) { + source := ^slideshow.slides[source_slide]; + target := ^slideshow.slides[target_slide]; -#private_file -fade_animation_update :: (use anim: ^Slide_Animation_Fade) -> bool { - t += dt; - return t >= 1; + canvas_width, canvas_height := cast(f32) Canvas.get_width(canvas), cast(f32) Canvas.get_height(canvas); + + if t < 0.5 { + slide_render(source); + + Canvas.fill_rect(canvas, 0, 0, canvas_width, canvas_height, + 0, 0, 0, t * 2); + } else { + slide_render(target); + + Canvas.fill_rect(canvas, 0, 0, canvas_width, canvas_height, + 0, 0, 0, (1 - t) * 2); + } + } } -#private_file -fade_animation_render :: (use anim: ^Slide_Animation_Fade, slideshow: ^Slideshow) { - source := ^slideshow.slides[source_slide]; - target := ^slideshow.slides[target_slide]; +Slide_Animation_Wiper :: struct { + use base := Slide_Animation.{ + init = init, + update = update, + render = render + }; - canvas_width, canvas_height := cast(f32) Canvas.get_width(canvas), cast(f32) Canvas.get_height(canvas); + t : f32 = 0; + dt : f32 = 0.03; + + draw_line := false; + + make :: (allocator := context.allocator) -> ^Slide_Animation_Wiper { + anim := new(Slide_Animation_Wiper, allocator=allocator); + *anim = Slide_Animation_Wiper.{}; + + return anim; + } - if t < 0.5 { + init :: (use anim: ^Slide_Animation_Wiper, source := -1, target := -1) { + source_slide = source; + target_slide = target; + + t = 0; + } + + update :: (use anim: ^Slide_Animation_Wiper) -> bool { + t += dt; + return t >= 1; + } + + render :: (use anim: ^Slide_Animation_Wiper, slideshow: ^Slideshow) { + source := ^slideshow.slides[source_slide]; + target := ^slideshow.slides[target_slide]; + + canvas_width, canvas_height := cast(f32) Canvas.get_width(canvas), cast(f32) Canvas.get_height(canvas); + + x := t * canvas_width; + y := 0.0f; + w := (1 - t) * canvas_width; + h := canvas_height; + + Canvas.set_scissor(canvas, x, y, w, h); slide_render(source); + Canvas.clear_scissor(canvas); - Canvas.fill_rect(canvas, 0, 0, canvas_width, canvas_height, - 0, 0, 0, t * 2); - } else { + x = 0; + w = canvas_width - w; + Canvas.set_scissor(canvas, x, y, w, h); slide_render(target); + Canvas.clear_scissor(canvas); - Canvas.fill_rect(canvas, 0, 0, canvas_width, canvas_height, - 0, 0, 0, (1 - t) * 2); + if draw_line do Canvas.fill_rect(canvas, t * canvas_width - 2, 0, 4, canvas_height, 1, 1, 1, 1); } } -- 2.25.1