From 371f4fdd1b07c6141c1e7d6472cb156dfa822b09 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 19 Feb 2021 21:51:47 -0600 Subject: [PATCH] added slide animations --- dist/prez.wasm | Bin 34946 -> 36146 bytes initial.prez | 6 +- src/prez.onyx | 10 ++- src/slides.onyx | 164 ++++++++++++++++++++++++++++++++++++++++++------ todo | 6 +- 5 files changed, 162 insertions(+), 24 deletions(-) diff --git a/dist/prez.wasm b/dist/prez.wasm index fc27b1b27c4163d1037ae0652d3feafcde93fcbb..4ec8aced8c4354821333d4e802acce6a217b0cae 100644 GIT binary patch delta 10794 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 delta 9537 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 diff --git a/initial.prez b/initial.prez index ddecafc..5333bcb 100644 --- a/initial.prez +++ b/initial.prez @@ -1,4 +1,8 @@ -[aspect_ratio 4 3] +# This is the default "presentation" that is displayed when +# the page loads. This file is baked into the WASM binary, +# so any changes to this require the binary the be recompiled. + +[aspect_ratio 16 10] [slide] [background 60 60 60] [text_style inherit font_name "monospace" font_size 48 font_attr bold centered] diff --git a/src/prez.onyx b/src/prez.onyx index a2db31c..6c5bf14 100644 --- a/src/prez.onyx +++ b/src/prez.onyx @@ -54,7 +54,15 @@ poll_events :: () { loop :: () -> void #export "loop" { poll_events(); - if redraw > 0 { + slideshow_update_animation(^the_slideshow); + + if the_slideshow.current_animation != null { + Canvas.clear(canvas, 0, 0, 0, 1); + the_slideshow.current_animation->render(^the_slideshow); + } + elseif redraw > 0 { + Canvas.clear(canvas, 0, 0, 0, 1); + current_slide := slideshow_get_current_slide(^the_slideshow); slide_render(current_slide); diff --git a/src/slides.onyx b/src/slides.onyx index ac805c4..799cd92 100644 --- a/src/slides.onyx +++ b/src/slides.onyx @@ -20,6 +20,7 @@ Slideshow :: struct { slides : [..] Slide; current_slide : i32; + current_animation : ^Slide_Animation; image_map : map.Map(str, HTML_Image); } @@ -28,6 +29,8 @@ Slide :: struct { background : Color; aspect_ratio : f32 = 1; + animation_generator : (i32, i32) -> ^Slide_Animation; + items : [] ^Slide_Item; } @@ -131,8 +134,18 @@ slideshow_get_current_slide :: (use s: ^Slideshow) -> ^Slide { } slideshow_advance_slide :: (use s: ^Slideshow, count := 1) { + if current_animation != null do return; + + old_slide := current_slide; + current_slide += count; current_slide = math.clamp(current_slide, 0, slides.count - 1); + + if old_slide != current_slide { + if slides[current_slide].animation_generator == null_proc do return; + + current_animation = slides[current_slide].animation_generator(old_slide, current_slide); + } } slideshow_insert_slide :: (use s: ^Slideshow, at := -1) -> ^Slide { @@ -169,10 +182,24 @@ slideshow_load_image :: (use s: ^Slideshow, image_name: str, image_path: str) -> return image; } +slideshow_update_animation :: (use s: ^Slideshow) { + if current_animation == null do return; + + if current_animation->update() { + cfree(current_animation); + current_animation = null; + } +} + + + + slide_init :: (use slide: ^Slide, background_color := Color.{0, 0, 0, 1}, item_count := 4, aspect := 1.0f) { background = background_color; aspect_ratio = aspect; + animation_generator = fade_animation_make; + if item_count > 0 { items = memory.make_slice(#type ^Slide_Item, item_count); memory.set(items.data, 0, items.count * sizeof ^Slide_Item); @@ -183,13 +210,6 @@ slide_init :: (use slide: ^Slide, background_color := Color.{0, 0, 0, 1}, item_c } slide_render :: (use slide: ^Slide) { - // I would like to alias Canvas to C here, but right now - // this does not work: - // - // C :: Canvas - // - Canvas.clear(canvas, 0, 0, 0, 1); - canvas_width, canvas_height := cast(f32) Canvas.get_width(canvas), cast(f32) Canvas.get_height(canvas); width, height := 0.0f, 0.0f; x, y := 0.0f, 0.0f; @@ -206,18 +226,21 @@ slide_render :: (use slide: ^Slide) { y = (canvas_height - height) / 2; } - transform := f32.[ 1, 0, 0, 1, x, y ]; - identity := f32.[ 1, 0, 0, 1, 0, 0 ]; + old_transform : [6] f32; + Canvas.get_transform(canvas, old_transform); + + transform := f32.[ 1, 0, 0, 1, + x + old_transform[4], + y + old_transform[5] ]; Canvas.set_transform(canvas, transform); - defer Canvas.set_transform(canvas, identity); + defer Canvas.set_transform(canvas, old_transform); Canvas.fill_rect(canvas, 0, 0, width, height, background.r, background.g, background.b, background.a); for item: items do if item != null do slide_item_render(item, slide, width, height); } -slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide, - width: f32, height: f32) { +slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide, width: f32, height: f32) { use Canvas use Slide_Item.Kind @@ -238,15 +261,11 @@ slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide, } case Left { - use Canvas - x, y := text.padding * width, text.y_pos * height; fill_text(canvas, text.text, x, y); } case Right { - use Canvas - font_metrics: TextMetrics; measure_text(canvas, text.text, ^font_metrics); @@ -257,8 +276,6 @@ slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide, } case Image { - use Canvas - if html_image := map.get(^the_slideshow.image_map, image.name); html_image.handle != -1 { // @Speed: There is a much better way of doing this... // @Robustness: Currently, because HTML images are asynchronously loaded, @@ -287,8 +304,6 @@ slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide, } case Rect { - use Canvas - x := rect.x * width; y := rect.y * height; w := rect.w * width; @@ -331,3 +346,112 @@ aprintf :: (allocator: Allocator, format: str, va: ...) -> str { output := string.alloc_copy(formatted, allocator = allocator); return output; } + + + + + +// +// Slide Animations +// + +Slide_Animation :: struct { + render : (anim: ^Slide_Animation, slideshow: ^Slideshow) -> void; + update : (anim: ^Slide_Animation) -> bool; + + source_slide : i32 = -1; + target_slide : i32 = -1; +} + +Slide_Animation_Swipe :: struct { + use base := Slide_Animation.{ + update = swipe_animation_update, + render = swipe_animation_render + }; + + t : f32 = 0; + dt : f32 = 0.03; +} + +swipe_animation_make :: (source := -1, target := -1) -> ^Slide_Animation { + anim := new(Slide_Animation_Swipe); + *anim = Slide_Animation_Swipe.{}; + + anim.source_slide = source; + anim.target_slide = target; + + return anim; +} + +#private_file +swipe_animation_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]; + + canvas_width := cast(f32) Canvas.get_width(canvas); + + 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); + + trans[4] -= canvas_width * multiplier; + Canvas.set_transform(canvas, trans); + slide_render(target); +} + +Slide_Animation_Fade :: struct { + use base := Slide_Animation.{ + update = fade_animation_update, + render = fade_animation_render + }; + + t : f32 = 0; + dt : f32 = 0.03; +} + +fade_animation_make :: (source := -1, target := -1) -> ^Slide_Animation { + anim := new(Slide_Animation_Fade); + *anim = Slide_Animation_Fade.{}; + + anim.source_slide = source; + anim.target_slide = target; + + return anim; +} + +#private_file +fade_animation_update :: (use anim: ^Slide_Animation_Fade) -> bool { + t += dt; + return t >= 1; +} + +#private_file +fade_animation_render :: (use anim: ^Slide_Animation_Fade, 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); + + 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); + } +} + diff --git a/todo b/todo index 0ebe506..1248765 100644 --- a/todo +++ b/todo @@ -1,5 +1,7 @@ [X] Image borders [X] Fixed aspect ratio slides -[ ] Slide animation: Slide from Right -[ ] Slide animatoin: Fade +[X] Slide animation: Slide from Right +[X] Slide animation: Fade + +[ ] Slide animation config in text format -- 2.25.1