diff --git a/src/rl.clj b/src/rl.clj index bc7a643..58c4877 100644 --- a/src/rl.clj +++ b/src/rl.clj @@ -49,9 +49,122 @@ [::mem/struct [[:base-size ::mem/int] [:glyph-count ::mem/int] [:glyph-padding ::mem/int] [:texture ::texture] [:recs ::mem/pointer] [:glyphs ::mem/pointer]]]) +(defalias ::n-patch-info + [::mem/struct [[:source ::rectangle] [:left ::mem/int] [:top ::mem/int] + [:right ::mem/int] [:bottom ::mem/int] [:layout ::mem/int]]]) + ;;; ----------------------------------------------------------------- constants +;; KeyboardKey, raylib.h. +(def ^:const key-null 0) +(def ^:const key-apostrophe 39) +(def ^:const key-comma 44) +(def ^:const key-minus 45) +(def ^:const key-period 46) +(def ^:const key-slash 47) +(def ^:const key-zero 48) +(def ^:const key-one 49) +(def ^:const key-two 50) +(def ^:const key-three 51) +(def ^:const key-four 52) +(def ^:const key-five 53) +(def ^:const key-six 54) +(def ^:const key-seven 55) +(def ^:const key-eight 56) +(def ^:const key-nine 57) +(def ^:const key-semicolon 59) +(def ^:const key-equal 61) +(def ^:const key-a 65) +(def ^:const key-b 66) +(def ^:const key-c 67) +(def ^:const key-d 68) +(def ^:const key-e 69) +(def ^:const key-f 70) +(def ^:const key-g 71) +(def ^:const key-h 72) +(def ^:const key-i 73) +(def ^:const key-j 74) +(def ^:const key-k 75) +(def ^:const key-l 76) +(def ^:const key-m 77) +(def ^:const key-n 78) +(def ^:const key-o 79) +(def ^:const key-p 80) +(def ^:const key-q 81) (def ^:const key-r 82) +(def ^:const key-s 83) +(def ^:const key-t 84) +(def ^:const key-u 85) +(def ^:const key-v 86) +(def ^:const key-w 87) +(def ^:const key-x 88) +(def ^:const key-y 89) +(def ^:const key-z 90) +(def ^:const key-left-bracket 91) +(def ^:const key-backslash 92) +(def ^:const key-right-bracket 93) +(def ^:const key-grave 96) + +(def ^:const key-space 32) +(def ^:const key-escape 256) +(def ^:const key-enter 257) +(def ^:const key-tab 258) +(def ^:const key-backspace 259) +(def ^:const key-insert 260) +(def ^:const key-delete 261) +(def ^:const key-right 262) +(def ^:const key-left 263) +(def ^:const key-down 264) +(def ^:const key-up 265) +(def ^:const key-page-up 266) +(def ^:const key-page-down 267) +(def ^:const key-home 268) +(def ^:const key-end 269) +(def ^:const key-caps-lock 280) +(def ^:const key-scroll-lock 281) +(def ^:const key-num-lock 282) +(def ^:const key-print-screen 283) +(def ^:const key-pause 284) +(def ^:const key-f1 290) +(def ^:const key-f2 291) +(def ^:const key-f3 292) +(def ^:const key-f4 293) +(def ^:const key-f5 294) +(def ^:const key-f6 295) +(def ^:const key-f7 296) +(def ^:const key-f8 297) +(def ^:const key-f9 298) +(def ^:const key-f10 299) +(def ^:const key-f11 300) +(def ^:const key-f12 301) +(def ^:const key-left-shift 340) +(def ^:const key-left-control 341) +(def ^:const key-left-alt 342) +(def ^:const key-left-super 343) +(def ^:const key-right-shift 344) +(def ^:const key-right-control 345) +(def ^:const key-right-alt 346) +(def ^:const key-right-super 347) +(def ^:const key-kb-menu 348) + +(def ^:const key-kp-0 320) +(def ^:const key-kp-1 321) +(def ^:const key-kp-2 322) +(def ^:const key-kp-3 323) +(def ^:const key-kp-4 324) +(def ^:const key-kp-5 325) +(def ^:const key-kp-6 326) +(def ^:const key-kp-7 327) +(def ^:const key-kp-8 328) +(def ^:const key-kp-9 329) +(def ^:const key-kp-decimal 330) +(def ^:const key-kp-divide 331) +(def ^:const key-kp-multiply 332) +(def ^:const key-kp-subtract 333) +(def ^:const key-kp-add 334) +(def ^:const key-kp-enter 335) +(def ^:const key-kp-equal 336) + (def ^:const mouse-button-left 0) (def ^:const log-warning 4) (def ^:const pixelformat-r8g8b8a8 7) @@ -73,6 +186,7 @@ (defcfn key-pressed? "IsKeyPressed" [::mem/int] ::bool) (defcfn mouse-button-down? "IsMouseButtonDown" [::mem/int] ::bool) +(defcfn mouse-button-pressed? "IsMouseButtonPressed" [::mem/int] ::bool) (defcfn mouse-button-released? "IsMouseButtonReleased" [::mem/int] ::bool) (defcfn get-mouse-position "GetMousePosition" [] ::vector-2) @@ -89,15 +203,51 @@ [x y w h color] (draw-rectangle-raw!* (int x) (int y) (int w) (int h) color)) +(def ^:private draw-rectangle-lines-raw!* + (ffi/make-downcall "DrawRectangleLines" + [::mem/int ::mem/int ::mem/int ::mem/int ::color] ::mem/void)) + +(defn draw-rectangle-lines!* + [x y w h color] + (draw-rectangle-lines-raw!* (int x) (int y) (int w) (int h) color)) + (def update-texture!* (ffi/make-downcall "UpdateTexture" [::texture ::mem/pointer] ::mem/void)) +(def ^:private draw-texture-raw!* + (ffi/make-downcall "DrawTexture" [::texture ::mem/int ::mem/int ::color] ::mem/void)) + +(defn draw-texture!* + [texture x y color] + (draw-texture-raw!* texture (int x) (int y) color)) + +(def draw-texture-v!* + (ffi/make-downcall "DrawTextureV" [::texture ::vector-2 ::color] ::mem/void)) + +(def ^:private draw-texture-ex-raw!* + (ffi/make-downcall "DrawTextureEx" + [::texture ::vector-2 ::mem/float ::mem/float ::color] ::mem/void)) + +(defn draw-texture-ex!* + [texture position rotation scale color] + (draw-texture-ex-raw!* texture position (float rotation) (float scale) color)) + +(def draw-texture-rec!* + (ffi/make-downcall "DrawTextureRec" + [::texture ::rectangle ::vector-2 ::color] ::mem/void)) + (def draw-texture-pro!* (ffi/make-downcall "DrawTexturePro" [::texture ::rectangle ::rectangle ::vector-2 ::mem/float ::color] ::mem/void)) +(def draw-texture-n-patch!* + (ffi/make-downcall "DrawTextureNPatch" + [::texture ::n-patch-info ::rectangle ::vector-2 ::mem/float ::color] + ::mem/void)) + ;; Called once at startup, so the map-taking form is fine. +(defcfn load-texture-raw* "LoadTexture" [::mem/c-string] ::texture) (defcfn load-texture-from-image "LoadTextureFromImage" [::image] ::texture) (defcfn unload-texture! "UnloadTexture" [::texture] ::mem/void) (defcfn set-texture-filter! "SetTextureFilter" [::texture ::mem/int] ::mem/void) @@ -105,6 +255,10 @@ (defcfn measure-text "MeasureText" [::mem/c-string ::mem/int] ::mem/int) +(defn load-texture [path] + (let [tex (load-texture-raw* path)] + (assoc tex :seg (texture-seg tex)))) + (def ^:private draw-text-raw!* (ffi/make-downcall "DrawText" [::mem/c-string ::mem/int ::mem/int ::mem/int ::color] ::mem/void)) @@ -135,17 +289,46 @@ (defn color-seg "Serialize a packed 0xRRGGBB int into a reusable native Color, once." - [^long hex] - (mem/serialize {:r (bit-and (bit-shift-right hex 16) 0xFF) - :g (bit-and (bit-shift-right hex 8) 0xFF) - :b (bit-and hex 0xFF) - :a 255} - ::color arena)) + ([^long hex] (color-seg hex 255)) + ([^long hex ^long alpha] + (mem/serialize {:r (bit-and (bit-shift-right hex 16) 0xFF) + :g (bit-and (bit-shift-right hex 8) 0xFF) + :b (bit-and hex 0xFF) + :a alpha} + ::color arena)) + ([^long r ^long g ^long b ^long a] + (mem/serialize {:r r :g g :b b :a a} ::color arena))) (def black (color-seg 0x000000)) (def white (color-seg 0xFFFFFF)) (def cornflower-blue (color-seg 0x6495ED)) +;; raylib.h's named palette. +(def light-gray (color-seg 200 200 200 255)) +(def gray (color-seg 130 130 130 255)) +(def dark-gray (color-seg 80 80 80 255)) +(def yellow (color-seg 253 249 0 255)) +(def gold (color-seg 255 203 0 255)) +(def orange (color-seg 255 161 0 255)) +(def pink (color-seg 255 109 194 255)) +(def red (color-seg 230 41 55 255)) +(def maroon (color-seg 190 33 55 255)) +(def green (color-seg 0 228 48 255)) +(def lime (color-seg 0 158 47 255)) +(def dark-green (color-seg 0 117 44 255)) +(def sky-blue (color-seg 102 191 255 255)) +(def blue (color-seg 0 121 241 255)) +(def dark-blue (color-seg 0 82 172 255)) +(def purple (color-seg 200 122 255 255)) +(def violet (color-seg 135 60 190 255)) +(def dark-purple (color-seg 112 31 126 255)) +(def beige (color-seg 211 176 131 255)) +(def brown (color-seg 127 106 79 255)) +(def dark-brown (color-seg 76 63 47 255)) +(def blank (color-seg 0 0 0 0)) +(def magenta (color-seg 255 0 255 255)) +(def ray-white (color-seg 245 245 245 255)) + (defn rect-seg [x y w h] (mem/serialize {:x (float x) :y (float y) :width (float w) :height (float h)} ::rectangle arena)) @@ -156,6 +339,11 @@ (defn texture-seg [tex] (mem/serialize tex ::texture arena)) +(defn n-patch-info-seg [{:keys [source left top right bottom layout]}] + (mem/serialize {:source source :left (int left) :top (int top) + :right (int right) :bottom (int bottom) :layout (int layout)} + ::n-patch-info arena)) + (defn font-seg [font] (mem/serialize font ::font arena))