@hypersoniclabs/helix-cli 0.1.7 → 0.1.24-helix3.438

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1715) hide show
  1. package/README.md +631 -8
  2. package/assets/bridge/metahuman-eye-baked.png +0 -0
  3. package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
  4. package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
  5. package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
  6. package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
  7. package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
  8. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
  9. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
  10. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
  11. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
  12. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
  13. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
  14. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
  15. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
  16. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
  17. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
  18. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
  19. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
  20. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
  21. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
  22. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
  23. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
  24. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
  25. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
  26. package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
  27. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
  28. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
  29. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
  30. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
  31. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
  32. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
  33. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
  34. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
  35. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
  36. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
  37. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
  38. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
  39. package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
  40. package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
  41. package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
  42. package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
  43. package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
  44. package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
  45. package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
  46. package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
  47. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
  48. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
  49. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
  50. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
  51. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
  52. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
  53. package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
  54. package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
  55. package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
  56. package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
  57. package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
  58. package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
  59. package/bridge-recipes/sims4/README.md +43 -0
  60. package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
  61. package/bridge-recipes/unreal/character-customizer/README.md +58 -0
  62. package/bridge-recipes/unreal/character-customizer/all.json +13 -0
  63. package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
  64. package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
  65. package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
  66. package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
  67. package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
  68. package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
  69. package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
  70. package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
  71. package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
  72. package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
  73. package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
  74. package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
  75. package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
  76. package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
  77. package/bridge-recipes/unreal/character-customizer/top.json +6 -0
  78. package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
  79. package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
  80. package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
  81. package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
  82. package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
  83. package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
  84. package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
  85. package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
  86. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
  87. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
  88. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
  89. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
  90. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
  91. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
  92. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
  93. package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
  94. package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
  95. package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
  96. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
  97. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
  98. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
  99. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
  100. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
  101. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
  102. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
  103. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
  104. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
  105. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
  106. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
  107. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
  108. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
  109. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
  110. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
  111. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
  112. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
  113. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
  114. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
  115. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
  116. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
  117. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
  118. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
  119. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
  120. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
  121. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
  122. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
  123. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
  124. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
  125. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
  126. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
  127. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
  128. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
  129. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
  130. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
  131. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
  132. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
  133. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
  134. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
  135. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
  136. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
  137. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
  138. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
  139. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
  140. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
  141. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
  142. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
  143. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
  144. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
  145. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
  146. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
  147. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
  148. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
  149. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
  150. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
  151. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
  152. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
  153. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
  154. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
  155. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
  156. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
  157. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
  158. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
  159. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
  160. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
  161. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
  162. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
  163. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
  164. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
  165. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
  166. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
  167. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
  168. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
  169. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
  170. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
  171. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
  172. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
  173. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
  174. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
  175. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
  176. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
  177. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
  178. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
  179. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
  180. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
  181. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
  182. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
  183. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
  184. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
  185. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
  186. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
  187. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
  188. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
  189. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
  190. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
  191. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
  192. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
  193. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
  194. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
  195. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
  196. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
  197. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
  198. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
  199. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
  200. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
  201. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
  202. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
  203. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
  204. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
  205. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
  206. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
  207. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
  208. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
  209. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
  210. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
  211. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
  212. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
  213. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
  214. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
  215. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
  216. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
  217. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
  218. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
  219. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
  220. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
  221. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
  222. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
  223. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
  224. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
  225. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
  226. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
  227. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
  228. package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
  229. package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
  230. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
  231. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
  232. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
  233. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
  234. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
  235. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
  236. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
  237. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
  238. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
  239. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
  240. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
  241. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
  242. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
  243. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
  244. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
  245. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
  246. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
  247. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
  248. package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
  249. package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
  250. package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
  251. package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
  252. package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
  253. package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
  254. package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
  255. package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
  256. package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
  257. package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
  258. package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
  259. package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
  260. package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
  261. package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
  262. package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
  263. package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
  264. package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
  265. package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
  266. package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
  267. package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
  268. package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
  269. package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
  270. package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
  271. package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
  272. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
  273. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
  274. package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
  275. package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
  276. package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
  277. package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
  278. package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
  279. package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
  280. package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
  281. package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
  282. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
  283. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
  284. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
  285. package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
  286. package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
  287. package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
  288. package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
  289. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
  290. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
  291. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
  292. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
  293. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
  294. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
  295. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
  296. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
  297. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
  298. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
  299. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
  300. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
  301. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
  302. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
  303. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
  304. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
  305. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
  306. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
  307. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
  308. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
  309. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
  310. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
  311. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
  312. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
  313. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
  314. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
  315. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
  316. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
  317. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
  318. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
  319. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
  320. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
  321. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
  322. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
  323. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
  324. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
  325. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
  326. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
  327. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
  328. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
  329. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
  330. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
  331. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
  332. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
  333. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
  334. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
  335. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
  336. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
  337. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
  338. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
  339. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
  340. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
  341. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
  342. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
  343. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
  344. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
  345. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
  346. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
  347. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
  348. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
  349. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
  350. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
  351. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
  352. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
  353. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
  354. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
  355. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
  356. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
  357. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
  358. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
  359. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
  360. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
  361. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
  362. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
  363. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
  364. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
  365. package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
  366. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
  367. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
  368. package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
  369. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
  370. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
  371. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
  372. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
  373. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
  374. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
  375. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
  376. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
  377. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
  378. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
  379. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
  380. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
  381. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
  382. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
  383. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
  384. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
  385. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
  386. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
  387. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
  388. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
  389. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
  390. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
  391. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
  392. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
  393. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
  394. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
  395. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
  396. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
  397. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
  398. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
  399. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
  400. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
  401. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
  402. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
  403. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
  404. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
  405. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
  406. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
  407. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
  408. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
  409. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
  410. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
  411. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
  412. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
  413. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
  414. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
  415. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
  416. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
  417. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
  418. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
  419. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
  420. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
  421. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
  422. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
  423. package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
  424. package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
  425. package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
  426. package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
  427. package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
  428. package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
  429. package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
  430. package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
  431. package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
  432. package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
  433. package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
  434. package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
  435. package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
  436. package/dist/ability.d.ts +2 -2
  437. package/dist/ability.js +6 -5
  438. package/dist/ability.js.map +1 -1
  439. package/dist/achievement.d.ts +123 -0
  440. package/dist/achievement.js +400 -0
  441. package/dist/achievement.js.map +1 -0
  442. package/dist/api.d.ts +19 -1
  443. package/dist/api.js +80 -6
  444. package/dist/api.js.map +1 -1
  445. package/dist/assets.d.ts +595 -0
  446. package/dist/assets.js +1121 -0
  447. package/dist/assets.js.map +1 -0
  448. package/dist/audioCommand.d.ts +65 -0
  449. package/dist/audioCommand.js +181 -0
  450. package/dist/audioCommand.js.map +1 -0
  451. package/dist/bakeBodyRegionsCli.d.ts +19 -0
  452. package/dist/bakeBodyRegionsCli.js +25 -0
  453. package/dist/bakeBodyRegionsCli.js.map +1 -0
  454. package/dist/bakeLighting.d.ts +173 -0
  455. package/dist/bakeLighting.js +452 -0
  456. package/dist/bakeLighting.js.map +1 -0
  457. package/dist/bridge/bridge.testutil.d.ts +105 -0
  458. package/dist/bridge/bridge.testutil.js +259 -0
  459. package/dist/bridge/bridge.testutil.js.map +1 -0
  460. package/dist/bridge/characterAddon.d.ts +47 -0
  461. package/dist/bridge/characterAddon.js +146 -0
  462. package/dist/bridge/characterAddon.js.map +1 -0
  463. package/dist/bridge/detect.d.ts +4 -0
  464. package/dist/bridge/detect.js +154 -0
  465. package/dist/bridge/detect.js.map +1 -0
  466. package/dist/bridge/execute.d.ts +3 -0
  467. package/dist/bridge/execute.js +206 -0
  468. package/dist/bridge/execute.js.map +1 -0
  469. package/dist/bridge/glb.d.ts +60 -0
  470. package/dist/bridge/glb.js +81 -0
  471. package/dist/bridge/glb.js.map +1 -0
  472. package/dist/bridge/hash.d.ts +6 -0
  473. package/dist/bridge/hash.js +40 -0
  474. package/dist/bridge/hash.js.map +1 -0
  475. package/dist/bridge/index.d.ts +11 -0
  476. package/dist/bridge/index.js +28 -0
  477. package/dist/bridge/index.js.map +1 -0
  478. package/dist/bridge/internal/artifacts.d.ts +5 -0
  479. package/dist/bridge/internal/artifacts.js +31 -0
  480. package/dist/bridge/internal/artifacts.js.map +1 -0
  481. package/dist/bridge/internal/builtInExecution.d.ts +4 -0
  482. package/dist/bridge/internal/builtInExecution.js +514 -0
  483. package/dist/bridge/internal/builtInExecution.js.map +1 -0
  484. package/dist/bridge/internal/externalExecution.d.ts +12 -0
  485. package/dist/bridge/internal/externalExecution.js +261 -0
  486. package/dist/bridge/internal/externalExecution.js.map +1 -0
  487. package/dist/bridge/internal/outputReservation.d.ts +13 -0
  488. package/dist/bridge/internal/outputReservation.js +151 -0
  489. package/dist/bridge/internal/outputReservation.js.map +1 -0
  490. package/dist/bridge/internal/snapshots.d.ts +32 -0
  491. package/dist/bridge/internal/snapshots.js +562 -0
  492. package/dist/bridge/internal/snapshots.js.map +1 -0
  493. package/dist/bridge/management.d.ts +40 -0
  494. package/dist/bridge/management.js +333 -0
  495. package/dist/bridge/management.js.map +1 -0
  496. package/dist/bridge/manifest.d.ts +8 -0
  497. package/dist/bridge/manifest.js +192 -0
  498. package/dist/bridge/manifest.js.map +1 -0
  499. package/dist/bridge/metahuman.d.ts +26 -0
  500. package/dist/bridge/metahuman.js +332 -0
  501. package/dist/bridge/metahuman.js.map +1 -0
  502. package/dist/bridge/planner.d.ts +9 -0
  503. package/dist/bridge/planner.js +246 -0
  504. package/dist/bridge/planner.js.map +1 -0
  505. package/dist/bridge/plugins.d.ts +17 -0
  506. package/dist/bridge/plugins.js +307 -0
  507. package/dist/bridge/plugins.js.map +1 -0
  508. package/dist/bridge/resolution.d.ts +8 -0
  509. package/dist/bridge/resolution.js +55 -0
  510. package/dist/bridge/resolution.js.map +1 -0
  511. package/dist/bridge/types.d.ts +247 -0
  512. package/dist/bridge/types.js +60 -0
  513. package/dist/bridge/types.js.map +1 -0
  514. package/dist/bridge/validate.d.ts +12 -0
  515. package/dist/bridge/validate.js +370 -0
  516. package/dist/bridge/validate.js.map +1 -0
  517. package/dist/bridge/zipSource.d.ts +27 -0
  518. package/dist/bridge/zipSource.js +90 -0
  519. package/dist/bridge/zipSource.js.map +1 -0
  520. package/dist/browser/hostSlots.d.ts +57 -0
  521. package/dist/browser/hostSlots.js +371 -0
  522. package/dist/browser/hostSlots.js.map +1 -0
  523. package/dist/browser/launch.d.ts +25 -0
  524. package/dist/browser/launch.js +74 -0
  525. package/dist/browser/launch.js.map +1 -0
  526. package/dist/browser/nonSystemChrome.d.ts +15 -0
  527. package/dist/browser/nonSystemChrome.js +91 -0
  528. package/dist/browser/nonSystemChrome.js.map +1 -0
  529. package/dist/builds/index.d.ts +54 -0
  530. package/dist/builds/index.js +215 -0
  531. package/dist/builds/index.js.map +1 -0
  532. package/dist/bundle.d.ts +35 -2
  533. package/dist/bundle.js +437 -20
  534. package/dist/bundle.js.map +1 -1
  535. package/dist/canary/cli.d.ts +17 -0
  536. package/dist/canary/cli.js +95 -0
  537. package/dist/canary/cli.js.map +1 -0
  538. package/dist/canary/index.d.ts +4 -0
  539. package/dist/canary/index.js +21 -0
  540. package/dist/canary/index.js.map +1 -0
  541. package/dist/canary/inventory.d.ts +46 -0
  542. package/dist/canary/inventory.js +499 -0
  543. package/dist/canary/inventory.js.map +1 -0
  544. package/dist/canary/pacifica.d.ts +51 -0
  545. package/dist/canary/pacifica.js +247 -0
  546. package/dist/canary/pacifica.js.map +1 -0
  547. package/dist/canary/plan.d.ts +115 -0
  548. package/dist/canary/plan.js +479 -0
  549. package/dist/canary/plan.js.map +1 -0
  550. package/dist/character/addonPushOut.d.ts +66 -0
  551. package/dist/character/addonPushOut.js +211 -0
  552. package/dist/character/addonPushOut.js.map +1 -0
  553. package/dist/character/avatarPreflight.d.ts +92 -0
  554. package/dist/character/avatarPreflight.js +261 -0
  555. package/dist/character/avatarPreflight.js.map +1 -0
  556. package/dist/character/bakeBodyRegions.d.ts +80 -0
  557. package/dist/character/bakeBodyRegions.js +190 -0
  558. package/dist/character/bakeBodyRegions.js.map +1 -0
  559. package/dist/character/baseColorGuard.d.ts +62 -0
  560. package/dist/character/baseColorGuard.js +141 -0
  561. package/dist/character/baseColorGuard.js.map +1 -0
  562. package/dist/character/bodyGeometryGuard.d.ts +243 -0
  563. package/dist/character/bodyGeometryGuard.js +417 -0
  564. package/dist/character/bodyGeometryGuard.js.map +1 -0
  565. package/dist/character/bodyRegionHide.d.ts +57 -0
  566. package/dist/character/bodyRegionHide.js +97 -0
  567. package/dist/character/bodyRegionHide.js.map +1 -0
  568. package/dist/character/composeBaseMale.d.ts +25 -0
  569. package/dist/character/composeBaseMale.js +712 -0
  570. package/dist/character/composeBaseMale.js.map +1 -0
  571. package/dist/character/esm.js +3 -1
  572. package/dist/character/esm.js.map +1 -1
  573. package/dist/character/faceManifest.d.ts +53 -0
  574. package/dist/character/faceManifest.js +256 -0
  575. package/dist/character/faceManifest.js.map +1 -0
  576. package/dist/character/fbx.d.ts +70 -0
  577. package/dist/character/fbx.js +396 -0
  578. package/dist/character/fbx.js.map +1 -0
  579. package/dist/character/fitGarmentFile.d.ts +39 -0
  580. package/dist/character/fitGarmentFile.js +53 -0
  581. package/dist/character/fitGarmentFile.js.map +1 -0
  582. package/dist/character/helixPalette.d.ts +68 -0
  583. package/dist/character/helixPalette.js +183 -0
  584. package/dist/character/helixPalette.js.map +1 -0
  585. package/dist/character/hideCoverage.d.ts +135 -0
  586. package/dist/character/hideCoverage.js +450 -0
  587. package/dist/character/hideCoverage.js.map +1 -0
  588. package/dist/character/imageLimits.d.ts +3 -0
  589. package/dist/character/imageLimits.js +7 -0
  590. package/dist/character/imageLimits.js.map +1 -0
  591. package/dist/character/importCharacter.d.ts +188 -10
  592. package/dist/character/importCharacter.js +854 -76
  593. package/dist/character/importCharacter.js.map +1 -1
  594. package/dist/character/importTrust.d.ts +11 -0
  595. package/dist/character/importTrust.js +56 -0
  596. package/dist/character/importTrust.js.map +1 -0
  597. package/dist/character/ktx2Decode.d.ts +11 -0
  598. package/dist/character/ktx2Decode.js +87 -0
  599. package/dist/character/ktx2Decode.js.map +1 -0
  600. package/dist/character/mat4.d.ts +7 -0
  601. package/dist/character/mat4.js +25 -2
  602. package/dist/character/mat4.js.map +1 -1
  603. package/dist/character/meshyToHelixMap.d.ts +14 -0
  604. package/dist/character/meshyToHelixMap.js +155 -3
  605. package/dist/character/meshyToHelixMap.js.map +1 -1
  606. package/dist/character/metahumanToHelixMap.d.ts +2 -0
  607. package/dist/character/metahumanToHelixMap.js +34 -0
  608. package/dist/character/metahumanToHelixMap.js.map +1 -0
  609. package/dist/character/normalMapGuard.d.ts +59 -0
  610. package/dist/character/normalMapGuard.js +139 -0
  611. package/dist/character/normalMapGuard.js.map +1 -0
  612. package/dist/character/quat.js +2 -2
  613. package/dist/character/quat.js.map +1 -1
  614. package/dist/character/reframeSkeletonFile.d.ts +19 -0
  615. package/dist/character/reframeSkeletonFile.js +45 -0
  616. package/dist/character/reframeSkeletonFile.js.map +1 -0
  617. package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
  618. package/dist/character/repairLodSkeletonsFile.js +49 -0
  619. package/dist/character/repairLodSkeletonsFile.js.map +1 -0
  620. package/dist/character/restFrameGuard.d.ts +52 -0
  621. package/dist/character/restFrameGuard.js +90 -0
  622. package/dist/character/restFrameGuard.js.map +1 -0
  623. package/dist/character/slotBudgets.d.ts +37 -0
  624. package/dist/character/slotBudgets.generated.d.ts +15 -0
  625. package/dist/character/slotBudgets.generated.js +110 -0
  626. package/dist/character/slotBudgets.generated.js.map +1 -0
  627. package/dist/character/slotBudgets.js +45 -0
  628. package/dist/character/slotBudgets.js.map +1 -0
  629. package/dist/character/stages/atlasMaterials.d.ts +53 -0
  630. package/dist/character/stages/atlasMaterials.js +246 -0
  631. package/dist/character/stages/atlasMaterials.js.map +1 -0
  632. package/dist/character/stages/bakeTexture.d.ts +28 -7
  633. package/dist/character/stages/bakeTexture.js +586 -108
  634. package/dist/character/stages/bakeTexture.js.map +1 -1
  635. package/dist/character/stages/conform.d.ts +54 -9
  636. package/dist/character/stages/conform.js +686 -113
  637. package/dist/character/stages/conform.js.map +1 -1
  638. package/dist/character/stages/earClearance.d.ts +105 -0
  639. package/dist/character/stages/earClearance.js +480 -0
  640. package/dist/character/stages/earClearance.js.map +1 -0
  641. package/dist/character/stages/faceRegion.d.ts +55 -0
  642. package/dist/character/stages/faceRegion.js +183 -0
  643. package/dist/character/stages/faceRegion.js.map +1 -0
  644. package/dist/character/stages/firstPersonHide.d.ts +42 -0
  645. package/dist/character/stages/firstPersonHide.js +140 -0
  646. package/dist/character/stages/firstPersonHide.js.map +1 -0
  647. package/dist/character/stages/joinPerMesh.d.ts +18 -0
  648. package/dist/character/stages/joinPerMesh.js +46 -0
  649. package/dist/character/stages/joinPerMesh.js.map +1 -0
  650. package/dist/character/stages/ktx2.d.ts +6 -4
  651. package/dist/character/stages/ktx2.js +81 -29
  652. package/dist/character/stages/ktx2.js.map +1 -1
  653. package/dist/character/stages/limbBridge.d.ts +114 -0
  654. package/dist/character/stages/limbBridge.js +1286 -0
  655. package/dist/character/stages/limbBridge.js.map +1 -0
  656. package/dist/character/stages/mergeLods.d.ts +19 -0
  657. package/dist/character/stages/mergeLods.js +58 -2
  658. package/dist/character/stages/mergeLods.js.map +1 -1
  659. package/dist/character/stages/poseAwareFit.d.ts +192 -0
  660. package/dist/character/stages/poseAwareFit.js +417 -0
  661. package/dist/character/stages/poseAwareFit.js.map +1 -0
  662. package/dist/character/stages/poseFit/math.d.ts +141 -0
  663. package/dist/character/stages/poseFit/math.js +514 -0
  664. package/dist/character/stages/poseFit/math.js.map +1 -0
  665. package/dist/character/stages/poseFit/measure.d.ts +88 -0
  666. package/dist/character/stages/poseFit/measure.js +148 -0
  667. package/dist/character/stages/poseFit/measure.js.map +1 -0
  668. package/dist/character/stages/poseFit/model.d.ts +46 -0
  669. package/dist/character/stages/poseFit/model.js +147 -0
  670. package/dist/character/stages/poseFit/model.js.map +1 -0
  671. package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
  672. package/dist/character/stages/poseFit/offsetField.js +249 -0
  673. package/dist/character/stages/poseFit/offsetField.js.map +1 -0
  674. package/dist/character/stages/poseFit/posing.d.ts +52 -0
  675. package/dist/character/stages/poseFit/posing.js +330 -0
  676. package/dist/character/stages/poseFit/posing.js.map +1 -0
  677. package/dist/character/stages/poseFit/testRig.d.ts +31 -0
  678. package/dist/character/stages/poseFit/testRig.js +85 -0
  679. package/dist/character/stages/poseFit/testRig.js.map +1 -0
  680. package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
  681. package/dist/character/stages/reframeSkeletonToHost.js +111 -0
  682. package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
  683. package/dist/character/stages/report.js +0 -2
  684. package/dist/character/stages/report.js.map +1 -1
  685. package/dist/character/stages/resizeTextures.js +4 -4
  686. package/dist/character/stages/resizeTextures.js.map +1 -1
  687. package/dist/character/stages/retarget.d.ts +26 -2
  688. package/dist/character/stages/retarget.js +52 -4
  689. package/dist/character/stages/retarget.js.map +1 -1
  690. package/dist/character/stages/retargetClip.d.ts +6 -2
  691. package/dist/character/stages/retargetClip.js +109 -17
  692. package/dist/character/stages/retargetClip.js.map +1 -1
  693. package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
  694. package/dist/character/stages/sanitizeMaterials.js +136 -0
  695. package/dist/character/stages/sanitizeMaterials.js.map +1 -0
  696. package/dist/character/stages/simplifyMesh.js +6 -3
  697. package/dist/character/stages/simplifyMesh.js.map +1 -1
  698. package/dist/character/stages/splitFacePrimitive.js +0 -2
  699. package/dist/character/stages/splitFacePrimitive.js.map +1 -1
  700. package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
  701. package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
  702. package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
  703. package/dist/character/stages/unifyMaterial.d.ts +66 -0
  704. package/dist/character/stages/unifyMaterial.js +136 -0
  705. package/dist/character/stages/unifyMaterial.js.map +1 -0
  706. package/dist/character/stages/vrmDynamics.d.ts +144 -0
  707. package/dist/character/stages/vrmDynamics.js +421 -0
  708. package/dist/character/stages/vrmDynamics.js.map +1 -0
  709. package/dist/character/stages/vrmFace.d.ts +82 -0
  710. package/dist/character/stages/vrmFace.js +280 -0
  711. package/dist/character/stages/vrmFace.js.map +1 -0
  712. package/dist/character/stages/weldedSimplify.d.ts +15 -1
  713. package/dist/character/stages/weldedSimplify.js +90 -9
  714. package/dist/character/stages/weldedSimplify.js.map +1 -1
  715. package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
  716. package/dist/character/testutil/meshyBridgeFixture.js +219 -0
  717. package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
  718. package/dist/character/testutil/meshyHead.d.ts +19 -0
  719. package/dist/character/testutil/meshyHead.js +99 -0
  720. package/dist/character/testutil/meshyHead.js.map +1 -0
  721. package/dist/character/testutil/meshyRig.d.ts +17 -0
  722. package/dist/character/testutil/meshyRig.js +117 -0
  723. package/dist/character/testutil/meshyRig.js.map +1 -0
  724. package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
  725. package/dist/character/testutil/slotBudgetExpectations.js +21 -0
  726. package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
  727. package/dist/character/testutil/syntheticRig.d.ts +12 -1
  728. package/dist/character/testutil/syntheticRig.js +88 -3
  729. package/dist/character/testutil/syntheticRig.js.map +1 -1
  730. package/dist/character/unrealMaterialSidecar.d.ts +94 -0
  731. package/dist/character/unrealMaterialSidecar.js +879 -0
  732. package/dist/character/unrealMaterialSidecar.js.map +1 -0
  733. package/dist/character/untrustedSource.d.ts +54 -0
  734. package/dist/character/untrustedSource.js +181 -0
  735. package/dist/character/untrustedSource.js.map +1 -0
  736. package/dist/character/vrmCharacter.d.ts +156 -0
  737. package/dist/character/vrmCharacter.js +678 -0
  738. package/dist/character/vrmCharacter.js.map +1 -0
  739. package/dist/config.d.ts +5 -0
  740. package/dist/config.js +72 -24
  741. package/dist/config.js.map +1 -1
  742. package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
  743. package/dist/continuum/adminPackagePinCommand.js +46 -0
  744. package/dist/continuum/adminPackagePinCommand.js.map +1 -0
  745. package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
  746. package/dist/continuum/adminPackagePublishCommand.js +22 -0
  747. package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
  748. package/dist/continuum/authoring.d.ts +52 -0
  749. package/dist/continuum/authoring.js +143 -0
  750. package/dist/continuum/authoring.js.map +1 -0
  751. package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
  752. package/dist/continuum/characterMigrationGenerator.js +242 -0
  753. package/dist/continuum/characterMigrationGenerator.js.map +1 -0
  754. package/dist/continuum/cli.d.ts +69 -0
  755. package/dist/continuum/cli.js +145 -0
  756. package/dist/continuum/cli.js.map +1 -0
  757. package/dist/continuum/cliAuthority.d.ts +17 -0
  758. package/dist/continuum/cliAuthority.js +28 -0
  759. package/dist/continuum/cliAuthority.js.map +1 -0
  760. package/dist/continuum/client.d.ts +103 -0
  761. package/dist/continuum/client.js +190 -0
  762. package/dist/continuum/client.js.map +1 -0
  763. package/dist/continuum/homeScenePackage.d.ts +159 -0
  764. package/dist/continuum/homeScenePackage.js +267 -0
  765. package/dist/continuum/homeScenePackage.js.map +1 -0
  766. package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
  767. package/dist/continuum/homeScenePackageCommand.js +107 -0
  768. package/dist/continuum/homeScenePackageCommand.js.map +1 -0
  769. package/dist/continuum/identity.d.ts +4 -0
  770. package/dist/continuum/identity.js +20 -0
  771. package/dist/continuum/identity.js.map +1 -0
  772. package/dist/continuum/index.d.ts +11 -0
  773. package/dist/continuum/index.js +28 -0
  774. package/dist/continuum/index.js.map +1 -0
  775. package/dist/continuum/missingNormals.d.ts +48 -0
  776. package/dist/continuum/missingNormals.js +99 -0
  777. package/dist/continuum/missingNormals.js.map +1 -0
  778. package/dist/continuum/objectUpload.d.ts +64 -0
  779. package/dist/continuum/objectUpload.js +375 -0
  780. package/dist/continuum/objectUpload.js.map +1 -0
  781. package/dist/continuum/pull.d.ts +22 -0
  782. package/dist/continuum/pull.js +47 -0
  783. package/dist/continuum/pull.js.map +1 -0
  784. package/dist/continuum/sourceBundle.d.ts +18 -0
  785. package/dist/continuum/sourceBundle.js +160 -0
  786. package/dist/continuum/sourceBundle.js.map +1 -0
  787. package/dist/continuum/state.d.ts +41 -0
  788. package/dist/continuum/state.js +198 -0
  789. package/dist/continuum/state.js.map +1 -0
  790. package/dist/continuum/types.d.ts +156 -0
  791. package/dist/continuum/types.js +6 -0
  792. package/dist/continuum/types.js.map +1 -0
  793. package/dist/continuum/workflow.d.ts +62 -0
  794. package/dist/continuum/workflow.js +592 -0
  795. package/dist/continuum/workflow.js.map +1 -0
  796. package/dist/cs2/areas.d.ts +41 -0
  797. package/dist/cs2/areas.js +82 -0
  798. package/dist/cs2/areas.js.map +1 -0
  799. package/dist/cs2/binary.d.ts +10 -0
  800. package/dist/cs2/binary.js +59 -0
  801. package/dist/cs2/binary.js.map +1 -0
  802. package/dist/cs2/cityLegacy.d.ts +29 -0
  803. package/dist/cs2/cityLegacy.js +48 -0
  804. package/dist/cs2/cityLegacy.js.map +1 -0
  805. package/dist/cs2/convert/areas.d.ts +32 -0
  806. package/dist/cs2/convert/areas.js +96 -0
  807. package/dist/cs2/convert/areas.js.map +1 -0
  808. package/dist/cs2/convert/glb.d.ts +48 -0
  809. package/dist/cs2/convert/glb.js +178 -0
  810. package/dist/cs2/convert/glb.js.map +1 -0
  811. package/dist/cs2/convert/markings.d.ts +96 -0
  812. package/dist/cs2/convert/markings.js +329 -0
  813. package/dist/cs2/convert/markings.js.map +1 -0
  814. package/dist/cs2/convert/nodeSeams.d.ts +20 -0
  815. package/dist/cs2/convert/nodeSeams.js +164 -0
  816. package/dist/cs2/convert/nodeSeams.js.map +1 -0
  817. package/dist/cs2/convert/roadBake.d.ts +112 -0
  818. package/dist/cs2/convert/roadBake.js +290 -0
  819. package/dist/cs2/convert/roadBake.js.map +1 -0
  820. package/dist/cs2/convert/roads.d.ts +110 -0
  821. package/dist/cs2/convert/roads.js +419 -0
  822. package/dist/cs2/convert/roads.js.map +1 -0
  823. package/dist/cs2/convert/terrain.d.ts +67 -0
  824. package/dist/cs2/convert/terrain.js +141 -0
  825. package/dist/cs2/convert/terrain.js.map +1 -0
  826. package/dist/cs2/convert/terrainConform.d.ts +58 -0
  827. package/dist/cs2/convert/terrainConform.js +284 -0
  828. package/dist/cs2/convert/terrainConform.js.map +1 -0
  829. package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
  830. package/dist/cs2/convert/treeRoadClearance.js +78 -0
  831. package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
  832. package/dist/cs2/convert/trees.d.ts +33 -0
  833. package/dist/cs2/convert/trees.js +68 -0
  834. package/dist/cs2/convert/trees.js.map +1 -0
  835. package/dist/cs2/csm2.d.ts +58 -0
  836. package/dist/cs2/csm2.js +188 -0
  837. package/dist/cs2/csm2.js.map +1 -0
  838. package/dist/cs2/fixtures.d.ts +5 -0
  839. package/dist/cs2/fixtures.js +15 -0
  840. package/dist/cs2/fixtures.js.map +1 -0
  841. package/dist/cs2/impostors.d.ts +31 -0
  842. package/dist/cs2/impostors.js +42 -0
  843. package/dist/cs2/impostors.js.map +1 -0
  844. package/dist/cs2/index.d.ts +22 -0
  845. package/dist/cs2/index.js +191 -0
  846. package/dist/cs2/index.js.map +1 -0
  847. package/dist/cs2/inspect.d.ts +81 -0
  848. package/dist/cs2/inspect.js +181 -0
  849. package/dist/cs2/inspect.js.map +1 -0
  850. package/dist/cs2/lods.d.ts +22 -0
  851. package/dist/cs2/lods.js +136 -0
  852. package/dist/cs2/lods.js.map +1 -0
  853. package/dist/cs2/materials.d.ts +43 -0
  854. package/dist/cs2/materials.js +137 -0
  855. package/dist/cs2/materials.js.map +1 -0
  856. package/dist/cs2/placements.d.ts +57 -0
  857. package/dist/cs2/placements.js +116 -0
  858. package/dist/cs2/placements.js.map +1 -0
  859. package/dist/cs2/roadPieces.d.ts +79 -0
  860. package/dist/cs2/roadPieces.js +263 -0
  861. package/dist/cs2/roadPieces.js.map +1 -0
  862. package/dist/cs2/roads.d.ts +92 -0
  863. package/dist/cs2/roads.js +329 -0
  864. package/dist/cs2/roads.js.map +1 -0
  865. package/dist/cs2/terrain.d.ts +37 -0
  866. package/dist/cs2/terrain.js +91 -0
  867. package/dist/cs2/terrain.js.map +1 -0
  868. package/dist/cs2/types.d.ts +444 -0
  869. package/dist/cs2/types.js +22 -0
  870. package/dist/cs2/types.js.map +1 -0
  871. package/dist/cs2/water.d.ts +26 -0
  872. package/dist/cs2/water.js +58 -0
  873. package/dist/cs2/water.js.map +1 -0
  874. package/dist/currency.d.ts +94 -0
  875. package/dist/currency.js +425 -0
  876. package/dist/currency.js.map +1 -0
  877. package/dist/dev/devServer.d.ts +53 -0
  878. package/dist/dev/devServer.js +228 -0
  879. package/dist/dev/devServer.js.map +1 -0
  880. package/dist/dev/shellPage.d.ts +3 -0
  881. package/dist/dev/shellPage.js +297 -0
  882. package/dist/dev/shellPage.js.map +1 -0
  883. package/dist/dev/state.d.ts +84 -0
  884. package/dist/dev/state.js +265 -0
  885. package/dist/dev/state.js.map +1 -0
  886. package/dist/device.d.ts +104 -0
  887. package/dist/device.js +2744 -0
  888. package/dist/device.js.map +1 -0
  889. package/dist/deviceActionValidation.d.ts +21 -0
  890. package/dist/deviceActionValidation.js +460 -0
  891. package/dist/deviceActionValidation.js.map +1 -0
  892. package/dist/distribution.d.ts +69 -0
  893. package/dist/distribution.js +138 -0
  894. package/dist/distribution.js.map +1 -0
  895. package/dist/enginePins.d.ts +45 -0
  896. package/dist/enginePins.js +134 -0
  897. package/dist/enginePins.js.map +1 -0
  898. package/dist/gesture/axisReference.d.ts +22 -0
  899. package/dist/gesture/axisReference.js +32 -0
  900. package/dist/gesture/axisReference.js.map +1 -0
  901. package/dist/gesture/capture.d.ts +84 -0
  902. package/dist/gesture/capture.js +303 -0
  903. package/dist/gesture/capture.js.map +1 -0
  904. package/dist/gesture/harnessPage.d.ts +23 -0
  905. package/dist/gesture/harnessPage.js +153 -0
  906. package/dist/gesture/harnessPage.js.map +1 -0
  907. package/dist/gesture/inspect.d.ts +189 -0
  908. package/dist/gesture/inspect.js +678 -0
  909. package/dist/gesture/inspect.js.map +1 -0
  910. package/dist/gesture/rig.d.ts +12 -0
  911. package/dist/gesture/rig.js +111 -0
  912. package/dist/gesture/rig.js.map +1 -0
  913. package/dist/gesture/worldRuntime.d.ts +65 -0
  914. package/dist/gesture/worldRuntime.js +110 -0
  915. package/dist/gesture/worldRuntime.js.map +1 -0
  916. package/dist/glb/draw-calls.d.ts +60 -0
  917. package/dist/glb/draw-calls.js +160 -0
  918. package/dist/glb/draw-calls.js.map +1 -0
  919. package/dist/glb/glb-summary.d.ts +68 -0
  920. package/dist/glb/glb-summary.js +450 -0
  921. package/dist/glb/glb-summary.js.map +1 -0
  922. package/dist/glb/index.d.ts +12 -0
  923. package/dist/glb/index.js +24 -0
  924. package/dist/glb/index.js.map +1 -0
  925. package/dist/glb/smooth-normals.d.ts +98 -0
  926. package/dist/glb/smooth-normals.js +395 -0
  927. package/dist/glb/smooth-normals.js.map +1 -0
  928. package/dist/index.d.ts +1 -1
  929. package/dist/index.js +6786 -128
  930. package/dist/index.js.map +1 -1
  931. package/dist/init.d.ts +35 -1
  932. package/dist/init.js +1115 -47
  933. package/dist/init.js.map +1 -1
  934. package/dist/install.d.ts +16 -5
  935. package/dist/install.js +123 -23
  936. package/dist/install.js.map +1 -1
  937. package/dist/interactable.d.ts +154 -0
  938. package/dist/interactable.js +1219 -0
  939. package/dist/interactable.js.map +1 -0
  940. package/dist/item.d.ts +217 -0
  941. package/dist/item.js +892 -0
  942. package/dist/item.js.map +1 -0
  943. package/dist/itemDef/distribute.d.ts +17 -0
  944. package/dist/itemDef/distribute.js +29 -0
  945. package/dist/itemDef/distribute.js.map +1 -0
  946. package/dist/itemDef/emoteRules.d.ts +85 -0
  947. package/dist/itemDef/emoteRules.js +368 -0
  948. package/dist/itemDef/emoteRules.js.map +1 -0
  949. package/dist/itemDef/gunConfigRules.d.ts +24 -0
  950. package/dist/itemDef/gunConfigRules.js +300 -0
  951. package/dist/itemDef/gunConfigRules.js.map +1 -0
  952. package/dist/itemDef/inspect.d.ts +19 -0
  953. package/dist/itemDef/inspect.js +144 -0
  954. package/dist/itemDef/inspect.js.map +1 -0
  955. package/dist/itemDef/scaffold.d.ts +41 -0
  956. package/dist/itemDef/scaffold.js +303 -0
  957. package/dist/itemDef/scaffold.js.map +1 -0
  958. package/dist/itemDef/tables.d.ts +81 -0
  959. package/dist/itemDef/tables.js +226 -0
  960. package/dist/itemDef/tables.js.map +1 -0
  961. package/dist/itemDef/validate.d.ts +30 -0
  962. package/dist/itemDef/validate.js +175 -0
  963. package/dist/itemDef/validate.js.map +1 -0
  964. package/dist/itemPublishVersion.d.ts +46 -0
  965. package/dist/itemPublishVersion.js +242 -0
  966. package/dist/itemPublishVersion.js.map +1 -0
  967. package/dist/itemSearch.d.ts +128 -0
  968. package/dist/itemSearch.js +140 -0
  969. package/dist/itemSearch.js.map +1 -0
  970. package/dist/itemSetVersion.d.ts +77 -0
  971. package/dist/itemSetVersion.js +170 -0
  972. package/dist/itemSetVersion.js.map +1 -0
  973. package/dist/itemThumbnail.d.ts +40 -0
  974. package/dist/itemThumbnail.js +116 -0
  975. package/dist/itemThumbnail.js.map +1 -0
  976. package/dist/lib.d.ts +571 -7
  977. package/dist/lib.js +1178 -15
  978. package/dist/lib.js.map +1 -1
  979. package/dist/looks.d.ts +103 -0
  980. package/dist/looks.js +102 -0
  981. package/dist/looks.js.map +1 -0
  982. package/dist/materials/availability.d.ts +8 -0
  983. package/dist/materials/availability.js +22 -0
  984. package/dist/materials/availability.js.map +1 -0
  985. package/dist/materials/identity.d.ts +30 -0
  986. package/dist/materials/identity.js +68 -0
  987. package/dist/materials/identity.js.map +1 -0
  988. package/dist/materials/pins.d.ts +23 -0
  989. package/dist/materials/pins.js +93 -0
  990. package/dist/materials/pins.js.map +1 -0
  991. package/dist/mesh/surfaceBvh.d.ts +13 -0
  992. package/dist/mesh/surfaceBvh.js +197 -0
  993. package/dist/mesh/surfaceBvh.js.map +1 -0
  994. package/dist/module-validation.d.ts +2 -0
  995. package/dist/module-validation.js +24 -0
  996. package/dist/module-validation.js.map +1 -0
  997. package/dist/money.d.ts +183 -0
  998. package/dist/money.js +299 -0
  999. package/dist/money.js.map +1 -0
  1000. package/dist/npc/capture.d.ts +41 -0
  1001. package/dist/npc/capture.js +99 -0
  1002. package/dist/npc/capture.js.map +1 -0
  1003. package/dist/npc/format.d.ts +2 -0
  1004. package/dist/npc/format.js +102 -0
  1005. package/dist/npc/format.js.map +1 -0
  1006. package/dist/npc/inspect.d.ts +23 -0
  1007. package/dist/npc/inspect.js +54 -0
  1008. package/dist/npc/inspect.js.map +1 -0
  1009. package/dist/npc/metrics.d.ts +132 -0
  1010. package/dist/npc/metrics.js +214 -0
  1011. package/dist/npc/metrics.js.map +1 -0
  1012. package/dist/npc/session.d.ts +35 -0
  1013. package/dist/npc/session.js +172 -0
  1014. package/dist/npc/session.js.map +1 -0
  1015. package/dist/pack/locomotionReference.d.ts +40 -0
  1016. package/dist/pack/locomotionReference.js +132 -0
  1017. package/dist/pack/locomotionReference.js.map +1 -0
  1018. package/dist/pack/scaffold.d.ts +15 -0
  1019. package/dist/pack/scaffold.js +144 -0
  1020. package/dist/pack/scaffold.js.map +1 -0
  1021. package/dist/pack/validate.d.ts +67 -0
  1022. package/dist/pack/validate.js +317 -0
  1023. package/dist/pack/validate.js.map +1 -0
  1024. package/dist/package.d.ts +14 -1
  1025. package/dist/package.js +106 -7
  1026. package/dist/package.js.map +1 -1
  1027. package/dist/paletteShowcase.d.ts +183 -0
  1028. package/dist/paletteShowcase.js +454 -0
  1029. package/dist/paletteShowcase.js.map +1 -0
  1030. package/dist/paletteShowcaseProfiles.d.ts +112 -0
  1031. package/dist/paletteShowcaseProfiles.js +121 -0
  1032. package/dist/paletteShowcaseProfiles.js.map +1 -0
  1033. package/dist/paths.d.ts +4 -0
  1034. package/dist/paths.js +11 -0
  1035. package/dist/paths.js.map +1 -0
  1036. package/dist/placementRequest.d.ts +37 -0
  1037. package/dist/placementRequest.js +220 -0
  1038. package/dist/placementRequest.js.map +1 -0
  1039. package/dist/placements/assets.d.ts +7 -0
  1040. package/dist/placements/assets.js +114 -0
  1041. package/dist/placements/assets.js.map +1 -0
  1042. package/dist/placements/attachFoliageLods.d.ts +4 -0
  1043. package/dist/placements/attachFoliageLods.js +70 -0
  1044. package/dist/placements/attachFoliageLods.js.map +1 -0
  1045. package/dist/placements/attachImpostors.d.ts +3 -0
  1046. package/dist/placements/attachImpostors.js +51 -0
  1047. package/dist/placements/attachImpostors.js.map +1 -0
  1048. package/dist/placements/authored.d.ts +11 -0
  1049. package/dist/placements/authored.js +65 -0
  1050. package/dist/placements/authored.js.map +1 -0
  1051. package/dist/placements/bake.d.ts +2 -0
  1052. package/dist/placements/bake.js +235 -0
  1053. package/dist/placements/bake.js.map +1 -0
  1054. package/dist/placements/captureHost.d.ts +4 -0
  1055. package/dist/placements/captureHost.js +125 -0
  1056. package/dist/placements/captureHost.js.map +1 -0
  1057. package/dist/placements/foliageCapture.d.ts +2 -0
  1058. package/dist/placements/foliageCapture.js +98 -0
  1059. package/dist/placements/foliageCapture.js.map +1 -0
  1060. package/dist/placements/foliageCards.d.ts +17 -0
  1061. package/dist/placements/foliageCards.js +120 -0
  1062. package/dist/placements/foliageCards.js.map +1 -0
  1063. package/dist/placements/foliageLods.d.ts +8 -0
  1064. package/dist/placements/foliageLods.js +240 -0
  1065. package/dist/placements/foliageLods.js.map +1 -0
  1066. package/dist/placements/foliageTexture.d.ts +4 -0
  1067. package/dist/placements/foliageTexture.js +91 -0
  1068. package/dist/placements/foliageTexture.js.map +1 -0
  1069. package/dist/placements/impostorCapture.d.ts +2 -0
  1070. package/dist/placements/impostorCapture.js +111 -0
  1071. package/dist/placements/impostorCapture.js.map +1 -0
  1072. package/dist/placements/impostors.d.ts +18 -0
  1073. package/dist/placements/impostors.js +279 -0
  1074. package/dist/placements/impostors.js.map +1 -0
  1075. package/dist/placements/source.d.ts +53 -0
  1076. package/dist/placements/source.js +111 -0
  1077. package/dist/placements/source.js.map +1 -0
  1078. package/dist/product.d.ts +84 -0
  1079. package/dist/product.js +285 -0
  1080. package/dist/product.js.map +1 -0
  1081. package/dist/publications.d.ts +116 -0
  1082. package/dist/publications.js +180 -0
  1083. package/dist/publications.js.map +1 -0
  1084. package/dist/publishDuplicateGuard.d.ts +92 -0
  1085. package/dist/publishDuplicateGuard.js +128 -0
  1086. package/dist/publishDuplicateGuard.js.map +1 -0
  1087. package/dist/realizability.d.ts +36 -0
  1088. package/dist/realizability.js +269 -0
  1089. package/dist/realizability.js.map +1 -0
  1090. package/dist/resolve.d.ts +7 -1
  1091. package/dist/resolve.js +77 -11
  1092. package/dist/resolve.js.map +1 -1
  1093. package/dist/sceneElements/compiler.d.ts +21 -0
  1094. package/dist/sceneElements/compiler.js +976 -0
  1095. package/dist/sceneElements/compiler.js.map +1 -0
  1096. package/dist/sceneElements/continuum.d.ts +54 -0
  1097. package/dist/sceneElements/continuum.js +451 -0
  1098. package/dist/sceneElements/continuum.js.map +1 -0
  1099. package/dist/sceneElements/devices.d.ts +12 -0
  1100. package/dist/sceneElements/devices.js +212 -0
  1101. package/dist/sceneElements/devices.js.map +1 -0
  1102. package/dist/sceneElements/meshCells.d.ts +49 -0
  1103. package/dist/sceneElements/meshCells.js +174 -0
  1104. package/dist/sceneElements/meshCells.js.map +1 -0
  1105. package/dist/sceneElements/types.d.ts +261 -0
  1106. package/dist/sceneElements/types.js +3 -0
  1107. package/dist/sceneElements/types.js.map +1 -0
  1108. package/dist/sceneHlod/approximate.d.ts +23 -0
  1109. package/dist/sceneHlod/approximate.js +171 -0
  1110. package/dist/sceneHlod/approximate.js.map +1 -0
  1111. package/dist/sceneHlod/artifact.d.ts +3 -0
  1112. package/dist/sceneHlod/artifact.js +29 -0
  1113. package/dist/sceneHlod/artifact.js.map +1 -0
  1114. package/dist/sceneHlod/bakeSurface.d.ts +2 -0
  1115. package/dist/sceneHlod/bakeSurface.js +59 -0
  1116. package/dist/sceneHlod/bakeSurface.js.map +1 -0
  1117. package/dist/sceneHlod/basisEncoder.d.ts +3 -0
  1118. package/dist/sceneHlod/basisEncoder.js +68 -0
  1119. package/dist/sceneHlod/basisEncoder.js.map +1 -0
  1120. package/dist/sceneHlod/cellArtifact.d.ts +17 -0
  1121. package/dist/sceneHlod/cellArtifact.js +78 -0
  1122. package/dist/sceneHlod/cellArtifact.js.map +1 -0
  1123. package/dist/sceneHlod/commands.d.ts +2 -0
  1124. package/dist/sceneHlod/commands.js +114 -0
  1125. package/dist/sceneHlod/commands.js.map +1 -0
  1126. package/dist/sceneHlod/complete.d.ts +78 -0
  1127. package/dist/sceneHlod/complete.js +261 -0
  1128. package/dist/sceneHlod/complete.js.map +1 -0
  1129. package/dist/sceneHlod/completePrototype.d.ts +39 -0
  1130. package/dist/sceneHlod/completePrototype.js +121 -0
  1131. package/dist/sceneHlod/completePrototype.js.map +1 -0
  1132. package/dist/sceneHlod/geometry.d.ts +6 -0
  1133. package/dist/sceneHlod/geometry.js +101 -0
  1134. package/dist/sceneHlod/geometry.js.map +1 -0
  1135. package/dist/sceneHlod/imageSampling.d.ts +11 -0
  1136. package/dist/sceneHlod/imageSampling.js +100 -0
  1137. package/dist/sceneHlod/imageSampling.js.map +1 -0
  1138. package/dist/sceneHlod/refinement.d.ts +46 -0
  1139. package/dist/sceneHlod/refinement.js +204 -0
  1140. package/dist/sceneHlod/refinement.js.map +1 -0
  1141. package/dist/sceneHlod/scene.d.ts +80 -0
  1142. package/dist/sceneHlod/scene.js +264 -0
  1143. package/dist/sceneHlod/scene.js.map +1 -0
  1144. package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
  1145. package/dist/sceneHlod/sharedAtlas.js +84 -0
  1146. package/dist/sceneHlod/sharedAtlas.js.map +1 -0
  1147. package/dist/sceneHlod/source.d.ts +17 -0
  1148. package/dist/sceneHlod/source.js +241 -0
  1149. package/dist/sceneHlod/source.js.map +1 -0
  1150. package/dist/sceneHlod/textureCodec.d.ts +4 -0
  1151. package/dist/sceneHlod/textureCodec.js +66 -0
  1152. package/dist/sceneHlod/textureCodec.js.map +1 -0
  1153. package/dist/sceneHlod/transfer.d.ts +8 -0
  1154. package/dist/sceneHlod/transfer.js +147 -0
  1155. package/dist/sceneHlod/transfer.js.map +1 -0
  1156. package/dist/sceneHlod/types.d.ts +69 -0
  1157. package/dist/sceneHlod/types.js +3 -0
  1158. package/dist/sceneHlod/types.js.map +1 -0
  1159. package/dist/sceneImport/archive.d.ts +30 -0
  1160. package/dist/sceneImport/archive.js +336 -0
  1161. package/dist/sceneImport/archive.js.map +1 -0
  1162. package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
  1163. package/dist/sceneImport/bistroMaterialBake.js +169 -0
  1164. package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
  1165. package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
  1166. package/dist/sceneImport/bistroTexturePlan.js +23 -0
  1167. package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
  1168. package/dist/sceneImport/compiler.d.ts +36 -0
  1169. package/dist/sceneImport/compiler.js +251 -0
  1170. package/dist/sceneImport/compiler.js.map +1 -0
  1171. package/dist/sceneImport/composeMounts.d.ts +159 -0
  1172. package/dist/sceneImport/composeMounts.js +687 -0
  1173. package/dist/sceneImport/composeMounts.js.map +1 -0
  1174. package/dist/sceneImport/defaultMaterials.d.ts +45 -0
  1175. package/dist/sceneImport/defaultMaterials.js +121 -0
  1176. package/dist/sceneImport/defaultMaterials.js.map +1 -0
  1177. package/dist/sceneImport/externalTextures.d.ts +44 -0
  1178. package/dist/sceneImport/externalTextures.js +146 -0
  1179. package/dist/sceneImport/externalTextures.js.map +1 -0
  1180. package/dist/sceneImport/fbx.d.ts +101 -0
  1181. package/dist/sceneImport/fbx.js +307 -0
  1182. package/dist/sceneImport/fbx.js.map +1 -0
  1183. package/dist/sceneImport/glbSplit.d.ts +24 -0
  1184. package/dist/sceneImport/glbSplit.js +95 -0
  1185. package/dist/sceneImport/glbSplit.js.map +1 -0
  1186. package/dist/sceneImport/gltfIo.d.ts +32 -0
  1187. package/dist/sceneImport/gltfIo.js +39 -0
  1188. package/dist/sceneImport/gltfIo.js.map +1 -0
  1189. package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
  1190. package/dist/sceneImport/helsinkiTiles.js +52 -0
  1191. package/dist/sceneImport/helsinkiTiles.js.map +1 -0
  1192. package/dist/sceneImport/materials/binding.d.ts +16 -0
  1193. package/dist/sceneImport/materials/binding.js +42 -0
  1194. package/dist/sceneImport/materials/binding.js.map +1 -0
  1195. package/dist/sceneImport/materials/catalog.d.ts +36 -0
  1196. package/dist/sceneImport/materials/catalog.js +233 -0
  1197. package/dist/sceneImport/materials/catalog.js.map +1 -0
  1198. package/dist/sceneImport/materials/index.d.ts +4 -0
  1199. package/dist/sceneImport/materials/index.js +21 -0
  1200. package/dist/sceneImport/materials/index.js.map +1 -0
  1201. package/dist/sceneImport/materials/matcher.d.ts +33 -0
  1202. package/dist/sceneImport/materials/matcher.js +127 -0
  1203. package/dist/sceneImport/materials/matcher.js.map +1 -0
  1204. package/dist/sceneImport/materials/recipe.d.ts +30 -0
  1205. package/dist/sceneImport/materials/recipe.js +134 -0
  1206. package/dist/sceneImport/materials/recipe.js.map +1 -0
  1207. package/dist/sceneImport/multiAsset.d.ts +79 -0
  1208. package/dist/sceneImport/multiAsset.js +535 -0
  1209. package/dist/sceneImport/multiAsset.js.map +1 -0
  1210. package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
  1211. package/dist/sceneImport/multiAssetSpawn.js +98 -0
  1212. package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
  1213. package/dist/sceneImport/obj.d.ts +41 -0
  1214. package/dist/sceneImport/obj.js +276 -0
  1215. package/dist/sceneImport/obj.js.map +1 -0
  1216. package/dist/sceneImport/package.d.ts +104 -0
  1217. package/dist/sceneImport/package.js +1004 -0
  1218. package/dist/sceneImport/package.js.map +1 -0
  1219. package/dist/sceneImport/packageReader.d.ts +10 -0
  1220. package/dist/sceneImport/packageReader.js +250 -0
  1221. package/dist/sceneImport/packageReader.js.map +1 -0
  1222. package/dist/sceneImport/proxy.d.ts +100 -0
  1223. package/dist/sceneImport/proxy.js +334 -0
  1224. package/dist/sceneImport/proxy.js.map +1 -0
  1225. package/dist/sceneImport/publish.d.ts +47 -0
  1226. package/dist/sceneImport/publish.js +98 -0
  1227. package/dist/sceneImport/publish.js.map +1 -0
  1228. package/dist/sceneImport/semantic.d.ts +75 -0
  1229. package/dist/sceneImport/semantic.js +296 -0
  1230. package/dist/sceneImport/semantic.js.map +1 -0
  1231. package/dist/sceneImport/spawnProbe.d.ts +55 -0
  1232. package/dist/sceneImport/spawnProbe.js +159 -0
  1233. package/dist/sceneImport/spawnProbe.js.map +1 -0
  1234. package/dist/sceneImport/streamLayout.d.ts +96 -0
  1235. package/dist/sceneImport/streamLayout.js +203 -0
  1236. package/dist/sceneImport/streamLayout.js.map +1 -0
  1237. package/dist/sceneImport/textureDecode.d.ts +21 -0
  1238. package/dist/sceneImport/textureDecode.js +292 -0
  1239. package/dist/sceneImport/textureDecode.js.map +1 -0
  1240. package/dist/sceneImport/types.d.ts +84 -0
  1241. package/dist/sceneImport/types.js +58 -0
  1242. package/dist/sceneImport/types.js.map +1 -0
  1243. package/dist/scenePerformance.d.ts +162 -0
  1244. package/dist/scenePerformance.js +905 -0
  1245. package/dist/scenePerformance.js.map +1 -0
  1246. package/dist/screenshot/captureScreenshots.d.ts +36 -0
  1247. package/dist/screenshot/captureScreenshots.js +229 -0
  1248. package/dist/screenshot/captureScreenshots.js.map +1 -0
  1249. package/dist/screenshot/encodeImagePreview.d.ts +5 -0
  1250. package/dist/screenshot/encodeImagePreview.js +42 -0
  1251. package/dist/screenshot/encodeImagePreview.js.map +1 -0
  1252. package/dist/screenshot/publishThumbnail.d.ts +4 -0
  1253. package/dist/screenshot/publishThumbnail.js +56 -0
  1254. package/dist/screenshot/publishThumbnail.js.map +1 -0
  1255. package/dist/screenshot/staticServe.d.ts +14 -0
  1256. package/dist/screenshot/staticServe.js +120 -0
  1257. package/dist/screenshot/staticServe.js.map +1 -0
  1258. package/dist/source-archive.d.ts +101 -0
  1259. package/dist/source-archive.js +309 -0
  1260. package/dist/source-archive.js.map +1 -0
  1261. package/dist/stdioBlocking.d.ts +1 -0
  1262. package/dist/stdioBlocking.js +9 -0
  1263. package/dist/stdioBlocking.js.map +1 -0
  1264. package/dist/terrain/bake.d.ts +40 -0
  1265. package/dist/terrain/bake.js +318 -0
  1266. package/dist/terrain/bake.js.map +1 -0
  1267. package/dist/terrain/generate.d.ts +21 -0
  1268. package/dist/terrain/generate.js +239 -0
  1269. package/dist/terrain/generate.js.map +1 -0
  1270. package/dist/terrain/grid.d.ts +48 -0
  1271. package/dist/terrain/grid.js +133 -0
  1272. package/dist/terrain/grid.js.map +1 -0
  1273. package/dist/terrain/import.d.ts +40 -0
  1274. package/dist/terrain/import.js +252 -0
  1275. package/dist/terrain/import.js.map +1 -0
  1276. package/dist/terrain/index.d.ts +11 -0
  1277. package/dist/terrain/index.js +88 -0
  1278. package/dist/terrain/index.js.map +1 -0
  1279. package/dist/terrain/inspect.d.ts +35 -0
  1280. package/dist/terrain/inspect.js +115 -0
  1281. package/dist/terrain/inspect.js.map +1 -0
  1282. package/dist/terrain/island.d.ts +31 -0
  1283. package/dist/terrain/island.js +128 -0
  1284. package/dist/terrain/island.js.map +1 -0
  1285. package/dist/terrain/noise.d.ts +79 -0
  1286. package/dist/terrain/noise.js +162 -0
  1287. package/dist/terrain/noise.js.map +1 -0
  1288. package/dist/terrain/normals.d.ts +21 -0
  1289. package/dist/terrain/normals.js +55 -0
  1290. package/dist/terrain/normals.js.map +1 -0
  1291. package/dist/terrain/presets/alpine.json +20 -0
  1292. package/dist/terrain/presets/coast.json +20 -0
  1293. package/dist/terrain/presets/desert.json +22 -0
  1294. package/dist/terrain/presets/forest.json +20 -0
  1295. package/dist/terrain/presets/meadow.json +20 -0
  1296. package/dist/terrain/presets/volcanic.json +22 -0
  1297. package/dist/terrain/presets.d.ts +29 -0
  1298. package/dist/terrain/presets.js +128 -0
  1299. package/dist/terrain/presets.js.map +1 -0
  1300. package/dist/terrain/source.d.ts +42 -0
  1301. package/dist/terrain/source.js +241 -0
  1302. package/dist/terrain/source.js.map +1 -0
  1303. package/dist/terrain/tile.d.ts +92 -0
  1304. package/dist/terrain/tile.js +268 -0
  1305. package/dist/terrain/tile.js.map +1 -0
  1306. package/dist/textureAudit.d.ts +23 -0
  1307. package/dist/textureAudit.js +192 -0
  1308. package/dist/textureAudit.js.map +1 -0
  1309. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1310. package/dist/unreal/avatarMode.d.ts +21 -0
  1311. package/dist/unreal/avatarMode.js +33 -0
  1312. package/dist/unreal/avatarMode.js.map +1 -0
  1313. package/dist/unreal/delivery.d.ts +46 -0
  1314. package/dist/unreal/delivery.js +89 -0
  1315. package/dist/unreal/delivery.js.map +1 -0
  1316. package/dist/unreal/doctor.d.ts +50 -0
  1317. package/dist/unreal/doctor.js +102 -0
  1318. package/dist/unreal/doctor.js.map +1 -0
  1319. package/dist/unreal/package.d.ts +80 -0
  1320. package/dist/unreal/package.js +273 -0
  1321. package/dist/unreal/package.js.map +1 -0
  1322. package/dist/unreal/release.d.ts +41 -0
  1323. package/dist/unreal/release.js +122 -0
  1324. package/dist/unreal/release.js.map +1 -0
  1325. package/dist/unreal.d.ts +30 -0
  1326. package/dist/unreal.js +362 -0
  1327. package/dist/unreal.js.map +1 -0
  1328. package/dist/unrealCandidate.d.ts +213 -0
  1329. package/dist/unrealCandidate.js +765 -0
  1330. package/dist/unrealCandidate.js.map +1 -0
  1331. package/dist/unrealManifest.d.ts +74 -0
  1332. package/dist/unrealManifest.js +354 -0
  1333. package/dist/unrealManifest.js.map +1 -0
  1334. package/dist/unrealPublish.d.ts +111 -0
  1335. package/dist/unrealPublish.js +331 -0
  1336. package/dist/unrealPublish.js.map +1 -0
  1337. package/dist/vault.d.ts +121 -0
  1338. package/dist/vault.js +136 -0
  1339. package/dist/vault.js.map +1 -0
  1340. package/dist/vehicle/addOnDefinition.d.ts +19 -0
  1341. package/dist/vehicle/addOnDefinition.js +21 -0
  1342. package/dist/vehicle/addOnDefinition.js.map +1 -0
  1343. package/dist/vehicle/addon.d.ts +158 -0
  1344. package/dist/vehicle/addon.js +441 -0
  1345. package/dist/vehicle/addon.js.map +1 -0
  1346. package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
  1347. package/dist/vehicle/addonDefinitionGuard.js +206 -0
  1348. package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
  1349. package/dist/vehicle/addonPublished.d.ts +80 -0
  1350. package/dist/vehicle/addonPublished.js +221 -0
  1351. package/dist/vehicle/addonPublished.js.map +1 -0
  1352. package/dist/vehicle/audio.d.ts +259 -0
  1353. package/dist/vehicle/audio.js +1069 -0
  1354. package/dist/vehicle/audio.js.map +1 -0
  1355. package/dist/vehicle/audioDefects.d.ts +125 -0
  1356. package/dist/vehicle/audioDefects.js +591 -0
  1357. package/dist/vehicle/audioDefects.js.map +1 -0
  1358. package/dist/vehicle/audioDistinct.d.ts +62 -0
  1359. package/dist/vehicle/audioDistinct.js +479 -0
  1360. package/dist/vehicle/audioDistinct.js.map +1 -0
  1361. package/dist/vehicle/audioImport.d.ts +217 -0
  1362. package/dist/vehicle/audioImport.js +610 -0
  1363. package/dist/vehicle/audioImport.js.map +1 -0
  1364. package/dist/vehicle/audioProvenance.d.ts +47 -0
  1365. package/dist/vehicle/audioProvenance.js +364 -0
  1366. package/dist/vehicle/audioProvenance.js.map +1 -0
  1367. package/dist/vehicle/audioReference.d.ts +36 -0
  1368. package/dist/vehicle/audioReference.js +176 -0
  1369. package/dist/vehicle/audioReference.js.map +1 -0
  1370. package/dist/vehicle/audioSlots.d.ts +27 -0
  1371. package/dist/vehicle/audioSlots.js +43 -0
  1372. package/dist/vehicle/audioSlots.js.map +1 -0
  1373. package/dist/vehicle/audioSpectral.d.ts +71 -0
  1374. package/dist/vehicle/audioSpectral.js +534 -0
  1375. package/dist/vehicle/audioSpectral.js.map +1 -0
  1376. package/dist/vehicle/cabinCheck.d.ts +209 -0
  1377. package/dist/vehicle/cabinCheck.js +799 -0
  1378. package/dist/vehicle/cabinCheck.js.map +1 -0
  1379. package/dist/vehicle/drive.d.ts +66 -0
  1380. package/dist/vehicle/drive.js +228 -0
  1381. package/dist/vehicle/drive.js.map +1 -0
  1382. package/dist/vehicle/enginePolicy.d.ts +68 -0
  1383. package/dist/vehicle/enginePolicy.js +209 -0
  1384. package/dist/vehicle/enginePolicy.js.map +1 -0
  1385. package/dist/vehicle/hostFrame.d.ts +78 -0
  1386. package/dist/vehicle/hostFrame.js +136 -0
  1387. package/dist/vehicle/hostFrame.js.map +1 -0
  1388. package/dist/vehicle/inspectionSheets.d.ts +42 -0
  1389. package/dist/vehicle/inspectionSheets.js +173 -0
  1390. package/dist/vehicle/inspectionSheets.js.map +1 -0
  1391. package/dist/vehicle/keyboardLaunch.d.ts +189 -0
  1392. package/dist/vehicle/keyboardLaunch.js +340 -0
  1393. package/dist/vehicle/keyboardLaunch.js.map +1 -0
  1394. package/dist/vehicle/lampCoverage.d.ts +49 -0
  1395. package/dist/vehicle/lampCoverage.js +252 -0
  1396. package/dist/vehicle/lampCoverage.js.map +1 -0
  1397. package/dist/vehicle/mintAddOn.d.ts +110 -0
  1398. package/dist/vehicle/mintAddOn.js +321 -0
  1399. package/dist/vehicle/mintAddOn.js.map +1 -0
  1400. package/dist/vehicle/mintVehicle.d.ts +189 -0
  1401. package/dist/vehicle/mintVehicle.js +417 -0
  1402. package/dist/vehicle/mintVehicle.js.map +1 -0
  1403. package/dist/vehicle/paintHue.d.ts +89 -0
  1404. package/dist/vehicle/paintHue.js +248 -0
  1405. package/dist/vehicle/paintHue.js.map +1 -0
  1406. package/dist/vehicle/panelCoverage.d.ts +37 -0
  1407. package/dist/vehicle/panelCoverage.js +93 -0
  1408. package/dist/vehicle/panelCoverage.js.map +1 -0
  1409. package/dist/vehicle/platform.d.ts +71 -0
  1410. package/dist/vehicle/platform.js +144 -0
  1411. package/dist/vehicle/platform.js.map +1 -0
  1412. package/dist/vehicle/preview.d.ts +339 -0
  1413. package/dist/vehicle/preview.js +854 -0
  1414. package/dist/vehicle/preview.js.map +1 -0
  1415. package/dist/vehicle/previewAddon.d.ts +197 -0
  1416. package/dist/vehicle/previewAddon.js +520 -0
  1417. package/dist/vehicle/previewAddon.js.map +1 -0
  1418. package/dist/vehicle/previewSeats.d.ts +102 -0
  1419. package/dist/vehicle/previewSeats.js +190 -0
  1420. package/dist/vehicle/previewSeats.js.map +1 -0
  1421. package/dist/vehicle/publish.d.ts +78 -0
  1422. package/dist/vehicle/publish.js +111 -0
  1423. package/dist/vehicle/publish.js.map +1 -0
  1424. package/dist/vehicle/recheckListed.d.ts +87 -0
  1425. package/dist/vehicle/recheckListed.js +200 -0
  1426. package/dist/vehicle/recheckListed.js.map +1 -0
  1427. package/dist/vehicle/renditionManifest.d.ts +10 -0
  1428. package/dist/vehicle/renditionManifest.js +56 -0
  1429. package/dist/vehicle/renditionManifest.js.map +1 -0
  1430. package/dist/vehicle/sealCheck.d.ts +30 -0
  1431. package/dist/vehicle/sealCheck.js +59 -0
  1432. package/dist/vehicle/sealCheck.js.map +1 -0
  1433. package/dist/vehicle/simulate.d.ts +219 -0
  1434. package/dist/vehicle/simulate.js +536 -0
  1435. package/dist/vehicle/simulate.js.map +1 -0
  1436. package/dist/vehicle/simulateRuntime.d.ts +76 -0
  1437. package/dist/vehicle/simulateRuntime.js +252 -0
  1438. package/dist/vehicle/simulateRuntime.js.map +1 -0
  1439. package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
  1440. package/dist/vehicle/testutil/sourcedAudio.js +96 -0
  1441. package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
  1442. package/dist/vehicle/validate.d.ts +225 -0
  1443. package/dist/vehicle/validate.js +956 -0
  1444. package/dist/vehicle/validate.js.map +1 -0
  1445. package/dist/vehicle/wheelDesign.d.ts +98 -0
  1446. package/dist/vehicle/wheelDesign.js +276 -0
  1447. package/dist/vehicle/wheelDesign.js.map +1 -0
  1448. package/dist/verifySubPath.d.ts +69 -0
  1449. package/dist/verifySubPath.js +458 -0
  1450. package/dist/verifySubPath.js.map +1 -0
  1451. package/dist/visualQa/animation.d.ts +57 -0
  1452. package/dist/visualQa/animation.js +503 -0
  1453. package/dist/visualQa/animation.js.map +1 -0
  1454. package/dist/visualQa/avatar.d.ts +3 -0
  1455. package/dist/visualQa/avatar.js +443 -0
  1456. package/dist/visualQa/avatar.js.map +1 -0
  1457. package/dist/visualQa/avatarMath.d.ts +180 -0
  1458. package/dist/visualQa/avatarMath.js +318 -0
  1459. package/dist/visualQa/avatarMath.js.map +1 -0
  1460. package/dist/visualQa/avatarPreview.d.ts +26 -0
  1461. package/dist/visualQa/avatarPreview.js +167 -0
  1462. package/dist/visualQa/avatarPreview.js.map +1 -0
  1463. package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
  1464. package/dist/visualQa/avatarPreviewMath.js +696 -0
  1465. package/dist/visualQa/avatarPreviewMath.js.map +1 -0
  1466. package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
  1467. package/dist/visualQa/avatarPreviewProbe.js +181 -0
  1468. package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
  1469. package/dist/visualQa/avatarProbe.d.ts +1 -0
  1470. package/dist/visualQa/avatarProbe.js +264 -0
  1471. package/dist/visualQa/avatarProbe.js.map +1 -0
  1472. package/dist/visualQa/browser.d.ts +116 -0
  1473. package/dist/visualQa/browser.js +817 -0
  1474. package/dist/visualQa/browser.js.map +1 -0
  1475. package/dist/visualQa/candidate.d.ts +116 -0
  1476. package/dist/visualQa/candidate.js +265 -0
  1477. package/dist/visualQa/candidate.js.map +1 -0
  1478. package/dist/visualQa/checklists.d.ts +31 -0
  1479. package/dist/visualQa/checklists.js +160 -0
  1480. package/dist/visualQa/checklists.js.map +1 -0
  1481. package/dist/visualQa/command.d.ts +110 -0
  1482. package/dist/visualQa/command.js +521 -0
  1483. package/dist/visualQa/command.js.map +1 -0
  1484. package/dist/visualQa/commonAsserts.d.ts +68 -0
  1485. package/dist/visualQa/commonAsserts.js +239 -0
  1486. package/dist/visualQa/commonAsserts.js.map +1 -0
  1487. package/dist/visualQa/contactSheet.d.ts +32 -0
  1488. package/dist/visualQa/contactSheet.js +153 -0
  1489. package/dist/visualQa/contactSheet.js.map +1 -0
  1490. package/dist/visualQa/critic.d.ts +18 -0
  1491. package/dist/visualQa/critic.js +179 -0
  1492. package/dist/visualQa/critic.js.map +1 -0
  1493. package/dist/visualQa/emotePage.d.ts +10 -0
  1494. package/dist/visualQa/emotePage.js +249 -0
  1495. package/dist/visualQa/emotePage.js.map +1 -0
  1496. package/dist/visualQa/evidenceOverlay.d.ts +74 -0
  1497. package/dist/visualQa/evidenceOverlay.js +268 -0
  1498. package/dist/visualQa/evidenceOverlay.js.map +1 -0
  1499. package/dist/visualQa/harness.d.ts +57 -0
  1500. package/dist/visualQa/harness.js +3 -0
  1501. package/dist/visualQa/harness.js.map +1 -0
  1502. package/dist/visualQa/hosted.d.ts +152 -0
  1503. package/dist/visualQa/hosted.js +367 -0
  1504. package/dist/visualQa/hosted.js.map +1 -0
  1505. package/dist/visualQa/labelLimit.d.ts +12 -0
  1506. package/dist/visualQa/labelLimit.js +31 -0
  1507. package/dist/visualQa/labelLimit.js.map +1 -0
  1508. package/dist/visualQa/mirror.d.ts +36 -0
  1509. package/dist/visualQa/mirror.js +98 -0
  1510. package/dist/visualQa/mirror.js.map +1 -0
  1511. package/dist/visualQa/moveUx.d.ts +44 -0
  1512. package/dist/visualQa/moveUx.js +103 -0
  1513. package/dist/visualQa/moveUx.js.map +1 -0
  1514. package/dist/visualQa/pinnedChrome.d.ts +63 -0
  1515. package/dist/visualQa/pinnedChrome.js +214 -0
  1516. package/dist/visualQa/pinnedChrome.js.map +1 -0
  1517. package/dist/visualQa/resolve.d.ts +88 -0
  1518. package/dist/visualQa/resolve.js +248 -0
  1519. package/dist/visualQa/resolve.js.map +1 -0
  1520. package/dist/visualQa/scene.d.ts +14 -0
  1521. package/dist/visualQa/scene.js +688 -0
  1522. package/dist/visualQa/scene.js.map +1 -0
  1523. package/dist/visualQa/shot.d.ts +2 -0
  1524. package/dist/visualQa/shot.js +27 -0
  1525. package/dist/visualQa/shot.js.map +1 -0
  1526. package/dist/visualQa/signIn.d.ts +35 -0
  1527. package/dist/visualQa/signIn.js +144 -0
  1528. package/dist/visualQa/signIn.js.map +1 -0
  1529. package/dist/visualQa/submitBudget.d.ts +25 -0
  1530. package/dist/visualQa/submitBudget.js +82 -0
  1531. package/dist/visualQa/submitBudget.js.map +1 -0
  1532. package/dist/visualQa/types.d.ts +195 -0
  1533. package/dist/visualQa/types.js +12 -0
  1534. package/dist/visualQa/types.js.map +1 -0
  1535. package/dist/visualQa/vehicle.d.ts +130 -0
  1536. package/dist/visualQa/vehicle.js +2002 -0
  1537. package/dist/visualQa/vehicle.js.map +1 -0
  1538. package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
  1539. package/dist/visualQa/vehicleAddonProbe.js +115 -0
  1540. package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
  1541. package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
  1542. package/dist/visualQa/vehicleCabinFit.js +55 -0
  1543. package/dist/visualQa/vehicleCabinFit.js.map +1 -0
  1544. package/dist/visualQa/vehicleClearance.d.ts +135 -0
  1545. package/dist/visualQa/vehicleClearance.js +299 -0
  1546. package/dist/visualQa/vehicleClearance.js.map +1 -0
  1547. package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
  1548. package/dist/visualQa/vehicleDriveAlive.js +103 -0
  1549. package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
  1550. package/dist/visualQa/vehicleGrip.d.ts +156 -0
  1551. package/dist/visualQa/vehicleGrip.js +439 -0
  1552. package/dist/visualQa/vehicleGrip.js.map +1 -0
  1553. package/dist/visualQa/vehicleInspection.d.ts +70 -0
  1554. package/dist/visualQa/vehicleInspection.js +318 -0
  1555. package/dist/visualQa/vehicleInspection.js.map +1 -0
  1556. package/dist/visualQa/vehicleLamps.d.ts +120 -0
  1557. package/dist/visualQa/vehicleLamps.js +377 -0
  1558. package/dist/visualQa/vehicleLamps.js.map +1 -0
  1559. package/dist/visualQa/vehicleMath.d.ts +440 -0
  1560. package/dist/visualQa/vehicleMath.js +967 -0
  1561. package/dist/visualQa/vehicleMath.js.map +1 -0
  1562. package/dist/visualQa/vehicleOccupants.d.ts +66 -0
  1563. package/dist/visualQa/vehicleOccupants.js +448 -0
  1564. package/dist/visualQa/vehicleOccupants.js.map +1 -0
  1565. package/dist/visualQa/vehiclePenetration.d.ts +172 -0
  1566. package/dist/visualQa/vehiclePenetration.js +1157 -0
  1567. package/dist/visualQa/vehiclePenetration.js.map +1 -0
  1568. package/dist/visualQa/vehiclePoses.d.ts +25 -0
  1569. package/dist/visualQa/vehiclePoses.js +56 -0
  1570. package/dist/visualQa/vehiclePoses.js.map +1 -0
  1571. package/dist/visualQa/vehiclePosture.d.ts +78 -0
  1572. package/dist/visualQa/vehiclePosture.js +263 -0
  1573. package/dist/visualQa/vehiclePosture.js.map +1 -0
  1574. package/dist/visualQa/vehiclePreview.d.ts +103 -0
  1575. package/dist/visualQa/vehiclePreview.js +312 -0
  1576. package/dist/visualQa/vehiclePreview.js.map +1 -0
  1577. package/dist/visualQa/vehicleProbe.d.ts +3 -0
  1578. package/dist/visualQa/vehicleProbe.js +670 -0
  1579. package/dist/visualQa/vehicleProbe.js.map +1 -0
  1580. package/dist/visualQa/vehicleStance.d.ts +108 -0
  1581. package/dist/visualQa/vehicleStance.js +200 -0
  1582. package/dist/visualQa/vehicleStance.js.map +1 -0
  1583. package/dist/visualQa/viewer.d.ts +6 -0
  1584. package/dist/visualQa/viewer.js +750 -0
  1585. package/dist/visualQa/viewer.js.map +1 -0
  1586. package/dist/visualQa/viewerGeometry.d.ts +116 -0
  1587. package/dist/visualQa/viewerGeometry.js +476 -0
  1588. package/dist/visualQa/viewerGeometry.js.map +1 -0
  1589. package/dist/visualQa/viewerPage.d.ts +11 -0
  1590. package/dist/visualQa/viewerPage.js +414 -0
  1591. package/dist/visualQa/viewerPage.js.map +1 -0
  1592. package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
  1593. package/dist/visualQa/webgpuSelfTest.js +113 -0
  1594. package/dist/visualQa/webgpuSelfTest.js.map +1 -0
  1595. package/dist/visualQa/winChrome.d.ts +92 -0
  1596. package/dist/visualQa/winChrome.js +445 -0
  1597. package/dist/visualQa/winChrome.js.map +1 -0
  1598. package/dist/visualQa/worldWalk.d.ts +59 -0
  1599. package/dist/visualQa/worldWalk.js +523 -0
  1600. package/dist/visualQa/worldWalk.js.map +1 -0
  1601. package/dist/visualQa/worldWalkMath.d.ts +263 -0
  1602. package/dist/visualQa/worldWalkMath.js +873 -0
  1603. package/dist/visualQa/worldWalkMath.js.map +1 -0
  1604. package/dist/visualQa/worldWalkProbe.d.ts +1 -0
  1605. package/dist/visualQa/worldWalkProbe.js +206 -0
  1606. package/dist/visualQa/worldWalkProbe.js.map +1 -0
  1607. package/dist/visualsConfig.d.ts +65 -0
  1608. package/dist/visualsConfig.js +1333 -0
  1609. package/dist/visualsConfig.js.map +1 -0
  1610. package/dist/voiceCommand.d.ts +11 -0
  1611. package/dist/voiceCommand.js +101 -0
  1612. package/dist/voiceCommand.js.map +1 -0
  1613. package/dist/world/analyze.d.ts +51 -0
  1614. package/dist/world/analyze.js +767 -0
  1615. package/dist/world/analyze.js.map +1 -0
  1616. package/dist/world/baseline.d.ts +33 -0
  1617. package/dist/world/baseline.js +111 -0
  1618. package/dist/world/baseline.js.map +1 -0
  1619. package/dist/world/canonicalize.d.ts +7 -0
  1620. package/dist/world/canonicalize.js +110 -0
  1621. package/dist/world/canonicalize.js.map +1 -0
  1622. package/dist/world/diff.d.ts +18 -0
  1623. package/dist/world/diff.js +58 -0
  1624. package/dist/world/diff.js.map +1 -0
  1625. package/dist/world/focus.d.ts +11 -0
  1626. package/dist/world/focus.js +161 -0
  1627. package/dist/world/focus.js.map +1 -0
  1628. package/dist/world/format.d.ts +6 -0
  1629. package/dist/world/format.js +125 -0
  1630. package/dist/world/format.js.map +1 -0
  1631. package/dist/world/readWorldMetrics.d.ts +10 -0
  1632. package/dist/world/readWorldMetrics.js +31 -0
  1633. package/dist/world/readWorldMetrics.js.map +1 -0
  1634. package/dist/world/snapshotTypes.d.ts +59 -0
  1635. package/dist/world/snapshotTypes.js +8 -0
  1636. package/dist/world/snapshotTypes.js.map +1 -0
  1637. package/dist/world/snapshotWorld.d.ts +16 -0
  1638. package/dist/world/snapshotWorld.js +142 -0
  1639. package/dist/world/snapshotWorld.js.map +1 -0
  1640. package/dist/world/wiring.d.ts +21 -0
  1641. package/dist/world/wiring.js +73 -0
  1642. package/dist/world/wiring.js.map +1 -0
  1643. package/dist/world/zones.d.ts +23 -0
  1644. package/dist/world/zones.js +134 -0
  1645. package/dist/world/zones.js.map +1 -0
  1646. package/docs/bridge.md +304 -0
  1647. package/docs/device-hand-reach.md +44 -0
  1648. package/docs/scene-hlod.md +139 -0
  1649. package/docs/vehicle-audio-import.md +299 -0
  1650. package/docs/vehicle-simulate.md +165 -0
  1651. package/docs/visual-qa-candidate-versions.md +71 -0
  1652. package/docs/visual-qa.md +462 -0
  1653. package/package.json +69 -4
  1654. package/plugins/beamng-vehicle/README.md +129 -0
  1655. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  1656. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  1657. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  1658. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  1659. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  1660. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  1661. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  1662. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  1663. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  1664. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  1665. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  1666. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  1667. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  1668. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  1669. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
  1670. package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
  1671. package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
  1672. package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
  1673. package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
  1674. package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
  1675. package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
  1676. package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
  1677. package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
  1678. package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
  1679. package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
  1680. package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
  1681. package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
  1682. package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
  1683. package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
  1684. package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
  1685. package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
  1686. package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
  1687. package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
  1688. package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
  1689. package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
  1690. package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
  1691. package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
  1692. package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
  1693. package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
  1694. package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
  1695. package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
  1696. package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
  1697. package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
  1698. package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
  1699. package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
  1700. package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
  1701. package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
  1702. package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
  1703. package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
  1704. package/vendor/README.md +63 -0
  1705. package/vendor/ability-manifest.mjs +527 -6
  1706. package/vendor/audits/asset-credits.mjs +96 -0
  1707. package/vendor/audits/check-loaders.mjs +80 -0
  1708. package/vendor/audits/perf-gate.mjs +759 -0
  1709. package/vendor/audits/prove-live.mjs +307 -0
  1710. package/vendor/audits/source-audit.mjs +530 -0
  1711. package/vendor/audits/world-audit.mjs +439 -0
  1712. package/vendor/capture-body.glb +0 -0
  1713. package/vendor/capture-face.glb +0 -0
  1714. package/vendor/installed-index.mjs +1 -1
  1715. 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
