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.
- checksums.yaml +4 -4
- data/LICENSE.md +7 -0
- data/README.md +141 -0
- data/USAGE.md +2435 -0
- data/assets/Rakefile +637 -0
- data/assets/build_support/CMakeLists.txt +94 -0
- data/assets/build_support/mruby/build_config.rb +34 -0
- data/assets/build_support/mruby/build_config_wasm.rb +30 -0
- data/assets/build_support/sdl_test.c +174 -0
- data/assets/deps.yaml +16 -0
- data/assets/platform/include/SDL3/SDL.h +91 -0
- data/assets/platform/include/SDL3/SDL_assert.h +705 -0
- data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
- data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
- data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
- data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
- data/assets/platform/include/SDL3/SDL_camera.h +535 -0
- data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
- data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
- data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
- data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
- data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
- data/assets/platform/include/SDL3/SDL_endian.h +645 -0
- data/assets/platform/include/SDL3/SDL_error.h +226 -0
- data/assets/platform/include/SDL3/SDL_events.h +1645 -0
- data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
- data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
- data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
- data/assets/platform/include/SDL3/SDL_guid.h +106 -0
- data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
- data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
- data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
- data/assets/platform/include/SDL3/SDL_init.h +507 -0
- data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
- data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
- data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
- data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
- data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
- data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
- data/assets/platform/include/SDL3/SDL_log.h +541 -0
- data/assets/platform/include/SDL3/SDL_main.h +704 -0
- data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
- data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
- data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
- data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
- data/assets/platform/include/SDL3/SDL_pen.h +198 -0
- data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
- data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
- data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
- data/assets/platform/include/SDL3/SDL_process.h +441 -0
- data/assets/platform/include/SDL3/SDL_properties.h +572 -0
- data/assets/platform/include/SDL3/SDL_rect.h +528 -0
- data/assets/platform/include/SDL3/SDL_render.h +3028 -0
- data/assets/platform/include/SDL3/SDL_revision.h +59 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
- data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
- data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
- data/assets/platform/include/SDL3/SDL_storage.h +686 -0
- data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
- data/assets/platform/include/SDL3/SDL_system.h +840 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
- data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
- data/assets/platform/include/SDL3/SDL_thread.h +602 -0
- data/assets/platform/include/SDL3/SDL_time.h +249 -0
- data/assets/platform/include/SDL3/SDL_timer.h +454 -0
- data/assets/platform/include/SDL3/SDL_touch.h +184 -0
- data/assets/platform/include/SDL3/SDL_tray.h +544 -0
- data/assets/platform/include/SDL3/SDL_version.h +198 -0
- data/assets/platform/include/SDL3/SDL_video.h +3497 -0
- data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
- data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
- data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
- data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
- data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
- data/assets/{include → platform/include}/mrbconf.h +42 -31
- data/assets/{include → platform/include}/mruby/array.h +3 -4
- data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
- data/assets/platform/include/mruby/boxing_no.h +59 -0
- data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
- data/assets/platform/include/mruby/class.h +157 -0
- data/assets/{include → platform/include}/mruby/common.h +30 -1
- data/assets/{include → platform/include}/mruby/compile.h +52 -74
- data/assets/{include → platform/include}/mruby/data.h +2 -2
- data/assets/{include → platform/include}/mruby/debug.h +12 -5
- data/assets/{include → platform/include}/mruby/dump.h +7 -9
- data/assets/{include → platform/include}/mruby/endian.h +1 -1
- data/assets/platform/include/mruby/error.h +173 -0
- data/assets/platform/include/mruby/gc.h +79 -0
- data/assets/{include → platform/include}/mruby/hash.h +1 -7
- data/assets/platform/include/mruby/internal.h +282 -0
- data/assets/platform/include/mruby/irep.h +143 -0
- data/assets/{include → platform/include}/mruby/istruct.h +1 -1
- data/assets/platform/include/mruby/khash.h +455 -0
- data/assets/platform/include/mruby/mempool.h +19 -0
- data/assets/{include → platform/include}/mruby/numeric.h +7 -10
- data/assets/platform/include/mruby/object.h +51 -0
- data/assets/{include → platform/include}/mruby/opcode.h +5 -5
- data/assets/{include → platform/include}/mruby/ops.h +19 -6
- data/assets/platform/include/mruby/presym/id.h +1447 -0
- data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
- data/assets/platform/include/mruby/presym/table.h +2893 -0
- data/assets/platform/include/mruby/presym.h +65 -0
- data/assets/platform/include/mruby/proc.h +184 -0
- data/assets/{include → platform/include}/mruby/range.h +0 -2
- data/assets/{include → platform/include}/mruby/string.h +33 -53
- data/assets/platform/include/mruby/throw.h +81 -0
- data/assets/{include → platform/include}/mruby/value.h +64 -29
- data/assets/{include → platform/include}/mruby/variable.h +6 -23
- data/assets/{include → platform/include}/mruby/version.h +7 -7
- data/assets/{include → platform/include}/mruby.h +238 -116
- data/assets/platform/macos-arm64/bin/mrbc +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libFLAC.a +0 -0
- data/assets/platform/wasm/lib/libSDL3.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/wasm/lib/libfreetype.a +0 -0
- data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
- data/assets/platform/wasm/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libogg.a +0 -0
- data/assets/platform/wasm/lib/libplutosvg.a +0 -0
- data/assets/platform/wasm/lib/libplutovg.a +0 -0
- data/assets/platform/wasm/lib/libpng.a +0 -0
- data/assets/platform/wasm/lib/libpng16.a +0 -0
- data/assets/platform/wasm/lib/libvorbis.a +0 -0
- data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
- data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/resources/fonts/outfit/OFL.txt +93 -0
- data/assets/resources/fonts/outfit/outfit.ttf +0 -0
- data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
- data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
- data/assets/resources/icons/icon.icns +0 -0
- data/assets/resources/icons/icon.png +0 -0
- data/assets/resources/spritesheets/License.txt +28 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
- data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
- data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
- data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
- data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
- data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
- data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
- data/assets/{wasm → resources/web}/template.html +1 -1
- data/assets/target.rb +131 -0
- data/bin/ruby2d +281 -82
- data/examples/astar.rb +269 -0
- data/examples/asteroids.rb +403 -0
- data/examples/bezier_editor.rb +96 -0
- data/examples/boids.rb +191 -0
- data/examples/bouncing_balls.rb +119 -0
- data/examples/breakout.rb +186 -0
- data/examples/constellations.rb +100 -0
- data/examples/dashboard.rb +133 -0
- data/examples/double_pendulum.rb +254 -0
- data/examples/falling_sand.rb +291 -0
- data/examples/fireworks.rb +110 -0
- data/examples/fluid_dynamics.rb +340 -0
- data/examples/fourier_epicycles.rb +142 -0
- data/examples/fractal_tree.rb +326 -0
- data/examples/game_of_life.rb +148 -0
- data/examples/gamepads.rb +333 -0
- data/examples/hill_driver.rb +613 -0
- data/examples/logo_animation.rb +251 -0
- data/examples/lorenz_attractor.rb +115 -0
- data/examples/mandelbrot.rb +207 -0
- data/examples/marching_squares.rb +200 -0
- data/examples/maze.rb +323 -0
- data/examples/nbody.rb +338 -0
- data/examples/outrun.rb +391 -0
- data/examples/pixel_paint.rb +313 -0
- data/examples/platformer.rb +335 -0
- data/examples/ray_casting_maze.rb +175 -0
- data/examples/shadow_casting.rb +151 -0
- data/examples/shape_recognizer.rb +908 -0
- data/examples/snake.rb +144 -0
- data/examples/sprite_sheets.rb +246 -0
- data/examples/swarm.rb +206 -0
- data/examples/tsp_annealing.rb +104 -0
- data/examples/ui_controls.rb +163 -0
- data/examples/wireframe_3d.rb +139 -0
- data/ext/ruby2d/audio.c +324 -0
- data/ext/ruby2d/canvas.c +1715 -494
- data/ext/ruby2d/ext.c +541 -0
- data/ext/ruby2d/extconf.rb +122 -145
- data/ext/ruby2d/font.c +566 -20
- data/ext/ruby2d/fps.c +92 -0
- data/ext/ruby2d/image.c +466 -41
- data/ext/ruby2d/ruby2d.c +374 -1890
- data/ext/ruby2d/ruby2d.h +840 -460
- data/ext/ruby2d/shapes.c +931 -101
- data/ext/ruby2d/text.c +586 -21
- data/ext/ruby2d/window.c +1693 -283
- data/lib/ruby2d/atlas_parser.rb +194 -0
- data/lib/ruby2d/audio.rb +73 -0
- data/lib/ruby2d/benchmark.rb +259 -0
- data/lib/ruby2d/bitmap_text.rb +155 -0
- data/lib/ruby2d/button.rb +402 -0
- data/lib/ruby2d/canvas.rb +703 -279
- data/lib/ruby2d/circle.rb +206 -29
- data/lib/ruby2d/cli/browser.rb +314 -0
- data/lib/ruby2d/cli/build.rb +471 -257
- data/lib/ruby2d/cli/colorize.rb +7 -5
- data/lib/ruby2d/cli/examples.rb +127 -0
- data/lib/ruby2d/cli/launch.rb +24 -39
- data/lib/ruby2d/cli/lib_files.rb +48 -0
- data/lib/ruby2d/cli/messages.rb +40 -0
- data/lib/ruby2d/cli/setup.rb +273 -0
- data/lib/ruby2d/cli/static_server.rb +160 -0
- data/lib/ruby2d/cli/usage.rb +255 -0
- data/lib/ruby2d/color.rb +191 -69
- data/lib/ruby2d/core.rb +37 -19
- data/lib/ruby2d/deps_help.rb +89 -0
- data/lib/ruby2d/dsl.rb +51 -12
- data/lib/ruby2d/ellipse.rb +228 -0
- data/lib/ruby2d/exceptions.rb +0 -2
- data/lib/ruby2d/font.rb +34 -74
- data/lib/ruby2d/gamepad.rb +323 -0
- data/lib/ruby2d/gem_paths.rb +19 -0
- data/lib/ruby2d/image.rb +155 -52
- data/lib/ruby2d/interactive.rb +103 -0
- data/lib/ruby2d/json_parser.rb +268 -0
- data/lib/ruby2d/line.rb +194 -85
- data/lib/ruby2d/mruby_compat.rb +12 -0
- data/lib/ruby2d/polygon.rb +297 -0
- data/lib/ruby2d/polyline.rb +368 -0
- data/lib/ruby2d/quad.rb +358 -94
- data/lib/ruby2d/rectangle.rb +77 -19
- data/lib/ruby2d/renderable.rb +411 -11
- data/lib/ruby2d/sprite.rb +471 -180
- data/lib/ruby2d/sprite_sheet.rb +64 -0
- data/lib/ruby2d/square.rb +29 -17
- data/lib/ruby2d/text.rb +196 -65
- data/lib/ruby2d/tileset.rb +139 -81
- data/lib/ruby2d/triangle.rb +324 -89
- data/lib/ruby2d/version.rb +1 -3
- data/lib/ruby2d/vertices.rb +62 -85
- data/lib/ruby2d/warnings.rb +29 -0
- data/lib/ruby2d/window/class_methods.rb +218 -0
- data/lib/ruby2d/window/gamepad_events.rb +141 -0
- data/lib/ruby2d/window/key_events.rb +74 -0
- data/lib/ruby2d/window/mouse_events.rb +171 -0
- data/lib/ruby2d/window/object_events.rb +168 -0
- data/lib/ruby2d/window.rb +632 -585
- data/lib/ruby2d.rb +14 -19
- metadata +275 -428
- data/assets/app.icns +0 -0
- data/assets/include/GLES2/gl2.h +0 -656
- data/assets/include/GLES2/gl2ext.h +0 -3949
- data/assets/include/GLES2/gl2ext_angle.h +0 -701
- data/assets/include/GLES2/gl2platform.h +0 -27
- data/assets/include/GLES3/gl3.h +0 -1192
- data/assets/include/GLES3/gl31.h +0 -1507
- data/assets/include/GLES3/gl32.h +0 -1808
- data/assets/include/GLES3/gl3platform.h +0 -27
- data/assets/include/KHR/khrplatform.h +0 -290
- data/assets/include/SDL2/SDL.h +0 -233
- data/assets/include/SDL2/SDL_assert.h +0 -326
- data/assets/include/SDL2/SDL_atomic.h +0 -415
- data/assets/include/SDL2/SDL_audio.h +0 -1500
- data/assets/include/SDL2/SDL_clipboard.h +0 -141
- data/assets/include/SDL2/SDL_config.h +0 -61
- data/assets/include/SDL2/SDL_config_android.h +0 -194
- data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
- data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
- data/assets/include/SDL2/SDL_config_macosx.h +0 -277
- data/assets/include/SDL2/SDL_config_minimal.h +0 -95
- data/assets/include/SDL2/SDL_config_ngage.h +0 -89
- data/assets/include/SDL2/SDL_config_os2.h +0 -207
- data/assets/include/SDL2/SDL_config_pandora.h +0 -141
- data/assets/include/SDL2/SDL_config_windows.h +0 -331
- data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
- data/assets/include/SDL2/SDL_config_winrt.h +0 -220
- data/assets/include/SDL2/SDL_config_xbox.h +0 -235
- data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
- data/assets/include/SDL2/SDL_endian.h +0 -348
- data/assets/include/SDL2/SDL_error.h +0 -163
- data/assets/include/SDL2/SDL_events.h +0 -1166
- data/assets/include/SDL2/SDL_filesystem.h +0 -149
- data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
- data/assets/include/SDL2/SDL_gesture.h +0 -117
- data/assets/include/SDL2/SDL_guid.h +0 -100
- data/assets/include/SDL2/SDL_haptic.h +0 -1341
- data/assets/include/SDL2/SDL_hidapi.h +0 -451
- data/assets/include/SDL2/SDL_hints.h +0 -2569
- data/assets/include/SDL2/SDL_image.h +0 -2173
- data/assets/include/SDL2/SDL_joystick.h +0 -1066
- data/assets/include/SDL2/SDL_keyboard.h +0 -353
- data/assets/include/SDL2/SDL_keycode.h +0 -358
- data/assets/include/SDL2/SDL_loadso.h +0 -115
- data/assets/include/SDL2/SDL_log.h +0 -404
- data/assets/include/SDL2/SDL_main.h +0 -275
- data/assets/include/SDL2/SDL_mixer.h +0 -2784
- data/assets/include/SDL2/SDL_mouse.h +0 -465
- data/assets/include/SDL2/SDL_mutex.h +0 -471
- data/assets/include/SDL2/SDL_name.h +0 -33
- data/assets/include/SDL2/SDL_pixels.h +0 -644
- data/assets/include/SDL2/SDL_platform.h +0 -261
- data/assets/include/SDL2/SDL_quit.h +0 -58
- data/assets/include/SDL2/SDL_rect.h +0 -376
- data/assets/include/SDL2/SDL_render.h +0 -1919
- data/assets/include/SDL2/SDL_revision.h +0 -6
- data/assets/include/SDL2/SDL_rwops.h +0 -841
- data/assets/include/SDL2/SDL_sensor.h +0 -322
- data/assets/include/SDL2/SDL_shape.h +0 -155
- data/assets/include/SDL2/SDL_stdinc.h +0 -830
- data/assets/include/SDL2/SDL_surface.h +0 -997
- data/assets/include/SDL2/SDL_system.h +0 -623
- data/assets/include/SDL2/SDL_syswm.h +0 -386
- data/assets/include/SDL2/SDL_test_images.h +0 -78
- data/assets/include/SDL2/SDL_test_random.h +0 -115
- data/assets/include/SDL2/SDL_thread.h +0 -464
- data/assets/include/SDL2/SDL_timer.h +0 -222
- data/assets/include/SDL2/SDL_touch.h +0 -150
- data/assets/include/SDL2/SDL_ttf.h +0 -2316
- data/assets/include/SDL2/SDL_types.h +0 -29
- data/assets/include/SDL2/SDL_version.h +0 -204
- data/assets/include/SDL2/SDL_video.h +0 -2150
- data/assets/include/SDL2/SDL_vulkan.h +0 -215
- data/assets/include/SDL2/begin_code.h +0 -187
- data/assets/include/mruby/boxing_no.h +0 -58
- data/assets/include/mruby/class.h +0 -108
- data/assets/include/mruby/error.h +0 -147
- data/assets/include/mruby/gc.h +0 -94
- data/assets/include/mruby/irep.h +0 -147
- data/assets/include/mruby/khash.h +0 -284
- data/assets/include/mruby/object.h +0 -43
- data/assets/include/mruby/presym/disable.h +0 -70
- data/assets/include/mruby/presym/enable.h +0 -37
- data/assets/include/mruby/presym.h +0 -40
- data/assets/include/mruby/proc.h +0 -211
- data/assets/include/mruby/throw.h +0 -66
- data/assets/macos/universal/bin/mrbc +0 -0
- data/assets/macos/universal/lib/libFLAC.a +0 -0
- data/assets/macos/universal/lib/libSDL2.a +0 -0
- data/assets/macos/universal/lib/libSDL2_image.a +0 -0
- data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/universal/lib/libavif.a +0 -0
- data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
- data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
- data/assets/macos/universal/lib/libfreetype.a +0 -0
- data/assets/macos/universal/lib/libgraphite2.a +0 -0
- data/assets/macos/universal/lib/libharfbuzz.a +0 -0
- data/assets/macos/universal/lib/libhwy.a +0 -0
- data/assets/macos/universal/lib/libjpeg.a +0 -0
- data/assets/macos/universal/lib/libjxl.a +0 -0
- data/assets/macos/universal/lib/libmodplug.a +0 -0
- data/assets/macos/universal/lib/libmpg123.a +0 -0
- data/assets/macos/universal/lib/libmruby.a +0 -0
- data/assets/macos/universal/lib/libogg.a +0 -0
- data/assets/macos/universal/lib/libpng.a +0 -0
- data/assets/macos/universal/lib/libtiff.a +0 -0
- data/assets/macos/universal/lib/libvorbis.a +0 -0
- data/assets/macos/universal/lib/libvorbisfile.a +0 -0
- data/assets/macos/universal/lib/libwebp.a +0 -0
- data/assets/macos/universal/lib/libzstd.a +0 -0
- data/assets/test_media/README.md +0 -3
- data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
- data/assets/test_media/bitstream_vera/vera.ttf +0 -0
- data/assets/test_media/boom.png +0 -0
- data/assets/test_media/coin.png +0 -0
- data/assets/test_media/colors.png +0 -0
- data/assets/test_media/controller.png +0 -0
- data/assets/test_media/dial.wav +0 -0
- data/assets/test_media/hero.png +0 -0
- data/assets/test_media/image.bmp +0 -0
- data/assets/test_media/image.jpg +0 -0
- data/assets/test_media/image.png +0 -0
- data/assets/test_media/music.flac +0 -0
- data/assets/test_media/music.mp3 +0 -0
- data/assets/test_media/music.ogg +0 -0
- data/assets/test_media/music.wav +0 -0
- data/assets/test_media/originals/boom.pxm +0 -0
- data/assets/test_media/originals/coin.pxm +0 -0
- data/assets/test_media/originals/controller.sketch +0 -0
- data/assets/test_media/originals/hero.pxm +0 -0
- data/assets/test_media/originals/image.pxm +0 -0
- data/assets/test_media/originals/music.caf +0 -0
- data/assets/test_media/originals/texture_atlas.pxm +0 -0
- data/assets/test_media/rondo_alla_turka.ogg +0 -0
- data/assets/test_media/sound.flac +0 -0
- data/assets/test_media/sound.mp3 +0 -0
- data/assets/test_media/sound.ogg +0 -0
- data/assets/test_media/sound.wav +0 -0
- data/assets/test_media/sprite_sheet.png +0 -0
- data/assets/test_media/texture_atlas.png +0 -0
- data/assets/wasm/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
- data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
- data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
- data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
- data/assets/xcode/ios/Info.plist +0 -43
- data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
- data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/ios/main.c +0 -1
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
- data/assets/xcode/tvos/Info.plist +0 -30
- data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
- data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/tvos/main.c +0 -1
- data/ext/ruby2d/common.c +0 -185
- data/ext/ruby2d/controllers.c +0 -110
- data/ext/ruby2d/gl.c +0 -398
- data/ext/ruby2d/gl2.c +0 -86
- data/ext/ruby2d/gl3.c +0 -304
- data/ext/ruby2d/gles.c +0 -302
- data/ext/ruby2d/input.c +0 -48
- data/ext/ruby2d/music.c +0 -127
- data/ext/ruby2d/sound.c +0 -132
- data/lib/ruby2d/cli/console.rb +0 -65
- data/lib/ruby2d/cli/enable_console.rb +0 -7
- data/lib/ruby2d/cli/platform.rb +0 -17
- data/lib/ruby2d/music.rb +0 -77
- data/lib/ruby2d/pixel.rb +0 -18
- data/lib/ruby2d/pixmap.rb +0 -39
- data/lib/ruby2d/pixmap_atlas.rb +0 -56
- data/lib/ruby2d/sound.rb +0 -61
- data/lib/ruby2d/texture.rb +0 -38
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
- /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
|