ruby2d 0.12.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -0
  3. data/README.md +141 -0
  4. data/USAGE.md +2435 -0
  5. data/assets/Rakefile +637 -0
  6. data/assets/build_support/CMakeLists.txt +94 -0
  7. data/assets/build_support/mruby/build_config.rb +34 -0
  8. data/assets/build_support/mruby/build_config_wasm.rb +30 -0
  9. data/assets/build_support/sdl_test.c +174 -0
  10. data/assets/deps.yaml +16 -0
  11. data/assets/platform/include/SDL3/SDL.h +91 -0
  12. data/assets/platform/include/SDL3/SDL_assert.h +705 -0
  13. data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
  14. data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
  15. data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
  16. data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
  17. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
  18. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
  19. data/assets/platform/include/SDL3/SDL_camera.h +535 -0
  20. data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
  21. data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
  22. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
  23. data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
  24. data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
  25. data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
  26. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
  27. data/assets/platform/include/SDL3/SDL_endian.h +645 -0
  28. data/assets/platform/include/SDL3/SDL_error.h +226 -0
  29. data/assets/platform/include/SDL3/SDL_events.h +1645 -0
  30. data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
  31. data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
  32. data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
  33. data/assets/platform/include/SDL3/SDL_guid.h +106 -0
  34. data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
  35. data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
  36. data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
  37. data/assets/platform/include/SDL3/SDL_init.h +507 -0
  38. data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
  39. data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
  40. data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
  41. data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
  42. data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
  43. data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
  44. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
  45. data/assets/platform/include/SDL3/SDL_log.h +541 -0
  46. data/assets/platform/include/SDL3/SDL_main.h +704 -0
  47. data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
  48. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
  49. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
  50. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
  51. data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
  52. data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
  53. data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
  54. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
  55. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
  56. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
  57. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
  58. data/assets/platform/include/SDL3/SDL_pen.h +198 -0
  59. data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
  60. data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
  61. data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
  62. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
  63. data/assets/platform/include/SDL3/SDL_process.h +441 -0
  64. data/assets/platform/include/SDL3/SDL_properties.h +572 -0
  65. data/assets/platform/include/SDL3/SDL_rect.h +528 -0
  66. data/assets/platform/include/SDL3/SDL_render.h +3028 -0
  67. data/assets/platform/include/SDL3/SDL_revision.h +59 -0
  68. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
  69. data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
  70. data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
  71. data/assets/platform/include/SDL3/SDL_storage.h +686 -0
  72. data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
  73. data/assets/platform/include/SDL3/SDL_system.h +840 -0
  74. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
  75. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
  76. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
  77. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
  78. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
  79. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
  80. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
  81. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
  82. data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
  83. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
  84. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
  85. data/assets/platform/include/SDL3/SDL_thread.h +602 -0
  86. data/assets/platform/include/SDL3/SDL_time.h +249 -0
  87. data/assets/platform/include/SDL3/SDL_timer.h +454 -0
  88. data/assets/platform/include/SDL3/SDL_touch.h +184 -0
  89. data/assets/platform/include/SDL3/SDL_tray.h +544 -0
  90. data/assets/platform/include/SDL3/SDL_version.h +198 -0
  91. data/assets/platform/include/SDL3/SDL_video.h +3497 -0
  92. data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
  93. data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
  94. data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
  95. data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
  96. data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
  97. data/assets/{include → platform/include}/mrbconf.h +42 -31
  98. data/assets/{include → platform/include}/mruby/array.h +3 -4
  99. data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
  100. data/assets/platform/include/mruby/boxing_no.h +59 -0
  101. data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
  102. data/assets/platform/include/mruby/class.h +157 -0
  103. data/assets/{include → platform/include}/mruby/common.h +30 -1
  104. data/assets/{include → platform/include}/mruby/compile.h +52 -74
  105. data/assets/{include → platform/include}/mruby/data.h +2 -2
  106. data/assets/{include → platform/include}/mruby/debug.h +12 -5
  107. data/assets/{include → platform/include}/mruby/dump.h +7 -9
  108. data/assets/{include → platform/include}/mruby/endian.h +1 -1
  109. data/assets/platform/include/mruby/error.h +173 -0
  110. data/assets/platform/include/mruby/gc.h +79 -0
  111. data/assets/{include → platform/include}/mruby/hash.h +1 -7
  112. data/assets/platform/include/mruby/internal.h +282 -0
  113. data/assets/platform/include/mruby/irep.h +143 -0
  114. data/assets/{include → platform/include}/mruby/istruct.h +1 -1
  115. data/assets/platform/include/mruby/khash.h +455 -0
  116. data/assets/platform/include/mruby/mempool.h +19 -0
  117. data/assets/{include → platform/include}/mruby/numeric.h +7 -10
  118. data/assets/platform/include/mruby/object.h +51 -0
  119. data/assets/{include → platform/include}/mruby/opcode.h +5 -5
  120. data/assets/{include → platform/include}/mruby/ops.h +19 -6
  121. data/assets/platform/include/mruby/presym/id.h +1447 -0
  122. data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
  123. data/assets/platform/include/mruby/presym/table.h +2893 -0
  124. data/assets/platform/include/mruby/presym.h +65 -0
  125. data/assets/platform/include/mruby/proc.h +184 -0
  126. data/assets/{include → platform/include}/mruby/range.h +0 -2
  127. data/assets/{include → platform/include}/mruby/string.h +33 -53
  128. data/assets/platform/include/mruby/throw.h +81 -0
  129. data/assets/{include → platform/include}/mruby/value.h +64 -29
  130. data/assets/{include → platform/include}/mruby/variable.h +6 -23
  131. data/assets/{include → platform/include}/mruby/version.h +7 -7
  132. data/assets/{include → platform/include}/mruby.h +238 -116
  133. data/assets/platform/macos-arm64/bin/mrbc +0 -0
  134. data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
  135. data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
  136. data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
  137. data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
  138. data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
  139. data/assets/platform/wasm/lib/libFLAC.a +0 -0
  140. data/assets/platform/wasm/lib/libSDL3.a +0 -0
  141. data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
  142. data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
  143. data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
  144. data/assets/platform/wasm/lib/libfreetype.a +0 -0
  145. data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
  146. data/assets/platform/wasm/lib/libmruby.a +0 -0
  147. data/assets/platform/wasm/lib/libogg.a +0 -0
  148. data/assets/platform/wasm/lib/libplutosvg.a +0 -0
  149. data/assets/platform/wasm/lib/libplutovg.a +0 -0
  150. data/assets/platform/wasm/lib/libpng.a +0 -0
  151. data/assets/platform/wasm/lib/libpng16.a +0 -0
  152. data/assets/platform/wasm/lib/libvorbis.a +0 -0
  153. data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
  154. data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
  155. data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
  156. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
  157. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  158. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  159. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  160. data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
  161. data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
  162. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
  163. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  164. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  165. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  166. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
  167. data/assets/resources/fonts/outfit/OFL.txt +93 -0
  168. data/assets/resources/fonts/outfit/outfit.ttf +0 -0
  169. data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
  170. data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
  171. data/assets/resources/icons/icon.icns +0 -0
  172. data/assets/resources/icons/icon.png +0 -0
  173. data/assets/resources/spritesheets/License.txt +28 -0
  174. data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
  175. data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
  176. data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
  177. data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
  178. data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
  179. data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
  180. data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
  181. data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
  182. data/assets/{wasm → resources/web}/template.html +1 -1
  183. data/assets/target.rb +131 -0
  184. data/bin/ruby2d +281 -82
  185. data/examples/astar.rb +269 -0
  186. data/examples/asteroids.rb +403 -0
  187. data/examples/bezier_editor.rb +96 -0
  188. data/examples/boids.rb +191 -0
  189. data/examples/bouncing_balls.rb +119 -0
  190. data/examples/breakout.rb +186 -0
  191. data/examples/constellations.rb +100 -0
  192. data/examples/dashboard.rb +133 -0
  193. data/examples/double_pendulum.rb +254 -0
  194. data/examples/falling_sand.rb +291 -0
  195. data/examples/fireworks.rb +110 -0
  196. data/examples/fluid_dynamics.rb +340 -0
  197. data/examples/fourier_epicycles.rb +142 -0
  198. data/examples/fractal_tree.rb +326 -0
  199. data/examples/game_of_life.rb +148 -0
  200. data/examples/gamepads.rb +333 -0
  201. data/examples/hill_driver.rb +613 -0
  202. data/examples/logo_animation.rb +251 -0
  203. data/examples/lorenz_attractor.rb +115 -0
  204. data/examples/mandelbrot.rb +207 -0
  205. data/examples/marching_squares.rb +200 -0
  206. data/examples/maze.rb +323 -0
  207. data/examples/nbody.rb +338 -0
  208. data/examples/outrun.rb +391 -0
  209. data/examples/pixel_paint.rb +313 -0
  210. data/examples/platformer.rb +335 -0
  211. data/examples/ray_casting_maze.rb +175 -0
  212. data/examples/shadow_casting.rb +151 -0
  213. data/examples/shape_recognizer.rb +908 -0
  214. data/examples/snake.rb +144 -0
  215. data/examples/sprite_sheets.rb +246 -0
  216. data/examples/swarm.rb +206 -0
  217. data/examples/tsp_annealing.rb +104 -0
  218. data/examples/ui_controls.rb +163 -0
  219. data/examples/wireframe_3d.rb +139 -0
  220. data/ext/ruby2d/audio.c +324 -0
  221. data/ext/ruby2d/canvas.c +1715 -494
  222. data/ext/ruby2d/ext.c +541 -0
  223. data/ext/ruby2d/extconf.rb +122 -145
  224. data/ext/ruby2d/font.c +566 -20
  225. data/ext/ruby2d/fps.c +92 -0
  226. data/ext/ruby2d/image.c +466 -41
  227. data/ext/ruby2d/ruby2d.c +374 -1890
  228. data/ext/ruby2d/ruby2d.h +840 -460
  229. data/ext/ruby2d/shapes.c +931 -101
  230. data/ext/ruby2d/text.c +586 -21
  231. data/ext/ruby2d/window.c +1693 -283
  232. data/lib/ruby2d/atlas_parser.rb +194 -0
  233. data/lib/ruby2d/audio.rb +73 -0
  234. data/lib/ruby2d/benchmark.rb +259 -0
  235. data/lib/ruby2d/bitmap_text.rb +155 -0
  236. data/lib/ruby2d/button.rb +402 -0
  237. data/lib/ruby2d/canvas.rb +703 -279
  238. data/lib/ruby2d/circle.rb +206 -29
  239. data/lib/ruby2d/cli/browser.rb +314 -0
  240. data/lib/ruby2d/cli/build.rb +471 -257
  241. data/lib/ruby2d/cli/colorize.rb +7 -5
  242. data/lib/ruby2d/cli/examples.rb +127 -0
  243. data/lib/ruby2d/cli/launch.rb +24 -39
  244. data/lib/ruby2d/cli/lib_files.rb +48 -0
  245. data/lib/ruby2d/cli/messages.rb +40 -0
  246. data/lib/ruby2d/cli/setup.rb +273 -0
  247. data/lib/ruby2d/cli/static_server.rb +160 -0
  248. data/lib/ruby2d/cli/usage.rb +255 -0
  249. data/lib/ruby2d/color.rb +191 -69
  250. data/lib/ruby2d/core.rb +37 -19
  251. data/lib/ruby2d/deps_help.rb +89 -0
  252. data/lib/ruby2d/dsl.rb +51 -12
  253. data/lib/ruby2d/ellipse.rb +228 -0
  254. data/lib/ruby2d/exceptions.rb +0 -2
  255. data/lib/ruby2d/font.rb +34 -74
  256. data/lib/ruby2d/gamepad.rb +323 -0
  257. data/lib/ruby2d/gem_paths.rb +19 -0
  258. data/lib/ruby2d/image.rb +155 -52
  259. data/lib/ruby2d/interactive.rb +103 -0
  260. data/lib/ruby2d/json_parser.rb +268 -0
  261. data/lib/ruby2d/line.rb +194 -85
  262. data/lib/ruby2d/mruby_compat.rb +12 -0
  263. data/lib/ruby2d/polygon.rb +297 -0
  264. data/lib/ruby2d/polyline.rb +368 -0
  265. data/lib/ruby2d/quad.rb +358 -94
  266. data/lib/ruby2d/rectangle.rb +77 -19
  267. data/lib/ruby2d/renderable.rb +411 -11
  268. data/lib/ruby2d/sprite.rb +471 -180
  269. data/lib/ruby2d/sprite_sheet.rb +64 -0
  270. data/lib/ruby2d/square.rb +29 -17
  271. data/lib/ruby2d/text.rb +196 -65
  272. data/lib/ruby2d/tileset.rb +139 -81
  273. data/lib/ruby2d/triangle.rb +324 -89
  274. data/lib/ruby2d/version.rb +1 -3
  275. data/lib/ruby2d/vertices.rb +62 -85
  276. data/lib/ruby2d/warnings.rb +29 -0
  277. data/lib/ruby2d/window/class_methods.rb +218 -0
  278. data/lib/ruby2d/window/gamepad_events.rb +141 -0
  279. data/lib/ruby2d/window/key_events.rb +74 -0
  280. data/lib/ruby2d/window/mouse_events.rb +171 -0
  281. data/lib/ruby2d/window/object_events.rb +168 -0
  282. data/lib/ruby2d/window.rb +632 -585
  283. data/lib/ruby2d.rb +14 -19
  284. metadata +275 -443
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GL/glew.h +0 -26427
  287. data/assets/include/GLES2/gl2.h +0 -656
  288. data/assets/include/GLES2/gl2ext.h +0 -3949
  289. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  290. data/assets/include/GLES2/gl2platform.h +0 -27
  291. data/assets/include/GLES3/gl3.h +0 -1192
  292. data/assets/include/GLES3/gl31.h +0 -1507
  293. data/assets/include/GLES3/gl32.h +0 -1808
  294. data/assets/include/GLES3/gl3platform.h +0 -27
  295. data/assets/include/KHR/khrplatform.h +0 -290
  296. data/assets/include/SDL2/SDL.h +0 -233
  297. data/assets/include/SDL2/SDL_assert.h +0 -326
  298. data/assets/include/SDL2/SDL_atomic.h +0 -415
  299. data/assets/include/SDL2/SDL_audio.h +0 -1500
  300. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  301. data/assets/include/SDL2/SDL_config.h +0 -61
  302. data/assets/include/SDL2/SDL_config_android.h +0 -194
  303. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  304. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  305. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  306. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  307. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  308. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  309. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  310. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  311. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  312. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  313. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  314. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  315. data/assets/include/SDL2/SDL_endian.h +0 -348
  316. data/assets/include/SDL2/SDL_error.h +0 -163
  317. data/assets/include/SDL2/SDL_events.h +0 -1166
  318. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  319. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  320. data/assets/include/SDL2/SDL_gesture.h +0 -117
  321. data/assets/include/SDL2/SDL_guid.h +0 -100
  322. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  323. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  324. data/assets/include/SDL2/SDL_hints.h +0 -2569
  325. data/assets/include/SDL2/SDL_image.h +0 -2173
  326. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  327. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  328. data/assets/include/SDL2/SDL_keycode.h +0 -358
  329. data/assets/include/SDL2/SDL_loadso.h +0 -115
  330. data/assets/include/SDL2/SDL_log.h +0 -404
  331. data/assets/include/SDL2/SDL_main.h +0 -275
  332. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  333. data/assets/include/SDL2/SDL_mouse.h +0 -465
  334. data/assets/include/SDL2/SDL_mutex.h +0 -471
  335. data/assets/include/SDL2/SDL_name.h +0 -33
  336. data/assets/include/SDL2/SDL_pixels.h +0 -644
  337. data/assets/include/SDL2/SDL_platform.h +0 -261
  338. data/assets/include/SDL2/SDL_quit.h +0 -58
  339. data/assets/include/SDL2/SDL_rect.h +0 -376
  340. data/assets/include/SDL2/SDL_render.h +0 -1919
  341. data/assets/include/SDL2/SDL_revision.h +0 -6
  342. data/assets/include/SDL2/SDL_rwops.h +0 -841
  343. data/assets/include/SDL2/SDL_sensor.h +0 -322
  344. data/assets/include/SDL2/SDL_shape.h +0 -155
  345. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  346. data/assets/include/SDL2/SDL_surface.h +0 -997
  347. data/assets/include/SDL2/SDL_system.h +0 -623
  348. data/assets/include/SDL2/SDL_syswm.h +0 -386
  349. data/assets/include/SDL2/SDL_test_images.h +0 -78
  350. data/assets/include/SDL2/SDL_test_random.h +0 -115
  351. data/assets/include/SDL2/SDL_thread.h +0 -464
  352. data/assets/include/SDL2/SDL_timer.h +0 -222
  353. data/assets/include/SDL2/SDL_touch.h +0 -150
  354. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  355. data/assets/include/SDL2/SDL_types.h +0 -29
  356. data/assets/include/SDL2/SDL_version.h +0 -204
  357. data/assets/include/SDL2/SDL_video.h +0 -2150
  358. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  359. data/assets/include/SDL2/begin_code.h +0 -187
  360. data/assets/include/mruby/boxing_no.h +0 -58
  361. data/assets/include/mruby/class.h +0 -108
  362. data/assets/include/mruby/error.h +0 -147
  363. data/assets/include/mruby/gc.h +0 -94
  364. data/assets/include/mruby/irep.h +0 -147
  365. data/assets/include/mruby/khash.h +0 -284
  366. data/assets/include/mruby/object.h +0 -43
  367. data/assets/include/mruby/presym/disable.h +0 -70
  368. data/assets/include/mruby/presym/enable.h +0 -37
  369. data/assets/include/mruby/presym.h +0 -40
  370. data/assets/include/mruby/proc.h +0 -211
  371. data/assets/include/mruby/throw.h +0 -66
  372. data/assets/macos/universal/bin/mrbc +0 -0
  373. data/assets/macos/universal/lib/libFLAC.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  377. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  378. data/assets/macos/universal/lib/libavif.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  380. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  381. data/assets/macos/universal/lib/libfreetype.a +0 -0
  382. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  383. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  384. data/assets/macos/universal/lib/libhwy.a +0 -0
  385. data/assets/macos/universal/lib/libjpeg.a +0 -0
  386. data/assets/macos/universal/lib/libjxl.a +0 -0
  387. data/assets/macos/universal/lib/libmodplug.a +0 -0
  388. data/assets/macos/universal/lib/libmpg123.a +0 -0
  389. data/assets/macos/universal/lib/libmruby.a +0 -0
  390. data/assets/macos/universal/lib/libogg.a +0 -0
  391. data/assets/macos/universal/lib/libpng.a +0 -0
  392. data/assets/macos/universal/lib/libtiff.a +0 -0
  393. data/assets/macos/universal/lib/libvorbis.a +0 -0
  394. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  395. data/assets/macos/universal/lib/libwebp.a +0 -0
  396. data/assets/macos/universal/lib/libzstd.a +0 -0
  397. data/assets/test_media/README.md +0 -3
  398. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  399. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  400. data/assets/test_media/boom.png +0 -0
  401. data/assets/test_media/coin.png +0 -0
  402. data/assets/test_media/colors.png +0 -0
  403. data/assets/test_media/controller.png +0 -0
  404. data/assets/test_media/dial.wav +0 -0
  405. data/assets/test_media/hero.png +0 -0
  406. data/assets/test_media/image.bmp +0 -0
  407. data/assets/test_media/image.jpg +0 -0
  408. data/assets/test_media/image.png +0 -0
  409. data/assets/test_media/music.flac +0 -0
  410. data/assets/test_media/music.mp3 +0 -0
  411. data/assets/test_media/music.ogg +0 -0
  412. data/assets/test_media/music.wav +0 -0
  413. data/assets/test_media/originals/boom.pxm +0 -0
  414. data/assets/test_media/originals/coin.pxm +0 -0
  415. data/assets/test_media/originals/controller.sketch +0 -0
  416. data/assets/test_media/originals/hero.pxm +0 -0
  417. data/assets/test_media/originals/image.pxm +0 -0
  418. data/assets/test_media/originals/music.caf +0 -0
  419. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  420. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  421. data/assets/test_media/sound.flac +0 -0
  422. data/assets/test_media/sound.mp3 +0 -0
  423. data/assets/test_media/sound.ogg +0 -0
  424. data/assets/test_media/sound.wav +0 -0
  425. data/assets/test_media/sprite_sheet.png +0 -0
  426. data/assets/test_media/texture_atlas.png +0 -0
  427. data/assets/wasm/libmruby.a +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  463. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  464. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  492. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  493. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  499. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  500. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  501. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  502. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  503. data/assets/xcode/ios/Info.plist +0 -43
  504. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  533. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  534. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  535. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  539. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  540. data/assets/xcode/ios/main.c +0 -1
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  558. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  559. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  560. data/assets/xcode/tvos/Info.plist +0 -30
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  590. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  591. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  592. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  596. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  597. data/assets/xcode/tvos/main.c +0 -1
  598. data/ext/ruby2d/common.c +0 -185
  599. data/ext/ruby2d/controllers.c +0 -110
  600. data/ext/ruby2d/gl.c +0 -398
  601. data/ext/ruby2d/gl2.c +0 -86
  602. data/ext/ruby2d/gl3.c +0 -304
  603. data/ext/ruby2d/gles.c +0 -302
  604. data/ext/ruby2d/input.c +0 -48
  605. data/ext/ruby2d/music.c +0 -127
  606. data/ext/ruby2d/sound.c +0 -132
  607. data/lib/ruby2d/cli/console.rb +0 -65
  608. data/lib/ruby2d/cli/enable_console.rb +0 -7
  609. data/lib/ruby2d/cli/platform.rb +0 -17
  610. data/lib/ruby2d/music.rb +0 -77
  611. data/lib/ruby2d/pixel.rb +0 -18
  612. data/lib/ruby2d/pixmap.rb +0 -39
  613. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  614. data/lib/ruby2d/sound.rb +0 -61
  615. data/lib/ruby2d/texture.rb +0 -38
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  619. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  620. /data/assets/{include → platform/include}/mruby/re.h +0 -0
@@ -0,0 +1,323 @@
1
+ # Ruby2D::Gamepad
2
+
3
+ module Ruby2D
4
+ # A connected gamepad. Lives from connect to disconnect; reconnects produce
5
+ # a new object. Identity-based equality (default Ruby behavior) makes
6
+ # `Gamepad` instances stable hash keys for per-pad state.
7
+ #
8
+ # Disconnected pads remain safe to poll: `held?` etc. return `false`,
9
+ # `axis` returns `0.0`, and feedback methods return `false` silently.
10
+ class Gamepad
11
+ # SDL3 enum values for symbol → integer translation. These mirror the
12
+ # `R2D_BUTTON_*` and `R2D_AXIS_*` constants in `ruby2d.h`. The C side
13
+ # already speaks symbols for events; these are only needed for capability
14
+ # queries that go from Ruby through to SDL.
15
+ BUTTON_ENUM = {
16
+ south: 0,
17
+ east: 1,
18
+ west: 2,
19
+ north: 3,
20
+ back: 4,
21
+ guide: 5,
22
+ start: 6,
23
+ left_stick: 7,
24
+ right_stick: 8,
25
+ left_shoulder: 9,
26
+ right_shoulder: 10,
27
+ dpad_up: 11,
28
+ dpad_down: 12,
29
+ dpad_left: 13,
30
+ dpad_right: 14,
31
+ misc1: 15,
32
+ paddle1: 16,
33
+ paddle2: 17,
34
+ paddle3: 18,
35
+ paddle4: 19,
36
+ touchpad: 20,
37
+ misc2: 21,
38
+ misc3: 22,
39
+ misc4: 23,
40
+ misc5: 24,
41
+ misc6: 25
42
+ }.freeze
43
+
44
+ AXIS_ENUM = {
45
+ left_x: 0,
46
+ left_y: 1,
47
+ right_x: 2,
48
+ right_y: 3,
49
+ left_trigger: 4,
50
+ right_trigger: 5
51
+ }.freeze
52
+
53
+ # Sticks only — triggers (0.0..1.0) are exempt because they rest at zero
54
+ # and rarely drift. 0.05 should cover typical worst-case stick drift.
55
+ DEFAULT_DEAD_ZONE = 0.05
56
+
57
+ TRIGGER_AXES = %i[left_trigger right_trigger].freeze
58
+
59
+ # Ordered list of axis names. `axes` always returns the full hash so the
60
+ # shape is stable.
61
+ AXIS_NAMES = AXIS_ENUM.keys.freeze
62
+
63
+ attr_reader :id, :name, :type
64
+ attr_accessor :dead_zone
65
+
66
+ def initialize(window, id, name)
67
+ @window = window
68
+ @id = id
69
+ @name = name || ''
70
+ @connected = true
71
+ @dead_zone = DEFAULT_DEAD_ZONE
72
+
73
+ # Cached per-connection metadata. `type` and capabilities don't change
74
+ # while the pad is connected, so we read them once and avoid the SDL
75
+ # round-trip on every call.
76
+ @type = Ext.window_gamepad_type(window, id)
77
+ caps = Ext.window_gamepad_caps(window, id)
78
+ @cap_rumble = caps & 0x1 != 0
79
+ @cap_rumble_triggers = caps & 0x2 != 0
80
+ @cap_led = caps & 0x4 != 0
81
+
82
+ # Per-button and per-axis presence is also cached at connect — one SDL
83
+ # call per known enum, then `has?(:button, name)` / `has?(:axis, name)`
84
+ # are pure hash reads. Cheap (~27 calls total) and matches the
85
+ # "capability checks are cached at connect time" rule in USAGE.md.
86
+ @btn_present = BUTTON_ENUM.each_with_object({}) do |(sym, enum), h|
87
+ h[sym] = Ext.window_gamepad_has_button(window, id, enum)
88
+ end
89
+ @axis_present = AXIS_ENUM.each_with_object({}) do |(sym, enum), h|
90
+ h[sym] = Ext.window_gamepad_has_axis(window, id, enum)
91
+ end
92
+
93
+ # Frame-scoped event sets. Pressed/released/axes_moved are cleared by
94
+ # `_clear_frame_state`; held is also cleared and refilled each frame
95
+ # from the C-side held loop.
96
+ @buttons_down = []
97
+ @buttons_up = []
98
+ @buttons_held = []
99
+ @axes_moved = []
100
+
101
+ # Sticky axis values populated by motion events.
102
+ @axis_values = {}
103
+ AXIS_NAMES.each { |a| @axis_values[a] = 0.0 }
104
+ @raw_axis_values = @axis_values.dup
105
+ end
106
+
107
+ def connected? = @connected
108
+
109
+ # Capability check. Forms:
110
+ # pad.has?(:rumble)
111
+ # pad.has?(:rumble_triggers)
112
+ # pad.has?(:led)
113
+ # pad.has?(:button, :paddle1)
114
+ # pad.has?(:axis, :left_trigger)
115
+ def has?(capability, name = nil)
116
+ return false unless @connected
117
+
118
+ case capability
119
+ when :rumble then @cap_rumble
120
+ when :rumble_triggers then @cap_rumble_triggers
121
+ when :led then @cap_led
122
+ when :button then @btn_present[name] || false
123
+ when :axis then @axis_present[name] || false
124
+ else false
125
+ end
126
+ end
127
+
128
+ # Battery — live query, since charge level changes during play. Returns
129
+ # one of `:wired`, `:full`, `:medium`, `:low`, `:empty`, or `nil` when
130
+ # SDL can't determine the state.
131
+ def battery
132
+ return nil unless @connected
133
+
134
+ state, percent = Ext.window_gamepad_battery(@window, @id)
135
+ case state
136
+ when :wired then :wired
137
+ when :on_battery
138
+ case percent
139
+ when -1 then :medium # plugged into a battery slot but no level reported
140
+ when 0..9 then :empty
141
+ when 10..29 then :low
142
+ when 30..74 then :medium
143
+ else :full
144
+ end
145
+ end
146
+ end
147
+
148
+ # Polling — currently held / current axis position.
149
+ def held?(button) = @buttons_held.include?(button)
150
+
151
+ def axis(name, raw: false)
152
+ return 0.0 unless AXIS_ENUM.key?(name)
153
+
154
+ v = (raw ? @raw_axis_values : @axis_values)[name]
155
+ v || 0.0
156
+ end
157
+
158
+ def buttons_held = @buttons_held.dup
159
+
160
+ def axes
161
+ AXIS_NAMES.each_with_object({}) { |a, h| h[a] = @axis_values[a] || 0.0 }
162
+ end
163
+
164
+ # Polling — frame-scoped transitions. Cleared each frame by
165
+ # `_clear_frame_state`.
166
+ def pressed?(button) = @buttons_down.include?(button)
167
+ def released?(button) = @buttons_up.include?(button)
168
+ def axis_moved?(axis) = @axes_moved.include?(axis)
169
+ def axes_moved = @axes_moved.dup
170
+
171
+ # Feedback. `rumble`, `rumble_triggers`, and `set_led` return `false` when
172
+ # the pad is disconnected or the SDL call fails — never raise. `led=` is a
173
+ # convenience alias of `set_led`; being a Ruby assignment it evaluates to the
174
+ # assigned value, not the success Boolean, so use `set_led` when you need it.
175
+ #
176
+ # `rumble(strength:, duration:)` is the simple form; the low/high form
177
+ # exposes the dual-motor pattern most pads expose.
178
+ def rumble(strength: nil, low: nil, high: nil, duration: 0.2)
179
+ return false unless @connected
180
+
181
+ if strength
182
+ low ||= strength
183
+ high ||= strength
184
+ end
185
+ low ||= 0.0
186
+ high ||= 0.0
187
+ Ext.window_gamepad_rumble(@window, @id, low.to_f, high.to_f, duration.to_f)
188
+ end
189
+
190
+ def rumble_triggers(left: 0.0, right: 0.0, duration: 0.2)
191
+ return false unless @connected
192
+
193
+ Ext.window_gamepad_rumble_triggers(@window, @id,
194
+ left.to_f, right.to_f, duration.to_f)
195
+ end
196
+
197
+ # Set the LED color from an `[r, g, b]` triple. Returns `false` on failure.
198
+ def set_led(rgb)
199
+ return false unless @connected
200
+ r, g, b = rgb
201
+ Ext.window_gamepad_set_led(@window, @id, r.to_i, g.to_i, b.to_i)
202
+ end
203
+
204
+ # Convenience setter form of `set_led`. As a Ruby assignment it returns the
205
+ # assigned value, not the success Boolean — call `set_led` if you need that.
206
+ def led=(rgb)
207
+ set_led(rgb)
208
+ end
209
+
210
+ # Snapshot of the underlying joystick's raw input state — buttons,
211
+ # axes (raw -32768..32767), and hats (SDL hat bitmask). Bypasses any
212
+ # gamepad mapping. Intended for mapping-generation tools that need to
213
+ # observe the physical hardware before SDL remaps it. Returns `nil`
214
+ # when the pad is disconnected.
215
+ def joystick_state
216
+ return nil unless @connected
217
+
218
+ arr = Ext.window_gamepad_joystick_state(@window, @id) or return nil
219
+ { buttons: arr[0], axes: arr[1], hats: arr[2] }
220
+ end
221
+
222
+ # Read-only snapshot of low-level metadata SDL exposes about the pad —
223
+ # useful when adding a custom mapping for an unrecognized device, or
224
+ # diagnosing why a connected device behaves oddly. Returns `nil` when
225
+ # the pad is disconnected.
226
+ #
227
+ # Keys:
228
+ # :guid — 32-char SDL GUID hex string (the same string used
229
+ # in `gamepads.txt` mapping entries)
230
+ # :vendor_id — USB-style vendor ID (Integer; format as `%04x`)
231
+ # :product_id — USB-style product ID (Integer; format as `%04x`)
232
+ # :version — product version (Integer; format as `%04x`)
233
+ # :serial — String, or nil if SDL has no serial for this pad
234
+ # :connection — :wired, :wireless, or :unknown
235
+ # :real_type — the underlying gamepad type before any user mapping
236
+ # remaps it (:xbox / :playstation / :nintendo /
237
+ # :generic / :unknown)
238
+ # :num_touchpads — count of touchpad surfaces (PS4/PS5 = 1, most = 0)
239
+ # :mapping — the resolved SDL gamepad mapping string, or nil
240
+ def debug_info
241
+ return nil unless @connected
242
+
243
+ arr = Ext.window_gamepad_debug_info(@window, @id) or return nil
244
+ {
245
+ guid: arr[0],
246
+ vendor_id: arr[1],
247
+ product_id: arr[2],
248
+ version: arr[3],
249
+ serial: arr[4],
250
+ connection: arr[5],
251
+ real_type: arr[6],
252
+ num_touchpads: arr[7],
253
+ mapping: arr[8]
254
+ }
255
+ end
256
+
257
+ # ----- Internal: dispatch hooks called from gamepad_callback -----
258
+
259
+ def _apply_button_down(button)
260
+ return unless @connected
261
+ @buttons_down << button unless @buttons_down.include?(button)
262
+ @buttons_held << button unless @buttons_held.include?(button)
263
+ end
264
+
265
+ def _apply_button_held(button)
266
+ return unless @connected
267
+ @buttons_held << button unless @buttons_held.include?(button)
268
+ end
269
+
270
+ def _apply_button_up(button)
271
+ return unless @connected
272
+ @buttons_up << button unless @buttons_up.include?(button)
273
+ @buttons_held.delete(button)
274
+ end
275
+
276
+ # Returns the dead-zoned value (which is what handlers receive), or `nil`
277
+ # if the value didn't move outside the dead-zoned region — letting the
278
+ # caller suppress event emission for motion entirely inside the dead zone.
279
+ def _apply_axis(axis, raw_value)
280
+ return nil unless @connected
281
+ return nil unless AXIS_ENUM.key?(axis)
282
+
283
+ previous = @axis_values[axis] || 0.0
284
+ dz = apply_dead_zone(axis, raw_value)
285
+
286
+ @raw_axis_values[axis] = raw_value
287
+ @axis_values[axis] = dz
288
+
289
+ if dz != previous
290
+ @axes_moved << axis unless @axes_moved.include?(axis)
291
+ dz
292
+ else
293
+ nil
294
+ end
295
+ end
296
+
297
+ def _clear_frame_state
298
+ @buttons_down.clear
299
+ @buttons_up.clear
300
+ @buttons_held.clear
301
+ @axes_moved.clear
302
+ end
303
+
304
+ def _disconnect
305
+ @connected = false
306
+ @buttons_down.clear
307
+ @buttons_up.clear
308
+ @buttons_held.clear
309
+ @axes_moved.clear
310
+ AXIS_NAMES.each do |a|
311
+ @axis_values[a] = 0.0
312
+ @raw_axis_values[a] = 0.0
313
+ end
314
+ end
315
+
316
+ private
317
+
318
+ def apply_dead_zone(axis, value)
319
+ return value if @dead_zone <= 0.0 || TRIGGER_AXES.include?(axis)
320
+ value.abs < @dead_zone ? 0.0 : value
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,19 @@
1
+ # Extension-free path helpers. These live apart from the rest of `ruby2d` so the
2
+ # tooling that must run *before* the native extension exists — the `ruby2d setup`
3
+ # command that builds it, and the extconf that links it — can locate the gem's
4
+ # files without loading the (possibly not-yet-built) `.so`.
5
+
6
+ module Ruby2D
7
+ def self.gem_dir
8
+ # mruby doesn't define `Gem`
9
+ if RUBY_ENGINE == 'mruby'
10
+ `ruby -e "print Gem::Specification.find_by_name('ruby2d').gem_dir"`
11
+ else
12
+ Gem::Specification.find_by_name('ruby2d').gem_dir
13
+ end
14
+ end
15
+
16
+ def self.assets
17
+ "#{gem_dir}/assets"
18
+ end
19
+ end
data/lib/ruby2d/image.rb CHANGED
@@ -1,79 +1,182 @@
1
- # frozen_string_literal: true
2
-
3
1
  # Ruby2D::Image
