From d85590fc191a475c6b0eba0b9a0af4da6792bc22 Mon Sep 17 00:00:00 2001 From: Macoy Madson Date: Wed, 31 Aug 2022 21:06:37 -0400 Subject: [PATCH] Add slide data, slide controls * Bind various keys for advancing slides * Disable debug font atlas rendering * Add Handmade-Math dependency for no reason. I only wanted Math for interpolate. Oh well. * Add presentation data structure and an example presentation * Tweaked text placement --- .gitmodules | 3 + Dependencies/Handmade-Math | 1 + data/DrivingCodeWithData.cakedata | 6 ++ src/Presentation.cake | 145 ++++++++++++++++++++++-------- 4 files changed, 120 insertions(+), 35 deletions(-) create mode 160000 Dependencies/Handmade-Math create mode 100644 data/DrivingCodeWithData.cakedata diff --git a/.gitmodules b/.gitmodules index 312f101..b4a3092 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "Dependencies/FreeType"] path = Dependencies/FreeType url = https://gitlab.freedesktop.org/freetype/freetype.git +[submodule "Dependencies/Handmade-Math"] + path = Dependencies/Handmade-Math + url = https://github.com/HandmadeMath/Handmade-Math diff --git a/Dependencies/Handmade-Math b/Dependencies/Handmade-Math new file mode 160000 index 0000000..ba5405a --- /dev/null +++ b/Dependencies/Handmade-Math @@ -0,0 +1 @@ +Subproject commit ba5405ac0fb3f899845fe47d80364e4d1fd5c866 diff --git a/data/DrivingCodeWithData.cakedata b/data/DrivingCodeWithData.cakedata new file mode 100644 index 0000000..0e62bc9 --- /dev/null +++ b/data/DrivingCodeWithData.cakedata @@ -0,0 +1,6 @@ +(presentation-data + :slides + (array + (slide-data :heading "Driving code with data" :body "Macoy Madson") + (slide-data :heading "Setting the stage") + (slide-data :heading "Slide 2" :body "More blah"))) diff --git a/src/Presentation.cake b/src/Presentation.cake index 501db93..797eea3 100644 --- a/src/Presentation.cake +++ b/src/Presentation.cake @@ -3,13 +3,17 @@ (add-cakelisp-search-directory "Dependencies/cakelisp/runtime") (add-cakelisp-search-directory "src") -(import "FontAtlas.cake" +(import + "FontAtlas.cake" ;; GameLib - "SDL.cake" "DynamicArray.cake" "Dictionary.cake" "DataBundle.cake") + "Introspection.cake" "SDL.cake" "DynamicArray.cake" "Dictionary.cake" "DataBundle.cake" + "Math.cake") (c-import "" &with-decls "") +(var s-draw-atlases bool false) + (bundle-file s-start-ubuntu-regular-font s-end-ubuntu-regular-font (unsigned char) "data/Fonts/Ubuntu-R.ttf") @@ -17,6 +21,13 @@ (unsigned char) "data/Fonts/UbuntuMono-R.ttf") (define-keybind s-quit-keybind (array SDL_SCANCODE_Q keybind-modifier-flags-ctrl)) +(define-keybind s-next-slide-keybind (array SDL_SCANCODE_RIGHT) + (array SDL_SCANCODE_SPACE) + (array SDL_SCANCODE_RETURN) + (array SDL_SCANCODE_PAGEDOWN)) +(define-keybind s-previous-slide-keybind (array SDL_SCANCODE_LEFT) + (array SDL_SCANCODE_BACKSPACE) + (array SDL_SCANCODE_PAGEUP)) (var s-key-states sdl-key-states (array 0)) @@ -30,6 +41,20 @@ (fprintf stderr (token-splice format))))) (return true)) +;; +;; Slides +;; + +(def-introspect-struct slide-data + heading ([] 256 char) + body ([] 1024 char)) + +(def-introspect-struct presentation-data + slides ([] 256 slide-data) ('array-allow-subset)) + +(bundle-file s-start-presentation s-end-presentation + (const char) "data/DrivingCodeWithData.cakedata") + ;; ;; Text rendering ;; @@ -166,6 +191,28 @@ ;; current-key-states is owned by SDL, but we own last-frame-states (defer (dynarray-free (field s-key-states last-frame-states))) + (var presentation presentation-data (array 0)) + (scope + ;; TODO: Take string size rather than requiring null terminator + (var presentation-string-length int (- s-end-presentation s-start-presentation)) + (var-cast-to presentation-string-null-terminated (* char) + (malloc (+ 1 presentation-string-length))) + (defer (free presentation-string-null-terminated)) + (strncpy presentation-string-null-terminated s-start-presentation presentation-string-length) + (set (at presentation-string-length presentation-string-null-terminated) 0) + (unless (read-introspect-struct-s-expr + presentation-data--metadata + (addr presentation) + presentation-string-null-terminated + malloc + null) + (preslog "Failed to read presentation data\n") + (return false))) + (defer (free-introspect-struct-fields presentation-data--metadata (addr presentation) free)) + + (var current-slide int 0) + (var slide-start-ticks Uint64 0) + (var exit-reason (* (const char)) null) (while true (var event SDL_Event) @@ -173,53 +220,81 @@ (when (= (field event type) SDL_QUIT) (set exit-reason "Window event"))) + (var window-width int 0) + (var window-height int 0) + (SDL_GetWindowSize window (addr window-width) (addr window-height)) + (var num-keys int 0) (set (field s-key-states this-frame-states) (SDL_GetKeyboardState (addr num-keys))) (when (keybind-tapped (addr s-quit-keybind) (addr s-key-states)) (set exit-reason "Quit keybind pressed")) + (when (keybind-tapped (addr s-next-slide-keybind) (addr s-key-states)) + (set slide-start-ticks (SDL_GetPerformanceCounter)) + (incr current-slide) + (unless (at 0 (field (at current-slide (field presentation slides)) heading)) + (set current-slide (- current-slide 1)))) + (when (keybind-tapped (addr s-previous-slide-keybind) (addr s-key-states)) + (set slide-start-ticks (SDL_GetPerformanceCounter)) + (decr current-slide) + (when (< current-slide 0) + (set current-slide 0))) + (SDL_SetRenderDrawColor renderer 17 17 17 255) (SDL_RenderClear renderer) - (defstruct atlas-set - atlas (* font-atlas) - texture (* SDL_Texture)) - (var atlases-to-draw ([] atlas-set) - (array (array (addr ubuntu-regular-font-atlas) - ubuntu-regular-texture) - (array (addr ubuntu-mono-font-atlas) - ubuntu-mono-texture))) - (each-in-array atlases-to-draw i - (var source-rectangle SDL_Rect - (array 0 0 - (path (at i atlases-to-draw) . atlas > width) - (path (at i atlases-to-draw) . atlas > height))) - (var destination-rectangle SDL_Rect - (array (* (+ 50 (path (at i atlases-to-draw) . atlas > width)) i) 0 - (path (at i atlases-to-draw) . atlas > width) - (path (at i atlases-to-draw) . atlas > height))) - (unless (= 0 (SDL_RenderCopy renderer (path (at i atlases-to-draw) . texture) - (addr source-rectangle) (addr destination-rectangle))) - (sdl-print-error) - (set exit-reason "SDL failed to render font atlas"))) + (when s-draw-atlases + (defstruct atlas-set + atlas (* font-atlas) + texture (* SDL_Texture)) + (var atlases-to-draw ([] atlas-set) + (array (array (addr ubuntu-regular-font-atlas) + ubuntu-regular-texture) + (array (addr ubuntu-mono-font-atlas) + ubuntu-mono-texture))) + (each-in-array atlases-to-draw i + (var source-rectangle SDL_Rect + (array 0 0 + (path (at i atlases-to-draw) . atlas > width) + (path (at i atlases-to-draw) . atlas > height))) + (var destination-rectangle SDL_Rect + (array (* (+ 50 (path (at i atlases-to-draw) . atlas > width)) i) 0 + (path (at i atlases-to-draw) . atlas > width) + (path (at i atlases-to-draw) . atlas > height))) + (unless (= 0 (SDL_RenderCopy renderer (path (at i atlases-to-draw) . texture) + (addr source-rectangle) (addr destination-rectangle))) + (sdl-print-error) + (set exit-reason "SDL failed to render font atlas")))) + + ;; (var slide-time-seconds float (/ (- (SDL_GetPerformanceCounter) slide-start-ticks) + ;; (type-cast (SDL_GetPerformanceFrequency) float))) + ;; (var text-x int (- 0 window-width)) + ;; (if (< slide-time-seconds 0.1f) + ;; (set text-x (interpolate-range -400 200 0.f 0.1f slide-time-seconds)) + ;; (set text-x 200)) + + (var text-x int 0) + + (var slide (* slide-data) (addr (at current-slide (field presentation slides)))) (render-string renderer (addr ubuntu-regular-font-atlas) ubuntu-regular-texture - 200 400 - "Hello, text renderer!\nWe have a problem") + (+ text-x (/ window-width 5)) (/ window-height 8) + (path slide > heading)) (render-string renderer (addr ubuntu-mono-font-atlas) ubuntu-mono-texture - 200 600 - #"# - result= FT_Set_Char_Size(typeface, 0, (16 * 64), 300, 300); - if (!((result== FT_Err_Ok))) - { - fprintf(stderr, "error: encountered error %d while %s\n", result, "setting character size"); - FT_Done_Face(typeface); - FT_Done_FreeType(freetypeLibrary); - return 1; - }#"#) + (+ text-x (/ window-width 5)) (/ window-height 3) + (path slide > body)) + ;; #"# + ;; result= FT_Set_Char_Size(typeface, 0, (16 * 64), 300, 300); + ;; if (!((result== FT_Err_Ok))) + ;; { + ;; fprintf(stderr, "error: encountered error %d while %s\n", result, "setting character size"); + ;; FT_Done_Face(typeface); + ;; FT_Done_FreeType(freetypeLibrary); + ;; return 1; + ;; }#"#) (SDL_RenderPresent renderer) (SDL_UpdateWindowSurface window)