- const local = node.getMatrix();
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
- return { nodes, jointNames, worldByName, skeletonRootName: rootNode.getName() };
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: KEEPS every canonical bone's local
48
- * REST ROTATION (so target clips apply natively) but sets each bone's WORLD POSITION to the source's
49
- * corresponding joint — directly for mapped bones, and for unmapped in-betweens (spine_02/04, neck_02,
50
- * twists, fingers) by scaling their canonical offset-from-parent by the enclosing mapped segment's
51
- * scale. The result is a rig with canonical orientations at the source's own joint positions, so the
52
- * source mesh binds to it UNCHANGED (no shape distortion — the whole point vs. re-posing the mesh).
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
- desired.set(def.name, canonPos(def.name));
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
- else {
74
- const s = scaleBy.get(def.parent) ?? 1;
75
- desired.set(def.name, [pPos[0] + canonOff[0] * s, pPos[1] + canonOff[1] * s, pPos[2] + canonOff[2] * s]);
76
- scaleBy.set(def.name, s);
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 = canonical local ROTATION + fitted local TRANSLATION; recompute world.
80
- // Exception — CLAVICLE rest-correction: the source's shoulder mesh is authored for its own clavicle
81
- // direction (Meshy is ~horizontal; MetaHuman droops ~9°). Keeping the canonical clavicle rest binds the
82
- // shoulder to the wrong reference, so a SHARED canonical clip drives the animated shoulder ~9° too
83
- // horizontal (a shrug). Fix: rebase ONLY the two clavicle bones' rest ORIENTATION to point along the
84
- // SOURCE clavicle direction. The IBM (inverse of this rest) then re-references the clip — the ~9° gap
85
- // between the clip's canonical clavicle pose and this source-aligned rest becomes the corrective pull,
86
- // so the animated shoulder matches the stock body. Children keep canonical local rotation and ride the
87
- // correction. Positions/proportions untouched (lt kept); rest render stays pristine (M·IBM = I).
88
- const ORIGIN = [0, 0, 0];
89
- const CLAVICLE_CHILD = { clavicle_l: 'upperarm_l', clavicle_r: 'upperarm_r' };
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 (canonical) frame
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
- const clavChild = CLAVICLE_CHILD[def.name];
98
- if (clavChild !== undefined && directPos.has(def.name) && directPos.has(clavChild)) {
99
- const srcDir = (0, mat4_1.normalize3)((0, mat4_1.sub3)(directPos.get(clavChild), directPos.get(def.name))); // warrior clavicle dir
100
- const canonDir = (0, mat4_1.normalize3)((0, mat4_1.sub3)(canonPos(clavChild), canonPos(def.name))); // canonical clavicle dir
101
- const O = (0, mat4_1.mul4)((0, mat4_1.frameFromAxis)(canonDir, ORIGIN), (0, mat4_1.invert4)((0, mat4_1.frameFromAxis)(srcDir, ORIGIN))); // world src->canon
102
- const worldRotDes = (0, mat4_1.mul4)((0, mat4_1.invert4)(O), (0, mat4_1.rigidize)(canon.worldByName.get(def.name))); // canon->src rest world
103
- rot = (0, mat4_1.mul4)((0, mat4_1.invert4)((0, mat4_1.rigidize)(parentWorld)), worldRotDes); // back to local
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 bone orientations at the source's joint
116
- * positions, §fitSkeletonToWarrior). Clips — authored as local rotations relative to the canonical rest
117
- * — produce the correct WORLD-space motion regardless of the source's bone-axis convention, because the
118
- * mesh rides the bones in world space (we never route the mesh through mismatched local frames). Output
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
- const p = parentNode(cur);
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 parentIdx = wjoints.map((j) => { const p = parentNode(j); return p !== null && idxByNode.has(p) ? idxByNode.get(p) : -1; });
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
- const Tsrc = wjoints.map((j) => posOf(j.getWorldMatrix()));
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
- const rig = mode === 'embed' ? fitSkeletonToWarrior(canon, directPos) : canon;
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 D = mode === 'repose' ? wjoints.map((_, i) => {
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
- return (0, mat4_1.mul4)((0, mat4_1.frameFromAxis)(axisDst, Tdst(helixByWarriorIdx[i])), (0, mat4_1.invert4)((0, mat4_1.frameFromAxis)(axisSrc, Tsrc[i])));
182
- }) : null;
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 node of root.listNodes()) {
194
- if (node.getSkin() !== wskin || node.getMesh() === null)
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
- for (const prim of node.getMesh().listPrimitives()) {
197
- const setCount = prim.listSemantics().filter((s) => s.startsWith('JOINTS_')).length;
198
- if (setCount === 0)
199
- continue;
200
- const pos = prim.getAttribute('POSITION');
201
- const nrm = prim.getAttribute('NORMAL');
202
- const vCount = pos.getCount();
203
- const jointSets = Array.from({ length: setCount }, (_, s) => new Uint32Array(prim.getAttribute(`JOINTS_${s}`).getArray()));
204
- if (D !== null) {
205
- const weightSets = Array.from({ length: setCount }, (_, s) => prim.getAttribute(`WEIGHTS_${s}`).getArray());
206
- const posArr = Float32Array.from(pos.getArray());
207
- const nrmArr = nrm !== null ? Float32Array.from(nrm.getArray()) : null;
208
- for (let v = 0; v < vCount; v++) {
209
- const p = [posArr[v * 3], posArr[v * 3 + 1], posArr[v * 3 + 2]];
210
- const n = nrmArr !== null ? [nrmArr[v * 3], nrmArr[v * 3 + 1], nrmArr[v * 3 + 2]] : null;
211
- let px = 0, py = 0, pz = 0, nx = 0, ny = 0, nz = 0, wsum = 0;
212
- for (let s = 0; s < setCount; s++)
213
- for (let c = 0; c < 4; c++) {
214
- const w = weightSets[s][v * 4 + c];
215
- if (w === 0)
216
- continue;
217
- const d = D[jointSets[s][v * 4 + c]];
218
- const tp = (0, mat4_1.transformPoint)(d, p);
219
- px += w * tp[0];
220
- py += w * tp[1];
221
- pz += w * tp[2];
222
- if (n !== null) {
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
- pos.setArray(posArr);
246
- if (nrm !== null && nrmArr !== null)
247
- nrm.setArray(nrmArr);
713
+ if (wsum > 0) {
714
+ px /= wsum;
715
+ py /= wsum;
716
+ pz /= wsum;
248
717
  }
249
- for (let s = 0; s < setCount; s++) {
250
- const src = jointSets[s];
251
- const out = new Uint16Array(src.length);
252
- for (let k = 0; k < src.length; k++)
253
- out[k] = newIndexForWarriorIdx[src[k]];
254
- prim.getAttribute(`JOINTS_${s}`).setArray(out);
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.listScenes()[0].addChild(skeletonRoot);
269
- const newIbm = new Float32Array(rig.jointNames.length * 16);
270
- rig.jointNames.forEach((name, i) => newIbm.set((0, mat4_1.invert4)(rig.worldByName.get(name)), i * 16));
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 { mode, verticesProcessed, jointsRebuilt: rig.jointNames.length, weightTargets };
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