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,254 @@
1
+ # Double pendulum
2
+ # Two arms swinging from a fixed pivot, tracing a cycling rainbow trail.
3
+ #
4
+ # Governed by the Lagrangian equations of motion and integrated with RK4
5
+ # for stability. Grab the end bob with the mouse to pose the arms, then
6
+ # let go to set it swinging — flick as you release to throw it with spin.
7
+ # Press `r` for a fresh random drop.
8
+
9
+ require 'ruby2d'
10
+
11
+ # === Tunables ===
12
+
13
+ WIDTH = 800 # window width in pixels
14
+ HEIGHT = 600 # window height in pixels
15
+ PIVOT_X = WIDTH / 2.0 # pivot x position
16
+ PIVOT_Y = HEIGHT / 2.0 # pivot y, centered so the whole swing stays in view
17
+ L1 = 140.0 # length of arm 1 in pixels
18
+ L2 = 140.0 # length of arm 2 in pixels
19
+ REACH_MAX = L1 + L2 # farthest the end bob can reach from the pivot
20
+ REACH_MIN = (L1 - L2).abs # closest the end bob can reach to the pivot
21
+ M1 = 1.0 # mass of bob 1
22
+ M2 = 1.0 # mass of bob 2
23
+ G = 1500.0 # gravitational acceleration (px/sec²)
24
+ SUB_STEPS = 8 # RK4 sub-steps per frame for stability
25
+ TRAIL_HUE_RATE = 0.15 # rate of rainbow color cycling (cycles/sec)
26
+ VEL_SMOOTH = 30.0 # responsiveness of the throw velocity estimate (1/sec)
27
+ THROW_MAX = 15.0 # cap on release angular velocity (rad/sec)
28
+
29
+ # === Window ===
30
+
31
+ set title: 'Ruby 2D ▸ Examples ▸ Double pendulum', width: WIDTH, height: HEIGHT
32
+ set close_on_esc: true
33
+
34
+ BG = [0.04, 0.04, 0.08, 1]
35
+
36
+ # === Helpers ===
37
+
38
+ def deriv(t1, w1, t2, w2)
39
+ s = Math.sin(t1 - t2)
40
+ c = Math.cos(t1 - t2)
41
+ den = 2 * M1 + M2 - M2 * Math.cos(2 * t1 - 2 * t2)
42
+
43
+ a1 = (-G * (2 * M1 + M2) * Math.sin(t1) -
44
+ M2 * G * Math.sin(t1 - 2 * t2) -
45
+ 2 * s * M2 * (w2 * w2 * L2 + w1 * w1 * L1 * c)) / (L1 * den)
46
+
47
+ a2 = (2 * s * (w1 * w1 * L1 * (M1 + M2) +
48
+ G * (M1 + M2) * Math.cos(t1) +
49
+ w2 * w2 * L2 * M2 * c)) / (L2 * den)
50
+
51
+ [w1, a1, w2, a2]
52
+ end
53
+
54
+ def rk4_step(t1, w1, t2, w2, dt)
55
+ d1 = deriv(t1, w1, t2, w2)
56
+ d2 = deriv(t1 + 0.5 * dt * d1[0], w1 + 0.5 * dt * d1[1],
57
+ t2 + 0.5 * dt * d1[2], w2 + 0.5 * dt * d1[3])
58
+ d3 = deriv(t1 + 0.5 * dt * d2[0], w1 + 0.5 * dt * d2[1],
59
+ t2 + 0.5 * dt * d2[2], w2 + 0.5 * dt * d2[3])
60
+ d4 = deriv(t1 + dt * d3[0], w1 + dt * d3[1],
61
+ t2 + dt * d3[2], w2 + dt * d3[3])
62
+ [
63
+ t1 + dt / 6.0 * (d1[0] + 2 * d2[0] + 2 * d3[0] + d4[0]),
64
+ w1 + dt / 6.0 * (d1[1] + 2 * d2[1] + 2 * d3[1] + d4[1]),
65
+ t2 + dt / 6.0 * (d1[2] + 2 * d2[2] + 2 * d3[2] + d4[2]),
66
+ w2 + dt / 6.0 * (d1[3] + 2 * d2[3] + 2 * d3[3] + d4[3])
67
+ ]
68
+ end
69
+
70
+ def hsv_rgb(h, s, v)
71
+ i = (h * 6).floor
72
+ f = h * 6 - i
73
+ p = v * (1 - s)
74
+ q = v * (1 - f * s)
75
+ tt = v * (1 - (1 - f) * s)
76
+ case i % 6
77
+ when 0 then [v, tt, p]
78
+ when 1 then [q, v, p]
79
+ when 2 then [p, v, tt]
80
+ when 3 then [p, q, v]
81
+ when 4 then [tt, p, v]
82
+ else [v, p, q]
83
+ end
84
+ end
85
+
86
+ # Wrap an angle difference into [-PI, PI] so continuity checks and
87
+ # velocity estimates ignore full-turn wraparound.
88
+ def wrap_pi(a)
89
+ ((a + Math::PI) % (2 * Math::PI)) - Math::PI
90
+ end
91
+
92
+ # Inverse kinematics: arm angles that place the end bob at (px, py). A
93
+ # two-link arm can reach a target two ways (elbow either side); we return
94
+ # whichever bend stays closest to the reference pose, so grabbing and
95
+ # dragging never snap the arm through a flip. Angles follow the sim's
96
+ # convention — measured from straight down, with x = sin, y = cos.
97
+ def solve_ik(px, py, ref_t1, ref_t2)
98
+ dx = px - PIVOT_X
99
+ dy = py - PIVOT_Y
100
+ return [ref_t1, ref_t2] if dx.zero? && dy.zero?
101
+
102
+ d = Math.hypot(dx, dy).clamp(REACH_MIN + 0.001, REACH_MAX - 0.001)
103
+ phi = Math.atan2(dx, dy) # pivot → target heading
104
+ cos_bend = ((d * d - L1 * L1 - L2 * L2) / (2 * L1 * L2)).clamp(-1.0, 1.0)
105
+ bend = Math.atan2(Math.sqrt(1 - cos_bend * cos_bend), cos_bend) # avoid acos
106
+
107
+ best = nil
108
+ best_cost = nil
109
+ [bend, -bend].each do |b|
110
+ a1 = phi - Math.atan2(L2 * Math.sin(b), L1 + L2 * Math.cos(b))
111
+ a2 = a1 + b
112
+ cost = wrap_pi(a1 - ref_t1).abs + wrap_pi(a2 - ref_t2).abs
113
+ if best_cost.nil? || cost < best_cost
114
+ best = [a1, a2]
115
+ best_cost = cost
116
+ end
117
+ end
118
+ best
119
+ end
120
+
121
+ # === Mutable state ===
122
+
123
+ # Arm angles (from straight down) and angular velocities; `reset` seeds
124
+ # the angles randomly below. While `dragging`, the sim is paused and the
125
+ # end bob tracks the cursor.
126
+ t1 = 0.0
127
+ w1 = 0.0
128
+ t2 = 0.0
129
+ w2 = 0.0
130
+ hue = 0.0
131
+ dragging = false
132
+ mouse_x = PIVOT_X
133
+ mouse_y = PIVOT_Y
134
+
135
+ # === Renderables ===
136
+
137
+ canvas = Canvas.new(x: 0, y: 0, width: WIDTH, height: HEIGHT, fill: BG)
138
+
139
+ arm1 = Line.new(x1: PIVOT_X, y1: PIVOT_Y, x2: PIVOT_X, y2: PIVOT_Y,
140
+ stroke_width: 3, color: [0.85, 0.85, 0.95, 1], z: 5)
141
+ arm2 = Line.new(x1: PIVOT_X, y1: PIVOT_Y, x2: PIVOT_X, y2: PIVOT_Y,
142
+ stroke_width: 3, color: [0.85, 0.85, 0.95, 1], z: 5)
143
+ grab_ring = Circle.new(x: PIVOT_X, y: PIVOT_Y, radius: 18,
144
+ color: [0.6, 0.9, 1.0, 0.4], z: 4, visible: false)
145
+ bob1 = Circle.new(x: PIVOT_X, y: PIVOT_Y, radius: 8,
146
+ color: [0.95, 0.6, 0.3, 1], z: 6)
147
+ bob2 = Circle.new(x: PIVOT_X, y: PIVOT_Y, radius: 10,
148
+ color: [0.4, 0.85, 0.95, 1], z: 6)
149
+ Circle.new(x: PIVOT_X, y: PIVOT_Y, radius: 4,
150
+ color: [0.7, 0.7, 0.8, 1], z: 7)
151
+
152
+ # === Reset ===
153
+
154
+ # Release the pendulum from rest at a random position. Both arms start
155
+ # in the upper hemisphere ([PI/2, 3PI/2] from straight down) so there is
156
+ # always potential energy to unleash — a near-straight-down start would
157
+ # barely move.
158
+ reset = lambda do
159
+ t1 = Math::PI / 2 + rand * Math::PI
160
+ t2 = Math::PI / 2 + rand * Math::PI
161
+ w1 = 0.0
162
+ w2 = 0.0
163
+ dragging = false
164
+ grab_ring.hide
165
+ canvas.clear
166
+ end
167
+ reset.call
168
+
169
+ # === Input ===
170
+
171
+ # Grab the end bob and snap it to the cursor. The sim pauses until
172
+ # release; `update` then tracks the cursor and estimates throw velocity.
173
+ on mouse_down: :left do |event|
174
+ mouse_x = event.x
175
+ mouse_y = event.y
176
+ t1, t2 = solve_ik(mouse_x, mouse_y, t1, t2)
177
+ w1 = 0.0
178
+ w2 = 0.0
179
+ dragging = true
180
+ grab_ring.show
181
+ end
182
+
183
+ on :mouse_move do |event|
184
+ mouse_x = event.x
185
+ mouse_y = event.y
186
+ end
187
+
188
+ # Release: keep the drag-estimated angular velocity (capped) as the
189
+ # throw, so a flick imparts spin and letting go at rest just drops it.
190
+ on :mouse_up do
191
+ next unless dragging
192
+ dragging = false
193
+ w1 = w1.clamp(-THROW_MAX, THROW_MAX)
194
+ w2 = w2.clamp(-THROW_MAX, THROW_MAX)
195
+ grab_ring.hide
196
+ end
197
+
198
+ on(key_down: :r) { reset.call }
199
+
200
+ # === Update ===
201
+
202
+ update do |dt|
203
+ if dragging
204
+ # Follow the cursor via IK; estimate angular velocity for the throw
205
+ # by smoothing the per-frame change in each arm's angle.
206
+ target = solve_ik(mouse_x, mouse_y, t1, t2)
207
+ if dt > 0
208
+ blend = 1 - Math.exp(-VEL_SMOOTH * dt)
209
+ w1 += (wrap_pi(target[0] - t1) / dt - w1) * blend
210
+ w2 += (wrap_pi(target[1] - t2) / dt - w2) * blend
211
+ end
212
+ t1, t2 = target
213
+ else
214
+ step_dt = dt / SUB_STEPS
215
+
216
+ prev_x = PIVOT_X + L1 * Math.sin(t1) + L2 * Math.sin(t2)
217
+ prev_y = PIVOT_Y + L1 * Math.cos(t1) + L2 * Math.cos(t2)
218
+
219
+ SUB_STEPS.times do
220
+ t1, w1, t2, w2 = rk4_step(t1, w1, t2, w2, step_dt)
221
+
222
+ x = PIVOT_X + L1 * Math.sin(t1) + L2 * Math.sin(t2)
223
+ y = PIVOT_Y + L1 * Math.cos(t1) + L2 * Math.cos(t2)
224
+
225
+ hue = (hue + TRAIL_HUE_RATE * step_dt) % 1.0
226
+ r, g, b = hsv_rgb(hue, 0.85, 1.0)
227
+ canvas.draw_line(
228
+ x1: prev_x, y1: prev_y, x2: x, y2: y,
229
+ stroke_width: 1.5, color: [r, g, b, 0.7]
230
+ )
231
+ prev_x = x
232
+ prev_y = y
233
+ end
234
+ end
235
+
236
+ j1x = PIVOT_X + L1 * Math.sin(t1)
237
+ j1y = PIVOT_Y + L1 * Math.cos(t1)
238
+ j2x = j1x + L2 * Math.sin(t2)
239
+ j2y = j1y + L2 * Math.cos(t2)
240
+ arm1.x2 = j1x
241
+ arm1.y2 = j1y
242
+ arm2.x1 = j1x
243
+ arm2.y1 = j1y
244
+ arm2.x2 = j2x
245
+ arm2.y2 = j2y
246
+ bob1.x = j1x
247
+ bob1.y = j1y
248
+ bob2.x = j2x
249
+ bob2.y = j2y
250
+ grab_ring.x = j2x
251
+ grab_ring.y = j2y
252
+ end
253
+
254
+ show
@@ -0,0 +1,291 @@
1
+ # Falling sand
2
+ # A cellular-automaton sandbox where sand piles, water flows, and stone holds.
3
+ #
4
+ # Click and drag in the world to drop the selected material. Click
5
+ # swatches in the toolbar to switch materials, or use 1/2/3 keys. Press
6
+ # `r` to clear the world. Under the hood it uses the classic
7
+ # sandbox-engine tricks: the world is one flat row-major array, rows
8
+ # where nothing moved are put to sleep, and only cells that changed get
9
+ # repainted — so a settled world costs almost nothing to run.
10
+
11
+ require 'ruby2d'
12
+
13
+ # === Tunables ===
14
+
15
+ WIDTH = 800 # window width in pixels
16
+ HEIGHT = 600 # window height in pixels
17
+ TOOLBAR_H = 60 # toolbar height in pixels
18
+ CELL = 4 # cell size in pixels (smaller = finer simulation)
19
+ BRUSH_RADIUS = 3 # cells around the cursor that get filled
20
+ SIM_RATE = 120 # simulation steps per second
21
+
22
+ COLS = WIDTH / CELL
23
+ ROWS = (HEIGHT - TOOLBAR_H) / CELL
24
+
25
+ EMPTY = 0
26
+ SAND = 1
27
+ WATER = 2
28
+ STONE = 3
29
+
30
+ COLORS = {
31
+ EMPTY => [0.04, 0.05, 0.08, 1],
32
+ SAND => [0.95, 0.78, 0.42, 1],
33
+ WATER => [0.30, 0.55, 0.90, 1],
34
+ STONE => [0.50, 0.50, 0.55, 1]
35
+ }
36
+
37
+ # === Window ===
38
+
39
+ set title: 'Ruby 2D ▸ Examples ▸ Falling sand', width: WIDTH, height: HEIGHT
40
+ set close_on_esc: true
41
+
42
+ # === Toolbar ===
43
+
44
+ toolbar = Canvas.new(
45
+ x: 0, y: 0, width: WIDTH, height: TOOLBAR_H,
46
+ fill: [0.12, 0.12, 0.18, 1], z: 10
47
+ )
48
+
49
+ # World canvas (below the toolbar)
50
+ canvas = Canvas.new(
51
+ x: 0, y: TOOLBAR_H, width: WIDTH, height: HEIGHT - TOOLBAR_H,
52
+ fill: COLORS[EMPTY]
53
+ )
54
+
55
+ MATERIALS = [SAND, WATER, STONE]
56
+ SWATCH_X0 = 12
57
+ SWATCH_Y = 12
58
+ SWATCH_SZ = 36
59
+ SWATCH_GAP = 8
60
+
61
+ def draw_toolbar(toolbar, current_material)
62
+ toolbar.clear
63
+ toolbar.fill_rectangle(
64
+ x: 0, y: TOOLBAR_H - 3, width: WIDTH, height: 3,
65
+ color: [0.3, 0.3, 0.4, 1]
66
+ )
67
+ MATERIALS.each_with_index do |mat, i|
68
+ sx = SWATCH_X0 + i * (SWATCH_SZ + SWATCH_GAP)
69
+ border = mat == current_material ? [1.0, 1.0, 1.0, 1.0] : [0.3, 0.3, 0.4, 1]
70
+ toolbar.fill_rectangle(
71
+ x: sx - 3, y: SWATCH_Y - 3,
72
+ width: SWATCH_SZ + 6, height: SWATCH_SZ + 6, color: border
73
+ )
74
+ toolbar.fill_rectangle(
75
+ x: sx, y: SWATCH_Y, width: SWATCH_SZ, height: SWATCH_SZ,
76
+ color: COLORS[mat]
77
+ )
78
+ end
79
+ end
80
+
81
+ # Stamp a disc of material around the cursor, then wake the affected rows
82
+ # (plus one row either side) so the sleeping sim picks the new cells up.
83
+ def paint(grid, active, dirty, mx, my, mat)
84
+ cx = mx / CELL
85
+ cy = my / CELL
86
+ (-BRUSH_RADIUS..BRUSH_RADIUS).each do |dy|
87
+ (-BRUSH_RADIUS..BRUSH_RADIUS).each do |dx|
88
+ next if dx * dx + dy * dy > BRUSH_RADIUS * BRUSH_RADIUS
89
+ r = cy + dy
90
+ c = cx + dx
91
+ next unless r.between?(0, ROWS - 1) && c.between?(0, COLS - 1)
92
+ i = r * COLS + c
93
+ grid[i] = mat
94
+ dirty << i
95
+ end
96
+ end
97
+ ((cy - BRUSH_RADIUS - 1)..(cy + BRUSH_RADIUS + 1)).each do |r|
98
+ active[r] = true if r.between?(0, ROWS - 1)
99
+ end
100
+ end
101
+
102
+ # One simulation step, bottom-up. This is the hot loop — it can run SIM_RATE
103
+ # times a second — so it breaks with the usual Ruby style on purpose: `while`
104
+ # instead of block iterators (no block dispatch per cell) and nothing
105
+ # allocated inside. Rows are visited only if something moved in or next to
106
+ # them last step (`active`); every cell that changes lands in `dirty` so the
107
+ # render pass repaints just those.
108
+ def step(grid, active, next_active, dirty)
109
+ next_active.fill(false)
110
+ r = ROWS - 2
111
+ while r >= 0
112
+ unless active[r]
113
+ r -= 1
114
+ next
115
+ end
116
+ row_moved = false
117
+ base = r * COLS
118
+ # Scan alternating directions at random so piles don't lean one way
119
+ if rand < 0.5
120
+ c = 0; last_c = COLS; c_step = 1
121
+ else
122
+ c = COLS - 1; last_c = -1; c_step = -1
123
+ end
124
+ while c != last_c
125
+ i = base + c
126
+ cell = grid[i]
127
+ if cell == SAND || cell == WATER
128
+ bi = i + COLS
129
+ below = grid[bi]
130
+
131
+ # Fall straight down into empty or (sand only) sink through water
132
+ if below == EMPTY || (cell == SAND && below == WATER)
133
+ grid[bi] = cell
134
+ grid[i] = below
135
+ dirty << i << bi
136
+ row_moved = true
137
+ else
138
+ # Try sliding diagonally down, in a random order
139
+ d = rand < 0.5 ? -1 : 1
140
+ moved = false
141
+ tries = 0
142
+ while tries < 2
143
+ nc = c + d
144
+ if nc >= 0 && nc < COLS
145
+ target = grid[bi + d]
146
+ if target == EMPTY || (cell == SAND && target == WATER)
147
+ grid[bi + d] = cell
148
+ grid[i] = target
149
+ dirty << i << (bi + d)
150
+ moved = true
151
+ row_moved = true
152
+ break
153
+ end
154
+ end
155
+ d = -d
156
+ tries += 1
157
+ end
158
+
159
+ # Water spreads horizontally if it can't fall
160
+ if !moved && cell == WATER
161
+ tries = 0
162
+ while tries < 2
163
+ nc = c + d
164
+ if nc >= 0 && nc < COLS && grid[base + nc] == EMPTY
165
+ grid[base + nc] = WATER
166
+ grid[i] = EMPTY
167
+ dirty << i << (base + nc)
168
+ row_moved = true
169
+ break
170
+ end
171
+ d = -d
172
+ tries += 1
173
+ end
174
+ end
175
+ end
176
+ end
177
+ c += c_step
178
+ end
179
+ # A move can unblock the row above and feed the arrivals' own row below
180
+ if row_moved
181
+ next_active[r] = true
182
+ next_active[r - 1] = true if r > 0
183
+ next_active[r + 1] = true
184
+ end
185
+ r -= 1
186
+ end
187
+ active.replace(next_active)
188
+ end
189
+
190
+ # === World state ===
191
+
192
+ # Flat row-major grids: cell (r, c) lives at index r * COLS + c
193
+ grid = Array.new(ROWS * COLS, EMPTY)
194
+ painted = Array.new(ROWS * COLS, EMPTY) # what's on the canvas, per cell
195
+ active = Array.new(ROWS, false) # rows the sim will visit this step
196
+ next_active = Array.new(ROWS, false)
197
+ dirty = [] # cell indices touched since last repaint
198
+
199
+ material = SAND
200
+ mouse_held = false
201
+ brush_x = -1
202
+ brush_y = -1
203
+ sim_accum = 0.0
204
+
205
+ # One rect batch per material (indexed by cell value), reused every frame —
206
+ # repainting via a few fill_rectangles calls instead of one fill_rectangle
207
+ # per cell keeps the per-call dispatch overhead off the hot path.
208
+ batches = Array.new(COLORS.length) { [] }
209
+
210
+ draw_toolbar(toolbar, material)
211
+
212
+ # Toolbar click hit areas — visual-less Buttons (nothing drawn) over the swatches
213
+ MATERIALS.each_with_index do |mat, i|
214
+ sx = SWATCH_X0 + i * (SWATCH_SZ + SWATCH_GAP)
215
+ Button.new(x: sx, y: SWATCH_Y, width: SWATCH_SZ, height: SWATCH_SZ, z: 11) do
216
+ material = mat
217
+ draw_toolbar(toolbar, material)
218
+ end
219
+ end
220
+
221
+ # === Input ===
222
+
223
+ on :mouse_down do |event|
224
+ next if event.y < TOOLBAR_H
225
+ mouse_held = true
226
+ brush_x = event.x
227
+ brush_y = event.y - TOOLBAR_H
228
+ end
229
+
230
+ on :mouse_up do
231
+ mouse_held = false
232
+ end
233
+
234
+ on :mouse_move do |event|
235
+ brush_x = event.x
236
+ brush_y = event.y - TOOLBAR_H
237
+ end
238
+
239
+ on :key_down do |event|
240
+ case event.key
241
+ when '1'
242
+ material = SAND
243
+ draw_toolbar(toolbar, material)
244
+ when '2'
245
+ material = WATER
246
+ draw_toolbar(toolbar, material)
247
+ when '3'
248
+ material = STONE
249
+ draw_toolbar(toolbar, material)
250
+ when 'r'
251
+ grid.fill(EMPTY)
252
+ painted.fill(EMPTY)
253
+ active.fill(false)
254
+ dirty.clear
255
+ canvas.clear
256
+ end
257
+ end
258
+
259
+ # === Per-frame update ===
260
+
261
+ update do |dt|
262
+ dt = [dt, 1.0 / 30].min # cap to bound sim catchup on lag spikes
263
+ paint(grid, active, dirty, brush_x, brush_y, material) if mouse_held && brush_y >= 0
264
+
265
+ sim_accum += SIM_RATE * dt
266
+ count = sim_accum.to_i
267
+ sim_accum -= count
268
+ count.times { step(grid, active, next_active, dirty) }
269
+
270
+ # Repaint only cells the sim or brush touched; `painted` skips duplicates
271
+ # and cells that ended a frame back where they started
272
+ k = 0
273
+ while k < dirty.length
274
+ i = dirty[k]
275
+ cell = grid[i]
276
+ if cell != painted[i]
277
+ painted[i] = cell
278
+ batches[cell] << [(i % COLS) * CELL, (i / COLS) * CELL, CELL, CELL]
279
+ end
280
+ k += 1
281
+ end
282
+ dirty.clear
283
+
284
+ batches.each_with_index do |rects, mat|
285
+ next if rects.empty?
286
+ canvas.fill_rectangles(rectangles: rects, color: COLORS[mat])
287
+ rects.clear
288
+ end
289
+ end
290
+
291
+ show
@@ -0,0 +1,110 @@
1
+ # Particle fireworks
2
+ # Click to launch rockets that arc upward and explode into fading sparks.
3
+ #
4
+ # Each launch fires from the bottom of the window, arcs, and bursts into
5
+ # colored sparks with short glowing trails. Press `r` to clear the sky.
6
+
7
+ require 'ruby2d'
8
+
9
+ # === Tunables ===
10
+
11
+ WIDTH = 800 # window width in pixels
12
+ HEIGHT = 600 # window height in pixels
13
+ GRAVITY = 432 # downward acceleration (px/sec²)
14
+ SPARKS = 70 # sparks emitted per rocket burst
15
+ SPARK_DRAG = 0.907 # spark velocity decay rate (per second)
16
+ AUTO_LAUNCH_RATE = 1.08 # average self-launches per second
17
+
18
+ # === Window ===
19
+
20
+ set title: 'Ruby 2D ▸ Examples ▸ Particle fireworks', width: WIDTH, height: HEIGHT, background: '#050816'
21
+ set close_on_esc: true
22
+
23
+ # === Game-object structs ===
24
+
25
+ Rocket = Struct.new(:x, :y, :vx, :vy, :target_y, :color, :shape)
26
+ Spark = Struct.new(:x, :y, :vx, :vy, :life, :color, :shape)
27
+
28
+ def random_color
29
+ [[1.0, 0.35, 0.35, 1], [1.0, 0.75, 0.2, 1], [0.3, 0.8, 1.0, 1],
30
+ [0.6, 0.5, 1.0, 1], [0.4, 1.0, 0.55, 1]].sample
31
+ end
32
+
33
+ def launch(rockets, x, y)
34
+ color = random_color
35
+ rockets << Rocket.new(
36
+ WIDTH / 2, HEIGHT - 10,
37
+ (x - WIDTH / 2) / 85.0 * 60, -480 - rand * 180, # px/sec
38
+ y, color,
39
+ Circle.new(x: WIDTH / 2, y: HEIGHT - 10, radius: 4, color: color)
40
+ )
41
+ end
42
+
43
+ # === Mutable state ===
44
+
45
+ rockets = []
46
+ sparks = []
47
+
48
+ # === Input ===
49
+
50
+ on :mouse_down do |event|
51
+ launch(rockets, event.x, event.y)
52
+ end
53
+
54
+ on key_down: :r do
55
+ rockets.each { |r| r.shape.remove }
56
+ sparks.each { |s| s.shape.remove }
57
+ rockets.clear
58
+ sparks.clear
59
+ end
60
+
61
+ # === Per-frame update ===
62
+
63
+ update do |dt|
64
+ if rand < AUTO_LAUNCH_RATE * dt
65
+ launch(rockets, rand(WIDTH), rand(90..260))
66
+ end
67
+
68
+ rockets.dup.each do |r|
69
+ r.x += r.vx * dt
70
+ r.y += r.vy * dt
71
+ r.vy += GRAVITY * 0.35 * dt # rockets feel lighter than sparks
72
+ r.shape.x = r.x
73
+ r.shape.y = r.y
74
+
75
+ next unless r.vy >= 0 || r.y <= r.target_y
76
+
77
+ r.shape.remove
78
+ rockets.delete(r)
79
+ SPARKS.times do
80
+ angle = rand * Math::PI * 2
81
+ speed = 72 + rand * 288 # px/sec
82
+ color = r.color.dup
83
+ sparks << Spark.new(
84
+ r.x, r.y, Math.cos(angle) * speed, Math.sin(angle) * speed,
85
+ 1.0, color, # life starts at 1.0 second
86
+ Circle.new(x: r.x, y: r.y, radius: 2 + rand * 2, color: color)
87
+ )
88
+ end
89
+ end
90
+
91
+ spark_drag = Math.exp(-SPARK_DRAG * dt)
92
+ sparks.dup.each do |s|
93
+ s.x += s.vx * dt
94
+ s.y += s.vy * dt
95
+ s.vy += GRAVITY * dt
96
+ s.vx *= spark_drag
97
+ s.vy *= spark_drag
98
+ s.life -= dt
99
+ s.shape.x = s.x
100
+ s.shape.y = s.y
101
+ s.shape.opacity = [s.life, 0].max
102
+
103
+ next unless s.life <= 0
104
+
105
+ s.shape.remove
106
+ sparks.delete(s)
107
+ end
108
+ end
109
+
110
+ show