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
@@ -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
+ }