ruby2d 0.12.0 → 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 (619) 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 -428
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GLES2/gl2.h +0 -656
  287. data/assets/include/GLES2/gl2ext.h +0 -3949
  288. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  289. data/assets/include/GLES2/gl2platform.h +0 -27
  290. data/assets/include/GLES3/gl3.h +0 -1192
  291. data/assets/include/GLES3/gl31.h +0 -1507
  292. data/assets/include/GLES3/gl32.h +0 -1808
  293. data/assets/include/GLES3/gl3platform.h +0 -27
  294. data/assets/include/KHR/khrplatform.h +0 -290
  295. data/assets/include/SDL2/SDL.h +0 -233
  296. data/assets/include/SDL2/SDL_assert.h +0 -326
  297. data/assets/include/SDL2/SDL_atomic.h +0 -415
  298. data/assets/include/SDL2/SDL_audio.h +0 -1500
  299. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  300. data/assets/include/SDL2/SDL_config.h +0 -61
  301. data/assets/include/SDL2/SDL_config_android.h +0 -194
  302. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  303. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  304. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  305. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  306. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  307. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  308. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  309. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  310. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  311. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  312. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  313. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  314. data/assets/include/SDL2/SDL_endian.h +0 -348
  315. data/assets/include/SDL2/SDL_error.h +0 -163
  316. data/assets/include/SDL2/SDL_events.h +0 -1166
  317. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  318. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  319. data/assets/include/SDL2/SDL_gesture.h +0 -117
  320. data/assets/include/SDL2/SDL_guid.h +0 -100
  321. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  322. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  323. data/assets/include/SDL2/SDL_hints.h +0 -2569
  324. data/assets/include/SDL2/SDL_image.h +0 -2173
  325. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  326. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  327. data/assets/include/SDL2/SDL_keycode.h +0 -358
  328. data/assets/include/SDL2/SDL_loadso.h +0 -115
  329. data/assets/include/SDL2/SDL_log.h +0 -404
  330. data/assets/include/SDL2/SDL_main.h +0 -275
  331. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  332. data/assets/include/SDL2/SDL_mouse.h +0 -465
  333. data/assets/include/SDL2/SDL_mutex.h +0 -471
  334. data/assets/include/SDL2/SDL_name.h +0 -33
  335. data/assets/include/SDL2/SDL_pixels.h +0 -644
  336. data/assets/include/SDL2/SDL_platform.h +0 -261
  337. data/assets/include/SDL2/SDL_quit.h +0 -58
  338. data/assets/include/SDL2/SDL_rect.h +0 -376
  339. data/assets/include/SDL2/SDL_render.h +0 -1919
  340. data/assets/include/SDL2/SDL_revision.h +0 -6
  341. data/assets/include/SDL2/SDL_rwops.h +0 -841
  342. data/assets/include/SDL2/SDL_sensor.h +0 -322
  343. data/assets/include/SDL2/SDL_shape.h +0 -155
  344. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  345. data/assets/include/SDL2/SDL_surface.h +0 -997
  346. data/assets/include/SDL2/SDL_system.h +0 -623
  347. data/assets/include/SDL2/SDL_syswm.h +0 -386
  348. data/assets/include/SDL2/SDL_test_images.h +0 -78
  349. data/assets/include/SDL2/SDL_test_random.h +0 -115
  350. data/assets/include/SDL2/SDL_thread.h +0 -464
  351. data/assets/include/SDL2/SDL_timer.h +0 -222
  352. data/assets/include/SDL2/SDL_touch.h +0 -150
  353. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  354. data/assets/include/SDL2/SDL_types.h +0 -29
  355. data/assets/include/SDL2/SDL_version.h +0 -204
  356. data/assets/include/SDL2/SDL_video.h +0 -2150
  357. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  358. data/assets/include/SDL2/begin_code.h +0 -187
  359. data/assets/include/mruby/boxing_no.h +0 -58
  360. data/assets/include/mruby/class.h +0 -108
  361. data/assets/include/mruby/error.h +0 -147
  362. data/assets/include/mruby/gc.h +0 -94
  363. data/assets/include/mruby/irep.h +0 -147
  364. data/assets/include/mruby/khash.h +0 -284
  365. data/assets/include/mruby/object.h +0 -43
  366. data/assets/include/mruby/presym/disable.h +0 -70
  367. data/assets/include/mruby/presym/enable.h +0 -37
  368. data/assets/include/mruby/presym.h +0 -40
  369. data/assets/include/mruby/proc.h +0 -211
  370. data/assets/include/mruby/throw.h +0 -66
  371. data/assets/macos/universal/bin/mrbc +0 -0
  372. data/assets/macos/universal/lib/libFLAC.a +0 -0
  373. data/assets/macos/universal/lib/libSDL2.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  377. data/assets/macos/universal/lib/libavif.a +0 -0
  378. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  380. data/assets/macos/universal/lib/libfreetype.a +0 -0
  381. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  382. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  383. data/assets/macos/universal/lib/libhwy.a +0 -0
  384. data/assets/macos/universal/lib/libjpeg.a +0 -0
  385. data/assets/macos/universal/lib/libjxl.a +0 -0
  386. data/assets/macos/universal/lib/libmodplug.a +0 -0
  387. data/assets/macos/universal/lib/libmpg123.a +0 -0
  388. data/assets/macos/universal/lib/libmruby.a +0 -0
  389. data/assets/macos/universal/lib/libogg.a +0 -0
  390. data/assets/macos/universal/lib/libpng.a +0 -0
  391. data/assets/macos/universal/lib/libtiff.a +0 -0
  392. data/assets/macos/universal/lib/libvorbis.a +0 -0
  393. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  394. data/assets/macos/universal/lib/libwebp.a +0 -0
  395. data/assets/macos/universal/lib/libzstd.a +0 -0
  396. data/assets/test_media/README.md +0 -3
  397. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  398. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  399. data/assets/test_media/boom.png +0 -0
  400. data/assets/test_media/coin.png +0 -0
  401. data/assets/test_media/colors.png +0 -0
  402. data/assets/test_media/controller.png +0 -0
  403. data/assets/test_media/dial.wav +0 -0
  404. data/assets/test_media/hero.png +0 -0
  405. data/assets/test_media/image.bmp +0 -0
  406. data/assets/test_media/image.jpg +0 -0
  407. data/assets/test_media/image.png +0 -0
  408. data/assets/test_media/music.flac +0 -0
  409. data/assets/test_media/music.mp3 +0 -0
  410. data/assets/test_media/music.ogg +0 -0
  411. data/assets/test_media/music.wav +0 -0
  412. data/assets/test_media/originals/boom.pxm +0 -0
  413. data/assets/test_media/originals/coin.pxm +0 -0
  414. data/assets/test_media/originals/controller.sketch +0 -0
  415. data/assets/test_media/originals/hero.pxm +0 -0
  416. data/assets/test_media/originals/image.pxm +0 -0
  417. data/assets/test_media/originals/music.caf +0 -0
  418. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  419. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  420. data/assets/test_media/sound.flac +0 -0
  421. data/assets/test_media/sound.mp3 +0 -0
  422. data/assets/test_media/sound.ogg +0 -0
  423. data/assets/test_media/sound.wav +0 -0
  424. data/assets/test_media/sprite_sheet.png +0 -0
  425. data/assets/test_media/texture_atlas.png +0 -0
  426. data/assets/wasm/libmruby.a +0 -0
  427. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  463. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  464. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  492. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  493. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  499. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  500. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  501. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  502. data/assets/xcode/ios/Info.plist +0 -43
  503. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  504. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  533. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  534. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  535. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  539. data/assets/xcode/ios/main.c +0 -1
  540. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  558. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  559. data/assets/xcode/tvos/Info.plist +0 -30
  560. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  590. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  591. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  592. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  596. data/assets/xcode/tvos/main.c +0 -1
  597. data/ext/ruby2d/common.c +0 -185
  598. data/ext/ruby2d/controllers.c +0 -110
  599. data/ext/ruby2d/gl.c +0 -398
  600. data/ext/ruby2d/gl2.c +0 -86
  601. data/ext/ruby2d/gl3.c +0 -304
  602. data/ext/ruby2d/gles.c +0 -302
  603. data/ext/ruby2d/input.c +0 -48
  604. data/ext/ruby2d/music.c +0 -127
  605. data/ext/ruby2d/sound.c +0 -132
  606. data/lib/ruby2d/cli/console.rb +0 -65
  607. data/lib/ruby2d/cli/enable_console.rb +0 -7
  608. data/lib/ruby2d/cli/platform.rb +0 -17
  609. data/lib/ruby2d/music.rb +0 -77
  610. data/lib/ruby2d/pixel.rb +0 -18
  611. data/lib/ruby2d/pixmap.rb +0 -39
  612. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  613. data/lib/ruby2d/sound.rb +0 -61
  614. data/lib/ruby2d/texture.rb +0 -38
  615. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  619. /data/assets/{include → platform/include}/mruby/re.h +0 -0