4
2
 
5
3
  module Ruby2D
6
- # Images in many popular formats can be drawn in the window.
7
- # To draw an image in the window, use the following, providing the image file path:
8
- # +Image.new('star.png')+
4
+ # An image drawn in the window
9
5
  class Image
10
6
  include Renderable
11
7
 
8
+ # Image uses `tint` instead of `color` — the image already has its own
9
+ # colors in the texture; tint modulates them.
10
+ undef_method :color, :color=, :colour, :colour=
11
+
12
12
  attr_reader :path
13
- attr_accessor :x, :y, :width, :height, :rotate, :data
14
-
15
- # Load an image +path+ and return a Texture, using a pixmap atlas if provided
16
- # @param path [#to_s] The location of the file to load as an image.
17
- # @param atlas [PixmapAtlas] Pixmap atlas to use to manage the image file
18
- # @return [Texture] loaded
19
- def self.load_image_as_texture(path, atlas:)
20
- pixmap = if atlas
21
- atlas.load_and_keep_image(path, as: path)
22
- else
23
- Pixmap.new path
24
- end
25
- pixmap.texture
13
+ attr_accessor :width, :height, :rotate
14
+
15
+ # Set the x position. Pass a symbol (`:left`, `:center`, `:right`) to
16
+ # set alignment intent resolved at draw time against the window.
17
+ def x=(value)
18
+ return self.x_align = value if value.is_a?(Symbol)
19
+ @x_align = nil unless @_resolving_alignment
20
+ @x = value
26
21
  end
