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,297 @@
1
+ # Ruby2D::Polygon
2
+
3
+ module Ruby2D
4
+ # A closed polygon defined by N vertices (N >= 3), filled or stroked.
5
+ class Polygon
6
+ include Renderable
7
+
8
+ attr_accessor :rotate, :fill, :stroke_width
9
+ attr_reader :stroke_color
10
+ alias_method :stroke_colour, :stroke_color
11
+
12
+ # Create a polygon
13
+ # points is an array of [x, y] pairs with N >= 3 vertices
14
+ def initialize(points:, z: 0, rotate: 0, rx: nil, ry: nil,
15
+ color: nil, colour: nil, opacity: nil,
16
+ fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil,
17
+ add: true, visible: true)
18
+ raise ArgumentError, 'Polygon requires at least 3 points' if points.length < 3
19
+ raise ArgumentError, 'points must be an array of [x, y] pairs' \
20
+ unless points.all? { |p| p.is_a?(Array) && p.length == 2 }
21
+
22
+ @coordinates = points.flat_map { |x, y| [x.to_f, y.to_f] }
23
+ @z = z
24
+ @rotate = rotate
25
+ @_user_rx = rx
26
+ @_user_ry = ry
27
+ self.color = color || colour || 'white'
28
+ self.opacity = opacity unless opacity.nil?
29
+ @fill = fill
30
+ @stroke_width = stroke_width
31
+ self.stroke_color = stroke_color || stroke_colour || (color || colour)
32
+ self.stroke_color.opacity = opacity unless opacity.nil?
33
+ @visible = visible
34
+ self.add if add
35
+ end
36
+
37
+ # Number of vertices
38
+ def vertex_count
39
+ @coordinates.length / 2
40
+ end
41
+
42
+ # The vertices as an array of [x, y] pairs
43
+ def points
44
+ @coordinates.each_slice(2).to_a
45
+ end
46
+
47
+ # Bounding-box width and height (extent across all vertices)
48
+ def width
49
+ xs = @coordinates.each_slice(2).map(&:first)
50
+ xs.max - xs.min
51
+ end
52
+
53
+ def height
54
+ ys = @coordinates.each_slice(2).map(&:last)
55
+ ys.max - ys.min
56
+ end
57
+
58
+ # Test whether (x, y) lies inside the polygon, using the even-odd ray-cast
59
+ # rule (shared by every filled polygonal shape — see `_point_in_polygon?`).
60
+ # Matches the rendered fill for non-self-intersecting polygons (convex and
61
+ # concave); self-intersecting input isn't fully supported by the renderer, so
62
+ # the test can diverge from the drawn pixels there.
63
+ def contains?(x, y)
64
+ x, y = _unrotate(x, y)
65
+ _point_in_polygon?(@coordinates, x, y)
66
+ end
67
+
68
+ # Centroid x (average of vertex x coordinates)
69
+ def x
70
+ sum = 0.0
71
+ n = vertex_count
72
+ n.times { |i| sum += @coordinates[i * 2] }
73
+ sum / n
74
+ end
75
+
76
+ # Centroid y (average of vertex y coordinates)
77
+ def y
78
+ sum = 0.0
79
+ n = vertex_count
80
+ n.times { |i| sum += @coordinates[i * 2 + 1] }
81
+ sum / n
82
+ end
83
+
84
+ # Set the centroid x coordinate, translating all vertices
85
+ def x=(new_x)
86
+ _require_numeric_position(:x, new_x)
87
+ dx = new_x - x
88
+ i = 0
89
+ while i < @coordinates.length
90
+ @coordinates[i] += dx
91
+ i += 2
92
+ end
93
+ end
94
+
95
+ # Set the centroid y coordinate, translating all vertices
96
+ def y=(new_y)
97
+ _require_numeric_position(:y, new_y)
98
+ dy = new_y - y
99
+ i = 1
100
+ while i < @coordinates.length
101
+ @coordinates[i] += dy
102
+ i += 2
103
+ end
104
+ end
105
+
106
+ # Get the rotation center x coordinate
107
+ def rx
108
+ @_user_rx.nil? ? x : @_user_rx
109
+ end
110
+
111
+ # Get the rotation center y coordinate
112
+ def ry
113
+ @_user_ry.nil? ? y : @_user_ry
114
+ end
115
+
116
+ # Set the rotation center x coordinate
117
+ def rx=(val)
118
+ @_user_rx = val
119
+ end
120
+
121
+ # Set the rotation center y coordinate
122
+ def ry=(val)
123
+ @_user_ry = val
124
+ end
125
+
126
+ # Set the fill color (single or per-vertex array).
127
+ # Per-vertex array length must match vertex_count.
128
+ def color=(color)
129
+ cs = Color.set(color)
130
+ if cs.is_a?(Color::Set) && cs.length != vertex_count
131
+ raise ArgumentError,
132
+ "`#{self.class}` requires #{vertex_count} colors, one for each vertex. #{cs.length} were given."
133
+ end
134
+ @color = cs
135
+ @_cc = nil
136
+ end
137
+
138
+ # Set the stroke color. Accepts a single color or a `Color::Set` of
139
+ # vertex_count colors (one per vertex) interpolated around the perimeter.
140
+ def stroke_color=(c)
141
+ @stroke_color = Renderable.resolve_color_or_default(c, vertex_count, label: self.class)
142
+ @_stroke_cc = nil
143
+ end
144
+ alias_method :stroke_colour=, :stroke_color=
145
+
146
+ # Render a polygon without creating an instance
147
+ def self.render(points:, rotate: 0, rx: nil, ry: nil,
148
+ color: nil, colour: nil, opacity: nil,
149
+ fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil)
150
+ Window.render_ready_check
151
+ raise ArgumentError, 'Polygon requires at least 3 points' if points.length < 3
152
+
153
+ n = points.length
154
+ coords = Renderable.flatten_points(points)
155
+ fill_input = color || colour
156
+ pvc = Renderable.flatten_color(fill_input, n, opacity, label: self)
157
+
158
+ if rotate != 0
159
+ ccx = 0.0; ccy = 0.0
160
+ n.times do |i|
161
+ ccx += coords[i * 2]
162
+ ccy += coords[i * 2 + 1]
163
+ end
164
+ ccx /= n
165
+ ccy /= n
166
+ coords = rotate_coords(coords, rotate, rx || ccx, ry || ccy)
167
+ end
168
+
169
+ Ext.draw_polygon(coords, pvc) if fill
170
+ # Flatten the stroke colors only when actually stroking; an explicitly
171
+ # given stroke color is still validated at stroke_width 0 to match the
172
+ # instance constructor.
173
+ if stroke_width > 0
174
+ pvs = Renderable.flatten_color(stroke_color || stroke_colour || fill_input, n, opacity, label: self)
175
+ Ext.stroke_path(coords, stroke_width, pvs, true)
176
+ elsif stroke_color || stroke_colour
177
+ Renderable.flatten_color(stroke_color || stroke_colour, n, opacity, label: self)
178
+ end
179
+ end
180
+
181
+ private
182
+
183
+ # Apply rotation to every (x, y) pair in a flat coords array, writing into
184
+ # `out` (allocated fresh when nil) — the input is never mutated. The
185
+ # instance render path passes a reused per-object buffer so a rotated
186
+ # polygon doesn't allocate an N-element array every frame; the native draw
187
+ # copies the values out synchronously, so reuse is safe.
188
+ def self.rotate_coords(coords, angle, cx, cy, out = nil)
189
+ rad = angle * Math::PI / 180.0
190
+ sa = Math.sin(rad)
191
+ ca = Math.cos(rad)
192
+ n = coords.length / 2
193
+ out ||= Array.new(coords.length)
194
+ n.times do |i|
195
+ dx = coords[i * 2] - cx
196
+ dy = coords[i * 2 + 1] - cy
197
+ out[i * 2] = dx * ca - dy * sa + cx
198
+ out[i * 2 + 1] = dx * sa + dy * ca + cy
199
+ end
200
+ out
201
+ end
202
+ private_class_method :rotate_coords
203
+
204
+ def render
205
+ ensure_cc
206
+ ensure_scc if @stroke_width && @stroke_width > 0
207
+
208
+ coords = @coordinates
209
+ if @rotate != 0
210
+ # Resolve the rotation center in a single vertex pass. Calling `rx` and
211
+ # `ry` separately would average the coordinates twice (two N-loops) when
212
+ # no user pivot is set; an explicit pivot skips the loop entirely.
213
+ if !@_user_rx.nil? && !@_user_ry.nil?
214
+ cx = @_user_rx
215
+ cy = @_user_ry
216
+ else
217
+ sum_x = 0.0
218
+ sum_y = 0.0
219
+ n = vertex_count
220
+ n.times do |i|
221
+ sum_x += @coordinates[i * 2]
222
+ sum_y += @coordinates[i * 2 + 1]
223
+ end
224
+ cx = @_user_rx.nil? ? sum_x / n : @_user_rx
225
+ cy = @_user_ry.nil? ? sum_y / n : @_user_ry
226
+ end
227
+ if @_rot_coords.nil? || @_rot_coords.length != @coordinates.length
228
+ @_rot_coords = Array.new(@coordinates.length)
229
+ end
230
+ coords = Polygon.send(:rotate_coords, @coordinates, @rotate, cx, cy, @_rot_coords)
231
+ end
232
+
233
+ Ext.draw_polygon(coords, @_cc) if @fill
234
+ Ext.stroke_path(coords, @stroke_width, @_stroke_cc, true) if @stroke_width && @stroke_width > 0
235
+ end
236
+
237
+ # Scene-graph draw hook (see Renderable#_render_scene). Polygon's `render` is
238
+ # already zero-arg, so the hook is the same method under the scene name.
239
+ alias_method :_render_scene, :render
240
+ public :_render_scene
241
+
242
+ # Flatten @color into per-vertex RGBA array. If @color is a Color::Set, use
243
+ # each entry; otherwise replicate across all vertices.
244
+ def ensure_cc
245
+ n = vertex_count
246
+ if @_cc.nil? || @_cc.length != n * 4 || !cc_matches?
247
+ @_cc = Array.new(n * 4)
248
+ n.times do |i|
249
+ c = @color.vertex(i)
250
+ @_cc[i * 4] = c.r
251
+ @_cc[i * 4 + 1] = c.g
252
+ @_cc[i * 4 + 2] = c.b
253
+ @_cc[i * 4 + 3] = c.a
254
+ end
255
+ end
256
+ end
257
+
258
+ def cc_matches?
259
+ n = vertex_count
260
+ n.times do |i|
261
+ c = @color.vertex(i)
262
+ return false if @_cc[i * 4] != c.r
263
+ return false if @_cc[i * 4 + 1] != c.g
264
+ return false if @_cc[i * 4 + 2] != c.b
265
+ return false if @_cc[i * 4 + 3] != c.a
266
+ end
267
+ true
268
+ end
269
+
270
+ # Build flat per-vertex stroke color cache (vertex_count × rgba floats)
271
+ def ensure_scc
272
+ n = vertex_count
273
+ if @_stroke_cc.nil? || @_stroke_cc.length != n * 4 || !scc_matches?
274
+ @_stroke_cc = Array.new(n * 4)
275
+ n.times do |i|
276
+ c = @stroke_color.vertex(i)
277
+ @_stroke_cc[i * 4] = c.r
278
+ @_stroke_cc[i * 4 + 1] = c.g
279
+ @_stroke_cc[i * 4 + 2] = c.b
280
+ @_stroke_cc[i * 4 + 3] = c.a
281
+ end
282
+ end
283
+ end
284
+
285
+ def scc_matches?
286
+ n = vertex_count
287
+ n.times do |i|
288
+ c = @stroke_color.vertex(i)
289
+ return false if @_stroke_cc[i * 4] != c.r
290
+ return false if @_stroke_cc[i * 4 + 1] != c.g
291
+ return false if @_stroke_cc[i * 4 + 2] != c.b
292
+ return false if @_stroke_cc[i * 4 + 3] != c.a
293
+ end
294
+ true
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,368 @@
1
+ # Ruby2D::Polyline
2
+
3
+ module Ruby2D
4
+ # A connected sequence of line segments. Stroke-only (no fill).
5
+ # Set `closed: true` to connect the last point back to the first.
6
+ class Polyline
7
+ include Renderable
8
+
9
+ attr_accessor :rotate, :stroke_width, :closed
10
+
11
+ # Miter-join limit, matching `R2D_MITER_LIMIT` in the C extension (the SVG
12
+ # default). A sharp corner's miter is clamped to `MITER_LIMIT * stroke_width / 2`.
13
+ MITER_LIMIT = 4.0
14
+
15
+ # Create a polyline
16
+ # points is an array of [x, y] pairs with N >= 2 vertices
17
+ def initialize(points:, z: 0, rotate: 0, rx: nil, ry: nil,
18
+ color: nil, colour: nil, opacity: nil,
19
+ stroke_width: 1, closed: false, add: true, visible: true)
20
+ raise ArgumentError, 'Polyline requires at least 2 points' if points.length < 2
21
+ raise ArgumentError, 'points must be an array of [x, y] pairs' \
22
+ unless points.all? { |p| p.is_a?(Array) && p.length == 2 }
23
+
24
+ @coordinates = points.flat_map { |x, y| [x.to_f, y.to_f] }
25
+ @z = z
26
+ @rotate = rotate
27
+ @_user_rx = rx
28
+ @_user_ry = ry
29
+ @stroke_width = stroke_width
30
+ @closed = closed
31
+ self.color = color || colour || 'white'
32
+ self.opacity = opacity unless opacity.nil?
33
+ @visible = visible
34
+ self.add if add
35
+ end
36
+
37
+ # Number of vertices
38
+ def vertex_count
39
+ @coordinates.length / 2
40
+ end
41
+
42
+ # The vertices as an array of [x, y] pairs
43
+ def points
44
+ @coordinates.each_slice(2).to_a
45
+ end
46
+
47
+ # Bounding-box width and height (extent across all vertices)
48
+ def width
49
+ xs = @coordinates.each_slice(2).map(&:first)
50
+ xs.max - xs.min
51
+ end
52
+
53
+ def height
54
+ ys = @coordinates.each_slice(2).map(&:last)
55
+ ys.max - ys.min
56
+ end
57
+
58
+ # Test whether (x, y) lies on the polyline's stroke. Hit-tests against the
59
+ # exact shape the renderer draws — the ribbon between the outer and inner
60
+ # stroke outlines, with mitered joints and butt-capped open ends — so the
61
+ # clickable region matches the visible pixels, corners and all. A closed
62
+ # path joins at every vertex (no open ends).
63
+ def contains?(x, y)
64
+ return false unless @stroke_width.positive?
65
+ x, y = _unrotate(x, y) if @rotate != 0
66
+ n = vertex_count
67
+ outer, inner = compute_stroke_outline
68
+ edges = @closed ? n : n - 1
69
+ edges.times do |i|
70
+ j = (i + 1) % n
71
+ # The renderer fills each edge as the quad outer[i] → inner[i] →
72
+ # inner[j] → outer[j]; the point is on the stroke iff it lies inside any
73
+ # of those quads. The miter outline makes the corners exact.
74
+ oi = outer[i]; ii = inner[i]
75
+ oj = outer[j]; ij = inner[j]
76
+ return true if _point_in_polygon?(
77
+ [oi[0], oi[1], ii[0], ii[1], ij[0], ij[1], oj[0], oj[1]], x, y
78
+ )
79
+ end
80
+ false
81
+ end
82
+
83
+ # Centroid x
84
+ def x
85
+ sum = 0.0
86
+ n = vertex_count
87
+ n.times { |i| sum += @coordinates[i * 2] }
88
+ sum / n
89
+ end
90
+
91
+ # Centroid y
92
+ def y
93
+ sum = 0.0
94
+ n = vertex_count
95
+ n.times { |i| sum += @coordinates[i * 2 + 1] }
96
+ sum / n
97
+ end
98
+
99
+ # Set the centroid x coordinate, translating all vertices
100
+ def x=(new_x)
101
+ _require_numeric_position(:x, new_x)
102
+ dx = new_x - x
103
+ i = 0
104
+ while i < @coordinates.length
105
+ @coordinates[i] += dx
106
+ i += 2
107
+ end
108
+ end
109
+
110
+ # Set the centroid y coordinate, translating all vertices
111
+ def y=(new_y)
112
+ _require_numeric_position(:y, new_y)
113
+ dy = new_y - y
114
+ i = 1
115
+ while i < @coordinates.length
116
+ @coordinates[i] += dy
117
+ i += 2
118
+ end
119
+ end
120
+
121
+ # Get the rotation center x coordinate
122
+ def rx
123
+ @_user_rx.nil? ? x : @_user_rx
124
+ end
125
+
126
+ # Get the rotation center y coordinate
127
+ def ry
128
+ @_user_ry.nil? ? y : @_user_ry
129
+ end
130
+
131
+ # Set the rotation center x coordinate
132
+ def rx=(val)
133
+ @_user_rx = val
134
+ end
135
+
136
+ # Set the rotation center y coordinate
137
+ def ry=(val)
138
+ @_user_ry = val
139
+ end
140
+
141
+ # The stroke color. Accepts a single color or a `Color::Set` of
142
+ # vertex_count colors (one per vertex) interpolated along the path.
143
+ def color=(c)
144
+ @color = Renderable.resolve_color_or_default(c, vertex_count, label: self.class)
145
+ @_stroke_cc = nil
146
+ end
147
+
148
+ # Set opacity. Accepts a single value (applied to all vertices) or an
149
+ # array of per-vertex values (length must equal vertex_count).
150
+ def opacity=(value)
151
+ if value.is_a?(Array)
152
+ n = vertex_count
153
+ raise ArgumentError,
154
+ "opacity array must have #{n} values, one for each vertex. #{value.length} were given." \
155
+ unless value.length == n
156
+ # Clamp each entry to 0.0..1.0, matching the scalar path (Color#opacity=).
157
+ # NaN can't be clamped (Float::NAN.clamp raises), so map it to 0.0 first.
158
+ @_per_vertex_opacity = value.map do |v|
159
+ f = v.to_f
160
+ f = 0.0 if f.nan?
161
+ f.clamp(0.0, 1.0)
162
+ end
163
+ else
164
+ @_per_vertex_opacity = nil
165
+ @color.opacity = value
166
+ end
167
+ @_stroke_cc = nil
168
+ end
169
+
170
+ # Get opacity. Returns the per-vertex array when set, otherwise the
171
+ # uniform alpha from the first vertex color.
172
+ def opacity
173
+ @_per_vertex_opacity || @color&.opacity
174
+ end
175
+
176
+ # Render a polyline without creating an instance
177
+ def self.render(points:, rotate: 0, rx: nil, ry: nil,
178
+ color: nil, colour: nil, opacity: nil,
179
+ stroke_width: 1, closed: false)
180
+ Window.render_ready_check
181
+ raise ArgumentError, 'Polyline requires at least 2 points' if points.length < 2
182
+
183
+ n = points.length
184
+ coords = Renderable.flatten_points(points)
185
+ pvs = Renderable.flatten_color(color || colour, n, opacity, label: self)
186
+
187
+ if rotate != 0
188
+ ccx = 0.0; ccy = 0.0
189
+ n.times do |i|
190
+ ccx += coords[i * 2]
191
+ ccy += coords[i * 2 + 1]
192
+ end
193
+ ccx /= n
194
+ ccy /= n
195
+ coords = rotate_coords(coords, rotate, rx || ccx, ry || ccy)
196
+ end
197
+
198
+ Ext.stroke_path(coords, stroke_width, pvs, closed) if stroke_width > 0
199
+ end
200
+
201
+ private
202
+
203
+ # Build the stroke outline the renderer draws: the outer- and inner-edge
204
+ # point for each vertex, with miter joins clamped to `MITER_LIMIT` and butt
205
+ # caps at the open ends. A faithful port of `R2D_ComputeStrokeOutline`
206
+ # (`ext/ruby2d/shapes.c`) — keep the two in sync. Returns `[outer, inner]`,
207
+ # each an array of `[x, y]`. Used by `contains?` to hit-test the exact drawn
208
+ # shape, including the mitered corner spikes a round-join disk would miss.
209
+ def compute_stroke_outline
210
+ n = vertex_count
211
+ coords = @coordinates
212
+ hw = @stroke_width / 2.0
213
+ max_ml = MITER_LIMIT * hw
214
+ outer = Array.new(n)
215
+ inner = Array.new(n)
216
+
217
+ n.times do |i|
218
+ vx = coords[i * 2]
219
+ vy = coords[i * 2 + 1]
220
+
221
+ # Open-path endpoints get a butt cap: perpendicular of the lone edge.
222
+ if !@closed && (i == 0 || i == n - 1)
223
+ other = i == 0 ? 1 : n - 2
224
+ dx = vx - coords[other * 2]
225
+ dy = vy - coords[other * 2 + 1]
226
+ if i == 0
227
+ dx = -dx
228
+ dy = -dy
229
+ end
230
+ len = Math.sqrt(dx * dx + dy * dy)
231
+ if len < 0.0001
232
+ outer[i] = [vx, vy]
233
+ inner[i] = [vx, vy]
234
+ else
235
+ nx = -dy / len
236
+ ny = dx / len
237
+ outer[i] = [vx + nx * hw, vy + ny * hw]
238
+ inner[i] = [vx - nx * hw, vy - ny * hw]
239
+ end
240
+ next
241
+ end
242
+
243
+ # Interior joint (every vertex when closed): miter.
244
+ prev = (i - 1 + n) % n
245
+ nxt = (i + 1) % n
246
+ d1x = vx - coords[prev * 2]
247
+ d1y = vy - coords[prev * 2 + 1]
248
+ d2x = coords[nxt * 2] - vx
249
+ d2y = coords[nxt * 2 + 1] - vy
250
+ len1 = Math.sqrt(d1x * d1x + d1y * d1y)
251
+ len2 = Math.sqrt(d2x * d2x + d2y * d2y)
252
+ if len1 < 0.0001 || len2 < 0.0001
253
+ outer[i] = [vx, vy]
254
+ inner[i] = [vx, vy]
255
+ next
256
+ end
257
+ d1x /= len1; d1y /= len1
258
+ d2x /= len2; d2y /= len2
259
+ n1x = -d1y; n1y = d1x
260
+ n2x = -d2y; n2y = d2x
261
+ mx = n1x + n2x
262
+ my = n1y + n2y
263
+ mlen = Math.sqrt(mx * mx + my * my)
264
+ if mlen < 0.0001
265
+ # 180° turn — degenerate; use the perpendicular of the first edge.
266
+ outer[i] = [vx + n1x * hw, vy + n1y * hw]
267
+ inner[i] = [vx - n1x * hw, vy - n1y * hw]
268
+ next
269
+ end
270
+ mx /= mlen; my /= mlen
271
+ dot = mx * n1x + my * n1y
272
+ dot = 0.0001 if dot.abs < 0.0001
273
+ ml = hw / dot
274
+ ml = max_ml if ml > max_ml
275
+ ml = -max_ml if ml < -max_ml
276
+ outer[i] = [vx + mx * ml, vy + my * ml]
277
+ inner[i] = [vx - mx * ml, vy - my * ml]
278
+ end
279
+
280
+ [outer, inner]
281
+ end
282
+
283
+ # Apply rotation to every (x, y) pair in a flat coords array, writing into
284
+ # `out` (allocated fresh when nil) — the input is never mutated. The
285
+ # instance render path passes a reused per-object buffer so a rotated
286
+ # polyline doesn't allocate an N-element array every frame; the native draw
287
+ # copies the values out synchronously, so reuse is safe.
288
+ def self.rotate_coords(coords, angle, cx, cy, out = nil)
289
+ rad = angle * Math::PI / 180.0
290
+ sa = Math.sin(rad)
291
+ ca = Math.cos(rad)
292
+ n = coords.length / 2
293
+ out ||= Array.new(coords.length)
294
+ n.times do |i|
295
+ dx = coords[i * 2] - cx
296
+ dy = coords[i * 2 + 1] - cy
297
+ out[i * 2] = dx * ca - dy * sa + cx
298
+ out[i * 2 + 1] = dx * sa + dy * ca + cy
299
+ end
300
+ out
301
+ end
302
+ private_class_method :rotate_coords
303
+
304
+ def render
305
+ ensure_scc
306
+
307
+ coords = @coordinates
308
+ if @rotate != 0
309
+ # Resolve the rotation center in a single vertex pass. Calling `rx` and
310
+ # `ry` separately would average the coordinates twice (two N-loops) when
311
+ # no user pivot is set; an explicit pivot skips the loop entirely.
312
+ if !@_user_rx.nil? && !@_user_ry.nil?
313
+ cx = @_user_rx
314
+ cy = @_user_ry
315
+ else
316
+ sum_x = 0.0
317
+ sum_y = 0.0
318
+ n = vertex_count
319
+ n.times do |i|
320
+ sum_x += @coordinates[i * 2]
321
+ sum_y += @coordinates[i * 2 + 1]
322
+ end
323
+ cx = @_user_rx.nil? ? sum_x / n : @_user_rx
324
+ cy = @_user_ry.nil? ? sum_y / n : @_user_ry
325
+ end
326
+ if @_rot_coords.nil? || @_rot_coords.length != @coordinates.length
327
+ @_rot_coords = Array.new(@coordinates.length)
328
+ end
329
+ coords = Polyline.send(:rotate_coords, @coordinates, @rotate, cx, cy, @_rot_coords)
330
+ end
331
+
332
+ Ext.stroke_path(coords, @stroke_width, @_stroke_cc, @closed) if @stroke_width && @stroke_width > 0
333
+ end
334
+
335
+ # Scene-graph draw hook (see Renderable#_render_scene). Polyline's `render`
336
+ # is already zero-arg, so the hook is the same method under the scene name.
337
+ alias_method :_render_scene, :render
338
+ public :_render_scene
339
+
340
+ # Build flat per-vertex stroke color cache (vertex_count × rgba floats)
341
+ def ensure_scc
342
+ n = vertex_count
343
+ if @_stroke_cc.nil? || @_stroke_cc.length != n * 4 || !scc_matches?
344
+ @_stroke_cc = Array.new(n * 4)
345
+ n.times do |i|
346
+ c = @color.vertex(i)
347
+ @_stroke_cc[i * 4] = c.r
348
+ @_stroke_cc[i * 4 + 1] = c.g
349
+ @_stroke_cc[i * 4 + 2] = c.b
350
+ @_stroke_cc[i * 4 + 3] = @_per_vertex_opacity ? @_per_vertex_opacity[i] : c.a
351
+ end
352
+ end
353
+ end
354
+
355
+ def scc_matches?
356
+ n = vertex_count
357
+ n.times do |i|
358
+ c = @color.vertex(i)
359
+ a = @_per_vertex_opacity ? @_per_vertex_opacity[i] : c.a
360
+ return false if @_stroke_cc[i * 4] != c.r
361
+ return false if @_stroke_cc[i * 4 + 1] != c.g
362
+ return false if @_stroke_cc[i * 4 + 2] != c.b
363
+ return false if @_stroke_cc[i * 4 + 3] != a
364
+ end
365
+ true
366
+ end
367
+ end
368
+ end