garden/go.fnl

42 lines
1.5 KiB
Fennel

; LIBGL_ALWAYS_INDIRECT=1
(local fennel (require :fennel))
(import-macros {: def : q : ttype : static : eval : printform} :terra)
(local SDL (require :SDL))
(local CreateWindowAndRenderer (def [w int h int flags uint32]
(var window [SDL.Window] nil)
(var renderer [SDL.Renderer] nil)
(var result (SDL.CreateWindowAndRenderer w h flags (& window) (& renderer)))
(return result window renderer)))
(local clear (static (def [renderer [SDL.Renderer]]
(SDL.SetRenderDrawColor renderer 0 0 0 255)
(SDL.RenderClear renderer))))
(local hello (def [renderer [SDL.Renderer]]
(clear renderer)
(SDL.SetRenderDrawColor renderer 0 0 255 255)
(var rect (SDL.Rect {x 100 y 100 w 50 h 30}))
(SDL.RenderFillRect renderer (& rect))
(SDL.RenderPresent renderer)))
(local last-event (printform (static (q (SDL.Event {type 0})))))
(fn event-loop [f]
(while (not= (SDL.PollEvent (last-event:getpointer)) 0) (f (last-event:get))))
(local rect (def [x int y int w int h int]
(return (SDL.Rect {x x y y w w h h}))))
(fn patch-clear [r g b]
(let [new-clear (def [renderer [SDL.Renderer]]
(SDL.SetRenderDrawColor renderer r g b 255)
(SDL.RenderClear renderer))]
((def [] (set clear new-clear))))) ; no idea why (clear:set new-clear) doesn't work
(SDL.Init SDL.INIT_EVERYTHING)
(let [windowflags SDL.WINDOW_RESIZABLE
(ok window renderer) (unpacktuple (CreateWindowAndRenderer 640 480 windowflags))]
(event-loop #nil)
(hello renderer)
{: window : renderer : rect : event-loop : clear : hello : patch-clear})