27
22
 
28
- # Create an Image
29
- # @param path [#to_s] The location of the file to load as an image.
30
- # @param width [Numeric] The +width+ of image, or default is width from image file
31
- # @param height [Numeric] The +height+ of image, or default is height from image file
32
- # @param x [Numeric]
33
- # @param y [Numeric]
34
- # @param z [Numeric]
35
- # @param rotate [Numeric] Angle, default is 0
36
- # @param color [Numeric] (or +colour+) Tint the image when rendering
37
- # @param opacity [Numeric] Opacity of the image when rendering
38
- # @param show [Boolean] If +true+ the image is added to +Window+ automatically.
39
- def initialize(path, atlas: nil,
40
- width: nil, height: nil, x: 0, y: 0, z: 0,
41
- rotate: 0, color: nil, colour: nil,
42
- opacity: nil, show: true)
43
- @path = path.to_s
23
+ # Set the y position. Pass a symbol (`:top`, `:center`, `:bottom`) to
24
+ # set alignment intent resolved at draw time against the window.
25
+ def y=(value)
26
+ return self.y_align = value if value.is_a?(Symbol)
27
+ @y_align = nil unless @_resolving_alignment
28
+ @y = value
29
+ end
30
+
31
+ # Get the rotation center x coordinate
32
+ def rx
33
+ @_user_rx.nil? ? @x + @width / 2.0 : @_user_rx
34
+ end
44
35
 
