|
|
@ -7,6 +7,10 @@ |
|
|
|
"SDL.h" |
|
|
|
"SDL_syswm.h") |
|
|
|
|
|
|
|
;; |
|
|
|
;; Core/windowing |
|
|
|
;; |
|
|
|
|
|
|
|
(forward-declare (struct SDL_Window) |
|
|
|
(struct SDL_AudioSpec)) |
|
|
|
|
|
|
@ -66,6 +70,65 @@ |
|
|
|
(SDL_DestroyWindow window) |
|
|
|
(SDL_Quit)) |
|
|
|
|
|
|
|
;; |
|
|
|
;; Graphics |
|
|
|
;; |
|
|
|
(defun sdl-list-2d-render-drivers (&return bool) |
|
|
|
(var num-render-drivers int (SDL_GetNumRenderDrivers)) |
|
|
|
(unless num-render-drivers |
|
|
|
(return false)) |
|
|
|
(var i int 0) |
|
|
|
(each-in-range |
|
|
|
num-render-drivers i |
|
|
|
(var driver-info SDL_RendererInfo (array 0)) |
|
|
|
(unless (= 0 (SDL_GetRenderDriverInfo i (addr driver-info))) |
|
|
|
(return false)) |
|
|
|
(SDL_Log "Renderer [%d]: %s\n |
|
|
|
\tHardware accelerated: %s\n |
|
|
|
\tRender to texture: %s\n |
|
|
|
\tMax texture width: %d\n |
|
|
|
\tMax texture height: %d\n |
|
|
|
\n" |
|
|
|
i (field driver-info name) |
|
|
|
(? (bit-and (field driver-info flags) SDL_RENDERER_ACCELERATED) "yes" "no") |
|
|
|
(? (bit-and (field driver-info flags) SDL_RENDERER_TARGETTEXTURE) "yes" "no") |
|
|
|
(field driver-info max_texture_width) |
|
|
|
(field driver-info max_texture_height))) |
|
|
|
(return true)) |
|
|
|
|
|
|
|
(defun-local sdl-texture-from-bmp (filename (* (const char)) renderer (* SDL_Renderer) |
|
|
|
&return (* SDL_Texture)) |
|
|
|
(var surface (* SDL_Surface) (SDL_LoadBMP filename)) |
|
|
|
(unless surface |
|
|
|
(SDL_Log "Failed to load surface from BMP %s\n" filename) |
|
|
|
(sdl-print-error) |
|
|
|
(return null)) |
|
|
|
|
|
|
|
(var texture (* SDL_Texture) |
|
|
|
(SDL_CreateTextureFromSurface renderer surface)) |
|
|
|
;; No need to hold on to surface after texture has been created |
|
|
|
(SDL_FreeSurface surface) |
|
|
|
(unless texture (sdl-print-error)) |
|
|
|
(return texture)) |
|
|
|
|
|
|
|
(defun-local sdl-texture-from-bmp-color-to-transparent |
|
|
|
(filename (* (const char)) renderer (* SDL_Renderer) r char g char b char |
|
|
|
&return (* SDL_Texture)) |
|
|
|
(var surface (* SDL_Surface) (SDL_LoadBMP filename)) |
|
|
|
(unless surface |
|
|
|
(SDL_Log "Failed to load surface from BMP %s\n" filename) |
|
|
|
(sdl-print-error) |
|
|
|
(return null)) |
|
|
|
|
|
|
|
(SDL_SetColorKey surface SDL_TRUE (SDL_MapRGB (path surface > format) r g b)) |
|
|
|
|
|
|
|
(var texture (* SDL_Texture) |
|
|
|
(SDL_CreateTextureFromSurface renderer surface)) |
|
|
|
;; No need to hold on to surface after texture has been created |
|
|
|
(SDL_FreeSurface surface) |
|
|
|
(unless texture (sdl-print-error)) |
|
|
|
(return texture)) |
|
|
|
|
|
|
|
;; |
|
|
|
;; Audio |
|
|
|
;; |
|
|
@ -101,6 +164,24 @@ |
|
|
|
(incr i)) |
|
|
|
(free device-names)) |
|
|
|
|
|
|
|
;; |
|
|
|
;; Time |
|
|
|
;; |
|
|
|
|
|
|
|
;; Useful for getting a quick idea how long something takes, e.g.: |
|
|
|
;; (var start-load-ticks (const Uint64) (SDL_GetPerformanceFrequency)) |
|
|
|
;; (do-load) |
|
|
|
;; (sdl-print-time-delta start-load-ticks "Loading done") |
|
|
|
;; ...Will print e.g. "--- Loading done at 0.94 seconds" |
|
|
|
(defun-local sdl-print-time-delta (start-num-perf-ticks Uint64 label (* (const char))) |
|
|
|
(var performance-num-ticks-per-second (const Uint64) (SDL_GetPerformanceFrequency)) |
|
|
|
|
|
|
|
(var current-counter-ticks Uint64 (SDL_GetPerformanceCounter)) |
|
|
|
(var frame-diff-ticks Uint64 (- current-counter-ticks start-num-perf-ticks)) |
|
|
|
(var delta-time float (/ frame-diff-ticks |
|
|
|
(type-cast performance-num-ticks-per-second float))) |
|
|
|
|
|
|
|
(SDL_Log "--- %s at %f seconds\n" label delta-time)) |
|
|
|
|
|
|
|
;; |
|
|
|
;; Test |
|
|
|