From 48759c4025aee364cc5f98095e175ca2dc3bb6a8 Mon Sep 17 00:00:00 2001 From: fifth_light Date: Tue, 7 Oct 2025 16:22:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bazelignore | 6 + .bazelrc | 29 + .bazelversion | 2 +- .clang-format | 7 + .github/workflows/build.yml | 2 +- .gitignore | 7 + BUILD.bazel | 7 + MODULE.bazel | 36 +- MODULE.bazel.lock | 2873 +++-------------- blazerod/example/ball_block/BUILD.bazel | 6 - blazerod/model/model-assimp/BUILD.bazel | 1 + blazerod/model/model-base/Model.kt | 1 + blazerod/model/model-base/NodeComponent.kt | 14 +- blazerod/model/model-base/PhysicsJoint.kt | 22 + blazerod/model/model-base/RigidBody.kt | 37 + blazerod/model/model-pmx/PmxLoader.kt | 175 +- .../model/model-pmx/format/PmxDisplayFrame.kt | 14 + blazerod/model/model-pmx/format/PmxJoint.kt | 23 + .../model/model-pmx/format/PmxRigidBody.kt | 33 + blazerod/render/fabric/BUILD.bazel | 2 + blazerod/render/fabric/BlazeRodFabric.kt | 3 + blazerod/render/game/BUILD.bazel | 1 - blazerod/render/main/BUILD.bazel | 2 + blazerod/render/main/animation/BUILD.bazel | 1 + blazerod/render/main/layout/BUILD.bazel | 2 +- blazerod/render/main/layout/LayoutStrategy.kt | 40 +- blazerod/render/main/physics/BUILD.bazel | 62 + .../render/main/physics/PhysicsInterface.kt | 8 + .../render/main/physics/PhysicsLibrary.java | 138 + blazerod/render/main/physics/PhysicsScene.cpp | 100 + blazerod/render/main/physics/PhysicsScene.h | 74 + blazerod/render/main/physics/PhysicsScene.kt | 86 + blazerod/render/main/physics/PhysicsWorld.cpp | 259 ++ blazerod/render/main/physics/PhysicsWorld.h | 48 + blazerod/render/main/physics/PhysicsWorld.kt | 52 + blazerod/render/main/physics/binding.cpp | 127 + blazerod/render/main/runtime/BUILD.bazel | 1 + .../render/main/runtime/ModelInstanceImpl.kt | 5 + .../render/main/runtime/RenderSceneImpl.kt | 30 + blazerod/render/main/runtime/load/BUILD.bazel | 1 + .../render/main/runtime/load/ModelLoadInfo.kt | 8 + .../main/runtime/load/ModelPreprocessor.kt | 32 + .../main/runtime/load/ModelResourceLoader.kt | 1 + .../main/runtime/load/SceneReconstructor.kt | 8 + .../render/main/runtime/node/UpdatePhase.kt | 6 + .../main/runtime/node/component/BoxUtil.kt | 210 +- .../node/component/RenderNodeComponent.kt | 13 +- .../node/component/RigidBodyComponent.kt | 35 + .../render/main/runtime/renderer/BUILD.bazel | 1 + .../render/main/runtime/resource/BUILD.bazel | 22 + .../runtime/resource/RenderPhysicsJoint.kt | 19 + blazerod/render/neoforge/BUILD.bazel | 2 + blazerod/render/neoforge/BlazeRodNeoForge.kt | 3 + external/rules_kotlin/patches/BUILD.bazel | 0 game/BUILD.bazel | 1 - game/neoforge_yarn_fix.tiny | 10 +- maven_install.json | 130 +- mod/BUILD.bazel | 2 + mod/src/game/BUILD.bazel | 1 - platforms/BUILD.bazel | 55 + platforms/platforms.bzl | 59 + rule/cc_jni_library.bzl | 155 + 62 files changed, 2459 insertions(+), 2651 deletions(-) create mode 100644 .clang-format create mode 100644 blazerod/model/model-base/PhysicsJoint.kt create mode 100644 blazerod/model/model-base/RigidBody.kt create mode 100644 blazerod/model/model-pmx/format/PmxDisplayFrame.kt create mode 100644 blazerod/model/model-pmx/format/PmxJoint.kt create mode 100644 blazerod/model/model-pmx/format/PmxRigidBody.kt create mode 100644 blazerod/render/main/physics/BUILD.bazel create mode 100644 blazerod/render/main/physics/PhysicsInterface.kt create mode 100644 blazerod/render/main/physics/PhysicsLibrary.java create mode 100644 blazerod/render/main/physics/PhysicsScene.cpp create mode 100644 blazerod/render/main/physics/PhysicsScene.h create mode 100644 blazerod/render/main/physics/PhysicsScene.kt create mode 100644 blazerod/render/main/physics/PhysicsWorld.cpp create mode 100644 blazerod/render/main/physics/PhysicsWorld.h create mode 100644 blazerod/render/main/physics/PhysicsWorld.kt create mode 100644 blazerod/render/main/physics/binding.cpp create mode 100644 blazerod/render/main/runtime/node/component/RigidBodyComponent.kt create mode 100644 blazerod/render/main/runtime/resource/BUILD.bazel create mode 100644 blazerod/render/main/runtime/resource/RenderPhysicsJoint.kt delete mode 100644 external/rules_kotlin/patches/BUILD.bazel create mode 100644 platforms/BUILD.bazel create mode 100644 platforms/platforms.bzl create mode 100644 rule/cc_jni_library.bzl diff --git a/.bazelignore b/.bazelignore index e69de29b..754cb609 100644 --- a/.bazelignore +++ b/.bazelignore @@ -0,0 +1,6 @@ +compile_commands.json +.cache +.idea +.kotlin +.vscode +external diff --git a/.bazelrc b/.bazelrc index 7f65dfb0..983e0788 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,3 +4,32 @@ common --tool_java_language_version=21 common --java_language_version=21 build --worker_max_multiplex_instances=KotlinKsp=1 +common --build_tag_filters=-only_build_when_release + +# Release builds +build:opt --copt -flto --copt -Os +build:opt --linkopt -flto +build:opt --strip=always +build:opt --compilation_mode=opt +build:opt --build_tag_filters= + +# Debug +build:dbg --strip=never +build:dbg --compilation_mode=dbg + +# Zig CC +build:linux --sandbox_add_mount_pair=/tmp +build:macos --sandbox_add_mount_pair=/var/tmp + +# Android Rules +common --android_platforms=@//:android_arm32,@//:android_arm64,@//:android_x86,@//:android_x86_64 + +# C++17 +common:linux --cxxopt=-std=c++17 +common:linux --host_cxxopt=-std=c++17 +common:macos --cxxopt=-std=c++17 +common:macos --host_cxxopt=-std=c++17 +common:windows --cxxopt=/std:c++17 +common:windows --host_cxxopt=/std:c++17 + +common --enable_platform_specific_config diff --git a/.bazelversion b/.bazelversion index 905c2439..7857a947 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -8.3.1 \ No newline at end of file +8.4.2 \ No newline at end of file diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..21b327fd --- /dev/null +++ b/.clang-format @@ -0,0 +1,7 @@ +BasedOnStyle: Google +BreakBeforeBraces: Attach +IndentWidth: 4 +ContinuationIndentWidth: 4 +TabWidth: 4 +UseTab: Never +ColumnLimit: 120 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96c9b546..72419f62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: repository-cache: true - name: build run: | - bazel build \ + bazel build --config opt \ --verbose_failures \ //mod:mod_fabric \ //mod:mod_neoforge \ diff --git a/.gitignore b/.gitignore index 079d090f..fcc31bab 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ local.properties *.iml *.ipr *.iws +.clwb +.ijwb # vscode @@ -44,6 +46,11 @@ replay_*.log .kotlin +# clangd +compile_commands.json +.cache + # bazel .bazelbsp bazel-* +external diff --git a/BUILD.bazel b/BUILD.bazel index 1e985d08..6f395a3b 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -5,6 +5,13 @@ load("//:properties.bzl", "mod_version") load("@rules_java//java:defs.bzl", "java_plugin") load("@rules_java//java:defs.bzl", "java_library") +config_setting( + name = "config_release", + values = { + "compilation_mode": "opt", + }, +) + kt_compiler_plugin( name = "serialization_plugin", compile_phase = True, diff --git a/MODULE.bazel b/MODULE.bazel index 23c53f73..998ec5f5 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -11,10 +11,35 @@ module( version = "0.0.8", ) -bazel_dep(name = "rules_java", version = "8.12.0") +bazel_dep(name = "rules_java", version = "8.16.1") bazel_dep(name = "rules_kotlin", version = "2.1.9") -bazel_dep(name = "rules_jvm_external", version = "6.7") -bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "rules_jvm_external", version = "6.8") +bazel_dep(name = "bazel_skylib", version = "1.8.2") +bazel_dep(name = "bazel_lib", version = "3.0.0-rc.0") +bazel_dep(name = "rules_cc", version = "0.2.9") +bazel_dep(name = "platforms", version = "1.0.0") +bazel_dep(name = "rules_android_ndk", version = "0.1.3") +bazel_dep(name = "rules_jni", version = "0.11.0") +bazel_dep(name = "bullet", version = "3.26.0-rc0") +bazel_dep(name = "hermetic_cc_toolchain", version = "4.0.1") +bazel_dep(name = "hedron_compile_commands", dev_dependency = True) +git_override( + module_name = "hedron_compile_commands", + remote = "https://github.com/hedronvision/bazel-compile-commands-extractor.git", + commit = "abb61a688167623088f8768cc9264798df6a9d10", +) + +androidndk = use_extension("@rules_android_ndk//:extension.bzl", "android_ndk_repository_extension") +use_repo(androidndk, "androidndk") +register_toolchains("@androidndk//:all") + +zig_cc = use_extension("@hermetic_cc_toolchain//toolchain:ext.bzl", "toolchains") +use_repo(zig_cc, "zig_sdk") + +register_toolchains( + "@zig_sdk//toolchain/...", + "@zig_sdk//libc_aware/toolchain/...", +) maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") maven.install( @@ -96,6 +121,10 @@ maven.install( lock_file = "//:maven_install.json", fetch_sources = True, ) +maven.amend_artifact( + coordinates = "net.fabricmc.fabric-api:fabric-api", + exclusions = ["net.fabricmc.fabric-api:fabric-api-deprecated"], +) use_repo(maven, "maven") http_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar") @@ -135,6 +164,7 @@ http_archive( "@//third_party/mocha/patches:mutable_entity.patch", ], ) + # Download YSM for its bundled model http_archive( name = "yes_steve_model", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index d0d50737..35cf8d91 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -9,9 +9,17 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/source.json": "b88bff599ceaf0f56c264c749b1606f8485cec3b8c38ba30f88a4df9af142861", "https://bcr.bazel.build/modules/abseil-py/2.1.0/MODULE.bazel": "5ebe5bf853769c65707e5c28f216798f7a4b1042015e6a36e6d03094d94bec8a", "https://bcr.bazel.build/modules/abseil-py/2.1.0/source.json": "0e8fc4f088ce07099c1cd6594c20c7ddbb48b4b3c0849b7d94ba94be88ff042b", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442", + "https://bcr.bazel.build/modules/apple_support/1.23.1/source.json": "d888b44312eb0ad2c21a91d026753f330caa48a25c9b2102fae75eb2b0dcfdd2", "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", @@ -20,11 +28,19 @@ "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", "https://bcr.bazel.build/modules/bazel_features/1.25.0/MODULE.bazel": "e2e60a10a6da64bbf533f15ca652bf61a033e41c2ed734d79a9a08ba87f68c1a", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", "https://bcr.bazel.build/modules/bazel_features/1.30.0/source.json": "b07e17f067fe4f69f90b03b36ef1e08fe0d1f3cac254c1241a1818773e3423bc", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/source.json": "7051768079aa19302df2b9446ad0889839fd08b7d59851eba2c99234d665c9ba", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", @@ -36,7 +52,9 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.1/MODULE.bazel": "02a13b77321773b2042e70ee5e4c5e099c8ddee4cf2da9cd420442c36938d4bd", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/MODULE.bazel": "460aa12d01231a80cce03c548287b433b321d205b0028ae596728c35e5ee442e", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/source.json": "d353c410d47a8b65d09fa98e83d57ebec257a2c2b9c6e42d6fda1cb25e5464a5", @@ -44,6 +62,8 @@ "https://bcr.bazel.build/modules/bazel_worker_java/0.0.4/source.json": "a2d30458fd86cf022c2b6331e652526fa08e17573b2f5034a9dbcacdf9c2583c", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bullet/3.26.0-rc0/MODULE.bazel": "de3b9b442be2dde2087ce258a23958ce5094c60960a60edea202069b0438ad14", + "https://bcr.bazel.build/modules/bullet/3.26.0-rc0/source.json": "74d1d03ecb3cda422c40b9e3cd3f94751a3492d7f78bda2284ca5408e946b0bb", "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", @@ -53,19 +73,28 @@ "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_cc_toolchain/4.0.1/MODULE.bazel": "0809d28e562d804e478c683b06a9f3adeedccfdb42a426c2cc69e39cbc7e3bf3", + "https://bcr.bazel.build/modules/hermetic_cc_toolchain/4.0.1/source.json": "527d73a9964cd34ceeb73a1d5e5d04d9e6238401363c783c1f3021d5b25b8a63", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.11/source.json": "f7e188b79ebedebfe75e9e1d098b8845226c7992b307e28e1496f23112e8fc29", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", @@ -73,34 +102,47 @@ "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", "https://bcr.bazel.build/modules/protobuf/27.2/MODULE.bazel": "32450b50673882e4c8c3d10a83f3bc82161b213ed2f80d17e38bece8f165c295", "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", "https://bcr.bazel.build/modules/protobuf/29.3/MODULE.bazel": "77480eea5fb5541903e49683f24dc3e09f4a79e0eea247414887bb9fc0066e94", - "https://bcr.bazel.build/modules/protobuf/29.3/source.json": "c460e6550ddd24996232c7542ebf201f73c4e01d2183a31a041035fb50f19681", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/32.1/source.json": "bd2664e90875c0cd755d1d9b7a103a4b027893ac8eafa3bba087557ffc244ad4", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", "https://bcr.bazel.build/modules/rules_android/0.6.4/MODULE.bazel": "b4cde12d506dd65d82b2be39761f49f5797303343a3d5b4ee191c0cdf9ef387c", "https://bcr.bazel.build/modules/rules_android/0.6.4/source.json": "95d3c233c81005ad95eadc9382fde7dc6bd2c61752361e463264ee8349c071fb", + "https://bcr.bazel.build/modules/rules_android_ndk/0.1.3/MODULE.bazel": "3ca2a6bf93e33c696e0393ef86698d155f1b8c6f72e7418b782690a75bc1ab99", + "https://bcr.bazel.build/modules/rules_android_ndk/0.1.3/source.json": "2cc34cc412da45b81c82168252b8d347e108a62607b98a80afdf5f3787bc7cc0", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/source.json": "d8b5fe461272018cc07cfafce11fe369c7525330804c37eec5a82f84cd475366", "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/source.json": "d61627377bd7dd1da4652063e368d9366fc9a73920bfa396798ad92172cf645c", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_cc/0.2.9/MODULE.bazel": "34263f1dca62ea664265438cef714d7db124c03e1ed55ebb4f1dc860164308d1", + "https://bcr.bazel.build/modules/rules_cc/0.2.9/source.json": "4e49b40effcbd14fbfb233eb929de42dfff7b66538b4ffda310ad501638e7986", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", @@ -120,11 +162,17 @@ "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.12.0/MODULE.bazel": "8e6590b961f2defdfc2811c089c75716cb2f06c8a4edeb9a8d85eaa64ee2a761", - "https://bcr.bazel.build/modules/rules_java/8.12.0/source.json": "cbd5d55d9d38d4008a7d00bee5b5a5a4b6031fcd4a56515c9accbcd42c7be2ba", + "https://bcr.bazel.build/modules/rules_java/8.14.0/MODULE.bazel": "717717ed40cc69994596a45aec6ea78135ea434b8402fb91b009b9151dd65615", + "https://bcr.bazel.build/modules/rules_java/8.16.1/MODULE.bazel": "0f20b1cecaa8e52f60a8f071e59a20b4e3b9a67f6c56c802ea256f6face692d3", + "https://bcr.bazel.build/modules/rules_java/8.16.1/source.json": "072f8d11264edc499621be2dc9ea01d6395db5aa6f8799c034ae01a3e857f2e4", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", "https://bcr.bazel.build/modules/rules_java/8.6.3/MODULE.bazel": "e90505b7a931d194245ffcfb6ff4ca8ef9d46b4e830d12e64817752e0198e2ed", "https://bcr.bazel.build/modules/rules_java/8.9.0/MODULE.bazel": "e17c876cb53dcd817b7b7f0d2985b710610169729e8c371b2221cacdcd3dce4a", + "https://bcr.bazel.build/modules/rules_jni/0.11.0/MODULE.bazel": "f701405ceafc721bd6e1d6efee0094e941dc92e0652f73f431878a22aab0ba48", + "https://bcr.bazel.build/modules/rules_jni/0.11.0/source.json": "368017b9548943ad80c741547c6912273e2d255b6d1c580a7afe60a1fef912bc", "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", @@ -134,7 +182,8 @@ "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", "https://bcr.bazel.build/modules/rules_jvm_external/6.6/MODULE.bazel": "153042249c7060536dc95b6bb9f9bb8063b8a0b0cb7acdb381bddbc2374aed55", "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.8/MODULE.bazel": "b5afe861e867e4c8e5b88e401cb7955bd35924258f97b1862cc966cbcf4f1a62", + "https://bcr.bazel.build/modules/rules_jvm_external/6.8/source.json": "c85e553d5ac17f7825cd85b9cceb500c64f9e44f0e93c7887469e430c4ae9eff", "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", "https://bcr.bazel.build/modules/rules_kotlin/1.9.5/MODULE.bazel": "043a16a572f610558ec2030db3ff0c9938574e7dd9f58bded1bb07c0192ef025", "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", @@ -153,30 +202,40 @@ "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", "https://bcr.bazel.build/modules/rules_python/0.37.1/MODULE.bazel": "3faeb2d9fa0a81f8980643ee33f212308f4d93eea4b9ce6f36d0b742e71e9500", "https://bcr.bazel.build/modules/rules_python/0.37.2/MODULE.bazel": "b5ffde91410745750b6c13be1c5dc4555ef5bc50562af4a89fd77807fdde626a", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", - "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.4.1/source.json": "8ec8c90c70ccacc4de8ca1b97f599e756fb59173e898ee08b733006650057c07", "https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/MODULE.bazel": "d44fec647d0aeb67b9f3b980cf68ba634976f3ae7ccd6c07d790b59b87a4f251", "https://bcr.bazel.build/modules/rules_robolectric/4.14.1.2/source.json": "37c10335f2361c337c5c1f34ed36d2da70534c23088062b33a8bdaab68aa9dea", "https://bcr.bazel.build/modules/rules_shell/0.1.2/MODULE.bazel": "66e4ca3ce084b04af0b9ff05ff14cab4e5df7503973818bb91cbc6cda08d32fc", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/source.json": "4757bd277fe1567763991c4425b483477bb82e35e777a56fd846eb5cceda324a", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", - "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/source.json": "32bd87e5f4d7acc57c5b2ff7c325ae3061d5e242c0c4c214ae87e0f1c13e54cb", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", @@ -189,7 +248,7 @@ "moduleExtensions": { "//repo:minecraft_jar.bzl%minecraft": { "general": { - "bzlTransitiveDigest": "Mdwk9GKdFWcKIyCT5bDzoT/bFA9AZUeqfX1DlS7Xu5Y=", + "bzlTransitiveDigest": "Eds32TnV4k57tLvAhuXuQCi+eU/saqzbAG9WUNWXNJQ=", "usagesDigest": "UFjrwsY3vWqmZjXdFn/T3LUFhBCN8HhPLNc+028gc+Q=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -5428,7 +5487,7 @@ }, "//repo:neoforge.bzl%neoforge": { "general": { - "bzlTransitiveDigest": "S9injz8hSg5KmWpPov/oRPXmmxI2sXqp9L01BC/JhZQ=", + "bzlTransitiveDigest": "8BKfuinWElfHOfj2862ip2WcC3BuClSljOxlCnZ4Ru0=", "usagesDigest": "QS0phbn+iBZ5q/IShtEuZEG+ob9sYqo6gA/sBEnNzYw=", "recordedFileInputs": { "@@//neoforge_pin.txt": "15cd6729f1724607c0d2fc29d8191457f3f0f0840db75ba86af4cae2dee6a649" @@ -5827,7 +5886,7 @@ }, "//repo:neoform.bzl%neoform": { "general": { - "bzlTransitiveDigest": "b/C6dub6Gpc3dUbolAJGcGDRvVIKPrPy3WtNAvY3Bcw=", + "bzlTransitiveDigest": "T+N1KIwwFz/gRxs+1xEsx1xOlH0iCdTb7SaMO1x2rr8=", "usagesDigest": "YZNw+dRMsCrQhXzCz696pvevyiRZKUviwXnhdLqL6tY=", "recordedFileInputs": { "@@//neoform_pin.txt": "3a850058ea4a5edb9f05d9de951c11caeab44f1f66e23e50cbb6a6e4835b49d5" @@ -5948,27 +6007,73 @@ ] } }, - "@@pybind11_bazel+//:python_configure.bzl%extension": { + "@@hedron_compile_commands+//:workspace_setup.bzl%hedron_compile_commands_extension": { "general": { - "bzlTransitiveDigest": "OMjJ8aOAn337bDg7jdyvF/juIrC2PpUcX6Dnf+nhcF0=", - "usagesDigest": "fycyB39YnXIJkfWCIXLUKJMZzANcuLy9ZE73hRucjFk=", + "bzlTransitiveDigest": "siT11xF7DrVP+vNIWL9aNqCr+MaMkPnbE4Dne13iV7o=", + "usagesDigest": "CbJ2MjubH36j9xaONhhASfhodhpi5fzvuyg/IW2f7Ds=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": {}, + "recordedRepoMappingEntries": [ + [ + "hedron_compile_commands+", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@hedron_compile_commands+//:workspace_setup_transitive.bzl%hedron_compile_commands_extension": { + "general": { + "bzlTransitiveDigest": "IfDf0vEa2jjQ11RNpUM0u4xftPXIs+pyM8IMVkRqVMk=", + "usagesDigest": "yxZQbFglJyjpn7JZ9mhIc3EhLzZivlbs6wiHWOKJ/UA=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": {}, + "recordedRepoMappingEntries": [] + } + }, + "@@hedron_compile_commands+//:workspace_setup_transitive_transitive.bzl%hedron_compile_commands_extension": { + "general": { + "bzlTransitiveDigest": "1p58k3o2Jgjt/pBE7cb8WmmkplrSguIKma/h32x7X10=", + "usagesDigest": "GkOuy/k8wz0dbKMeEJFKEJB3CWkMZt3DYcPgj4lALkI=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": {}, + "recordedRepoMappingEntries": [] + } + }, + "@@hedron_compile_commands+//:workspace_setup_transitive_transitive_transitive.bzl%hedron_compile_commands_extension": { + "general": { + "bzlTransitiveDigest": "arNWX4EleUjJxqkM5nCRTj+ce05Zz1gSdGH1DCKOoLs=", + "usagesDigest": "WZExKK/BI4lqpUZfPpv4YARDE1Y7igQB+wYGKvNoCKs=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": {}, + "recordedRepoMappingEntries": [] + } + }, + "@@pybind11_bazel+//:internal_configure.bzl%internal_configure_extension": { + "general": { + "bzlTransitiveDigest": "G7xCmtNWXRuBtChRgB5OK5+gmM8Uoy8Mec/B7j3fhqs=", + "usagesDigest": "D1r3lfzMuUBFxgG8V6o0bQTLMk3GkaGOaPzw53wrwyw=", "recordedFileInputs": { - "@@pybind11_bazel+//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" + "@@pybind11_bazel+//MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34" }, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "local_config_python": { - "repoRuleId": "@@pybind11_bazel+//:python_configure.bzl%python_configure", - "attributes": {} - }, "pybind11": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file": "@@pybind11_bazel+//:pybind11.BUILD", - "strip_prefix": "pybind11-2.11.1", + "build_file": "@@pybind11_bazel+//:pybind11-BUILD.bazel", + "strip_prefix": "pybind11-2.12.0", "urls": [ - "https://github.com/pybind/pybind11/archive/v2.11.1.zip" + "https://github.com/pybind/pybind11/archive/v2.12.0.zip" ] } } @@ -5984,7 +6089,7 @@ }, "@@rules_android+//bzlmod_extensions:apksig.bzl%apksig_extension": { "general": { - "bzlTransitiveDigest": "6NJSHjev77G4XUXqswn+uU8LwqBD5JUgxtcFMWhBJUQ=", + "bzlTransitiveDigest": "oNxmR17oNBDtqdMtQ04f77G1dxpDmcW7KbgGb9I5vp0=", "usagesDigest": "0FXD4PX+vQ/jVne2oV4v3Cw5Mc9DZQ4yTcoRkAjj/X4=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -6023,83 +6128,126 @@ "recordedRepoMappingEntries": [] } }, - "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { + "@@rules_android_ndk+//:extension.bzl%android_ndk_repository_extension": { "general": { - "bzlTransitiveDigest": "lxvzPQyluk241QRYY81nZHOcv5Id/5U2y6dp42qibis=", - "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", + "bzlTransitiveDigest": "oV/TPZWCXAAcpJG/DBV/lNiWCISUTk5ba0KRjUb7adg=", + "usagesDigest": "g2/MdupWKJgT6ImbwUjfhVoWFL1jo69Asr9A2fs3LOA=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "platforms": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" - ], - "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" - } - }, - "rules_python": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", - "strip_prefix": "rules_python-0.28.0", - "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" - } - }, - "bazel_skylib": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" - ] - } - }, - "com_google_absl": { + "androidndk": { + "repoRuleId": "@@rules_android_ndk+//:rules.bzl%android_ndk_repository", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [] + } + }, + "@@rules_apple+//apple:apple.bzl%provisioning_profile_repository_extension": { + "general": { + "bzlTransitiveDigest": "CUIdbxeGZ+GPvVqbCkw9HQeJLsqeG3I1pJQ+oyZr/D4=", + "usagesDigest": "vsJl8Rw5NL+5Ag2wdUDoTeRF/5klkXO8545Iy7U1Q08=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_provisioning_profiles": { + "repoRuleId": "@@rules_apple+//apple/internal:local_provisioning_profiles.bzl%provisioning_profile_repository", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "apple_support+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "bazel_tools", + "rules_cc", + "rules_cc+" + ], + [ + "rules_apple+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "rules_apple+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_apple+", + "build_bazel_apple_support", + "apple_support+" + ], + [ + "rules_apple+", + "build_bazel_rules_swift", + "rules_swift+" + ], + [ + "rules_cc+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_cc+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_swift+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "rules_swift+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_swift+", + "build_bazel_apple_support", + "apple_support+" + ], + [ + "rules_swift+", + "build_bazel_rules_swift", + "rules_swift+" + ], + [ + "rules_swift+", + "build_bazel_rules_swift_local_config", + "rules_swift++non_module_deps+build_bazel_rules_swift_local_config" + ] + ] + } + }, + "@@rules_apple+//apple:extensions.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "hZq9NZQ3DfMM3SejWMrPlGSZAv38GRVt6iSG5FbwbhQ=", + "usagesDigest": "M3VqFpeTCo4qmrNKGZw0dxBHvTYDrfV3cscGzlSAhQ4=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "xctestrunner": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { "urls": [ - "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" + "https://github.com/google/xctestrunner/archive/b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6.tar.gz" ], - "strip_prefix": "abseil-cpp-20240116.1", - "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" - } - }, - "rules_fuzzing_oss_fuzz": { - "repoRuleId": "@@rules_fuzzing+//fuzzing/private/oss_fuzz:repository.bzl%oss_fuzz_repository", - "attributes": {} - }, - "honggfuzz": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "build_file": "@@rules_fuzzing+//:honggfuzz.BUILD", - "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", - "url": "https://github.com/google/honggfuzz/archive/2.5.zip", - "strip_prefix": "honggfuzz-2.5" - } - }, - "rules_fuzzing_jazzer": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", - "attributes": { - "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" - } - }, - "rules_fuzzing_jazzer_api": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", - "attributes": { - "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" + "strip_prefix": "xctestrunner-b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6", + "sha256": "ae3a063c985a8633cb7eb566db21656f8db8eb9a0edb8c182312c7f0db53730d" } } }, "recordedRepoMappingEntries": [ [ - "rules_fuzzing+", + "rules_apple+", "bazel_tools", "bazel_tools" ] @@ -6108,7 +6256,7 @@ }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "cRBMSVZP8qIwZJjb9A1of93/NH5o150OMcFHXhF3AbY=", + "bzlTransitiveDigest": "BpKZEsNfgjUOuN2PY8cZR/67fJnftlcLJE4ZBh7TZ58=", "usagesDigest": "MuUr8937cYwHs/gXOtu14rgCs0SvEk3vOhpKwe7uBqU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -6196,2496 +6344,197 @@ ] } }, - "@@rules_python+//python/private/pypi:pip.bzl%pip_internal": { + "@@rules_python+//python/uv:uv.bzl%uv": { "general": { - "bzlTransitiveDigest": "fJjQNC+o4eB1XrZRM+9nE42l7O8O3rAgGndawb2H1sw=", - "usagesDigest": "OLoIStnzNObNalKEMRq99FqenhPGLFZ5utVLV4sz7OI=", - "recordedFileInputs": { - "@@rules_python+//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc", - "@@rules_python+//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", - "@@rules_python+//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556" - }, + "bzlTransitiveDigest": "Xpqjnjzy6zZ90Es9Wa888ZLHhn7IsNGbph/e6qoxzw8=", + "usagesDigest": "4JapxcpS0mL3524k0TZJffAtVyuRjDHZvN9kBRxxF1U=", + "recordedFileInputs": {}, "recordedDirentsInputs": {}, - "envVariables": { - "RULES_PYTHON_REPO_DEBUG": null, - "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null - }, + "envVariables": {}, "generatedRepoSpecs": { - "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "backports.tarfile-1.2.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", - "urls": [ - "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" ], - "filename": "backports_tarfile-1.2.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", - "urls": [ - "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" - ] + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} } - }, - "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_python+", + "platforms", + "platforms" + ] + ] + } + }, + "@@rules_swift+//swift:extensions.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "7HCu9g5L/A6rnapg3vth7ZT5JAXGhHB5cfk39qhGYuM=", + "usagesDigest": "mhACFnrdMv9Wi0Mt67bxocJqviRkDSV+Ee5Mqdj5akA=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_apple_swift_protobuf": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "certifi-2024.8.30-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "certifi==2024.8.30", - "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", "urls": [ - "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_certifi_sdist_bec941d2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "https://github.com/apple/swift-protobuf/archive/1.20.2.tar.gz" ], - "filename": "certifi-2024.8.30.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "certifi==2024.8.30", - "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", - "urls": [ - "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" - ] + "sha256": "3fb50bd4d293337f202d917b6ada22f9548a0a0aed9d9a4d791e6fbd8a246ebb", + "strip_prefix": "swift-protobuf-1.20.2/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_protobuf/BUILD.overlay" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_grpc_grpc_swift": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", "urls": [ - "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" + "https://github.com/grpc/grpc-swift/archive/1.16.0.tar.gz" ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "urls": [ - "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] + "sha256": "58b60431d0064969f9679411264b82e40a217ae6bd34e17096d92cc4e47556a5", + "strip_prefix": "grpc-swift-1.16.0/", + "build_file": "@@rules_swift+//third_party:com_github_grpc_grpc_swift/BUILD.overlay" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_docc_symbolkit": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", "urls": [ - "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" + "https://github.com/apple/swift-docc-symbolkit/archive/refs/tags/swift-5.10-RELEASE.tar.gz" ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "urls": [ - "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "sha256": "de1d4b6940468ddb53b89df7aa1a81323b9712775b0e33e8254fa0f6f7469a97", + "strip_prefix": "swift-docc-symbolkit-swift-5.10-RELEASE", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_docc_symbolkit/BUILD.overlay" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_nio": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", "urls": [ - "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" + "https://github.com/apple/swift-nio/archive/2.42.0.tar.gz" ], - "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", - "urls": [ - "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" - ] + "sha256": "e3304bc3fb53aea74a3e54bd005ede11f6dc357117d9b1db642d03aea87194a0", + "strip_prefix": "swift-nio-2.42.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio/BUILD.overlay" } }, - "rules_python_publish_deps_311_cffi_sdist_1c39c601": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_nio_http2": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cffi-1.17.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", "urls": [ - "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-nio-http2/archive/1.26.0.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "urls": [ - "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" - ] + "sha256": "f0edfc9d6a7be1d587e5b403f2d04264bdfae59aac1d74f7d974a9022c6d2b25", + "strip_prefix": "swift-nio-http2-1.26.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_http2/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_nio_transport_services": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", "urls": [ - "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-nio-transport-services/archive/1.15.0.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "urls": [ - "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" - ] + "sha256": "f3498dafa633751a52b9b7f741f7ac30c42bcbeb3b9edca6d447e0da8e693262", + "strip_prefix": "swift-nio-transport-services-1.15.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_transport_services/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_nio_extras": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", "urls": [ - "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-nio-extras/archive/1.4.0.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "urls": [ - "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] + "sha256": "4684b52951d9d9937bb3e8ccd6b5daedd777021ef2519ea2f18c4c922843b52b", + "strip_prefix": "swift-nio-extras-1.4.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_extras/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_log": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", "urls": [ - "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-log/archive/1.4.4.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "urls": [ - "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "sha256": "48fe66426c784c0c20031f15dc17faf9f4c9037c192bfac2f643f65cb2321ba0", + "strip_prefix": "swift-log-1.4.4/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_log/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_nio_ssl": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", "urls": [ - "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-nio-ssl/archive/2.23.0.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "urls": [ - "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" - ] + "sha256": "4787c63f61dd04d99e498adc3d1a628193387e41efddf8de19b8db04544d016d", + "strip_prefix": "swift-nio-ssl-2.23.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_ssl/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_collections": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", "urls": [ - "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-collections/archive/1.0.4.tar.gz" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "urls": [ - "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" - ] + "sha256": "d9e4c8a91c60fb9c92a04caccbb10ded42f4cb47b26a212bc6b39cc390a4b096", + "strip_prefix": "swift-collections-1.0.4/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_collections/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "com_github_apple_swift_atomics": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", "urls": [ - "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "https://github.com/apple/swift-atomics/archive/1.1.0.tar.gz" ], - "filename": "charset_normalizer-3.4.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "urls": [ - "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" - ] + "sha256": "1bee7f469f7e8dc49f11cfa4da07182fbc79eab000ec2c17bfdce468c5d276fb", + "strip_prefix": "swift-atomics-1.1.0/", + "build_file": "@@rules_swift+//third_party:com_github_apple_swift_atomics/BUILD.overlay" } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "build_bazel_rules_swift_index_import": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "charset_normalizer-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "build_file": "@@rules_swift+//third_party:build_bazel_rules_swift_index_import/BUILD.overlay", + "canonical_id": "index-import-5.8", "urls": [ - "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" + "https://github.com/MobileNativeFoundation/index-import/releases/download/5.8.0.1/index-import.tar.gz" ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", - "urls": [ - "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] + "sha256": "28c1ffa39d99e74ed70623899b207b41f79214c498c603915aef55972a851a15" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", - "urls": [ - "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", - "urls": [ - "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", - "urls": [ - "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", - "urls": [ - "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", - "urls": [ - "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_sdist_315b9001": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cryptography-43.0.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", - "urls": [ - "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "docutils-0.21.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "docutils==0.21.2", - "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", - "urls": [ - "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "docutils-0.21.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "docutils==0.21.2", - "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", - "urls": [ - "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "idna-3.10-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "idna==3.10", - "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", - "urls": [ - "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_idna_sdist_12f65c9b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "idna-3.10.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "idna==3.10", - "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "importlib_metadata-8.5.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", - "urls": [ - "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "importlib_metadata-8.5.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", - "urls": [ - "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.classes-3.4.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", - "urls": [ - "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco.classes-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", - "urls": [ - "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.context-6.0.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", - "urls": [ - "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_context-6.0.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", - "urls": [ - "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.functools-4.1.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", - "urls": [ - "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_functools-4.1.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", - "urls": [ - "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "jeepney-0.8.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jeepney==0.8.0", - "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", - "urls": [ - "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jeepney-0.8.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jeepney==0.8.0", - "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", - "urls": [ - "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_keyring_py3_none_any_5426f817": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "keyring-25.4.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", - "urls": [ - "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "keyring-25.4.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", - "urls": [ - "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "markdown_it_py-3.0.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "urls": [ - "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "markdown-it-py-3.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", - "urls": [ - "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "mdurl-0.1.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "mdurl==0.1.2", - "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", - "urls": [ - "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "mdurl-0.1.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "mdurl==0.1.2", - "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", - "urls": [ - "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "more_itertools-10.5.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", - "urls": [ - "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "more-itertools-10.5.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", - "urls": [ - "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "urls": [ - "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "urls": [ - "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "urls": [ - "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "urls": [ - "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "urls": [ - "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "urls": [ - "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "urls": [ - "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "urls": [ - "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", - "urls": [ - "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "urls": [ - "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "urls": [ - "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-win_amd64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "urls": [ - "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_sdist_94a16692": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "nh3-0.2.18.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "urls": [ - "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "pkginfo-1.10.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", - "urls": [ - "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pkginfo-1.10.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "urls": [ - "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "pycparser-2.22-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", - "urls": [ - "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pycparser-2.22.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "urls": [ - "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "pygments-2.18.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", - "urls": [ - "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pygments_sdist_786ff802": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pygments-2.18.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "urls": [ - "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" - ], - "filename": "pywin32_ctypes-0.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", - "urls": [ - "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pywin32-ctypes-0.2.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", - "urls": [ - "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "readme_renderer-44.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", - "urls": [ - "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "readme_renderer-44.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", - "urls": [ - "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "requests-2.32.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", - "urls": [ - "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_requests_sdist_55365417": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-2.32.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "urls": [ - "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "requests_toolbelt-1.0.0-py2.py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", - "urls": [ - "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-toolbelt-1.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", - "urls": [ - "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "rfc3986-2.0.0-py2.py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rfc3986==2.0.0", - "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", - "urls": [ - "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "rfc3986-2.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rfc3986==2.0.0", - "sha256": "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", - "urls": [ - "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_rich_py3_none_any_9836f509": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "rich-13.9.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", - "urls": [ - "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "rich-13.9.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", - "urls": [ - "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "SecretStorage-3.3.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "secretstorage==3.3.3", - "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", - "urls": [ - "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "SecretStorage-3.3.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "secretstorage==3.3.3", - "sha256": "2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", - "urls": [ - "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "twine-5.1.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "urls": [ - "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_twine_sdist_9aa08251": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "twine-5.1.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", - "urls": [ - "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "urllib3-2.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "urls": [ - "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "urllib3-2.2.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", - "urls": [ - "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "zipp-3.20.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", - "urls": [ - "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "zipp-3.20.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", - "urls": [ - "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" - ] - } - }, - "rules_python_publish_deps": { - "repoRuleId": "@@rules_python+//python/private/pypi:hub_repository.bzl%hub_repository", - "attributes": { - "repo_name": "rules_python_publish_deps", - "extra_hub_aliases": {}, - "whl_map": { - "backports_tarfile": "[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"version\":\"3.11\"},{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"version\":\"3.11\"}]", - "certifi": "[{\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\",\"version\":\"3.11\"},{\"filename\":\"certifi-2024.8.30.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_bec941d2\",\"version\":\"3.11\"}]", - "cffi": "[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"version\":\"3.11\"}]", - "charset_normalizer": "[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"version\":\"3.11\"}]", - "cryptography": "[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"version\":\"3.11\"}]", - "docutils": "[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\",\"version\":\"3.11\"},{\"filename\":\"docutils-0.21.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\",\"version\":\"3.11\"}]", - "idna": "[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\",\"version\":\"3.11\"},{\"filename\":\"idna-3.10.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_12f65c9b\",\"version\":\"3.11\"}]", - "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"version\":\"3.11\"},{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"version\":\"3.11\"}]", - "jaraco_classes": "[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"version\":\"3.11\"},{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"version\":\"3.11\"}]", - "jaraco_context": "[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"version\":\"3.11\"},{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"version\":\"3.11\"}]", - "jaraco_functools": "[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"version\":\"3.11\"},{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"version\":\"3.11\"}]", - "jeepney": "[{\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\",\"version\":\"3.11\"},{\"filename\":\"jeepney-0.8.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\",\"version\":\"3.11\"}]", - "keyring": "[{\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"version\":\"3.11\"},{\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"version\":\"3.11\"}]", - "markdown_it_py": "[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"version\":\"3.11\"},{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"version\":\"3.11\"}]", - "mdurl": "[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\",\"version\":\"3.11\"},{\"filename\":\"mdurl-0.1.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\",\"version\":\"3.11\"}]", - "more_itertools": "[{\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"version\":\"3.11\"},{\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"version\":\"3.11\"}]", - "nh3": "[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"version\":\"3.11\"}]", - "pkginfo": "[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"version\":\"3.11\"},{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"version\":\"3.11\"}]", - "pycparser": "[{\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"version\":\"3.11\"},{\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"version\":\"3.11\"}]", - "pygments": "[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"version\":\"3.11\"},{\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"version\":\"3.11\"}]", - "pywin32_ctypes": "[{\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"version\":\"3.11\"},{\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"version\":\"3.11\"}]", - "readme_renderer": "[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"version\":\"3.11\"},{\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"version\":\"3.11\"}]", - "requests": "[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"version\":\"3.11\"},{\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"version\":\"3.11\"}]", - "requests_toolbelt": "[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"version\":\"3.11\"},{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"version\":\"3.11\"}]", - "rfc3986": "[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\",\"version\":\"3.11\"},{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\",\"version\":\"3.11\"}]", - "rich": "[{\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"version\":\"3.11\"},{\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"version\":\"3.11\"}]", - "secretstorage": "[{\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\",\"version\":\"3.11\"},{\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\",\"version\":\"3.11\"}]", - "twine": "[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"version\":\"3.11\"},{\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"version\":\"3.11\"}]", - "urllib3": "[{\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"version\":\"3.11\"},{\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"version\":\"3.11\"}]", - "zipp": "[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"version\":\"3.11\"},{\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"version\":\"3.11\"}]" - }, - "packages": [ - "backports_tarfile", - "certifi", - "charset_normalizer", - "docutils", - "idna", - "importlib_metadata", - "jaraco_classes", - "jaraco_context", - "jaraco_functools", - "keyring", - "markdown_it_py", - "mdurl", - "more_itertools", - "nh3", - "pkginfo", - "pygments", - "readme_renderer", - "requests", - "requests_toolbelt", - "rfc3986", - "rich", - "twine", - "urllib3", - "zipp" - ], - "groups": {} - } + "build_bazel_rules_swift_local_config": { + "repoRuleId": "@@rules_swift+//swift/internal:swift_autoconfiguration.bzl%swift_autoconfiguration", + "attributes": {} } }, "recordedRepoMappingEntries": [ [ - "bazel_features+", - "bazel_features_globals", - "bazel_features++version_extension+bazel_features_globals" - ], - [ - "bazel_features+", - "bazel_features_version", - "bazel_features++version_extension+bazel_features_version" - ], - [ - "rules_python+", - "bazel_features", - "bazel_features+" - ], - [ - "rules_python+", - "bazel_skylib", - "bazel_skylib+" - ], - [ - "rules_python+", + "rules_swift+", "bazel_tools", "bazel_tools" ], [ - "rules_python+", - "pypi__build", - "rules_python++internal_deps+pypi__build" - ], - [ - "rules_python+", - "pypi__click", - "rules_python++internal_deps+pypi__click" - ], - [ - "rules_python+", - "pypi__colorama", - "rules_python++internal_deps+pypi__colorama" - ], - [ - "rules_python+", - "pypi__importlib_metadata", - "rules_python++internal_deps+pypi__importlib_metadata" - ], - [ - "rules_python+", - "pypi__installer", - "rules_python++internal_deps+pypi__installer" - ], - [ - "rules_python+", - "pypi__more_itertools", - "rules_python++internal_deps+pypi__more_itertools" - ], - [ - "rules_python+", - "pypi__packaging", - "rules_python++internal_deps+pypi__packaging" - ], - [ - "rules_python+", - "pypi__pep517", - "rules_python++internal_deps+pypi__pep517" - ], - [ - "rules_python+", - "pypi__pip", - "rules_python++internal_deps+pypi__pip" - ], - [ - "rules_python+", - "pypi__pip_tools", - "rules_python++internal_deps+pypi__pip_tools" - ], - [ - "rules_python+", - "pypi__pyproject_hooks", - "rules_python++internal_deps+pypi__pyproject_hooks" - ], - [ - "rules_python+", - "pypi__setuptools", - "rules_python++internal_deps+pypi__setuptools" - ], - [ - "rules_python+", - "pypi__tomli", - "rules_python++internal_deps+pypi__tomli" - ], - [ - "rules_python+", - "pypi__wheel", - "rules_python++internal_deps+pypi__wheel" - ], - [ - "rules_python+", - "pypi__zipp", - "rules_python++internal_deps+pypi__zipp" - ], - [ - "rules_python+", - "pythons_hub", - "rules_python++python+pythons_hub" - ], - [ - "rules_python++python+pythons_hub", - "python_3_10_host", - "rules_python++python+python_3_10_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_11_host", - "rules_python++python+python_3_11_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_12_host", - "rules_python++python+python_3_12_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_8_host", - "rules_python++python+python_3_8_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_9_host", - "rules_python++python+python_3_9_host" + "rules_swift+", + "build_bazel_rules_swift", + "rules_swift+" ] ] } diff --git a/blazerod/example/ball_block/BUILD.bazel b/blazerod/example/ball_block/BUILD.bazel index c7aeffa2..9eb30258 100644 --- a/blazerod/example/ball_block/BUILD.bazel +++ b/blazerod/example/ball_block/BUILD.bazel @@ -4,7 +4,6 @@ load("//rule:apply_access_widener.bzl", "apply_access_widener") load("//rule/fabric:merge_jij.bzl", "fabric_merge_jij") load("//rule:remap_jar.bzl", "remap_jar") load("//rule:generate_remap_classpath.bzl", "generate_remap_classpath") -load("//rule:decompile_jar.bzl", "decompile_jar") load("//:properties.bzl", "game_version") remap_jar( @@ -32,11 +31,6 @@ apply_access_widener( srcs = [":access_widener_dep_named"], ) -decompile_jar( - name = "decompile_client_access_widened_named", - inputs = [":remapped_client_access_widened_named"], -) - java_library( name = "ball_block_unmapped", srcs = glob(["src/main/java/**/*.java"]), diff --git a/blazerod/model/model-assimp/BUILD.bazel b/blazerod/model/model-assimp/BUILD.bazel index e54be3a5..e3d94aa6 100644 --- a/blazerod/model/model-assimp/BUILD.bazel +++ b/blazerod/model/model-assimp/BUILD.bazel @@ -74,6 +74,7 @@ modrinth_dependency( upload_modrinth( name = "upload_modrinth", + tags = ["only_build_when_release"], token_secret_id = "modrinth_token", project_id = "xeMk2Ovz", version_name = blazerod_version, diff --git a/blazerod/model/model-base/Model.kt b/blazerod/model/model-base/Model.kt index 6550fb23..21293cd4 100644 --- a/blazerod/model/model-base/Model.kt +++ b/blazerod/model/model-base/Model.kt @@ -4,6 +4,7 @@ data class Model( val scenes: List, val defaultScene: Scene? = null, val skins: List, + val physicalJoints: List = listOf(), val expressions: List = listOf(), ) { init { diff --git a/blazerod/model/model-base/NodeComponent.kt b/blazerod/model/model-base/NodeComponent.kt index 22456532..ece7f4bf 100644 --- a/blazerod/model/model-base/NodeComponent.kt +++ b/blazerod/model/model-base/NodeComponent.kt @@ -24,6 +24,10 @@ sealed class NodeComponent { INFLUENCE_SOURCE( requireMesh = false, singleInstanceOnly = false, + ), + RIGID_BODY( + requireMesh = false, + singleInstanceOnly = false, ); companion object { @@ -67,4 +71,12 @@ sealed class NodeComponent { override val type: Type get() = Type.INFLUENCE_SOURCE } -} \ No newline at end of file + + data class RigidBodyComponent( + val rigidBodyId: RigidBodyId, + val rigidBody: RigidBody, + ) : NodeComponent() { + override val type: Type + get() = Type.RIGID_BODY + } +} diff --git a/blazerod/model/model-base/PhysicsJoint.kt b/blazerod/model/model-base/PhysicsJoint.kt new file mode 100644 index 00000000..a7dd867e --- /dev/null +++ b/blazerod/model/model-base/PhysicsJoint.kt @@ -0,0 +1,22 @@ +package top.fifthlight.blazerod.model + +import org.joml.Vector3fc + +data class PhysicalJoint( + val name: String? = null, + val type: JointType, + val rigidBodyA: RigidBodyId, + val rigidBodyB: RigidBodyId, + val position: Vector3fc, + val rotation: Vector3fc, + val positionMin: Vector3fc, + val positionMax: Vector3fc, + val rotationMin: Vector3fc, + val rotationMax: Vector3fc, + val positionSpring: Vector3fc, + val rotationSpring: Vector3fc, +) { + enum class JointType { + SPRING_6DOF, + } +} diff --git a/blazerod/model/model-base/RigidBody.kt b/blazerod/model/model-base/RigidBody.kt new file mode 100644 index 00000000..b8376c9d --- /dev/null +++ b/blazerod/model/model-base/RigidBody.kt @@ -0,0 +1,37 @@ +package top.fifthlight.blazerod.model + +import org.joml.Vector3fc +import java.util.* + +data class RigidBody( + val name: String? = null, + val collisionGroup: Int, + val collisionMask: Int, + val shape: ShapeType, + val shapeSize: Vector3fc, + val shapePosition: Vector3fc, + val shapeRotation: Vector3fc, + val mass: Float, + val moveAttenuation: Float, + val rotationDamping: Float, + val repulsion: Float, + val frictionForce: Float, + val physicsMode: PhysicsMode, +) { + enum class ShapeType { + SPHERE, + BOX, + CAPSULE, + } + + enum class PhysicsMode { + FOLLOW_BONE, + PHYSICS, + PHYSICS_PLUS_BONE, + } +} + +data class RigidBodyId( + val modelId: UUID, + val index: Int, +) diff --git a/blazerod/model/model-pmx/PmxLoader.kt b/blazerod/model/model-pmx/PmxLoader.kt index 152f9962..f21e653e 100644 --- a/blazerod/model/model-pmx/PmxLoader.kt +++ b/blazerod/model/model-pmx/PmxLoader.kt @@ -60,6 +60,7 @@ class PmxLoader : ModelFileLoader { private class Context( private val basePath: Path, ) { + private var version: Float = 0f private lateinit var globals: PmxGlobals private val decoder by lazy { globals.textEncoding.charset.newDecoder() @@ -84,6 +85,9 @@ class PmxLoader : ModelFileLoader { private lateinit var morphTargetGroups: List private val childBoneMap = mutableMapOf>() private val rootBones = mutableListOf() + private lateinit var rigidBodies: List + private var boneToRigidBodyMap = mutableMapOf>() + private lateinit var joints: List private fun loadRgbColor(buffer: ByteBuffer): RgbColor { if (buffer.remaining() < 3 * 4) { @@ -178,7 +182,7 @@ class PmxLoader : ModelFileLoader { 1 -> buffer.get().toInt() 2 -> buffer.getShort().toInt() 4 -> buffer.getInt() - else -> throw PmxLoadException("Bad texture index size: ${globals.boneIndexSize}") + else -> throw PmxLoadException("Bad texture index size: ${globals.textureIndexSize}") } private fun loadMorphIndex(buffer: ByteBuffer) = when (globals.morphIndexSize) { @@ -192,7 +196,14 @@ class PmxLoader : ModelFileLoader { 1 -> buffer.get().toUByte().toInt() 2 -> buffer.getShort().toUShort().toInt() 4 -> buffer.getInt() - else -> throw PmxLoadException("Bad vertex index size: ${globals.boneIndexSize}") + else -> throw PmxLoadException("Bad vertex index size: ${globals.vertexIndexSize}") + } + + private fun loadRigidBodyIndex(buffer: ByteBuffer): Int = when (globals.rigidBodyIndexSize) { + 1 -> buffer.get().toUByte().toInt() + 2 -> buffer.getShort().toUShort().toInt() + 4 -> buffer.getInt() + else -> throw PmxLoadException("Bad rigid body index size: ${globals.rigidBodyIndexSize}") } private fun loadString(buffer: ByteBuffer): String { @@ -221,6 +232,7 @@ class PmxLoader : ModelFileLoader { if (version < 2.0f) { throw PmxLoadException("Bad PMX version: at least 2.0, but get $version") } + this.version = version val globalsCount = buffer.get().toUByte().toInt() if (globalsCount < 8) { throw PmxLoadException("Bad global count: $globalsCount, at least 8") @@ -945,6 +957,141 @@ class PmxLoader : ModelFileLoader { morphTargetGroups = morphGroups } + private fun loadDisplayFrames(buffer: ByteBuffer) { + val displayFrameCount = buffer.getInt() + if (displayFrameCount < 0) { + throw PmxLoadException("Bad PMX model: display frames count less than zero") + } + val displayFrames = mutableListOf() + repeat(displayFrameCount) { + val nameLocal = loadString(buffer) + val nameUniversal = loadString(buffer) + val isSpecial = buffer.get() != 0.toByte() + val frameCount = buffer.getInt() + val frames = (0 until frameCount).map { + when (val type = buffer.get()) { + 0.toByte() -> PmxDisplayFrame.FrameData.Bone( + boneIndex = loadBoneIndex(buffer), + ) + + 1.toByte() -> PmxDisplayFrame.FrameData.Morph( + morphIndex = loadMorphIndex(buffer), + ) + + else -> throw PmxLoadException("Unknown frame type: $type") + } + } + displayFrames.add( + PmxDisplayFrame( + nameLocal = nameLocal, + nameUniversal = nameUniversal, + isSpecial = isSpecial, + frames = frames, + ) + ) + } + } + + private fun loadRigidBodies(buffer: ByteBuffer) { + val rigidBodyCount = buffer.getInt() + if (rigidBodyCount < 0) { + throw PmxLoadException("Bad PMX model: rigid bodies count less than zero") + } + + fun loadShapeType(byte: Byte): PmxRigidBody.ShapeType = when (byte.toInt()) { + 0 -> PmxRigidBody.ShapeType.SPHERE + 1 -> PmxRigidBody.ShapeType.BOX + 2 -> PmxRigidBody.ShapeType.CAPSULE + else -> throw PmxLoadException("Unsupported rigid body shape type: $byte") + } + + fun loadPhysicsMode(byte: Byte): PmxRigidBody.PhysicsMode = when (byte.toInt()) { + 0 -> PmxRigidBody.PhysicsMode.FOLLOW_BONE + 1 -> PmxRigidBody.PhysicsMode.PHYSICS + 2 -> PmxRigidBody.PhysicsMode.PHYSICS_PLUS_BONE + else -> throw PmxLoadException("Unsupported rigid body physics mode: $byte") + } + + rigidBodies = (0 until rigidBodyCount).map { index -> + PmxRigidBody( + nameLocal = loadString(buffer), + nameUniversal = loadString(buffer), + relatedBoneIndex = loadBoneIndex(buffer), + groupId = buffer.get().toUByte().toInt(), + nonCollisionGroup = buffer.getShort().toUShort().toInt(), + shape = loadShapeType(buffer.get()), + shapeSize = loadVector3f(buffer).mul(MMD_SCALE), + shapePosition = loadVector3f(buffer).transformPosition(), + shapeRotation = loadVector3f(buffer).also { it.x *= -1 }, + mass = buffer.getFloat(), + moveAttenuation = buffer.getFloat(), + rotationDamping = buffer.getFloat(), + repulsion = buffer.getFloat(), + frictionForce = buffer.getFloat(), + physicsMode = loadPhysicsMode(buffer.get()) + ).also { + if (it.relatedBoneIndex in bones.indices) { + boneToRigidBodyMap.getOrPut(it.relatedBoneIndex, ::mutableListOf).add(index) + } else if (bones.isNotEmpty()) { + // Allocate to first bone + // https://github.com/benikabocha/saba/blob/29b8efa8b31c8e746f9a88020fb0ad9dcdcf3332/src/Saba/Model/MMD/MMDPhysics.cpp#L434 + boneToRigidBodyMap.getOrPut(0, ::mutableListOf).add(index) + } else { + // No bone? Ignore + } + } + } + } + + private fun loadJoints(buffer: ByteBuffer) { + val jointCount = buffer.getInt() + if (jointCount < 0) { + throw PmxLoadException("Bad PMX model: joints count less than zero") + } + + fun loadJointType(byte: Byte): PmxJoint.JointType = PmxJoint.JointType.entries.firstOrNull { + byte.toInt() == it.value + } ?: throw PmxLoadException("Unsupported joint type: $byte") + + joints = (0 until jointCount).map { + val nameLocal = loadString(buffer) + val nameUniversal = loadString(buffer) + val type = loadJointType(buffer.get()) + val rigidBodyIndexA = loadRigidBodyIndex(buffer) + val rigidBodyIndexB = loadRigidBodyIndex(buffer) + val position = loadVector3f(buffer).transformPosition() + val rotation = loadVector3f(buffer).also { it.x *= -1; it.y *= -1 } + + val positionMinimumOrig = loadVector3f(buffer).transformPosition() + val positionMaximumOrig = loadVector3f(buffer).transformPosition() + val positionMinimum = Vector3f(positionMaximumOrig.x, positionMinimumOrig.y, positionMinimumOrig.z) + val positionMaximum = Vector3f(positionMinimumOrig.x, positionMaximumOrig.y, positionMaximumOrig.z) + + val rotationMinimumOrig = loadVector3f(buffer) + val rotationMaximumOrig = loadVector3f(buffer) + val rotationMinimum = Vector3f(-rotationMaximumOrig.x, rotationMinimumOrig.y, rotationMinimumOrig.z) + val rotationMaximum = Vector3f(-rotationMinimumOrig.x, rotationMaximumOrig.y, rotationMaximumOrig.z) + val positionSpring = loadVector3f(buffer).transformPosition() + val rotationSpring = loadVector3f(buffer).also { it.x *= -1 } + + PmxJoint( + nameLocal = nameLocal, + nameUniversal = nameUniversal, + type = type, + rigidBodyIndexA = rigidBodyIndexA, + rigidBodyIndexB = rigidBodyIndexB, + position = position, + rotation = rotation, + positionMinimum = positionMinimum, + positionMaximum = positionMaximum, + rotationMinimum = rotationMinimum, + rotationMaximum = rotationMaximum, + positionSpring = positionSpring, + rotationSpring = rotationSpring, + ) + } + } + private data class MaterialMorphData( val materialIndex: Int, val morphIndex: Int, @@ -1165,6 +1312,30 @@ class PmxLoader : ModelFileLoader { model = Model( scenes = listOf(scene), skins = listOf(skin), + physicalJoints = this.joints.mapNotNull { joint -> + if (joint.rigidBodyIndexA !in rigidBodies.indices) { + return@mapNotNull null + } + if (joint.rigidBodyIndexB !in rigidBodies.indices) { + return@mapNotNull null + } + PhysicalJoint( + name = joint.nameLocal.takeIf(String::isNotBlank), + type = when (joint.type) { + PmxJoint.JointType.SPRING_6DOF -> PhysicalJoint.JointType.SPRING_6DOF + }, + rigidBodyA = RigidBodyId(modelId, joint.rigidBodyIndexA), + rigidBodyB = RigidBodyId(modelId, joint.rigidBodyIndexB), + position = joint.position, + rotation = joint.rotation, + positionMin = joint.positionMinimum, + positionMax = joint.positionMaximum, + rotationMin = joint.rotationMinimum, + rotationMax = joint.rotationMaximum, + positionSpring = joint.positionSpring, + rotationSpring = joint.rotationSpring, + ) + }, expressions = buildList { for ((index, target) in morphTargets.withIndex()) { val expression = Expression.Target( diff --git a/blazerod/model/model-pmx/format/PmxDisplayFrame.kt b/blazerod/model/model-pmx/format/PmxDisplayFrame.kt new file mode 100644 index 00000000..2c753ac1 --- /dev/null +++ b/blazerod/model/model-pmx/format/PmxDisplayFrame.kt @@ -0,0 +1,14 @@ +package top.fifthlight.blazerod.model.pmx.format + +// Actually useless for us +data class PmxDisplayFrame( + val nameLocal: String, + val nameUniversal: String, + val isSpecial: Boolean, + val frames: List, +) { + sealed class FrameData { + data class Bone(val boneIndex: Int) : FrameData() + data class Morph(val morphIndex: Int) : FrameData() + } +} diff --git a/blazerod/model/model-pmx/format/PmxJoint.kt b/blazerod/model/model-pmx/format/PmxJoint.kt new file mode 100644 index 00000000..97d78dfa --- /dev/null +++ b/blazerod/model/model-pmx/format/PmxJoint.kt @@ -0,0 +1,23 @@ +package top.fifthlight.blazerod.model.pmx.format + +import org.joml.Vector3f + +data class PmxJoint( + val nameLocal: String, + val nameUniversal: String, + val type: JointType, + val rigidBodyIndexA: Int, + val rigidBodyIndexB: Int, + val position: Vector3f, + val rotation: Vector3f, + val positionMinimum: Vector3f, + val positionMaximum: Vector3f, + val rotationMinimum: Vector3f, + val rotationMaximum: Vector3f, + val positionSpring: Vector3f, + val rotationSpring: Vector3f, +) { + enum class JointType(val value: Int) { + SPRING_6DOF(0), + } +} \ No newline at end of file diff --git a/blazerod/model/model-pmx/format/PmxRigidBody.kt b/blazerod/model/model-pmx/format/PmxRigidBody.kt new file mode 100644 index 00000000..1a73f571 --- /dev/null +++ b/blazerod/model/model-pmx/format/PmxRigidBody.kt @@ -0,0 +1,33 @@ +package top.fifthlight.blazerod.model.pmx.format + +import org.joml.Vector3f + +data class PmxRigidBody( + val nameLocal: String, + val nameUniversal: String, + val relatedBoneIndex: Int, + val groupId: Int, + val nonCollisionGroup: Int, + val shape: ShapeType, + val shapeSize: Vector3f, + val shapePosition: Vector3f, + val shapeRotation: Vector3f, + val mass: Float, + val moveAttenuation: Float, + val rotationDamping: Float, + val repulsion: Float, + val frictionForce: Float, + val physicsMode: PhysicsMode, +) { + enum class ShapeType(val value: Int) { + SPHERE(0), + BOX(1), + CAPSULE(2) + } + + enum class PhysicsMode(val value: Int) { + FOLLOW_BONE(0), + PHYSICS(1), + PHYSICS_PLUS_BONE(2) + } +} \ No newline at end of file diff --git a/blazerod/render/fabric/BUILD.bazel b/blazerod/render/fabric/BUILD.bazel index cb3d7088..e67b728d 100644 --- a/blazerod/render/fabric/BUILD.bazel +++ b/blazerod/render/fabric/BUILD.bazel @@ -59,7 +59,9 @@ kt_merge_library( "//blazerod/render/main/util/dispatchers", "//blazerod/render/main/util/objectpool", "//blazerod/render/main/layout", + "//blazerod/render/main/physics", "//blazerod/render/main/runtime", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/uniform", ], ) diff --git a/blazerod/render/fabric/BlazeRodFabric.kt b/blazerod/render/fabric/BlazeRodFabric.kt index f2293f52..2242f86b 100644 --- a/blazerod/render/fabric/BlazeRodFabric.kt +++ b/blazerod/render/fabric/BlazeRodFabric.kt @@ -7,6 +7,7 @@ import net.minecraft.client.gl.RenderPassImpl import org.slf4j.LoggerFactory import top.fifthlight.blazerod.api.event.RenderEvents import top.fifthlight.blazerod.debug.* +import top.fifthlight.blazerod.physics.PhysicsInterface import top.fifthlight.blazerod.runtime.resource.RenderTexture import top.fifthlight.blazerod.runtime.uniform.UniformBuffer import top.fifthlight.blazerod.util.dispatchers.ThreadExecutorDispatcher @@ -19,6 +20,8 @@ object BlazeRodFabric : ClientModInitializer { override fun onInitializeClient() { BlazeRod.mainDispatcher = ThreadExecutorDispatcher(MinecraftClient.getInstance()) + PhysicsInterface.load() + if (System.getProperty("blazerod.debug") == "true") { BlazeRod.debug = true RenderPassImpl.IS_DEVELOPMENT = true diff --git a/blazerod/render/game/BUILD.bazel b/blazerod/render/game/BUILD.bazel index 7a0b6d45..7c59b3f1 100644 --- a/blazerod/render/game/BUILD.bazel +++ b/blazerod/render/game/BUILD.bazel @@ -1,7 +1,6 @@ load("@rules_java//java:defs.bzl", "java_library") load("//rule:apply_access_widener.bzl", "apply_access_widener") load("//rule:extract_access_widener.bzl", "extract_access_widener") -load("//rule:decompile_jar.bzl", "decompile_jar") load("//rule/neoforge:convert_access_widener.bzl", "convert_access_widener") load("//rule:remap_access_widener.bzl", "remap_access_widener") diff --git a/blazerod/render/main/BUILD.bazel b/blazerod/render/main/BUILD.bazel index 0dba0764..ba995b32 100644 --- a/blazerod/render/main/BUILD.bazel +++ b/blazerod/render/main/BUILD.bazel @@ -37,9 +37,11 @@ kt_merge_library( "//blazerod/render/main/layout", "//blazerod/render/main/mixin", "//blazerod/render/main/render", + "//blazerod/render/main/physics", "//blazerod/render/main/runtime", "//blazerod/render/main/runtime/data", "//blazerod/render/main/runtime/load", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/renderer", "//blazerod/render/main/runtime/uniform", "//blazerod/render/main/systems", diff --git a/blazerod/render/main/animation/BUILD.bazel b/blazerod/render/main/animation/BUILD.bazel index a8750623..1b493286 100644 --- a/blazerod/render/main/animation/BUILD.bazel +++ b/blazerod/render/main/animation/BUILD.bazel @@ -7,6 +7,7 @@ kt_merge_library( merge_deps = [ "//blazerod/render/main/animation/context", "//blazerod/render/main/runtime", + "//blazerod/render/main/runtime/resource", "//blazerod/render/api/animation", "//blazerod/render/api/resource", ], diff --git a/blazerod/render/main/layout/BUILD.bazel b/blazerod/render/main/layout/BUILD.bazel index 614bcd39..7ed91001 100644 --- a/blazerod/render/main/layout/BUILD.bazel +++ b/blazerod/render/main/layout/BUILD.bazel @@ -3,7 +3,7 @@ load("//rule:merge_library.bzl", "kt_merge_library") kt_merge_library( name = "layout", visibility = ["//blazerod/render:__subpackages__"], - srcs = ["GpuDataLayout.kt", "LayoutStrategy.kt"], + srcs = glob(["*.kt"]), deps = [ "//blazerod/model/model-base", "@maven//:it_unimi_dsi_fastutil", diff --git a/blazerod/render/main/layout/LayoutStrategy.kt b/blazerod/render/main/layout/LayoutStrategy.kt index 1b758c0b..08efae5c 100644 --- a/blazerod/render/main/layout/LayoutStrategy.kt +++ b/blazerod/render/main/layout/LayoutStrategy.kt @@ -34,6 +34,44 @@ sealed interface LayoutStrategy { fun arrayStrideOf(baseAlign: Int, baseSize: Int) = baseSize roundUpToMultiple arrayAlignmentOf(baseAlign, baseSize) + object PackedLayoutStrategy : LayoutStrategy { + override val scalarAlign: Int + get() = 4 + override val scalarSize: Int + get() = 4 + override val vec2Align: Int + get() = 4 + override val vec2Size: Int + get() = 8 + override val vec3Align: Int + get() = 4 + override val vec3Size: Int + get() = 12 + override val vec4Align: Int + get() = 4 + override val vec4Size: Int + get() = 16 + override val mat2Align: Int + get() = 4 + override val mat2Size: Int + get() = 32 + override val mat2Padding: Boolean + get() = true + override val mat3Align: Int + get() = 4 + override val mat3Size: Int + get() = 48 + override val mat3Padding: Boolean + get() = false + override val mat4Align: Int + get() = 4 + override val mat4Size: Int + get() = 64 + + override val arrayAlignment: Int + get() = 1 + } + object Std140LayoutStrategy : LayoutStrategy { override val scalarAlign: Int get() = 4 @@ -68,7 +106,7 @@ sealed interface LayoutStrategy { override val mat4Size: Int get() = 64 - override val arrayAlignment: Int? + override val arrayAlignment: Int get() = 16 } diff --git a/blazerod/render/main/physics/BUILD.bazel b/blazerod/render/main/physics/BUILD.bazel new file mode 100644 index 00000000..53fc8b74 --- /dev/null +++ b/blazerod/render/main/physics/BUILD.bazel @@ -0,0 +1,62 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@rules_jni//jni:defs.bzl", "jni_headers") +load("//rule:cc_jni_library.bzl", "cc_jni_library") +load("//rule:merge_library.bzl", "java_merge_library", "kt_merge_library") + +java_merge_library( + name = "physics_declaration", + srcs = ["PhysicsLibrary.java"], + deps = ["@maven//:org_slf4j_slf4j_api"], +) + +jni_headers( + name = "physics_headers", + lib = ":physics_declaration", +) + +cc_library( + name = "bullet_binding", + srcs = glob([ + "*.cpp", + "*.h", + ]), + deps = [ + ":physics_headers", + "@bullet//:BulletCollision", + "@bullet//:BulletDynamics", + "@bullet//:LinearMath", + "@rules_jni//jni", + ], +) + +cc_jni_library( + name = "bullet", + platforms = select({ + "//:config_release": [ + "@//platforms:android_arm64", + "@//platforms:android_x86_64", + "@//platforms:linux_arm64_glibc", + "@//platforms:linux_x86_64_glibc", + "@//platforms:windows_arm64", + "@//platforms:windows_x86_64", + ], + "//conditions:default": [], + }), + deps = [":bullet_binding"], +) + +kt_merge_library( + name = "physics", + srcs = glob(["*.kt"]), + merge_deps = [ + ":physics_declaration", + "//blazerod/render/main/runtime/resource", + ], + resource_jars = [":bullet"], + visibility = ["//blazerod/render:__subpackages__"], + deps = [ + "//blazerod/model/model-base", + "@maven//:it_unimi_dsi_fastutil", + "@maven//:org_joml_joml", + ], +) diff --git a/blazerod/render/main/physics/PhysicsInterface.kt b/blazerod/render/main/physics/PhysicsInterface.kt new file mode 100644 index 00000000..1a80bf3d --- /dev/null +++ b/blazerod/render/main/physics/PhysicsInterface.kt @@ -0,0 +1,8 @@ +package top.fifthlight.blazerod.physics + +object PhysicsInterface { + val isPhysicsAvailable + get() = PhysicsLibrary.isPhysicsAvailable() + + fun load() = PhysicsLibrary.load() +} \ No newline at end of file diff --git a/blazerod/render/main/physics/PhysicsLibrary.java b/blazerod/render/main/physics/PhysicsLibrary.java new file mode 100644 index 00000000..42380802 --- /dev/null +++ b/blazerod/render/main/physics/PhysicsLibrary.java @@ -0,0 +1,138 @@ +package top.fifthlight.blazerod.physics; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.DosFileAttributeView; +import java.nio.file.attribute.PosixFileAttributeView; +import java.nio.file.attribute.PosixFilePermission; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +public class PhysicsLibrary { + private PhysicsLibrary() { + } + + private static final Logger logger = LoggerFactory.getLogger(PhysicsLibrary.class); + private static boolean isPhysicsAvailable = false; + + public native static long createPhysicsScene(ByteBuffer rigidBodies, ByteBuffer joints); + + public native static void destroyPhysicsScene(long physicsScene); + + public native static long createPhysicsWorld(long physicsScene, ByteBuffer initialTransform); + + public native static ByteBuffer getTransformBuffer(long physicsWorld); + + public native static void stepPhysicsWorld(long physicsWorld, float deltaTime, float maxSubSteps, float fixedTimeStep); + + public native static void destroyPhysicsWorld(long physicsWorld); + + public static boolean isPhysicsAvailable() { + return isPhysicsAvailable; + } + + private static final List androidPaths = List.of( + Path.of("/", "system", "build.prop"), + Path.of("/", "system", "bin", "app_process"), + Path.of("/", "system", "framework", "framework.jar") + ); + + public static boolean load() { + if (isPhysicsAvailable) { + return true; + } + + logger.info("Loading bullet physics native library"); + + var systemName = System.getProperty("os.name").toLowerCase(Locale.ROOT); + var systemArch = System.getProperty("os.arch").toLowerCase(Locale.ROOT); + + String system; + String extension; + if (systemName.startsWith("linux")) { + var isAndroid = false; + for (var path : androidPaths) { + try { + if (Files.exists(path)) { + isAndroid = true; + break; + } + } catch (SecurityException ex) { + logger.info("Failed to access {}, may running on Android", path, ex); + } + } + + if (isAndroid) { + system = "android"; + } else { + system = "linux"; + } + extension = "so"; + } else if (systemName.startsWith("windows")) { + system = "windows"; + extension = "dll"; + } else if (systemName.contains("android")) { + // Most OpenJDK on Android declare themselves as Linux, but just in case + system = "android"; + extension = "so"; + } else { + logger.error("Unsupported system: {}", systemName); + return false; + } + + var arch = switch (systemArch) { + case "amd64", "x86_64" -> "x86_64"; + case "arm64", "aarch64" -> "aarch64"; + default -> null; + }; + if (arch == null) { + logger.error("Unsupported architecture: {}", systemArch); + return false; + } + + var resourcePath = "bullet_%s_%s/libbullet.%s".formatted(system, arch, extension); + try (var libraryUrl = PhysicsLibrary.class.getClassLoader().getResourceAsStream(resourcePath)) { + if (libraryUrl == null) { + logger.error("Failed to find physics library: {}", resourcePath); + return false; + } + + var outputPath = Files.createTempFile("bullet_", "." + extension); + logger.info("Extracting {} to {}", resourcePath, outputPath); + + Files.copy(libraryUrl, outputPath, StandardCopyOption.REPLACE_EXISTING); + try { + // Set file to read only after extracting + if ("windows".equals(system)) { + var attributeView = Files.getFileAttributeView(outputPath, DosFileAttributeView.class); + attributeView.setReadOnly(true); + } else { + var attributeView = Files.getFileAttributeView(outputPath, PosixFileAttributeView.class); + // 500 + attributeView.setPermissions(Set.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_EXECUTE)); + } + } catch (Exception ignored) { + } + + System.load(outputPath.toAbsolutePath().toString()); + try { + Files.delete(outputPath); + } catch (Exception ignored) { + // On Windows, the file is locked. + } + + isPhysicsAvailable = true; + logger.info("Loaded bullet physics native library"); + return true; + } catch (Exception ex) { + logger.error("Failed to load bullet physics native library", ex); + return false; + } + } +} diff --git a/blazerod/render/main/physics/PhysicsScene.cpp b/blazerod/render/main/physics/PhysicsScene.cpp new file mode 100644 index 00000000..b4bc5183 --- /dev/null +++ b/blazerod/render/main/physics/PhysicsScene.cpp @@ -0,0 +1,100 @@ +#include "PhysicsScene.h" + +#include + +#include +#include + +namespace blazerod::physics { +template +static void CopyField(T& field, void* data) { + std::memcpy(&field, data, sizeof(field)); +} + +template +static void CopyEnumField(T& field, void* data) { + static_assert(std::is_enum_v, "CopyEnumField only works with enum types"); + uint32_t enum_value; + CopyField(enum_value, data); + field = static_cast(enum_value); +} + +static void CopyVector3fField(Vector3f& vector, void* data) { + uint8_t* ptr = static_cast(data); + CopyField(vector.x, ptr + 0); + CopyField(vector.y, ptr + 4); + CopyField(vector.z, ptr + 8); +} + +static std::vector DeserializeRigidbodies(size_t size, void* data) { + const size_t rigidbody_size = 72; + if (size == 0) { + throw std::invalid_argument("Empty rigidbody data"); + } + if (size % rigidbody_size != 0) { + throw std::invalid_argument("Invalid rigidbody size"); + } + + size_t rigidbody_count = size / rigidbody_size; + std::vector rigidbodies; + rigidbodies.reserve(rigidbody_count); + + for (size_t i = 0; i < rigidbody_count; i++) { + uint8_t* rigidbody_data = static_cast(data) + i * rigidbody_size; + RigidBody rigidbody; + + CopyField(rigidbody.collision_group, rigidbody_data + 0); + CopyField(rigidbody.collision_mask, rigidbody_data + 4); + CopyEnumField(rigidbody.shape_type, rigidbody_data + 8); + CopyEnumField(rigidbody.physics_mode, rigidbody_data + 12); + CopyVector3fField(rigidbody.shape_size, rigidbody_data + 16); + CopyVector3fField(rigidbody.shape_position, rigidbody_data + 28); + CopyVector3fField(rigidbody.shape_rotation, rigidbody_data + 40); + CopyField(rigidbody.mass, rigidbody_data + 52); + CopyField(rigidbody.move_attenuation, rigidbody_data + 56); + CopyField(rigidbody.rotation_damping, rigidbody_data + 60); + CopyField(rigidbody.repulsion, rigidbody_data + 64); + CopyField(rigidbody.friction_force, rigidbody_data + 68); + + rigidbodies.push_back(rigidbody); + } + + return rigidbodies; +} + +static std::vector DeserializeJoints(size_t size, void* data) { + const size_t joint_size = 108; + if (size % joint_size != 0) { + throw std::invalid_argument("Invalid joint size"); + } + + size_t joint_count = size / joint_size; + std::vector joints; + joints.reserve(joint_count); + + for (size_t i = 0; i < joint_count; i++) { + uint8_t* joint_data = static_cast(data) + i * joint_size; + Joint joint; + + CopyEnumField(joint.type, joint_data + 0); + CopyField(joint.rigidbody_a_index, joint_data + 4); + CopyField(joint.rigidbody_b_index, joint_data + 8); + CopyVector3fField(joint.position, joint_data + 12); + CopyVector3fField(joint.rotation, joint_data + 24); + CopyVector3fField(joint.position_min, joint_data + 36); + CopyVector3fField(joint.position_max, joint_data + 48); + CopyVector3fField(joint.rotation_min, joint_data + 60); + CopyVector3fField(joint.rotation_max, joint_data + 72); + CopyVector3fField(joint.position_spring, joint_data + 84); + CopyVector3fField(joint.rotation_spring, joint_data + 96); + + joints.push_back(joint); + } + + return joints; +} + +PhysicsScene::PhysicsScene(size_t rigidbody_size, void* rigidbodies, size_t joints_size, void* joints) + : rigidbodies(DeserializeRigidbodies(rigidbody_size, rigidbodies)), + joints(DeserializeJoints(joints_size, joints)) {} +} // namespace blazerod::physics diff --git a/blazerod/render/main/physics/PhysicsScene.h b/blazerod/render/main/physics/PhysicsScene.h new file mode 100644 index 00000000..fdb5eefd --- /dev/null +++ b/blazerod/render/main/physics/PhysicsScene.h @@ -0,0 +1,74 @@ +#ifndef BLAZEROD_PHYSICSSCENE_H +#define BLAZEROD_PHYSICSSCENE_H + +#include +#include +#include + +namespace blazerod::physics { + +enum ShapeType { + SPHERE = 0, + BOX = 1, + CAPSULE = 2, +}; + +enum PhysicsMode { + FOLLOW_BONE = 0, + PHYSICS = 1, + PHYSICS_PLUS_BONE = 2, +}; + +enum JointType { + SPRING_6DOF = 0, +}; + +struct Vector3f { + float x; + float y; + float z; +}; + +struct RigidBody { + uint32_t collision_group; + uint32_t collision_mask; + ShapeType shape_type; + Vector3f shape_size; + Vector3f shape_position; + Vector3f shape_rotation; + float mass; + float move_attenuation; + float rotation_damping; + float repulsion; + float friction_force; + PhysicsMode physics_mode; +}; + +struct Joint { + JointType type; + uint32_t rigidbody_a_index; + uint32_t rigidbody_b_index; + Vector3f position; + Vector3f rotation; + Vector3f position_min; + Vector3f position_max; + Vector3f rotation_min; + Vector3f rotation_max; + Vector3f position_spring; + Vector3f rotation_spring; +}; + +class PhysicsScene { + private: + const std::vector rigidbodies; + const std::vector joints; + + public: + PhysicsScene(size_t rigidbody_count, void* rigidbodies, size_t joints_size, void* joints); + + const std::vector& GetRigidBodies() const { return rigidbodies; } + const std::vector& GetJoints() const { return joints; } +}; +} // namespace blazerod::physics + +#endif // BLAZEROD_PHYSICSSCENE_H diff --git a/blazerod/render/main/physics/PhysicsScene.kt b/blazerod/render/main/physics/PhysicsScene.kt new file mode 100644 index 00000000..5298cecf --- /dev/null +++ b/blazerod/render/main/physics/PhysicsScene.kt @@ -0,0 +1,86 @@ +package top.fifthlight.blazerod.physics + +import org.joml.Vector3fc +import top.fifthlight.blazerod.model.RigidBody +import top.fifthlight.blazerod.runtime.resource.RenderPhysicsJoint +import java.lang.ref.Reference +import java.nio.ByteBuffer +import java.nio.ByteOrder + +class PhysicsScene( + rigidBodies: List, + joints: List, +) : AutoCloseable { + private val pointer: Long + private var closed = false + + init { + require(rigidBodies.isNotEmpty()) { "Rigidbodies must not be empty" } + + if (!PhysicsLibrary.isPhysicsAvailable()) { + throw IllegalStateException("Physics library is not available") + } + + fun ByteBuffer.putVector3f(offset: Int, vector: Vector3fc) = this + .putFloat(offset + 0, vector.x()) + .putFloat(offset + 4, vector.y()) + .putFloat(offset + 8, vector.z()) + + val rigidBodyItemSize = 72 + val rigidBodiesBuffer = ByteBuffer.allocateDirect(rigidBodyItemSize * rigidBodies.size) + .order(ByteOrder.nativeOrder()) + rigidBodies.forEachIndexed { index, rigidBody -> + val offset = index * rigidBodyItemSize + rigidBodiesBuffer.putInt(offset + 0, rigidBody.collisionGroup) + rigidBodiesBuffer.putInt(offset + 4, rigidBody.collisionMask) + rigidBodiesBuffer.putInt(offset + 8, rigidBody.shape.ordinal) + rigidBodiesBuffer.putInt(offset + 12, rigidBody.physicsMode.ordinal) + rigidBodiesBuffer.putVector3f(offset + 16, rigidBody.shapeSize) + rigidBodiesBuffer.putVector3f(offset + 28, rigidBody.shapePosition) + rigidBodiesBuffer.putVector3f(offset + 40, rigidBody.shapeRotation) + rigidBodiesBuffer.putFloat(offset + 52, rigidBody.mass) + rigidBodiesBuffer.putFloat(offset + 56, rigidBody.moveAttenuation) + rigidBodiesBuffer.putFloat(offset + 60, rigidBody.rotationDamping) + rigidBodiesBuffer.putFloat(offset + 64, rigidBody.repulsion) + rigidBodiesBuffer.putFloat(offset + 68, rigidBody.frictionForce) + } + + val jointItemSize = 108 + val jointsBuffer = ByteBuffer.allocateDirect(jointItemSize * joints.size) + .order(ByteOrder.nativeOrder()) + joints.forEachIndexed { index, joint -> + val offset = index * jointItemSize + jointsBuffer.putInt(offset + 0, joint.type.ordinal) + jointsBuffer.putInt(offset + 4, joint.rigidBodyAIndex) + jointsBuffer.putInt(offset + 8, joint.rigidBodyBIndex) + jointsBuffer.putVector3f(offset + 12, joint.position) + jointsBuffer.putVector3f(offset + 24, joint.rotation) + jointsBuffer.putVector3f(offset + 36, joint.positionMin) + jointsBuffer.putVector3f(offset + 48, joint.positionMax) + jointsBuffer.putVector3f(offset + 60, joint.rotationMin) + jointsBuffer.putVector3f(offset + 72, joint.rotationMax) + jointsBuffer.putVector3f(offset + 84, joint.positionSpring) + jointsBuffer.putVector3f(offset + 96, joint.rotationSpring) + } + + try { + pointer = PhysicsLibrary.createPhysicsScene(rigidBodiesBuffer, jointsBuffer) + } finally { + Reference.reachabilityFence(rigidBodiesBuffer) + Reference.reachabilityFence(jointsBuffer) + } + } + + internal fun getPointer(): Long { + require(!closed) { "PhysicsScene is closed" } + return pointer + } + + override fun close() { + if (closed) { + return + } + PhysicsLibrary.destroyPhysicsScene(pointer) + closed = true + } +} diff --git a/blazerod/render/main/physics/PhysicsWorld.cpp b/blazerod/render/main/physics/PhysicsWorld.cpp new file mode 100644 index 00000000..7cd4fd8f --- /dev/null +++ b/blazerod/render/main/physics/PhysicsWorld.cpp @@ -0,0 +1,259 @@ +#include "PhysicsWorld.h" + +#include +#include + +#include "blazerod/render/main/physics/PhysicsScene.h" + +namespace blazerod::physics { + +struct PhysicsFilterCallback : public btOverlapFilterCallback { + btBroadphaseProxy* ground_proxy; + + bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const override { + bool is_ground = proxy0 == ground_proxy || proxy1 == ground_proxy; + bool proxy0_collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; + bool proxy1_collides = (proxy0->m_collisionFilterMask & proxy1->m_collisionFilterGroup) != 0; + return (proxy0_collides && proxy1_collides) || is_ground; + } +}; + +class FollowBoneMotionState : public btMotionState { + private: + PhysicsWorld* world; + size_t rigidbody_index; + + public: + FollowBoneMotionState(PhysicsWorld* world, size_t rigidbody_index) + : world(world), rigidbody_index(rigidbody_index) {} + void getWorldTransform(btTransform& world_transform) const override { + world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + } + + void setWorldTransform(const btTransform& world_transform) override {} +}; + +class PhysicsMotionState : public btMotionState { + private: + PhysicsWorld* world; + size_t rigidbody_index; + + public: + PhysicsMotionState(PhysicsWorld* world, size_t rigidbody_index) : world(world), rigidbody_index(rigidbody_index) {} + void getWorldTransform(btTransform& world_transform) const override { + world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + } + void setWorldTransform(const btTransform& world_transform) override { + world_transform.getOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + } +}; + +class PhysicsPlusBoneDynamicMotionState : public btMotionState { + private: + PhysicsWorld* world; + size_t rigidbody_index; + + public: + PhysicsPlusBoneDynamicMotionState(PhysicsWorld* world, size_t rigidbody_index) + : world(world), rigidbody_index(rigidbody_index) {} + void getWorldTransform(btTransform& world_transform) const override { + world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + } + void setWorldTransform(const btTransform& world_transform) override { + btTransform original_transform; + original_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + btTransform final_transform = world_transform; + final_transform.setOrigin(original_transform.getOrigin()); + final_transform.getOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + } +}; + +PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_count, float* initial_transform) + : transform_buffer(initial_transform, initial_transform + initial_transform_count) { + this->broadphase = std::make_unique(); + this->collision_config = std::make_unique(); + this->dispatcher = std::make_unique(this->collision_config.get()); + this->solver = std::make_unique(); + this->world = std::make_unique(this->dispatcher.get(), this->broadphase.get(), + this->solver.get(), this->collision_config.get()); + this->world->setGravity(btVector3(0, -9.81, 0)); + + this->ground_shape = std::make_unique(btVector3(0, 1, 0), 0.0f); + btTransform ground_transform; + ground_transform.setIdentity(); + this->ground_motion_state = std::make_unique(ground_transform); + this->ground_rigidbody = + std::make_unique(0.0f, this->ground_motion_state.get(), this->ground_shape.get()); + this->world->addRigidBody(this->ground_rigidbody.get()); + + auto filter_callback = std::make_unique(); + filter_callback->ground_proxy = this->ground_rigidbody->getBroadphaseProxy(); + this->world->getPairCache()->setOverlapFilterCallback(filter_callback.get()); + this->filter_callback = std::move(filter_callback); + + const auto& rigidbodies = scene.GetRigidBodies(); + if (transform_buffer.size() != rigidbodies.size() * 16) { + throw std::invalid_argument("Transform buffer size does not match rigidbody count"); + } + this->rigidbodies.reserve(rigidbodies.size()); + + size_t rigidbody_count = 0; + for (const RigidBody& rigidbody_item : rigidbodies) { + size_t rigidbody_index = rigidbody_count++; + RigidBodyData rigidbody_data; + + std::unique_ptr shape; + switch (rigidbody_item.shape_type) { + case ShapeType::BOX: { + shape = std::make_unique( + btVector3(rigidbody_item.shape_size.x, rigidbody_item.shape_size.y, rigidbody_item.shape_size.z)); + break; + }; + + case ShapeType::SPHERE: { + shape = std::make_unique(rigidbody_item.shape_size.x); + break; + }; + + case ShapeType::CAPSULE: { + shape = std::make_unique(rigidbody_item.shape_size.x, rigidbody_item.shape_size.y); + break; + }; + + default: { + throw std::invalid_argument("Invalid shape"); + } + } + + float mass = rigidbody_item.physics_mode == PhysicsMode::FOLLOW_BONE ? 0.0f : rigidbody_item.mass; + btVector3 local_inertia(0, 0, 0); + if (mass != 0.0f) { + shape->calculateLocalInertia(mass, local_inertia); + } + + std::unique_ptr motion_state; + switch (rigidbody_item.physics_mode) { + case FOLLOW_BONE: { + motion_state = std::make_unique(this, rigidbody_index); + break; + } + case PHYSICS: { + motion_state = std::make_unique(this, rigidbody_index); + break; + } + case PHYSICS_PLUS_BONE: { + motion_state = std::make_unique(this, rigidbody_index); + break; + } + + default: { + throw std::invalid_argument("Invalid physics mode"); + } + } + + btRigidBody::btRigidBodyConstructionInfo rigidbody_info(rigidbody_item.mass, motion_state.get(), shape.get(), + local_inertia); + rigidbody_info.m_linearDamping = rigidbody_item.move_attenuation; + rigidbody_info.m_angularDamping = rigidbody_item.rotation_damping; + rigidbody_info.m_restitution = rigidbody_item.repulsion; + rigidbody_info.m_friction = rigidbody_item.friction_force; + rigidbody_info.m_additionalDamping = true; + + auto rigidbody = std::make_unique(rigidbody_info); + this->world->addRigidBody(rigidbody.get()); + rigidbody->setActivationState(DISABLE_DEACTIVATION); + if (rigidbody_item.physics_mode == PhysicsMode::FOLLOW_BONE) { + rigidbody->setCollisionFlags(rigidbody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + } + + rigidbody_data.shape = std::move(shape); + rigidbody_data.motion_state = std::move(motion_state); + rigidbody_data.rigidbody = std::move(rigidbody); + this->rigidbodies.push_back(std::move(rigidbody_data)); + } + + const auto& joints = scene.GetJoints(); + this->joints.reserve(joints.size()); + + for (const Joint& joint_item : joints) { + btMatrix3x3 rotMat; + rotMat.setEulerZYX(joint_item.rotation.x, joint_item.rotation.y, joint_item.rotation.z); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(joint_item.position.x, joint_item.position.y, joint_item.position.z)); + transform.setBasis(rotMat); + + size_t rigidbody_a_index = joint_item.rigidbody_a_index; + if (rigidbody_a_index >= this->rigidbodies.size()) { + throw std::invalid_argument("Invalid rigidbody index"); + } + const auto& rigidbody_a = this->rigidbodies[joint_item.rigidbody_a_index]; + size_t rigidbody_b_index = joint_item.rigidbody_b_index; + if (rigidbody_b_index >= this->rigidbodies.size()) { + throw std::invalid_argument("Invalid rigidbody index"); + } + const auto& rigidbody_b = this->rigidbodies[joint_item.rigidbody_b_index]; + + btTransform inverse_a = rigidbody_a.rigidbody->getWorldTransform().inverse(); + btTransform inverse_b = rigidbody_b.rigidbody->getWorldTransform().inverse(); + inverse_a *= transform; + inverse_b *= transform; + + auto constraint = std::make_unique( + *rigidbody_a.rigidbody, *rigidbody_b.rigidbody, inverse_a, inverse_b, true); + constraint->setLinearLowerLimit( + btVector3(joint_item.position_min.x, joint_item.position_min.y, joint_item.position_min.z)); + constraint->setLinearUpperLimit( + btVector3(joint_item.position_max.x, joint_item.position_max.y, joint_item.position_max.z)); + + constraint->setAngularLowerLimit( + btVector3(joint_item.rotation_min.x, joint_item.rotation_min.y, joint_item.rotation_min.z)); + constraint->setAngularUpperLimit( + btVector3(joint_item.rotation_max.x, joint_item.rotation_max.y, joint_item.rotation_max.z)); + + if (joint_item.position_spring.x != 0.0f) { + constraint->enableSpring(0, true); + constraint->setStiffness(0, joint_item.position_spring.x); + } + if (joint_item.position_spring.y != 0.0f) { + constraint->enableSpring(1, true); + constraint->setStiffness(1, joint_item.position_spring.y); + } + if (joint_item.position_spring.z != 0.0f) { + constraint->enableSpring(2, true); + constraint->setStiffness(2, -joint_item.position_spring.z); + } + if (joint_item.rotation_spring.x != 0.0f) { + constraint->enableSpring(3, true); + constraint->setStiffness(3, joint_item.rotation_spring.x); + } + if (joint_item.rotation_spring.y != 0.0f) { + constraint->enableSpring(4, true); + constraint->setStiffness(4, joint_item.rotation_spring.y); + } + if (joint_item.rotation_spring.z != 0.0f) { + constraint->enableSpring(5, true); + constraint->setStiffness(5, joint_item.rotation_spring.z); + } + + this->world->addConstraint(constraint.get(), true); + this->joints.push_back(std::move(constraint)); + } +} + +PhysicsWorld::~PhysicsWorld() { + this->world->removeRigidBody(this->ground_rigidbody.get()); + for (auto& joint : this->joints) { + this->world->removeConstraint(joint.get()); + } + for (auto& rigidbody : this->rigidbodies) { + this->world->removeRigidBody(rigidbody.rigidbody.get()); + } +} + +void PhysicsWorld::Step(float delta_time, float max_sub_steps, float fixed_time_step) { + this->world->stepSimulation(delta_time, max_sub_steps, fixed_time_step); +} + +} // namespace blazerod::physics diff --git a/blazerod/render/main/physics/PhysicsWorld.h b/blazerod/render/main/physics/PhysicsWorld.h new file mode 100644 index 00000000..51909b49 --- /dev/null +++ b/blazerod/render/main/physics/PhysicsWorld.h @@ -0,0 +1,48 @@ +#ifndef BLAZEROD_PHYSICSWORLD_H +#define BLAZEROD_PHYSICSWORLD_H + +#include +#include + +#include +#include + +#include "blazerod/render/main/physics/PhysicsScene.h" + +namespace blazerod::physics { +struct RigidBodyData { + std::unique_ptr shape; + std::unique_ptr motion_state; + std::unique_ptr rigidbody; +}; + +class PhysicsWorld { + private: + std::unique_ptr broadphase; + std::unique_ptr collision_config; + std::unique_ptr dispatcher; + std::unique_ptr solver; + std::unique_ptr world; + + std::unique_ptr ground_shape; + std::unique_ptr ground_motion_state; + std::unique_ptr ground_rigidbody; + std::unique_ptr filter_callback; + + std::vector rigidbodies; + std::vector> joints; + + std::vector transform_buffer; + + friend class PhysicsMotionState; + + public: + PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_count, float* initial_transform); + ~PhysicsWorld(); + + std::vector& GetTransformBuffer() { return transform_buffer; } + void Step(float delta_time, float max_sub_steps, float fixed_time_step); +}; +} // namespace blazerod::physics + +#endif // BLAZEROD_PHYSICSWORLD_H diff --git a/blazerod/render/main/physics/PhysicsWorld.kt b/blazerod/render/main/physics/PhysicsWorld.kt new file mode 100644 index 00000000..d5aba281 --- /dev/null +++ b/blazerod/render/main/physics/PhysicsWorld.kt @@ -0,0 +1,52 @@ +package top.fifthlight.blazerod.physics + +import org.joml.Matrix4f +import java.lang.AutoCloseable +import java.lang.ref.Reference +import java.nio.ByteBuffer + +class PhysicsWorld( + scene: PhysicsScene, + initialTransform: ByteBuffer, +) : AutoCloseable { + private val pointer: Long + private var closed = false + private val transformBuffer: ByteBuffer + + init { + if (!PhysicsLibrary.isPhysicsAvailable()) { + throw IllegalStateException("Physics library is not available") + } + try { + pointer = PhysicsLibrary.createPhysicsWorld(scene.getPointer(), initialTransform) + } finally { + Reference.reachabilityFence(initialTransform) + } + transformBuffer = PhysicsLibrary.getTransformBuffer(pointer) + } + + private inline fun requireNotClosed(crossinline block: () -> T): T { + require(!closed) { "PhysicsWorld is closed" } + return block() + } + + fun getTransform(rigidBodyIndex: Int, dst: Matrix4f): Matrix4f = requireNotClosed { + dst.apply { + dst.set(rigidBodyIndex * 64, transformBuffer) + } + } + + fun setTransform(rigidBodyIndex: Int, transform: Matrix4f) { + requireNotClosed { + transform.get(rigidBodyIndex * 64, transformBuffer) + } + } + + override fun close() { + if (closed) { + return + } + PhysicsLibrary.destroyPhysicsWorld(pointer) + closed = true + } +} diff --git a/blazerod/render/main/physics/binding.cpp b/blazerod/render/main/physics/binding.cpp new file mode 100644 index 00000000..076bfc1a --- /dev/null +++ b/blazerod/render/main/physics/binding.cpp @@ -0,0 +1,127 @@ +#include + +#include "PhysicsScene.h" +#include "PhysicsWorld.h" +#include "top_fifthlight_blazerod_physics_PhysicsLibrary.h" + +using blazerod::physics::PhysicsScene; +using blazerod::physics::PhysicsWorld; + +extern "C" { +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: createPhysicsScene + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_createPhysicsScene(JNIEnv* env, + jclass clazz, + jobject rigidbodies, + jobject joints) { + if (rigidbodies == nullptr) { + env->ThrowNew(env->FindClass("java/lang/NullPointerException"), "Rigidbodies cannot be null"); + return 0; + } + if (joints == nullptr) { + env->ThrowNew(env->FindClass("java/lang/NullPointerException"), "Joints cannot be null"); + return 0; + } + + size_t rigidbodies_size = env->GetDirectBufferCapacity(rigidbodies); + if (rigidbodies_size == -1) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "Rigidbodies buffer is not direct buffer"); + return 0; + } + void* rigidbodies_ptr = env->GetDirectBufferAddress(rigidbodies); + + size_t joints_size = env->GetDirectBufferCapacity(joints); + if (joints_size == -1) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "Joints buffer is not direct buffer"); + return 0; + } + void* joints_ptr = env->GetDirectBufferAddress(joints); + + try { + auto physics_scene_ptr = new PhysicsScene(rigidbodies_size, rigidbodies_ptr, joints_size, joints_ptr); + return reinterpret_cast(physics_scene_ptr); + } catch (std::exception& e) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), e.what()); + return 0; + } +} + +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: destroyPhysicsScene + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_destroyPhysicsScene(JNIEnv* env, + jclass clazz, + jlong physics_scene) { + delete reinterpret_cast(physics_scene); +} + +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: createPhysicsWorld + * Signature: (JLjava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_createPhysicsWorld( + JNIEnv* env, jclass clazz, jlong physics_scene, jobject initial_transform) { + size_t initial_transform_size = env->GetDirectBufferCapacity(initial_transform); + if (initial_transform_size == -1) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), + "Initial transform buffer is not direct buffer"); + return 0; + } else if (initial_transform_size % 4 != 0) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), + "Initial transform buffer size is not a multiple of 4"); + } + void* initial_transform_ptr = env->GetDirectBufferAddress(initial_transform); + size_t initial_transform_count = initial_transform_size / 4; + + try { + auto physics_world_ptr = + new PhysicsWorld(*reinterpret_cast(physics_scene), initial_transform_count, + reinterpret_cast(initial_transform_ptr)); + return reinterpret_cast(physics_world_ptr); + } catch (std::exception& e) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), e.what()); + return 0; + } +} + +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: getTransformBuffer + * Signature: (J)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_getTransformBuffer(JNIEnv* env, + jclass clazz, + jlong physics_world) { + auto physics_world_ptr = reinterpret_cast(physics_world); + auto transform_buffer = physics_world_ptr->GetTransformBuffer(); + return env->NewDirectByteBuffer(transform_buffer.data(), transform_buffer.size() * sizeof(float)); +} + +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: stepPhysicsWorld + * Signature: (JFFF)V + */ +JNIEXPORT void JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_stepPhysicsWorld( + JNIEnv* env, jclass clazz, jlong physics_world, jfloat delta_time, jfloat max_sub_steps, jfloat fixed_time_step) { + auto physics_world_ptr = reinterpret_cast(physics_world); + physics_world_ptr->Step(delta_time, max_sub_steps, fixed_time_step); +} + +/* + * Class: top_fifthlight_blazerod_physics_PhysicsLibrary + * Method: destroyPhysicsWorld + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_destroyPhysicsWorld(JNIEnv* env, + jclass clazz, + jlong physics_world) { + delete reinterpret_cast(physics_world); +} +} diff --git a/blazerod/render/main/runtime/BUILD.bazel b/blazerod/render/main/runtime/BUILD.bazel index e35648b6..b130a3a7 100644 --- a/blazerod/render/main/runtime/BUILD.bazel +++ b/blazerod/render/main/runtime/BUILD.bazel @@ -11,6 +11,7 @@ kt_merge_library( "//blazerod/render/main/render", "//blazerod/render/main/extension", "//blazerod/render/main/runtime/data", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/uniform", "//blazerod/render/main/util/cowbuffer", "//blazerod/render/main/util/iterator", diff --git a/blazerod/render/main/runtime/ModelInstanceImpl.kt b/blazerod/render/main/runtime/ModelInstanceImpl.kt index 8ca6add0..d0719f4e 100644 --- a/blazerod/render/main/runtime/ModelInstanceImpl.kt +++ b/blazerod/render/main/runtime/ModelInstanceImpl.kt @@ -28,6 +28,10 @@ import java.util.function.Consumer class ModelInstanceImpl( override val scene: RenderSceneImpl, ) : AbstractRefCount(), ModelInstance { + companion object { + private const val PHYSICS_FPS = 120f + } + @ActualConstructor("of") constructor(scene: RenderScene) : this(scene as RenderSceneImpl) @@ -38,6 +42,7 @@ class ModelInstanceImpl( init { scene.increaseReferenceCount() + scene.attachToInstance(this) } class ModelData(scene: RenderSceneImpl) : AutoCloseable { diff --git a/blazerod/render/main/runtime/RenderSceneImpl.kt b/blazerod/render/main/runtime/RenderSceneImpl.kt index 72213cd4..fb1e457a 100644 --- a/blazerod/render/main/runtime/RenderSceneImpl.kt +++ b/blazerod/render/main/runtime/RenderSceneImpl.kt @@ -16,7 +16,9 @@ import top.fifthlight.blazerod.runtime.node.UpdatePhase import top.fifthlight.blazerod.runtime.node.component.IkTargetComponent import top.fifthlight.blazerod.runtime.node.component.PrimitiveComponent import top.fifthlight.blazerod.runtime.node.component.RenderNodeComponent +import top.fifthlight.blazerod.runtime.node.component.RigidBodyComponent import top.fifthlight.blazerod.runtime.node.forEach +import top.fifthlight.blazerod.runtime.resource.RenderPhysicsJoint import top.fifthlight.blazerod.runtime.resource.RenderSkin class RenderSceneImpl( @@ -26,8 +28,12 @@ class RenderSceneImpl( override val expressions: List, override val expressionGroups: List, override val cameras: List, + val physicsJoints: List, val renderTransform: NodeTransform?, ) : AbstractRefCount(), RenderScene { + companion object { + private const val PHYSICS_MAX_SUB_STEP_COUNT = 10 + } override val typeId: String get() = "scene" @@ -37,9 +43,11 @@ class RenderSceneImpl( val morphedPrimitiveComponents: List override val ikTargetData: List val ikTargetComponents: List + val rigidBodyComponents: List override val nodeIdMap: Map override val nodeNameMap: Map override val humanoidTagMap: Map + val hasPhysics: Boolean init { rootNode.increaseReferenceCount() @@ -48,9 +56,11 @@ class RenderSceneImpl( val primitiveComponents = mutableListOf() val morphedPrimitives = Int2ReferenceOpenHashMap() val ikTargets = Int2ReferenceOpenHashMap() + val rigidBodyComponents = Int2ReferenceOpenHashMap() val nodeIdMap = mutableMapOf() val nodeNameMap = mutableMapOf() val humanoidTagMap = mutableMapOf() + var hasPhysics = false rootNode.forEach { node -> nodes.add(node) node.nodeId?.let { nodeIdMap.put(it, node) } @@ -73,6 +83,10 @@ class RenderSceneImpl( node.getComponentsOfType(RenderNodeComponent.Type.IkTarget).forEach { component -> ikTargets.put(component.ikIndex, component) } + node.getComponentsOfType(RenderNodeComponent.Type.RigidBody).forEach { component -> + hasPhysics = true + rigidBodyComponents.put(component.rigidBodyIndex, component) + } } this.sortedNodes = nodes this.debugRenderNodes = debugRenderNodes @@ -87,9 +101,13 @@ class RenderSceneImpl( this.ikTargetComponents = (0 until ikTargets.size).map { ikTargets.get(it) ?: error("Ik target index not found: $it") } + this.rigidBodyComponents = (0 until rigidBodyComponents.size).map { + rigidBodyComponents.get(it) ?: error("Rigid body index not found: $it") + } this.nodeIdMap = nodeIdMap this.nodeNameMap = nodeNameMap this.humanoidTagMap = humanoidTagMap + this.hasPhysics = hasPhysics } private fun executePhase(instance: ModelInstanceImpl, phase: UpdatePhase) { @@ -138,6 +156,18 @@ class RenderSceneImpl( executePhase(instance, UpdatePhase.RenderDataUpdate) } + internal fun attachToInstance(instance: ModelInstanceImpl) { + executePhase(instance, UpdatePhase.GlobalTransformPropagation) + executePhase(instance, UpdatePhase.IkUpdate) + executePhase(instance, UpdatePhase.InfluenceTransformUpdate) + executePhase(instance, UpdatePhase.GlobalTransformPropagation) + for (node in nodes) { + for (component in node.components) { + component.onAttached(instance, node) + } + } + } + override fun onClosed() { rootNode.decreaseReferenceCount() } diff --git a/blazerod/render/main/runtime/load/BUILD.bazel b/blazerod/render/main/runtime/load/BUILD.bazel index 9fdb70d0..d253e231 100644 --- a/blazerod/render/main/runtime/load/BUILD.bazel +++ b/blazerod/render/main/runtime/load/BUILD.bazel @@ -10,6 +10,7 @@ kt_merge_library( "//blazerod/render/api/refcount", "//blazerod/render/api/loader", "//blazerod/render/main/runtime", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/render", "//blazerod/render/main/extension", "//blazerod/render/main/util/dispatchers", diff --git a/blazerod/render/main/runtime/load/ModelLoadInfo.kt b/blazerod/render/main/runtime/load/ModelLoadInfo.kt index 0efa32d5..26a7b74b 100644 --- a/blazerod/render/main/runtime/load/ModelLoadInfo.kt +++ b/blazerod/render/main/runtime/load/ModelLoadInfo.kt @@ -10,12 +10,14 @@ import top.fifthlight.blazerod.render.BlazerodVertexFormats import top.fifthlight.blazerod.render.GpuIndexBuffer import top.fifthlight.blazerod.render.RefCountedGpuBuffer import top.fifthlight.blazerod.runtime.resource.MorphTargetGroup +import top.fifthlight.blazerod.runtime.resource.RenderPhysicsJoint import top.fifthlight.blazerod.runtime.resource.RenderPrimitive import top.fifthlight.blazerod.runtime.resource.RenderSkin import top.fifthlight.blazerod.runtime.resource.RenderTexture import java.nio.ByteBuffer import top.fifthlight.blazerod.model.Camera as ModelCamera import top.fifthlight.blazerod.model.IkTarget as ModelIkTarget +import top.fifthlight.blazerod.model.RigidBody as ModelRigidBody data class TextureLoadData( val name: String?, @@ -152,6 +154,11 @@ data class NodeLoadInfo( val influence: Influence, val transformId: TransformId, ) : Component() + + data class RigidBody( + val rigidBodyIndex: Int, + val rigidBody: ModelRigidBody, + ) : Component() } } @@ -171,6 +178,7 @@ data class ModelLoadInfo val skins: List, val expressions: List, val expressionGroups: List, + val physicalJoints: List, val renderTransform: NodeTransform?, ) diff --git a/blazerod/render/main/runtime/load/ModelPreprocessor.kt b/blazerod/render/main/runtime/load/ModelPreprocessor.kt index 40088a85..37d6dd15 100644 --- a/blazerod/render/main/runtime/load/ModelPreprocessor.kt +++ b/blazerod/render/main/runtime/load/ModelPreprocessor.kt @@ -12,6 +12,7 @@ import top.fifthlight.blazerod.model.* import top.fifthlight.blazerod.render.BlazerodVertexFormatElements import top.fifthlight.blazerod.render.BlazerodVertexFormats import top.fifthlight.blazerod.runtime.resource.MorphTargetGroup +import top.fifthlight.blazerod.runtime.resource.RenderPhysicsJoint import top.fifthlight.blazerod.runtime.resource.RenderSkin import java.nio.ByteBuffer import java.nio.ByteOrder @@ -488,6 +489,8 @@ class ModelPreprocessor private constructor( } private var ikCount = 0 + private var rigidBodyCount = 0 + private val rigidBodyIdToIndexMap = mutableMapOf() private val nodes = mutableListOf() private fun loadNode(node: Node): Int { val skinJointData = skinJointsData[node.id] @@ -546,6 +549,16 @@ class ModelPreprocessor private constructor( ) } + is NodeComponent.RigidBodyComponent -> { + rigidBodyIdToIndexMap[component.rigidBodyId] = rigidBodyCount + add( + NodeLoadInfo.Component.RigidBody( + rigidBodyIndex = rigidBodyCount++, + rigidBody = component.rigidBody, + ) + ) + } + else -> {} } } @@ -619,6 +632,23 @@ class ModelPreprocessor private constructor( return Pair(expressions, expressionGroups) } + private fun loadPhysicalJoints(modelPhysicalJoints: List) = modelPhysicalJoints.mapNotNull { + RenderPhysicsJoint( + name = it.name, + type = it.type, + rigidBodyAIndex = rigidBodyIdToIndexMap[it.rigidBodyA] ?: return@mapNotNull null, + rigidBodyBIndex = rigidBodyIdToIndexMap[it.rigidBodyB] ?: return@mapNotNull null, + position = it.position, + rotation = it.rotation, + positionMin = it.positionMin, + positionMax = it.positionMax, + rotationMin = it.rotationMin, + rotationMax = it.rotationMax, + positionSpring = it.positionSpring, + rotationSpring = it.rotationSpring, + ) + } + private fun loadScene(scene: Scene, expressions: List): PreProcessModelLoadInfo { val rootNode = NodeLoadInfo( nodeId = null, @@ -631,6 +661,7 @@ class ModelPreprocessor private constructor( val rootNodeIndex = nodes.size nodes.add(rootNode) val (expressions, expressionGroups) = loadExpressions(expressions) + val physicalJoints = loadPhysicalJoints(model.physicalJoints) return PreProcessModelLoadInfo( textures = textures, indexBuffers = indexBuffers, @@ -642,6 +673,7 @@ class ModelPreprocessor private constructor( morphTargetInfos = morphTargetInfos, expressions = expressions, expressionGroups = expressionGroups, + physicalJoints = physicalJoints, renderTransform = scene.transform, ) } diff --git a/blazerod/render/main/runtime/load/ModelResourceLoader.kt b/blazerod/render/main/runtime/load/ModelResourceLoader.kt index ec8e02ec..ad3476c6 100644 --- a/blazerod/render/main/runtime/load/ModelResourceLoader.kt +++ b/blazerod/render/main/runtime/load/ModelResourceLoader.kt @@ -141,6 +141,7 @@ object ModelResourceLoader { skins = info.skins, expressions = info.expressions, expressionGroups = info.expressionGroups, + physicalJoints = info.physicalJoints, renderTransform = info.renderTransform, ) } diff --git a/blazerod/render/main/runtime/load/SceneReconstructor.kt b/blazerod/render/main/runtime/load/SceneReconstructor.kt index 930a1f15..72ff204e 100644 --- a/blazerod/render/main/runtime/load/SceneReconstructor.kt +++ b/blazerod/render/main/runtime/load/SceneReconstructor.kt @@ -153,6 +153,13 @@ class SceneReconstructor private constructor(private val info: GpuLoadModelLoadI } ) } + + is NodeLoadInfo.Component.RigidBody -> { + RigidBodyComponent( + rigidBodyIndex = component.rigidBodyIndex, + rigidBodyData = component.rigidBody, + ) + } } }, ) @@ -170,6 +177,7 @@ class SceneReconstructor private constructor(private val info: GpuLoadModelLoadI expressions = info.expressions, expressionGroups = info.expressionGroups, cameras = cameras, + physicsJoints = info.physicalJoints, renderTransform = info.renderTransform, ) } diff --git a/blazerod/render/main/runtime/node/UpdatePhase.kt b/blazerod/render/main/runtime/node/UpdatePhase.kt index 0f6b507c..eb408bf2 100644 --- a/blazerod/render/main/runtime/node/UpdatePhase.kt +++ b/blazerod/render/main/runtime/node/UpdatePhase.kt @@ -11,6 +11,8 @@ sealed class UpdatePhase( enum class Type { IK_UPDATE, INFLUENCE_TRANSFORM_UPDATE, + PHYSICS_UPDATE_PRE, + PHYSICS_UPDATE_POST, GLOBAL_TRANSFORM_PROPAGATION, RENDER_DATA_UPDATE, CAMERA_UPDATE, @@ -21,6 +23,10 @@ sealed class UpdatePhase( data object InfluenceTransformUpdate : UpdatePhase(Type.INFLUENCE_TRANSFORM_UPDATE) + data object PhysicsUpdatePre : UpdatePhase(Type.PHYSICS_UPDATE_PRE) + + data object PhysicsUpdatePost : UpdatePhase(Type.PHYSICS_UPDATE_POST) + data object GlobalTransformPropagation : UpdatePhase(Type.GLOBAL_TRANSFORM_PROPAGATION) data object RenderDataUpdate : UpdatePhase(Type.RENDER_DATA_UPDATE) diff --git a/blazerod/render/main/runtime/node/component/BoxUtil.kt b/blazerod/render/main/runtime/node/component/BoxUtil.kt index 42c7652d..08fee79e 100644 --- a/blazerod/render/main/runtime/node/component/BoxUtil.kt +++ b/blazerod/render/main/runtime/node/component/BoxUtil.kt @@ -1,7 +1,9 @@ package top.fifthlight.blazerod.runtime.node.component - import net.minecraft.client.render.VertexConsumer import org.joml.Matrix4f +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin fun VertexConsumer.drawBox(matrix: Matrix4f, halfSize: Float, color: Int) { vertex(matrix, -halfSize, -halfSize, halfSize).color(color) @@ -33,4 +35,208 @@ fun VertexConsumer.drawBox(matrix: Matrix4f, halfSize: Float, color: Int) { vertex(matrix, halfSize, -halfSize, -halfSize).color(color) vertex(matrix, halfSize, -halfSize, halfSize).color(color) vertex(matrix, -halfSize, -halfSize, halfSize).color(color) -} \ No newline at end of file +} + +fun VertexConsumer.drawBoxWireframe(matrix: Matrix4f, width: Float, height: Float, length: Float, color: Int) { + val halfWidth = width / 2.0f + val halfHeight = height / 2.0f + val halfLength = length / 2.0f + + vertex(matrix, -halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + + vertex(matrix, -halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + + vertex(matrix, -halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, -halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, halfLength).color(color).normal(0f, 1f, 0f) + vertex(matrix, -halfWidth, halfHeight, -halfLength).color(color).normal(0f, 1f, 0f) +} + +fun VertexConsumer.drawSphereWireframe( + matrix: Matrix4f, + radius: Float, + segments: Int = 16, + color: Int, +) { + val angleStep = (2 * PI / segments).toFloat() + + for (i in 0..segments) { + val latAngle = PI.toFloat() / 2 - i * angleStep + val y = radius * sin(latAngle) + val r = radius * cos(latAngle) + + var prevX = r * cos(0f) + var prevZ = r * sin(0f) + + for (j in 1..segments) { + val lonAngle = j * angleStep + val x = r * cos(lonAngle) + val z = r * sin(lonAngle) + + vertex(matrix, prevX, y, prevZ).color(color).normal(0f, 1f, 0f) + vertex(matrix, x, y, z).color(color).normal(0f, 1f, 0f) + + prevX = x + prevZ = z + } + } + + for (i in 0 until segments) { + val lonAngle = i * angleStep + + var prevX = radius * cos(PI.toFloat() / 2) * cos(lonAngle) + var prevY = radius * sin(PI.toFloat() / 2) + var prevZ = radius * cos(PI.toFloat() / 2) * sin(lonAngle) + + for (j in 1..segments) { + val latAngle = PI.toFloat() / 2 - j * angleStep + val x = radius * cos(latAngle) * cos(lonAngle) + val y = radius * sin(latAngle) + val z = radius * cos(latAngle) * sin(lonAngle) + + vertex(matrix, prevX, prevY, prevZ).color(color).normal(0f, 1f, 0f) + vertex(matrix, x, y, z).color(color).normal(0f, 1f, 0f) + + prevX = x + prevY = y + prevZ = z + } + } +} + +fun VertexConsumer.drawCapsuleWireframe( + matrix: Matrix4f, + radius: Float, + height: Float, + segments: Int = 16, + color: Int, +) { + val halfHeight = height / 2.0f + val angleStep = (2 * PI / segments).toFloat() + + for (i in 0..segments) { + val angle = i * angleStep + val nextAngle = (i + 1) * angleStep + + val x1 = radius * cos(angle) + val z1 = radius * sin(angle) + val x2 = radius * cos(nextAngle) + val z2 = radius * sin(nextAngle) + + vertex(matrix, x1, halfHeight, z1).color(color).normal(0f, 1f, 0f) + vertex(matrix, x2, halfHeight, z2).color(color).normal(0f, 1f, 0f) + + vertex(matrix, x1, -halfHeight, z1).color(color).normal(0f, 1f, 0f) + vertex(matrix, x2, -halfHeight, z2).color(color).normal(0f, 1f, 0f) + + vertex(matrix, x1, halfHeight, z1).color(color).normal(0f, 1f, 0f) + vertex(matrix, x1, -halfHeight, z1).color(color).normal(0f, 1f, 0f) + } + + val topCenterY = halfHeight + for (i in 0 until segments / 2) { + val latAngleCurrent = PI.toFloat() / 2 - i * angleStep + val latAngleNext = PI.toFloat() / 2 - (i + 1) * angleStep + + for (j in 0 until segments) { + val lonAngleCurrent = j * angleStep + val lonAngleNext = (j + 1) * angleStep + + val xCurrentLat = radius * cos(latAngleCurrent) * cos(lonAngleCurrent) + val yCurrentLat = topCenterY + radius * sin(latAngleCurrent) + val zCurrentLat = radius * cos(latAngleCurrent) * sin(lonAngleCurrent) + + val xNextLat = radius * cos(latAngleCurrent) * cos(lonAngleNext) + val yNextLat = topCenterY + radius * sin(latAngleCurrent) + val zNextLat = radius * cos(latAngleCurrent) * sin(lonAngleNext) + + vertex(matrix, xCurrentLat, yCurrentLat, zCurrentLat).color(color).normal(0f, 1f, 0f) + vertex(matrix, xNextLat, yNextLat, zNextLat).color(color).normal(0f, 1f, 0f) + + val xCurrentLon = radius * cos(latAngleCurrent) * cos(lonAngleCurrent) + val yCurrentLon = topCenterY + radius * sin(latAngleCurrent) + val zCurrentLon = radius * cos(latAngleCurrent) * sin(lonAngleCurrent) + + val xNextLon = radius * cos(latAngleNext) * cos(lonAngleCurrent) + val yNextLon = topCenterY + radius * sin(latAngleNext) + val zNextLon = radius * cos(latAngleNext) * sin(lonAngleCurrent) + + vertex(matrix, xCurrentLon, yCurrentLon, zCurrentLon).color(color).normal(0f, 1f, 0f) + vertex(matrix, xNextLon, yNextLon, zNextLon).color(color).normal(0f, 1f, 0f) + } + } + val topPointY = topCenterY + radius + for (j in 0 until segments) { + val lonAngle = j * angleStep + val firstLatAngle = PI.toFloat() / 2 - angleStep + val xFirstLat = radius * cos(firstLatAngle) * cos(lonAngle) + val yFirstLat = topCenterY + radius * sin(firstLatAngle) + val zFirstLat = radius * cos(firstLatAngle) * sin(lonAngle) + + vertex(matrix, 0f, topPointY, 0f).color(color).normal(0f, 1f, 0f) + vertex(matrix, xFirstLat, yFirstLat, zFirstLat).color(color).normal(0f, 1f, 0f) + } + + val bottomCenterY = -halfHeight + for (i in 0 until segments / 2) { + val latAngleCurrent = -PI.toFloat() / 2 + i * angleStep + val latAngleNext = -PI.toFloat() / 2 + (i + 1) * angleStep + + for (j in 0 until segments) { + val lonAngleCurrent = j * angleStep + val lonAngleNext = (j + 1) * angleStep + + val xCurrentLat = radius * cos(latAngleCurrent) * cos(lonAngleCurrent) + val yCurrentLat = bottomCenterY + radius * sin(latAngleCurrent) + val zCurrentLat = radius * cos(latAngleCurrent) * sin(lonAngleCurrent) + + val xNextLat = radius * cos(latAngleCurrent) * cos(lonAngleNext) + val yNextLat = bottomCenterY + radius * sin(latAngleCurrent) + val zNextLat = radius * cos(latAngleCurrent) * sin(lonAngleNext) + + vertex(matrix, xCurrentLat, yCurrentLat, zCurrentLat).color(color).normal(0f, 1f, 0f) + vertex(matrix, xNextLat, yNextLat, zNextLat).color(color).normal(0f, 1f, 0f) + + val xCurrentLon = radius * cos(latAngleCurrent) * cos(lonAngleCurrent) + val yCurrentLon = bottomCenterY + radius * sin(latAngleCurrent) + val zCurrentLon = radius * cos(latAngleNext) * sin(lonAngleCurrent) + + val xNextLon = radius * cos(latAngleNext) * cos(lonAngleCurrent) + val yNextLon = bottomCenterY + radius * sin(latAngleNext) + val zNextLon = radius * cos(latAngleNext) * sin(lonAngleCurrent) + + vertex(matrix, xCurrentLon, yCurrentLon, zCurrentLon).color(color).normal(0f, 1f, 0f) + vertex(matrix, xNextLon, yNextLon, zNextLon).color(color).normal(0f, 1f, 0f) + } + } + + val bottomPointY = bottomCenterY - radius + for (j in 0 until segments) { + val lonAngle = j * angleStep + val firstLatAngle = -PI.toFloat() / 2 + angleStep + val xFirstLat = radius * cos(firstLatAngle) * cos(lonAngle) + val yFirstLat = bottomCenterY + radius * sin(firstLatAngle) + val zFirstLat = radius * cos(firstLatAngle) * sin(lonAngle) + + vertex(matrix, 0f, bottomPointY, 0f).color(color).normal(0f, 1f, 0f) + vertex(matrix, xFirstLat, yFirstLat, zFirstLat).color(color).normal(0f, 1f, 0f) + } +} diff --git a/blazerod/render/main/runtime/node/component/RenderNodeComponent.kt b/blazerod/render/main/runtime/node/component/RenderNodeComponent.kt index b344596d..9fa3dea8 100644 --- a/blazerod/render/main/runtime/node/component/RenderNodeComponent.kt +++ b/blazerod/render/main/runtime/node/component/RenderNodeComponent.kt @@ -27,15 +27,18 @@ sealed class RenderNodeComponent> : AbstractRefCount( get() = "node" sealed class Type> { - object Primitive : Type() - object Joint : Type() - object InfluenceSource : Type() - object Camera : Type() - object IkTarget : Type() + object Primitive : Type() + object Joint : Type() + object InfluenceSource : Type() + object Camera : Type() + object IkTarget : Type() + object RigidBody : Type() } abstract val type: Type + open fun onAttached(instance: ModelInstanceImpl, node: RenderNodeImpl) {} + abstract val updatePhases: List abstract fun update(phase: UpdatePhase, node: RenderNodeImpl, instance: ModelInstanceImpl) diff --git a/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt b/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt new file mode 100644 index 00000000..c30332a2 --- /dev/null +++ b/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt @@ -0,0 +1,35 @@ +package top.fifthlight.blazerod.runtime.node.component + +import top.fifthlight.blazerod.model.RigidBody +import top.fifthlight.blazerod.runtime.ModelInstanceImpl +import top.fifthlight.blazerod.runtime.node.RenderNodeImpl +import top.fifthlight.blazerod.runtime.node.UpdatePhase + +class RigidBodyComponent( + val rigidBodyIndex: Int, + val rigidBodyData: RigidBody, +) : RenderNodeComponent() { + override val type: Type + get() = Type.RigidBody + + companion object { + private val updatePhase = listOf( + UpdatePhase.Type.PHYSICS_UPDATE_PRE, + UpdatePhase.Type.PHYSICS_UPDATE_POST, + UpdatePhase.Type.DEBUG_RENDER, + ) + } + + override val updatePhases: List + get() = updatePhase + + override fun update( + phase: UpdatePhase, + node: RenderNodeImpl, + instance: ModelInstanceImpl, + ) { + + } + + override fun onClosed() {} +} \ No newline at end of file diff --git a/blazerod/render/main/runtime/renderer/BUILD.bazel b/blazerod/render/main/runtime/renderer/BUILD.bazel index ce85aae9..d1cd4ab1 100644 --- a/blazerod/render/main/runtime/renderer/BUILD.bazel +++ b/blazerod/render/main/runtime/renderer/BUILD.bazel @@ -13,6 +13,7 @@ kt_merge_library( "//blazerod/render/main/extension", "//blazerod/render/main/runtime", "//blazerod/render/main/runtime/data", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/uniform", "//blazerod/render/main/util/gpushaderpool", "//blazerod/render/main/util/bitmap", diff --git a/blazerod/render/main/runtime/resource/BUILD.bazel b/blazerod/render/main/runtime/resource/BUILD.bazel new file mode 100644 index 00000000..edc780b5 --- /dev/null +++ b/blazerod/render/main/runtime/resource/BUILD.bazel @@ -0,0 +1,22 @@ +load("//rule:merge_library.bzl", "kt_merge_library") + +kt_merge_library( + name = "resource", + srcs = glob(["*.kt"]), + actual = True, + merge_deps = [ + "//blazerod/render/main:main_base", + "//blazerod/render/api/resource", + "//blazerod/render/api/refcount", + "//blazerod/render/main/extension", + "//blazerod/render/main/render", + ], + visibility = ["//blazerod/render:__subpackages__"], + deps = [ + "//blazerod/model/model-base", + "//blazerod/render/game:remapped_client_access_widened_named", + "@maven//:org_jetbrains_kotlin_kotlin_stdlib", + "@maven//:org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm", + "@minecraft//:1.21.8_client_libraries", + ], +) diff --git a/blazerod/render/main/runtime/resource/RenderPhysicsJoint.kt b/blazerod/render/main/runtime/resource/RenderPhysicsJoint.kt new file mode 100644 index 00000000..17e2d197 --- /dev/null +++ b/blazerod/render/main/runtime/resource/RenderPhysicsJoint.kt @@ -0,0 +1,19 @@ +package top.fifthlight.blazerod.runtime.resource + +import org.joml.Vector3fc +import top.fifthlight.blazerod.model.PhysicalJoint + +data class RenderPhysicsJoint( + val name: String? = null, + val type: PhysicalJoint.JointType, + val rigidBodyAIndex: Int, + val rigidBodyBIndex: Int, + val position: Vector3fc, + val rotation: Vector3fc, + val positionMin: Vector3fc, + val positionMax: Vector3fc, + val rotationMin: Vector3fc, + val rotationMax: Vector3fc, + val positionSpring: Vector3fc, + val rotationSpring: Vector3fc, +) diff --git a/blazerod/render/neoforge/BUILD.bazel b/blazerod/render/neoforge/BUILD.bazel index c3279086..ed75d6c8 100644 --- a/blazerod/render/neoforge/BUILD.bazel +++ b/blazerod/render/neoforge/BUILD.bazel @@ -50,7 +50,9 @@ kt_merge_library( "//blazerod/render/main/util/dispatchers", "//blazerod/render/main/util/objectpool", "//blazerod/render/main/layout", + "//blazerod/render/main/physics", "//blazerod/render/main/runtime", + "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/uniform", ], ) diff --git a/blazerod/render/neoforge/BlazeRodNeoForge.kt b/blazerod/render/neoforge/BlazeRodNeoForge.kt index 38bdd4a6..a078dc74 100644 --- a/blazerod/render/neoforge/BlazeRodNeoForge.kt +++ b/blazerod/render/neoforge/BlazeRodNeoForge.kt @@ -13,6 +13,7 @@ import net.neoforged.neoforge.common.NeoForge import org.slf4j.LoggerFactory import top.fifthlight.blazerod.api.event.RenderEvents import top.fifthlight.blazerod.debug.* +import top.fifthlight.blazerod.physics.PhysicsInterface import top.fifthlight.blazerod.runtime.resource.RenderTexture import top.fifthlight.blazerod.runtime.uniform.UniformBuffer import top.fifthlight.blazerod.util.dispatchers.ThreadExecutorDispatcher @@ -30,6 +31,8 @@ class BlazeRodNeoForge(private val container: ModContainer) { fun onClientSetup(event: FMLClientSetupEvent) { BlazeRod.mainDispatcher = ThreadExecutorDispatcher(MinecraftClient.getInstance()) + PhysicsInterface.load() + // NeoForge initialize device before us, so no RenderEvents.INITIALIZE_DEVICE here event.enqueueWork { // GO MAIN THREAD! diff --git a/external/rules_kotlin/patches/BUILD.bazel b/external/rules_kotlin/patches/BUILD.bazel deleted file mode 100644 index e69de29b..00000000 diff --git a/game/BUILD.bazel b/game/BUILD.bazel index 394753ec..3b6b933b 100644 --- a/game/BUILD.bazel +++ b/game/BUILD.bazel @@ -1,5 +1,4 @@ load("//:properties.bzl", "game_version", "mod_version") -load("//rule:decompile_jar.bzl", "decompile_jar") load("//rule:extract_jar.bzl", "extract_jar") load("//rule:merge_mapping.bzl", "merge_mapping", "merge_mapping_input") load("//rule:remap_jar.bzl", "remap_jar") diff --git a/game/neoforge_yarn_fix.tiny b/game/neoforge_yarn_fix.tiny index 1792455f..9d2d3ac3 100644 --- a/game/neoforge_yarn_fix.tiny +++ b/game/neoforge_yarn_fix.tiny @@ -1,3 +1,7 @@ -tiny 2 0 official named -c fxa net/minecraft/client/gui/hud/InGameHud - m (Lfxb;Lftu;)V p renderItemHotbar +tiny 2 0 official mojang named +c fxa net/minecraft/client/gui/hud/InGameHud net/minecraft/client/gui/Gui + m (Lfxb;Lftu;)V p renderItemHotbar renderItemHotbar +c gkn$d net/minecraft/client/gui/screens/worldselection/EditGameRulesScreen$GameRuleEntry net/minecraft/client/gui/screen/world/EditGameRulesScreen$NamedRuleWidget + f Lgkn; b this$EditGameRulesScreen this$EditGameRulesScreen +c fol$e com/mojang/realmsclient/RealmsMainScreen$Entry net/minecraft/client/realms/gui/screen/RealmsMainScreen$Entry + f Lfol; e this$RealmsMainScreen this$RealmsMainScreen diff --git a/maven_install.json b/maven_install.json index fceb1ee8..120526c3 100755 --- a/maven_install.json +++ b/maven_install.json @@ -1,10 +1,14 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -1432346722, - "__RESOLVED_ARTIFACTS_HASH": 1470582255, + "__INPUT_ARTIFACTS_HASH": -171287978, + "__RESOLVED_ARTIFACTS_HASH": -1116635323, "conflict_resolution": { + "com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.10.1", "com.google.errorprone:error_prone_annotations:2.23.0": "com.google.errorprone:error_prone_annotations:2.36.0", - "com.google.guava:guava:33.0.0-jre": "com.google.guava:guava:33.4.8-jre" + "com.google.errorprone:error_prone_annotations:2.5.1": "com.google.errorprone:error_prone_annotations:2.36.0", + "com.google.guava:guava:32.0.1-jre": "com.google.guava:guava:33.4.8-jre", + "com.google.guava:guava:33.0.0-jre": "com.google.guava:guava:33.4.8-jre", + "com.google.j2objc:j2objc-annotations:2.8": "com.google.j2objc:j2objc-annotations:3.0.0" }, "artifacts": { "at.favre.lib:hkdf": { @@ -30,10 +34,10 @@ }, "com.fasterxml.jackson.core:jackson-annotations": { "shasums": { - "jar": "45d32ac61ef8a744b464c54c2b3414be571016dd46bfc2bec226761cf7ae457a", - "sources": "eb1e62bc83f4d8e1f0660c9cf2f06d6d196eefb20de265cfff96521015d87020" + "jar": "4d1ce5575ad53bee8caae4c15016878e2c3ea47276e675a35ea6bdde3bb0e653", + "sources": "022ac1b2a3ff015f380d0f8e89b7c08488605f8201227ce9c6a9bb92107414cc" }, - "version": "2.9.0" + "version": "2.9.6" }, "com.fasterxml.jackson.core:jackson-core": { "shasums": { @@ -128,8 +132,7 @@ }, "com.google.guava:listenablefuture": { "shasums": { - "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "sources": null + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" }, "version": "9999.0-empty-to-avoid-conflict-with-guava" }, @@ -287,18 +290,6 @@ }, "version": "0.4.64+9ec45cd8f3" }, - "net.fabricmc.fabric-api:fabric-api-deprecated": { - "shasums": { - "sources": null - }, - "version": "0.129.0+1.21.8" - }, - "net.fabricmc.fabric-api:fabric-api-deprecated:pom": { - "shasums": { - "jar": "b44233ad326ed21fb93eb3288d3316bb15bcc88cd46549bcde027c6fe2ae4eb5" - }, - "version": "0.129.0+1.21.8" - }, "net.fabricmc.fabric-api:fabric-api-lookup-api-v1": { "shasums": { "jar": "84e4c8e74289a8a7fecbe4b6d0a02642c082133d50a0cdb3ba5d975d22bed3fe", @@ -348,13 +339,6 @@ }, "version": "10.0.18+946bf4c3f3" }, - "net.fabricmc.fabric-api:fabric-convention-tags-v1": { - "shasums": { - "jar": "a002746df57b510140e159ce997522dc7d40e5d3441ff4692e9f8df1d88b8f59", - "sources": "f274e436f0246e38ca46b1d1d6ddcbe45d532caeb924be56cf2e1fbc1b4a6639" - }, - "version": "2.1.40+7f945d5bf3" - }, "net.fabricmc.fabric-api:fabric-convention-tags-v2": { "shasums": { "jar": "209d1a4210d842bf658ff2003a5c8b2d8b3d02dbb6acaad7fd4646096c8be2df", @@ -446,13 +430,6 @@ }, "version": "2.6.3+db4dfd85f3" }, - "net.fabricmc.fabric-api:fabric-loot-api-v2": { - "shasums": { - "jar": "3f8b0f693c61022a4897adfe5704d0df3366d8ec1af8d0fbdece7e5b9e662730", - "sources": "06b650c7c359e4688351230d69869f4032571ac751172c6c856a4a9e68de3435" - }, - "version": "3.0.55+3f89f5a5f3" - }, "net.fabricmc.fabric-api:fabric-loot-api-v3": { "shasums": { "jar": "3a1dae7c4488aeb4fbefdffff3674f213b54db3e103d1368ed09801aeb69dbcf", @@ -616,7 +593,6 @@ }, "net.fabricmc:intermediary": { "shasums": { - "sources": null, "v2": "28c5e58cc82093327498edc7c62561b22421c8e80f51f3f90edb156b9b60262d" }, "version": "1.21.8" @@ -735,8 +711,7 @@ }, "org.apache.ant:ant-launcher": { "shasums": { - "jar": "72b3d03e0d7d86a56513ec38dd4cd6abe3da6620189be222ab255352cb6eba4a", - "sources": null + "jar": "72b3d03e0d7d86a56513ec38dd4cd6abe3da6620189be222ab255352cb6eba4a" }, "version": "1.7.0" }, @@ -1128,8 +1103,7 @@ }, "thedarkcolour:kotlinforforge-neoforge": { "shasums": { - "jar": "a9baea2b4d100011df23b62402de06df5b9b075f66e6b2bb3f2c4f4e6d73eb64", - "sources": null + "jar": "a9baea2b4d100011df23b62402de06df5b9b075f66e6b2bb3f2c4f4e6d73eb64" }, "version": "5.9.0" } @@ -1203,7 +1177,6 @@ ], "net.fabricmc.fabric-api:fabric-api": [ "net.fabricmc.fabric-api:fabric-api-base", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-biome-api-v1", "net.fabricmc.fabric-api:fabric-block-api-v1", @@ -1245,10 +1218,6 @@ "net.fabricmc.fabric-api:fabric-transfer-api-v1", "net.fabricmc.fabric-api:fabric-transitive-access-wideners-v1" ], - "net.fabricmc.fabric-api:fabric-api-deprecated:pom": [ - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-loot-api-v2" - ], "net.fabricmc.fabric-api:fabric-api-lookup-api-v1": [ "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1" @@ -1261,10 +1230,6 @@ "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-resource-loader-v0" ], - "net.fabricmc.fabric-api:fabric-convention-tags-v1": [ - "net.fabricmc.fabric-api:fabric-api-base", - "net.fabricmc.fabric-api:fabric-convention-tags-v2" - ], "net.fabricmc.fabric-api:fabric-convention-tags-v2": [ "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1" @@ -1307,11 +1272,6 @@ "net.fabricmc.fabric-api:fabric-lifecycle-events-v1": [ "net.fabricmc.fabric-api:fabric-api-base" ], - "net.fabricmc.fabric-api:fabric-loot-api-v2": [ - "net.fabricmc.fabric-api:fabric-api-base", - "net.fabricmc.fabric-api:fabric-loot-api-v3", - "net.fabricmc.fabric-api:fabric-resource-loader-v0" - ], "net.fabricmc.fabric-api:fabric-loot-api-v3": [ "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-resource-loader-v0" @@ -2321,10 +2281,6 @@ "net.fabricmc.fabric.impl.content.registry.util", "net.fabricmc.fabric.mixin.content.registry" ], - "net.fabricmc.fabric-api:fabric-convention-tags-v1": [ - "net.fabricmc.fabric.api.tag.convention.v1", - "net.fabricmc.fabric.impl.tag.convention" - ], "net.fabricmc.fabric-api:fabric-convention-tags-v2": [ "net.fabricmc.fabric.api.tag", "net.fabricmc.fabric.api.tag.convention.v2", @@ -2423,11 +2379,6 @@ "net.fabricmc.fabric.mixin.event.lifecycle.client", "net.fabricmc.fabric.mixin.event.lifecycle.server" ], - "net.fabricmc.fabric-api:fabric-loot-api-v2": [ - "net.fabricmc.fabric.api.loot.v2", - "net.fabricmc.fabric.impl.loot.v2", - "net.fabricmc.fabric.mixin.loot.v2" - ], "net.fabricmc.fabric-api:fabric-loot-api-v3": [ "net.fabricmc.fabric.api.loot.v3", "net.fabricmc.fabric.impl.loot", @@ -4043,7 +3994,7 @@ ] }, "repositories": { - "https://repo1.maven.org/maven2/": [ + "https://api.modrinth.com/maven/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -4122,7 +4073,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -4138,8 +4088,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -4166,8 +4114,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -4366,7 +4312,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://maven.fabricmc.net/": [ + "https://masa.dy.fi/maven/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -4445,7 +4391,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -4461,8 +4406,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -4489,8 +4432,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -4689,7 +4630,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://maven.neoforged.net/releases/": [ + "https://maven.fabricmc.net/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -4768,7 +4709,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -4784,8 +4724,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -4812,8 +4750,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -5012,7 +4948,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://maven.terraformersmc.com/": [ + "https://maven.neoforged.net/releases/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -5091,7 +5027,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -5107,8 +5042,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -5135,8 +5068,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -5414,7 +5345,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -5430,8 +5360,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -5458,8 +5386,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -5658,7 +5584,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://masa.dy.fi/maven/": [ + "https://maven.terraformersmc.com/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -5737,7 +5663,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -5753,8 +5678,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -5781,8 +5704,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -5981,7 +5902,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://thedarkcolour.github.io/KotlinForForge/": [ + "https://repo1.maven.org/maven2/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -6060,7 +5981,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -6076,8 +5996,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -6104,8 +6022,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -6304,7 +6220,7 @@ "thedarkcolour:kffmod-neoforge:jar:sources", "thedarkcolour:kotlinforforge-neoforge" ], - "https://api.modrinth.com/maven/": [ + "https://thedarkcolour.github.io/KotlinForForge/": [ "at.favre.lib:hkdf", "at.favre.lib:hkdf:jar:sources", "ch.qos.logback:logback-classic", @@ -6383,7 +6299,6 @@ "net.fabricmc.fabric-api:fabric-api", "net.fabricmc.fabric-api:fabric-api-base", "net.fabricmc.fabric-api:fabric-api-base:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:pom", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1", "net.fabricmc.fabric-api:fabric-api-lookup-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-api:jar:sources", @@ -6399,8 +6314,6 @@ "net.fabricmc.fabric-api:fabric-command-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-content-registries-v0", "net.fabricmc.fabric-api:fabric-content-registries-v0:jar:sources", - "net.fabricmc.fabric-api:fabric-convention-tags-v1", - "net.fabricmc.fabric-api:fabric-convention-tags-v1:jar:sources", "net.fabricmc.fabric-api:fabric-convention-tags-v2", "net.fabricmc.fabric-api:fabric-convention-tags-v2:jar:sources", "net.fabricmc.fabric-api:fabric-crash-report-info-v1", @@ -6427,8 +6340,6 @@ "net.fabricmc.fabric-api:fabric-key-binding-api-v1:jar:sources", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1", "net.fabricmc.fabric-api:fabric-lifecycle-events-v1:jar:sources", - "net.fabricmc.fabric-api:fabric-loot-api-v2", - "net.fabricmc.fabric-api:fabric-loot-api-v2:jar:sources", "net.fabricmc.fabric-api:fabric-loot-api-v3", "net.fabricmc.fabric-api:fabric-loot-api-v3:jar:sources", "net.fabricmc.fabric-api:fabric-message-api-v1", @@ -6949,7 +6860,6 @@ }, "skipped": [ "com.google.guava:listenablefuture:jar:sources", - "net.fabricmc.fabric-api:fabric-api-deprecated:jar:sources", "net.fabricmc:intermediary:jar:sources", "org.apache.ant:ant-launcher:jar:sources", "thedarkcolour:kotlinforforge-neoforge:jar:sources" diff --git a/mod/BUILD.bazel b/mod/BUILD.bazel index 61b531b8..acb58aab 100644 --- a/mod/BUILD.bazel +++ b/mod/BUILD.bazel @@ -213,6 +213,7 @@ modrinth_dependency( upload_modrinth( name = "upload_modrinth_fabric", + tags = ["only_build_when_release"], token_secret_id = "modrinth_token", project_id = "tLPuDSOw", version_name = mod_version, @@ -239,6 +240,7 @@ modrinth_dependency( upload_modrinth( name = "upload_modrinth_neoforge", + tags = ["only_build_when_release"], token_secret_id = "modrinth_token", project_id = "tLPuDSOw", version_name = mod_version, diff --git a/mod/src/game/BUILD.bazel b/mod/src/game/BUILD.bazel index bbbcb061..6f80cd92 100644 --- a/mod/src/game/BUILD.bazel +++ b/mod/src/game/BUILD.bazel @@ -1,7 +1,6 @@ load("@rules_java//java:defs.bzl", "java_library") load("//rule:apply_access_widener.bzl", "apply_access_widener") load("//rule:extract_access_widener.bzl", "extract_access_widener") -load("//rule:decompile_jar.bzl", "decompile_jar") load("//rule/neoforge:convert_access_widener.bzl", "convert_access_widener") load("//rule:remap_access_widener.bzl", "remap_access_widener") diff --git a/platforms/BUILD.bazel b/platforms/BUILD.bazel new file mode 100644 index 00000000..13d61358 --- /dev/null +++ b/platforms/BUILD.bazel @@ -0,0 +1,55 @@ +platform( + name = "android_arm64", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:android", + "@platforms//cpu:aarch64", + ], +) + +platform( + name = "android_x86_64", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:android", + "@platforms//cpu:x86_64", + ], +) + +platform( + name = "linux_x86_64_glibc", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + "@zig_sdk//libc:gnu.2.24", + ], +) + +platform( + name = "linux_arm64_glibc", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + "@zig_sdk//libc:gnu.2.24", + ], +) + +platform( + name = "windows_x86_64", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], +) + +platform( + name = "windows_arm64", + visibility = ["//visibility:public"], + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:aarch64", + ] +) \ No newline at end of file diff --git a/platforms/platforms.bzl b/platforms/platforms.bzl new file mode 100644 index 00000000..750274ee --- /dev/null +++ b/platforms/platforms.bzl @@ -0,0 +1,59 @@ +_CPUS = [ + "aarch32", + "aarch64", + "armv6-m", + "armv7-m", + "armv7e-m", + "armv7e-mf", + "armv8-m", + "arm64_32", + "arm64e", + "armv7", + "armv7k", + "cortex-r52", + "i386", + "ppc", + "ppc32", + "ppc64le", + "s390x", + "x86_32", + "x86_64", + "wasm32", + "wasm64", + "mips64", + "riscv32", + "riscv64", +] + +_OSES = [ + "freebsd", + "netbsd", + "openbsd", + "haiku", + "android", + "linux", + "windows", + "vxworks", + "ios", + "macos", + "tvos", + "watchos", + "visionos", + "qnx", + "nixos", + "emscripten", + "wasi", + "fuchsia", + "chromiumos", + "uefi", +] + +select_current_cpu = select({ + "@platforms//cpu:%s" % cpu: cpu + for cpu in _CPUS +}) + +select_current_os = select({ + "@platforms//os:%s" % os: os + for os in _OSES +}) diff --git a/rule/cc_jni_library.bzl b/rule/cc_jni_library.bzl new file mode 100644 index 00000000..d4b398eb --- /dev/null +++ b/rule/cc_jni_library.bzl @@ -0,0 +1,155 @@ +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_shared_library") +load("@rules_java//java:defs.bzl", "java_library") +load("//platforms:platforms.bzl", "select_current_cpu", "select_current_os") +load("@bazel_lib//lib:copy_file.bzl", "copy_file_action", "COPY_FILE_TOOLCHAINS") + +# Most logic come from rules_jni + +_command_line_platforms = "//command_line_option:platforms" + +def _multi_platform_transition_impl(settings, attrs): + if not attrs.platforms: + return { + _command_line_platforms: settings[_command_line_platforms], + } + return [ + {_command_line_platforms: [target_platform]} + for target_platform in attrs.platforms + ] + +_multi_platform_transition = transition( + implementation = _multi_platform_transition_impl, + inputs = [_command_line_platforms], + outputs = [_command_line_platforms], +) + +JniLibraryInfo = provider(fields = ["file", "os", "cpu", "platform"]) + +def _jni_library_info_impl(ctx): + lib_files = ctx.attr.lib[DefaultInfo].files.to_list() + if len(lib_files) > 1: + fail("Expected exactly one file in lib target: %s" % lib_files) + lib_file = lib_files[0] + + return [ + JniLibraryInfo( + file = lib_file, + os = ctx.attr.os, + cpu = ctx.attr.cpu, + platform = ctx.fragments.platform.platform, + ), + ] + +_jni_library_info = rule( + implementation = _jni_library_info_impl, + attrs = { + "lib": attr.label(mandatory = True), + "os": attr.string(mandatory = True), + "cpu": attr.string(mandatory = True), + }, + provides = [JniLibraryInfo], + fragments = ["platform"], +) + +def _jni_library_collector_impl(ctx): + output_files = [] + seen_platforms = {} + + for info_provider in ctx.attr.infos: + info = info_provider[JniLibraryInfo] + os = info.os + cpu = info.cpu + original_name = ctx.attr.original_name + + identifier = "{}_{}".format(os, cpu) + if identifier in seen_platforms: + fail("""Target '{name}' is produced by multiple platforms for OS '{os}' and CPU '{cpu}': + Platform 1: {p1} + Platform 2: {p2} +Ensure each (os, cpu) pair is unique.""".format( + name = original_name, + os = os, + cpu = cpu, + p1 = seen_platforms[identifier], + p2 = info.platform, + )) + seen_platforms[identifier] = info.platform + + lib_basename = info.file.basename + lib_extension = lib_basename.split(".")[-1] + + output_path = "{original_name}_{os}_{cpu}/lib{lib_basename}.{lib_extension}".format( + original_name = original_name, + os = os, + cpu = cpu, + lib_basename = original_name, + lib_extension = lib_extension, + ) + output_file = ctx.actions.declare_file(output_path) + + copy_file_action( + ctx, + info.file, + output_file, + ) + output_files.append(output_file) + + return [DefaultInfo(files = depset(output_files))] + +_jni_library_collector = rule( + implementation = _jni_library_collector_impl, + toolchains = COPY_FILE_TOOLCHAINS, + attrs = { + "infos": attr.label_list( + providers = [JniLibraryInfo], + cfg = _multi_platform_transition, + mandatory = True, + ), + "original_name": attr.string(mandatory = True), + "platforms": attr.label_list(), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, +) + +def cc_jni_library(name, platforms = [], **kwargs): + cc_lib_name = name + "_cc_lib_private" + info_name = name + "_info_private" + collector_name = name + "_collector_private" + + tags = kwargs.pop("tags", default = None) + visibility = kwargs.pop("visibility", default = None) + + cc_shared_library( + name = cc_lib_name, + visibility = ["//visibility:private"], + tags = ["manual"], + **kwargs, + ) + + _jni_library_info( + name = info_name, + visibility = ["//visibility:private"], + tags = ["manual"], + lib = ":" + cc_lib_name, + os = select_current_os, + cpu = select_current_cpu, + ) + + _jni_library_collector( + name = collector_name, + visibility = ["//visibility:private"], + tags = ["manual"], + infos = [":" + info_name], + original_name = name, + platforms = platforms, + ) + + java_library( + name = name, + tags = tags, + visibility = visibility, + resources = [":" + collector_name], + resource_strip_prefix = native.package_name(), + ) From 4352e093245e20e5f69d574b4bcf32570a4b9f0d Mon Sep 17 00:00:00 2001 From: fifth_light Date: Tue, 7 Oct 2025 16:55:36 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20PMX=20=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=99=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blazerod/model/model-pmx/PmxLoader.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blazerod/model/model-pmx/PmxLoader.kt b/blazerod/model/model-pmx/PmxLoader.kt index f21e653e..5d892575 100644 --- a/blazerod/model/model-pmx/PmxLoader.kt +++ b/blazerod/model/model-pmx/PmxLoader.kt @@ -1105,6 +1105,9 @@ class PmxLoader : ModelFileLoader { loadMaterials(buffer) loadBones(buffer) loadMorphTargets(buffer) + loadDisplayFrames(buffer) + loadRigidBodies(buffer) + loadJoints(buffer) val modelId = UUID.randomUUID() val rootNodes = mutableListOf() From c30ce4a2d787c0c4a3486defda71b0df20a8b6d1 Mon Sep 17 00:00:00 2001 From: fifth_light Date: Thu, 27 Nov 2025 19:31:16 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=9C=89=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=9A=84=E5=9F=BA=E6=9C=AC=E7=89=A9=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blazerod/model/model-pmx/PmxLoader.kt | 38 ++++- blazerod/render/api/resource/ModelInstance.kt | 6 +- .../render/main/physics/PhysicsLibrary.java | 9 +- blazerod/render/main/physics/PhysicsScene.cpp | 1 + blazerod/render/main/physics/PhysicsScene.kt | 1 + blazerod/render/main/physics/PhysicsWorld.cpp | 151 ++++++++++++------ blazerod/render/main/physics/PhysicsWorld.h | 32 +++- blazerod/render/main/physics/PhysicsWorld.kt | 16 +- blazerod/render/main/physics/binding.cpp | 7 +- blazerod/render/main/runtime/BUILD.bazel | 2 + .../render/main/runtime/ModelInstanceImpl.kt | 67 ++++++-- .../render/main/runtime/RenderSceneImpl.kt | 66 ++++++-- .../node/component/RigidBodyComponent.kt | 85 ++++++++++ mod/BUILD.bazel | 4 +- .../fifthlight/armorstand/PlayerRenderer.kt | 6 +- 15 files changed, 403 insertions(+), 88 deletions(-) diff --git a/blazerod/model/model-pmx/PmxLoader.kt b/blazerod/model/model-pmx/PmxLoader.kt index 5d892575..317e2de1 100644 --- a/blazerod/model/model-pmx/PmxLoader.kt +++ b/blazerod/model/model-pmx/PmxLoader.kt @@ -1022,7 +1022,7 @@ class PmxLoader : ModelFileLoader { shape = loadShapeType(buffer.get()), shapeSize = loadVector3f(buffer).mul(MMD_SCALE), shapePosition = loadVector3f(buffer).transformPosition(), - shapeRotation = loadVector3f(buffer).also { it.x *= -1 }, + shapeRotation = loadVector3f(buffer).also { it.y *= -1 }, mass = buffer.getFloat(), moveAttenuation = buffer.getFloat(), rotationDamping = buffer.getFloat(), @@ -1060,7 +1060,7 @@ class PmxLoader : ModelFileLoader { val rigidBodyIndexA = loadRigidBodyIndex(buffer) val rigidBodyIndexB = loadRigidBodyIndex(buffer) val position = loadVector3f(buffer).transformPosition() - val rotation = loadVector3f(buffer).also { it.x *= -1; it.y *= -1 } + val rotation = loadVector3f(buffer).also { it.y *= -1 } val positionMinimumOrig = loadVector3f(buffer).transformPosition() val positionMaximumOrig = loadVector3f(buffer).transformPosition() @@ -1071,7 +1071,7 @@ class PmxLoader : ModelFileLoader { val rotationMaximumOrig = loadVector3f(buffer) val rotationMinimum = Vector3f(-rotationMaximumOrig.x, rotationMinimumOrig.y, rotationMinimumOrig.z) val rotationMaximum = Vector3f(-rotationMinimumOrig.x, rotationMaximumOrig.y, rotationMaximumOrig.z) - val positionSpring = loadVector3f(buffer).transformPosition() + val positionSpring = loadVector3f(buffer) val rotationSpring = loadVector3f(buffer).also { it.x *= -1 } PmxJoint( @@ -1166,6 +1166,38 @@ class PmxLoader : ModelFileLoader { ) ) } + boneToRigidBodyMap[index]?.forEach { index -> + add( + NodeComponent.RigidBodyComponent( + rigidBodyId = RigidBodyId(modelId, index), + rigidBody = rigidBodies[index].let { rigidBody -> + RigidBody( + name = rigidBody.nameLocal.takeIf(String::isNotBlank), + collisionGroup = rigidBody.groupId, + collisionMask = rigidBody.nonCollisionGroup, + shape = when (rigidBody.shape) { + PmxRigidBody.ShapeType.SPHERE -> RigidBody.ShapeType.SPHERE + PmxRigidBody.ShapeType.BOX -> RigidBody.ShapeType.BOX + PmxRigidBody.ShapeType.CAPSULE -> RigidBody.ShapeType.CAPSULE + }, + shapeSize = rigidBody.shapeSize, + shapePosition = rigidBody.shapePosition, + shapeRotation = rigidBody.shapeRotation, + mass = rigidBody.mass, + moveAttenuation = rigidBody.moveAttenuation, + rotationDamping = rigidBody.rotationDamping, + repulsion = rigidBody.repulsion, + frictionForce = rigidBody.frictionForce, + physicsMode = when (rigidBody.physicsMode) { + PmxRigidBody.PhysicsMode.FOLLOW_BONE -> RigidBody.PhysicsMode.FOLLOW_BONE + PmxRigidBody.PhysicsMode.PHYSICS -> RigidBody.PhysicsMode.PHYSICS + PmxRigidBody.PhysicsMode.PHYSICS_PLUS_BONE -> RigidBody.PhysicsMode.PHYSICS_PLUS_BONE + }, + ) + }, + ) + ) + } } return Node( diff --git a/blazerod/render/api/resource/ModelInstance.kt b/blazerod/render/api/resource/ModelInstance.kt index 8ec70852..09be283b 100644 --- a/blazerod/render/api/resource/ModelInstance.kt +++ b/blazerod/render/api/resource/ModelInstance.kt @@ -15,6 +15,8 @@ interface ModelInstance : RefCount { fun clearTransform() fun setTransformMatrix(nodeIndex: Int, transformId: TransformId, matrix: Matrix4f) + fun setTransformMatrix(nodeIndex: Int, transformId: TransformId, updater: Consumer) + fun setTransformMatrix(nodeIndex: Int, transformId: TransformId, updater: NodeTransform.Matrix.() -> Unit) fun setTransformDecomposed(nodeIndex: Int, transformId: TransformId, decomposed: NodeTransformView.Decomposed) fun setTransformDecomposed(nodeIndex: Int, transformId: TransformId, updater: Consumer) fun setTransformDecomposed(nodeIndex: Int, transformId: TransformId, updater: NodeTransform.Decomposed.() -> Unit) @@ -26,8 +28,8 @@ interface ModelInstance : RefCount { fun getCameraTransform(index: Int): CameraTransform? fun updateCamera() - fun debugRender(viewProjectionMatrix: Matrix4fc, consumers: VertexConsumerProvider) - fun updateRenderData() + fun debugRender(viewProjectionMatrix: Matrix4fc, consumers: VertexConsumerProvider, time: Float) + fun updateRenderData(time: Float) fun createRenderTask( modelMatrix: Matrix4fc, diff --git a/blazerod/render/main/physics/PhysicsLibrary.java b/blazerod/render/main/physics/PhysicsLibrary.java index 42380802..36a8a3e1 100644 --- a/blazerod/render/main/physics/PhysicsLibrary.java +++ b/blazerod/render/main/physics/PhysicsLibrary.java @@ -29,7 +29,7 @@ private PhysicsLibrary() { public native static ByteBuffer getTransformBuffer(long physicsWorld); - public native static void stepPhysicsWorld(long physicsWorld, float deltaTime, float maxSubSteps, float fixedTimeStep); + public native static void stepPhysicsWorld(long physicsWorld, float deltaTime, int maxSubSteps, float fixedTimeStep); public native static void destroyPhysicsWorld(long physicsWorld); @@ -120,7 +120,12 @@ public static boolean load() { } catch (Exception ignored) { } - System.load(outputPath.toAbsolutePath().toString()); + try { + System.load(outputPath.toAbsolutePath().toString()); + } catch (UnsatisfiedLinkError ex) { + logger.error("Failed to load bullet physics native library", ex); + return false; + } try { Files.delete(outputPath); } catch (Exception ignored) { diff --git a/blazerod/render/main/physics/PhysicsScene.cpp b/blazerod/render/main/physics/PhysicsScene.cpp index b4bc5183..9cff96f8 100644 --- a/blazerod/render/main/physics/PhysicsScene.cpp +++ b/blazerod/render/main/physics/PhysicsScene.cpp @@ -3,6 +3,7 @@ #include #include +#include #include namespace blazerod::physics { diff --git a/blazerod/render/main/physics/PhysicsScene.kt b/blazerod/render/main/physics/PhysicsScene.kt index 5298cecf..6468b765 100644 --- a/blazerod/render/main/physics/PhysicsScene.kt +++ b/blazerod/render/main/physics/PhysicsScene.kt @@ -13,6 +13,7 @@ class PhysicsScene( ) : AutoCloseable { private val pointer: Long private var closed = false + internal val rigidBodyCount = rigidBodies.size init { require(rigidBodies.isNotEmpty()) { "Rigidbodies must not be empty" } diff --git a/blazerod/render/main/physics/PhysicsWorld.cpp b/blazerod/render/main/physics/PhysicsWorld.cpp index 7cd4fd8f..4a561429 100644 --- a/blazerod/render/main/physics/PhysicsWorld.cpp +++ b/blazerod/render/main/physics/PhysicsWorld.cpp @@ -18,58 +18,90 @@ struct PhysicsFilterCallback : public btOverlapFilterCallback { } }; -class FollowBoneMotionState : public btMotionState { - private: - PhysicsWorld* world; - size_t rigidbody_index; +void PhysicsMotionState::getWorldTransform(btTransform& world_transform) const { world_transform = this->transform; } + +void PhysicsMotionState::setWorldTransform(const btTransform& world_transform) { + this->transform = world_transform; + isDirty = true; +} +PhysicsMotionState::PhysicsMotionState(btTransform& initial_transform, const Vector3f& position, + const Vector3f& rotation) { + transform.setIdentity(); + + btMatrix3x3 rotation_matrix; + rotation_matrix.setEulerZYX(rotation.x, rotation.y, rotation.z); + btVector3 pos(position.x, position.y, position.z); + btTransform rigidbody_transform; + rigidbody_transform.setIdentity(); + rigidbody_transform.setOrigin(pos); + rigidbody_transform.setBasis(rotation_matrix); + + from_node_to_world.mult(rigidbody_transform, initial_transform.inverse()); + from_world_to_node = from_node_to_world.inverse(); +} + +class FollowBoneObjectMotionState : public PhysicsMotionState { public: - FollowBoneMotionState(PhysicsWorld* world, size_t rigidbody_index) - : world(world), rigidbody_index(rigidbody_index) {} - void getWorldTransform(btTransform& world_transform) const override { - world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + FollowBoneObjectMotionState(btTransform& initial_transform, const Vector3f& position, const Vector3f& rotation) + : PhysicsMotionState(initial_transform, position, rotation) {} + + void GetFromWorld(const PhysicsWorld* world, size_t rigidbody_index) override { + btTransform node_transform; + node_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[rigidbody_index * 16]); + this->transform.mult(node_transform, this->from_node_to_world); } void setWorldTransform(const btTransform& world_transform) override {} -}; -class PhysicsMotionState : public btMotionState { - private: - PhysicsWorld* world; - size_t rigidbody_index; + void SetToWorld(PhysicsWorld* world, size_t rigidbody_index) override { this->isDirty = false; } +}; +class PhysicsObjectMotionState : public PhysicsMotionState { public: - PhysicsMotionState(PhysicsWorld* world, size_t rigidbody_index) : world(world), rigidbody_index(rigidbody_index) {} - void getWorldTransform(btTransform& world_transform) const override { - world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + PhysicsObjectMotionState(btTransform& initial_transform, const Vector3f& position, const Vector3f& rotation) + : PhysicsMotionState(initial_transform, position, rotation) {} + + void GetFromWorld(const PhysicsWorld* world, size_t rigidbody_index) override { + btTransform node_transform; + node_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[rigidbody_index * 16]); + this->transform.mult(node_transform, this->from_node_to_world); } - void setWorldTransform(const btTransform& world_transform) override { - world_transform.getOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + + void SetToWorld(PhysicsWorld* world, size_t rigidbody_index) override { + this->isDirty = false; + btTransform node_transform; + node_transform.mult(this->transform, this->from_world_to_node); + node_transform.getOpenGLMatrix(&world->GetTransformBuffer()[rigidbody_index * 16]); } }; -class PhysicsPlusBoneDynamicMotionState : public btMotionState { +class PhysicsPlusBoneObjectMotionState : public PhysicsMotionState { private: - PhysicsWorld* world; - size_t rigidbody_index; + btVector3 origin; public: - PhysicsPlusBoneDynamicMotionState(PhysicsWorld* world, size_t rigidbody_index) - : world(world), rigidbody_index(rigidbody_index) {} - void getWorldTransform(btTransform& world_transform) const override { - world_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + PhysicsPlusBoneObjectMotionState(btTransform& initial_transform, const Vector3f& position, const Vector3f& rotation) + : PhysicsMotionState(initial_transform, position, rotation) {} + + void GetFromWorld(const PhysicsWorld* world, size_t rigidbody_index) override { + btTransform node_transform; + node_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[rigidbody_index * 16]); + this->transform.mult(node_transform, this->from_node_to_world); + this->origin = transform.getOrigin(); } - void setWorldTransform(const btTransform& world_transform) override { - btTransform original_transform; - original_transform.setFromOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); - btTransform final_transform = world_transform; - final_transform.setOrigin(original_transform.getOrigin()); - final_transform.getOpenGLMatrix(&world->GetTransformBuffer()[this->rigidbody_index * 16]); + + void SetToWorld(PhysicsWorld* world, size_t rigidbody_index) override { + this->isDirty = false; + btTransform world_transform = this->transform; + world_transform.setOrigin(this->origin); + btTransform node_transform; + node_transform.mult(world_transform, this->from_world_to_node); + node_transform.getOpenGLMatrix(&world->GetTransformBuffer()[rigidbody_index * 16]); } }; -PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_count, float* initial_transform) - : transform_buffer(initial_transform, initial_transform + initial_transform_count) { +PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_count, float* initial_transform) { this->broadphase = std::make_unique(); this->collision_config = std::make_unique(); this->dispatcher = std::make_unique(this->collision_config.get()); @@ -92,9 +124,11 @@ PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_c this->filter_callback = std::move(filter_callback); const auto& rigidbodies = scene.GetRigidBodies(); - if (transform_buffer.size() != rigidbodies.size() * 16) { - throw std::invalid_argument("Transform buffer size does not match rigidbody count"); + if (initial_transform_count != rigidbodies.size() * 16) { + throw std::invalid_argument("Initial transform count must match rigidbody count"); } + transform_buffer = std::make_unique(initial_transform_count); + memcpy(transform_buffer.get(), initial_transform, initial_transform_count * sizeof(float)); this->rigidbodies.reserve(rigidbodies.size()); size_t rigidbody_count = 0; @@ -102,6 +136,9 @@ PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_c size_t rigidbody_index = rigidbody_count++; RigidBodyData rigidbody_data; + btTransform transform; + transform.setFromOpenGLMatrix(&initial_transform[rigidbody_index * 16]); + std::unique_ptr shape; switch (rigidbody_item.shape_type) { case ShapeType::BOX: { @@ -131,18 +168,21 @@ PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_c shape->calculateLocalInertia(mass, local_inertia); } - std::unique_ptr motion_state; + std::unique_ptr motion_state; switch (rigidbody_item.physics_mode) { case FOLLOW_BONE: { - motion_state = std::make_unique(this, rigidbody_index); + motion_state = std::make_unique(transform, rigidbody_item.shape_position, + rigidbody_item.shape_rotation); break; } case PHYSICS: { - motion_state = std::make_unique(this, rigidbody_index); + motion_state = std::make_unique(transform, rigidbody_item.shape_position, + rigidbody_item.shape_rotation); break; } case PHYSICS_PLUS_BONE: { - motion_state = std::make_unique(this, rigidbody_index); + motion_state = std::make_unique( + transform, rigidbody_item.shape_position, rigidbody_item.shape_rotation); break; } @@ -175,14 +215,16 @@ PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_c const auto& joints = scene.GetJoints(); this->joints.reserve(joints.size()); + size_t joint_count = 0; for (const Joint& joint_item : joints) { - btMatrix3x3 rotMat; - rotMat.setEulerZYX(joint_item.rotation.x, joint_item.rotation.y, joint_item.rotation.z); + size_t joint_index = joint_count++; + btMatrix3x3 rotation_matrix; + rotation_matrix.setEulerZYX(joint_item.rotation.x, joint_item.rotation.y, joint_item.rotation.z); btTransform transform; transform.setIdentity(); transform.setOrigin(btVector3(joint_item.position.x, joint_item.position.y, joint_item.position.z)); - transform.setBasis(rotMat); + transform.setBasis(rotation_matrix); size_t rigidbody_a_index = joint_item.rigidbody_a_index; if (rigidbody_a_index >= this->rigidbodies.size()) { @@ -195,10 +237,12 @@ PhysicsWorld::PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_c } const auto& rigidbody_b = this->rigidbodies[joint_item.rigidbody_b_index]; - btTransform inverse_a = rigidbody_a.rigidbody->getWorldTransform().inverse(); - btTransform inverse_b = rigidbody_b.rigidbody->getWorldTransform().inverse(); - inverse_a *= transform; - inverse_b *= transform; + btTransform inverse_a; + btTransform inverse_b; + inverse_a.setFromOpenGLMatrix(initial_transform + rigidbody_a_index * 16); + inverse_b.setFromOpenGLMatrix(initial_transform + rigidbody_b_index * 16); + inverse_a = inverse_a.inverse() * transform; + inverse_b = inverse_b.inverse() * transform; auto constraint = std::make_unique( *rigidbody_a.rigidbody, *rigidbody_b.rigidbody, inverse_a, inverse_b, true); @@ -252,8 +296,19 @@ PhysicsWorld::~PhysicsWorld() { } } -void PhysicsWorld::Step(float delta_time, float max_sub_steps, float fixed_time_step) { - this->world->stepSimulation(delta_time, max_sub_steps, fixed_time_step); +void PhysicsWorld::Step(float delta_time, int max_sub_steps, float fixed_time_step) { + size_t rigidbody_index = 0; + for (auto& rigidbody : this->rigidbodies) { + rigidbody.motion_state->GetFromWorld(this, rigidbody_index++); + } + // this->world->stepSimulation(delta_time, max_sub_steps, fixed_time_step); + rigidbody_index = 0; + for (auto& rigidbody : this->rigidbodies) { + if (!rigidbody.motion_state->IsDirty()) { + continue; + } + rigidbody.motion_state->SetToWorld(this, rigidbody_index++); + } } } // namespace blazerod::physics diff --git a/blazerod/render/main/physics/PhysicsWorld.h b/blazerod/render/main/physics/PhysicsWorld.h index 51909b49..1abbe448 100644 --- a/blazerod/render/main/physics/PhysicsWorld.h +++ b/blazerod/render/main/physics/PhysicsWorld.h @@ -10,9 +10,30 @@ #include "blazerod/render/main/physics/PhysicsScene.h" namespace blazerod::physics { + +class PhysicsWorld; + +class PhysicsMotionState : public btMotionState { + protected: + btTransform transform; + btTransform from_node_to_world; + btTransform from_world_to_node; + bool isDirty = false; + + public: + PhysicsMotionState(btTransform& initial_transform, const Vector3f& position, const Vector3f& rotation); + + void getWorldTransform(btTransform& world_transform) const override; + void setWorldTransform(const btTransform& world_transform) override; + bool IsDirty() const { return isDirty; } + + virtual void GetFromWorld(const PhysicsWorld* world, size_t rigidbody_index) = 0; + virtual void SetToWorld(PhysicsWorld* world, size_t rigidbody_index) = 0; +}; + struct RigidBodyData { std::unique_ptr shape; - std::unique_ptr motion_state; + std::unique_ptr motion_state; std::unique_ptr rigidbody; }; @@ -32,16 +53,15 @@ class PhysicsWorld { std::vector rigidbodies; std::vector> joints; - std::vector transform_buffer; - - friend class PhysicsMotionState; + std::unique_ptr transform_buffer; public: PhysicsWorld(const PhysicsScene& scene, size_t initial_transform_count, float* initial_transform); ~PhysicsWorld(); - std::vector& GetTransformBuffer() { return transform_buffer; } - void Step(float delta_time, float max_sub_steps, float fixed_time_step); + float* GetTransformBuffer() const { return transform_buffer.get(); } + size_t GetTransformBufferSize() { return rigidbodies.size() * 16 * sizeof(float); } + void Step(float delta_time, int max_sub_steps, float fixed_time_step); }; } // namespace blazerod::physics diff --git a/blazerod/render/main/physics/PhysicsWorld.kt b/blazerod/render/main/physics/PhysicsWorld.kt index d5aba281..15889465 100644 --- a/blazerod/render/main/physics/PhysicsWorld.kt +++ b/blazerod/render/main/physics/PhysicsWorld.kt @@ -4,6 +4,8 @@ import org.joml.Matrix4f import java.lang.AutoCloseable import java.lang.ref.Reference import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.util.* class PhysicsWorld( scene: PhysicsScene, @@ -11,6 +13,7 @@ class PhysicsWorld( ) : AutoCloseable { private val pointer: Long private var closed = false + internal val rigidBodyCount = scene.rigidBodyCount private val transformBuffer: ByteBuffer init { @@ -22,7 +25,10 @@ class PhysicsWorld( } finally { Reference.reachabilityFence(initialTransform) } - transformBuffer = PhysicsLibrary.getTransformBuffer(pointer) + transformBuffer = ByteBuffer.allocateDirect(initialTransform.capacity()).order(ByteOrder.nativeOrder())//PhysicsLibrary.getTransformBuffer(pointer).order(ByteOrder.nativeOrder()) + transformBuffer.put(initialTransform) + transformBuffer.clear() + initialTransform.clear() } private inline fun requireNotClosed(crossinline block: () -> T): T { @@ -31,17 +37,23 @@ class PhysicsWorld( } fun getTransform(rigidBodyIndex: Int, dst: Matrix4f): Matrix4f = requireNotClosed { + Objects.checkIndex(rigidBodyIndex, rigidBodyCount) dst.apply { - dst.set(rigidBodyIndex * 64, transformBuffer) + set(rigidBodyIndex * 64, transformBuffer) } } fun setTransform(rigidBodyIndex: Int, transform: Matrix4f) { + Objects.checkIndex(rigidBodyIndex, rigidBodyCount) requireNotClosed { transform.get(rigidBodyIndex * 64, transformBuffer) } } + fun step(deltaTime: Float, maxSubSteps: Int, fixedTimeStep: Float) { + PhysicsLibrary.stepPhysicsWorld(pointer, deltaTime, maxSubSteps, fixedTimeStep) + } + override fun close() { if (closed) { return diff --git a/blazerod/render/main/physics/binding.cpp b/blazerod/render/main/physics/binding.cpp index 076bfc1a..57b00afe 100644 --- a/blazerod/render/main/physics/binding.cpp +++ b/blazerod/render/main/physics/binding.cpp @@ -100,16 +100,17 @@ JNIEXPORT jobject JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_ge jlong physics_world) { auto physics_world_ptr = reinterpret_cast(physics_world); auto transform_buffer = physics_world_ptr->GetTransformBuffer(); - return env->NewDirectByteBuffer(transform_buffer.data(), transform_buffer.size() * sizeof(float)); + auto transform_buffer_size = physics_world_ptr->GetTransformBufferSize(); + return env->NewDirectByteBuffer(transform_buffer, transform_buffer_size); } /* * Class: top_fifthlight_blazerod_physics_PhysicsLibrary * Method: stepPhysicsWorld - * Signature: (JFFF)V + * Signature: (JFIF)V */ JNIEXPORT void JNICALL Java_top_fifthlight_blazerod_physics_PhysicsLibrary_stepPhysicsWorld( - JNIEnv* env, jclass clazz, jlong physics_world, jfloat delta_time, jfloat max_sub_steps, jfloat fixed_time_step) { + JNIEnv* env, jclass clazz, jlong physics_world, jfloat delta_time, jint max_sub_steps, jfloat fixed_time_step) { auto physics_world_ptr = reinterpret_cast(physics_world); physics_world_ptr->Step(delta_time, max_sub_steps, fixed_time_step); } diff --git a/blazerod/render/main/runtime/BUILD.bazel b/blazerod/render/main/runtime/BUILD.bazel index b130a3a7..3b89aed5 100644 --- a/blazerod/render/main/runtime/BUILD.bazel +++ b/blazerod/render/main/runtime/BUILD.bazel @@ -10,6 +10,7 @@ kt_merge_library( "//blazerod/render/main:main_base", "//blazerod/render/main/render", "//blazerod/render/main/extension", + "//blazerod/render/main/physics", "//blazerod/render/main/runtime/data", "//blazerod/render/main/runtime/resource", "//blazerod/render/main/runtime/uniform", @@ -25,5 +26,6 @@ kt_merge_library( "//blazerod/render/game:remapped_client_access_widened_named", "@maven//:org_joml_joml", "@maven//:it_unimi_dsi_fastutil", + "@maven//:org_lwjgl_lwjgl", ], ) diff --git a/blazerod/render/main/runtime/ModelInstanceImpl.kt b/blazerod/render/main/runtime/ModelInstanceImpl.kt index d0719f4e..6133525d 100644 --- a/blazerod/render/main/runtime/ModelInstanceImpl.kt +++ b/blazerod/render/main/runtime/ModelInstanceImpl.kt @@ -3,12 +3,17 @@ package top.fifthlight.blazerod.runtime import net.minecraft.client.render.VertexConsumerProvider import org.joml.Matrix4f import org.joml.Matrix4fc +import org.lwjgl.system.MemoryStack +import org.lwjgl.system.MemoryUtil import top.fifthlight.blazerod.api.refcount.AbstractRefCount import top.fifthlight.blazerod.api.resource.ModelInstance import top.fifthlight.blazerod.api.resource.RenderScene import top.fifthlight.blazerod.model.NodeTransform import top.fifthlight.blazerod.model.NodeTransformView import top.fifthlight.blazerod.model.TransformId +import top.fifthlight.blazerod.physics.PhysicsInterface +import top.fifthlight.blazerod.physics.PhysicsScene +import top.fifthlight.blazerod.physics.PhysicsWorld import top.fifthlight.blazerod.runtime.data.LocalMatricesBuffer import top.fifthlight.blazerod.runtime.data.MorphTargetBuffer import top.fifthlight.blazerod.runtime.data.RenderSkinBuffer @@ -28,9 +33,6 @@ import java.util.function.Consumer class ModelInstanceImpl( override val scene: RenderSceneImpl, ) : AbstractRefCount(), ModelInstance { - companion object { - private const val PHYSICS_FPS = 120f - } @ActualConstructor("of") constructor(scene: RenderScene) : this(scene as RenderSceneImpl) @@ -39,10 +41,45 @@ class ModelInstanceImpl( get() = "model_instance" val modelData = ModelData(scene) + internal val physicsData = if (PhysicsInterface.isPhysicsAvailable && scene.physicsScene != null) { + PhysicsData(scene, modelData, scene.physicsScene) + } else { + null + } init { scene.increaseReferenceCount() scene.attachToInstance(this) + physicsData?.initialize() + } + + class PhysicsData( + private val scene: RenderSceneImpl, + private val modelData: ModelData, + private val physicsScene: PhysicsScene, + ) : AutoCloseable { + var lastPhysicsTime: Float = -1f + private var _world: PhysicsWorld? = null + val world: PhysicsWorld + get() = _world ?: error("PhysicsWorld is not initialized") + + fun initialize() { + if (_world != null) { + return + } + MemoryStack.stackPush().use { stack -> + val initialTransform = stack.malloc(scene.rigidBodyComponents.size * 64) + scene.rigidBodyComponents.forEach { (nodeIndex, component) -> + val nodeWorldTransform = modelData.worldTransforms[nodeIndex] + nodeWorldTransform.get(component.rigidBodyIndex * 64, initialTransform) + } + _world = PhysicsWorld(physicsScene, initialTransform) + } + } + + override fun close() { + _world?.close() + } } class ModelData(scene: RenderSceneImpl) : AutoCloseable { @@ -113,6 +150,18 @@ class ModelInstanceImpl( transform.setMatrix(transformId, matrix) } + override fun setTransformMatrix( + nodeIndex: Int, + transformId: TransformId, + updater: Consumer, + ) = setTransformMatrix(nodeIndex, transformId) { updater.accept(this) } + + override fun setTransformMatrix(nodeIndex: Int, transformId: TransformId, updater: NodeTransform.Matrix.() -> Unit) { + markNodeTransformDirty(scene.nodes[nodeIndex]) + val transform = modelData.transformMaps[nodeIndex] + transform.updateMatrix(transformId, updater) + } + override fun setTransformDecomposed( nodeIndex: Int, transformId: TransformId, @@ -127,8 +176,7 @@ class ModelInstanceImpl( nodeIndex: Int, transformId: TransformId, updater: Consumer, - ) = - setTransformDecomposed(nodeIndex, transformId) { updater.accept(this) } + ) = setTransformDecomposed(nodeIndex, transformId) { updater.accept(this) } override fun setTransformDecomposed( nodeIndex: Int, @@ -185,12 +233,12 @@ class ModelInstanceImpl( scene.updateCamera(this) } - override fun debugRender(viewProjectionMatrix: Matrix4fc, consumers: VertexConsumerProvider) { - scene.debugRender(this, viewProjectionMatrix, consumers) + override fun debugRender(viewProjectionMatrix: Matrix4fc, consumers: VertexConsumerProvider, time: Float) { + scene.debugRender(this, viewProjectionMatrix, consumers, time) } - override fun updateRenderData() { - scene.updateRenderData(this) + override fun updateRenderData(time: Float) { + scene.updateRenderData(this, time) } internal fun updateNodeTransform(nodeIndex: Int) { @@ -235,6 +283,7 @@ class ModelInstanceImpl( override fun onClosed() { scene.decreaseReferenceCount() + physicsData?.close() modelData.close() } } diff --git a/blazerod/render/main/runtime/RenderSceneImpl.kt b/blazerod/render/main/runtime/RenderSceneImpl.kt index fb1e457a..009e9339 100644 --- a/blazerod/render/main/runtime/RenderSceneImpl.kt +++ b/blazerod/render/main/runtime/RenderSceneImpl.kt @@ -11,6 +11,8 @@ import top.fifthlight.blazerod.model.Camera import top.fifthlight.blazerod.model.HumanoidTag import top.fifthlight.blazerod.model.NodeId import top.fifthlight.blazerod.model.NodeTransform +import top.fifthlight.blazerod.physics.PhysicsInterface +import top.fifthlight.blazerod.physics.PhysicsScene import top.fifthlight.blazerod.runtime.node.RenderNodeImpl import top.fifthlight.blazerod.runtime.node.UpdatePhase import top.fifthlight.blazerod.runtime.node.component.IkTargetComponent @@ -20,6 +22,7 @@ import top.fifthlight.blazerod.runtime.node.component.RigidBodyComponent import top.fifthlight.blazerod.runtime.node.forEach import top.fifthlight.blazerod.runtime.resource.RenderPhysicsJoint import top.fifthlight.blazerod.runtime.resource.RenderSkin +import kotlin.time.measureTime class RenderSceneImpl( override val rootNode: RenderNodeImpl, @@ -32,8 +35,11 @@ class RenderSceneImpl( val renderTransform: NodeTransform?, ) : AbstractRefCount(), RenderScene { companion object { - private const val PHYSICS_MAX_SUB_STEP_COUNT = 10 + private const val PHYSICS_MAX_SUB_STEP_COUNT = 1 + private const val PHYSICS_FPS = 120f + private const val PHYSICS_TIME_STEP = 1f / PHYSICS_FPS } + override val typeId: String get() = "scene" @@ -43,11 +49,11 @@ class RenderSceneImpl( val morphedPrimitiveComponents: List override val ikTargetData: List val ikTargetComponents: List - val rigidBodyComponents: List + val rigidBodyComponents: List> override val nodeIdMap: Map override val nodeNameMap: Map override val humanoidTagMap: Map - val hasPhysics: Boolean + val physicsScene: PhysicsScene? init { rootNode.increaseReferenceCount() @@ -56,11 +62,10 @@ class RenderSceneImpl( val primitiveComponents = mutableListOf() val morphedPrimitives = Int2ReferenceOpenHashMap() val ikTargets = Int2ReferenceOpenHashMap() - val rigidBodyComponents = Int2ReferenceOpenHashMap() + val rigidBodyComponents = Int2ReferenceOpenHashMap>() val nodeIdMap = mutableMapOf() val nodeNameMap = mutableMapOf() val humanoidTagMap = mutableMapOf() - var hasPhysics = false rootNode.forEach { node -> nodes.add(node) node.nodeId?.let { nodeIdMap.put(it, node) } @@ -84,8 +89,7 @@ class RenderSceneImpl( ikTargets.put(component.ikIndex, component) } node.getComponentsOfType(RenderNodeComponent.Type.RigidBody).forEach { component -> - hasPhysics = true - rigidBodyComponents.put(component.rigidBodyIndex, component) + rigidBodyComponents.put(component.rigidBodyIndex, node.nodeIndex to component) } } this.sortedNodes = nodes @@ -107,7 +111,14 @@ class RenderSceneImpl( this.nodeIdMap = nodeIdMap this.nodeNameMap = nodeNameMap this.humanoidTagMap = humanoidTagMap - this.hasPhysics = hasPhysics + this.physicsScene = this.rigidBodyComponents.takeIf { + PhysicsInterface.isPhysicsAvailable && it.isNotEmpty() + }?.let { components -> + PhysicsScene( + rigidBodies = components.map { (nodeIndex, component) -> component.rigidBodyData }, + joints = physicsJoints, + ) + } } private fun executePhase(instance: ModelInstanceImpl, phase: UpdatePhase) { @@ -130,7 +141,39 @@ class RenderSceneImpl( executePhase(instance, UpdatePhase.CameraUpdate) } - fun debugRender(instance: ModelInstanceImpl, viewProjectionMatrix: Matrix4fc, consumers: VertexConsumerProvider) { + private fun updatePhysics( + instance: ModelInstanceImpl, + time: Float, // For physics, in seconds + ) { + instance.physicsData?.let { data -> + if (data.lastPhysicsTime < 0) { + data.lastPhysicsTime = time + return@let + } + val timeStep = time - data.lastPhysicsTime + if (timeStep <= 0f) { + return@let + } + + data.lastPhysicsTime = time + + executePhase(instance, UpdatePhase.PhysicsUpdatePre) + measureTime { + data.world.step(timeStep, PHYSICS_MAX_SUB_STEP_COUNT, PHYSICS_TIME_STEP) + }.let { + println("Physics step time: $it, timeStep: $timeStep") + } + executePhase(instance, UpdatePhase.PhysicsUpdatePost) + executePhase(instance, UpdatePhase.GlobalTransformPropagation) + } + } + + fun debugRender( + instance: ModelInstanceImpl, + viewProjectionMatrix: Matrix4fc, + consumers: VertexConsumerProvider, + time: Float, + ) { if (debugRenderNodes.isEmpty()) { return } @@ -140,12 +183,13 @@ class RenderSceneImpl( executePhase(instance, UpdatePhase.InfluenceTransformUpdate) executePhase(instance, UpdatePhase.GlobalTransformPropagation) } + updatePhysics(instance, time) UpdatePhase.DebugRender.acquire(viewProjectionMatrix, consumers).use { executePhase(instance, it) } } - fun updateRenderData(instance: ModelInstanceImpl) { + fun updateRenderData(instance: ModelInstanceImpl, time: Float) { if (instance.modelData.undirtyNodeCount == nodes.size) { return } @@ -153,6 +197,7 @@ class RenderSceneImpl( executePhase(instance, UpdatePhase.IkUpdate) executePhase(instance, UpdatePhase.InfluenceTransformUpdate) executePhase(instance, UpdatePhase.GlobalTransformPropagation) + updatePhysics(instance, time) executePhase(instance, UpdatePhase.RenderDataUpdate) } @@ -170,5 +215,6 @@ class RenderSceneImpl( override fun onClosed() { rootNode.decreaseReferenceCount() + physicsScene?.close() } } diff --git a/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt b/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt index c30332a2..36026b4c 100644 --- a/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt +++ b/blazerod/render/main/runtime/node/component/RigidBodyComponent.kt @@ -1,9 +1,14 @@ package top.fifthlight.blazerod.runtime.node.component +import net.minecraft.util.Colors +import org.joml.Matrix4f +import org.joml.Vector3f import top.fifthlight.blazerod.model.RigidBody +import top.fifthlight.blazerod.model.TransformId import top.fifthlight.blazerod.runtime.ModelInstanceImpl import top.fifthlight.blazerod.runtime.node.RenderNodeImpl import top.fifthlight.blazerod.runtime.node.UpdatePhase +import top.fifthlight.blazerod.runtime.node.getWorldTransform class RigidBodyComponent( val rigidBodyIndex: Int, @@ -23,12 +28,92 @@ class RigidBodyComponent( override val updatePhases: List get() = updatePhase + private val physicsMatrix = Matrix4f() + private val inverseNodeWorldMatrix = Matrix4f() override fun update( phase: UpdatePhase, node: RenderNodeImpl, instance: ModelInstanceImpl, ) { + val physicsData = instance.physicsData ?: return + when (phase) { + is UpdatePhase.PhysicsUpdatePre -> { + when (rigidBodyData.physicsMode) { + RigidBody.PhysicsMode.FOLLOW_BONE, RigidBody.PhysicsMode.PHYSICS_PLUS_BONE -> { + val nodeTransformMatrix = instance.getWorldTransform(node) + physicsData.world.setTransform(rigidBodyIndex, nodeTransformMatrix) + } + RigidBody.PhysicsMode.PHYSICS -> { + // no-op + } + } + } + + is UpdatePhase.PhysicsUpdatePost -> { + when (rigidBodyData.physicsMode) { + RigidBody.PhysicsMode.PHYSICS, RigidBody.PhysicsMode.PHYSICS_PLUS_BONE -> { + val physicsMatrix = physicsData.world.getTransform(rigidBodyIndex, physicsMatrix) + val inverseNodeWorldMatrix = instance.getWorldTransform(node).invert(inverseNodeWorldMatrix) + val deltaTransformMatrix = physicsMatrix.mul(inverseNodeWorldMatrix) + instance.setTransformMatrix(node.nodeIndex, TransformId.PHYSICS) { + matrix.mul(deltaTransformMatrix) + } + } + + RigidBody.PhysicsMode.FOLLOW_BONE -> { + // no-op + } + } + } + + is UpdatePhase.DebugRender -> { + val consumers = phase.vertexConsumerProvider + val vertexBuffer = consumers.getBuffer(DEBUG_RENDER_LAYER) + + val nodeTransformMatrix = instance.getWorldTransform(node) + val matrix = phase.viewProjectionMatrix.mul(nodeTransformMatrix, phase.cacheMatrix) + + val color = when (rigidBodyData.physicsMode) { + RigidBody.PhysicsMode.FOLLOW_BONE -> Colors.PURPLE + RigidBody.PhysicsMode.PHYSICS -> Colors.RED + RigidBody.PhysicsMode.PHYSICS_PLUS_BONE -> Colors.GREEN + } + + when (rigidBodyData.shape) { + RigidBody.ShapeType.SPHERE -> { + vertexBuffer.drawSphereWireframe( + matrix = matrix, + radius = rigidBodyData.shapeSize.x(), + segments = 16, + color = color, + ) + } + + RigidBody.ShapeType.BOX -> { + vertexBuffer.drawBoxWireframe( + matrix = matrix, + width = rigidBodyData.shapeSize.x(), + height = rigidBodyData.shapeSize.y(), + length = rigidBodyData.shapeSize.z(), + color = color, + ) + } + + RigidBody.ShapeType.CAPSULE -> { + vertexBuffer.drawCapsuleWireframe( + matrix = matrix, + radius = rigidBodyData.shapeSize.x(), + height = rigidBodyData.shapeSize.y(), + segments = 16, + color = color, + ) + } + } + } + + else -> {} + } } override fun onClosed() {} diff --git a/mod/BUILD.bazel b/mod/BUILD.bazel index acb58aab..3f51690a 100644 --- a/mod/BUILD.bazel +++ b/mod/BUILD.bazel @@ -132,10 +132,12 @@ java_binary( "$(rlocationpath @yes_steve_model//:model_wine_fox):models/wine_fox," + "$(rlocationpath @yes_steve_model//:model_default):models/default", "-Ddev.launch.expandRunfileProperties=fabric.remapClasspathFile", + "-Djoml.debug=true", + "-Djoml.format=false", "-Dblazerod.debug=true", "-Dblazerod.debug.gui=true", "-Darmorstand.debug=true", - "-Darmorstand.debug.bone=false", + "-Darmorstand.debug.bone=true", "-Darmorstand.debug.gui=false", "-Xmx4G", ], diff --git a/mod/src/client/kotlin/top/fifthlight/armorstand/PlayerRenderer.kt b/mod/src/client/kotlin/top/fifthlight/armorstand/PlayerRenderer.kt index 486e5674..618733c3 100644 --- a/mod/src/client/kotlin/top/fifthlight/armorstand/PlayerRenderer.kt +++ b/mod/src/client/kotlin/top/fifthlight/armorstand/PlayerRenderer.kt @@ -19,6 +19,7 @@ import java.lang.ref.WeakReference import java.util.* object PlayerRenderer { + private const val NANOSECONDS_PER_SECOND = 1_000_000_000L private var renderingWorld = false private var prevModelItem = WeakReference(null) @@ -92,15 +93,16 @@ object PlayerRenderer { val controller = entry.controller val instance = entry.instance + val time = System.nanoTime().toFloat() / NANOSECONDS_PER_SECOND.toFloat() controller.apply(uuid, instance, vanillaState) - instance.updateRenderData() + instance.updateRenderData(time) val backupItem = matrixStack.peek().copy() matrixStack.pop() matrixStack.push() if (ArmorStandClient.instance.debugBone) { - instance.debugRender(matrixStack.peek().positionMatrix, consumers) + instance.debugRender(matrixStack.peek().positionMatrix, consumers, time) } else { matrix.set(matrixStack.peek().positionMatrix) matrix.scale(ConfigHolder.config.value.modelScale) From 14117f3a399ab680eac361ad60e5a84ede2e7786 Mon Sep 17 00:00:00 2001 From: fifth_light Date: Fri, 28 Nov 2025 13:21:09 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E6=A8=A1=E7=BB=84=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../top/fifthlight/blazerod/example/ballblock/BallBlockMod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazerod/example/ball_block/src/main/java/top/fifthlight/blazerod/example/ballblock/BallBlockMod.java b/blazerod/example/ball_block/src/main/java/top/fifthlight/blazerod/example/ballblock/BallBlockMod.java index b684702a..0d5d5867 100644 --- a/blazerod/example/ball_block/src/main/java/top/fifthlight/blazerod/example/ballblock/BallBlockMod.java +++ b/blazerod/example/ball_block/src/main/java/top/fifthlight/blazerod/example/ballblock/BallBlockMod.java @@ -74,7 +74,7 @@ private void loadModel() { matrix.getScale().mul(0.5f); matrix.getTranslation().add(0.5f, 0.5f, 0.5f); }); - BALL_INSTANCE.updateRenderData(); + BALL_INSTANCE.updateRenderData(0f); }).exceptionally(throwable -> { MinecraftClient.getInstance().execute(() -> { throw new RuntimeException("Failed to load model: ", throwable); From 34ae8b4f85a0148ba945d43aaeefce79ecb926de Mon Sep 17 00:00:00 2001 From: fifth_light Date: Fri, 28 Nov 2025 13:23:28 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=99=90=E5=88=B6=20tiny=20remapper=20?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AD=98=E7=94=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rule/tiny_remapper_worker/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/rule/tiny_remapper_worker/BUILD.bazel b/rule/tiny_remapper_worker/BUILD.bazel index d7d6cee1..dd758893 100644 --- a/rule/tiny_remapper_worker/BUILD.bazel +++ b/rule/tiny_remapper_worker/BUILD.bazel @@ -3,6 +3,7 @@ load("@rules_java//java:defs.bzl", "java_binary") java_binary( name = "tiny_remapper_worker", srcs = glob(["*.java"]), + jvm_flags = ["-Xmx1G"], main_class = "top.fifthlight.fabazel.remapper.TinyRemapperWorker", visibility = ["//visibility:public"], deps = [