45
- # Consider input pixmap atlas if supplied to load image file
46
- @texture = Image.load_image_as_texture @path, atlas: atlas
47
- @width = width || @texture.width
48
- @height = height || @texture.height
36
+ # Get the rotation center y coordinate
37
+ def ry
38
+ @_user_ry.nil? ? @y + @height / 2.0 : @_user_ry
39
+ end
49
40
 
41
+ # Set the rotation center x coordinate
42
+ def rx=(val)
43
+ @_user_rx = val
44
+ end
45
+
46
+ # Set the rotation center y coordinate
47
+ def ry=(val)
48
+ @_user_ry = val
49
+ end
50
+
51
+ # Create an image
52
+ def initialize(path,
53
+ width: nil, height: nil, x: 0, y: 0, z: 0,
54
+ rotate: 0, rx: nil, ry: nil, tint: nil,
55
+ opacity: nil, add: true, visible: true,
56
+ padding: nil, padding_top: nil, padding_right: nil,
57
+ padding_bottom: nil, padding_left: nil,
58
+ _share_from: nil)
59
+ @width = width
60
+ @height = height
61
+
62
+ x, y = _extract_alignment(x, y)
63
+ _apply_padding(padding, padding_top, padding_right, padding_bottom, padding_left)
50
64
  @x = x
