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,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