@@ -1,57 +1,176 @@
1
1
  # Build a compiled Ruby 2D app with mruby
2
2
 
3
3
  require 'ruby2d'
4
+ require 'ruby2d/version'
4
5
  require 'fileutils'
6
+ require 'shellwords'
5
7
  require 'ruby2d/cli/colorize'
6
- require 'ruby2d/cli/platform'
7
-
8
-
9
- # The Ruby 2D library files
10
- @ruby2d_lib_files = [
11
- 'cli/colorize',
12
- 'exceptions',
13
- 'renderable',
14
- 'color',
15
- 'window',
16
- 'dsl',
17
- 'quad',
18
- 'line',
19
- 'circle',
20
- 'rectangle',
21
- 'square',
22
- 'triangle',
23
- 'pixel',
24
- 'pixmap',
25
- 'pixmap_atlas',
26
- 'image',
27
- 'sprite',
28
- 'tileset',
29
- 'font',
30
- 'text',
31
- 'canvas',
32
- 'sound',
33
- 'music',
34
- 'texture',
35
- 'vertices',
36
- '../ruby2d'
37
- ]
8
+ require 'ruby2d/cli/messages'
9
+ require 'ruby2d/cli/lib_files'
10
+ require_relative '../../../assets/target'
11
+
12
+
13
+ # The Ruby 2D library files (shared with the WASM/Try build — see cli/lib_files)
14
+ @ruby2d_lib_files = Ruby2D::CLI::LIB_FILES
38
15
 
39
16
 
40
17
  # Helpers ######################################################################
41
18
 
19
+ # Shell-escape a path for safe interpolation into a command string, so a gem or
20
+ # asset install location containing spaces (or other shell metacharacters)
21
+ # doesn't break the cc/emcc/mrbc invocations. A no-op for ordinary paths.
22
+ def shell_escape(path)
23
+ Shellwords.escape(path.to_s)
24
+ end
25
+
42
26
  def run_cmd(cmd)
43
- puts "#{'$'.info} #{cmd.bold}\n" if @debug
27
+ cmd_echo(cmd) if @debug
44
28
  system cmd
45
29
  end
46
30
 
31
+ # Echo a command under `--debug`, abbreviating the gem dir to keep it readable.
32
+ # Substitutes both the escaped and plain gem dir so it works whether or not the
33
+ # path needed shell-escaping.
34
+ def cmd_echo(cmd)
35
+ display_cmd = cmd.gsub(shell_escape(Ruby2D.gem_dir), '$RUBY2D').gsub(Ruby2D.gem_dir, '$RUBY2D')
36
+ puts " #{"$ #{display_cmd}".dim}\n\n"
37
+ end
38
+
39
+
40
+ # Print a build-step banner — a ruby-red diamond and a bold title — to match
41
+ # the `ruby2d` CLI and `rake` output. Artifact paths are listed beneath it.
42
+ def step(title)
43
+ puts "\n #{'◆'.ruby2d_red} #{title.bold}"
44
+ end
45
+
46
+
47
+ # List a file or bundle the build produced, beneath its step banner. The dim
48
+ # `wrote` label marks it as an output without competing with the path itself.
49
+ def wrote(path)
50
+ puts " #{'wrote'.dim} #{path}"
51
+ end
52
+
53
+
54
+ # A friendly label for the host platform the native build targets (e.g.
55
+ # "macOS (arm64)"). `ruby2d build` doesn't cross-compile — the executable is for
56
+ # this machine only — so naming it avoids the "is this a universal binary?" doubt.
57
+ def native_target
58
+ os = { 'macos' => 'macOS', 'windows' => 'Windows',
59
+ 'linux' => 'Linux', 'bsd' => 'BSD' }.fetch(AssetsTarget.host_os, AssetsTarget.host_os)
60
+ "#{os} (#{AssetsTarget.host_arch})"
61
+ end
62
+
47
63
 