51
65
  @y = y
52
66
  @z = z
53
67
  @rotate = rotate
54
- self.color = color || colour || 'white'
55
- self.color.opacity = opacity unless opacity.nil?
68
+ @_user_rx = rx
69
+ @_user_ry = ry
70
+ self.tint = tint || 'white'
71
+ self.tint.opacity = opacity unless opacity.nil?
72
+
73
+ if _share_from
74
+ # SpriteSheet uses this to give every Sprite the same backing texture
75
+ # without re-decoding the file or re-uploading to the GPU.
76
+ @path = _share_from.path
77
+ @ext_image = _share_from.instance_variable_get(:@ext_image)
78
+ @orig_width = _share_from.instance_variable_get(:@orig_width)
79
+ @orig_height = _share_from.instance_variable_get(:@orig_height)
80
+ @width ||= @orig_width
81
+ @height ||= @orig_height
82
+ @clipped = false
83
+ @clip_x = 0.0
84
+ @clip_y = 0.0
85
+ @clip_width = @orig_width
86
+ @clip_height = @orig_height
87
+ else
88
+ @path = path.to_s
89
+ raise Error, "Image file `#{@path}` not found" unless File.exist?(@path)
56
90
 
57
- add if show
91
+ # Preserve user-provided values before image_create may overwrite them
92
+ provided_width = @width
93
+ provided_height = @height
94
+ provided_rotate = @rotate
95
+ Ext.image_create(self)
96
+
97
+ @width = provided_width || @width
98
+ @height = provided_height || @height
99
+ @rotate = provided_rotate
100
+ end
101
+
102
+ @visible = visible
103
+ self.add if add
104
+ end
105
+
106
+ # Re-rasterize the source at a new pixel size and update `width`/`height`.
107
+ # For SVGs this re-runs the vector rasterizer so the image stays crisp at
108
+ # the new size. For raster images it resamples the source to the new size
109
+ # — useful for trimming GPU memory when displaying a large source small.
110
+ # Called with no arguments, re-rasterizes at the current `width`/`height`
111
+ # — handy after assigning to `width=`/`height=` to commit a fresh raster.
112
+ def resize!(width = @width, height = @height)
113
+ unless width.is_a?(Numeric) && height.is_a?(Numeric) && width.positive? && height.positive?
114
+ raise Error, 'Image#resize! requires positive width and height'
115
+ end
116
+
117
+ Ext.image_resize(self, width, height)
118
+ @width = width
119
+ @height = height
120
+ self
121
+ end
122
+
123
+ # The image's tint color. The image's own texture colors are multiplied
124
+ # by this — `tint: 'red'` makes the image redder, not solid red.
125
+ def tint
126
+ @color
58
127
  end
