@hypersoniclabs/helix-cli 0.1.7 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +627 -6
- package/assets/bridge/metahuman-eye-baked.png +0 -0
- package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
- package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
- package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
- package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
- package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
- package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
- package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
- package/bridge-recipes/sims4/README.md +43 -0
- package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
- package/bridge-recipes/unreal/character-customizer/README.md +58 -0
- package/bridge-recipes/unreal/character-customizer/all.json +13 -0
- package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
- package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
- package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
- package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
- package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
- package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
- package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
- package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
- package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/top.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
- package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
- package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
- package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
- package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
- package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
- package/dist/ability.d.ts +2 -2
- package/dist/ability.js +6 -5
- package/dist/ability.js.map +1 -1
- package/dist/achievement.d.ts +123 -0
- package/dist/achievement.js +400 -0
- package/dist/achievement.js.map +1 -0
- package/dist/api.d.ts +19 -1
- package/dist/api.js +80 -6
- package/dist/api.js.map +1 -1
- package/dist/assets.d.ts +595 -0
- package/dist/assets.js +1121 -0
- package/dist/assets.js.map +1 -0
- package/dist/audioCommand.d.ts +65 -0
- package/dist/audioCommand.js +181 -0
- package/dist/audioCommand.js.map +1 -0
- package/dist/bakeBodyRegionsCli.d.ts +19 -0
- package/dist/bakeBodyRegionsCli.js +25 -0
- package/dist/bakeBodyRegionsCli.js.map +1 -0
- package/dist/bakeLighting.d.ts +173 -0
- package/dist/bakeLighting.js +452 -0
- package/dist/bakeLighting.js.map +1 -0
- package/dist/bridge/bridge.testutil.d.ts +105 -0
- package/dist/bridge/bridge.testutil.js +259 -0
- package/dist/bridge/bridge.testutil.js.map +1 -0
- package/dist/bridge/characterAddon.d.ts +47 -0
- package/dist/bridge/characterAddon.js +146 -0
- package/dist/bridge/characterAddon.js.map +1 -0
- package/dist/bridge/detect.d.ts +4 -0
- package/dist/bridge/detect.js +154 -0
- package/dist/bridge/detect.js.map +1 -0
- package/dist/bridge/execute.d.ts +3 -0
- package/dist/bridge/execute.js +206 -0
- package/dist/bridge/execute.js.map +1 -0
- package/dist/bridge/glb.d.ts +60 -0
- package/dist/bridge/glb.js +81 -0
- package/dist/bridge/glb.js.map +1 -0
- package/dist/bridge/hash.d.ts +6 -0
- package/dist/bridge/hash.js +40 -0
- package/dist/bridge/hash.js.map +1 -0
- package/dist/bridge/index.d.ts +11 -0
- package/dist/bridge/index.js +28 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/internal/artifacts.d.ts +5 -0
- package/dist/bridge/internal/artifacts.js +31 -0
- package/dist/bridge/internal/artifacts.js.map +1 -0
- package/dist/bridge/internal/builtInExecution.d.ts +4 -0
- package/dist/bridge/internal/builtInExecution.js +514 -0
- package/dist/bridge/internal/builtInExecution.js.map +1 -0
- package/dist/bridge/internal/externalExecution.d.ts +12 -0
- package/dist/bridge/internal/externalExecution.js +261 -0
- package/dist/bridge/internal/externalExecution.js.map +1 -0
- package/dist/bridge/internal/outputReservation.d.ts +13 -0
- package/dist/bridge/internal/outputReservation.js +151 -0
- package/dist/bridge/internal/outputReservation.js.map +1 -0
- package/dist/bridge/internal/snapshots.d.ts +32 -0
- package/dist/bridge/internal/snapshots.js +562 -0
- package/dist/bridge/internal/snapshots.js.map +1 -0
- package/dist/bridge/management.d.ts +40 -0
- package/dist/bridge/management.js +333 -0
- package/dist/bridge/management.js.map +1 -0
- package/dist/bridge/manifest.d.ts +8 -0
- package/dist/bridge/manifest.js +192 -0
- package/dist/bridge/manifest.js.map +1 -0
- package/dist/bridge/metahuman.d.ts +26 -0
- package/dist/bridge/metahuman.js +332 -0
- package/dist/bridge/metahuman.js.map +1 -0
- package/dist/bridge/planner.d.ts +9 -0
- package/dist/bridge/planner.js +246 -0
- package/dist/bridge/planner.js.map +1 -0
- package/dist/bridge/plugins.d.ts +17 -0
- package/dist/bridge/plugins.js +307 -0
- package/dist/bridge/plugins.js.map +1 -0
- package/dist/bridge/resolution.d.ts +8 -0
- package/dist/bridge/resolution.js +55 -0
- package/dist/bridge/resolution.js.map +1 -0
- package/dist/bridge/types.d.ts +247 -0
- package/dist/bridge/types.js +60 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/validate.d.ts +12 -0
- package/dist/bridge/validate.js +370 -0
- package/dist/bridge/validate.js.map +1 -0
- package/dist/bridge/zipSource.d.ts +27 -0
- package/dist/bridge/zipSource.js +90 -0
- package/dist/bridge/zipSource.js.map +1 -0
- package/dist/browser/hostSlots.d.ts +57 -0
- package/dist/browser/hostSlots.js +371 -0
- package/dist/browser/hostSlots.js.map +1 -0
- package/dist/browser/launch.d.ts +25 -0
- package/dist/browser/launch.js +74 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/browser/nonSystemChrome.d.ts +15 -0
- package/dist/browser/nonSystemChrome.js +91 -0
- package/dist/browser/nonSystemChrome.js.map +1 -0
- package/dist/builds/index.d.ts +54 -0
- package/dist/builds/index.js +215 -0
- package/dist/builds/index.js.map +1 -0
- package/dist/bundle.d.ts +35 -2
- package/dist/bundle.js +437 -20
- package/dist/bundle.js.map +1 -1
- package/dist/canary/cli.d.ts +17 -0
- package/dist/canary/cli.js +95 -0
- package/dist/canary/cli.js.map +1 -0
- package/dist/canary/index.d.ts +4 -0
- package/dist/canary/index.js +21 -0
- package/dist/canary/index.js.map +1 -0
- package/dist/canary/inventory.d.ts +46 -0
- package/dist/canary/inventory.js +499 -0
- package/dist/canary/inventory.js.map +1 -0
- package/dist/canary/pacifica.d.ts +51 -0
- package/dist/canary/pacifica.js +247 -0
- package/dist/canary/pacifica.js.map +1 -0
- package/dist/canary/plan.d.ts +115 -0
- package/dist/canary/plan.js +479 -0
- package/dist/canary/plan.js.map +1 -0
- package/dist/character/addonPushOut.d.ts +66 -0
- package/dist/character/addonPushOut.js +211 -0
- package/dist/character/addonPushOut.js.map +1 -0
- package/dist/character/avatarPreflight.d.ts +92 -0
- package/dist/character/avatarPreflight.js +261 -0
- package/dist/character/avatarPreflight.js.map +1 -0
- package/dist/character/bakeBodyRegions.d.ts +80 -0
- package/dist/character/bakeBodyRegions.js +190 -0
- package/dist/character/bakeBodyRegions.js.map +1 -0
- package/dist/character/baseColorGuard.d.ts +62 -0
- package/dist/character/baseColorGuard.js +141 -0
- package/dist/character/baseColorGuard.js.map +1 -0
- package/dist/character/bodyGeometryGuard.d.ts +243 -0
- package/dist/character/bodyGeometryGuard.js +417 -0
- package/dist/character/bodyGeometryGuard.js.map +1 -0
- package/dist/character/bodyRegionHide.d.ts +57 -0
- package/dist/character/bodyRegionHide.js +97 -0
- package/dist/character/bodyRegionHide.js.map +1 -0
- package/dist/character/composeBaseMale.d.ts +25 -0
- package/dist/character/composeBaseMale.js +712 -0
- package/dist/character/composeBaseMale.js.map +1 -0
- package/dist/character/esm.js +3 -1
- package/dist/character/esm.js.map +1 -1
- package/dist/character/faceManifest.d.ts +53 -0
- package/dist/character/faceManifest.js +256 -0
- package/dist/character/faceManifest.js.map +1 -0
- package/dist/character/fbx.d.ts +61 -0
- package/dist/character/fbx.js +360 -0
- package/dist/character/fbx.js.map +1 -0
- package/dist/character/fitGarmentFile.d.ts +39 -0
- package/dist/character/fitGarmentFile.js +53 -0
- package/dist/character/fitGarmentFile.js.map +1 -0
- package/dist/character/helixPalette.d.ts +68 -0
- package/dist/character/helixPalette.js +183 -0
- package/dist/character/helixPalette.js.map +1 -0
- package/dist/character/hideCoverage.d.ts +135 -0
- package/dist/character/hideCoverage.js +450 -0
- package/dist/character/hideCoverage.js.map +1 -0
- package/dist/character/imageLimits.d.ts +3 -0
- package/dist/character/imageLimits.js +7 -0
- package/dist/character/imageLimits.js.map +1 -0
- package/dist/character/importCharacter.d.ts +188 -10
- package/dist/character/importCharacter.js +853 -76
- package/dist/character/importCharacter.js.map +1 -1
- package/dist/character/importTrust.d.ts +11 -0
- package/dist/character/importTrust.js +56 -0
- package/dist/character/importTrust.js.map +1 -0
- package/dist/character/ktx2Decode.d.ts +11 -0
- package/dist/character/ktx2Decode.js +87 -0
- package/dist/character/ktx2Decode.js.map +1 -0
- package/dist/character/mat4.d.ts +7 -0
- package/dist/character/mat4.js +25 -2
- package/dist/character/mat4.js.map +1 -1
- package/dist/character/meshyToHelixMap.d.ts +10 -0
- package/dist/character/meshyToHelixMap.js +92 -3
- package/dist/character/meshyToHelixMap.js.map +1 -1
- package/dist/character/metahumanToHelixMap.d.ts +2 -0
- package/dist/character/metahumanToHelixMap.js +34 -0
- package/dist/character/metahumanToHelixMap.js.map +1 -0
- package/dist/character/normalMapGuard.d.ts +59 -0
- package/dist/character/normalMapGuard.js +139 -0
- package/dist/character/normalMapGuard.js.map +1 -0
- package/dist/character/quat.js +2 -2
- package/dist/character/quat.js.map +1 -1
- package/dist/character/reframeSkeletonFile.d.ts +19 -0
- package/dist/character/reframeSkeletonFile.js +45 -0
- package/dist/character/reframeSkeletonFile.js.map +1 -0
- package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
- package/dist/character/repairLodSkeletonsFile.js +49 -0
- package/dist/character/repairLodSkeletonsFile.js.map +1 -0
- package/dist/character/restFrameGuard.d.ts +52 -0
- package/dist/character/restFrameGuard.js +90 -0
- package/dist/character/restFrameGuard.js.map +1 -0
- package/dist/character/slotBudgets.d.ts +37 -0
- package/dist/character/slotBudgets.generated.d.ts +15 -0
- package/dist/character/slotBudgets.generated.js +110 -0
- package/dist/character/slotBudgets.generated.js.map +1 -0
- package/dist/character/slotBudgets.js +45 -0
- package/dist/character/slotBudgets.js.map +1 -0
- package/dist/character/stages/atlasMaterials.d.ts +53 -0
- package/dist/character/stages/atlasMaterials.js +246 -0
- package/dist/character/stages/atlasMaterials.js.map +1 -0
- package/dist/character/stages/bakeTexture.d.ts +28 -7
- package/dist/character/stages/bakeTexture.js +586 -108
- package/dist/character/stages/bakeTexture.js.map +1 -1
- package/dist/character/stages/conform.d.ts +54 -9
- package/dist/character/stages/conform.js +686 -113
- package/dist/character/stages/conform.js.map +1 -1
- package/dist/character/stages/earClearance.d.ts +105 -0
- package/dist/character/stages/earClearance.js +480 -0
- package/dist/character/stages/earClearance.js.map +1 -0
- package/dist/character/stages/faceRegion.d.ts +55 -0
- package/dist/character/stages/faceRegion.js +183 -0
- package/dist/character/stages/faceRegion.js.map +1 -0
- package/dist/character/stages/firstPersonHide.d.ts +42 -0
- package/dist/character/stages/firstPersonHide.js +140 -0
- package/dist/character/stages/firstPersonHide.js.map +1 -0
- package/dist/character/stages/joinPerMesh.d.ts +18 -0
- package/dist/character/stages/joinPerMesh.js +46 -0
- package/dist/character/stages/joinPerMesh.js.map +1 -0
- package/dist/character/stages/ktx2.d.ts +6 -4
- package/dist/character/stages/ktx2.js +81 -29
- package/dist/character/stages/ktx2.js.map +1 -1
- package/dist/character/stages/limbBridge.d.ts +114 -0
- package/dist/character/stages/limbBridge.js +1286 -0
- package/dist/character/stages/limbBridge.js.map +1 -0
- package/dist/character/stages/mergeLods.d.ts +19 -0
- package/dist/character/stages/mergeLods.js +58 -2
- package/dist/character/stages/mergeLods.js.map +1 -1
- package/dist/character/stages/poseAwareFit.d.ts +192 -0
- package/dist/character/stages/poseAwareFit.js +417 -0
- package/dist/character/stages/poseAwareFit.js.map +1 -0
- package/dist/character/stages/poseFit/math.d.ts +141 -0
- package/dist/character/stages/poseFit/math.js +514 -0
- package/dist/character/stages/poseFit/math.js.map +1 -0
- package/dist/character/stages/poseFit/measure.d.ts +88 -0
- package/dist/character/stages/poseFit/measure.js +148 -0
- package/dist/character/stages/poseFit/measure.js.map +1 -0
- package/dist/character/stages/poseFit/model.d.ts +46 -0
- package/dist/character/stages/poseFit/model.js +147 -0
- package/dist/character/stages/poseFit/model.js.map +1 -0
- package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
- package/dist/character/stages/poseFit/offsetField.js +249 -0
- package/dist/character/stages/poseFit/offsetField.js.map +1 -0
- package/dist/character/stages/poseFit/posing.d.ts +52 -0
- package/dist/character/stages/poseFit/posing.js +330 -0
- package/dist/character/stages/poseFit/posing.js.map +1 -0
- package/dist/character/stages/poseFit/testRig.d.ts +31 -0
- package/dist/character/stages/poseFit/testRig.js +85 -0
- package/dist/character/stages/poseFit/testRig.js.map +1 -0
- package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
- package/dist/character/stages/reframeSkeletonToHost.js +111 -0
- package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
- package/dist/character/stages/report.js +0 -2
- package/dist/character/stages/report.js.map +1 -1
- package/dist/character/stages/resizeTextures.js +4 -4
- package/dist/character/stages/resizeTextures.js.map +1 -1
- package/dist/character/stages/retarget.d.ts +8 -2
- package/dist/character/stages/retarget.js +52 -4
- package/dist/character/stages/retarget.js.map +1 -1
- package/dist/character/stages/retargetClip.d.ts +6 -2
- package/dist/character/stages/retargetClip.js +53 -16
- package/dist/character/stages/retargetClip.js.map +1 -1
- package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
- package/dist/character/stages/sanitizeMaterials.js +136 -0
- package/dist/character/stages/sanitizeMaterials.js.map +1 -0
- package/dist/character/stages/simplifyMesh.js +6 -3
- package/dist/character/stages/simplifyMesh.js.map +1 -1
- package/dist/character/stages/splitFacePrimitive.js +0 -2
- package/dist/character/stages/splitFacePrimitive.js.map +1 -1
- package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
- package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
- package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
- package/dist/character/stages/unifyMaterial.d.ts +66 -0
- package/dist/character/stages/unifyMaterial.js +136 -0
- package/dist/character/stages/unifyMaterial.js.map +1 -0
- package/dist/character/stages/vrmDynamics.d.ts +144 -0
- package/dist/character/stages/vrmDynamics.js +421 -0
- package/dist/character/stages/vrmDynamics.js.map +1 -0
- package/dist/character/stages/vrmFace.d.ts +82 -0
- package/dist/character/stages/vrmFace.js +280 -0
- package/dist/character/stages/vrmFace.js.map +1 -0
- package/dist/character/stages/weldedSimplify.d.ts +15 -1
- package/dist/character/stages/weldedSimplify.js +90 -9
- package/dist/character/stages/weldedSimplify.js.map +1 -1
- package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
- package/dist/character/testutil/meshyBridgeFixture.js +219 -0
- package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
- package/dist/character/testutil/meshyHead.d.ts +19 -0
- package/dist/character/testutil/meshyHead.js +99 -0
- package/dist/character/testutil/meshyHead.js.map +1 -0
- package/dist/character/testutil/meshyRig.d.ts +17 -0
- package/dist/character/testutil/meshyRig.js +117 -0
- package/dist/character/testutil/meshyRig.js.map +1 -0
- package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
- package/dist/character/testutil/slotBudgetExpectations.js +21 -0
- package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
- package/dist/character/testutil/syntheticRig.d.ts +12 -1
- package/dist/character/testutil/syntheticRig.js +88 -3
- package/dist/character/testutil/syntheticRig.js.map +1 -1
- package/dist/character/unrealMaterialSidecar.d.ts +94 -0
- package/dist/character/unrealMaterialSidecar.js +879 -0
- package/dist/character/unrealMaterialSidecar.js.map +1 -0
- package/dist/character/untrustedSource.d.ts +54 -0
- package/dist/character/untrustedSource.js +181 -0
- package/dist/character/untrustedSource.js.map +1 -0
- package/dist/character/vrmCharacter.d.ts +156 -0
- package/dist/character/vrmCharacter.js +678 -0
- package/dist/character/vrmCharacter.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +66 -22
- package/dist/config.js.map +1 -1
- package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
- package/dist/continuum/adminPackagePinCommand.js +46 -0
- package/dist/continuum/adminPackagePinCommand.js.map +1 -0
- package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
- package/dist/continuum/adminPackagePublishCommand.js +22 -0
- package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
- package/dist/continuum/authoring.d.ts +52 -0
- package/dist/continuum/authoring.js +143 -0
- package/dist/continuum/authoring.js.map +1 -0
- package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
- package/dist/continuum/characterMigrationGenerator.js +242 -0
- package/dist/continuum/characterMigrationGenerator.js.map +1 -0
- package/dist/continuum/cli.d.ts +69 -0
- package/dist/continuum/cli.js +145 -0
- package/dist/continuum/cli.js.map +1 -0
- package/dist/continuum/cliAuthority.d.ts +17 -0
- package/dist/continuum/cliAuthority.js +28 -0
- package/dist/continuum/cliAuthority.js.map +1 -0
- package/dist/continuum/client.d.ts +103 -0
- package/dist/continuum/client.js +190 -0
- package/dist/continuum/client.js.map +1 -0
- package/dist/continuum/homeScenePackage.d.ts +159 -0
- package/dist/continuum/homeScenePackage.js +267 -0
- package/dist/continuum/homeScenePackage.js.map +1 -0
- package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
- package/dist/continuum/homeScenePackageCommand.js +107 -0
- package/dist/continuum/homeScenePackageCommand.js.map +1 -0
- package/dist/continuum/identity.d.ts +4 -0
- package/dist/continuum/identity.js +20 -0
- package/dist/continuum/identity.js.map +1 -0
- package/dist/continuum/index.d.ts +11 -0
- package/dist/continuum/index.js +28 -0
- package/dist/continuum/index.js.map +1 -0
- package/dist/continuum/missingNormals.d.ts +48 -0
- package/dist/continuum/missingNormals.js +99 -0
- package/dist/continuum/missingNormals.js.map +1 -0
- package/dist/continuum/objectUpload.d.ts +64 -0
- package/dist/continuum/objectUpload.js +375 -0
- package/dist/continuum/objectUpload.js.map +1 -0
- package/dist/continuum/pull.d.ts +22 -0
- package/dist/continuum/pull.js +47 -0
- package/dist/continuum/pull.js.map +1 -0
- package/dist/continuum/sourceBundle.d.ts +18 -0
- package/dist/continuum/sourceBundle.js +160 -0
- package/dist/continuum/sourceBundle.js.map +1 -0
- package/dist/continuum/state.d.ts +41 -0
- package/dist/continuum/state.js +198 -0
- package/dist/continuum/state.js.map +1 -0
- package/dist/continuum/types.d.ts +156 -0
- package/dist/continuum/types.js +6 -0
- package/dist/continuum/types.js.map +1 -0
- package/dist/continuum/workflow.d.ts +62 -0
- package/dist/continuum/workflow.js +592 -0
- package/dist/continuum/workflow.js.map +1 -0
- package/dist/cs2/areas.d.ts +41 -0
- package/dist/cs2/areas.js +82 -0
- package/dist/cs2/areas.js.map +1 -0
- package/dist/cs2/binary.d.ts +10 -0
- package/dist/cs2/binary.js +59 -0
- package/dist/cs2/binary.js.map +1 -0
- package/dist/cs2/cityLegacy.d.ts +29 -0
- package/dist/cs2/cityLegacy.js +48 -0
- package/dist/cs2/cityLegacy.js.map +1 -0
- package/dist/cs2/convert/areas.d.ts +32 -0
- package/dist/cs2/convert/areas.js +96 -0
- package/dist/cs2/convert/areas.js.map +1 -0
- package/dist/cs2/convert/glb.d.ts +48 -0
- package/dist/cs2/convert/glb.js +178 -0
- package/dist/cs2/convert/glb.js.map +1 -0
- package/dist/cs2/convert/markings.d.ts +96 -0
- package/dist/cs2/convert/markings.js +329 -0
- package/dist/cs2/convert/markings.js.map +1 -0
- package/dist/cs2/convert/nodeSeams.d.ts +20 -0
- package/dist/cs2/convert/nodeSeams.js +164 -0
- package/dist/cs2/convert/nodeSeams.js.map +1 -0
- package/dist/cs2/convert/roadBake.d.ts +112 -0
- package/dist/cs2/convert/roadBake.js +290 -0
- package/dist/cs2/convert/roadBake.js.map +1 -0
- package/dist/cs2/convert/roads.d.ts +110 -0
- package/dist/cs2/convert/roads.js +419 -0
- package/dist/cs2/convert/roads.js.map +1 -0
- package/dist/cs2/convert/terrain.d.ts +67 -0
- package/dist/cs2/convert/terrain.js +141 -0
- package/dist/cs2/convert/terrain.js.map +1 -0
- package/dist/cs2/convert/terrainConform.d.ts +58 -0
- package/dist/cs2/convert/terrainConform.js +284 -0
- package/dist/cs2/convert/terrainConform.js.map +1 -0
- package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
- package/dist/cs2/convert/treeRoadClearance.js +78 -0
- package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
- package/dist/cs2/convert/trees.d.ts +33 -0
- package/dist/cs2/convert/trees.js +68 -0
- package/dist/cs2/convert/trees.js.map +1 -0
- package/dist/cs2/csm2.d.ts +58 -0
- package/dist/cs2/csm2.js +188 -0
- package/dist/cs2/csm2.js.map +1 -0
- package/dist/cs2/fixtures.d.ts +5 -0
- package/dist/cs2/fixtures.js +15 -0
- package/dist/cs2/fixtures.js.map +1 -0
- package/dist/cs2/impostors.d.ts +31 -0
- package/dist/cs2/impostors.js +42 -0
- package/dist/cs2/impostors.js.map +1 -0
- package/dist/cs2/index.d.ts +22 -0
- package/dist/cs2/index.js +191 -0
- package/dist/cs2/index.js.map +1 -0
- package/dist/cs2/inspect.d.ts +81 -0
- package/dist/cs2/inspect.js +181 -0
- package/dist/cs2/inspect.js.map +1 -0
- package/dist/cs2/lods.d.ts +22 -0
- package/dist/cs2/lods.js +136 -0
- package/dist/cs2/lods.js.map +1 -0
- package/dist/cs2/materials.d.ts +43 -0
- package/dist/cs2/materials.js +137 -0
- package/dist/cs2/materials.js.map +1 -0
- package/dist/cs2/placements.d.ts +57 -0
- package/dist/cs2/placements.js +116 -0
- package/dist/cs2/placements.js.map +1 -0
- package/dist/cs2/roadPieces.d.ts +79 -0
- package/dist/cs2/roadPieces.js +263 -0
- package/dist/cs2/roadPieces.js.map +1 -0
- package/dist/cs2/roads.d.ts +92 -0
- package/dist/cs2/roads.js +329 -0
- package/dist/cs2/roads.js.map +1 -0
- package/dist/cs2/terrain.d.ts +37 -0
- package/dist/cs2/terrain.js +91 -0
- package/dist/cs2/terrain.js.map +1 -0
- package/dist/cs2/types.d.ts +444 -0
- package/dist/cs2/types.js +22 -0
- package/dist/cs2/types.js.map +1 -0
- package/dist/cs2/water.d.ts +26 -0
- package/dist/cs2/water.js +58 -0
- package/dist/cs2/water.js.map +1 -0
- package/dist/currency.d.ts +94 -0
- package/dist/currency.js +425 -0
- package/dist/currency.js.map +1 -0
- package/dist/dev/devServer.d.ts +53 -0
- package/dist/dev/devServer.js +228 -0
- package/dist/dev/devServer.js.map +1 -0
- package/dist/dev/shellPage.d.ts +3 -0
- package/dist/dev/shellPage.js +297 -0
- package/dist/dev/shellPage.js.map +1 -0
- package/dist/dev/state.d.ts +84 -0
- package/dist/dev/state.js +265 -0
- package/dist/dev/state.js.map +1 -0
- package/dist/device.d.ts +104 -0
- package/dist/device.js +2744 -0
- package/dist/device.js.map +1 -0
- package/dist/deviceActionValidation.d.ts +21 -0
- package/dist/deviceActionValidation.js +460 -0
- package/dist/deviceActionValidation.js.map +1 -0
- package/dist/distribution.d.ts +69 -0
- package/dist/distribution.js +138 -0
- package/dist/distribution.js.map +1 -0
- package/dist/enginePins.d.ts +45 -0
- package/dist/enginePins.js +134 -0
- package/dist/enginePins.js.map +1 -0
- package/dist/gesture/axisReference.d.ts +22 -0
- package/dist/gesture/axisReference.js +32 -0
- package/dist/gesture/axisReference.js.map +1 -0
- package/dist/gesture/capture.d.ts +84 -0
- package/dist/gesture/capture.js +303 -0
- package/dist/gesture/capture.js.map +1 -0
- package/dist/gesture/harnessPage.d.ts +23 -0
- package/dist/gesture/harnessPage.js +153 -0
- package/dist/gesture/harnessPage.js.map +1 -0
- package/dist/gesture/inspect.d.ts +189 -0
- package/dist/gesture/inspect.js +678 -0
- package/dist/gesture/inspect.js.map +1 -0
- package/dist/gesture/rig.d.ts +12 -0
- package/dist/gesture/rig.js +111 -0
- package/dist/gesture/rig.js.map +1 -0
- package/dist/gesture/worldRuntime.d.ts +65 -0
- package/dist/gesture/worldRuntime.js +110 -0
- package/dist/gesture/worldRuntime.js.map +1 -0
- package/dist/glb/draw-calls.d.ts +60 -0
- package/dist/glb/draw-calls.js +160 -0
- package/dist/glb/draw-calls.js.map +1 -0
- package/dist/glb/glb-summary.d.ts +68 -0
- package/dist/glb/glb-summary.js +450 -0
- package/dist/glb/glb-summary.js.map +1 -0
- package/dist/glb/index.d.ts +12 -0
- package/dist/glb/index.js +24 -0
- package/dist/glb/index.js.map +1 -0
- package/dist/glb/smooth-normals.d.ts +98 -0
- package/dist/glb/smooth-normals.js +395 -0
- package/dist/glb/smooth-normals.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6786 -128
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +35 -1
- package/dist/init.js +1115 -47
- package/dist/init.js.map +1 -1
- package/dist/install.d.ts +16 -5
- package/dist/install.js +123 -23
- package/dist/install.js.map +1 -1
- package/dist/interactable.d.ts +154 -0
- package/dist/interactable.js +1219 -0
- package/dist/interactable.js.map +1 -0
- package/dist/item.d.ts +217 -0
- package/dist/item.js +892 -0
- package/dist/item.js.map +1 -0
- package/dist/itemDef/distribute.d.ts +17 -0
- package/dist/itemDef/distribute.js +29 -0
- package/dist/itemDef/distribute.js.map +1 -0
- package/dist/itemDef/emoteRules.d.ts +85 -0
- package/dist/itemDef/emoteRules.js +368 -0
- package/dist/itemDef/emoteRules.js.map +1 -0
- package/dist/itemDef/gunConfigRules.d.ts +24 -0
- package/dist/itemDef/gunConfigRules.js +300 -0
- package/dist/itemDef/gunConfigRules.js.map +1 -0
- package/dist/itemDef/inspect.d.ts +19 -0
- package/dist/itemDef/inspect.js +144 -0
- package/dist/itemDef/inspect.js.map +1 -0
- package/dist/itemDef/scaffold.d.ts +41 -0
- package/dist/itemDef/scaffold.js +303 -0
- package/dist/itemDef/scaffold.js.map +1 -0
- package/dist/itemDef/tables.d.ts +81 -0
- package/dist/itemDef/tables.js +226 -0
- package/dist/itemDef/tables.js.map +1 -0
- package/dist/itemDef/validate.d.ts +30 -0
- package/dist/itemDef/validate.js +175 -0
- package/dist/itemDef/validate.js.map +1 -0
- package/dist/itemPublishVersion.d.ts +46 -0
- package/dist/itemPublishVersion.js +242 -0
- package/dist/itemPublishVersion.js.map +1 -0
- package/dist/itemSearch.d.ts +128 -0
- package/dist/itemSearch.js +140 -0
- package/dist/itemSearch.js.map +1 -0
- package/dist/itemSetVersion.d.ts +42 -0
- package/dist/itemSetVersion.js +94 -0
- package/dist/itemSetVersion.js.map +1 -0
- package/dist/itemThumbnail.d.ts +40 -0
- package/dist/itemThumbnail.js +116 -0
- package/dist/itemThumbnail.js.map +1 -0
- package/dist/lib.d.ts +571 -7
- package/dist/lib.js +1178 -15
- package/dist/lib.js.map +1 -1
- package/dist/looks.d.ts +103 -0
- package/dist/looks.js +102 -0
- package/dist/looks.js.map +1 -0
- package/dist/materials/availability.d.ts +8 -0
- package/dist/materials/availability.js +22 -0
- package/dist/materials/availability.js.map +1 -0
- package/dist/materials/identity.d.ts +30 -0
- package/dist/materials/identity.js +68 -0
- package/dist/materials/identity.js.map +1 -0
- package/dist/materials/pins.d.ts +23 -0
- package/dist/materials/pins.js +93 -0
- package/dist/materials/pins.js.map +1 -0
- package/dist/mesh/surfaceBvh.d.ts +13 -0
- package/dist/mesh/surfaceBvh.js +197 -0
- package/dist/mesh/surfaceBvh.js.map +1 -0
- package/dist/module-validation.d.ts +2 -0
- package/dist/module-validation.js +24 -0
- package/dist/module-validation.js.map +1 -0
- package/dist/money.d.ts +183 -0
- package/dist/money.js +299 -0
- package/dist/money.js.map +1 -0
- package/dist/npc/capture.d.ts +41 -0
- package/dist/npc/capture.js +99 -0
- package/dist/npc/capture.js.map +1 -0
- package/dist/npc/format.d.ts +2 -0
- package/dist/npc/format.js +102 -0
- package/dist/npc/format.js.map +1 -0
- package/dist/npc/inspect.d.ts +23 -0
- package/dist/npc/inspect.js +54 -0
- package/dist/npc/inspect.js.map +1 -0
- package/dist/npc/metrics.d.ts +132 -0
- package/dist/npc/metrics.js +214 -0
- package/dist/npc/metrics.js.map +1 -0
- package/dist/npc/session.d.ts +35 -0
- package/dist/npc/session.js +172 -0
- package/dist/npc/session.js.map +1 -0
- package/dist/pack/locomotionReference.d.ts +40 -0
- package/dist/pack/locomotionReference.js +132 -0
- package/dist/pack/locomotionReference.js.map +1 -0
- package/dist/pack/scaffold.d.ts +15 -0
- package/dist/pack/scaffold.js +144 -0
- package/dist/pack/scaffold.js.map +1 -0
- package/dist/pack/validate.d.ts +67 -0
- package/dist/pack/validate.js +317 -0
- package/dist/pack/validate.js.map +1 -0
- package/dist/package.d.ts +14 -1
- package/dist/package.js +106 -7
- package/dist/package.js.map +1 -1
- package/dist/paletteShowcase.d.ts +183 -0
- package/dist/paletteShowcase.js +454 -0
- package/dist/paletteShowcase.js.map +1 -0
- package/dist/paletteShowcaseProfiles.d.ts +112 -0
- package/dist/paletteShowcaseProfiles.js +121 -0
- package/dist/paletteShowcaseProfiles.js.map +1 -0
- package/dist/paths.d.ts +4 -0
- package/dist/paths.js +11 -0
- package/dist/paths.js.map +1 -0
- package/dist/placementRequest.d.ts +37 -0
- package/dist/placementRequest.js +220 -0
- package/dist/placementRequest.js.map +1 -0
- package/dist/placements/assets.d.ts +7 -0
- package/dist/placements/assets.js +114 -0
- package/dist/placements/assets.js.map +1 -0
- package/dist/placements/attachFoliageLods.d.ts +4 -0
- package/dist/placements/attachFoliageLods.js +70 -0
- package/dist/placements/attachFoliageLods.js.map +1 -0
- package/dist/placements/attachImpostors.d.ts +3 -0
- package/dist/placements/attachImpostors.js +51 -0
- package/dist/placements/attachImpostors.js.map +1 -0
- package/dist/placements/authored.d.ts +11 -0
- package/dist/placements/authored.js +65 -0
- package/dist/placements/authored.js.map +1 -0
- package/dist/placements/bake.d.ts +2 -0
- package/dist/placements/bake.js +235 -0
- package/dist/placements/bake.js.map +1 -0
- package/dist/placements/captureHost.d.ts +4 -0
- package/dist/placements/captureHost.js +125 -0
- package/dist/placements/captureHost.js.map +1 -0
- package/dist/placements/foliageCapture.d.ts +2 -0
- package/dist/placements/foliageCapture.js +98 -0
- package/dist/placements/foliageCapture.js.map +1 -0
- package/dist/placements/foliageCards.d.ts +17 -0
- package/dist/placements/foliageCards.js +120 -0
- package/dist/placements/foliageCards.js.map +1 -0
- package/dist/placements/foliageLods.d.ts +8 -0
- package/dist/placements/foliageLods.js +240 -0
- package/dist/placements/foliageLods.js.map +1 -0
- package/dist/placements/foliageTexture.d.ts +4 -0
- package/dist/placements/foliageTexture.js +91 -0
- package/dist/placements/foliageTexture.js.map +1 -0
- package/dist/placements/impostorCapture.d.ts +2 -0
- package/dist/placements/impostorCapture.js +111 -0
- package/dist/placements/impostorCapture.js.map +1 -0
- package/dist/placements/impostors.d.ts +18 -0
- package/dist/placements/impostors.js +279 -0
- package/dist/placements/impostors.js.map +1 -0
- package/dist/placements/source.d.ts +53 -0
- package/dist/placements/source.js +111 -0
- package/dist/placements/source.js.map +1 -0
- package/dist/product.d.ts +84 -0
- package/dist/product.js +285 -0
- package/dist/product.js.map +1 -0
- package/dist/publications.d.ts +116 -0
- package/dist/publications.js +180 -0
- package/dist/publications.js.map +1 -0
- package/dist/publishDuplicateGuard.d.ts +92 -0
- package/dist/publishDuplicateGuard.js +128 -0
- package/dist/publishDuplicateGuard.js.map +1 -0
- package/dist/realizability.d.ts +36 -0
- package/dist/realizability.js +269 -0
- package/dist/realizability.js.map +1 -0
- package/dist/resolve.d.ts +7 -1
- package/dist/resolve.js +77 -11
- package/dist/resolve.js.map +1 -1
- package/dist/sceneElements/compiler.d.ts +21 -0
- package/dist/sceneElements/compiler.js +976 -0
- package/dist/sceneElements/compiler.js.map +1 -0
- package/dist/sceneElements/continuum.d.ts +54 -0
- package/dist/sceneElements/continuum.js +451 -0
- package/dist/sceneElements/continuum.js.map +1 -0
- package/dist/sceneElements/devices.d.ts +12 -0
- package/dist/sceneElements/devices.js +212 -0
- package/dist/sceneElements/devices.js.map +1 -0
- package/dist/sceneElements/meshCells.d.ts +49 -0
- package/dist/sceneElements/meshCells.js +174 -0
- package/dist/sceneElements/meshCells.js.map +1 -0
- package/dist/sceneElements/types.d.ts +261 -0
- package/dist/sceneElements/types.js +3 -0
- package/dist/sceneElements/types.js.map +1 -0
- package/dist/sceneHlod/approximate.d.ts +23 -0
- package/dist/sceneHlod/approximate.js +171 -0
- package/dist/sceneHlod/approximate.js.map +1 -0
- package/dist/sceneHlod/artifact.d.ts +3 -0
- package/dist/sceneHlod/artifact.js +29 -0
- package/dist/sceneHlod/artifact.js.map +1 -0
- package/dist/sceneHlod/bakeSurface.d.ts +2 -0
- package/dist/sceneHlod/bakeSurface.js +59 -0
- package/dist/sceneHlod/bakeSurface.js.map +1 -0
- package/dist/sceneHlod/basisEncoder.d.ts +3 -0
- package/dist/sceneHlod/basisEncoder.js +68 -0
- package/dist/sceneHlod/basisEncoder.js.map +1 -0
- package/dist/sceneHlod/cellArtifact.d.ts +17 -0
- package/dist/sceneHlod/cellArtifact.js +78 -0
- package/dist/sceneHlod/cellArtifact.js.map +1 -0
- package/dist/sceneHlod/commands.d.ts +2 -0
- package/dist/sceneHlod/commands.js +114 -0
- package/dist/sceneHlod/commands.js.map +1 -0
- package/dist/sceneHlod/complete.d.ts +78 -0
- package/dist/sceneHlod/complete.js +261 -0
- package/dist/sceneHlod/complete.js.map +1 -0
- package/dist/sceneHlod/completePrototype.d.ts +39 -0
- package/dist/sceneHlod/completePrototype.js +121 -0
- package/dist/sceneHlod/completePrototype.js.map +1 -0
- package/dist/sceneHlod/geometry.d.ts +6 -0
- package/dist/sceneHlod/geometry.js +101 -0
- package/dist/sceneHlod/geometry.js.map +1 -0
- package/dist/sceneHlod/imageSampling.d.ts +11 -0
- package/dist/sceneHlod/imageSampling.js +100 -0
- package/dist/sceneHlod/imageSampling.js.map +1 -0
- package/dist/sceneHlod/refinement.d.ts +46 -0
- package/dist/sceneHlod/refinement.js +204 -0
- package/dist/sceneHlod/refinement.js.map +1 -0
- package/dist/sceneHlod/scene.d.ts +80 -0
- package/dist/sceneHlod/scene.js +264 -0
- package/dist/sceneHlod/scene.js.map +1 -0
- package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
- package/dist/sceneHlod/sharedAtlas.js +84 -0
- package/dist/sceneHlod/sharedAtlas.js.map +1 -0
- package/dist/sceneHlod/source.d.ts +17 -0
- package/dist/sceneHlod/source.js +241 -0
- package/dist/sceneHlod/source.js.map +1 -0
- package/dist/sceneHlod/textureCodec.d.ts +4 -0
- package/dist/sceneHlod/textureCodec.js +66 -0
- package/dist/sceneHlod/textureCodec.js.map +1 -0
- package/dist/sceneHlod/transfer.d.ts +8 -0
- package/dist/sceneHlod/transfer.js +147 -0
- package/dist/sceneHlod/transfer.js.map +1 -0
- package/dist/sceneHlod/types.d.ts +69 -0
- package/dist/sceneHlod/types.js +3 -0
- package/dist/sceneHlod/types.js.map +1 -0
- package/dist/sceneImport/archive.d.ts +30 -0
- package/dist/sceneImport/archive.js +336 -0
- package/dist/sceneImport/archive.js.map +1 -0
- package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
- package/dist/sceneImport/bistroMaterialBake.js +169 -0
- package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
- package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
- package/dist/sceneImport/bistroTexturePlan.js +23 -0
- package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
- package/dist/sceneImport/compiler.d.ts +36 -0
- package/dist/sceneImport/compiler.js +251 -0
- package/dist/sceneImport/compiler.js.map +1 -0
- package/dist/sceneImport/composeMounts.d.ts +159 -0
- package/dist/sceneImport/composeMounts.js +687 -0
- package/dist/sceneImport/composeMounts.js.map +1 -0
- package/dist/sceneImport/defaultMaterials.d.ts +45 -0
- package/dist/sceneImport/defaultMaterials.js +121 -0
- package/dist/sceneImport/defaultMaterials.js.map +1 -0
- package/dist/sceneImport/externalTextures.d.ts +44 -0
- package/dist/sceneImport/externalTextures.js +146 -0
- package/dist/sceneImport/externalTextures.js.map +1 -0
- package/dist/sceneImport/fbx.d.ts +101 -0
- package/dist/sceneImport/fbx.js +307 -0
- package/dist/sceneImport/fbx.js.map +1 -0
- package/dist/sceneImport/glbSplit.d.ts +24 -0
- package/dist/sceneImport/glbSplit.js +95 -0
- package/dist/sceneImport/glbSplit.js.map +1 -0
- package/dist/sceneImport/gltfIo.d.ts +32 -0
- package/dist/sceneImport/gltfIo.js +39 -0
- package/dist/sceneImport/gltfIo.js.map +1 -0
- package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
- package/dist/sceneImport/helsinkiTiles.js +52 -0
- package/dist/sceneImport/helsinkiTiles.js.map +1 -0
- package/dist/sceneImport/materials/binding.d.ts +16 -0
- package/dist/sceneImport/materials/binding.js +42 -0
- package/dist/sceneImport/materials/binding.js.map +1 -0
- package/dist/sceneImport/materials/catalog.d.ts +36 -0
- package/dist/sceneImport/materials/catalog.js +233 -0
- package/dist/sceneImport/materials/catalog.js.map +1 -0
- package/dist/sceneImport/materials/index.d.ts +4 -0
- package/dist/sceneImport/materials/index.js +21 -0
- package/dist/sceneImport/materials/index.js.map +1 -0
- package/dist/sceneImport/materials/matcher.d.ts +33 -0
- package/dist/sceneImport/materials/matcher.js +127 -0
- package/dist/sceneImport/materials/matcher.js.map +1 -0
- package/dist/sceneImport/materials/recipe.d.ts +30 -0
- package/dist/sceneImport/materials/recipe.js +134 -0
- package/dist/sceneImport/materials/recipe.js.map +1 -0
- package/dist/sceneImport/multiAsset.d.ts +79 -0
- package/dist/sceneImport/multiAsset.js +535 -0
- package/dist/sceneImport/multiAsset.js.map +1 -0
- package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
- package/dist/sceneImport/multiAssetSpawn.js +98 -0
- package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
- package/dist/sceneImport/obj.d.ts +41 -0
- package/dist/sceneImport/obj.js +276 -0
- package/dist/sceneImport/obj.js.map +1 -0
- package/dist/sceneImport/package.d.ts +104 -0
- package/dist/sceneImport/package.js +1004 -0
- package/dist/sceneImport/package.js.map +1 -0
- package/dist/sceneImport/packageReader.d.ts +10 -0
- package/dist/sceneImport/packageReader.js +250 -0
- package/dist/sceneImport/packageReader.js.map +1 -0
- package/dist/sceneImport/proxy.d.ts +100 -0
- package/dist/sceneImport/proxy.js +334 -0
- package/dist/sceneImport/proxy.js.map +1 -0
- package/dist/sceneImport/publish.d.ts +47 -0
- package/dist/sceneImport/publish.js +98 -0
- package/dist/sceneImport/publish.js.map +1 -0
- package/dist/sceneImport/semantic.d.ts +75 -0
- package/dist/sceneImport/semantic.js +296 -0
- package/dist/sceneImport/semantic.js.map +1 -0
- package/dist/sceneImport/spawnProbe.d.ts +55 -0
- package/dist/sceneImport/spawnProbe.js +159 -0
- package/dist/sceneImport/spawnProbe.js.map +1 -0
- package/dist/sceneImport/streamLayout.d.ts +96 -0
- package/dist/sceneImport/streamLayout.js +203 -0
- package/dist/sceneImport/streamLayout.js.map +1 -0
- package/dist/sceneImport/textureDecode.d.ts +21 -0
- package/dist/sceneImport/textureDecode.js +292 -0
- package/dist/sceneImport/textureDecode.js.map +1 -0
- package/dist/sceneImport/types.d.ts +84 -0
- package/dist/sceneImport/types.js +58 -0
- package/dist/sceneImport/types.js.map +1 -0
- package/dist/scenePerformance.d.ts +162 -0
- package/dist/scenePerformance.js +905 -0
- package/dist/scenePerformance.js.map +1 -0
- package/dist/screenshot/captureScreenshots.d.ts +36 -0
- package/dist/screenshot/captureScreenshots.js +229 -0
- package/dist/screenshot/captureScreenshots.js.map +1 -0
- package/dist/screenshot/encodeImagePreview.d.ts +5 -0
- package/dist/screenshot/encodeImagePreview.js +42 -0
- package/dist/screenshot/encodeImagePreview.js.map +1 -0
- package/dist/screenshot/publishThumbnail.d.ts +4 -0
- package/dist/screenshot/publishThumbnail.js +56 -0
- package/dist/screenshot/publishThumbnail.js.map +1 -0
- package/dist/screenshot/staticServe.d.ts +14 -0
- package/dist/screenshot/staticServe.js +120 -0
- package/dist/screenshot/staticServe.js.map +1 -0
- package/dist/source-archive.d.ts +101 -0
- package/dist/source-archive.js +309 -0
- package/dist/source-archive.js.map +1 -0
- package/dist/stdioBlocking.d.ts +1 -0
- package/dist/stdioBlocking.js +9 -0
- package/dist/stdioBlocking.js.map +1 -0
- package/dist/terrain/bake.d.ts +40 -0
- package/dist/terrain/bake.js +318 -0
- package/dist/terrain/bake.js.map +1 -0
- package/dist/terrain/generate.d.ts +21 -0
- package/dist/terrain/generate.js +239 -0
- package/dist/terrain/generate.js.map +1 -0
- package/dist/terrain/grid.d.ts +48 -0
- package/dist/terrain/grid.js +133 -0
- package/dist/terrain/grid.js.map +1 -0
- package/dist/terrain/import.d.ts +40 -0
- package/dist/terrain/import.js +252 -0
- package/dist/terrain/import.js.map +1 -0
- package/dist/terrain/index.d.ts +11 -0
- package/dist/terrain/index.js +88 -0
- package/dist/terrain/index.js.map +1 -0
- package/dist/terrain/inspect.d.ts +35 -0
- package/dist/terrain/inspect.js +115 -0
- package/dist/terrain/inspect.js.map +1 -0
- package/dist/terrain/island.d.ts +31 -0
- package/dist/terrain/island.js +128 -0
- package/dist/terrain/island.js.map +1 -0
- package/dist/terrain/noise.d.ts +79 -0
- package/dist/terrain/noise.js +162 -0
- package/dist/terrain/noise.js.map +1 -0
- package/dist/terrain/normals.d.ts +21 -0
- package/dist/terrain/normals.js +55 -0
- package/dist/terrain/normals.js.map +1 -0
- package/dist/terrain/presets/alpine.json +20 -0
- package/dist/terrain/presets/coast.json +20 -0
- package/dist/terrain/presets/desert.json +22 -0
- package/dist/terrain/presets/forest.json +20 -0
- package/dist/terrain/presets/meadow.json +20 -0
- package/dist/terrain/presets/volcanic.json +22 -0
- package/dist/terrain/presets.d.ts +29 -0
- package/dist/terrain/presets.js +128 -0
- package/dist/terrain/presets.js.map +1 -0
- package/dist/terrain/source.d.ts +42 -0
- package/dist/terrain/source.js +241 -0
- package/dist/terrain/source.js.map +1 -0
- package/dist/terrain/tile.d.ts +92 -0
- package/dist/terrain/tile.js +268 -0
- package/dist/terrain/tile.js.map +1 -0
- package/dist/textureAudit.d.ts +23 -0
- package/dist/textureAudit.js +192 -0
- package/dist/textureAudit.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/unreal/avatarMode.d.ts +21 -0
- package/dist/unreal/avatarMode.js +33 -0
- package/dist/unreal/avatarMode.js.map +1 -0
- package/dist/unreal/delivery.d.ts +46 -0
- package/dist/unreal/delivery.js +89 -0
- package/dist/unreal/delivery.js.map +1 -0
- package/dist/unreal/doctor.d.ts +50 -0
- package/dist/unreal/doctor.js +102 -0
- package/dist/unreal/doctor.js.map +1 -0
- package/dist/unreal/package.d.ts +80 -0
- package/dist/unreal/package.js +273 -0
- package/dist/unreal/package.js.map +1 -0
- package/dist/unreal/release.d.ts +41 -0
- package/dist/unreal/release.js +122 -0
- package/dist/unreal/release.js.map +1 -0
- package/dist/unreal.d.ts +30 -0
- package/dist/unreal.js +362 -0
- package/dist/unreal.js.map +1 -0
- package/dist/unrealCandidate.d.ts +213 -0
- package/dist/unrealCandidate.js +765 -0
- package/dist/unrealCandidate.js.map +1 -0
- package/dist/unrealManifest.d.ts +74 -0
- package/dist/unrealManifest.js +354 -0
- package/dist/unrealManifest.js.map +1 -0
- package/dist/unrealPublish.d.ts +111 -0
- package/dist/unrealPublish.js +331 -0
- package/dist/unrealPublish.js.map +1 -0
- package/dist/vault.d.ts +121 -0
- package/dist/vault.js +136 -0
- package/dist/vault.js.map +1 -0
- package/dist/vehicle/addOnDefinition.d.ts +19 -0
- package/dist/vehicle/addOnDefinition.js +21 -0
- package/dist/vehicle/addOnDefinition.js.map +1 -0
- package/dist/vehicle/addon.d.ts +158 -0
- package/dist/vehicle/addon.js +441 -0
- package/dist/vehicle/addon.js.map +1 -0
- package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
- package/dist/vehicle/addonDefinitionGuard.js +206 -0
- package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
- package/dist/vehicle/addonPublished.d.ts +80 -0
- package/dist/vehicle/addonPublished.js +221 -0
- package/dist/vehicle/addonPublished.js.map +1 -0
- package/dist/vehicle/audio.d.ts +259 -0
- package/dist/vehicle/audio.js +1069 -0
- package/dist/vehicle/audio.js.map +1 -0
- package/dist/vehicle/audioDefects.d.ts +125 -0
- package/dist/vehicle/audioDefects.js +591 -0
- package/dist/vehicle/audioDefects.js.map +1 -0
- package/dist/vehicle/audioDistinct.d.ts +62 -0
- package/dist/vehicle/audioDistinct.js +479 -0
- package/dist/vehicle/audioDistinct.js.map +1 -0
- package/dist/vehicle/audioImport.d.ts +217 -0
- package/dist/vehicle/audioImport.js +610 -0
- package/dist/vehicle/audioImport.js.map +1 -0
- package/dist/vehicle/audioProvenance.d.ts +47 -0
- package/dist/vehicle/audioProvenance.js +364 -0
- package/dist/vehicle/audioProvenance.js.map +1 -0
- package/dist/vehicle/audioReference.d.ts +36 -0
- package/dist/vehicle/audioReference.js +176 -0
- package/dist/vehicle/audioReference.js.map +1 -0
- package/dist/vehicle/audioSlots.d.ts +27 -0
- package/dist/vehicle/audioSlots.js +43 -0
- package/dist/vehicle/audioSlots.js.map +1 -0
- package/dist/vehicle/audioSpectral.d.ts +71 -0
- package/dist/vehicle/audioSpectral.js +534 -0
- package/dist/vehicle/audioSpectral.js.map +1 -0
- package/dist/vehicle/cabinCheck.d.ts +209 -0
- package/dist/vehicle/cabinCheck.js +799 -0
- package/dist/vehicle/cabinCheck.js.map +1 -0
- package/dist/vehicle/drive.d.ts +66 -0
- package/dist/vehicle/drive.js +228 -0
- package/dist/vehicle/drive.js.map +1 -0
- package/dist/vehicle/enginePolicy.d.ts +68 -0
- package/dist/vehicle/enginePolicy.js +209 -0
- package/dist/vehicle/enginePolicy.js.map +1 -0
- package/dist/vehicle/hostFrame.d.ts +78 -0
- package/dist/vehicle/hostFrame.js +136 -0
- package/dist/vehicle/hostFrame.js.map +1 -0
- package/dist/vehicle/inspectionSheets.d.ts +42 -0
- package/dist/vehicle/inspectionSheets.js +173 -0
- package/dist/vehicle/inspectionSheets.js.map +1 -0
- package/dist/vehicle/keyboardLaunch.d.ts +189 -0
- package/dist/vehicle/keyboardLaunch.js +340 -0
- package/dist/vehicle/keyboardLaunch.js.map +1 -0
- package/dist/vehicle/lampCoverage.d.ts +49 -0
- package/dist/vehicle/lampCoverage.js +252 -0
- package/dist/vehicle/lampCoverage.js.map +1 -0
- package/dist/vehicle/mintAddOn.d.ts +110 -0
- package/dist/vehicle/mintAddOn.js +321 -0
- package/dist/vehicle/mintAddOn.js.map +1 -0
- package/dist/vehicle/mintVehicle.d.ts +189 -0
- package/dist/vehicle/mintVehicle.js +417 -0
- package/dist/vehicle/mintVehicle.js.map +1 -0
- package/dist/vehicle/paintHue.d.ts +89 -0
- package/dist/vehicle/paintHue.js +248 -0
- package/dist/vehicle/paintHue.js.map +1 -0
- package/dist/vehicle/panelCoverage.d.ts +37 -0
- package/dist/vehicle/panelCoverage.js +93 -0
- package/dist/vehicle/panelCoverage.js.map +1 -0
- package/dist/vehicle/platform.d.ts +71 -0
- package/dist/vehicle/platform.js +144 -0
- package/dist/vehicle/platform.js.map +1 -0
- package/dist/vehicle/preview.d.ts +339 -0
- package/dist/vehicle/preview.js +854 -0
- package/dist/vehicle/preview.js.map +1 -0
- package/dist/vehicle/previewAddon.d.ts +197 -0
- package/dist/vehicle/previewAddon.js +520 -0
- package/dist/vehicle/previewAddon.js.map +1 -0
- package/dist/vehicle/previewSeats.d.ts +102 -0
- package/dist/vehicle/previewSeats.js +190 -0
- package/dist/vehicle/previewSeats.js.map +1 -0
- package/dist/vehicle/publish.d.ts +78 -0
- package/dist/vehicle/publish.js +111 -0
- package/dist/vehicle/publish.js.map +1 -0
- package/dist/vehicle/recheckListed.d.ts +87 -0
- package/dist/vehicle/recheckListed.js +200 -0
- package/dist/vehicle/recheckListed.js.map +1 -0
- package/dist/vehicle/renditionManifest.d.ts +10 -0
- package/dist/vehicle/renditionManifest.js +56 -0
- package/dist/vehicle/renditionManifest.js.map +1 -0
- package/dist/vehicle/sealCheck.d.ts +30 -0
- package/dist/vehicle/sealCheck.js +59 -0
- package/dist/vehicle/sealCheck.js.map +1 -0
- package/dist/vehicle/simulate.d.ts +219 -0
- package/dist/vehicle/simulate.js +536 -0
- package/dist/vehicle/simulate.js.map +1 -0
- package/dist/vehicle/simulateRuntime.d.ts +76 -0
- package/dist/vehicle/simulateRuntime.js +252 -0
- package/dist/vehicle/simulateRuntime.js.map +1 -0
- package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
- package/dist/vehicle/testutil/sourcedAudio.js +96 -0
- package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
- package/dist/vehicle/validate.d.ts +225 -0
- package/dist/vehicle/validate.js +956 -0
- package/dist/vehicle/validate.js.map +1 -0
- package/dist/vehicle/wheelDesign.d.ts +98 -0
- package/dist/vehicle/wheelDesign.js +276 -0
- package/dist/vehicle/wheelDesign.js.map +1 -0
- package/dist/verifySubPath.d.ts +69 -0
- package/dist/verifySubPath.js +458 -0
- package/dist/verifySubPath.js.map +1 -0
- package/dist/visualQa/animation.d.ts +57 -0
- package/dist/visualQa/animation.js +503 -0
- package/dist/visualQa/animation.js.map +1 -0
- package/dist/visualQa/avatar.d.ts +3 -0
- package/dist/visualQa/avatar.js +443 -0
- package/dist/visualQa/avatar.js.map +1 -0
- package/dist/visualQa/avatarMath.d.ts +180 -0
- package/dist/visualQa/avatarMath.js +318 -0
- package/dist/visualQa/avatarMath.js.map +1 -0
- package/dist/visualQa/avatarPreview.d.ts +26 -0
- package/dist/visualQa/avatarPreview.js +167 -0
- package/dist/visualQa/avatarPreview.js.map +1 -0
- package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
- package/dist/visualQa/avatarPreviewMath.js +696 -0
- package/dist/visualQa/avatarPreviewMath.js.map +1 -0
- package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
- package/dist/visualQa/avatarPreviewProbe.js +181 -0
- package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
- package/dist/visualQa/avatarProbe.d.ts +1 -0
- package/dist/visualQa/avatarProbe.js +264 -0
- package/dist/visualQa/avatarProbe.js.map +1 -0
- package/dist/visualQa/browser.d.ts +116 -0
- package/dist/visualQa/browser.js +817 -0
- package/dist/visualQa/browser.js.map +1 -0
- package/dist/visualQa/candidate.d.ts +116 -0
- package/dist/visualQa/candidate.js +265 -0
- package/dist/visualQa/candidate.js.map +1 -0
- package/dist/visualQa/checklists.d.ts +31 -0
- package/dist/visualQa/checklists.js +160 -0
- package/dist/visualQa/checklists.js.map +1 -0
- package/dist/visualQa/command.d.ts +110 -0
- package/dist/visualQa/command.js +521 -0
- package/dist/visualQa/command.js.map +1 -0
- package/dist/visualQa/commonAsserts.d.ts +68 -0
- package/dist/visualQa/commonAsserts.js +239 -0
- package/dist/visualQa/commonAsserts.js.map +1 -0
- package/dist/visualQa/contactSheet.d.ts +32 -0
- package/dist/visualQa/contactSheet.js +153 -0
- package/dist/visualQa/contactSheet.js.map +1 -0
- package/dist/visualQa/critic.d.ts +18 -0
- package/dist/visualQa/critic.js +179 -0
- package/dist/visualQa/critic.js.map +1 -0
- package/dist/visualQa/emotePage.d.ts +10 -0
- package/dist/visualQa/emotePage.js +249 -0
- package/dist/visualQa/emotePage.js.map +1 -0
- package/dist/visualQa/evidenceOverlay.d.ts +74 -0
- package/dist/visualQa/evidenceOverlay.js +268 -0
- package/dist/visualQa/evidenceOverlay.js.map +1 -0
- package/dist/visualQa/harness.d.ts +57 -0
- package/dist/visualQa/harness.js +3 -0
- package/dist/visualQa/harness.js.map +1 -0
- package/dist/visualQa/hosted.d.ts +152 -0
- package/dist/visualQa/hosted.js +367 -0
- package/dist/visualQa/hosted.js.map +1 -0
- package/dist/visualQa/labelLimit.d.ts +12 -0
- package/dist/visualQa/labelLimit.js +31 -0
- package/dist/visualQa/labelLimit.js.map +1 -0
- package/dist/visualQa/mirror.d.ts +36 -0
- package/dist/visualQa/mirror.js +98 -0
- package/dist/visualQa/mirror.js.map +1 -0
- package/dist/visualQa/moveUx.d.ts +44 -0
- package/dist/visualQa/moveUx.js +103 -0
- package/dist/visualQa/moveUx.js.map +1 -0
- package/dist/visualQa/pinnedChrome.d.ts +63 -0
- package/dist/visualQa/pinnedChrome.js +214 -0
- package/dist/visualQa/pinnedChrome.js.map +1 -0
- package/dist/visualQa/resolve.d.ts +88 -0
- package/dist/visualQa/resolve.js +248 -0
- package/dist/visualQa/resolve.js.map +1 -0
- package/dist/visualQa/scene.d.ts +14 -0
- package/dist/visualQa/scene.js +688 -0
- package/dist/visualQa/scene.js.map +1 -0
- package/dist/visualQa/shot.d.ts +2 -0
- package/dist/visualQa/shot.js +27 -0
- package/dist/visualQa/shot.js.map +1 -0
- package/dist/visualQa/signIn.d.ts +35 -0
- package/dist/visualQa/signIn.js +144 -0
- package/dist/visualQa/signIn.js.map +1 -0
- package/dist/visualQa/submitBudget.d.ts +25 -0
- package/dist/visualQa/submitBudget.js +82 -0
- package/dist/visualQa/submitBudget.js.map +1 -0
- package/dist/visualQa/types.d.ts +195 -0
- package/dist/visualQa/types.js +12 -0
- package/dist/visualQa/types.js.map +1 -0
- package/dist/visualQa/vehicle.d.ts +130 -0
- package/dist/visualQa/vehicle.js +2001 -0
- package/dist/visualQa/vehicle.js.map +1 -0
- package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
- package/dist/visualQa/vehicleAddonProbe.js +115 -0
- package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
- package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
- package/dist/visualQa/vehicleCabinFit.js +55 -0
- package/dist/visualQa/vehicleCabinFit.js.map +1 -0
- package/dist/visualQa/vehicleClearance.d.ts +135 -0
- package/dist/visualQa/vehicleClearance.js +299 -0
- package/dist/visualQa/vehicleClearance.js.map +1 -0
- package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
- package/dist/visualQa/vehicleDriveAlive.js +103 -0
- package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
- package/dist/visualQa/vehicleGrip.d.ts +156 -0
- package/dist/visualQa/vehicleGrip.js +439 -0
- package/dist/visualQa/vehicleGrip.js.map +1 -0
- package/dist/visualQa/vehicleInspection.d.ts +30 -0
- package/dist/visualQa/vehicleInspection.js +189 -0
- package/dist/visualQa/vehicleInspection.js.map +1 -0
- package/dist/visualQa/vehicleLamps.d.ts +118 -0
- package/dist/visualQa/vehicleLamps.js +374 -0
- package/dist/visualQa/vehicleLamps.js.map +1 -0
- package/dist/visualQa/vehicleMath.d.ts +440 -0
- package/dist/visualQa/vehicleMath.js +967 -0
- package/dist/visualQa/vehicleMath.js.map +1 -0
- package/dist/visualQa/vehicleOccupants.d.ts +66 -0
- package/dist/visualQa/vehicleOccupants.js +448 -0
- package/dist/visualQa/vehicleOccupants.js.map +1 -0
- package/dist/visualQa/vehiclePenetration.d.ts +172 -0
- package/dist/visualQa/vehiclePenetration.js +1157 -0
- package/dist/visualQa/vehiclePenetration.js.map +1 -0
- package/dist/visualQa/vehiclePoses.d.ts +25 -0
- package/dist/visualQa/vehiclePoses.js +56 -0
- package/dist/visualQa/vehiclePoses.js.map +1 -0
- package/dist/visualQa/vehiclePosture.d.ts +78 -0
- package/dist/visualQa/vehiclePosture.js +263 -0
- package/dist/visualQa/vehiclePosture.js.map +1 -0
- package/dist/visualQa/vehiclePreview.d.ts +103 -0
- package/dist/visualQa/vehiclePreview.js +312 -0
- package/dist/visualQa/vehiclePreview.js.map +1 -0
- package/dist/visualQa/vehicleProbe.d.ts +3 -0
- package/dist/visualQa/vehicleProbe.js +670 -0
- package/dist/visualQa/vehicleProbe.js.map +1 -0
- package/dist/visualQa/vehicleStance.d.ts +108 -0
- package/dist/visualQa/vehicleStance.js +200 -0
- package/dist/visualQa/vehicleStance.js.map +1 -0
- package/dist/visualQa/viewer.d.ts +6 -0
- package/dist/visualQa/viewer.js +750 -0
- package/dist/visualQa/viewer.js.map +1 -0
- package/dist/visualQa/viewerGeometry.d.ts +116 -0
- package/dist/visualQa/viewerGeometry.js +476 -0
- package/dist/visualQa/viewerGeometry.js.map +1 -0
- package/dist/visualQa/viewerPage.d.ts +11 -0
- package/dist/visualQa/viewerPage.js +414 -0
- package/dist/visualQa/viewerPage.js.map +1 -0
- package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
- package/dist/visualQa/webgpuSelfTest.js +113 -0
- package/dist/visualQa/webgpuSelfTest.js.map +1 -0
- package/dist/visualQa/winChrome.d.ts +92 -0
- package/dist/visualQa/winChrome.js +445 -0
- package/dist/visualQa/winChrome.js.map +1 -0
- package/dist/visualQa/worldWalk.d.ts +59 -0
- package/dist/visualQa/worldWalk.js +523 -0
- package/dist/visualQa/worldWalk.js.map +1 -0
- package/dist/visualQa/worldWalkMath.d.ts +263 -0
- package/dist/visualQa/worldWalkMath.js +873 -0
- package/dist/visualQa/worldWalkMath.js.map +1 -0
- package/dist/visualQa/worldWalkProbe.d.ts +1 -0
- package/dist/visualQa/worldWalkProbe.js +206 -0
- package/dist/visualQa/worldWalkProbe.js.map +1 -0
- package/dist/visualsConfig.d.ts +65 -0
- package/dist/visualsConfig.js +1333 -0
- package/dist/visualsConfig.js.map +1 -0
- package/dist/voiceCommand.d.ts +11 -0
- package/dist/voiceCommand.js +101 -0
- package/dist/voiceCommand.js.map +1 -0
- package/dist/world/analyze.d.ts +51 -0
- package/dist/world/analyze.js +767 -0
- package/dist/world/analyze.js.map +1 -0
- package/dist/world/baseline.d.ts +33 -0
- package/dist/world/baseline.js +111 -0
- package/dist/world/baseline.js.map +1 -0
- package/dist/world/canonicalize.d.ts +7 -0
- package/dist/world/canonicalize.js +110 -0
- package/dist/world/canonicalize.js.map +1 -0
- package/dist/world/diff.d.ts +18 -0
- package/dist/world/diff.js +58 -0
- package/dist/world/diff.js.map +1 -0
- package/dist/world/focus.d.ts +11 -0
- package/dist/world/focus.js +161 -0
- package/dist/world/focus.js.map +1 -0
- package/dist/world/format.d.ts +6 -0
- package/dist/world/format.js +125 -0
- package/dist/world/format.js.map +1 -0
- package/dist/world/readWorldMetrics.d.ts +10 -0
- package/dist/world/readWorldMetrics.js +31 -0
- package/dist/world/readWorldMetrics.js.map +1 -0
- package/dist/world/snapshotTypes.d.ts +59 -0
- package/dist/world/snapshotTypes.js +8 -0
- package/dist/world/snapshotTypes.js.map +1 -0
- package/dist/world/snapshotWorld.d.ts +16 -0
- package/dist/world/snapshotWorld.js +142 -0
- package/dist/world/snapshotWorld.js.map +1 -0
- package/dist/world/wiring.d.ts +21 -0
- package/dist/world/wiring.js +73 -0
- package/dist/world/wiring.js.map +1 -0
- package/dist/world/zones.d.ts +23 -0
- package/dist/world/zones.js +134 -0
- package/dist/world/zones.js.map +1 -0
- package/docs/bridge.md +304 -0
- package/docs/device-hand-reach.md +44 -0
- package/docs/scene-hlod.md +139 -0
- package/docs/vehicle-audio-import.md +299 -0
- package/docs/vehicle-simulate.md +165 -0
- package/docs/visual-qa-candidate-versions.md +71 -0
- package/docs/visual-qa.md +462 -0
- package/package.json +69 -4
- package/plugins/beamng-vehicle/README.md +129 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
- package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
- package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
- package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
- package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
- package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
- package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
- package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
- package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
- package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
- package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
- package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
- package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
- package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
- package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
- package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
- package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
- package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
- package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
- package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
- package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
- package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
- package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
- package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
- package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
- package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
- package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
- package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
- package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
- package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
- package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
- package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
- package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
- package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
- package/vendor/README.md +63 -0
- package/vendor/ability-manifest.mjs +527 -6
- package/vendor/audits/asset-credits.mjs +96 -0
- package/vendor/audits/check-loaders.mjs +80 -0
- package/vendor/audits/perf-gate.mjs +759 -0
- package/vendor/audits/prove-live.mjs +307 -0
- package/vendor/audits/source-audit.mjs +530 -0
- package/vendor/audits/world-audit.mjs +439 -0
- package/vendor/capture-body.glb +0 -0
- package/vendor/capture-face.glb +0 -0
- package/vendor/installed-index.mjs +1 -1
- package/vendor/vehicle-package-v2.mjs +6451 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
-
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.skinBindTransform = skinBindTransform;
|
|
5
4
|
exports.extractCanonicalSkeleton = extractCanonicalSkeleton;
|
|
6
5
|
exports.conformToHelixRest = conformToHelixRest;
|
|
7
6
|
const core_1 = require("@gltf-transform/core");
|
|
@@ -11,6 +10,125 @@ const posOf = (m) => [m[12], m[13], m[14]];
|
|
|
11
10
|
const vlen = (v) => Math.hypot(v[0], v[1], v[2]);
|
|
12
11
|
/** Apply the transpose (=inverse, for a rotation) of a column-major matrix's upper 3x3 to a vector. */
|
|
13
12
|
const applyRotT = (m, v) => [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[4] * v[0] + m[5] * v[1] + m[6] * v[2], m[8] * v[0] + m[9] * v[1] + m[10] * v[2]];
|
|
13
|
+
function matrixIsIdentity(matrix) {
|
|
14
|
+
return matrix.every((value, index) => Math.abs(value - IDENTITY[index]) <= 1e-9);
|
|
15
|
+
}
|
|
16
|
+
/** Two affine matrices describe the same transform, to a tolerance relative to their magnitude. */
|
|
17
|
+
function matricesAgree(a, b) {
|
|
18
|
+
const scale = Math.max(1, ...a.map(Math.abs), ...b.map(Math.abs));
|
|
19
|
+
return a.every((value, index) => Math.abs(value - b[index]) <= 1e-3 * scale);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The transform glTF skinning actually applies to a skin's vertices at rest: `jointWorld · IBM`.
|
|
23
|
+
* In a rig exported at its bind pose every joint yields the same matrix, and that matrix — not the
|
|
24
|
+
* skinned mesh node's own transform, which the glTF spec says is ignored — places the vertices in the
|
|
25
|
+
* joints' world. Returns null when the joints disagree (a posed or inconsistent bind), where there is
|
|
26
|
+
* no single answer to read.
|
|
27
|
+
*/
|
|
28
|
+
function skinBindTransform(skin) {
|
|
29
|
+
const joints = skin.listJoints();
|
|
30
|
+
if (joints.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
const inverseBinds = skin.getInverseBindMatrices();
|
|
33
|
+
const element = new Array(16).fill(0);
|
|
34
|
+
let consensus = null;
|
|
35
|
+
for (const [index, joint] of joints.entries()) {
|
|
36
|
+
const ibm = inverseBinds === null ? IDENTITY : inverseBinds.getElement(index, element);
|
|
37
|
+
const bind = (0, mat4_1.mul4)(joint.getWorldMatrix(), ibm);
|
|
38
|
+
if (consensus === null)
|
|
39
|
+
consensus = bind;
|
|
40
|
+
else if (!matricesAgree(consensus, bind))
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return consensus;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Character stages operate in one canonical world space. glTF/FBX inputs may
|
|
47
|
+
* carry their axis and unit conversion on ancestors of the skinned mesh;
|
|
48
|
+
* conform later replaces those ancestors, so bake the world transform into
|
|
49
|
+
* geometry first. Morph POSITION values are deltas and omit translation.
|
|
50
|
+
*
|
|
51
|
+
* Baked only when the skin agrees that the node's world transform IS the space its vertices live in
|
|
52
|
+
* (`jointWorld · IBM` equals it, as three's FBX export writes it). When the skin's bind says otherwise,
|
|
53
|
+
* the node transform is one glTF skinning never applies, and baking it scales the character a second
|
|
54
|
+
* time. That is the Meshy/Blender export: a 0.01 `Armature` over centimetre bones is the parent of both
|
|
55
|
+
* the joints and the mesh node, the IBMs already absorb it (`jointWorld · IBM = I`), and the vertices
|
|
56
|
+
* are metres. Baking the 0.01 shrank every Meshy-rigged Dreamer avatar to 1.8 cm, after which unit
|
|
57
|
+
* normalization scaled the metre joints down to match (helix-cli 0.1.15 through 0.1.17).
|
|
58
|
+
*/
|
|
59
|
+
function bakeSkinnedMeshWorldTransforms(document) {
|
|
60
|
+
const root = document.getRoot();
|
|
61
|
+
const scene = root.listScenes()[0];
|
|
62
|
+
if (scene === undefined)
|
|
63
|
+
return;
|
|
64
|
+
const transformed = new Map();
|
|
65
|
+
const apply = (accessor, matrix, kind) => {
|
|
66
|
+
if (accessor === null)
|
|
67
|
+
return;
|
|
68
|
+
const key = `${kind}:${matrix.map((value) => value.toPrecision(12)).join(',')}`;
|
|
69
|
+
const previous = transformed.get(accessor);
|
|
70
|
+
if (previous !== undefined) {
|
|
71
|
+
if (previous !== key) {
|
|
72
|
+
throw new Error('conformToHelixRest: one geometry accessor is instanced under different world transforms');
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
transformed.set(accessor, key);
|
|
77
|
+
const element = new Array(accessor.getElementSize()).fill(0);
|
|
78
|
+
const inverse = kind === 'normal' ? (0, mat4_1.invert4)(matrix) : null;
|
|
79
|
+
const rotate = (source) => {
|
|
80
|
+
const sx = Math.hypot(matrix[0], matrix[1], matrix[2]) || 1;
|
|
81
|
+
const sy = Math.hypot(matrix[4], matrix[5], matrix[6]) || 1;
|
|
82
|
+
const sz = Math.hypot(matrix[8], matrix[9], matrix[10]) || 1;
|
|
83
|
+
return [
|
|
84
|
+
matrix[0] / sx * source[0] + matrix[4] / sy * source[1] + matrix[8] / sz * source[2],
|
|
85
|
+
matrix[1] / sx * source[0] + matrix[5] / sy * source[1] + matrix[9] / sz * source[2],
|
|
86
|
+
matrix[2] / sx * source[0] + matrix[6] / sy * source[1] + matrix[10] / sz * source[2],
|
|
87
|
+
];
|
|
88
|
+
};
|
|
89
|
+
for (let index = 0; index < accessor.getCount(); index++) {
|
|
90
|
+
accessor.getElement(index, element);
|
|
91
|
+
const source = [element[0], element[1], element[2]];
|
|
92
|
+
let value;
|
|
93
|
+
if (kind === 'point')
|
|
94
|
+
value = (0, mat4_1.transformPoint)(matrix, source);
|
|
95
|
+
else if (kind === 'normal')
|
|
96
|
+
value = applyRotT(inverse, source);
|
|
97
|
+
else if (kind === 'normalDelta' || kind === 'tangentDelta')
|
|
98
|
+
value = rotate(source);
|
|
99
|
+
else
|
|
100
|
+
value = (0, mat4_1.transformDir)(matrix, source);
|
|
101
|
+
if (kind === 'normal' || kind === 'tangent')
|
|
102
|
+
value = (0, mat4_1.normalize3)(value);
|
|
103
|
+
element[0] = value[0];
|
|
104
|
+
element[1] = value[1];
|
|
105
|
+
element[2] = value[2];
|
|
106
|
+
accessor.setElement(index, element);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
for (const node of [...root.listNodes()]) {
|
|
110
|
+
const mesh = node.getMesh();
|
|
111
|
+
if (mesh === null || node.getSkin() === null)
|
|
112
|
+
continue;
|
|
113
|
+
const world = node.getWorldMatrix();
|
|
114
|
+
const bind = skinBindTransform(node.getSkin());
|
|
115
|
+
const ignoredBySkinning = bind !== null && !matricesAgree(bind, world);
|
|
116
|
+
if (!matrixIsIdentity(world) && !ignoredBySkinning) {
|
|
117
|
+
for (const primitive of mesh.listPrimitives()) {
|
|
118
|
+
apply(primitive.getAttribute('POSITION'), world, 'point');
|
|
119
|
+
apply(primitive.getAttribute('NORMAL'), world, 'normal');
|
|
120
|
+
apply(primitive.getAttribute('TANGENT'), world, 'tangent');
|
|
121
|
+
for (const target of primitive.listTargets()) {
|
|
122
|
+
apply(target.getAttribute('POSITION'), world, 'direction');
|
|
123
|
+
apply(target.getAttribute('NORMAL'), world, 'normalDelta');
|
|
124
|
+
apply(target.getAttribute('TANGENT'), world, 'tangentDelta');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
node.setMatrix(IDENTITY);
|
|
129
|
+
scene.addChild(node);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
14
132
|
function parentNode(node) {
|
|
15
133
|
for (const p of node.listParents())
|
|
16
134
|
if (p.propertyType === core_1.PropertyType.NODE)
|
|
@@ -21,9 +139,10 @@ function parentNode(node) {
|
|
|
21
139
|
* Reads the canonical helix-humanoid@1 rest skeleton out of a shipped body GLB (body-m-default): the
|
|
22
140
|
* full bone subtree (local rest transforms + hierarchy) and the skin's joint order. World transforms
|
|
23
141
|
* are recomputed from the skeleton root down (independent of the source file's mesh-node ancestor),
|
|
24
|
-
* so a rebuilt copy with the root at scene identity reproduces them exactly.
|
|
142
|
+
* so a rebuilt copy with the root at scene identity reproduces them exactly. A host-aligned add-on
|
|
143
|
+
* can opt into the root's world transform to retain a base avatar's hoisted root_offset wrapper.
|
|
25
144
|
*/
|
|
26
|
-
function extractCanonicalSkeleton(document) {
|
|
145
|
+
function extractCanonicalSkeleton(document, options = {}) {
|
|
27
146
|
const skin = document.getRoot().listSkins()[0];
|
|
28
147
|
if (skin === undefined)
|
|
29
148
|
throw new Error('extractCanonicalSkeleton: no skin in the canonical body GLB');
|
|
@@ -32,7 +151,12 @@ function extractCanonicalSkeleton(document) {
|
|
|
32
151
|
const nodes = [];
|
|
33
152
|
const worldByName = new Map();
|
|
34
153
|
const visit = (node, parent, parentWorld) => {
|
|
35
|
-
|
|
154
|
+
// Base avatars may hoist hip height into a wrapper above the animated root.
|
|
155
|
+
// A host-aligned add-on must retain that offset; otherwise a garment already
|
|
156
|
+
// sitting on the host is rebound to a rig translated below it.
|
|
157
|
+
const local = (parent === null && options.includeRootWorld
|
|
158
|
+
? node.getWorldMatrix()
|
|
159
|
+
: node.getMatrix());
|
|
36
160
|
const world = (0, mat4_1.mul4)(parentWorld, local);
|
|
37
161
|
const name = node.getName();
|
|
38
162
|
nodes.push({ name, local, parent });
|
|
@@ -41,24 +165,105 @@ function extractCanonicalSkeleton(document) {
|
|
|
41
165
|
visit(child, name, world);
|
|
42
166
|
};
|
|
43
167
|
visit(rootNode, null, IDENTITY);
|
|
44
|
-
|
|
168
|
+
const skeleton = { nodes, jointNames, worldByName, skeletonRootName: rootNode.getName() };
|
|
169
|
+
if (options.hoistRootOffset === true && options.includeRootWorld !== true) {
|
|
170
|
+
// The wrapper's world is the root's world divided by its own local: parent chain above the root.
|
|
171
|
+
const rootWorld = rootNode.getWorldMatrix();
|
|
172
|
+
const offset = (0, mat4_1.mul4)(rootWorld, (0, mat4_1.invert4)(rootNode.getMatrix()));
|
|
173
|
+
if (!matrixIsIdentity(offset))
|
|
174
|
+
skeleton.rootOffset = offset;
|
|
175
|
+
}
|
|
176
|
+
return skeleton;
|
|
45
177
|
}
|
|
46
178
|
/**
|
|
47
|
-
* Fits the canonical skeleton onto a source character's proportions:
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
179
|
+
* Fits the canonical skeleton onto a source character's proportions. Positions: mapped bones sit at the
|
|
180
|
+
* source's joint worlds — EXCEPT interior spine joints, which are position-skipped (see POSITION_SKIP)
|
|
181
|
+
* and, like unmapped in-betweens (spine_02/04, neck_02, twists), interpolate along their enclosing
|
|
182
|
+
* mapped span at their canonical fraction (extrapolating by parent-segment scale overshoots — a 3×
|
|
183
|
+
* lower spine threw spine_02 past spine_03, a zigzag lever every clip then rotates); bones with no
|
|
184
|
+
* mapped span (fingers) scale their canonical offset by the parent segment. Orientations: canonical
|
|
185
|
+
* local rest rotations, EXCEPT mapped bones with a mapped continuation, whose rest is re-aimed by the
|
|
186
|
+
* shortest arc from the canonical segment direction onto the source's. The IBM (inverse of rest) then
|
|
187
|
+
* subtracts the source-bind-vs-canonical direction delta ONCE — a shared canonical clip lands every
|
|
188
|
+
* segment in the same world direction as the stock body instead of carrying the bind delta into every
|
|
189
|
+
* pose (Meshy binding arms ~19° flatter than MetaHuman read as hands-behind-the-back in every clip).
|
|
190
|
+
* Shortest-arc adds no roll: the twist DOF a segment direction can't express stays canonical. The
|
|
191
|
+
* source mesh still binds UNCHANGED — rest render is pristine (M·IBM = I) whatever rest we choose.
|
|
53
192
|
*/
|
|
54
193
|
function fitSkeletonToWarrior(canon, directPos) {
|
|
55
194
|
const canonPos = (n) => posOf(canon.worldByName.get(n));
|
|
195
|
+
// Interior spine joints keep their WEIGHT mapping but are never position anchors: sources place them
|
|
196
|
+
// by rig convention, not anatomy (Meshy trisects a straight hips->neck line — its bottom joint lands
|
|
197
|
+
// at NAVEL height, a 4× pelvis->spine_01 lever that swings the whole waist with every clip's hip
|
|
198
|
+
// sway). Dropped here, they interpolate on the pelvis->neck span at canonical fractions like any
|
|
199
|
+
// unmapped in-between; pelvis/neck/head/limbs stay the proportion anchors.
|
|
200
|
+
const POSITION_SKIP = new Set(['spine_01', 'spine_02', 'spine_03', 'spine_04', 'spine_05']);
|
|
201
|
+
for (const n of POSITION_SKIP)
|
|
202
|
+
directPos.delete(n);
|
|
203
|
+
// Canonical topology lookups.
|
|
204
|
+
const parentOf = new Map();
|
|
205
|
+
const childrenOf = new Map();
|
|
206
|
+
for (const def of canon.nodes) {
|
|
207
|
+
parentOf.set(def.name, def.parent);
|
|
208
|
+
if (def.parent !== null) {
|
|
209
|
+
const arr = childrenOf.get(def.parent);
|
|
210
|
+
if (arr === undefined)
|
|
211
|
+
childrenOf.set(def.parent, [def.name]);
|
|
212
|
+
else
|
|
213
|
+
arr.push(def.name);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const mappedBelow = (name) => {
|
|
217
|
+
const out = [];
|
|
218
|
+
for (const c of childrenOf.get(name) ?? []) {
|
|
219
|
+
if (directPos.has(c))
|
|
220
|
+
out.push(c);
|
|
221
|
+
else
|
|
222
|
+
out.push(...mappedBelow(c));
|
|
223
|
+
}
|
|
224
|
+
return out;
|
|
225
|
+
};
|
|
226
|
+
const nearestMappedAncestor = (name) => {
|
|
227
|
+
for (let p = parentOf.get(name) ?? null; p !== null; p = parentOf.get(p) ?? null)
|
|
228
|
+
if (directPos.has(p))
|
|
229
|
+
return p;
|
|
230
|
+
return null;
|
|
231
|
+
};
|
|
232
|
+
// Aim anchor per mapped bone: the nearest mapped descendant that best CONTINUES the chain (max
|
|
233
|
+
// alignment with the bone's canonical incoming direction — picks spine_01 over the thighs for pelvis).
|
|
234
|
+
const aimAnchor = new Map();
|
|
235
|
+
for (const def of canon.nodes) {
|
|
236
|
+
if (!directPos.has(def.name))
|
|
237
|
+
continue;
|
|
238
|
+
const cands = mappedBelow(def.name);
|
|
239
|
+
if (cands.length === 0)
|
|
240
|
+
continue;
|
|
241
|
+
const parent = def.parent;
|
|
242
|
+
const inDir = parent !== null ? (0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(def.name), canonPos(parent))) : [0, 1, 0];
|
|
243
|
+
let best = cands[0], bestDot = -Infinity;
|
|
244
|
+
for (const c of cands) {
|
|
245
|
+
const d = (0, mat4_1.dot3)((0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(c), canonPos(def.name))), inDir);
|
|
246
|
+
if (d > bestDot) {
|
|
247
|
+
bestDot = d;
|
|
248
|
+
best = c;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
aimAnchor.set(def.name, best);
|
|
252
|
+
}
|
|
56
253
|
// Pass 1 — desired world position per bone (canon.nodes is DFS, parent before child).
|
|
254
|
+
// HIP-HEIGHT RE-REFERENCE: clips drive the pelvis's LOCAL translation with values authored for the
|
|
255
|
+
// canonical hip height, so a source whose pelvis rests higher/lower loses that delta under every clip
|
|
256
|
+
// and its feet sink into / float off the ground by exactly it. Shift the delta into the ROOT's rest
|
|
257
|
+
// translation (no clip writes root — the pipeline strips non-pelvis position tracks): the pelvis rest
|
|
258
|
+
// local becomes canonical by construction, worlds are unchanged (rest render pristine), and under
|
|
259
|
+
// clips the pelvis rides at root Δ + clip value — the source's own height, feet planted like stock.
|
|
260
|
+
const rootDelta = directPos.has('pelvis') ? (0, mat4_1.sub3)(directPos.get('pelvis'), canonPos('pelvis')) : [0, 0, 0];
|
|
57
261
|
const desired = new Map();
|
|
58
262
|
const scaleBy = new Map();
|
|
59
263
|
for (const def of canon.nodes) {
|
|
60
264
|
if (def.parent === null) {
|
|
61
|
-
|
|
265
|
+
const c = canonPos(def.name);
|
|
266
|
+
desired.set(def.name, [c[0] + rootDelta[0], c[1] + rootDelta[1], c[2] + rootDelta[2]]);
|
|
62
267
|
scaleBy.set(def.name, 1);
|
|
63
268
|
continue;
|
|
64
269
|
}
|
|
@@ -69,53 +274,98 @@ function fitSkeletonToWarrior(canon, directPos) {
|
|
|
69
274
|
desired.set(def.name, dp);
|
|
70
275
|
const cl = vlen(canonOff);
|
|
71
276
|
scaleBy.set(def.name, cl > 1e-6 ? vlen((0, mat4_1.sub3)(dp, pPos)) / cl : (scaleBy.get(def.parent) ?? 1));
|
|
277
|
+
continue;
|
|
72
278
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
279
|
+
// Unmapped: interpolate on the mapped span around it (ancestor A -> nearest mapped descendant, or
|
|
280
|
+
// A's own continuation anchor for off-chain bones like twists), at the canonical fraction with the
|
|
281
|
+
// canonical perpendicular offset rotated/scaled into the source segment.
|
|
282
|
+
const A = nearestMappedAncestor(def.name);
|
|
283
|
+
const B = A !== null ? (mappedBelow(def.name)
|
|
284
|
+
.reduce((acc, c) => {
|
|
285
|
+
if (acc === null)
|
|
286
|
+
return c;
|
|
287
|
+
const ref = (0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(def.name), canonPos(A)));
|
|
288
|
+
return (0, mat4_1.dot3)((0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(c), canonPos(A))), ref) > (0, mat4_1.dot3)((0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(acc), canonPos(A))), ref) ? c : acc;
|
|
289
|
+
}, null) ?? aimAnchor.get(A) ?? null) : null;
|
|
290
|
+
if (A !== null && B !== null) {
|
|
291
|
+
const segC = (0, mat4_1.sub3)(canonPos(B), canonPos(A));
|
|
292
|
+
const segS = (0, mat4_1.sub3)(directPos.get(B), directPos.get(A));
|
|
293
|
+
const lC = vlen(segC), lS = vlen(segS);
|
|
294
|
+
if (lC > 1e-6 && lS > 1e-6) {
|
|
295
|
+
const u = (0, mat4_1.sub3)(canonPos(def.name), canonPos(A));
|
|
296
|
+
const t = (0, mat4_1.dot3)(u, segC) / (lC * lC);
|
|
297
|
+
const perp = [u[0] - segC[0] * t, u[1] - segC[1] * t, u[2] - segC[2] * t];
|
|
298
|
+
const s = lS / lC;
|
|
299
|
+
const [px, py, pz] = (0, mat4_1.transformDir)((0, mat4_1.shortestArc4)(segC, segS), perp);
|
|
300
|
+
const a = directPos.get(A);
|
|
301
|
+
desired.set(def.name, [a[0] + segS[0] * t + px * s, a[1] + segS[1] * t + py * s, a[2] + segS[2] * t + pz * s]);
|
|
302
|
+
scaleBy.set(def.name, s);
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
77
305
|
}
|
|
306
|
+
const s = scaleBy.get(def.parent) ?? 1;
|
|
307
|
+
desired.set(def.name, [pPos[0] + canonOff[0] * s, pPos[1] + canonOff[1] * s, pPos[2] + canonOff[2] * s]);
|
|
308
|
+
scaleBy.set(def.name, s);
|
|
78
309
|
}
|
|
79
|
-
// Pass 2 — rebuild local matrices =
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
const
|
|
89
|
-
|
|
310
|
+
// Pass 2 — rebuild local matrices = local ROTATION + fitted local TRANSLATION; recompute world.
|
|
311
|
+
// Mapped bones with an anchor: segment-aimed from the CANONICAL rest world, so corrections stay
|
|
312
|
+
// absolute and never compound down the chain (net effect on the anchor child's local translation:
|
|
313
|
+
// lt = s · lt_canonical — identical clip rotations reproduce the stock body's segment directions at
|
|
314
|
+
// the source's lengths). Mapped bones WITHOUT an anchor: their segment tells us nothing, so keep the
|
|
315
|
+
// ABSOLUTE canonical rest world rotation — heads are authored level and toes ground-flat no matter how
|
|
316
|
+
// the source's neck/foot segments tilt; riding the parent's aim would counter-tilt them under clips.
|
|
317
|
+
// Exception HANDS: a bound hand continues its forearm, so they DO ride the forearm's aim. Unmapped
|
|
318
|
+
// bones (twists, fingers — unweighted helpers) ride their parent via canonical locals.
|
|
319
|
+
const RIDE_PARENT_AIM = new Set(['hand_l', 'hand_r']);
|
|
320
|
+
// FEET and CLAVICLES are never aimed despite having anchors — both are PROPORTIONS bones whose
|
|
321
|
+
// authored direction must survive clips. Feet: soles are authored ground-flat however steeply the
|
|
322
|
+
// source ankle->toe bone runs; aiming pitches the sole by the bone-vs-canonical delta (toes lift).
|
|
323
|
+
// Clavicles: Meshy binds the shoulder shelf ~horizontal while the canonical clavicle droops ~9° —
|
|
324
|
+
// aiming pulled the girdle down to canonical in every clip (collapsed silhouette). Neck: Meshy binds
|
|
325
|
+
// it near-vertical while the canonical neck rest pitches ~8-12° forward — aiming folded that delta
|
|
326
|
+
// into the bind, so every clip rotated the neck FLESH ~12° forward of the default body (forward-jut
|
|
327
|
+
// head under run). Absolute canonical rest keeps the authored direction for these; the aimed chain
|
|
328
|
+
// beyond them still lands canonical, riding at the source's joint (~2 cm offsets, not misdirection).
|
|
329
|
+
const AIM_SKIP = new Set(['foot_l', 'foot_r', 'clavicle_l', 'clavicle_r', 'neck_01']);
|
|
330
|
+
let restAimed = 0;
|
|
90
331
|
const world = new Map();
|
|
91
332
|
const nodes = [];
|
|
92
333
|
for (const def of canon.nodes) {
|
|
93
334
|
const parentWorld = def.parent !== null ? world.get(def.parent) : IDENTITY;
|
|
94
335
|
const worldOff = def.parent !== null ? (0, mat4_1.sub3)(desired.get(def.name), desired.get(def.parent)) : desired.get(def.name);
|
|
95
|
-
const lt = def.parent !== null ? applyRotT(parentWorld, worldOff) : worldOff; // into parent's
|
|
336
|
+
const lt = def.parent !== null ? applyRotT(parentWorld, worldOff) : worldOff; // into parent's fitted frame
|
|
96
337
|
let rot = (0, mat4_1.rigidize)(def.local); // default: canonical local orientation
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
338
|
+
if (directPos.has(def.name)) {
|
|
339
|
+
const anchor = AIM_SKIP.has(def.name) ? undefined : aimAnchor.get(def.name);
|
|
340
|
+
let arc = null;
|
|
341
|
+
if (anchor !== undefined) {
|
|
342
|
+
const srcDir = (0, mat4_1.sub3)(directPos.get(anchor), directPos.get(def.name));
|
|
343
|
+
const canonDir = (0, mat4_1.sub3)(canonPos(anchor), canonPos(def.name));
|
|
344
|
+
if (vlen(srcDir) > 1e-6 && vlen(canonDir) > 1e-6) {
|
|
345
|
+
arc = (0, mat4_1.shortestArc4)(canonDir, srcDir);
|
|
346
|
+
restAimed++;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (arc !== null || !RIDE_PARENT_AIM.has(def.name)) {
|
|
350
|
+
const canonWorldRot = (0, mat4_1.rigidize)(canon.worldByName.get(def.name));
|
|
351
|
+
const worldRotDes = arc !== null ? (0, mat4_1.mul4)(arc, canonWorldRot) : canonWorldRot;
|
|
352
|
+
rot = (0, mat4_1.mul4)((0, mat4_1.invert4)((0, mat4_1.rigidize)(parentWorld)), worldRotDes);
|
|
353
|
+
}
|
|
104
354
|
}
|
|
105
355
|
const local = [rot[0], rot[1], rot[2], 0, rot[4], rot[5], rot[6], 0, rot[8], rot[9], rot[10], 0, lt[0], lt[1], lt[2], 1];
|
|
106
356
|
nodes.push({ name: def.name, local, parent: def.parent });
|
|
107
357
|
world.set(def.name, (0, mat4_1.mul4)(parentWorld, local));
|
|
108
358
|
}
|
|
109
|
-
return { nodes, jointNames: canon.jointNames, worldByName: world, skeletonRootName: canon.skeletonRootName };
|
|
359
|
+
return { skeleton: { nodes, jointNames: canon.jointNames, worldByName: world, skeletonRootName: canon.skeletonRootName }, restAimed };
|
|
110
360
|
}
|
|
111
361
|
/**
|
|
112
362
|
* Retargets a source character onto `helix-humanoid@1` so the PLATFORM's shared clips drive it.
|
|
113
363
|
*
|
|
114
364
|
* 'embed' (default, the better retarget): the source mesh is left byte-for-byte unchanged and the
|
|
115
|
-
* canonical 68-bone skeleton is fitted INTO it (canonical
|
|
116
|
-
* positions, §fitSkeletonToWarrior). Clips — authored as local rotations relative to the canonical
|
|
117
|
-
* — produce the correct WORLD-space motion regardless of the source's bone-axis convention
|
|
118
|
-
*
|
|
365
|
+
* canonical 68-bone skeleton is fitted INTO it (segment-aimed canonical orientations at the source's
|
|
366
|
+
* joint positions, §fitSkeletonToWarrior). Clips — authored as local rotations relative to the canonical
|
|
367
|
+
* rest — produce the correct WORLD-space motion regardless of the source's bone-axis convention or bind
|
|
368
|
+
* pose, because the aimed rests subtract the source-bind-vs-canonical direction delta at the IBM. Output
|
|
119
369
|
* IBMs = inverse(fitted world), so LBS at rest reproduces the pristine source bind pose.
|
|
120
370
|
*
|
|
121
371
|
* 'repose' re-poses the mesh onto the canonical rest via frame-based rest-pose correction (kept for
|
|
@@ -126,20 +376,19 @@ function fitSkeletonToWarrior(canon, directPos) {
|
|
|
126
376
|
function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
127
377
|
const mode = opts.mode ?? 'embed';
|
|
128
378
|
const root = warrior.getRoot();
|
|
379
|
+
bakeSkinnedMeshWorldTransforms(warrior);
|
|
129
380
|
const wskin = root.listSkins()[0];
|
|
130
381
|
if (wskin === undefined)
|
|
131
382
|
throw new Error('conformToHelixRest: warrior GLB has no skin');
|
|
132
383
|
const wjoints = wskin.listJoints();
|
|
133
384
|
// Resolve each warrior joint to a helix joint (map, else nearest mapped ancestor).
|
|
134
|
-
const jointByNode = new Map(wjoints.map((j) => [j, true]));
|
|
135
385
|
const helixFor = (joint) => {
|
|
136
386
|
let cur = joint;
|
|
137
387
|
while (cur !== null) {
|
|
138
388
|
const mapped = boneMap.map[cur.getName()];
|
|
139
389
|
if (mapped !== undefined)
|
|
140
390
|
return mapped;
|
|
141
|
-
|
|
142
|
-
cur = p !== null && jointByNode.has(p) ? p : null;
|
|
391
|
+
cur = parentNode(cur);
|
|
143
392
|
}
|
|
144
393
|
throw new Error(`conformToHelixRest: warrior joint '${joint.getName()}' has no mapped ancestor`);
|
|
145
394
|
};
|
|
@@ -148,28 +397,189 @@ function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
|
148
397
|
wjoints.forEach((j, i) => (weightTargets[j.getName()] = helixByWarriorIdx[i]));
|
|
149
398
|
// Warrior joint hierarchy + world rest positions.
|
|
150
399
|
const idxByNode = new Map(wjoints.map((j, i) => [j, i]));
|
|
151
|
-
const
|
|
400
|
+
const idxByName = new Map(wjoints.map((j, i) => [j.getName(), i]));
|
|
401
|
+
const parentIdx = wjoints.map((joint, jointIndex) => {
|
|
402
|
+
let parent = parentNode(joint);
|
|
403
|
+
while (parent !== null) {
|
|
404
|
+
const direct = idxByNode.get(parent);
|
|
405
|
+
const mappedName = boneMap.map[parent.getName()] ?? parent.getName();
|
|
406
|
+
const byName = idxByName.get(mappedName);
|
|
407
|
+
const candidate = direct ?? byName;
|
|
408
|
+
// THREE's FBX -> glTF fallback can emit an unlisted duplicate node for
|
|
409
|
+
// each bone between a skin joint and its actual parent. Duplicate self
|
|
410
|
+
// names are wrappers, not a parent edge; keep walking past them.
|
|
411
|
+
if (candidate !== undefined && candidate !== jointIndex)
|
|
412
|
+
return candidate;
|
|
413
|
+
parent = parentNode(parent);
|
|
414
|
+
}
|
|
415
|
+
return -1;
|
|
416
|
+
});
|
|
152
417
|
const childIdxs = wjoints.map(() => []);
|
|
153
418
|
parentIdx.forEach((p, i) => { if (p >= 0)
|
|
154
419
|
childIdxs[p].push(i); });
|
|
155
|
-
|
|
420
|
+
// UNIT NORMALIZATION. Meshy rig exports have shipped in two conventions: cm bones under an Armature
|
|
421
|
+
// scaled 0.01 (joint worlds land in meters), and — later exports — cm bones at scene scale 1 (joint
|
|
422
|
+
// worlds ARE cm). glTF ignores a skinned mesh node's own transform, so the VERTEX data defines the
|
|
423
|
+
// model's true unit space; a rig fitted at cm positions still binds pristinely (bone·IBM = I at rest,
|
|
424
|
+
// any uniform scale cancels) and passes every static check, then explodes the instant meter-space
|
|
425
|
+
// platform clips drive it. Snap the joint worlds to the vertex data's decade before fitting.
|
|
426
|
+
const rawTsrc = wjoints.map((j) => posOf(j.getWorldMatrix()));
|
|
427
|
+
const maxWeightByJoint = new Float32Array(wjoints.length);
|
|
428
|
+
let meshMinY = Infinity, meshMaxY = -Infinity;
|
|
429
|
+
for (const node of root.listNodes()) {
|
|
430
|
+
if (node.getSkin() !== wskin || node.getMesh() === null)
|
|
431
|
+
continue;
|
|
432
|
+
for (const prim of node.getMesh().listPrimitives()) {
|
|
433
|
+
const pos = prim.getAttribute('POSITION');
|
|
434
|
+
if (pos === null)
|
|
435
|
+
continue;
|
|
436
|
+
const mn = [], mx = [];
|
|
437
|
+
pos.getMin(mn);
|
|
438
|
+
pos.getMax(mx);
|
|
439
|
+
meshMinY = Math.min(meshMinY, mn[1]);
|
|
440
|
+
meshMaxY = Math.max(meshMaxY, mx[1]);
|
|
441
|
+
const setCount = prim.listSemantics().filter((semantic) => semantic.startsWith('JOINTS_')).length;
|
|
442
|
+
for (let set = 0; set < setCount; set++) {
|
|
443
|
+
const joints = prim.getAttribute(`JOINTS_${set}`)?.getArray();
|
|
444
|
+
const weights = prim.getAttribute(`WEIGHTS_${set}`)?.getArray();
|
|
445
|
+
if (joints === null || joints === undefined || weights === null || weights === undefined)
|
|
446
|
+
continue;
|
|
447
|
+
for (let component = 0; component < joints.length; component++) {
|
|
448
|
+
const jointIndex = joints[component];
|
|
449
|
+
maxWeightByJoint[jointIndex] = Math.max(maxWeightByJoint[jointIndex], weights[component]);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Tiny cleanup influences are common on rigid accessories and may reach a distant root/head joint.
|
|
455
|
+
// They are real deformation weights, but they do not describe the anatomy represented by the mesh.
|
|
456
|
+
// Including a 1% outlier can expand a necklace's inferred joint span by a full decade and make an
|
|
457
|
+
// already-metre rig look centimetre-scaled. Unit inference therefore uses joints that own at least
|
|
458
|
+
// 5% of one vertex; if an invalid/non-normalized source has none, retain the fail-safe of using every
|
|
459
|
+
// positive influence so the later conformance checks still see the rig rather than an empty set.
|
|
460
|
+
const materialWeightedJoints = [...maxWeightByJoint]
|
|
461
|
+
.map((weight, index) => ({ weight, index }))
|
|
462
|
+
.filter(({ weight }) => weight >= 0.05)
|
|
463
|
+
.map(({ index }) => index);
|
|
464
|
+
const weightedJointIndices = new Set(materialWeightedJoints.length > 0
|
|
465
|
+
? materialWeightedJoints
|
|
466
|
+
: [...maxWeightByJoint].flatMap((weight, index) => weight > 0 ? [index] : []));
|
|
467
|
+
let jointMinY = Infinity, jointMaxY = -Infinity;
|
|
468
|
+
// A modular garment still carries the complete avatar skin, but only a local subset of those joints
|
|
469
|
+
// influences its vertices. Comparing sleeves against the full head-to-foot span misclassifies a valid
|
|
470
|
+
// metre rig as centimetres. The weighted joints are the only skeleton extent represented by this mesh.
|
|
471
|
+
for (const index of weightedJointIndices) {
|
|
472
|
+
const p = rawTsrc[index];
|
|
473
|
+
if (p === undefined)
|
|
474
|
+
continue;
|
|
475
|
+
jointMinY = Math.min(jointMinY, p[1]);
|
|
476
|
+
jointMaxY = Math.max(jointMaxY, p[1]);
|
|
477
|
+
}
|
|
478
|
+
const meshSpanY = meshMaxY - meshMinY, skelSpanY = jointMaxY - jointMinY;
|
|
479
|
+
// A rigidly weighted garment can legitimately reference only one joint, leaving the weighted Y-span at
|
|
480
|
+
// zero. In that case compare its nearest mapped bone segment with the same canonical segment. This keeps
|
|
481
|
+
// the decision local to the represented anatomy while still distinguishing metre and centimetre rigs.
|
|
482
|
+
let anchoredDecade = 1;
|
|
483
|
+
if (skelSpanY <= 1e-6) {
|
|
484
|
+
const distance = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
|
|
485
|
+
findAnchor: for (const index of weightedJointIndices) {
|
|
486
|
+
const candidates = [];
|
|
487
|
+
for (let parent = parentIdx[index]; parent >= 0; parent = parentIdx[parent])
|
|
488
|
+
candidates.push(parent);
|
|
489
|
+
candidates.push(...childIdxs[index]);
|
|
490
|
+
for (const anchor of candidates) {
|
|
491
|
+
const sourceSpan = distance(rawTsrc[index], rawTsrc[anchor]);
|
|
492
|
+
const canonicalWeighted = canon.worldByName.get(helixByWarriorIdx[index]);
|
|
493
|
+
const canonicalAnchor = canon.worldByName.get(helixByWarriorIdx[anchor]);
|
|
494
|
+
if (canonicalWeighted === undefined || canonicalAnchor === undefined)
|
|
495
|
+
continue;
|
|
496
|
+
const canonicalSpan = distance(posOf(canonicalWeighted), posOf(canonicalAnchor));
|
|
497
|
+
if (sourceSpan <= 1e-6 || canonicalSpan <= 1e-6)
|
|
498
|
+
continue;
|
|
499
|
+
anchoredDecade = 10 ** Math.round(Math.log10(sourceSpan / canonicalSpan));
|
|
500
|
+
break findAnchor;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const decade = meshSpanY > 1e-6 && skelSpanY > 1e-6
|
|
505
|
+
? 10 ** Math.round(Math.log10(skelSpanY / meshSpanY))
|
|
506
|
+
: anchoredDecade;
|
|
507
|
+
// A short garment can span a different Y extent than its weighted joints, even when
|
|
508
|
+
// it already shares the host's metre frame. The anchor comparison below is the
|
|
509
|
+
// stronger unit check for host-aligned rebinding; never guess a scale from the hem.
|
|
510
|
+
const unitScale = mode === 'preserve' ? 1 : 1 / decade;
|
|
511
|
+
const Tsrc = unitScale === 1 ? rawTsrc : rawTsrc.map((p) => [p[0] * unitScale, p[1] * unitScale, p[2] * unitScale]);
|
|
156
512
|
// The rig the mesh binds to. 'embed': canonical orientations at the source's joint positions
|
|
157
513
|
// (proportions preserved). 'repose': the pristine canonical rest.
|
|
158
514
|
const directPos = new Map();
|
|
159
515
|
wjoints.forEach((j, i) => { const m = boneMap.map[j.getName()]; if (m !== undefined)
|
|
160
516
|
directPos.set(m, Tsrc[i]); });
|
|
161
|
-
|
|
517
|
+
// A bone map's weight targets can intentionally fold many muscle/twist helpers onto one joint.
|
|
518
|
+
// Their skin order is not an anatomical ranking: select the declared source joint after all
|
|
519
|
+
// weight targets are resolved, including when retargetSkeleton has renamed every helper alike.
|
|
520
|
+
for (const [target, selected] of opts.anatomicalAnchorJoints ?? []) {
|
|
521
|
+
const index = idxByNode.get(selected);
|
|
522
|
+
if (index === undefined || helixByWarriorIdx[index] !== target) {
|
|
523
|
+
throw new Error(`conformToHelixRest: anatomical anchor for '${target}' is not a matching skin joint`);
|
|
524
|
+
}
|
|
525
|
+
directPos.set(target, Tsrc[index]);
|
|
526
|
+
}
|
|
527
|
+
if (opts.anatomicalAnchorJoints === undefined) {
|
|
528
|
+
for (const [target, source] of Object.entries(boneMap.anchors ?? {})) {
|
|
529
|
+
const matches = wjoints.map((joint, index) => joint.getName() === source ? index : -1).filter((index) => index >= 0);
|
|
530
|
+
if (matches.length !== 1 || helixByWarriorIdx[matches[0]] !== target) {
|
|
531
|
+
throw new Error(`conformToHelixRest: anatomical anchor '${source}' for '${target}' must resolve to one matching skin joint`);
|
|
532
|
+
}
|
|
533
|
+
directPos.set(target, Tsrc[matches[0]]);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
const fit = mode === 'embed' ? fitSkeletonToWarrior(canon, directPos) : null;
|
|
537
|
+
const rig = fit !== null ? fit.skeleton : canon;
|
|
162
538
|
const Tdst = (helix) => posOf(rig.worldByName.get(helix));
|
|
539
|
+
if (mode === 'preserve') {
|
|
540
|
+
const matched = [...directPos].filter(([name, position]) => name !== 'root' &&
|
|
541
|
+
Math.hypot(...(0, mat4_1.sub3)(position, Tdst(name))) <= 1e-4);
|
|
542
|
+
const anchors = ['pelvis', 'head', 'clavicle_l', 'clavicle_r', 'upperarm_l', 'upperarm_r', 'thigh_l', 'thigh_r'];
|
|
543
|
+
const missing = anchors.filter((name) => !matched.some(([candidate]) => candidate === name));
|
|
544
|
+
if (matched.length < 10 || matched.length < (directPos.size - Number(directPos.has('root'))) * 0.85 || missing.length > 0) {
|
|
545
|
+
throw new Error(`conformToHelixRest: host-aligned add-on does not match host rest anchors (matched ${matched.length}/${directPos.size}, missing [${missing.join(', ')}])`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
163
548
|
// 'repose' only: per-warrior-joint frame-based delta D_i = frameDst·frameSrc⁻¹ (both frames from
|
|
164
549
|
// GEOMETRY, so the bone-axis CONVENTION cancels). Unused in 'embed' (mesh is not re-posed).
|
|
165
550
|
const incomingDirSrc = (i) => (parentIdx[i] >= 0 ? (0, mat4_1.normalize3)((0, mat4_1.sub3)(Tsrc[i], Tsrc[parentIdx[i]])) : [0, 1, 0]);
|
|
166
551
|
const incomingDirDst = (i) => parentIdx[i] >= 0 ? (0, mat4_1.normalize3)((0, mat4_1.sub3)(Tdst(helixByWarriorIdx[i]), Tdst(helixByWarriorIdx[parentIdx[i]]))) : [0, 1, 0];
|
|
167
|
-
const
|
|
552
|
+
const directMappedOwner = (i) => {
|
|
553
|
+
let current = i;
|
|
554
|
+
while (boneMap.map[wjoints[current].getName()] === undefined) {
|
|
555
|
+
current = parentIdx[current];
|
|
556
|
+
if (current < 0) {
|
|
557
|
+
throw new Error(`conformToHelixRest: '${wjoints[i].getName()}' has no directly mapped repose ancestor`);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return current;
|
|
561
|
+
};
|
|
562
|
+
const correctionByOwner = new Map();
|
|
563
|
+
const correctionFor = (i) => {
|
|
564
|
+
const owner = directMappedOwner(i);
|
|
565
|
+
const cached = correctionByOwner.get(owner);
|
|
566
|
+
if (cached !== undefined)
|
|
567
|
+
return cached;
|
|
568
|
+
// A source helper/corrective with no direct map folds onto its nearest mapped ancestor. Its weights
|
|
569
|
+
// are remapped to that canonical joint below, so its vertices must inherit the same repose delta as
|
|
570
|
+
// that joint too. Building a separate target frame for the helper is invalid: both it and its parent
|
|
571
|
+
// resolve to the same canonical position, producing a zero target axis (MetaHuman hair and face rigs
|
|
572
|
+
// contain hundreds of these weighted helpers).
|
|
573
|
+
i = owner;
|
|
168
574
|
const inDir = incomingDirSrc(i);
|
|
169
575
|
let primary = -1, best = -Infinity;
|
|
170
576
|
for (const c of childIdxs[i]) {
|
|
171
577
|
if (helixByWarriorIdx[c] === helixByWarriorIdx[i])
|
|
172
578
|
continue;
|
|
579
|
+
// A collapsed target twist cannot define its parent's outgoing frame.
|
|
580
|
+
// Prefer a real segment (for example thigh -> calf) when one exists.
|
|
581
|
+
if (Math.hypot(...(0, mat4_1.sub3)(Tdst(helixByWarriorIdx[c]), Tdst(helixByWarriorIdx[i]))) <= 1e-9)
|
|
582
|
+
continue;
|
|
173
583
|
const d = (0, mat4_1.dot3)((0, mat4_1.normalize3)((0, mat4_1.sub3)(Tsrc[c], Tsrc[i])), inDir);
|
|
174
584
|
if (d > best) {
|
|
175
585
|
best = d;
|
|
@@ -178,10 +588,62 @@ function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
|
178
588
|
}
|
|
179
589
|
const axisSrc = primary >= 0 ? (0, mat4_1.normalize3)((0, mat4_1.sub3)(Tsrc[primary], Tsrc[i])) : inDir;
|
|
180
590
|
const axisDst = primary >= 0 ? (0, mat4_1.normalize3)((0, mat4_1.sub3)(Tdst(helixByWarriorIdx[primary]), Tdst(helixByWarriorIdx[i]))) : incomingDirDst(i);
|
|
181
|
-
|
|
182
|
-
|
|
591
|
+
const sourceAxisLength = Math.hypot(axisSrc[0], axisSrc[1], axisSrc[2]);
|
|
592
|
+
const targetAxisLength = Math.hypot(axisDst[0], axisDst[1], axisDst[2]);
|
|
593
|
+
// A host may place a directly mapped twist joint at exactly its parent's rest position.
|
|
594
|
+
// There is no target segment from which to build its own repose frame; the parent's
|
|
595
|
+
// correction is the only defined deformation for that collapsed span. This also handles
|
|
596
|
+
// positive weights on the twist joint, rather than relying on it being unused.
|
|
597
|
+
const parent = parentIdx[i];
|
|
598
|
+
if (targetAxisLength <= 1e-9 && parent >= 0 &&
|
|
599
|
+
helixByWarriorIdx[parent] !== helixByWarriorIdx[i] &&
|
|
600
|
+
Math.hypot(...(0, mat4_1.sub3)(Tdst(helixByWarriorIdx[i]), Tdst(helixByWarriorIdx[parent]))) <= 1e-9) {
|
|
601
|
+
const correction = correctionFor(parent);
|
|
602
|
+
correctionByOwner.set(owner, correction);
|
|
603
|
+
return correction;
|
|
604
|
+
}
|
|
605
|
+
if (sourceAxisLength <= 1e-9 || targetAxisLength <= 1e-9) {
|
|
606
|
+
throw new Error(`conformToHelixRest: degenerate repose frame for '${wjoints[i].getName()}' `
|
|
607
|
+
+ `(mapped '${helixByWarriorIdx[i]}', primary '${primary >= 0 ? wjoints[primary].getName() : "<incoming>"}', `
|
|
608
|
+
+ `source axis ${axisSrc.join(',')}, target axis ${axisDst.join(',')}, weighted ${weightedJointIndices.has(i)})`);
|
|
609
|
+
}
|
|
610
|
+
const correction = (0, mat4_1.mul4)((0, mat4_1.frameFromAxis)(axisDst, Tdst(helixByWarriorIdx[i])), (0, mat4_1.invert4)((0, mat4_1.frameFromAxis)(axisSrc, Tsrc[i])));
|
|
611
|
+
correctionByOwner.set(owner, correction);
|
|
612
|
+
return correction;
|
|
613
|
+
};
|
|
614
|
+
const D = mode === 'repose' ? wjoints.map((_, i) => correctionFor(i)) : null;
|
|
183
615
|
const canonIndexByName = new Map(canon.jointNames.map((n, i) => [n, i]));
|
|
616
|
+
// ── AUXILIARY JOINTS ──────────────────────────────────────────────────────────────────────────────────────
|
|
617
|
+
// Chosen here, before the mesh remap, because their skin indices have to exist by the time JOINTS_* is
|
|
618
|
+
// rewritten. Appended AFTER the canonical set so canonical indices are untouched and a consumer that knows
|
|
619
|
+
// nothing about auxiliary joints reads exactly the skeleton it expects.
|
|
620
|
+
const keepAux = opts.preserveAuxiliary === true && mode === 'embed';
|
|
621
|
+
const isAux = wjoints.map((j) => keepAux && boneMap.map[j.getName()] === undefined);
|
|
622
|
+
// Parent-first, so each joint's parent transform is known when it is created.
|
|
623
|
+
const auxOrder = [];
|
|
624
|
+
{
|
|
625
|
+
const pending = new Set(wjoints.map((_, i) => i).filter((i) => isAux[i]));
|
|
626
|
+
let progress = true;
|
|
627
|
+
while (pending.size > 0 && progress) {
|
|
628
|
+
progress = false;
|
|
629
|
+
for (const i of [...pending]) {
|
|
630
|
+
const p = parentIdx[i];
|
|
631
|
+
if (p >= 0 && pending.has(p))
|
|
632
|
+
continue;
|
|
633
|
+
auxOrder.push(i);
|
|
634
|
+
pending.delete(i);
|
|
635
|
+
progress = true;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
// A cycle cannot happen in a glTF node tree; if it somehow did, dropping is safer than looping forever.
|
|
639
|
+
for (const i of pending)
|
|
640
|
+
isAux[i] = false;
|
|
641
|
+
}
|
|
642
|
+
const auxSlot = new Map();
|
|
643
|
+
auxOrder.forEach((i, k) => auxSlot.set(i, canon.jointNames.length + k));
|
|
184
644
|
const newIndexForWarriorIdx = wjoints.map((_, i) => {
|
|
645
|
+
if (isAux[i])
|
|
646
|
+
return auxSlot.get(i);
|
|
185
647
|
const idx = canonIndexByName.get(helixByWarriorIdx[i]);
|
|
186
648
|
if (idx === undefined)
|
|
187
649
|
throw new Error(`conformToHelixRest: '${helixByWarriorIdx[i]}' not a canonical joint`);
|
|
@@ -189,72 +651,132 @@ function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
|
189
651
|
});
|
|
190
652
|
// Remap JOINTS_* to the canonical joint order on every primitive; in 'repose' also blend D into
|
|
191
653
|
// POSITION/NORMAL. In 'embed' the geometry is left untouched.
|
|
654
|
+
//
|
|
655
|
+
// Both passes rewrite ACCESSORS in place, and accessors are shared: a multi-material mesh from the
|
|
656
|
+
// FBX converter (Unreal garments with a stitch or trim slot) is one vertex buffer drawn by several
|
|
657
|
+
// primitives. Processing per primitive therefore rewrote a shared JOINTS_0 once per primitive, and
|
|
658
|
+
// the second pass read canonical indices back as SOURCE indices — thigh/calf correctives landed on
|
|
659
|
+
// whatever source joint sat at the thigh's canonical slot (the left hand's fingers on a MetaHuman
|
|
660
|
+
// rig). 'repose' blended the same POSITION twice with the same confusion. Every source array is
|
|
661
|
+
// therefore snapshotted before anything is written, and each accessor is written exactly once.
|
|
662
|
+
const originalJoints = new Map();
|
|
663
|
+
const skinnedPrimitives = root.listNodes()
|
|
664
|
+
.filter((node) => node.getSkin() === wskin && node.getMesh() !== null)
|
|
665
|
+
.flatMap((node) => node.getMesh().listPrimitives())
|
|
666
|
+
.filter((prim) => prim.listSemantics().some((s) => s.startsWith('JOINTS_')));
|
|
667
|
+
for (const prim of skinnedPrimitives) {
|
|
668
|
+
for (const semantic of prim.listSemantics().filter((s) => s.startsWith('JOINTS_'))) {
|
|
669
|
+
const accessor = prim.getAttribute(semantic);
|
|
670
|
+
if (!originalJoints.has(accessor))
|
|
671
|
+
originalJoints.set(accessor, new Uint32Array(accessor.getArray()));
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
const reposed = new Set();
|
|
192
675
|
let verticesProcessed = 0;
|
|
193
|
-
for (const
|
|
194
|
-
|
|
676
|
+
for (const prim of skinnedPrimitives) {
|
|
677
|
+
const setCount = prim.listSemantics().filter((s) => s.startsWith('JOINTS_')).length;
|
|
678
|
+
const pos = prim.getAttribute('POSITION');
|
|
679
|
+
const nrm = prim.getAttribute('NORMAL');
|
|
680
|
+
const vCount = pos.getCount();
|
|
681
|
+
if (reposed.has(pos))
|
|
195
682
|
continue;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const td = (0, mat4_1.transformDir)(d, n);
|
|
224
|
-
nx += w * td[0];
|
|
225
|
-
ny += w * td[1];
|
|
226
|
-
nz += w * td[2];
|
|
227
|
-
}
|
|
228
|
-
wsum += w;
|
|
229
|
-
}
|
|
230
|
-
if (wsum > 0) {
|
|
231
|
-
px /= wsum;
|
|
232
|
-
py /= wsum;
|
|
233
|
-
pz /= wsum;
|
|
234
|
-
}
|
|
235
|
-
posArr[v * 3] = px;
|
|
236
|
-
posArr[v * 3 + 1] = py;
|
|
237
|
-
posArr[v * 3 + 2] = pz;
|
|
238
|
-
if (nrmArr !== null) {
|
|
239
|
-
const l = Math.hypot(nx, ny, nz) || 1;
|
|
240
|
-
nrmArr[v * 3] = nx / l;
|
|
241
|
-
nrmArr[v * 3 + 1] = ny / l;
|
|
242
|
-
nrmArr[v * 3 + 2] = nz / l;
|
|
683
|
+
reposed.add(pos);
|
|
684
|
+
verticesProcessed += vCount;
|
|
685
|
+
if (D === null)
|
|
686
|
+
continue;
|
|
687
|
+
const jointSets = Array.from({ length: setCount }, (_, s) => originalJoints.get(prim.getAttribute(`JOINTS_${s}`)));
|
|
688
|
+
const weightSets = Array.from({ length: setCount }, (_, s) => prim.getAttribute(`WEIGHTS_${s}`).getArray());
|
|
689
|
+
const posArr = Float32Array.from(pos.getArray());
|
|
690
|
+
const nrmArr = nrm !== null && !reposed.has(nrm) ? Float32Array.from(nrm.getArray()) : null;
|
|
691
|
+
for (let v = 0; v < vCount; v++) {
|
|
692
|
+
const p = [posArr[v * 3], posArr[v * 3 + 1], posArr[v * 3 + 2]];
|
|
693
|
+
const n = nrmArr !== null ? [nrmArr[v * 3], nrmArr[v * 3 + 1], nrmArr[v * 3 + 2]] : null;
|
|
694
|
+
let px = 0, py = 0, pz = 0, nx = 0, ny = 0, nz = 0, wsum = 0;
|
|
695
|
+
for (let s = 0; s < setCount; s++)
|
|
696
|
+
for (let c = 0; c < 4; c++) {
|
|
697
|
+
const w = weightSets[s][v * 4 + c];
|
|
698
|
+
if (w === 0)
|
|
699
|
+
continue;
|
|
700
|
+
const d = D[jointSets[s][v * 4 + c]];
|
|
701
|
+
const tp = (0, mat4_1.transformPoint)(d, p);
|
|
702
|
+
px += w * tp[0];
|
|
703
|
+
py += w * tp[1];
|
|
704
|
+
pz += w * tp[2];
|
|
705
|
+
if (n !== null) {
|
|
706
|
+
const td = (0, mat4_1.transformDir)(d, n);
|
|
707
|
+
nx += w * td[0];
|
|
708
|
+
ny += w * td[1];
|
|
709
|
+
nz += w * td[2];
|
|
243
710
|
}
|
|
711
|
+
wsum += w;
|
|
244
712
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
713
|
+
if (wsum > 0) {
|
|
714
|
+
px /= wsum;
|
|
715
|
+
py /= wsum;
|
|
716
|
+
pz /= wsum;
|
|
248
717
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
718
|
+
posArr[v * 3] = px;
|
|
719
|
+
posArr[v * 3 + 1] = py;
|
|
720
|
+
posArr[v * 3 + 2] = pz;
|
|
721
|
+
if (nrmArr !== null) {
|
|
722
|
+
const l = Math.hypot(nx, ny, nz) || 1;
|
|
723
|
+
nrmArr[v * 3] = nx / l;
|
|
724
|
+
nrmArr[v * 3 + 1] = ny / l;
|
|
725
|
+
nrmArr[v * 3 + 2] = nz / l;
|
|
255
726
|
}
|
|
256
|
-
verticesProcessed += vCount;
|
|
257
727
|
}
|
|
728
|
+
pos.setArray(posArr);
|
|
729
|
+
if (nrm !== null && nrmArr !== null) {
|
|
730
|
+
nrm.setArray(nrmArr);
|
|
731
|
+
reposed.add(nrm);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
// Folding sends several source joints (a thigh and its twist/bulge correctives) to ONE canonical joint,
|
|
735
|
+
// so a vertex can name the same canonical joint in more than one slot. That is equivalent under LBS but
|
|
736
|
+
// wastes influences and hides the owning bone from anything that reads the dominant slot, so the folded
|
|
737
|
+
// influences are summed per canonical joint and written heaviest first (each accessor set exactly once).
|
|
738
|
+
const written = new Set();
|
|
739
|
+
for (const prim of skinnedPrimitives) {
|
|
740
|
+
const setCount = prim.listSemantics().filter((s) => s.startsWith('JOINTS_')).length;
|
|
741
|
+
const jointAccessors = Array.from({ length: setCount }, (_, s) => prim.getAttribute(`JOINTS_${s}`));
|
|
742
|
+
if (jointAccessors.every((a) => written.has(a)))
|
|
743
|
+
continue;
|
|
744
|
+
const weightAccessors = Array.from({ length: setCount }, (_, s) => prim.getAttribute(`WEIGHTS_${s}`));
|
|
745
|
+
const sources = jointAccessors.map((a) => originalJoints.get(a));
|
|
746
|
+
const outJoints = sources.map((source) => new Uint16Array(source.length));
|
|
747
|
+
const mergeable = jointAccessors.every((a) => !written.has(a))
|
|
748
|
+
&& weightAccessors.every((a) => a !== null && !written.has(a) && a.getCount() * 4 === sources[0].length);
|
|
749
|
+
if (!mergeable) {
|
|
750
|
+
// Inconsistent sharing (never emitted by our converters): plain index remap, weights untouched.
|
|
751
|
+
sources.forEach((source, s) => { for (let k = 0; k < source.length; k++)
|
|
752
|
+
outJoints[s][k] = newIndexForWarriorIdx[source[k]]; });
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
const weights = weightAccessors.map((a) => a.getArray());
|
|
756
|
+
const outWeights = weights.map((w) => new w.constructor(w.length));
|
|
757
|
+
const vertexCount = sources[0].length / 4;
|
|
758
|
+
const merged = new Map();
|
|
759
|
+
for (let v = 0; v < vertexCount; v++) {
|
|
760
|
+
merged.clear();
|
|
761
|
+
for (let s = 0; s < setCount; s++)
|
|
762
|
+
for (let c = 0; c < 4; c++) {
|
|
763
|
+
const w = weights[s][v * 4 + c];
|
|
764
|
+
if (w <= 0)
|
|
765
|
+
continue;
|
|
766
|
+
const joint = newIndexForWarriorIdx[sources[s][v * 4 + c]];
|
|
767
|
+
merged.set(joint, (merged.get(joint) ?? 0) + w);
|
|
768
|
+
}
|
|
769
|
+
[...merged].sort((a, b) => b[1] - a[1] || a[0] - b[0]).forEach(([joint, w], slot) => {
|
|
770
|
+
outJoints[slot >> 2][v * 4 + (slot & 3)] = joint;
|
|
771
|
+
outWeights[slot >> 2][v * 4 + (slot & 3)] = w;
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
weightAccessors.forEach((a, s) => { a.setArray(outWeights[s]); written.add(a); });
|
|
775
|
+
}
|
|
776
|
+
jointAccessors.forEach((a, s) => { if (!written.has(a)) {
|
|
777
|
+
a.setArray(outJoints[s]);
|
|
778
|
+
written.add(a);
|
|
779
|
+
} });
|
|
258
780
|
}
|
|
259
781
|
// Rebuild the target skeleton (`rig`) in the warrior doc.
|
|
260
782
|
const buffer = root.listBuffers()[0];
|
|
@@ -265,13 +787,59 @@ function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
|
265
787
|
if (def.parent !== null)
|
|
266
788
|
created.get(def.parent).addChild(created.get(def.name));
|
|
267
789
|
const skeletonRoot = created.get(rig.skeletonRootName);
|
|
268
|
-
root
|
|
269
|
-
|
|
270
|
-
|
|
790
|
+
// The hip-height delta cannot live on the root bone itself: every platform clip carries a constant
|
|
791
|
+
// root translation track pinned to the origin, so the mixer would null it each frame. Hoist it onto
|
|
792
|
+
// a wrapper above the root — nothing animates that node (PropertyBinding resolves tracks by bone
|
|
793
|
+
// name), so the delta survives while the clip harmlessly re-pins the root's now-zero local.
|
|
794
|
+
const rootLocal = skeletonRoot.getTranslation();
|
|
795
|
+
// The HOST's own `root_offset` (extractCanonicalSkeleton `hoistRootOffset`): applied here, at the very end,
|
|
796
|
+
// so the repose maths above ran in the offset-free source frame and the mesh stays where the garment was
|
|
797
|
+
// authored — in the host's mesh frame. Only the SKELETON the part carries moves: the part rides the host's
|
|
798
|
+
// bones with its OWN inverse-bind matrices (attachSkinnedPart), so for the part to land where it was
|
|
799
|
+
// authored its skeleton must be the host's skeleton in the host's frame — wrapper included. Auxiliary
|
|
800
|
+
// joints (character imports only) sit in the source frame already; leave those alone.
|
|
801
|
+
const hostOffset = canon.rootOffset !== undefined && auxOrder.length === 0 ? canon.rootOffset : null;
|
|
802
|
+
if (Math.hypot(rootLocal[0], rootLocal[1], rootLocal[2]) > 1e-9 || hostOffset !== null) {
|
|
803
|
+
const wrapperMatrix = (0, mat4_1.mul4)(hostOffset ?? IDENTITY, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, rootLocal[0], rootLocal[1], rootLocal[2], 1]);
|
|
804
|
+
const wrapper = warrior.createNode('root_offset').setMatrix(wrapperMatrix);
|
|
805
|
+
skeletonRoot.setTranslation([0, 0, 0]);
|
|
806
|
+
wrapper.addChild(skeletonRoot);
|
|
807
|
+
root.listScenes()[0].addChild(wrapper);
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
root.listScenes()[0].addChild(skeletonRoot);
|
|
811
|
+
}
|
|
812
|
+
// Auxiliary joints keep their SOURCE world rest transform (unit-scaled). In 'embed' the mesh was never
|
|
813
|
+
// moved, so that transform is still exactly the one the skin weights were authored against.
|
|
814
|
+
const auxWorld = new Map();
|
|
815
|
+
const auxNode = new Map();
|
|
816
|
+
for (const i of auxOrder) {
|
|
817
|
+
const raw = [...wjoints[i].getWorldMatrix()];
|
|
818
|
+
raw[12] = raw[12] * unitScale;
|
|
819
|
+
raw[13] = raw[13] * unitScale;
|
|
820
|
+
raw[14] = raw[14] * unitScale;
|
|
821
|
+
const world = (0, mat4_1.rigidize)(raw);
|
|
822
|
+
const p = parentIdx[i];
|
|
823
|
+
const parentWorld = p < 0 ? IDENTITY
|
|
824
|
+
: isAux[p] ? auxWorld.get(p)
|
|
825
|
+
: rig.worldByName.get(helixByWarriorIdx[p]);
|
|
826
|
+
const parentTarget = p < 0 ? skeletonRoot
|
|
827
|
+
: isAux[p] ? auxNode.get(p)
|
|
828
|
+
: created.get(helixByWarriorIdx[p]);
|
|
829
|
+
const node = warrior.createNode(wjoints[i].getName()).setMatrix((0, mat4_1.mul4)((0, mat4_1.invert4)(parentWorld), world));
|
|
830
|
+
parentTarget.addChild(node);
|
|
831
|
+
auxWorld.set(i, world);
|
|
832
|
+
auxNode.set(i, node);
|
|
833
|
+
}
|
|
834
|
+
const newIbm = new Float32Array((rig.jointNames.length + auxOrder.length) * 16);
|
|
835
|
+
rig.jointNames.forEach((name, i) => newIbm.set((0, mat4_1.invert4)(hostOffset === null ? rig.worldByName.get(name) : (0, mat4_1.mul4)(hostOffset, rig.worldByName.get(name))), i * 16));
|
|
836
|
+
auxOrder.forEach((i, k) => newIbm.set((0, mat4_1.invert4)(auxWorld.get(i)), (rig.jointNames.length + k) * 16));
|
|
271
837
|
const newIbmAcc = warrior.createAccessor().setType('MAT4').setArray(newIbm).setBuffer(buffer);
|
|
272
838
|
const newSkin = warrior.createSkin('helix-humanoid').setInverseBindMatrices(newIbmAcc).setSkeleton(skeletonRoot);
|
|
273
839
|
for (const name of rig.jointNames)
|
|
274
840
|
newSkin.addJoint(created.get(name));
|
|
841
|
+
for (const i of auxOrder)
|
|
842
|
+
newSkin.addJoint(auxNode.get(i));
|
|
275
843
|
// Rebind the mesh nodes, reparent to the scene at identity, and delete the old rig + its bind-pose anim.
|
|
276
844
|
const scene = root.listScenes()[0];
|
|
277
845
|
for (const node of root.listNodes()) {
|
|
@@ -287,6 +855,11 @@ function conformToHelixRest(warrior, canon, boneMap, opts = {}) {
|
|
|
287
855
|
const topOld = (() => { let cur = wjoints[0]; for (let p = parentNode(cur); p !== null; p = parentNode(cur))
|
|
288
856
|
cur = p; return cur; })();
|
|
289
857
|
topOld.dispose();
|
|
290
|
-
return {
|
|
858
|
+
return {
|
|
859
|
+
mode, unitScale, restAimed: fit?.restAimed ?? 0, verticesProcessed,
|
|
860
|
+
jointsRebuilt: rig.jointNames.length + auxOrder.length,
|
|
861
|
+
weightTargets,
|
|
862
|
+
auxiliaryJoints: auxOrder.map((i) => wjoints[i].getName()),
|
|
863
|
+
};
|
|
291
864
|
}
|
|
292
865
|
//# sourceMappingURL=conform.js.map
|