48
- # Remove `require 'ruby2d'` from source file
64
+ # Neutralize `require 'ruby2d'` / `require 'ruby2d/core'` lines — the bundled
65
+ # build already provides Ruby2D. Blank each one out rather than deleting it, so
66
+ # every following line keeps its original number and an `mrbc` compile error
67
+ # still points at the right line in the user's source.
49
68
  def strip_require(file)
50
- output = ''
51
- File.foreach(file) do |line|
52
- output << line unless line =~ /require ('|")ruby2d('|")/
69
+ File.foreach(file).map do |line|
70
+ line.match?(/require ('|")ruby2d(\/core)?('|")/) ? "\n" : line
71
+ end.join
72
+ end
73
+
74
+
75
+ # Collect the asset directories declared inline with `# ruby2d:assets <dir>`
76
+ # directives in the app source — the flag-free equivalent of `--assets`, so an
77
+ # app can carry its own bundling instructions instead of relying on the caller
78
+ # to remember the flag. One directory per directive; repeat the line for
79
+ # several. Paths are relative to the build's working directory, matching
80
+ # `--assets`. Returns the directories in source order.
81
+ def asset_directives(file)
82
+ File.foreach(file).filter_map do |line|
83
+ m = line.match(/\A\s*#\s*ruby2d:assets\s+(\S.*?)\s*\z/)
84
+ m && m[1]
53
85
  end
54
- return output
86
+ end
87
+
88
+
89
+ # Locate an executable on PATH. Portable replacement for `which`, which is
90
+ # Unix-only (Windows cmd.exe has no `which`); tries Windows executable
91
+ # extensions when running there.
92
+ def find_executable(name)
93
+ exts = AssetsTarget.host_os == 'windows' ? ['.exe', '.bat', '.cmd', ''] : ['']
94
+
95
+ # An explicit path (e.g. `CC=/usr/bin/clang`) is used as-is, not searched on
96
+ # PATH — `File.join(dir, '/usr/bin/clang')` would collapse to a bogus path.
97
+ if name.include?(File::SEPARATOR) || (File::ALT_SEPARATOR && name.include?(File::ALT_SEPARATOR))
98
+ exts.each do |ext|
99
+ candidate = "#{name}#{ext}"
100
+ return candidate if File.file?(candidate) && File.executable?(candidate)
101
+ end
102
+ return nil
103
+ end
104
+
105
+ ENV.fetch('PATH', '').split(File::PATH_SEPARATOR).each do |dir|
106
+ next if dir.empty?
107
+ exts.each do |ext|
108
+ candidate = File.join(dir, "#{name}#{ext}")
109
+ return candidate if File.file?(candidate) && File.executable?(candidate)
110
+ end
111
+ end
112
+ nil
113
+ end
114
+
115
+
116
+ # Ruby 2D's static libraries (SDL3 + mruby) live in one of two places for the
117
+ # current target: bundled inside the gem (the RELEASE_PLATFORMS), or built by
118
+ # `ruby2d setup` into the per-user cache (every other platform). These helpers
119
+ # resolve which — the compile steps and find_mrbc share them.
120
+
121
+ # The bundled platform dir inside the gem — populated for RELEASE_PLATFORMS.
122
+ def bundled_platform_dir
123
+ AssetsTarget.platform_dir(root: Ruby2D.assets)
124
+ end
125
+
126
+ # The platform dir a `ruby2d setup` build writes into, outside the gem.
127
+ def cache_platform_dir
128
+ AssetsTarget.platform_dir(root: AssetsTarget.cache_root)
129
+ end
130
+
131
+ # A cache build is only usable by the ruby2d version that produced it — a gem
132
+ # upgrade may pin newer SDL/mruby, and stale cache libs must not be linked
133
+ # against fresh headers. `ruby2d setup` stamps the build; require a match.
134
+ def cache_stamp_ok?(dir)
135
+ stamp = File.join(dir, '.ruby2d-version')
136
+ File.exist?(stamp) && File.read(stamp).strip == Ruby2D::VERSION
137
+ end
138
+
139
+ # The platform dir holding this target's static libs — bundled first, then a
140
+ # stamped cache build. nil if neither has them, in which case the native build
141
+ # links system-installed SDL3 + mruby (Linux/BSD, or before `ruby2d setup`).
142
+ def deps_platform_dir
143
+ bundled = bundled_platform_dir
144
+ return bundled if File.exist?(File.join(bundled, 'lib', 'libSDL3.a'))
145
+
146
+ cache = cache_platform_dir
147
+ return cache if File.exist?(File.join(cache, 'lib', 'libSDL3.a')) && cache_stamp_ok?(cache)
148
+
149
+ nil
150
+ end
151
+
152
+ # The SDL3 + mruby headers matching the resolved libraries (platform/include is
153
+ # a sibling of the per-target lib dir). Falls back to the bundled headers for
154
+ # the system-lib build, where they still describe the pinned API.
155
+ def deps_include_dir
156
+ dir = deps_platform_dir
157
+ dir ? File.join(File.dirname(dir), 'include') : "#{Ruby2D.assets}/platform/include"
158
+ end
159
+
160
+ # Find the `mrbc` executable: prefer bundled assets, then a `ruby2d setup` cache
161
+ # build, then $PATH.
162
+ def find_mrbc
163
+ name = AssetsTarget.host_os == 'windows' ? 'mrbc.exe' : 'mrbc'
164
+
165
+ bundled = File.join(bundled_platform_dir, 'bin', name)
166
+ return bundled if File.exist?(bundled)
167
+
168
+ cache = cache_platform_dir
169
+ cached_mrbc = File.join(cache, 'bin', name)
170
+ return cached_mrbc if File.exist?(cached_mrbc) && cache_stamp_ok?(cache)
171
+
172
+ # Fall back to system-installed mrbc
173
+ find_executable('mrbc')
55
174
  end
56
175
 
57
176
 
@@ -59,32 +178,62 @@ end
59
178
  def add_ld_flags(ld_flags, name, type, dir = nil)
60
179
  case type
61
180
  when :archive
62
- ld_flags << "#{dir}/lib#{name}.a "
181
+ ld_flags << "#{shell_escape("#{dir}/lib#{name}.a")} "
63
182
  when :framework
64
183
  ld_flags << "-Wl,-framework,#{name} "
65
184
  end
66
185
  end
67
186
 
68
187
 
188
+ # Our build output lives in `build/` under the current directory, and a build
189
+ # wipes it first. A hidden marker lets a later build (or `--clean`) tell its own
190
+ # output from an unrelated, pre-existing `build/` — CMake, Meson, and many other
191
+ # tools default to that name — before deleting anything.
192
+ BUILD_DIR = 'build'
193
+ BUILD_MARKER = File.join(BUILD_DIR, '.ruby2d')
194
+
195
+ # Refuse to wipe `build/` when it exists, holds files, and isn't ours — so
196
+ # running `ruby2d build` in a project that already uses `build/` for something
197
+ # else can't silently delete it. `Dir.glob` skips the dotfile marker, so the
198
+ # emptiness check and the delete target stay consistent.
199
+ def refuse_if_foreign_build_dir
200
+ return unless Dir.exist?(BUILD_DIR)
201
+ return if File.exist?(BUILD_MARKER)
202
+ return if Dir.glob("#{BUILD_DIR}/*").empty?
203
+
204
+ error "A `#{BUILD_DIR}/` directory already exists here and wasn't created by Ruby 2D."
205
+ puts 'Refusing to delete its contents. Remove it yourself, or run `ruby2d build` from a different directory.'
206
+ exit 1
207
+ end
208
+
209
+
69
210
  # Build Tasks ##################################################################
70
211
 
71
- # Build the user's application
72
- def build(target, ruby2d_app)
212
+ # Compile Ruby source to mruby bytecode and assemble into a single C file
213
+ def compile(ruby2d_app)
73
214
 
74
215
  # Check if source file provided is good
75
216
  if !ruby2d_app
76
- puts "Please provide a Ruby file to build"
77
- exit
217
+ error 'Please provide a Ruby file to build.'
218
+ exit 1
78
219
  elsif !File.exist? ruby2d_app
79
- puts "Can't find file: #{ruby2d_app}"
80
- exit
220
+ error "Can't find file: #{ruby2d_app}"
221
+ exit 1
81
222
  end
82
223
 
83
224
  # Add debugging information to produce backtrace
84
- if @debug then debug_flag = '-g' end
225
+ debug_flag = @debug ? '-g' : ''
85
226
 
86
- # Create build directory
87
- FileUtils.mkdir_p 'build'
227
+ # Clear and create build directory, refusing to wipe a foreign `build/` and
228
+ # marking ours so later builds recognize it.
229
+ refuse_if_foreign_build_dir
230
+ FileUtils.rm_rf Dir.glob("#{BUILD_DIR}/*")
231
+ FileUtils.mkdir_p BUILD_DIR
232
+ FileUtils.touch BUILD_MARKER
233
+
234
+ # Compiling Ruby to bytecode is a sub-second internal step with no artifact a
235
+ # user runs — show its banner (and the `mrbc` echoes below) only with `--debug`.
236
+ step "Compiling #{ruby2d_app}" if @debug
88
237
 
89
238
  # Assemble Ruby 2D library files into one '.rb' file
90
239
 
@@ -95,54 +244,103 @@ def build(target, ruby2d_app)
95
244
  ruby2d_lib << File.read("#{ruby2d_lib_dir + f}.rb") + "\n\n"
96
245
  end
97
246
 
247
+ # Make Ruby2D classes and DSL methods available at the top level
248
+ ruby2d_lib << "include Ruby2D\nextend Ruby2D::DSL\n"
249
+
98
250
  File.write('build/ruby2d_lib.rb', ruby2d_lib)
99
251
 
100
252
  # Assemble the Ruby 2D C extension files into one '.c' file
101
253
 
102
254
  ruby2d_ext_dir = "#{Ruby2D.gem_dir}/ext/ruby2d/"
103
255
 
104
- ruby2d_ext = "#define MRUBY 1" << "\n\n"
105
- Dir["#{ruby2d_ext_dir}*.c"].each do |c_file|
106
- ruby2d_ext << File.read(c_file)
107
- end
256
+ ruby2d_ext = "#define MRUBY 1\n\n"
257
+ c_files = Dir["#{ruby2d_ext_dir}*.c"].sort
258
+ main_file = c_files.delete("#{ruby2d_ext_dir}ruby2d.c")
259
+ c_files.unshift(main_file) if main_file
260
+ c_files.each { |c_file| ruby2d_ext << File.read(c_file) }
108
261
 
109
262
  File.write('build/ruby2d_ext.c', ruby2d_ext)
110
263
 
111
- # Select `mrbc` executable based on platform
112
- case $RUBY2D_PLATFORM
113
- when :macos
114
- mrbc = "#{Ruby2D.assets}/macos/universal/bin/mrbc"
115
- when :windows
116
- mrbc = "#{Ruby2D.assets}/windows/mingw-w64-x86_64/bin/mrbc.exe"
117
- else
118
- mrbc = 'mrbc'
264
+ # Find the `mrbc` executable
265
+ mrbc = find_mrbc
266
+ unless mrbc
267
+ error "Can't find `mrbc`, the mruby compiler."
268
+ puts 'Run `ruby2d setup` to build it, or install mruby so `mrbc` is on your PATH.'
269
+ exit 1
119
270
  end
120
271
 
121
- # Compile the Ruby 2D lib (`.rb` files) to mruby bytecode
122
- run_cmd "#{mrbc} #{debug_flag} -Bruby2d_lib -obuild/ruby2d_lib.c build/ruby2d_lib.rb"
272
+ # Compile the Ruby 2D lib (`.rb` files) to mruby bytecode. `run_cmd` doesn't
273
+ # check the result, so do it here — a failure means the assembled bytecode
274
+ # files won't exist, and the combine step below would crash on a missing file.
275
+ run_cmd "#{shell_escape(mrbc)} #{debug_flag} -Bruby2d_lib -obuild/ruby2d_lib.c build/ruby2d_lib.rb"
276
+ unless $?.success?
277
+ error 'Failed to compile the Ruby 2D library.'
278
+ exit 1
279
+ end
123
280
 
124
- # Read the user's provided Ruby source file, copy to build dir and compile to bytecode
125
- File.open('build/ruby2d_app.rb', 'w') { |f| f << strip_require(ruby2d_app) }
126
- run_cmd "#{mrbc} #{debug_flag} -Bruby2d_app -obuild/ruby2d_app.c build/ruby2d_app.rb"
281
+ # Stage the user's source (requires blanked see strip_require) and compile it.
282
+ # `mrbc` reports diagnostics against the path it's given, so capture its output
283
+ # and rewrite the staging path back to the original filename: a syntax error
284
+ # then points at `asteroids.rb:LINE`, the file the user wrote, not the internal
285
+ # copy. Line numbers already line up because strip_require preserves them.
286
+ staged = 'build/ruby2d_app.rb'
287
+ File.write(staged, strip_require(ruby2d_app))
288
+ app_cmd = "#{shell_escape(mrbc)} #{debug_flag} -Bruby2d_app -obuild/ruby2d_app.c #{staged}"
289
+ cmd_echo(app_cmd) if @debug
290
+ app_output = `#{app_cmd} 2>&1`
291
+ app_result = $?
292
+ print app_output.gsub(staged) { ruby2d_app } unless app_output.empty?
293
+ unless app_result.success?
294
+ error "Failed to compile #{ruby2d_app}."
295
+ puts 'Check the error above for syntax issues or Ruby features mruby does not support.'
296
+ exit 1
297
+ end
127
298
 
128
299
  # Combine contents of C source files and bytecode into one file
129
- open('build/app.c', 'w') do |f|
300
+ File.open('build/app.c', 'w') do |f|
130
301
  ['ruby2d_app', 'ruby2d_lib', 'ruby2d_ext'].each do |c_file|
131
302
  f << File.read("build/#{c_file}.c") << "\n\n"
132
303
  end
133
304
  end
134
305
 
135
- # Compile the final application based on the target platform
136
- case target
137
- when :native
138
- compile_native
139
- when :web
140
- compile_web
306
+ # `build/app.c` is an intermediate the native/web steps consume, not something
307
+ # the user runs — surface it only with `--debug`, where it's also kept.
308
+ wrote 'build/app.c' if @debug
309
+ end
310
+
311
+
312
+ # Build the user's application for one or more targets
313
+ def build(targets, ruby2d_app)
314
+ targets = [targets] unless targets.is_a?(Array)
315
+
316
+ compile(ruby2d_app)
317
+
318
+ # Asset directories to bundle: the `--assets` flag plus any `# ruby2d:assets
319
+ # <dir>` directives in the app source. Each is bundled at its own relative
320
+ # path — mounted into the WebAssembly virtual filesystem for the web build,
321
+ # copied next to the executable for the native build. Validate once here so a
322
+ # missing directory fails before either target starts compiling.
323
+ @asset_dirs = ([@assets_dir] + asset_directives(ruby2d_app)).compact.uniq
324
+ @asset_dirs.each { |dir| check_asset_dir(dir) }
325
+
326
+ targets.each do |target|
327
+ case target
328
+ when :native
329
+ compile_native
330
+ when :web
331
+ compile_web
332
+ end
141
333
  end
142
334
 
143
- # Remove files used in the build process
144
- clean_up unless @debug
335
+ # Remove intermediate build files. `--debug` keeps them all — including the
336
+ # assembled `build/app.c`, for anyone who wants to compile it themselves.
337
+ unless @debug
338
+ FileUtils.rm(Dir.glob('build/*.rb'))
339
+ FileUtils.rm(Dir.glob('build/*.c'))
340
+ end
145
341
 
342
+ # Trailing blank line so the output isn't flush against the next shell prompt.
343
+ puts
146
344
  end
147
345
 
148
346
 
@@ -151,155 +349,206 @@ def compile_native
151
349
 
152
350
  # Get include directories
153
351
  incl_dir_ruby2d = "#{Ruby2D.gem_dir}/ext/ruby2d/"
154
- incl_dir_deps = "#{Ruby2D.assets}/include/"
352
+ incl_dir_deps = deps_include_dir
353
+
354
+ # Set C flags, if any
355
+ c_flags = ''
356
+
357
+ # Add library search directory
358
+ ld_flags = ''
359
+ # Dependent SDL archives before the base `libSDL3.a` so single-pass GNU ld
360
+ # (MinGW on Windows, and Linux/BSD ld) resolves their symbols; mruby is
361
+ # independent of SDL. Mirrors the order in ext/ruby2d/extconf.rb.
362
+ libs = %w[mruby SDL3_image SDL3_mixer SDL3_ttf SDL3]
363
+ if (platform_dir = deps_platform_dir)
364
+ # Bundled or `ruby2d setup`-built static archives. macOS's ld64 is order-independent.
365
+ ld_dir = File.join(platform_dir, 'lib')
366
+ libs.each { |name| add_ld_flags(ld_flags, name, :archive, ld_dir) }
367
+ else
368
+ # No static libs for this target (Linux/BSD aren't in RELEASE_PLATFORMS and
369
+ # `ruby2d setup` hasn't built them): link system-installed SDL3 + mruby, the
370
+ # same fallback find_mrbc uses for `mrbc`.
371
+ libs.each { |name| ld_flags << "-l#{name} " }
372
+ end
155
373
 
156
374
  # Add compiler flags for each platform
157
- case $RUBY2D_PLATFORM
158
-
159
- when :macos
160
- ld_dir = "#{Ruby2D.assets}/macos/universal/lib"
375
+ case AssetsTarget.host_os
161
376
 
162
- c_flags = '-arch arm64 -arch x86_64'
163
-
164
- ld_flags = ''
165
- ['mruby', 'SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_ttf',
166
- 'jpeg', 'jxl', 'avif', 'png', 'tiff', 'webp',
167
- 'mpg123', 'ogg', 'FLAC', 'vorbis', 'vorbisfile', 'modplug',
168
- 'freetype', 'harfbuzz', 'graphite2'].each do |name|
169
- add_ld_flags(ld_flags, name, :archive, ld_dir)
170
- end
171
-
172
- ld_flags << "-lz -lbz2 -liconv -lstdc++ "
173
- ['Cocoa', 'Carbon', 'CoreVideo', 'OpenGL', 'Metal', 'CoreAudio', 'AudioToolbox',
174
- 'IOKit', 'GameController', 'ForceFeedback', 'CoreHaptics'].each do |name|
377
+ when 'macos'
378
+ %w[AVFoundation AudioToolbox Carbon Cocoa CoreAudio CoreHaptics
379
+ CoreMedia ForceFeedback GameController IOKit Metal QuartzCore
380
+ UniformTypeIdentifiers].each do |name|
175
381
  add_ld_flags(ld_flags, name, :framework)
176
382
  end
177
383
 
178
- when :linux, :linux_rpi, :bsd
179
- # TODO: implement this
180
- # ld_flags = '-lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lm -lGL'
181
-
182
- when :windows
384
+ when 'windows'
385
+ ld_flags << '-lgdi32 -lhid -limm32 -lole32 -loleaut32 -lrpcrt4 -lsetupapi -lusp10 -luuid -lversion -lwinmm -lws2_32'
183
386
 
184
- if RUBY_PLATFORM =~ /ucrt/
185
- ld_dir = "#{Ruby2D.assets}/windows/mingw-w64-ucrt-x86_64/lib"
186
- else
187
- ld_dir = "#{Ruby2D.assets}/windows/mingw-w64-x86_64/lib"
188
- end
387
+ when 'linux', 'bsd'
388
+ ld_flags << '-lm'
389
+ end
189
390
 
190
- ld_flags = '-static -Wl,--start-group '
191
- ['mruby',
192
- 'SDL2',
193
- 'SDL2_image', 'jpeg', 'png', 'tiff', 'webp', 'jxl', 'hwy', 'jbig', 'deflate', 'lzma', 'zstd', 'Lerc',
194
- 'SDL2_mixer', 'mpg123', 'FLAC', 'vorbis', 'vorbisfile', 'ogg', 'modplug', 'opus', 'opusfile', 'sndfile',
195
- 'SDL2_ttf', 'freetype', 'harfbuzz', 'graphite2', 'bz2', 'brotlicommon', 'brotlidec',
196
- 'glew32', 'stdc++', 'z', 'ssp'
197
- ].each do |name|
198
- add_ld_flags(ld_flags, name, :archive, ld_dir)
199
- end
200
- ld_flags << '-lmingw32 -lopengl32 -lole32 -loleaut32 -limm32 -lversion -lwinmm -lrpcrt4 -mwindows -lsetupapi -ldwrite '\
201
- '-lws2_32 -lshlwapi '
202
- ld_flags << '-Wl,--end-group'
391
+ # Check for a C compiler up front so a missing toolchain gives a clear message
392
+ # instead of a bare `failed` on exit 127 (like the `mrbc` check). A missing C
393
+ # compiler is a hard error — native can't build without it — whereas a missing
394
+ # `emcc` only skips the optional web build. Honor $CC if set, else default `cc`.
395
+ cc = ENV['CC'] || 'cc'
396
+ if find_executable(cc).nil?
397
+ error "Can't find `#{cc}`, a C compiler. Install a C toolchain (e.g. Xcode Command Line Tools or build-essential) or set $CC."
398
+ exit 1
203
399
  end
204
400
 
205
401
  # Compile the app
206
- run_cmd "cc #{c_flags} -I#{incl_dir_ruby2d} -I#{incl_dir_deps} build/app.c #{ld_flags} -o build/app"
207
-
208
- create_macos_bundle if $RUBY2D_PLATFORM == :macos
209
- end
210
-
211
-
212
- # Create a WebAssembly executable using Emscripten
213
- def compile_web
214
-
215
- # Check for compiler toolchain issues
216
- if doctor_web(:building)
217
- puts "Fix errors before building.\n\n"
402
+ step 'Building native'
403
+ puts " #{"for #{native_target}".dim}"
404
+ FileUtils.mkdir_p 'build/native'
405
+ run_cmd "#{shell_escape(cc)} #{c_flags} -I#{shell_escape(incl_dir_ruby2d)} -I#{shell_escape(incl_dir_deps)} build/app.c #{ld_flags} -o build/native/app"
406
+
407
+ unless $?.success?
408
+ error 'Native build failed.'
409
+ unless deps_platform_dir
410
+ puts "No bundled libraries for #{AssetsTarget.target_id}. Run `ruby2d setup` to build"
411
+ puts 'them, or install SDL3 + mruby with your system package manager.'
412
+ end
413
+ exit 1
218
414
  end
219
415
 
220
- wasm_assets = "#{Ruby2D.assets}/wasm"
221
-
222
- # Get include directories
223
- incl_dir_ruby2d = "#{Ruby2D.gem_dir}/ext/ruby2d/"
224
- incl_dir_deps = "#{Ruby2D.assets}/include/"
225
-
226
- optimize_flags = '-Os --closure 1'
227
- ld_flags = "#{wasm_assets}/libmruby.a"
228
-
229
- # Compile using Emscripten
230
- run_cmd "emcc -s WASM=1 -I#{incl_dir_ruby2d} -I#{incl_dir_deps} "\
231
- "-s USE_SDL=2 -s USE_SDL_IMAGE=2 -s USE_SDL_MIXER=2 -s USE_SDL_TTF=2 "\
232
- "build/app.c #{ld_flags} -o build/app.html"
416
+ # Bundle the default font next to the executable so apps using the built-in
417
+ # font (`Text.new('…')` with no `font:`) resolve it at runtime. The native app
418
+ # reads `ruby2d/fonts/…` relative to its working directory — which
419
+ # `ruby2d launch --native` sets to `build/native` — mirroring the WASM preload.
420
+ fonts_src = "#{Ruby2D.assets}/resources/fonts"
421
+ if Dir.exist?(fonts_src)
422
+ fonts_dest = 'build/native/ruby2d/fonts'
423
+ FileUtils.mkdir_p fonts_dest
424
+ FileUtils.cp_r "#{fonts_src}/.", fonts_dest
425
+ end
233
426
 
234
- # TODO: Copy HTML template from gem assets to build directory
235
- # FileUtils.cp "#{wasm_assets}/template.html", 'build/app.html'
427
+ # Bundle each declared asset directory next to the executable — the native
428
+ # counterpart to the web build's virtual-filesystem preload. The app resolves
429
+ # them at runtime from its working directory (`build/native`, set by
430
+ # `ruby2d launch --native`), so a dir mounts at the same relative path it was
431
+ # given, matching how the app references it (`Image.new('media/x.png')`).
432
+ @asset_dirs.each do |dir|
433
+ dest = File.join('build/native', dir)
434
+ FileUtils.mkdir_p File.dirname(dest)
435
+ FileUtils.cp_r dir, dest
436
+ end
236
437
 
237
- exit(1) unless $?.success?
438
+ create_macos_bundle if AssetsTarget.host_os == 'macos'
439
+ wrote 'build/native/app'
440
+ wrote 'build/native/App.app' if AssetsTarget.host_os == 'macos'
441
+ puts " #{'Run `ruby2d launch --native` to view'.dim}"
238
442
  end
239
443
 
240
444
 
241
- def doctor_native
242
- # Check if MRuby exists; if not, quit
243
- if `which mruby`.empty?
244
- puts "#{'Error:'.error} Can't find `mruby`, which is needed to build native Ruby 2D applications.\n"
245
- exit
445
+ # Validate an asset directory (from `--assets` or a `# ruby2d:assets` directive)
446
+ # before it's bundled. A missing dir aborts the build rather than ship an app
447
+ # that can't find its assets. Both builds bundle the dir at the path given —
448
+ # the web VFS mounts it there, the native build copies it there next to the
449
+ # executable — so an absolute dir lands at that same absolute path, which the
450
+ # relative references apps use won't find; warn rather than silently mislead.
451
+ def check_asset_dir(dir)
452
+ unless Dir.exist?(dir)
453
+ error "asset directory not found: #{dir}"
454
+ exit 1
246
455
  end
247
- end
248
-
456
+ return unless File.absolute_path?(dir)
249
457
 
250
- # Check for problems with web build
251
- def doctor_web(mode = nil)
252
-
253
- errors = false
254
- mruby_errors = false
255
- emscripten_errors = false
458
+ warning "assets dir `#{dir}` is absolute, so it's bundled at that same " \
459
+ 'path. Reference it by that absolute path, or use a relative dir (e.g. `media`) instead.'
460
+ end
256
461
 
257
- puts "\nChecking for mruby"
258
462
 
259
- # Check for `mrbc`
260
- print ' mrbc...'
261
- if `which mrbc`.empty?
262
- puts 'not found'.error
263
- mruby_errors = true
264
- else
265
- puts 'found'.success
463
+ # Create a WebAssembly executable using Emscripten
464
+ def compile_web
465
+ # When Emscripten is missing: skip the web build for a default `ruby2d build`
466
+ # (so the native app still gets produced), but fail loudly when `--web` was
467
+ # passed explicitly — the user asked for web specifically, so it shouldn't pass
468
+ # silently (e.g. in `ruby2d build --web && deploy`).
469
+ if find_executable('emcc').nil?
470
+ if @web_explicit
471
+ error "Can't find `emcc`. Install the Emscripten SDK and source emsdk_env.sh", spaced: true
472
+ exit 1
473
+ end
474
+ puts "\n #{'Skipping web build — Emscripten (emcc) not found'.dim}"
475
+ return
266
476
  end
267
477
 
268
- puts "\nChecking for Emscripten tools"
478
+ step 'Building web'
479
+ FileUtils.mkdir_p 'build/web'
269
480
 
270
- # Check for `emcc`
271
- print ' emcc...'
272
- if `which emcc`.empty?
273
- puts 'not found'.error
274
- emscripten_errors = true
275
- else
276
- puts 'found'.success
277
- end
481
+ incl_dir_ruby2d = "#{Ruby2D.gem_dir}/ext/ruby2d/"
482
+ incl_dir_deps = "#{Ruby2D.assets}/platform/include/"
483
+
484
+ wasm_lib_dir = "#{Ruby2D.assets}/platform/wasm/lib"
485
+ ld_flags = Dir["#{wasm_lib_dir}/*.a"].map { |f| shell_escape(f) }.join(' ')
486
+
487
+ # Always bundle the default font for WASM builds
488
+ fonts_dir = "#{Ruby2D.assets}/resources/fonts"
489
+ preload_flag = "--preload-file #{shell_escape("#{fonts_dir}@ruby2d/fonts")}"
490
+
491
+ # Bundle each requested asset directory — from `--assets` and any
492
+ # `# ruby2d:assets` directive — into the virtual filesystem at its own path
493
+ # (the `src@dst` map uses the same string for both). Validated in `build`.
494
+ @asset_dirs.each { |dir| preload_flag += " --preload-file #{shell_escape("#{dir}@#{dir}")}" }
495
+
496
+ # Faster page loads: restrict the JS glue to the browser environment (drops the
497
+ # Node/worker probing) and, for release builds, minify it with Closure. Closure
498
+ # is slow, so skip it for --debug (keep iteration fast and the glue readable);
499
+ # the environment trim is cheap and always applied.
500
+ web_opt_flags = '-sENVIRONMENT=web'
501
+ web_opt_flags += ' --closure 1' unless @debug
502
+
503
+ # The vendored wasm libmruby.a is built with MRB_NO_BOXING (floats inline in
504
+ # mrb_value — the default 32-bit word boxing heap-allocates every Float).
505
+ # The boxing mode is ABI: app.c includes the mruby headers, so it must define
506
+ # the same mode or values are read with mismatched layouts at runtime.
507
+ mruby_abi_flag = '-DMRB_NO_BOXING'
508
+
509
+ # Start the wasm heap at 64MB instead of Emscripten's 16MB default. Growing
510
+ # is kept as a safety valve, but each mid-game `memory.grow` detaches and
511
+ # recopies the heap — a visible frame hitch — and reaching 64MB from 16MB
512
+ # takes ~8 geometric growth steps scattered through early gameplay. Memory
513
+ # isn't stored in the binary, so this doesn't change the download size;
514
+ # browsers commit the pages lazily.
515
+ memory_flags = '-sINITIAL_MEMORY=64MB -sALLOW_MEMORY_GROWTH'
516
+
517
+ if @single_file
518
+ # A custom template becomes Emscripten's shell file (it must contain the
519
+ # `{{{ SCRIPT }}}` placeholder); otherwise emcc emits its default shell.
520
+ shell_flag = @template ? "--shell-file #{shell_escape(@template)} " : ''
521
+ run_cmd "emcc -O3 #{mruby_abi_flag} -I#{shell_escape(incl_dir_ruby2d)} -I#{shell_escape(incl_dir_deps)} "\
522
+ "-sUSE_SDL=0 -sSINGLE_FILE #{memory_flags} #{web_opt_flags} #{shell_flag}"\
523
+ "build/app.c #{ld_flags} #{preload_flag} "\
524
+ "-o build/web/app.html"
525
+
526
+ unless $?.success?
527
+ error 'Web build failed.'
528
+ exit 1
529
+ end
278
530
 
279
- # Check for `emar`
280
- print ' emar...'
281
- if `which emar`.empty?
282
- puts 'not found'.error
283
- emscripten_errors = true
531
+ wrote 'build/web/app.html'
284
532
  else
285
- puts 'found'.success
286
- end
287
-
288
- if mruby_errors || emscripten_errors then errors = true end
289
-
290
- if errors
291
- puts "\nErrors were found!\n\n"
292
- if mruby_errors
293
- puts "* Did you install mruby?"
294
- end
295
- if emscripten_errors
296
- puts "* Did you run \`./emsdk_env.sh\` ?", " For help, check out the \"Getting Started\" guide on webassembly.org"
533
+ run_cmd "emcc -O3 #{mruby_abi_flag} -I#{shell_escape(incl_dir_ruby2d)} -I#{shell_escape(incl_dir_deps)} "\
534
+ "-sUSE_SDL=0 #{memory_flags} #{web_opt_flags} "\
535
+ "build/app.c #{ld_flags} #{preload_flag} "\
536
+ "-o build/web/app.js"
537
+
538
+ unless $?.success?
539
+ error 'Web build failed.'
540
+ exit 1
297
541
  end
298
- puts "\n"
299
- exit(1)
300
- else
301
- puts "\n👍 Everything looks good!\n\n"
542
+
543
+ # Use the caller's template if given, else the bundled default. Either way
544
+ # it must load `app.js` (see the bundled `template.html` for the contract).
545
+ FileUtils.cp(@template || "#{Ruby2D.assets}/resources/web/template.html", 'build/web/app.html')
546
+ wrote 'build/web/app.html'
547
+ wrote 'build/web/app.js'
548
+ wrote 'build/web/app.wasm'
549
+ wrote 'build/web/app.data'
302
550
  end
551
+ puts " #{'Run `ruby2d launch --web` to view'.dim}"
303
552
  end
304
553
 
305
554
 
@@ -329,80 +578,45 @@ def create_macos_bundle
329
578
  )
330
579
 
331
580
  # Create directories
332
- FileUtils.mkpath 'build/App.app/Contents/MacOS'
333
- FileUtils.mkpath 'build/App.app/Contents/Resources'
581
+ FileUtils.mkpath 'build/native/App.app/Contents/MacOS'
582
+ FileUtils.mkpath 'build/native/App.app/Contents/Resources'
334
583
 
335
584
  # Create Info.plist and copy over assets
336
- File.open('build/App.app/Contents/Info.plist', 'w') { |f| f.write(info_plist) }
337
- FileUtils.cp 'build/app', 'build/App.app/Contents/MacOS/'
338
- # Consider using an icon:
339
- # FileUtils.cp "#{@gem_dir}/assets/app.icns", 'build/App.app/Contents/Resources'
340
-
341
- # Clean up
342
- # FileUtils.rm_f 'build/app' unless @debug
343
-
344
- # Success!
345
- # puts 'macOS app bundle created: `build/App.app`'
346
- end
347
-
348
-
349
- # Build an iOS or tvOS app
350
- def build_ios_tvos(rb_file, device)
351
- check_build_src_file(rb_file)
352
-
353
- # Check if MRuby exists; if not, quit
354
- if `which mruby`.empty?
355
- puts "#{'Error:'.error} Can't find MRuby, which is needed to build native Ruby 2D applications.\n"
356
- exit
585
+ File.open('build/native/App.app/Contents/Info.plist', 'w') { |f| f.write(info_plist) }
586
+ FileUtils.cp 'build/native/app', 'build/native/App.app/Contents/MacOS/'
587
+
588
+ # Bundle the runtime resources (default font) next to the executable. The app
589
+ # chdirs to its own directory at startup, so it resolves `ruby2d/fonts/…`
590
+ # here when launched from Finder (where the working directory is otherwise `/`).
591
+ if Dir.exist?('build/native/ruby2d')
592
+ FileUtils.cp_r 'build/native/ruby2d', 'build/native/App.app/Contents/MacOS/'
357
593
  end
358
594
 
359
- # Add debugging information to produce backtrace
360
- if @debug then debug_flag = '-g' end
361
-
362
- # Assemble the Ruby 2D library in one `.rb` file and compile to bytecode
363
- make_lib
364
- `mrbc #{debug_flag} -Bruby2d_lib -obuild/lib.c build/lib.rb`
365
-
366
- # Read the provided Ruby source file, copy to build dir and compile to bytecode
367
- File.open('build/src.rb', 'w') { |file| file << strip_require(rb_file) }
368
- `mrbc #{debug_flag} -Bruby2d_app -obuild/src.c build/src.rb`
369
-
370
- # Copy over iOS project
371
- FileUtils.cp_r "#{@gem_dir}/assets/#{device}", "build"
595
+ # Bundle any declared asset directories (copied next to build/native/app
596
+ # earlier) alongside the executable inside the bundle too, preserving their
597
+ # relative paths, so a Finder-launched app resolves them the same way.
598
+ @asset_dirs.each do |dir|
599
+ src = File.join('build/native', dir)
600
+ next unless Dir.exist?(src)
372
601
 
373
- # Combine contents of C source files and bytecode into one file
374
- File.open("build/#{device}/main.c", 'w') do |f|
375
- f << "#define RUBY2D_IOS_TVOS 1" << "\n\n"
376
- f << "#define MRUBY 1" << "\n\n"
377
- f << File.read("build/lib.c") << "\n\n"
378
- f << File.read("build/src.c") << "\n\n"
379
- f << File.read("#{@gem_dir}/ext/ruby2d/ruby2d.c")
602
+ dest = File.join('build/native/App.app/Contents/MacOS', dir)
603
+ FileUtils.mkdir_p File.dirname(dest)
604
+ FileUtils.cp_r src, dest
380
605
  end
381
606
 
382
- # TODO: Need add this functionality to the gem
383
- # Build the Xcode project
384
- `simple2d build --#{device} build/#{device}/MyApp.xcodeproj`
385
-
386
- # Clean up
387
- clean_up unless @debug
388
-
389
- # Success!
390
- puts "App created: `build/#{device}`"
607
+ # Bundle the icon referenced by CFBundleIconFile (the Ruby 2D default), so the
608
+ # plist's `app.icns` reference resolves instead of dangling.
609
+ icon = "#{Ruby2D.assets}/resources/icons/icon.icns"
610
+ FileUtils.cp icon, 'build/native/App.app/Contents/Resources/app.icns' if File.exist?(icon)
391
611
  end
392
612
 
393
613
 
394
- # Clean up unneeded build files
614
+ # Clean up the build directory
395
615
  def clean_up(cmd = nil)
396
- FileUtils.rm(
397
- Dir.glob('build/*.{rb,c,js}')
398
- )
399
616
  if cmd == :all
400
- puts "cleaning up..."
401
- FileUtils.rm_f 'build/app'
402
- FileUtils.rm_f 'build/app.js'
403
- FileUtils.rm_f 'build/app.html'
404
- FileUtils.rm_rf 'build/App.app'
405
- FileUtils.rm_rf 'build/ios'
406
- FileUtils.rm_rf 'build/tvos'
617
+ refuse_if_foreign_build_dir
618
+ step 'Cleaning build directory'
619
+ FileUtils.rm_rf Dir.glob("#{BUILD_DIR}/*")
620
+ puts
407
621
  end
408
622
  end