59
128
 
60
- def draw(x: 0, y: 0, width: nil, height: nil, rotate: 0, color: nil, colour: nil)
129
+ def tint=(c)
130
+ @color = Color.new(c)
131
+ end
132
+
133
+ # Render the image. Called with overrides for one-shot rendering inside a
134
+ # render block; with no arguments it draws the same frame the scene graph
135
+ # does (delegating to `_render_scene`).
136
+ def render(x: nil, y: nil, width: nil, height: nil, rotate: nil,
137
+ tint: nil, opacity: nil)
138
+ if x.nil? && y.nil? && width.nil? && height.nil? && rotate.nil? &&
139
+ tint.nil? && opacity.nil?
140
+ return _render_scene
141
+ end
142
+
61
143
  Window.render_ready_check
62
144
 
63
- render(x: x, y: y, width:
64
- width || @width, height: height || @height,
65
- color: Color.new(color || colour || 'white'),
66
- rotate: rotate || @rotate)
145
+ saved_x, saved_y = @x, @y
146
+ saved_width, saved_height = @width, @height
147
+ saved_rotate = @rotate
148
+ saved_color = @color
149
+
150
+ @x = x if x
151
+ @y = y if y
152
+ @width = width if width
153
+ @height = height if height
154
+ @rotate = rotate if rotate
155
+
156
+ if tint || opacity
157
+ @color = tint ? Color.new(tint) : Color.new(saved_color)
158
+ @color.opacity = opacity if opacity
159
+ end
160
+
161
+ begin
162
+ Ext.image_draw(self)
163
+ ensure
164
+ @x, @y = saved_x, saved_y
165
+ @width, @height = saved_width, saved_height
166
+ @rotate = saved_rotate
167
+ @color = saved_color
168
+ end
67
169
  end
