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.
- 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 -443
- data/assets/app.icns +0 -0
- data/assets/include/GL/glew.h +0 -26427
- 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,194 @@
|
|
|
1
|
+
# Ruby2D::AtlasParser
|
|
2
|
+
|
|
3
|
+
module Ruby2D
|
|
4
|
+
# Internal parser for sprite-sheet atlas files. Reads either Sparrow XML or
|
|
5
|
+
# TexturePacker JSON (Hash or Array variants) and returns a uniform shape:
|
|
6
|
+
#
|
|
7
|
+
# { image_path: 'sheet.png',
|
|
8
|
+
# frames: { 'frame_name' => { x:, y:, width:, height: }, ... } }
|
|
9
|
+
#
|
|
10
|
+
# Hand-written and Regexp-free so it works on mruby builds without the
|
|
11
|
+
# regex mrbgem.
|
|
12
|
+
module AtlasParser
|
|
13
|
+
class ParseError < StandardError; end
|
|
14
|
+
|
|
15
|
+
def self.parse_file(path)
|
|
16
|
+
data = File.read(path)
|
|
17
|
+
lower = path.to_s.downcase
|
|
18
|
+
if lower.end_with?('.xml')
|
|
19
|
+
parse_xml(data)
|
|
20
|
+
elsif lower.end_with?('.json')
|
|
21
|
+
parse_json(data)
|
|
22
|
+
else
|
|
23
|
+
sniff(data, path)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.sniff(data, path)
|
|
28
|
+
i = 0
|
|
29
|
+
i += 1 while i < data.length && ws?(data[i])
|
|
30
|
+
first = data[i]
|
|
31
|
+
return parse_xml(data) if first == '<'
|
|
32
|
+
return parse_json(data) if first == '{'
|
|
33
|
+
|
|
34
|
+
raise ParseError, "Cannot determine atlas format for #{path}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.parse_xml(str)
|
|
38
|
+
atlas_attrs = find_tags(str, 'TextureAtlas').first
|
|
39
|
+
image_path = atlas_attrs && parse_xml_attrs(atlas_attrs)['imagePath']
|
|
40
|
+
|
|
41
|
+
frames = {}
|
|
42
|
+
find_tags(str, 'SubTexture').each do |attrs_str|
|
|
43
|
+
attrs = parse_xml_attrs(attrs_str)
|
|
44
|
+
name = attrs['name']
|
|
45
|
+
next unless name
|
|
46
|
+
|
|
47
|
+
rect = {
|
|
48
|
+
x: (attrs['x'] || '0').to_i,
|
|
49
|
+
y: (attrs['y'] || '0').to_i,
|
|
50
|
+
width: (attrs['width'] || '0').to_i,
|
|
51
|
+
height: (attrs['height'] || '0').to_i
|
|
52
|
+
}
|
|
53
|
+
# Extended Sparrow trim attributes: `frameWidth`/`frameHeight` give
|
|
54
|
+
# the original frame's logical dimensions, and `frameX`/`frameY` are
|
|
55
|
+
# the (negative) offset from the original frame's top-left to where
|
|
56
|
+
# the trimmed rect begins. Convert to a positive `trim_x`/`trim_y`.
|
|
57
|
+
if attrs['frameWidth'] || attrs['frameHeight'] || attrs['frameX'] || attrs['frameY']
|
|
58
|
+
rect[:source_width] = (attrs['frameWidth'] || rect[:width]).to_i
|
|
59
|
+
rect[:source_height] = (attrs['frameHeight'] || rect[:height]).to_i
|
|
60
|
+
rect[:trim_x] = -(attrs['frameX'] || '0').to_i
|
|
61
|
+
rect[:trim_y] = -(attrs['frameY'] || '0').to_i
|
|
62
|
+
end
|
|
63
|
+
frames[name] = rect
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
{ image_path: image_path, frames: frames }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.parse_json(str)
|
|
70
|
+
data = JsonParser.parse(str)
|
|
71
|
+
raise ParseError, 'Invalid JSON atlas: top-level value must be an object' unless data.is_a?(Hash)
|
|
72
|
+
|
|
73
|
+
meta = data['meta']
|
|
74
|
+
image_path = meta.is_a?(Hash) ? meta['image'] : nil
|
|
75
|
+
|
|
76
|
+
frames = {}
|
|
77
|
+
frames_data = data['frames']
|
|
78
|
+
if frames_data.is_a?(Hash)
|
|
79
|
+
frames_data.each { |name, info| frames[name] = extract_json_frame(info) }
|
|
80
|
+
elsif frames_data.is_a?(Array)
|
|
81
|
+
frames_data.each do |info|
|
|
82
|
+
next unless info.is_a?(Hash)
|
|
83
|
+
|
|
84
|
+
name = info['filename']
|
|
85
|
+
frames[name] = extract_json_frame(info) if name
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
raise ParseError, "Invalid JSON atlas: 'frames' must be a hash or array"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
{ image_path: image_path, frames: frames }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def self.extract_json_frame(info)
|
|
95
|
+
frame = info.is_a?(Hash) ? info['frame'] : nil
|
|
96
|
+
frame = {} unless frame.is_a?(Hash)
|
|
97
|
+
result = {
|
|
98
|
+
x: (frame['x'] || 0).to_i,
|
|
99
|
+
y: (frame['y'] || 0).to_i,
|
|
100
|
+
width: (frame['w'] || frame['width'] || 0).to_i,
|
|
101
|
+
height: (frame['h'] || frame['height'] || 0).to_i
|
|
102
|
+
}
|
|
103
|
+
# TexturePacker can pack frames rotated 90° to save atlas space.
|
|
104
|
+
# We capture the flag so the consumer can refuse or handle it; the
|
|
105
|
+
# key is omitted when false to keep the common-case hash lean.
|
|
106
|
+
result[:rotated] = true if info.is_a?(Hash) && info['rotated'] == true
|
|
107
|
+
|
|
108
|
+
# Trim metadata: `sourceSize` is the original frame's logical size,
|
|
109
|
+
# `spriteSourceSize.x/y` is where the packed pixels live within it.
|
|
110
|
+
source = info.is_a?(Hash) ? info['sourceSize'] : nil
|
|
111
|
+
sprite_source = info.is_a?(Hash) ? info['spriteSourceSize'] : nil
|
|
112
|
+
if source.is_a?(Hash) && (source['w'] || source['h'])
|
|
113
|
+
result[:source_width] = (source['w'] || result[:width]).to_i
|
|
114
|
+
result[:source_height] = (source['h'] || result[:height]).to_i
|
|
115
|
+
if sprite_source.is_a?(Hash)
|
|
116
|
+
result[:trim_x] = (sprite_source['x'] || 0).to_i
|
|
117
|
+
result[:trim_y] = (sprite_source['y'] || 0).to_i
|
|
118
|
+
else
|
|
119
|
+
result[:trim_x] = 0
|
|
120
|
+
result[:trim_y] = 0
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
result
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Locate every `<TagName ...>` (or `<TagName ... />`) opening tag in `str`
|
|
128
|
+
# and return the inner attribute strings, in document order.
|
|
129
|
+
def self.find_tags(str, tag_name)
|
|
130
|
+
results = []
|
|
131
|
+
marker = "<#{tag_name}"
|
|
132
|
+
marker_len = marker.length
|
|
133
|
+
i = 0
|
|
134
|
+
while (pos = str.index(marker, i))
|
|
135
|
+
after_idx = pos + marker_len
|
|
136
|
+
after = str[after_idx]
|
|
137
|
+
# Confirm this is the right tag boundary (not a longer name like
|
|
138
|
+
# `<TextureAtlasFoo`)
|
|
139
|
+
if after && (ws?(after) || after == '>' || after == '/')
|
|
140
|
+
end_pos = str.index('>', after_idx)
|
|
141
|
+
break unless end_pos
|
|
142
|
+
|
|
143
|
+
attrs_str = str[after_idx...end_pos]
|
|
144
|
+
# Drop the trailing slash from self-closing tags.
|
|
145
|
+
attrs_str = attrs_str[0...-1] if attrs_str.end_with?('/')
|
|
146
|
+
results << attrs_str
|
|
147
|
+
i = end_pos + 1
|
|
148
|
+
else
|
|
149
|
+
i = pos + 1
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
results
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Parse `name="value"` (or `name='value'`) attributes out of an XML tag's
|
|
156
|
+
# attribute string. Tolerates extra whitespace between tokens.
|
|
157
|
+
def self.parse_xml_attrs(str)
|
|
158
|
+
attrs = {}
|
|
159
|
+
return attrs unless str
|
|
160
|
+
|
|
161
|
+
i = 0
|
|
162
|
+
len = str.length
|
|
163
|
+
while i < len
|
|
164
|
+
i += 1 while i < len && ws?(str[i])
|
|
165
|
+
break if i >= len
|
|
166
|
+
|
|
167
|
+
name_start = i
|
|
168
|
+
i += 1 while i < len && str[i] != '=' && !ws?(str[i])
|
|
169
|
+
name = str[name_start...i]
|
|
170
|
+
|
|
171
|
+
i += 1 while i < len && ws?(str[i])
|
|
172
|
+
break unless i < len && str[i] == '='
|
|
173
|
+
|
|
174
|
+
i += 1
|
|
175
|
+
i += 1 while i < len && ws?(str[i])
|
|
176
|
+
break unless i < len
|
|
177
|
+
|
|
178
|
+
quote = str[i]
|
|
179
|
+
break unless quote == '"' || quote == "'"
|
|
180
|
+
|
|
181
|
+
i += 1
|
|
182
|
+
val_start = i
|
|
183
|
+
i += 1 while i < len && str[i] != quote
|
|
184
|
+
attrs[name] = str[val_start...i]
|
|
185
|
+
i += 1 if i < len
|
|
186
|
+
end
|
|
187
|
+
attrs
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def self.ws?(c)
|
|
191
|
+
c == ' ' || c == "\t" || c == "\n" || c == "\r"
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
data/lib/ruby2d/audio.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module Ruby2D
|
|
2
|
+
class Audio
|
|
3
|
+
attr_reader :path
|
|
4
|
+
|
|
5
|
+
# Create an audio object from a file
|
|
6
|
+
def initialize(path, loop: false)
|
|
7
|
+
@path = path.to_s
|
|
8
|
+
raise Error, "Cannot find audio file `#{@path}`" unless File.exist? @path
|
|
9
|
+
|
|
10
|
+
@loop = loop ? true : false
|
|
11
|
+
@ext_audio = Ext.audio_load(@path)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Play the sound
|
|
15
|
+
def play
|
|
16
|
+
Ext.audio_play(@ext_audio, @loop)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Pause the music
|
|
20
|
+
def pause
|
|
21
|
+
Ext.audio_pause(@ext_audio)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Resume paused music
|
|
25
|
+
def resume
|
|
26
|
+
Ext.audio_resume(@ext_audio)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Stop the sound
|
|
30
|
+
def stop(ms_fade = 0)
|
|
31
|
+
Ext.audio_stop(@ext_audio, ms_fade)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Whether the audio loops on play
|
|
35
|
+
def looping?
|
|
36
|
+
@loop
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Set looping
|
|
40
|
+
def loop=(value)
|
|
41
|
+
@loop = value ? true : false
|
|
42
|
+
Ext.audio_set_loop(@ext_audio, @loop)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns the length in seconds
|
|
46
|
+
def length
|
|
47
|
+
Ext.audio_length(@ext_audio)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Get the volume of the sound, 0.0 to 1.0
|
|
51
|
+
def volume
|
|
52
|
+
Ext.audio_get_volume(@ext_audio)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Set the volume of the sound, 0.0 to 1.0
|
|
56
|
+
def volume=(volume)
|
|
57
|
+
Ext.audio_set_volume(@ext_audio, volume.clamp(0.0, 1.0))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class << self
|
|
61
|
+
# Get the mixer volume, 0.0 to 1.0
|
|
62
|
+
def volume
|
|
63
|
+
Ext.audio_get_mixer_volume
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Set the mixer volume, 0.0 to 1.0
|
|
67
|
+
def volume=(volume)
|
|
68
|
+
Ext.audio_set_mixer_volume(volume.clamp(0.0, 1.0))
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
module Ruby2D
|
|
2
|
+
# Lightweight benchmarking harness for Ruby 2D rendering performance.
|
|
3
|
+
#
|
|
4
|
+
# Runs a scene with fps_cap: :infinity (vsync off, no frame cap) and records
|
|
5
|
+
# per-frame deltas plus GC activity over a timed window.
|
|
6
|
+
# After a warmup period the harness samples each frame's duration,
|
|
7
|
+
# then auto-closes and prints a frame-time histogram and GC summary.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
#
|
|
11
|
+
# Ruby2D::Benchmark.run('My Scene', warmup: 10, duration: 5) do
|
|
12
|
+
# # set up your scene / render block here
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
class Benchmark
|
|
16
|
+
DEFAULTS = { warmup: 10, duration: 5 }.freeze
|
|
17
|
+
|
|
18
|
+
# Per-frame CPU/present split. The wall-clock frame delta the harness
|
|
19
|
+
# records includes `SDL_RenderPresent`, which on a desktop compositor can
|
|
20
|
+
# be the dominant, floor-setting cost — so raw fps hides whether a change
|
|
21
|
+
# moved the CPU work at all (an empty window can even measure slower than a
|
|
22
|
+
# populated one). These accumulators, filled by the two wrappers installed
|
|
23
|
+
# in `run`, let the report separate CPU-build time from the present wait.
|
|
24
|
+
# present_ns — time inside `Ext.end_frame` (≈ present; the cap delay is
|
|
25
|
+
# off at fps_cap :infinity)
|
|
26
|
+
# render_ns — time inside `Window#render_objects` (scene-graph draw:
|
|
27
|
+
# dispatch + FFI marshaling, plus any `render do` block)
|
|
28
|
+
# Both are summed per frame and read+reset each update tick. Wrapper-only
|
|
29
|
+
# state lives here (module methods can't close over harness locals); it is
|
|
30
|
+
# bench-only and never loaded by the gem proper.
|
|
31
|
+
module Clock
|
|
32
|
+
class << self
|
|
33
|
+
attr_accessor :present_ns, :render_ns
|
|
34
|
+
end
|
|
35
|
+
self.present_ns = 0.0
|
|
36
|
+
self.render_ns = 0.0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Wraps `Ext.end_frame` to accumulate present time. Prepended to the Ext
|
|
40
|
+
# singleton in `run`. The extra `Ext.now` reads are sub-microsecond and
|
|
41
|
+
# apply to every benchmark equally, so A/B comparisons stay consistent.
|
|
42
|
+
module PresentTimer
|
|
43
|
+
def end_frame(*args)
|
|
44
|
+
t = Ext.now
|
|
45
|
+
super
|
|
46
|
+
ensure
|
|
47
|
+
Clock.present_ns += Ext.now - t
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Wraps `Window#render_objects` to accumulate scene-graph draw time.
|
|
52
|
+
# Prepended to the benchmark window's singleton in `run`.
|
|
53
|
+
module RenderTimer
|
|
54
|
+
def render_objects(*args)
|
|
55
|
+
t = Ruby2D::Ext.now
|
|
56
|
+
super
|
|
57
|
+
ensure
|
|
58
|
+
Clock.render_ns += Ruby2D::Ext.now - t
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
attr_reader :name, :warmup, :duration
|
|
63
|
+
|
|
64
|
+
def initialize(name, warmup: DEFAULTS[:warmup], duration: DEFAULTS[:duration])
|
|
65
|
+
@name = name
|
|
66
|
+
@warmup = warmup
|
|
67
|
+
@duration = duration
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.run(name, **opts, &block)
|
|
71
|
+
new(name, **opts).run(&block)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def run(&setup)
|
|
75
|
+
frame_times = []
|
|
76
|
+
cpu_times = []
|
|
77
|
+
render_times = []
|
|
78
|
+
phase = :warmup
|
|
79
|
+
phase_start = nil
|
|
80
|
+
warmup_frames = 0
|
|
81
|
+
measure_start = nil
|
|
82
|
+
prev_t = nil
|
|
83
|
+
|
|
84
|
+
gc_alloc_start = nil
|
|
85
|
+
gc_minor_start = nil
|
|
86
|
+
gc_major_start = nil
|
|
87
|
+
# mruby (the web build) has no `GC.stat`; skip the allocation section
|
|
88
|
+
# there rather than fault. CRuby reports it as before.
|
|
89
|
+
gc_available = GC.respond_to?(:stat)
|
|
90
|
+
@reported = false
|
|
91
|
+
|
|
92
|
+
w = DSL.window
|
|
93
|
+
|
|
94
|
+
# Install the CPU/present split probes (idempotent — prepend is a no-op
|
|
95
|
+
# if the module is already in the ancestor chain from a prior run).
|
|
96
|
+
Ext.singleton_class.prepend(PresentTimer)
|
|
97
|
+
w.singleton_class.prepend(RenderTimer)
|
|
98
|
+
|
|
99
|
+
# Uncap frame rate so we measure raw throughput
|
|
100
|
+
w.set(fps_cap: :infinity)
|
|
101
|
+
|
|
102
|
+
# Let the caller configure the scene (add objects, render blocks, etc.)
|
|
103
|
+
setup.call
|
|
104
|
+
|
|
105
|
+
# Chain any update proc the setup block registered so per-frame
|
|
106
|
+
# benchmark work runs alongside the harness phase logic.
|
|
107
|
+
user_update = w.instance_variable_get(:@update_proc)
|
|
108
|
+
|
|
109
|
+
w.update do
|
|
110
|
+
# Monotonic clock (matching the engine): immune to wall-clock jumps that
|
|
111
|
+
# would corrupt the frame-time histogram mid-measurement.
|
|
112
|
+
now = Ext.now
|
|
113
|
+
|
|
114
|
+
# Lazily initialise the phase timer on the first real frame —
|
|
115
|
+
# this avoids counting window-creation overhead as warmup time.
|
|
116
|
+
first_frame = phase_start.nil?
|
|
117
|
+
if first_frame
|
|
118
|
+
phase_start = now
|
|
119
|
+
prev_t = now
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
delta = now - prev_t
|
|
123
|
+
prev_t = now
|
|
124
|
+
|
|
125
|
+
# Read + reset the split the wrappers accumulated since the previous
|
|
126
|
+
# update tick — i.e. the frame that just completed, the same frame
|
|
127
|
+
# `delta` spans. `cpu` is the frame minus its present wait; clamp away
|
|
128
|
+
# sub-microsecond clock jitter that could make it momentarily negative.
|
|
129
|
+
present = Clock.present_ns
|
|
130
|
+
render = Clock.render_ns
|
|
131
|
+
Clock.present_ns = 0.0
|
|
132
|
+
Clock.render_ns = 0.0
|
|
133
|
+
cpu = delta - present
|
|
134
|
+
cpu = 0.0 if cpu.negative?
|
|
135
|
+
|
|
136
|
+
# Run the caller's update proc, forwarding the frame delta if it takes
|
|
137
|
+
# one (mirrors Window#update_callback's arity handling).
|
|
138
|
+
if user_update
|
|
139
|
+
user_update.arity.zero? ? user_update.call : user_update.call(delta)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
next if first_frame # exclude the first frame from phase timing
|
|
143
|
+
|
|
144
|
+
case phase
|
|
145
|
+
when :warmup
|
|
146
|
+
warmup_frames += 1
|
|
147
|
+
if now - phase_start >= @warmup
|
|
148
|
+
phase = :measure
|
|
149
|
+
measure_start = now
|
|
150
|
+
if gc_available
|
|
151
|
+
gc_alloc_start = GC.stat(:total_allocated_objects)
|
|
152
|
+
gc_minor_start = GC.stat(:minor_gc_count)
|
|
153
|
+
gc_major_start = GC.stat(:major_gc_count)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
when :measure
|
|
157
|
+
frame_times << delta
|
|
158
|
+
cpu_times << cpu
|
|
159
|
+
render_times << render
|
|
160
|
+
if now - measure_start >= @duration
|
|
161
|
+
if gc_available
|
|
162
|
+
@gc_alloc_delta = GC.stat(:total_allocated_objects) - gc_alloc_start
|
|
163
|
+
@gc_minor_delta = GC.stat(:minor_gc_count) - gc_minor_start
|
|
164
|
+
@gc_major_delta = GC.stat(:major_gc_count) - gc_major_start
|
|
165
|
+
end
|
|
166
|
+
# Print from inside the loop: on the web build `w.show` never
|
|
167
|
+
# returns (emscripten unwinds the C stack, and `close` is a no-op
|
|
168
|
+
# there), so a report after `show` would be dead code
|
|
169
|
+
# there. The `@reported` guard keeps it to a single print.
|
|
170
|
+
unless @reported
|
|
171
|
+
report(frame_times, cpu_times, render_times, warmup_frames)
|
|
172
|
+
@reported = true
|
|
173
|
+
end
|
|
174
|
+
w.close
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
w.show
|
|
180
|
+
|
|
181
|
+
# CRuby returns here once the window closes; the web build never does
|
|
182
|
+
# (it reported from inside the loop above). Report only if the loop
|
|
183
|
+
# somehow exited without doing so.
|
|
184
|
+
report(frame_times, cpu_times, render_times, warmup_frames) unless @reported
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
private
|
|
188
|
+
|
|
189
|
+
def report(frame_times, cpu_times, render_times, warmup_frames)
|
|
190
|
+
puts "Ruby 2D Benchmark — #{@name}"
|
|
191
|
+
puts '-' * 60
|
|
192
|
+
|
|
193
|
+
if frame_times.empty?
|
|
194
|
+
puts ' No samples collected!'
|
|
195
|
+
puts
|
|
196
|
+
return
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
total = frame_times.size
|
|
200
|
+
total_time = frame_times.sum
|
|
201
|
+
avg_ms = (total_time * 1000.0) / total
|
|
202
|
+
fps = total / total_time
|
|
203
|
+
|
|
204
|
+
sorted = frame_times.sort
|
|
205
|
+
pct = ->(s, p) { s[[(s.size * p).floor, s.size - 1].min] * 1000.0 }
|
|
206
|
+
p50 = pct.call(sorted, 0.50)
|
|
207
|
+
p95 = pct.call(sorted, 0.95)
|
|
208
|
+
p99 = pct.call(sorted, 0.99)
|
|
209
|
+
p999 = pct.call(sorted, 0.999)
|
|
210
|
+
max_ms = sorted.last * 1000.0
|
|
211
|
+
|
|
212
|
+
# CPU build (frame minus present) and its share of the scene-graph draw.
|
|
213
|
+
cpu_time = cpu_times.sum
|
|
214
|
+
cpu_avg_ms = (cpu_time * 1000.0) / total
|
|
215
|
+
cpu_fps = cpu_time.positive? ? total / cpu_time : 0.0
|
|
216
|
+
cpu_sorted = cpu_times.sort
|
|
217
|
+
present_avg_ms = ((total_time - cpu_time) * 1000.0) / total
|
|
218
|
+
render_avg_ms = (render_times.sum * 1000.0) / total
|
|
219
|
+
render_p95_ms = pct.call(render_times.sort, 0.95)
|
|
220
|
+
|
|
221
|
+
puts format(' %-14s %s', 'Warmup:', "#{@warmup}s (#{warmup_frames} frames)")
|
|
222
|
+
puts format(' %-14s %s', 'Measured:', "#{@duration}s (#{total} frames)")
|
|
223
|
+
puts
|
|
224
|
+
puts format(' %-14s %.1f fps (%.2f ms/frame)', 'Throughput:', fps, avg_ms)
|
|
225
|
+
puts
|
|
226
|
+
puts ' Frame time (wall clock, incl. present):'
|
|
227
|
+
puts format(' %-10s %.2f ms', 'p50:', p50)
|
|
228
|
+
puts format(' %-10s %.2f ms', 'p95:', p95)
|
|
229
|
+
puts format(' %-10s %.2f ms', 'p99:', p99)
|
|
230
|
+
puts format(' %-10s %.2f ms', 'p99.9:', p999)
|
|
231
|
+
puts format(' %-10s %.2f ms', 'max:', max_ms)
|
|
232
|
+
puts
|
|
233
|
+
puts ' CPU build (frame minus present) — the per-object cost:'
|
|
234
|
+
puts format(' %-10s %.1f fps-equiv (%.2f ms/frame)', 'throughput:', cpu_fps, cpu_avg_ms)
|
|
235
|
+
puts format(' %-10s %.2f ms', 'p50:', pct.call(cpu_sorted, 0.50))
|
|
236
|
+
puts format(' %-10s %.2f ms', 'p95:', pct.call(cpu_sorted, 0.95))
|
|
237
|
+
puts format(' %-10s %.2f ms', 'p99:', pct.call(cpu_sorted, 0.99))
|
|
238
|
+
puts format(' %-10s %.2f ms (p95 %.2f ms)', 'render:', render_avg_ms, render_p95_ms)
|
|
239
|
+
puts format(' %-10s %.2f ms', 'present:', present_avg_ms)
|
|
240
|
+
puts
|
|
241
|
+
|
|
242
|
+
# GC stats are CRuby-only (see `gc_available`); the web build omits them.
|
|
243
|
+
if @gc_alloc_delta
|
|
244
|
+
puts ' GC:'
|
|
245
|
+
puts format(' %-12s %s objects (%s / frame)', 'Allocations:',
|
|
246
|
+
thousands(@gc_alloc_delta), thousands((@gc_alloc_delta.to_f / total).round))
|
|
247
|
+
puts format(' %-12s %d', 'Minor GCs:', @gc_minor_delta)
|
|
248
|
+
puts format(' %-12s %d', 'Major GCs:', @gc_major_delta)
|
|
249
|
+
end
|
|
250
|
+
puts '-' * 60
|
|
251
|
+
puts
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def thousands(n)
|
|
255
|
+
sign = n.negative? ? '-' : ''
|
|
256
|
+
"#{sign}#{n.abs.to_s.reverse.scan(/\d{1,3}/).join(',').reverse}"
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Ruby2D::BitmapText
|
|
2
|
+
|
|
3
|
+
module Ruby2D
|
|
4
|
+
# Text drawn with the built-in bitmap font (no TTF file needed)
|
|
5
|
+
class BitmapText
|
|
6
|
+
include Renderable
|
|
7
|
+
|
|
8
|
+
attr_reader :content, :scale, :x, :y
|
|
9
|
+
attr_accessor :rotate
|
|
10
|
+
|
|
11
|
+
# Set the x position. BitmapText has no symbolic alignment, so x must be a
|
|
12
|
+
# number — a symbol would otherwise crash with a type error at draw time.
|
|
13
|
+
def x=(value)
|
|
14
|
+
@x = _validate_coordinate(:x, value)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Set the y position (numeric only — see `x=`).
|
|
18
|
+
def y=(value)
|
|
19
|
+
@y = _validate_coordinate(:y, value)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Get the rotation center x coordinate (defaults to the text's center)
|
|
23
|
+
def rx
|
|
24
|
+
@_user_rx.nil? ? @x + @width / 2.0 : @_user_rx
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Get the rotation center y coordinate
|
|
28
|
+
def ry
|
|
29
|
+
@_user_ry.nil? ? @y + @height / 2.0 : @_user_ry
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Set the rotation center x coordinate
|
|
33
|
+
def rx=(val)
|
|
34
|
+
@_user_rx = val
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Set the rotation center y coordinate
|
|
38
|
+
def ry=(val)
|
|
39
|
+
@_user_ry = val
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Create a bitmap text object
|
|
43
|
+
def initialize(content, x: 0, y: 0, z: 0, scale: 3,
|
|
44
|
+
rotate: 0, rx: nil, ry: nil,
|
|
45
|
+
color: nil, colour: nil, opacity: nil,
|
|
46
|
+
add: true, visible: true)
|
|
47
|
+
self.x = x
|
|
48
|
+
self.y = y
|
|
49
|
+
@z = z
|
|
50
|
+
@rotate = rotate
|
|
51
|
+
@_user_rx = rx
|
|
52
|
+
@_user_ry = ry
|
|
53
|
+
@content = content.to_s
|
|
54
|
+
@scale = validate_scale(scale)
|
|
55
|
+
|
|
56
|
+
self.color = color || colour || 'white'
|
|
57
|
+
self.opacity = opacity unless opacity.nil?
|
|
58
|
+
Ext.bitmap_text_create(self)
|
|
59
|
+
|
|
60
|
+
@visible = visible
|
|
61
|
+
self.add if add
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Set the text content. A no-op when the content is unchanged — rebuilding
|
|
65
|
+
# the texture is the expensive part, and per-frame assignments of the same
|
|
66
|
+
# string (HUDs, score counters) are common.
|
|
67
|
+
def content=(msg)
|
|
68
|
+
msg = msg.to_s
|
|
69
|
+
return if msg == @content
|
|
70
|
+
|
|
71
|
+
@content = msg
|
|
72
|
+
Ext.bitmap_text_create(self)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Set the scale. A no-op when unchanged, like `content=` — rebuilding the
|
|
76
|
+
# texture is the expensive part.
|
|
77
|
+
def scale=(s)
|
|
78
|
+
s = validate_scale(s)
|
|
79
|
+
return if s == @scale
|
|
80
|
+
|
|
81
|
+
@scale = s
|
|
82
|
+
Ext.bitmap_text_create(self)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Render the text. Called with overrides for one-shot rendering inside a
|
|
86
|
+
# render block; with no arguments it draws the same frame the scene graph
|
|
87
|
+
# does (delegating to `_render_scene`).
|
|
88
|
+
def render(x: nil, y: nil, scale: nil, rotate: nil, color: nil, colour: nil, opacity: nil)
|
|
89
|
+
if x.nil? && y.nil? && scale.nil? && rotate.nil? && color.nil? && colour.nil? && opacity.nil?
|
|
90
|
+
return _render_scene
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
Window.render_ready_check
|
|
94
|
+
|
|
95
|
+
saved_x, saved_y = @x, @y
|
|
96
|
+
saved_scale = @scale
|
|
97
|
+
saved_rotate = @rotate
|
|
98
|
+
saved_color = @color
|
|
99
|
+
|
|
100
|
+
@x = x if x
|
|
101
|
+
@y = y if y
|
|
102
|
+
@scale = validate_scale(scale) if scale
|
|
103
|
+
@rotate = rotate if rotate
|
|
104
|
+
|
|
105
|
+
c = color || colour
|
|
106
|
+
if c || opacity
|
|
107
|
+
@color = c ? Color.new(c) : Color.new(saved_color)
|
|
108
|
+
@color.opacity = opacity if opacity
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
begin
|
|
112
|
+
Ext.bitmap_text_draw(self, rx, ry)
|
|
113
|
+
ensure
|
|
114
|
+
@x, @y = saved_x, saved_y
|
|
115
|
+
@scale = saved_scale
|
|
116
|
+
@rotate = saved_rotate
|
|
117
|
+
@color = saved_color
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
# Scene-graph draw hook (see Renderable#_render_scene): `render` with no
|
|
124
|
+
# overrides, minus its keyword handling — a zero-arg call into a
|
|
125
|
+
# keyword-heavy `render` still pays microseconds of keyword setup on wasm
|
|
126
|
+
# mruby.
|
|
127
|
+
def _render_scene
|
|
128
|
+
Ext.bitmap_text_draw(self, rx, ry)
|
|
129
|
+
end
|
|
130
|
+
public :_render_scene
|
|
131
|
+
|
|
132
|
+
def _validate_coordinate(axis, value)
|
|
133
|
+
unless value.is_a?(Numeric)
|
|
134
|
+
raise Error,
|
|
135
|
+
"BitmapText #{axis} must be a number; symbolic alignment " \
|
|
136
|
+
"(e.g. #{axis}: :center) is not supported — use Text instead"
|
|
137
|
+
end
|
|
138
|
+
value
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Ensure the scale is a positive number, raising a clear error instead of
|
|
142
|
+
# letting an invalid value reach the native renderer (where a non-numeric
|
|
143
|
+
# value surfaces as a cryptic `TypeError` and zero/negative silently builds
|
|
144
|
+
# a blank, zero-or-negative-sized texture). Coerce to the same integer the
|
|
145
|
+
# native renderer uses (truncation toward zero) so the `scale` reader equals
|
|
146
|
+
# the scale actually rendered — e.g. `scale: 2.9` renders and reports 2.
|
|
147
|
+
def validate_scale(scale)
|
|
148
|
+
unless scale.is_a?(Numeric) && scale > 0
|
|
149
|
+
raise Error, "BitmapText scale must be a positive number, got #{scale.inspect}"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
scale.to_i
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|