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,163 @@
1
+ # UI controls
2
+ # A small control panel made from Ruby 2D shapes: tabs, buttons, toggle, sliders.
3
+ #
4
+ # Adjust the controls to change the preview shape.
5
+
6
+ require 'ruby2d'
7
+
8
+ # === Tunables ===
9
+
10
+ WIDTH = 760 # window width in pixels
11
+ HEIGHT = 500 # window height in pixels
12
+ PULSE_RATE = 4.8 # preview pulse angular speed (rad/sec)
13
+
14
+ # === Window ===
15
+
16
+ set title: 'Ruby 2D ▸ Examples ▸ UI controls', width: WIDTH, height: HEIGHT, background: '#111827'
17
+ set close_on_esc: true
18
+ set render_mode: :on_demand
19
+
20
+ # === UI build ===
21
+
22
+ Rectangle.new(x: 0, y: 0, width: 260, height: HEIGHT, color: '#1f2937')
23
+ preview = Circle.new(x: 510, y: 250, radius: 70, color: [0.25, 0.75, 1.0, 1])
24
+ Text.new('Controls', x: 22, y: 18, size: 22, color: '#f9fafb')
25
+
26
+ # Tabs and buttons are `Button`s — each centers its own label and hit-tests
27
+ # itself, so there's no manual text offset or bounds math anywhere below.
28
+ tabs = ['Circle', 'Square'].map.with_index do |name, i|
29
+ Button.new(x: 20 + i * 110, y: 62, width: 100, height: 34,
30
+ label: name, label_size: 15, color: '#374151', label_color: '#f9fafb')
31
+ end
32
+
33
+ # Pulse toggle — an iOS-style pill: a center bar capped by two circles, with a
34
+ # knob that slides between the caps. The pill pieces (`toggle_bg`) recolor as
35
+ # one; only the knob moves. A visual-less Button over the pill is the hit area.
36
+ toggle_x, toggle_y, toggle_w, toggle_h = 20, 125, 56, 28
37
+ cap_r = toggle_h / 2
38
+ toggle_bg = [
39
+ Rectangle.new(x: toggle_x + cap_r, y: toggle_y,
40
+ width: toggle_w - 2 * cap_r, height: toggle_h, color: '#4b5563'),
41
+ Circle.new(x: toggle_x + cap_r, y: toggle_y + cap_r, radius: cap_r, color: '#4b5563'),
42
+ Circle.new(x: toggle_x + toggle_w - cap_r, y: toggle_y + cap_r, radius: cap_r, color: '#4b5563')
43
+ ]
44
+ toggle_knob = Circle.new(x: toggle_x + cap_r, y: toggle_y + cap_r, radius: 10, color: '#f9fafb')
45
+ toggle_btn = Button.new(x: toggle_x, y: toggle_y, width: toggle_w, height: toggle_h)
46
+ Text.new('Pulse', x: 90, y: 128, size: 17, color: '#e5e7eb')
47
+
48
+ slider_specs = [
49
+ ['Red', 0.25, '#ef4444'],
50
+ ['Green', 0.75, '#22c55e'],
51
+ ['Blue', 1.0, '#38bdf8'],
52
+ ['Size', 0.55, '#facc15']
53
+ ]
54
+ sliders = slider_specs.map.with_index do |(name, value, color), i|
55
+ y = 190 + i * 58
56
+ {
57
+ name: name, value: value, color: color, y: y,
58
+ label: Text.new(name, x: 20, y: y - 24, size: 14, color: '#d1d5db'),
59
+ track: Rectangle.new(x: 20, y: y, width: 190, height: 6, color: '#374151'),
60
+ fill: Rectangle.new(x: 20, y: y, width: 190 * value, height: 6, color: color),
61
+ knob: Circle.new(x: 20 + 190 * value, y: y + 3, radius: 9, color: '#f9fafb')
62
+ }
63
+ end
64
+
65
+ reset_btn = Button.new(x: 20, y: 440, width: 100, height: 34,
66
+ label: 'Reset', label_size: 15, color: '#374151', label_color: '#f9fafb')
67
+ random_btn = Button.new(x: 134, y: 440, width: 106, height: 34,
68
+ label: 'Random', label_size: 15, color: '#374151', label_color: '#f9fafb')
69
+
70
+ mode = :circle
71
+ pulse = false
72
+ drag_slider = nil
73
+ t = 0.0
74
+
75
+ redraw = lambda do
76
+ tabs.each_with_index do |tab, i|
77
+ selected = (mode == :circle && i.zero?) || (mode == :square && i == 1)
78
+ tab.color = selected ? '#2563eb' : '#374151'
79
+ end
80
+
81
+ toggle_color = pulse ? '#16a34a' : '#4b5563'
82
+ toggle_bg.each { |part| part.color = toggle_color }
83
+ toggle_knob.x = pulse ? toggle_x + toggle_w - cap_r : toggle_x + cap_r
84
+
85
+ sliders.each do |s|
86
+ s[:fill].width = 190 * s[:value]
87
+ s[:knob].x = 20 + 190 * s[:value]
88
+ end
89
+
90
+ color = [sliders[0][:value], sliders[1][:value], sliders[2][:value], 1]
91
+ size = 35 + sliders[3][:value] * 95
92
+ preview.remove
93
+ preview = if mode == :circle
94
+ Circle.new(x: 510, y: 250, radius: size / 2, color: color)
95
+ else
96
+ Square.new(x: 510 - size / 2, y: 250 - size / 2, size: size, color: color)
97
+ end
98
+ request_render
99
+ end
100
+
101
+ # === Helpers ===
102
+
103
+ set_slider = lambda do |slider, x|
104
+ slider[:value] = ((x - 20) / 190.0).clamp(0.0, 1.0)
105
+ redraw.call
106
+ end
107
+
108
+ # === Input ===
109
+
110
+ # Buttons hit-test themselves and fire `:click`, so the clickable controls just
111
+ # attach handlers — no coordinate math.
112
+ tabs.each_with_index do |tab, i|
113
+ tab.on(:click) do
114
+ mode = i.zero? ? :circle : :square
115
+ redraw.call
116
+ end
117
+ end
118
+
119
+ toggle_btn.on(:click) do
120
+ pulse = !pulse
121
+ redraw.call
122
+ end
123
+
124
+ reset_btn.on(:click) do
125
+ slider_specs.each_with_index { |(_, value, _), i| sliders[i][:value] = value }
126
+ redraw.call
127
+ end
128
+
129
+ random_btn.on(:click) do
130
+ sliders.each { |s| s[:value] = rand }
131
+ redraw.call
132
+ end
133
+
134
+ # Sliders drag rather than click, so they stay on the window's mouse handlers.
135
+ on :mouse_down do |event|
136
+ sliders.each do |s|
137
+ next unless event.x.between?(15, 215) && event.y.between?(s[:y] - 10, s[:y] + 16)
138
+
139
+ drag_slider = s
140
+ set_slider.call(s, event.x)
141
+ end
142
+ end
143
+
144
+ on :mouse_up do
145
+ drag_slider = nil
146
+ end
147
+
148
+ on :mouse_move do |event|
149
+ set_slider.call(drag_slider, event.x) if drag_slider
150
+ end
151
+
152
+ # === Update ===
153
+
154
+ update do |dt|
155
+ next unless pulse
156
+
157
+ t += PULSE_RATE * dt
158
+ preview.opacity = 0.65 + Math.sin(t) * 0.25
159
+ request_render
160
+ end
161
+
162
+ redraw.call
163
+ show
@@ -0,0 +1,139 @@
1
+ # 3D wireframe
2
+ # A wireframe sphere drawn entirely from 2D `Polyline` primitives.
3
+ #
4
+ # Each frame, the sphere's vertices are rotated in 3D, perspective-
5
+ # projected onto the screen, and every latitude / longitude line is
6
+ # laid down as a depth-shaded polyline so the back of the sphere reads
7
+ # as further away. Click and drag to spin it; let go and it keeps
8
+ # rotating.
9
+
10
+ require 'ruby2d'
11
+
12
+ # === Tunables ===
13
+
14
+ WIDTH = 800 # window width in pixels
15
+ HEIGHT = 600 # window height in pixels
16
+ N_LAT = 9 # number of latitude rings between the poles
17
+ N_LON = 18 # longitudes / segments per ring
18
+ RADIUS = 220 # sphere radius in pixels
19
+ CAMERA = 4.0 # camera distance in unit-sphere coordinates
20
+ AUTO_ROT_X = 0.30 # idle rotation rate around X (rad/sec)
21
+ AUTO_ROT_Y = 0.55 # idle rotation rate around Y (rad/sec)
22
+ DRAG_SENS = 0.006 # screen-pixels → radians for mouse drag
23
+
24
+ # === Window ===
25
+
26
+ set title: 'Ruby 2D ▸ Examples ▸ 3D wireframe',
27
+ width: WIDTH, height: HEIGHT, background: '#06081a'
28
+ set close_on_esc: true
29
+
30
+ # === Geometry: sphere ===
31
+
32
+ # Lat row i sits at theta = π·(i+1)/(N_LAT+1) so it lies between, but
33
+ # never on, the poles. The poles are stored as their own vertices and
34
+ # referenced by every longitude line.
35
+ SPHERE = []
36
+ N_LAT.times do |i|
37
+ theta = Math::PI * (i + 1) / (N_LAT + 1)
38
+ N_LON.times do |j|
39
+ phi = 2 * Math::PI * j / N_LON
40
+ SPHERE << [Math.sin(theta) * Math.cos(phi),
41
+ Math.cos(theta),
42
+ Math.sin(theta) * Math.sin(phi)]
43
+ end
44
+ end
45
+ NORTH = SPHERE.length; SPHERE << [0, 1, 0]
46
+ SOUTH = SPHERE.length; SPHERE << [0, -1, 0]
47
+ SPHERE.freeze
48
+
49
+ # === State ===
50
+
51
+ rot_x = 0.4
52
+ rot_y = 0.0
53
+ drag_from = nil
54
+
55
+ # === Input ===
56
+
57
+ on :mouse_down do |event|
58
+ drag_from = [event.x, event.y]
59
+ end
60
+
61
+ on :mouse_up do
62
+ drag_from = nil
63
+ end
64
+
65
+ on :mouse_move do |event|
66
+ next unless drag_from
67
+
68
+ rot_y += (event.x - drag_from[0]) * DRAG_SENS
69
+ rot_x += (event.y - drag_from[1]) * DRAG_SENS
70
+ drag_from[0] = event.x
71
+ drag_from[1] = event.y
72
+ end
73
+
74
+ # === Per-frame update ===
75
+
76
+ update do |dt|
77
+ unless drag_from
78
+ rot_x += AUTO_ROT_X * dt
79
+ rot_y += AUTO_ROT_Y * dt
80
+ end
81
+ end
82
+
83
+ # === Render ===
84
+
85
+ CX = WIDTH / 2
86
+ CY = HEIGHT / 2
87
+
88
+ # Per-vertex color is derived from projected depth so the polylines
89
+ # brighten as they wrap toward the camera and dim into navy on the far
90
+ # side. `Polyline` interpolates the colors along the path.
91
+ def shade(z)
92
+ t = ((z + 1.0) * 0.5).clamp(0.0, 1.0) # z in [-1, 1] → t in [0, 1]
93
+ [0.30 + 0.65 * t, 0.55 + 0.40 * t, 0.85 + 0.15 * t, 0.30 + 0.70 * t]
94
+ end
95
+
96
+ render do
97
+ cx_a = Math.cos(rot_x); sx_a = Math.sin(rot_x)
98
+ cy_a = Math.cos(rot_y); sy_a = Math.sin(rot_y)
99
+
100
+ # Project every sphere vertex once.
101
+ proj = SPHERE.map do |v|
102
+ x, y, z = v
103
+ y2 = y * cx_a - z * sx_a
104
+ z2 = y * sx_a + z * cx_a
105
+ x3 = x * cy_a + z2 * sy_a
106
+ z3 = -x * sy_a + z2 * cy_a
107
+ f = CAMERA / (CAMERA - z3)
108
+ [CX + x3 * RADIUS * f, CY + y2 * RADIUS * f, z3]
109
+ end
110
+
111
+ # Latitude rings — closed polylines around each row.
112
+ N_LAT.times do |i|
113
+ pts = []
114
+ colors = []
115
+ N_LON.times do |j|
116
+ p = proj[i * N_LON + j]
117
+ pts << [p[0], p[1]]
118
+ colors << shade(p[2])
119
+ end
120
+ Polyline.render(points: pts, color: colors, stroke_width: 1.5, closed: true)
121
+ end
122
+
123
+ # Longitude arcs — each runs from the north pole down through one
124
+ # column of lat vertices to the south pole.
125
+ N_LON.times do |j|
126
+ pts = [[proj[NORTH][0], proj[NORTH][1]]]
127
+ colors = [shade(proj[NORTH][2])]
128
+ N_LAT.times do |i|
129
+ p = proj[i * N_LON + j]
130
+ pts << [p[0], p[1]]
131
+ colors << shade(p[2])
132
+ end
133
+ pts << [proj[SOUTH][0], proj[SOUTH][1]]
134
+ colors << shade(proj[SOUTH][2])
135
+ Polyline.render(points: pts, color: colors, stroke_width: 1.5)
136
+ end
137
+ end
138
+
139
+ show
@@ -0,0 +1,324 @@
1
+ // audio.c
2
+ //
3
+ // SDL_mixer wrappers + Ruby2D::Ext bindings for audio. The Audio Ruby class
4
+ // (lib/ruby2d/audio.rb) holds an opaque @ext_audio handle returned by
5
+ // Ext.audio_load and passes it back to the other Ext.audio_* methods.
6
+
7
+ #include "ruby2d.h"
8
+
9
+ R2D_DEFINE_DATA_TYPE(R2D_Audio);
10
+
11
+ // Mixer device — created once in R2D_Init, used by audio bindings.
12
+ static MIX_Mixer *r2d_mixer = NULL;
13
+
14
+ void R2D_SetMixer(MIX_Mixer *mixer) { r2d_mixer = mixer; }
15
+ MIX_Mixer *R2D_GetMixer(void) { return r2d_mixer; }
16
+
17
+
18
+ /*
19
+ * Lazily initialize SDL_mixer and open the default playback device. Separated
20
+ * from R2D_Init so a machine with no/blocked audio device can still open a
21
+ * graphics window — only actual audio use triggers (and can fail) here.
22
+ * Idempotent: returns true immediately once a mixer exists.
23
+ */
24
+ bool R2D_InitAudio() {
25
+ if (r2d_mixer) return true;
26
+
27
+ // Ensure SDL's subsystems (incl. the audio subsystem) are up first.
28
+ if (!R2D_Init()) return false;
29
+
30
+ // Initialize SDL_mixer (SDL3 style: returns true on success)
31
+ if (!MIX_Init()) {
32
+ R2D_Error("MIX_Init", "%s", SDL_GetError());
33
+ return false;
34
+ }
35
+
36
+ // Open the default playback device (SDL3)
37
+ MIX_Mixer *mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, NULL);
38
+ if (!mixer) {
39
+ R2D_Error("MIX_CreateMixerDevice", "%s", SDL_GetError());
40
+ return false;
41
+ }
42
+ r2d_mixer = mixer;
43
+ return true;
44
+ }
45
+
46
+
47
+ // Clamp a gain value to the SDL-accepted [0.0, 1.0] range.
48
+ static inline float clamp01(float v) {
49
+ if (v < 0.0f) return 0.0f;
50
+ if (v > 1.0f) return 1.0f;
51
+ return v;
52
+ }
53
+
54
+
55
+ /*
56
+ * Ruby2D::Ext.audio_load(path) → opaque handle (or raises on failure)
57
+ */
58
+ R_VAL ruby2d_ext_audio_load(RUBY2D_METHOD_ARGS_VARIADIC) {
59
+ RUBY2D_EXTRACT_VARIADIC;
60
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_load expects 1 arg (path), got %d", (int)argc);
61
+
62
+ // Open the mixer device lazily if an Audio object is the first thing created.
63
+ // R2D_InitAudio is idempotent; it fails only when no playback device exists.
64
+ if (!R2D_InitAudio()) r_error("Failed to initialize audio: %s", SDL_GetError());
65
+
66
+ const char *path = RSTRING_PTR(argv[0]);
67
+
68
+ if (!R2D_FileExists(path)) {
69
+ r_error("Audio file `%s` not found", path);
70
+ return R_NIL;
71
+ }
72
+
73
+ R2D_Audio *aud = ALLOC(R2D_Audio);
74
+
75
+ // On failure, raise rather than returning nil: the Audio object would
76
+ // otherwise store a nil handle and segfault on the first play/pause/etc.
77
+ // when the binding unwraps it.
78
+ MIX_Audio *mix_audio = MIX_LoadAudio(r2d_mixer, path, false);
79
+ if (!mix_audio) {
80
+ xfree(aud);
81
+ r_error("Failed to load audio `%s`: %s", path, SDL_GetError());
82
+ return R_NIL;
83
+ }
84
+
85
+ MIX_Track *mix_track = MIX_CreateTrack(r2d_mixer);
86
+ if (!mix_track) {
87
+ MIX_DestroyAudio(mix_audio);
88
+ xfree(aud);
89
+ r_error("Failed to load audio `%s`: %s", path, SDL_GetError());
90
+ return R_NIL;
91
+ }
92
+
93
+ aud->mix_audio = mix_audio;
94
+ aud->mix_track = mix_track;
95
+
96
+ return r_wrap_struct(R2D_Audio, aud);
97
+ }
98
+
99
+
100
+ /*
101
+ * Ruby2D::Ext.audio_play(handle, loop)
102
+ */
103
+ R_VAL ruby2d_ext_audio_play(RUBY2D_METHOD_ARGS_VARIADIC) {
104
+ RUBY2D_EXTRACT_VARIADIC;
105
+ if (argc != 2) r_raise("Ruby2D::Ext.audio_play expects 2 args, got %d", (int)argc);
106
+
107
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
108
+
109
+ // Assign input to this track before playing (required in SDL3_mixer)
110
+ if (!MIX_SetTrackAudio(aud->mix_track, aud->mix_audio)) {
111
+ R2D_Error("MIX_SetTrackAudio", "%s", SDL_GetError());
112
+ }
113
+
114
+ // The loop count must be passed as a play option: MIX_PlayTrack's second arg
115
+ // is an SDL_PropertiesID, not a loop count, and MIX_SetTrackLoops has no
116
+ // effect on a stopped track. -1 loops forever, 0 plays once. A failed
117
+ // property set degrades to play-once (props == 0 → default loops).
118
+ SDL_PropertiesID props = SDL_CreateProperties();
119
+ if (props) {
120
+ SDL_SetNumberProperty(props, MIX_PROP_PLAY_LOOPS_NUMBER, r_test(argv[1]) ? -1 : 0);
121
+ }
122
+ if (!MIX_PlayTrack(aud->mix_track, props)) {
123
+ R2D_Error("MIX_PlayTrack", "%s", SDL_GetError());
124
+ }
125
+ SDL_DestroyProperties(props);
126
+
127
+ return R_TRUE;
128
+ }
129
+
130
+
131
+ /*
132
+ * Ruby2D::Ext.audio_pause(handle)
133
+ */
134
+ R_VAL ruby2d_ext_audio_pause(RUBY2D_METHOD_ARGS_VARIADIC) {
135
+ RUBY2D_EXTRACT_VARIADIC;
136
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_pause expects 1 arg, got %d", (int)argc);
137
+
138
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
139
+
140
+ if (!MIX_PauseTrack(aud->mix_track)) {
141
+ R2D_Error("MIX_PauseTrack", "%s", SDL_GetError());
142
+ }
143
+
144
+ return R_TRUE;
145
+ }
146
+
147
+
148
+ /*
149
+ * Ruby2D::Ext.audio_resume(handle)
150
+ */
151
+ R_VAL ruby2d_ext_audio_resume(RUBY2D_METHOD_ARGS_VARIADIC) {
152
+ RUBY2D_EXTRACT_VARIADIC;
153
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_resume expects 1 arg, got %d", (int)argc);
154
+
155
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
156
+
157
+ if (!MIX_ResumeTrack(aud->mix_track)) {
158
+ R2D_Error("MIX_ResumeTrack", "%s", SDL_GetError());
159
+ }
160
+
161
+ return R_TRUE;
162
+ }
163
+
164
+
165
+ /*
166
+ * Ruby2D::Ext.audio_stop(handle, ms_fade)
167
+ */
168
+ R_VAL ruby2d_ext_audio_stop(RUBY2D_METHOD_ARGS_VARIADIC) {
169
+ RUBY2D_EXTRACT_VARIADIC;
170
+ if (argc != 2) r_raise("Ruby2D::Ext.audio_stop expects 2 args, got %d", (int)argc);
171
+
172
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
173
+
174
+ int fade_ms = NUM2INT(argv[1]);
175
+ if (fade_ms < 0) fade_ms = 0;
176
+
177
+ if (!MIX_StopTrack(aud->mix_track, MIX_TrackMSToFrames(aud->mix_track, fade_ms))) {
178
+ R2D_Error("MIX_StopTrack", "%s", SDL_GetError());
179
+ }
180
+
181
+ return R_TRUE;
182
+ }
183
+
184
+
185
+ /*
186
+ * Ruby2D::Ext.audio_set_loop(handle, loop)
187
+ */
188
+ R_VAL ruby2d_ext_audio_set_loop(RUBY2D_METHOD_ARGS_VARIADIC) {
189
+ RUBY2D_EXTRACT_VARIADIC;
190
+ if (argc != 2) r_raise("Ruby2D::Ext.audio_set_loop expects 2 args, got %d", (int)argc);
191
+
192
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
193
+ MIX_SetTrackLoops(aud->mix_track, r_test(argv[1]) ? -1 : 0);
194
+
195
+ return argv[1];
196
+ }
197
+
198
+
199
+ /*
200
+ * Ruby2D::Ext.audio_length(handle) → duration in seconds, 0 if unknown/infinite
201
+ */
202
+ R_VAL ruby2d_ext_audio_length(RUBY2D_METHOD_ARGS_VARIADIC) {
203
+ RUBY2D_EXTRACT_VARIADIC;
204
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_length expects 1 arg, got %d", (int)argc);
205
+
206
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
207
+
208
+ Sint64 frames = MIX_GetAudioDuration(aud->mix_audio);
209
+ if (frames == MIX_DURATION_UNKNOWN || frames == MIX_DURATION_INFINITE) {
210
+ return INT2NUM(0);
211
+ }
212
+
213
+ Sint64 ms = MIX_AudioFramesToMS(aud->mix_audio, frames);
214
+ // Round to nearest second instead of truncating
215
+ int seconds = (int)((ms + 500) / 1000);
216
+
217
+ return INT2NUM(seconds);
218
+ }
219
+
220
+
221
+ /*
222
+ * Ruby2D::Ext.audio_get_volume(handle) → 0.0..1.0
223
+ */
224
+ R_VAL ruby2d_ext_audio_get_volume(RUBY2D_METHOD_ARGS_VARIADIC) {
225
+ RUBY2D_EXTRACT_VARIADIC;
226
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_get_volume expects 1 arg, got %d", (int)argc);
227
+
228
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
229
+
230
+ float gain = clamp01(MIX_GetTrackGain(aud->mix_track)); // SDL gain, 0.0 .. 1.0
231
+
232
+ return DBL2NUM(gain);
233
+ }
234
+
235
+
236
+ /*
237
+ * Ruby2D::Ext.audio_set_volume(handle, volume) — volume 0.0..1.0
238
+ */
239
+ R_VAL ruby2d_ext_audio_set_volume(RUBY2D_METHOD_ARGS_VARIADIC) {
240
+ RUBY2D_EXTRACT_VARIADIC;
241
+ if (argc != 2) r_raise("Ruby2D::Ext.audio_set_volume expects 2 args, got %d", (int)argc);
242
+
243
+ R2D_Audio *aud = r_unwrap_struct(argv[0], R2D_Audio);
244
+
245
+ float gain = clamp01((float) NUM2DBL(argv[1]));
246
+
247
+ if (!MIX_SetTrackGain(aud->mix_track, gain)) {
248
+ R2D_Error("MIX_SetTrackGain", "%s", SDL_GetError());
249
+ }
250
+
251
+ return R_NIL;
252
+ }
253
+
254
+
255
+ /*
256
+ * Ruby2D::Ext.audio_get_mixer_volume → 0.0..1.0
257
+ */
258
+ R_VAL ruby2d_ext_audio_get_mixer_volume(RUBY2D_METHOD_ARGS_VARIADIC) {
259
+ RUBY2D_EXTRACT_VARIADIC;
260
+ (void)argc; (void)argv;
261
+
262
+ // Open the mixer device lazily. R2D_InitAudio is idempotent.
263
+ if (!R2D_InitAudio()) r_error("Failed to initialize audio: %s", SDL_GetError());
264
+
265
+ float gain = clamp01(MIX_GetMixerGain(r2d_mixer));
266
+
267
+ return DBL2NUM(gain);
268
+ }
269
+
270
+
271
+ /*
272
+ * Ruby2D::Ext.audio_set_mixer_volume(volume) — volume 0.0..1.0
273
+ */
274
+ R_VAL ruby2d_ext_audio_set_mixer_volume(RUBY2D_METHOD_ARGS_VARIADIC) {
275
+ RUBY2D_EXTRACT_VARIADIC;
276
+ if (argc != 1) r_raise("Ruby2D::Ext.audio_set_mixer_volume expects 1 arg, got %d", (int)argc);
277
+
278
+ // Open the mixer device lazily. R2D_InitAudio is idempotent.
279
+ if (!R2D_InitAudio()) r_error("Failed to initialize audio: %s", SDL_GetError());
280
+
281
+ float gain = clamp01((float) NUM2DBL(argv[0]));
282
+
283
+ if (!MIX_SetMixerGain(r2d_mixer, gain)) {
284
+ R2D_Error("MIX_SetMixerGain", "%s", SDL_GetError());
285
+ }
286
+
287
+ return R_NIL;
288
+ }
289
+
290
+
291
+ /*
292
+ * Initialize — register Ext audio bindings.
293
+ */
294
+ void R2D_Audio_Init() {
295
+ r_define_class_method(ruby2d_ext_module, "audio_load", ruby2d_ext_audio_load, r_args_variadic);
296
+ r_define_class_method(ruby2d_ext_module, "audio_play", ruby2d_ext_audio_play, r_args_variadic);
297
+ r_define_class_method(ruby2d_ext_module, "audio_pause", ruby2d_ext_audio_pause, r_args_variadic);
298
+ r_define_class_method(ruby2d_ext_module, "audio_resume", ruby2d_ext_audio_resume, r_args_variadic);
299
+ r_define_class_method(ruby2d_ext_module, "audio_stop", ruby2d_ext_audio_stop, r_args_variadic);
300
+ r_define_class_method(ruby2d_ext_module, "audio_set_loop", ruby2d_ext_audio_set_loop, r_args_variadic);
301
+ r_define_class_method(ruby2d_ext_module, "audio_length", ruby2d_ext_audio_length, r_args_variadic);
302
+ r_define_class_method(ruby2d_ext_module, "audio_get_volume", ruby2d_ext_audio_get_volume, r_args_variadic);
303
+ r_define_class_method(ruby2d_ext_module, "audio_set_volume", ruby2d_ext_audio_set_volume, r_args_variadic);
304
+ r_define_class_method(ruby2d_ext_module, "audio_get_mixer_volume", ruby2d_ext_audio_get_mixer_volume, r_args_variadic);
305
+ r_define_class_method(ruby2d_ext_module, "audio_set_mixer_volume", ruby2d_ext_audio_set_mixer_volume, r_args_variadic);
306
+ }
307
+
308
+
309
+ /*
310
+ * Free the audio
311
+ */
312
+ static void R2D_Audio_free(void *p) {
313
+ if (!p) return;
314
+ R2D_Audio *aud = (R2D_Audio *)p;
315
+ if (aud->mix_track) {
316
+ MIX_DestroyTrack(aud->mix_track);
317
+ aud->mix_track = NULL;
318
+ }
319
+ if (aud->mix_audio) {
320
+ MIX_DestroyAudio(aud->mix_audio);
321
+ aud->mix_audio = NULL;
322
+ }
323
+ xfree(aud);
324
+ }