ruby2d 0.12.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -0
  3. data/README.md +141 -0
  4. data/USAGE.md +2435 -0
  5. data/assets/Rakefile +637 -0
  6. data/assets/build_support/CMakeLists.txt +94 -0
  7. data/assets/build_support/mruby/build_config.rb +34 -0
  8. data/assets/build_support/mruby/build_config_wasm.rb +30 -0
  9. data/assets/build_support/sdl_test.c +174 -0
  10. data/assets/deps.yaml +16 -0
  11. data/assets/platform/include/SDL3/SDL.h +91 -0
  12. data/assets/platform/include/SDL3/SDL_assert.h +705 -0
  13. data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
  14. data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
  15. data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
  16. data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
  17. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
  18. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
  19. data/assets/platform/include/SDL3/SDL_camera.h +535 -0
  20. data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
  21. data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
  22. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
  23. data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
  24. data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
  25. data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
  26. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
  27. data/assets/platform/include/SDL3/SDL_endian.h +645 -0
  28. data/assets/platform/include/SDL3/SDL_error.h +226 -0
  29. data/assets/platform/include/SDL3/SDL_events.h +1645 -0
  30. data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
  31. data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
  32. data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
  33. data/assets/platform/include/SDL3/SDL_guid.h +106 -0
  34. data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
  35. data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
  36. data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
  37. data/assets/platform/include/SDL3/SDL_init.h +507 -0
  38. data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
  39. data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
  40. data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
  41. data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
  42. data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
  43. data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
  44. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
  45. data/assets/platform/include/SDL3/SDL_log.h +541 -0
  46. data/assets/platform/include/SDL3/SDL_main.h +704 -0
  47. data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
  48. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
  49. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
  50. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
  51. data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
  52. data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
  53. data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
  54. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
  55. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
  56. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
  57. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
  58. data/assets/platform/include/SDL3/SDL_pen.h +198 -0
  59. data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
  60. data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
  61. data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
  62. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
  63. data/assets/platform/include/SDL3/SDL_process.h +441 -0
  64. data/assets/platform/include/SDL3/SDL_properties.h +572 -0
  65. data/assets/platform/include/SDL3/SDL_rect.h +528 -0
  66. data/assets/platform/include/SDL3/SDL_render.h +3028 -0
  67. data/assets/platform/include/SDL3/SDL_revision.h +59 -0
  68. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
  69. data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
  70. data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
  71. data/assets/platform/include/SDL3/SDL_storage.h +686 -0
  72. data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
  73. data/assets/platform/include/SDL3/SDL_system.h +840 -0
  74. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
  75. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
  76. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
  77. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
  78. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
  79. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
  80. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
  81. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
  82. data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
  83. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
  84. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
  85. data/assets/platform/include/SDL3/SDL_thread.h +602 -0
  86. data/assets/platform/include/SDL3/SDL_time.h +249 -0
  87. data/assets/platform/include/SDL3/SDL_timer.h +454 -0
  88. data/assets/platform/include/SDL3/SDL_touch.h +184 -0
  89. data/assets/platform/include/SDL3/SDL_tray.h +544 -0
  90. data/assets/platform/include/SDL3/SDL_version.h +198 -0
  91. data/assets/platform/include/SDL3/SDL_video.h +3497 -0
  92. data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
  93. data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
  94. data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
  95. data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
  96. data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
  97. data/assets/{include → platform/include}/mrbconf.h +42 -31
  98. data/assets/{include → platform/include}/mruby/array.h +3 -4
  99. data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
  100. data/assets/platform/include/mruby/boxing_no.h +59 -0
  101. data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
  102. data/assets/platform/include/mruby/class.h +157 -0
  103. data/assets/{include → platform/include}/mruby/common.h +30 -1
  104. data/assets/{include → platform/include}/mruby/compile.h +52 -74
  105. data/assets/{include → platform/include}/mruby/data.h +2 -2
  106. data/assets/{include → platform/include}/mruby/debug.h +12 -5
  107. data/assets/{include → platform/include}/mruby/dump.h +7 -9
  108. data/assets/{include → platform/include}/mruby/endian.h +1 -1
  109. data/assets/platform/include/mruby/error.h +173 -0
  110. data/assets/platform/include/mruby/gc.h +79 -0
  111. data/assets/{include → platform/include}/mruby/hash.h +1 -7
  112. data/assets/platform/include/mruby/internal.h +282 -0
  113. data/assets/platform/include/mruby/irep.h +143 -0
  114. data/assets/{include → platform/include}/mruby/istruct.h +1 -1
  115. data/assets/platform/include/mruby/khash.h +455 -0
  116. data/assets/platform/include/mruby/mempool.h +19 -0
  117. data/assets/{include → platform/include}/mruby/numeric.h +7 -10
  118. data/assets/platform/include/mruby/object.h +51 -0
  119. data/assets/{include → platform/include}/mruby/opcode.h +5 -5
  120. data/assets/{include → platform/include}/mruby/ops.h +19 -6
  121. data/assets/platform/include/mruby/presym/id.h +1447 -0
  122. data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
  123. data/assets/platform/include/mruby/presym/table.h +2893 -0
  124. data/assets/platform/include/mruby/presym.h +65 -0
  125. data/assets/platform/include/mruby/proc.h +184 -0
  126. data/assets/{include → platform/include}/mruby/range.h +0 -2
  127. data/assets/{include → platform/include}/mruby/string.h +33 -53
  128. data/assets/platform/include/mruby/throw.h +81 -0
  129. data/assets/{include → platform/include}/mruby/value.h +64 -29
  130. data/assets/{include → platform/include}/mruby/variable.h +6 -23
  131. data/assets/{include → platform/include}/mruby/version.h +7 -7
  132. data/assets/{include → platform/include}/mruby.h +238 -116
  133. data/assets/platform/macos-arm64/bin/mrbc +0 -0
  134. data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
  135. data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
  136. data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
  137. data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
  138. data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
  139. data/assets/platform/wasm/lib/libFLAC.a +0 -0
  140. data/assets/platform/wasm/lib/libSDL3.a +0 -0
  141. data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
  142. data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
  143. data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
  144. data/assets/platform/wasm/lib/libfreetype.a +0 -0
  145. data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
  146. data/assets/platform/wasm/lib/libmruby.a +0 -0
  147. data/assets/platform/wasm/lib/libogg.a +0 -0
  148. data/assets/platform/wasm/lib/libplutosvg.a +0 -0
  149. data/assets/platform/wasm/lib/libplutovg.a +0 -0
  150. data/assets/platform/wasm/lib/libpng.a +0 -0
  151. data/assets/platform/wasm/lib/libpng16.a +0 -0
  152. data/assets/platform/wasm/lib/libvorbis.a +0 -0
  153. data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
  154. data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
  155. data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
  156. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
  157. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  158. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  159. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  160. data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
  161. data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
  162. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
  163. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  164. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  165. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  166. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
  167. data/assets/resources/fonts/outfit/OFL.txt +93 -0
  168. data/assets/resources/fonts/outfit/outfit.ttf +0 -0
  169. data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
  170. data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
  171. data/assets/resources/icons/icon.icns +0 -0
  172. data/assets/resources/icons/icon.png +0 -0
  173. data/assets/resources/spritesheets/License.txt +28 -0
  174. data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
  175. data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
  176. data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
  177. data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
  178. data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
  179. data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
  180. data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
  181. data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
  182. data/assets/{wasm → resources/web}/template.html +1 -1
  183. data/assets/target.rb +131 -0
  184. data/bin/ruby2d +281 -82
  185. data/examples/astar.rb +269 -0
  186. data/examples/asteroids.rb +403 -0
  187. data/examples/bezier_editor.rb +96 -0
  188. data/examples/boids.rb +191 -0
  189. data/examples/bouncing_balls.rb +119 -0
  190. data/examples/breakout.rb +186 -0
  191. data/examples/constellations.rb +100 -0
  192. data/examples/dashboard.rb +133 -0
  193. data/examples/double_pendulum.rb +254 -0
  194. data/examples/falling_sand.rb +291 -0
  195. data/examples/fireworks.rb +110 -0
  196. data/examples/fluid_dynamics.rb +340 -0
  197. data/examples/fourier_epicycles.rb +142 -0
  198. data/examples/fractal_tree.rb +326 -0
  199. data/examples/game_of_life.rb +148 -0
  200. data/examples/gamepads.rb +333 -0
  201. data/examples/hill_driver.rb +613 -0
  202. data/examples/logo_animation.rb +251 -0
  203. data/examples/lorenz_attractor.rb +115 -0
  204. data/examples/mandelbrot.rb +207 -0
  205. data/examples/marching_squares.rb +200 -0
  206. data/examples/maze.rb +323 -0
  207. data/examples/nbody.rb +338 -0
  208. data/examples/outrun.rb +391 -0
  209. data/examples/pixel_paint.rb +313 -0
  210. data/examples/platformer.rb +335 -0
  211. data/examples/ray_casting_maze.rb +175 -0
  212. data/examples/shadow_casting.rb +151 -0
  213. data/examples/shape_recognizer.rb +908 -0
  214. data/examples/snake.rb +144 -0
  215. data/examples/sprite_sheets.rb +246 -0
  216. data/examples/swarm.rb +206 -0
  217. data/examples/tsp_annealing.rb +104 -0
  218. data/examples/ui_controls.rb +163 -0
  219. data/examples/wireframe_3d.rb +139 -0
  220. data/ext/ruby2d/audio.c +324 -0
  221. data/ext/ruby2d/canvas.c +1715 -494
  222. data/ext/ruby2d/ext.c +541 -0
  223. data/ext/ruby2d/extconf.rb +122 -145
  224. data/ext/ruby2d/font.c +566 -20
  225. data/ext/ruby2d/fps.c +92 -0
  226. data/ext/ruby2d/image.c +466 -41
  227. data/ext/ruby2d/ruby2d.c +374 -1890
  228. data/ext/ruby2d/ruby2d.h +840 -460
  229. data/ext/ruby2d/shapes.c +931 -101
  230. data/ext/ruby2d/text.c +586 -21
  231. data/ext/ruby2d/window.c +1693 -283
  232. data/lib/ruby2d/atlas_parser.rb +194 -0
  233. data/lib/ruby2d/audio.rb +73 -0
  234. data/lib/ruby2d/benchmark.rb +259 -0
  235. data/lib/ruby2d/bitmap_text.rb +155 -0
  236. data/lib/ruby2d/button.rb +402 -0
  237. data/lib/ruby2d/canvas.rb +703 -279
  238. data/lib/ruby2d/circle.rb +206 -29
  239. data/lib/ruby2d/cli/browser.rb +314 -0
  240. data/lib/ruby2d/cli/build.rb +471 -257
  241. data/lib/ruby2d/cli/colorize.rb +7 -5
  242. data/lib/ruby2d/cli/examples.rb +127 -0
  243. data/lib/ruby2d/cli/launch.rb +24 -39
  244. data/lib/ruby2d/cli/lib_files.rb +48 -0
  245. data/lib/ruby2d/cli/messages.rb +40 -0
  246. data/lib/ruby2d/cli/setup.rb +273 -0
  247. data/lib/ruby2d/cli/static_server.rb +160 -0
  248. data/lib/ruby2d/cli/usage.rb +255 -0
  249. data/lib/ruby2d/color.rb +191 -69
  250. data/lib/ruby2d/core.rb +37 -19
  251. data/lib/ruby2d/deps_help.rb +89 -0
  252. data/lib/ruby2d/dsl.rb +51 -12
  253. data/lib/ruby2d/ellipse.rb +228 -0
  254. data/lib/ruby2d/exceptions.rb +0 -2
  255. data/lib/ruby2d/font.rb +34 -74
  256. data/lib/ruby2d/gamepad.rb +323 -0
  257. data/lib/ruby2d/gem_paths.rb +19 -0
  258. data/lib/ruby2d/image.rb +155 -52
  259. data/lib/ruby2d/interactive.rb +103 -0
  260. data/lib/ruby2d/json_parser.rb +268 -0
  261. data/lib/ruby2d/line.rb +194 -85
  262. data/lib/ruby2d/mruby_compat.rb +12 -0
  263. data/lib/ruby2d/polygon.rb +297 -0
  264. data/lib/ruby2d/polyline.rb +368 -0
  265. data/lib/ruby2d/quad.rb +358 -94
  266. data/lib/ruby2d/rectangle.rb +77 -19
  267. data/lib/ruby2d/renderable.rb +411 -11
  268. data/lib/ruby2d/sprite.rb +471 -180
  269. data/lib/ruby2d/sprite_sheet.rb +64 -0
  270. data/lib/ruby2d/square.rb +29 -17
  271. data/lib/ruby2d/text.rb +196 -65
  272. data/lib/ruby2d/tileset.rb +139 -81
  273. data/lib/ruby2d/triangle.rb +324 -89
  274. data/lib/ruby2d/version.rb +1 -3
  275. data/lib/ruby2d/vertices.rb +62 -85
  276. data/lib/ruby2d/warnings.rb +29 -0
  277. data/lib/ruby2d/window/class_methods.rb +218 -0
  278. data/lib/ruby2d/window/gamepad_events.rb +141 -0
  279. data/lib/ruby2d/window/key_events.rb +74 -0
  280. data/lib/ruby2d/window/mouse_events.rb +171 -0
  281. data/lib/ruby2d/window/object_events.rb +168 -0
  282. data/lib/ruby2d/window.rb +632 -585
  283. data/lib/ruby2d.rb +14 -19
  284. metadata +275 -443
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GL/glew.h +0 -26427
  287. data/assets/include/GLES2/gl2.h +0 -656
  288. data/assets/include/GLES2/gl2ext.h +0 -3949
  289. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  290. data/assets/include/GLES2/gl2platform.h +0 -27
  291. data/assets/include/GLES3/gl3.h +0 -1192
  292. data/assets/include/GLES3/gl31.h +0 -1507
  293. data/assets/include/GLES3/gl32.h +0 -1808
  294. data/assets/include/GLES3/gl3platform.h +0 -27
  295. data/assets/include/KHR/khrplatform.h +0 -290
  296. data/assets/include/SDL2/SDL.h +0 -233
  297. data/assets/include/SDL2/SDL_assert.h +0 -326
  298. data/assets/include/SDL2/SDL_atomic.h +0 -415
  299. data/assets/include/SDL2/SDL_audio.h +0 -1500
  300. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  301. data/assets/include/SDL2/SDL_config.h +0 -61
  302. data/assets/include/SDL2/SDL_config_android.h +0 -194
  303. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  304. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  305. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  306. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  307. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  308. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  309. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  310. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  311. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  312. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  313. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  314. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  315. data/assets/include/SDL2/SDL_endian.h +0 -348
  316. data/assets/include/SDL2/SDL_error.h +0 -163
  317. data/assets/include/SDL2/SDL_events.h +0 -1166
  318. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  319. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  320. data/assets/include/SDL2/SDL_gesture.h +0 -117
  321. data/assets/include/SDL2/SDL_guid.h +0 -100
  322. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  323. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  324. data/assets/include/SDL2/SDL_hints.h +0 -2569
  325. data/assets/include/SDL2/SDL_image.h +0 -2173
  326. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  327. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  328. data/assets/include/SDL2/SDL_keycode.h +0 -358
  329. data/assets/include/SDL2/SDL_loadso.h +0 -115
  330. data/assets/include/SDL2/SDL_log.h +0 -404
  331. data/assets/include/SDL2/SDL_main.h +0 -275
  332. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  333. data/assets/include/SDL2/SDL_mouse.h +0 -465
  334. data/assets/include/SDL2/SDL_mutex.h +0 -471
  335. data/assets/include/SDL2/SDL_name.h +0 -33
  336. data/assets/include/SDL2/SDL_pixels.h +0 -644
  337. data/assets/include/SDL2/SDL_platform.h +0 -261
  338. data/assets/include/SDL2/SDL_quit.h +0 -58
  339. data/assets/include/SDL2/SDL_rect.h +0 -376
  340. data/assets/include/SDL2/SDL_render.h +0 -1919
  341. data/assets/include/SDL2/SDL_revision.h +0 -6
  342. data/assets/include/SDL2/SDL_rwops.h +0 -841
  343. data/assets/include/SDL2/SDL_sensor.h +0 -322
  344. data/assets/include/SDL2/SDL_shape.h +0 -155
  345. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  346. data/assets/include/SDL2/SDL_surface.h +0 -997
  347. data/assets/include/SDL2/SDL_system.h +0 -623
  348. data/assets/include/SDL2/SDL_syswm.h +0 -386
  349. data/assets/include/SDL2/SDL_test_images.h +0 -78
  350. data/assets/include/SDL2/SDL_test_random.h +0 -115
  351. data/assets/include/SDL2/SDL_thread.h +0 -464
  352. data/assets/include/SDL2/SDL_timer.h +0 -222
  353. data/assets/include/SDL2/SDL_touch.h +0 -150
  354. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  355. data/assets/include/SDL2/SDL_types.h +0 -29
  356. data/assets/include/SDL2/SDL_version.h +0 -204
  357. data/assets/include/SDL2/SDL_video.h +0 -2150
  358. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  359. data/assets/include/SDL2/begin_code.h +0 -187
  360. data/assets/include/mruby/boxing_no.h +0 -58
  361. data/assets/include/mruby/class.h +0 -108
  362. data/assets/include/mruby/error.h +0 -147
  363. data/assets/include/mruby/gc.h +0 -94
  364. data/assets/include/mruby/irep.h +0 -147
  365. data/assets/include/mruby/khash.h +0 -284
  366. data/assets/include/mruby/object.h +0 -43
  367. data/assets/include/mruby/presym/disable.h +0 -70
  368. data/assets/include/mruby/presym/enable.h +0 -37
  369. data/assets/include/mruby/presym.h +0 -40
  370. data/assets/include/mruby/proc.h +0 -211
  371. data/assets/include/mruby/throw.h +0 -66
  372. data/assets/macos/universal/bin/mrbc +0 -0
  373. data/assets/macos/universal/lib/libFLAC.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  377. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  378. data/assets/macos/universal/lib/libavif.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  380. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  381. data/assets/macos/universal/lib/libfreetype.a +0 -0
  382. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  383. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  384. data/assets/macos/universal/lib/libhwy.a +0 -0
  385. data/assets/macos/universal/lib/libjpeg.a +0 -0
  386. data/assets/macos/universal/lib/libjxl.a +0 -0
  387. data/assets/macos/universal/lib/libmodplug.a +0 -0
  388. data/assets/macos/universal/lib/libmpg123.a +0 -0
  389. data/assets/macos/universal/lib/libmruby.a +0 -0
  390. data/assets/macos/universal/lib/libogg.a +0 -0
  391. data/assets/macos/universal/lib/libpng.a +0 -0
  392. data/assets/macos/universal/lib/libtiff.a +0 -0
  393. data/assets/macos/universal/lib/libvorbis.a +0 -0
  394. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  395. data/assets/macos/universal/lib/libwebp.a +0 -0
  396. data/assets/macos/universal/lib/libzstd.a +0 -0
  397. data/assets/test_media/README.md +0 -3
  398. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  399. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  400. data/assets/test_media/boom.png +0 -0
  401. data/assets/test_media/coin.png +0 -0
  402. data/assets/test_media/colors.png +0 -0
  403. data/assets/test_media/controller.png +0 -0
  404. data/assets/test_media/dial.wav +0 -0
  405. data/assets/test_media/hero.png +0 -0
  406. data/assets/test_media/image.bmp +0 -0
  407. data/assets/test_media/image.jpg +0 -0
  408. data/assets/test_media/image.png +0 -0
  409. data/assets/test_media/music.flac +0 -0
  410. data/assets/test_media/music.mp3 +0 -0
  411. data/assets/test_media/music.ogg +0 -0
  412. data/assets/test_media/music.wav +0 -0
  413. data/assets/test_media/originals/boom.pxm +0 -0
  414. data/assets/test_media/originals/coin.pxm +0 -0
  415. data/assets/test_media/originals/controller.sketch +0 -0
  416. data/assets/test_media/originals/hero.pxm +0 -0
  417. data/assets/test_media/originals/image.pxm +0 -0
  418. data/assets/test_media/originals/music.caf +0 -0
  419. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  420. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  421. data/assets/test_media/sound.flac +0 -0
  422. data/assets/test_media/sound.mp3 +0 -0
  423. data/assets/test_media/sound.ogg +0 -0
  424. data/assets/test_media/sound.wav +0 -0
  425. data/assets/test_media/sprite_sheet.png +0 -0
  426. data/assets/test_media/texture_atlas.png +0 -0
  427. data/assets/wasm/libmruby.a +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  463. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  464. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  492. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  493. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  499. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  500. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  501. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  502. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  503. data/assets/xcode/ios/Info.plist +0 -43
  504. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  533. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  534. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  535. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  539. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  540. data/assets/xcode/ios/main.c +0 -1
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  558. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  559. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  560. data/assets/xcode/tvos/Info.plist +0 -30
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  590. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  591. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  592. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  596. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  597. data/assets/xcode/tvos/main.c +0 -1
  598. data/ext/ruby2d/common.c +0 -185
  599. data/ext/ruby2d/controllers.c +0 -110
  600. data/ext/ruby2d/gl.c +0 -398
  601. data/ext/ruby2d/gl2.c +0 -86
  602. data/ext/ruby2d/gl3.c +0 -304
  603. data/ext/ruby2d/gles.c +0 -302
  604. data/ext/ruby2d/input.c +0 -48
  605. data/ext/ruby2d/music.c +0 -127
  606. data/ext/ruby2d/sound.c +0 -132
  607. data/lib/ruby2d/cli/console.rb +0 -65
  608. data/lib/ruby2d/cli/enable_console.rb +0 -7
  609. data/lib/ruby2d/cli/platform.rb +0 -17
  610. data/lib/ruby2d/music.rb +0 -77
  611. data/lib/ruby2d/pixel.rb +0 -18
  612. data/lib/ruby2d/pixmap.rb +0 -39
  613. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  614. data/lib/ruby2d/sound.rb +0 -61
  615. data/lib/ruby2d/texture.rb +0 -38
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  619. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  620. /data/assets/{include → platform/include}/mruby/re.h +0 -0
@@ -0,0 +1,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