68
170
 
69
171
  private
70
172
 
71
- def render(x: @x, y: @y, width: @width, height: @height, color: @color, rotate: @rotate)
72
- vertices = Vertices.new(x, y, width, height, rotate)
73
-
74
- @texture.draw(
75
- vertices.coordinates, vertices.texture_coordinates, color
76
- )
173
+ # Scene-graph draw hook (see Renderable#_render_scene): `render` with no
174
+ # overrides, minus its keyword handling — a zero-arg call into the
175
+ # 7-keyword `render` still pays ~3.4µs of keyword setup on wasm mruby.
176
+ def _render_scene
177
+ _resolve_alignment
178
+ Ext.image_draw(self)
77
179
  end
180
+ public :_render_scene
78
181
  end
79
182
  end
@@ -0,0 +1,103 @@
1
+ # Ruby2D::Interactive
2
+
3
+ module Ruby2D
4
+ # Per-object event handling for objects that participate in Window's
5
+ # interactive registry. Provides `on` / `off` / `interactive?` and the
6
+ # `_fire_event` dispatch entry point. Mixed into `Renderable` and `Button`.
7
+ #
8
+ # Including objects must expose `x`, `y`, `z`, `width`, `height`, and
9
+ # `contains?(x, y)` so `Window::ObjectEventDispatch` can hit-test them.
10
+ module Interactive
11
+ # Per-object events that take a value matcher (button) in the kwarg form.
12
+ # `:hover`, `:hover_out`, and `:mouse_scroll` carry no matchable field.
13
+ OBJECT_EVENT_FILTER_PREDICATES = {
14
+ mouse_down: :button?, mouse_held: :button?, mouse_up: :button?,
15
+ click: :button?, drag: :button?
16
+ }.freeze
17
+
18
+ # The full per-object event vocabulary: the filterable events above plus the
19
+ # three that carry no matchable field. Derived from the predicates map so the
20
+ # two can't drift, and mirrors what Window::ObjectEventDispatch fires.
21
+ OBJECT_EVENTS = (OBJECT_EVENT_FILTER_PREDICATES.keys + %i[hover hover_out mouse_scroll]).freeze
22
+
23
+ # Register a per-object event handler. Two forms:
24
+ #
25
+ # obj.on(:click) { |event| ... }
26
+ # obj.on(click: :left) { ... } # filtered
27
+ # obj.on(click: [:left, :right]) { ... } # array → match any
28
+ # obj.on(mouse_down: :left, click: :left) { ... } # multi-event
29
+ def on(event = nil, **filters, &proc)
30
+ raise Error, '`on` requires a block' unless proc
31
+ if event.is_a?(Symbol) && filters.empty?
32
+ raise Error, "`#{event}` is not a valid object event" unless OBJECT_EVENTS.include?(event)
33
+ register_object_event_handler(event, proc)
34
+ elsif event.nil? && !filters.empty?
35
+ descriptors = filters.map do |type, matcher|
36
+ predicate = OBJECT_EVENT_FILTER_PREDICATES[type] or
37
+ raise Error, "`#{type}` does not support filtering with `on event: value`"
38
+ values = Array(matcher)
39
+ wrapped = ->(e) { proc.call(e) if values.any? { |v| e.send(predicate, v) } }
40
+ register_object_event_handler(type, wrapped)
41
+ end
42
+ descriptors.size == 1 ? descriptors.first : descriptors
43
+ else
44
+ raise Error, '`on` requires either an event symbol or event filters'
45
+ end
46
+ end
47
+
48
+ # Remove a per-object event handler (or several, given an array).
49
+ def off(descriptor)
50
+ return descriptor.each { |d| off(d) } if descriptor.is_a?(Array)
51
+
52
+ unless descriptor.is_a?(Window::ObjectEventDescriptor)
53
+ raise Error,
54
+ "Cannot remove event handler: expected a descriptor returned by `on`, got #{descriptor.inspect}"
55
+ end
56
+
57
+ return unless @_object_events
58
+
59
+ handlers = @_object_events[descriptor.type]
60
+ return unless handlers
61
+
62
+ handlers.delete(descriptor.id)
63
+ @_object_events.delete(descriptor.type) if handlers.empty?
64
+
65
+ Window.unregister_interactive(self) unless interactive?
66
+ end
67
+
68
+ # Check if this object has any event handlers
69
+ def interactive?(event = nil)
70
+ return false unless @_object_events
71
+
72
+ if event
73
+ @_object_events.key?(event) && !@_object_events[event].empty?
74
+ else
75
+ @_object_events.any? { |_type, handlers| !handlers.empty? }
76
+ end
77
+ end
78
+
79
+ # Dispatch an event to stored handlers (called by Window)
80
+ def _fire_event(type, event)
81
+ return unless @_object_events
82
+
83
+ handlers = @_object_events[type]
84
+ return unless handlers
85
+
86
+ # Snapshot the values: a handler may register another handler for the same
87
+ # event type mid-dispatch, which would otherwise mutate the hash we're
88
+ # iterating ("can't add a new key into hash during iteration").
89
+ handlers.values.each { |proc| proc.call(event) }
90
+ end
91
+
92
+ private
93
+
94
+ def register_object_event_handler(event, proc)
95
+ @_object_events ||= {}
96
+ @_object_events[event] ||= {}
97
+ id = (@_object_event_key = (@_object_event_key || 0) + 1)
98
+ @_object_events[event][id] = proc
99
+ Window.register_interactive(self)
100
+ Window::ObjectEventDescriptor.new(self, event, id)
101
+ end
102
+ end
103
+ end