@holoscript/core 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/README.md +2 -2
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-276GE64O.js +16 -0
  4. package/dist/GLTFPipeline-M7WSSJED.cjs +37 -0
  5. package/dist/HoloScriptPlusParser-7FBIFUFC.js +693 -0
  6. package/dist/HoloScriptPlusParser-A2W7OCN2.cjs +698 -0
  7. package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
  8. package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
  9. package/dist/HoloScriptRuntime-3URVTKPJ.js +10 -0
  10. package/dist/HoloScriptRuntime-SXEAEU2N.cjs +19 -0
  11. package/dist/USDZExporter-3FWJ25JI.cjs +1037 -0
  12. package/dist/USDZExporter-D2HQLQYK.js +1035 -0
  13. package/dist/agents/index.cjs +19 -0
  14. package/dist/agents/index.d.ts +100 -0
  15. package/dist/agents/index.js +17 -0
  16. package/dist/chunk-23J755AR.js +1046 -0
  17. package/dist/chunk-253GBQZY.cjs +627 -0
  18. package/dist/chunk-25IQCHTO.cjs +781 -0
  19. package/dist/chunk-2BSMSUCE.js +1941 -0
  20. package/dist/chunk-2M2DPHKB.js +762 -0
  21. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  22. package/dist/chunk-3AO425MZ.cjs +886 -0
  23. package/dist/chunk-3FOKASKO.cjs +348 -0
  24. package/dist/chunk-3HYYMEXI.cjs +56578 -0
  25. package/dist/chunk-3NFFOWGG.js +4287 -0
  26. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  27. package/dist/chunk-4C57PR42.js +468 -0
  28. package/dist/chunk-4N4SXXWF.js +769 -0
  29. package/dist/chunk-4PDEPEQW.cjs +41 -0
  30. package/dist/chunk-4R6SBXDB.js +45 -0
  31. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  32. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  33. package/dist/chunk-5GLCTO44.js +161 -0
  34. package/dist/chunk-5JEU52DW.js +382 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-62FBK3B7.js +70 -0
  38. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  39. package/dist/chunk-6DPSFNJB.cjs +847 -0
  40. package/dist/chunk-6EX3I5P4.cjs +130 -0
  41. package/dist/chunk-73FELZVJ.cjs +611 -0
  42. package/dist/chunk-7CUEMLDZ.cjs +6445 -0
  43. package/dist/chunk-7HIASF7S.cjs +814 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-AIA52I7T.cjs +543 -0
  46. package/dist/chunk-ANXZFVY2.js +113 -0
  47. package/dist/chunk-AYBXB26F.js +2176 -0
  48. package/dist/chunk-B4TFTDG4.js +449 -0
  49. package/dist/chunk-BE4UJCQT.js +623 -0
  50. package/dist/chunk-BRQJKJGT.cjs +20 -0
  51. package/dist/chunk-C2A5DUMF.cjs +689 -0
  52. package/dist/chunk-C37BHB7N.cjs +636 -0
  53. package/dist/chunk-CBJY23VL.js +126 -0
  54. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  55. package/dist/chunk-CXFDRBQU.cjs +672 -0
  56. package/dist/chunk-D54CNIAJ.cjs +413 -0
  57. package/dist/chunk-DAJXW4KX.js +725 -0
  58. package/dist/chunk-DTGBOSEM.cjs +319 -0
  59. package/dist/chunk-E7JP3BS3.cjs +61 -0
  60. package/dist/chunk-EKBKLK7P.js +1169 -0
  61. package/dist/chunk-EKYL4PE3.cjs +404 -0
  62. package/dist/chunk-EUDQTK7N.cjs +4310 -0
  63. package/dist/chunk-EXKSFGSX.cjs +274 -0
  64. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  65. package/dist/chunk-F43YAA34.js +623 -0
  66. package/dist/chunk-FDSGHPAK.js +130 -0
  67. package/dist/chunk-FEWUHQNM.cjs +144 -0
  68. package/dist/chunk-FGGJQRLZ.js +270 -0
  69. package/dist/chunk-FHP6LXJS.js +415 -0
  70. package/dist/chunk-FJPADH77.cjs +666 -0
  71. package/dist/chunk-FYSPZT4V.cjs +169 -0
  72. package/dist/chunk-GIOYPNTH.js +5575 -0
  73. package/dist/chunk-GJNCFRJU.cjs +125 -0
  74. package/dist/chunk-GMP623FG.cjs +1508 -0
  75. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  76. package/dist/chunk-GQT4TYKY.cjs +4381 -0
  77. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  78. package/dist/chunk-GYZE55MO.js +2007 -0
  79. package/dist/chunk-GZG4KA4E.js +529 -0
  80. package/dist/chunk-H652NHX5.js +600 -0
  81. package/dist/chunk-HCCQLAA4.cjs +74 -0
  82. package/dist/chunk-HINXWAOD.cjs +1049 -0
  83. package/dist/chunk-HYNTS5CP.js +422 -0
  84. package/dist/chunk-HZSPDCXV.cjs +457 -0
  85. package/dist/chunk-HZTDET3N.js +1399 -0
  86. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  87. package/dist/chunk-ILRBGFVD.cjs +72 -0
  88. package/dist/chunk-IPWSXCCN.js +1183 -0
  89. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  90. package/dist/chunk-IVSZDECV.js +882 -0
  91. package/dist/chunk-IVY74O6C.js +247 -0
  92. package/dist/chunk-IZM5VQZD.js +714 -0
  93. package/dist/chunk-J32ZJZJH.js +554 -0
  94. package/dist/chunk-J6M4FPK5.js +421 -0
  95. package/dist/chunk-JC5YBPSF.cjs +984 -0
  96. package/dist/chunk-JCLBKPMX.js +3813 -0
  97. package/dist/chunk-JD7CIZ33.js +1949 -0
  98. package/dist/chunk-JIYN45TV.cjs +2525 -0
  99. package/dist/chunk-JJBE3TIH.cjs +1189 -0
  100. package/dist/chunk-JX7YL6ZE.js +2252 -0
  101. package/dist/chunk-K4VVR7CN.cjs +2433 -0
  102. package/dist/chunk-KEFNV2WM.cjs +2257 -0
  103. package/dist/chunk-KH4CNH66.cjs +424 -0
  104. package/dist/chunk-KJLB4OPV.js +5731 -0
  105. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  106. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  107. package/dist/chunk-KPJL34Y7.cjs +186 -0
  108. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  109. package/dist/chunk-KVRSTFNH.cjs +72 -0
  110. package/dist/chunk-LICPB5HZ.cjs +1409 -0
  111. package/dist/chunk-LM2VU56C.cjs +37 -0
  112. package/dist/chunk-M56JSP4A.js +400 -0
  113. package/dist/chunk-MBOOR7X4.js +18 -0
  114. package/dist/chunk-MGE5Z4GS.js +608 -0
  115. package/dist/chunk-MXFUTKCO.js +56 -0
  116. package/dist/chunk-MYY4PMWX.cjs +264 -0
  117. package/dist/chunk-N75IH2HY.js +258 -0
  118. package/dist/chunk-NBMHU6SW.js +669 -0
  119. package/dist/chunk-NG77ATEW.cjs +778 -0
  120. package/dist/chunk-NGKREZ36.js +6384 -0
  121. package/dist/chunk-NHWSN2SD.cjs +718 -0
  122. package/dist/chunk-NV4VMVXU.js +421 -0
  123. package/dist/chunk-NW5G5FBQ.js +215 -0
  124. package/dist/chunk-NXZFOPVD.cjs +5737 -0
  125. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  126. package/dist/chunk-OIQYIIO3.cjs +473 -0
  127. package/dist/chunk-OL46QLBJ.js +61 -0
  128. package/dist/chunk-OMXII44L.js +5386 -0
  129. package/dist/chunk-OR4Q2BGL.cjs +759 -0
  130. package/dist/chunk-OSYNRVOV.cjs +243 -0
  131. package/dist/chunk-PGANYCAG.cjs +220 -0
  132. package/dist/chunk-PHENW4MQ.js +65 -0
  133. package/dist/chunk-PHVRG4I2.js +844 -0
  134. package/dist/chunk-Q56TT7IL.js +483 -0
  135. package/dist/chunk-QPOQ7VPI.js +1491 -0
  136. package/dist/chunk-QPSKHBJP.js +5963 -0
  137. package/dist/chunk-QXH7QDSZ.js +1989 -0
  138. package/dist/chunk-R75BSDH7.cjs +50 -0
  139. package/dist/chunk-RARB3MBR.js +207 -0
  140. package/dist/chunk-RVBHAXFG.js +56160 -0
  141. package/dist/chunk-S3MDHNKB.cjs +490 -0
  142. package/dist/chunk-S4W6Z2MN.js +2426 -0
  143. package/dist/chunk-S6YWHCKV.cjs +410 -0
  144. package/dist/chunk-SIEXCILW.js +229 -0
  145. package/dist/chunk-SJBGLS25.cjs +2196 -0
  146. package/dist/chunk-SLU6UPJI.cjs +410 -0
  147. package/dist/chunk-SMIWS6DE.cjs +212 -0
  148. package/dist/chunk-T2QCTZMO.js +811 -0
  149. package/dist/chunk-T5J7ZKP3.cjs +4885 -0
  150. package/dist/chunk-TDCNJHWO.js +341 -0
  151. package/dist/chunk-TG7O4WBC.js +406 -0
  152. package/dist/chunk-THCK6ECW.js +2085 -0
  153. package/dist/chunk-TJHVSBP2.js +439 -0
  154. package/dist/chunk-TVHSPJ4N.cjs +606 -0
  155. package/dist/chunk-U44IKGG7.cjs +5390 -0
  156. package/dist/chunk-UJXISJBN.js +487 -0
  157. package/dist/chunk-UM6C3CGK.js +4375 -0
  158. package/dist/chunk-UMABK6SI.js +686 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-V6MKC2FZ.js +979 -0
  162. package/dist/chunk-VECQYRXL.js +474 -0
  163. package/dist/chunk-VJ3L7CHT.cjs +169 -0
  164. package/dist/chunk-VMLKSV26.js +1216 -0
  165. package/dist/chunk-VVKVQZI6.js +55 -0
  166. package/dist/chunk-W6RW64BB.cjs +1219 -0
  167. package/dist/chunk-W7VDOASB.cjs +639 -0
  168. package/dist/chunk-WDT3JTGM.cjs +483 -0
  169. package/dist/chunk-WJIHFLMJ.js +404 -0
  170. package/dist/chunk-WKX5AMOY.js +309 -0
  171. package/dist/chunk-WNNE3PO3.js +34 -0
  172. package/dist/chunk-WRKUDAZJ.js +3038 -0
  173. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  174. package/dist/chunk-WRNEH5MO.js +3169 -0
  175. package/dist/chunk-WRWEX5ZF.js +658 -0
  176. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  177. package/dist/chunk-XHIV6326.cjs +793 -0
  178. package/dist/chunk-XIVIE43A.cjs +729 -0
  179. package/dist/chunk-XJAN7CZG.cjs +432 -0
  180. package/dist/chunk-XKTPFXGA.js +164 -0
  181. package/dist/chunk-XL6INWKT.js +121 -0
  182. package/dist/chunk-XSFNHP2E.js +632 -0
  183. package/dist/chunk-XT6JY5W5.js +9684 -0
  184. package/dist/chunk-XUILI4KB.cjs +430 -0
  185. package/dist/chunk-XUUVDHIF.cjs +3962 -0
  186. package/dist/chunk-YF2I3MV3.js +46 -0
  187. package/dist/chunk-YIMN575O.js +4847 -0
  188. package/dist/chunk-YIVFJNYV.js +176 -0
  189. package/dist/chunk-YKGPCZEE.cjs +237 -0
  190. package/dist/chunk-YN6V7R3L.cjs +327 -0
  191. package/dist/chunk-YQELFNJV.js +39 -0
  192. package/dist/chunk-YYXH45E2.js +426 -0
  193. package/dist/chunk-ZBQXLH2L.js +756 -0
  194. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  195. package/dist/chunk-ZU7NIRT6.js +325 -0
  196. package/dist/chunk-ZZ7RO2UQ.js +1243 -0
  197. package/dist/chunk-ZZEI7MV4.js +778 -0
  198. package/dist/cli/holoscript-runner.cjs +2255 -0
  199. package/dist/cli/holoscript-runner.js +2230 -0
  200. package/dist/codebase/index.cjs +336 -0
  201. package/dist/codebase/index.js +331 -0
  202. package/dist/compiler/agent-inference.cjs +31 -0
  203. package/dist/compiler/agent-inference.js +8 -0
  204. package/dist/compiler/android-xr.cjs +24 -0
  205. package/dist/compiler/android-xr.js +14 -0
  206. package/dist/compiler/android.cjs +24 -0
  207. package/dist/compiler/android.js +14 -0
  208. package/dist/compiler/ar.cjs +23 -0
  209. package/dist/compiler/ar.js +11 -0
  210. package/dist/compiler/babylon.cjs +21 -0
  211. package/dist/compiler/babylon.js +15 -0
  212. package/dist/compiler/business-quest.cjs +43 -0
  213. package/dist/compiler/business-quest.js +4 -0
  214. package/dist/compiler/coco.cjs +27 -0
  215. package/dist/compiler/coco.js +4 -0
  216. package/dist/compiler/context.cjs +25 -0
  217. package/dist/compiler/context.d.ts +28 -0
  218. package/dist/compiler/context.js +8 -0
  219. package/dist/compiler/domain-block-utils.cjs +605 -0
  220. package/dist/compiler/domain-block-utils.js +11 -0
  221. package/dist/compiler/dtdl.cjs +27 -0
  222. package/dist/compiler/dtdl.js +11 -0
  223. package/dist/compiler/gltf-pipeline.cjs +39 -0
  224. package/dist/compiler/gltf-pipeline.js +4 -0
  225. package/dist/compiler/godot.cjs +18 -0
  226. package/dist/compiler/godot.js +12 -0
  227. package/dist/compiler/incremental.cjs +34 -0
  228. package/dist/compiler/incremental.js +9 -0
  229. package/dist/compiler/index.cjs +5860 -0
  230. package/dist/compiler/index.d.ts +322 -21
  231. package/dist/compiler/index.js +5525 -0
  232. package/dist/compiler/ios.cjs +23 -0
  233. package/dist/compiler/ios.js +13 -0
  234. package/dist/compiler/llm-provider-capabilities.cjs +25 -0
  235. package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
  236. package/dist/compiler/llm-provider-capabilities.js +8 -0
  237. package/dist/compiler/multi-layer.cjs +24 -0
  238. package/dist/compiler/multi-layer.js +15 -0
  239. package/dist/compiler/nodetoy.cjs +23 -0
  240. package/dist/compiler/nodetoy.js +4 -0
  241. package/dist/compiler/openxr.cjs +19 -0
  242. package/dist/compiler/openxr.js +13 -0
  243. package/dist/compiler/playcanvas.cjs +19 -0
  244. package/dist/compiler/playcanvas.js +13 -0
  245. package/dist/compiler/r3f.cjs +38 -0
  246. package/dist/compiler/r3f.d.ts +22 -0
  247. package/dist/compiler/r3f.js +16 -0
  248. package/dist/compiler/remotion.cjs +23 -0
  249. package/dist/compiler/remotion.js +4 -0
  250. package/dist/compiler/reproducibility.cjs +39 -0
  251. package/dist/compiler/reproducibility.js +4 -0
  252. package/dist/compiler/sdf.cjs +24 -0
  253. package/dist/compiler/sdf.js +12 -0
  254. package/dist/compiler/semantic-scene.cjs +31 -0
  255. package/dist/compiler/semantic-scene.js +4 -0
  256. package/dist/compiler/state.cjs +21 -0
  257. package/dist/compiler/state.js +11 -0
  258. package/dist/compiler/trait-composition.cjs +30 -0
  259. package/dist/compiler/trait-composition.js +9 -0
  260. package/dist/compiler/unity.cjs +19 -0
  261. package/dist/compiler/unity.js +13 -0
  262. package/dist/compiler/unreal.cjs +23 -0
  263. package/dist/compiler/unreal.js +13 -0
  264. package/dist/compiler/urdf.cjs +52 -0
  265. package/dist/compiler/urdf.js +12 -0
  266. package/dist/compiler/usd-physics.cjs +26 -0
  267. package/dist/compiler/usd-physics.js +9 -0
  268. package/dist/compiler/visionos.cjs +19 -0
  269. package/dist/compiler/visionos.js +13 -0
  270. package/dist/compiler/vrchat.cjs +22 -0
  271. package/dist/compiler/vrchat.js +12 -0
  272. package/dist/compiler/vrr.cjs +24 -0
  273. package/dist/compiler/vrr.js +12 -0
  274. package/dist/compiler/wasm.cjs +36 -0
  275. package/dist/compiler/wasm.js +12 -0
  276. package/dist/compiler/webgpu.cjs +18 -0
  277. package/dist/compiler/webgpu.js +12 -0
  278. package/dist/coordinators/index.cjs +1266 -0
  279. package/dist/coordinators/index.d.ts +72 -1
  280. package/dist/coordinators/index.js +1259 -0
  281. package/dist/debugger.cjs +24 -0
  282. package/dist/debugger.js +11 -0
  283. package/dist/entries/interop.cjs +64 -0
  284. package/dist/entries/interop.js +7 -0
  285. package/dist/entries/scripting.cjs +55 -0
  286. package/dist/entries/scripting.js +10 -0
  287. package/dist/hololand/index.cjs +146 -0
  288. package/dist/hololand/index.d.ts +70 -0
  289. package/dist/hololand/index.js +5 -0
  290. package/dist/index.cjs +43233 -0
  291. package/dist/index.d.ts +976 -21
  292. package/dist/index.js +39995 -0
  293. package/dist/math/tropical-spmv.cjs +45 -0
  294. package/dist/math/tropical-spmv.js +4 -0
  295. package/dist/math/vec3.cjs +57 -0
  296. package/dist/math/vec3.js +4 -0
  297. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  298. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  299. package/dist/paper-0c-spike/index.cjs +150 -0
  300. package/dist/paper-0c-spike/index.js +141 -0
  301. package/dist/parser.cjs +61 -0
  302. package/dist/parser.d.ts +11 -0
  303. package/dist/parser.js +12 -0
  304. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  305. package/dist/playwright-VZPDVUEQ.js +98660 -0
  306. package/dist/reconstruction/index.cjs +153 -0
  307. package/dist/reconstruction/index.d.ts +29 -2
  308. package/dist/reconstruction/index.js +8 -0
  309. package/dist/runtime.cjs +316 -0
  310. package/dist/runtime.d.ts +61 -0
  311. package/dist/runtime.js +31 -0
  312. package/dist/self-improvement/index.cjs +563 -0
  313. package/dist/self-improvement/index.js +545 -0
  314. package/dist/storage/index.cjs +38 -0
  315. package/dist/storage/index.js +5 -0
  316. package/dist/testing.cjs +25 -0
  317. package/dist/testing.d.ts +70 -0
  318. package/dist/testing.js +4 -0
  319. package/dist/traitDocs/traitDocs.cjs +33 -0
  320. package/dist/traitDocs/traitDocs.js +7 -0
  321. package/dist/traits/botanical-lotus.cjs +41 -0
  322. package/dist/traits/botanical-lotus.d.ts +172 -0
  323. package/dist/traits/botanical-lotus.js +4 -0
  324. package/dist/traits/engines/index.cjs +520 -0
  325. package/dist/traits/engines/index.js +380 -0
  326. package/dist/traits/index.cjs +24409 -0
  327. package/dist/traits/index.d.ts +171 -35
  328. package/dist/traits/index.js +21634 -0
  329. package/dist/traits/simulation-solver-factory.cjs +13 -0
  330. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  331. package/dist/traits/simulation-solver-factory.js +4 -0
  332. package/dist/traits/webcam-gaze.cjs +35 -0
  333. package/dist/traits/webcam-gaze.d.ts +17 -0
  334. package/dist/traits/webcam-gaze.js +4 -0
  335. package/dist/type-checker.cjs +19 -0
  336. package/dist/type-checker.js +6 -0
  337. package/dist/world/index.cjs +947 -0
  338. package/dist/world/index.d.ts +147 -0
  339. package/dist/world/index.js +939 -0
  340. package/dist/world-model/index.cjs +1446 -0
  341. package/dist/world-model/index.d.ts +119 -0
  342. package/dist/world-model/index.js +1414 -0
  343. package/dist/wot/index.cjs +29 -0
  344. package/dist/wot/index.js +4 -0
  345. package/package.json +93 -49
@@ -0,0 +1,886 @@
1
+ 'use strict';
2
+
3
+ var chunkXUUVDHIF_cjs = require('./chunk-XUUVDHIF.cjs');
4
+ var chunkKKP7JKN4_cjs = require('./chunk-KKP7JKN4.cjs');
5
+ var ans = require('@holoscript/core-types/ans');
6
+
7
+ // src/compiler/USDPhysicsCompiler.ts
8
+ chunkKKP7JKN4_cjs.init_CompilerBase();
9
+ chunkXUUVDHIF_cjs.init_DomainBlockCompilerMixin();
10
+ var USDPhysicsCompiler = class extends chunkKKP7JKN4_cjs.CompilerBase {
11
+ constructor(options = {}) {
12
+ super();
13
+ this.compilerName = "USDPhysicsCompiler";
14
+ this.lines = [];
15
+ /** Root composition name, set during compile() for USD path resolution. */
16
+ this.compositionName = "World";
17
+ this.indentLevel = 0;
18
+ this.prims = [];
19
+ this.joints = [];
20
+ this.materials = /* @__PURE__ */ new Map();
21
+ this.options = {
22
+ stageName: options.stageName ?? "HoloScriptPhysicsStage",
23
+ upAxis: options.upAxis ?? "Z",
24
+ // Isaac Sim default
25
+ metersPerUnit: options.metersPerUnit ?? 1,
26
+ timeCodesPerSecond: options.timeCodesPerSecond ?? 60,
27
+ includePhysicsScene: options.includePhysicsScene ?? true,
28
+ gravity: options.gravity ?? [0, 0, -9.81],
29
+ physicsTimestep: options.physicsTimestep ?? 1 / 60,
30
+ enableGPUDynamics: options.enableGPUDynamics ?? true,
31
+ includeCollision: options.includeCollision ?? true,
32
+ includeVisual: options.includeVisual ?? true,
33
+ defaultMass: options.defaultMass ?? 1,
34
+ defaultStaticFriction: options.defaultStaticFriction ?? 0.5,
35
+ defaultDynamicFriction: options.defaultDynamicFriction ?? 0.5,
36
+ defaultRestitution: options.defaultRestitution ?? 0.1,
37
+ enableArticulation: options.enableArticulation ?? true,
38
+ targetContext: options.targetContext ?? "isaac_sim",
39
+ embedSemanticAST: options.embedSemanticAST ?? true,
40
+ provenanceHash: options.provenanceHash ?? ""
41
+ };
42
+ }
43
+ getRequiredCapability() {
44
+ return ans.ANSCapabilityPath.USD;
45
+ }
46
+ // ===========================================================================
47
+ // HELPER METHODS
48
+ // ===========================================================================
49
+ /** Get trait name from either string or object format */
50
+ getTraitName(trait) {
51
+ return typeof trait === "string" ? trait : trait.name;
52
+ }
53
+ /** Check if object has a specific trait */
54
+ hasTrait(obj, traitName) {
55
+ return obj.traits?.some((t) => this.getTraitName(t) === traitName) ?? false;
56
+ }
57
+ /** Get trait configuration object */
58
+ getTraitConfig(obj, traitName) {
59
+ const trait = obj.traits?.find((t) => this.getTraitName(t) === traitName);
60
+ if (!trait) return void 0;
61
+ if (typeof trait === "string") return {};
62
+ const traitObj = trait;
63
+ if ("config" in traitObj && typeof traitObj.config === "object") {
64
+ return traitObj.config;
65
+ }
66
+ const { name: _name, ...rest } = traitObj;
67
+ if (rest.type === "ObjectTrait") {
68
+ const { type: _type, ...config } = rest;
69
+ return config;
70
+ }
71
+ return rest;
72
+ }
73
+ /** Sanitize name for USD path */
74
+ sanitizeName(name) {
75
+ let sanitized = name.replace(/[^a-zA-Z0-9_]/g, "_");
76
+ if (/^[0-9]/.test(sanitized)) {
77
+ sanitized = "_" + sanitized;
78
+ }
79
+ return sanitized;
80
+ }
81
+ /** Emit a line with current indent */
82
+ emit(line) {
83
+ const indent = " ".repeat(this.indentLevel);
84
+ this.lines.push(indent + line);
85
+ }
86
+ /** Emit empty line */
87
+ emitBlank() {
88
+ this.lines.push("");
89
+ }
90
+ /** Get property value from object properties array */
91
+ getPropertyValue(obj, key) {
92
+ const prop = obj.properties?.find((p) => p.key === key);
93
+ return prop?.value;
94
+ }
95
+ /** Extract position from object properties */
96
+ extractPosition(obj) {
97
+ const pos = this.getPropertyValue(obj, "position");
98
+ if (Array.isArray(pos) && pos.length >= 3) {
99
+ return [Number(pos[0]) || 0, Number(pos[1]) || 0, Number(pos[2]) || 0];
100
+ }
101
+ return [0, 0, 0];
102
+ }
103
+ /** Extract rotation as quaternion from object properties */
104
+ extractRotation(obj) {
105
+ const rot = this.getPropertyValue(obj, "rotation");
106
+ if (Array.isArray(rot) && rot.length >= 3) {
107
+ const euler = [
108
+ (Number(rot[0]) || 0) * (Math.PI / 180),
109
+ (Number(rot[1]) || 0) * (Math.PI / 180),
110
+ (Number(rot[2]) || 0) * (Math.PI / 180)
111
+ ];
112
+ return this.eulerToQuaternion(euler[0], euler[1], euler[2]);
113
+ }
114
+ return [0, 0, 0, 1];
115
+ }
116
+ /** Convert Euler angles (radians) to quaternion */
117
+ eulerToQuaternion(roll, pitch, yaw) {
118
+ const cy = Math.cos(yaw * 0.5);
119
+ const sy = Math.sin(yaw * 0.5);
120
+ const cp = Math.cos(pitch * 0.5);
121
+ const sp = Math.sin(pitch * 0.5);
122
+ const cr = Math.cos(roll * 0.5);
123
+ const sr = Math.sin(roll * 0.5);
124
+ return [
125
+ sr * cp * cy - cr * sp * sy,
126
+ // x
127
+ cr * sp * cy + sr * cp * sy,
128
+ // y
129
+ cr * cp * sy - sr * sp * cy,
130
+ // z
131
+ cr * cp * cy + sr * sp * sy
132
+ // w
133
+ ];
134
+ }
135
+ /** Extract scale from object properties */
136
+ extractScale(obj) {
137
+ const scale = this.getPropertyValue(obj, "scale");
138
+ if (Array.isArray(scale) && scale.length >= 3) {
139
+ return [Number(scale[0]) || 1, Number(scale[1]) || 1, Number(scale[2]) || 1];
140
+ }
141
+ if (typeof scale === "number") {
142
+ return [scale, scale, scale];
143
+ }
144
+ return [1, 1, 1];
145
+ }
146
+ /** Extract geometry type from object */
147
+ extractGeometry(obj) {
148
+ const geom = this.getPropertyValue(obj, "geometry");
149
+ if (!geom) return void 0;
150
+ const geomType = String(geom);
151
+ const scale = this.extractScale(obj);
152
+ switch (geomType) {
153
+ case "cube":
154
+ case "box":
155
+ return { type: "Cube", size: scale };
156
+ case "sphere":
157
+ return { type: "Sphere", radius: Math.max(...scale) / 2 };
158
+ case "cylinder":
159
+ return { type: "Cylinder", radius: Math.max(scale[0], scale[2]) / 2 };
160
+ case "capsule":
161
+ return { type: "Capsule", radius: Math.max(scale[0], scale[2]) / 2 };
162
+ case "cone":
163
+ return { type: "Cone", radius: Math.max(scale[0], scale[2]) / 2 };
164
+ default:
165
+ if (geomType.endsWith(".usd") || geomType.endsWith(".usda") || geomType.endsWith(".usdc")) {
166
+ return { type: "Reference", size: scale };
167
+ }
168
+ return { type: "Cube", size: scale };
169
+ }
170
+ }
171
+ /** Map HoloScript joint types to USD joint types */
172
+ mapJointType(holoType) {
173
+ switch (holoType) {
174
+ case "hinge":
175
+ case "revolute":
176
+ return "revolute";
177
+ case "slider":
178
+ case "prismatic":
179
+ return "prismatic";
180
+ case "ball":
181
+ case "spherical":
182
+ return "spherical";
183
+ case "fixed":
184
+ return "fixed";
185
+ case "6dof":
186
+ case "d6":
187
+ return "d6";
188
+ default:
189
+ return "fixed";
190
+ }
191
+ }
192
+ /** Map axis string to USD axis */
193
+ mapAxis(axis) {
194
+ if (Array.isArray(axis)) {
195
+ const absX = Math.abs(Number(axis[0]) || 0);
196
+ const absY = Math.abs(Number(axis[1]) || 0);
197
+ const absZ = Math.abs(Number(axis[2]) || 0);
198
+ if (absX >= absY && absX >= absZ) return "X";
199
+ if (absY >= absX && absY >= absZ) return "Y";
200
+ return "Z";
201
+ }
202
+ const axisStr = String(axis).toUpperCase();
203
+ if (axisStr === "X" || axisStr === "Y" || axisStr === "Z") {
204
+ return axisStr;
205
+ }
206
+ return "Z";
207
+ }
208
+ // ===========================================================================
209
+ // COMPILATION
210
+ // ===========================================================================
211
+ /**
212
+ * Compile HoloScript composition to USD ASCII with physics schemas
213
+ */
214
+ compile(composition, agentToken, outputPath) {
215
+ this.validateCompilerAccess(agentToken, outputPath);
216
+ this.compositionName = this.sanitizeName(composition.name);
217
+ this.lines = [];
218
+ this.prims = [];
219
+ this.joints = [];
220
+ this.materials.clear();
221
+ this.indentLevel = 0;
222
+ this.extractFromComposition(composition);
223
+ this.emitHeader(composition.name);
224
+ this.emitBlank();
225
+ this.emit(`def Xform "${this.sanitizeName(composition.name)}" (`);
226
+ this.indentLevel++;
227
+ this.emit(`kind = "component"`);
228
+ this.indentLevel--;
229
+ this.emit(`)
230
+ {`);
231
+ this.indentLevel++;
232
+ if (this.options.embedSemanticAST) {
233
+ this.emitSemanticCustomData(composition);
234
+ this.emitBlank();
235
+ }
236
+ if (this.options.includePhysicsScene) {
237
+ this.emitPhysicsScene();
238
+ this.emitBlank();
239
+ }
240
+ if (this.materials.size > 0) {
241
+ this.emitPhysicsMaterials();
242
+ this.emitBlank();
243
+ }
244
+ const isRobot = this.prims.some(
245
+ (p) => p.apis.some((a) => a.type === "PhysicsArticulationRootAPI")
246
+ );
247
+ if (isRobot && this.options.enableArticulation) {
248
+ this.emitArticulationRoot();
249
+ } else {
250
+ for (const prim of this.prims) {
251
+ this.emitPrim(prim);
252
+ this.emitBlank();
253
+ }
254
+ }
255
+ for (const joint of this.joints) {
256
+ this.emitJoint(joint);
257
+ this.emitBlank();
258
+ }
259
+ const domainBlocks = composition.domainBlocks ?? [];
260
+ if (domainBlocks.length > 0) {
261
+ this.emitBlank();
262
+ this.emit(`# === v4.2 Domain Blocks ===`);
263
+ const compiled = chunkXUUVDHIF_cjs.compileDomainBlocks(
264
+ domainBlocks,
265
+ {
266
+ material: (block) => {
267
+ const mat = chunkXUUVDHIF_cjs.compileMaterialBlock(block);
268
+ return chunkXUUVDHIF_cjs.materialToUSD(mat);
269
+ },
270
+ physics: (block) => {
271
+ const phys = chunkXUUVDHIF_cjs.compilePhysicsBlock(block);
272
+ const urdf = chunkXUUVDHIF_cjs.physicsToURDF(phys);
273
+ return `# Physics: ${phys.keyword} "${phys.name || ""}"
274
+ ` + urdf.split("\n").map((l) => `# URDF: ${l}`).join("\n");
275
+ },
276
+ vfx: (block) => {
277
+ const ps = chunkXUUVDHIF_cjs.compileParticleBlock(block);
278
+ return chunkXUUVDHIF_cjs.particlesToUSD(ps);
279
+ },
280
+ postfx: (block) => {
281
+ const pp = chunkXUUVDHIF_cjs.compilePostProcessingBlock(block);
282
+ return chunkXUUVDHIF_cjs.postProcessingToUSD(pp);
283
+ },
284
+ audio: (block) => {
285
+ const audio = chunkXUUVDHIF_cjs.compileAudioSourceBlock(block);
286
+ return chunkXUUVDHIF_cjs.audioSourceToUSD(audio);
287
+ },
288
+ weather: (block) => {
289
+ const weather = chunkXUUVDHIF_cjs.compileWeatherBlock(block);
290
+ return chunkXUUVDHIF_cjs.weatherToUSD(weather);
291
+ }
292
+ },
293
+ (block) => `# Domain block: ${block.domain}/${block.keyword} "${this.escapeStringValue(block.name, "TypeScript")}"`
294
+ );
295
+ for (const output of compiled) {
296
+ this.emitBlank();
297
+ for (const line of output.split("\n")) {
298
+ this.emit(line);
299
+ }
300
+ }
301
+ }
302
+ this.indentLevel--;
303
+ this.emit(`}`);
304
+ return this.lines.join("\n");
305
+ }
306
+ // ===========================================================================
307
+ // HEADER EMISSION
308
+ // ===========================================================================
309
+ emitHeader(name) {
310
+ const runtimeLabel = this.options.targetContext === "isaac_sim" ? "NVIDIA Isaac Sim / Isaac Lab" : this.options.targetContext === "omniverse" ? "NVIDIA Omniverse" : "Generic USD Runtime";
311
+ this.emit(`#usda 1.0`);
312
+ this.emit(`(`);
313
+ this.indentLevel++;
314
+ this.emit(`defaultPrim = "${this.sanitizeName(name)}"`);
315
+ this.emit(`doc = "Generated by HoloScript USDPhysicsCompiler for ${runtimeLabel}"`);
316
+ this.emit(`metersPerUnit = ${this.options.metersPerUnit}`);
317
+ this.emit(`upAxis = "${this.options.upAxis}"`);
318
+ this.emit(`timeCodesPerSecond = ${this.options.timeCodesPerSecond}`);
319
+ this.emit(`customLayerData = {`);
320
+ this.indentLevel++;
321
+ this.emit(`string generator = "HoloScript v6.0"`);
322
+ this.emit(`string targetRuntime = "${runtimeLabel}"`);
323
+ this.emit(`string holoscript:targetContext = "${this.options.targetContext}"`);
324
+ this.indentLevel--;
325
+ this.emit(`}`);
326
+ this.indentLevel--;
327
+ this.emit(`)`);
328
+ if (this.options.provenanceHash) {
329
+ this.emit(`# Provenance Hash: ${this.options.provenanceHash}`);
330
+ }
331
+ }
332
+ // ===========================================================================
333
+ // PHYSICS SCENE
334
+ // ===========================================================================
335
+ emitPhysicsScene() {
336
+ const gravityMag = Math.sqrt(
337
+ this.options.gravity[0] ** 2 + this.options.gravity[1] ** 2 + this.options.gravity[2] ** 2
338
+ );
339
+ const gravityDir = gravityMag > 0 ? [
340
+ this.options.gravity[0] / gravityMag,
341
+ this.options.gravity[1] / gravityMag,
342
+ this.options.gravity[2] / gravityMag
343
+ ] : [0, 0, -1];
344
+ this.emit(`def PhysicsScene "PhysicsScene"`);
345
+ this.emit(`{`);
346
+ this.indentLevel++;
347
+ this.emit(
348
+ `float3 physics:gravityDirection = (${gravityDir[0]}, ${gravityDir[1]}, ${gravityDir[2]})`
349
+ );
350
+ this.emit(`float physics:gravityMagnitude = ${gravityMag}`);
351
+ this.emit(`# Isaac Sim GPU dynamics`);
352
+ this.emit(`bool physxScene:enableGPUDynamics = ${this.options.enableGPUDynamics}`);
353
+ this.emit(`float physxScene:timestep = ${this.options.physicsTimestep}`);
354
+ this.emit(`uint physxScene:solverType = 1 # TGS solver`);
355
+ this.indentLevel--;
356
+ this.emit(`}`);
357
+ }
358
+ // ===========================================================================
359
+ // PHYSICS MATERIALS
360
+ // ===========================================================================
361
+ emitPhysicsMaterials() {
362
+ this.emit(`def Scope "PhysicsMaterials"`);
363
+ this.emit(`{`);
364
+ this.indentLevel++;
365
+ for (const [_key, mat] of this.materials) {
366
+ this.emit(`def Material "${this.escapeStringValue(mat.name, "TypeScript")}" (`);
367
+ this.indentLevel++;
368
+ this.emit(`prepend apiSchemas = ["PhysicsMaterialAPI"]`);
369
+ this.indentLevel--;
370
+ this.emit(`)`);
371
+ this.emit(`{`);
372
+ this.indentLevel++;
373
+ this.emit(`float physics:staticFriction = ${mat.staticFriction}`);
374
+ this.emit(`float physics:dynamicFriction = ${mat.dynamicFriction}`);
375
+ this.emit(`float physics:restitution = ${mat.restitution}`);
376
+ if (mat.density !== void 0) {
377
+ this.emit(`float physics:density = ${mat.density}`);
378
+ }
379
+ this.indentLevel--;
380
+ this.emit(`}`);
381
+ }
382
+ this.indentLevel--;
383
+ this.emit(`}`);
384
+ }
385
+ // ===========================================================================
386
+ // ARTICULATION ROOT
387
+ // ===========================================================================
388
+ emitArticulationRoot() {
389
+ this.emit(`def Xform "RobotArticulation" (`);
390
+ this.indentLevel++;
391
+ this.emit(`prepend apiSchemas = ["PhysicsArticulationRootAPI"]`);
392
+ this.indentLevel--;
393
+ this.emit(`)`);
394
+ this.emit(`{`);
395
+ this.indentLevel++;
396
+ this.emit(`bool physics:articulationEnabled = true`);
397
+ this.emit(`# Isaac Sim articulation settings`);
398
+ this.emit(`bool physxArticulation:enabledSelfCollisions = false`);
399
+ this.emit(`uint physxArticulation:solverPositionIterationCount = 32`);
400
+ this.emit(`uint physxArticulation:solverVelocityIterationCount = 1`);
401
+ this.emitBlank();
402
+ for (const prim of this.prims) {
403
+ this.emitPrim(prim);
404
+ this.emitBlank();
405
+ }
406
+ this.indentLevel--;
407
+ this.emit(`}`);
408
+ }
409
+ // ===========================================================================
410
+ // PRIM EMISSION
411
+ // ===========================================================================
412
+ emitPrim(prim) {
413
+ const apiSchemas = prim.apis.map((api) => {
414
+ switch (api.type) {
415
+ case "PhysicsRigidBodyAPI":
416
+ return "PhysicsRigidBodyAPI";
417
+ case "PhysicsCollisionAPI":
418
+ return "PhysicsCollisionAPI";
419
+ case "PhysicsMassAPI":
420
+ return "PhysicsMassAPI";
421
+ case "PhysicsArticulationRootAPI":
422
+ return "PhysicsArticulationRootAPI";
423
+ default:
424
+ return null;
425
+ }
426
+ }).filter(Boolean);
427
+ if (apiSchemas.length > 0) {
428
+ const schemasStr = apiSchemas.map((s) => `"${s}"`).join(", ");
429
+ this.emit(
430
+ `def ${prim.typeName} "${this.escapeStringValue(prim.name, "TypeScript")}" (`
431
+ );
432
+ this.indentLevel++;
433
+ this.emit(`prepend apiSchemas = [${schemasStr}]`);
434
+ this.indentLevel--;
435
+ this.emit(`)`);
436
+ } else {
437
+ this.emit(
438
+ `def ${prim.typeName} "${this.escapeStringValue(prim.name, "TypeScript")}"`
439
+ );
440
+ }
441
+ this.emit(`{`);
442
+ this.indentLevel++;
443
+ if (prim.translation) {
444
+ this.emit(
445
+ `double3 xformOp:translate = (${prim.translation[0]}, ${prim.translation[1]}, ${prim.translation[2]})`
446
+ );
447
+ }
448
+ const useEulerRotation = this.options.targetContext === "isaac_sim";
449
+ if (prim.rotation && !this.isIdentityQuaternion(prim.rotation)) {
450
+ if (useEulerRotation) {
451
+ const euler = this.quaternionToEulerDegrees(prim.rotation);
452
+ this.emit(
453
+ `float3 xformOp:rotateXYZ = (${euler[0].toFixed(4)}, ${euler[1].toFixed(4)}, ${euler[2].toFixed(4)})`
454
+ );
455
+ } else {
456
+ this.emit(
457
+ `quatd xformOp:orient = (${prim.rotation[3]}, ${prim.rotation[0]}, ${prim.rotation[1]}, ${prim.rotation[2]})`
458
+ );
459
+ }
460
+ }
461
+ if (prim.scale && !this.isUniformScale(prim.scale)) {
462
+ this.emit(`double3 xformOp:scale = (${prim.scale[0]}, ${prim.scale[1]}, ${prim.scale[2]})`);
463
+ }
464
+ const hasTransform = prim.translation || prim.rotation || prim.scale;
465
+ if (hasTransform) {
466
+ const ops = [];
467
+ if (prim.translation) ops.push('"xformOp:translate"');
468
+ if (prim.rotation && !this.isIdentityQuaternion(prim.rotation)) {
469
+ ops.push(useEulerRotation ? '"xformOp:rotateXYZ"' : '"xformOp:orient"');
470
+ }
471
+ if (prim.scale && !this.isUniformScale(prim.scale)) ops.push('"xformOp:scale"');
472
+ this.emit(`uniform token[] xformOpOrder = [${ops.join(", ")}]`);
473
+ }
474
+ for (const api of prim.apis) {
475
+ this.emitAPIAttributes(api);
476
+ }
477
+ for (const child of prim.children) {
478
+ this.emitBlank();
479
+ this.emitPrim(child);
480
+ }
481
+ this.indentLevel--;
482
+ this.emit(`}`);
483
+ }
484
+ isIdentityQuaternion(q) {
485
+ return Math.abs(q[0]) < 1e-4 && Math.abs(q[1]) < 1e-4 && Math.abs(q[2]) < 1e-4 && Math.abs(q[3] - 1) < 1e-4;
486
+ }
487
+ isUniformScale(s) {
488
+ return Math.abs(s[0] - 1) < 1e-4 && Math.abs(s[1] - 1) < 1e-4 && Math.abs(s[2] - 1) < 1e-4;
489
+ }
490
+ emitAPIAttributes(api) {
491
+ switch (api.type) {
492
+ case "PhysicsRigidBodyAPI":
493
+ this.emitBlank();
494
+ this.emit(`# PhysicsRigidBodyAPI`);
495
+ this.emit(`bool physics:rigidBodyEnabled = ${api.rigidBodyEnabled}`);
496
+ if (api.kinematicEnabled !== void 0) {
497
+ this.emit(`bool physics:kinematicEnabled = ${api.kinematicEnabled}`);
498
+ }
499
+ if (api.startsAsleep !== void 0) {
500
+ this.emit(`bool physics:startsAsleep = ${api.startsAsleep}`);
501
+ }
502
+ if (api.linearVelocity) {
503
+ this.emit(
504
+ `float3 physics:velocity = (${api.linearVelocity[0]}, ${api.linearVelocity[1]}, ${api.linearVelocity[2]})`
505
+ );
506
+ }
507
+ if (api.angularVelocity) {
508
+ this.emit(
509
+ `float3 physics:angularVelocity = (${api.angularVelocity[0]}, ${api.angularVelocity[1]}, ${api.angularVelocity[2]})`
510
+ );
511
+ }
512
+ break;
513
+ case "PhysicsCollisionAPI":
514
+ this.emitBlank();
515
+ this.emit(`# PhysicsCollisionAPI`);
516
+ this.emit(`bool physics:collisionEnabled = ${api.collisionEnabled}`);
517
+ if (api.collisionShape) {
518
+ this.emit(`token physics:collisionShape = "${api.collisionShape}"`);
519
+ }
520
+ if (api.collisionSize) {
521
+ this.emit(
522
+ `float3 physics:collisionSize = (${api.collisionSize[0]}, ${api.collisionSize[1]}, ${api.collisionSize[2]})`
523
+ );
524
+ }
525
+ if (api.collisionRadius !== void 0) {
526
+ this.emit(`float physics:collisionRadius = ${api.collisionRadius}`);
527
+ }
528
+ if (api.collisionHeight !== void 0) {
529
+ this.emit(`float physics:collisionHeight = ${api.collisionHeight}`);
530
+ }
531
+ break;
532
+ case "PhysicsMassAPI":
533
+ this.emitBlank();
534
+ this.emit(`# PhysicsMassAPI`);
535
+ this.emit(`float physics:mass = ${api.mass}`);
536
+ if (api.density !== void 0) {
537
+ this.emit(`float physics:density = ${api.density}`);
538
+ }
539
+ if (api.centerOfMass) {
540
+ this.emit(
541
+ `point3f physics:centerOfMass = (${api.centerOfMass[0]}, ${api.centerOfMass[1]}, ${api.centerOfMass[2]})`
542
+ );
543
+ }
544
+ if (api.diagonalInertia) {
545
+ this.emit(
546
+ `float3 physics:diagonalInertia = (${api.diagonalInertia[0]}, ${api.diagonalInertia[1]}, ${api.diagonalInertia[2]})`
547
+ );
548
+ }
549
+ break;
550
+ case "PhysicsArticulationRootAPI":
551
+ this.emitBlank();
552
+ this.emit(`# PhysicsArticulationRootAPI`);
553
+ this.emit(`bool physics:articulationEnabled = ${api.articulationEnabled}`);
554
+ break;
555
+ }
556
+ }
557
+ // ===========================================================================
558
+ // JOINT EMISSION
559
+ // ===========================================================================
560
+ emitJoint(joint) {
561
+ const jointClass = this.getUSDJointClass(joint.jointType);
562
+ const hasLimits = joint.lowerLimit !== void 0 || joint.upperLimit !== void 0;
563
+ const hasDrives = joint.drives && joint.drives.length > 0;
564
+ this.emit(`def ${jointClass} "${joint.body0}_to_${joint.body1}_joint"`);
565
+ this.emit(`{`);
566
+ this.indentLevel++;
567
+ this.emit(`rel physics:body0 = <${joint.body0}>`);
568
+ this.emit(`rel physics:body1 = <${joint.body1}>`);
569
+ if (joint.localPos0) {
570
+ this.emit(
571
+ `point3f physics:localPos0 = (${joint.localPos0[0]}, ${joint.localPos0[1]}, ${joint.localPos0[2]})`
572
+ );
573
+ }
574
+ if (joint.localPos1) {
575
+ this.emit(
576
+ `point3f physics:localPos1 = (${joint.localPos1[0]}, ${joint.localPos1[1]}, ${joint.localPos1[2]})`
577
+ );
578
+ }
579
+ if (joint.localRot0) {
580
+ this.emit(
581
+ `quatf physics:localRot0 = (${joint.localRot0[3]}, ${joint.localRot0[0]}, ${joint.localRot0[1]}, ${joint.localRot0[2]})`
582
+ );
583
+ }
584
+ if (joint.localRot1) {
585
+ this.emit(
586
+ `quatf physics:localRot1 = (${joint.localRot1[3]}, ${joint.localRot1[0]}, ${joint.localRot1[1]}, ${joint.localRot1[2]})`
587
+ );
588
+ }
589
+ if (joint.jointType === "revolute" || joint.jointType === "prismatic") {
590
+ this.emit(`token physics:axis = "${joint.axis || "Z"}"`);
591
+ }
592
+ if (hasLimits) {
593
+ this.emitBlank();
594
+ this.emit(`# Joint limits`);
595
+ if (joint.lowerLimit !== void 0) {
596
+ this.emit(`float physics:lowerLimit = ${joint.lowerLimit}`);
597
+ }
598
+ if (joint.upperLimit !== void 0) {
599
+ this.emit(`float physics:upperLimit = ${joint.upperLimit}`);
600
+ }
601
+ }
602
+ if (hasDrives) {
603
+ for (const drive of joint.drives) {
604
+ this.emitDrive(drive, joint.axis || "Z");
605
+ }
606
+ }
607
+ this.indentLevel--;
608
+ this.emit(`}`);
609
+ }
610
+ getUSDJointClass(jointType) {
611
+ switch (jointType) {
612
+ case "revolute":
613
+ return "PhysicsRevoluteJoint";
614
+ case "prismatic":
615
+ return "PhysicsPrismaticJoint";
616
+ case "spherical":
617
+ return "PhysicsSphericalJoint";
618
+ case "fixed":
619
+ return "PhysicsFixedJoint";
620
+ case "d6":
621
+ return "PhysicsD6Joint";
622
+ default:
623
+ return "PhysicsFixedJoint";
624
+ }
625
+ }
626
+ emitDrive(drive, axis) {
627
+ const driveAttr = `physics:${axis.toLowerCase()}Drive`;
628
+ this.emitBlank();
629
+ this.emit(`# PhysicsDriveAPI`);
630
+ this.emit(`token ${driveAttr}:type = "${drive.driveType}"`);
631
+ if (drive.maxForce !== void 0) {
632
+ this.emit(`float ${driveAttr}:maxForce = ${drive.maxForce}`);
633
+ }
634
+ if (drive.targetPosition !== void 0) {
635
+ this.emit(`float ${driveAttr}:targetPosition = ${drive.targetPosition}`);
636
+ }
637
+ if (drive.targetVelocity !== void 0) {
638
+ this.emit(`float ${driveAttr}:targetVelocity = ${drive.targetVelocity}`);
639
+ }
640
+ if (drive.stiffness !== void 0) {
641
+ this.emit(`float ${driveAttr}:stiffness = ${drive.stiffness}`);
642
+ }
643
+ if (drive.damping !== void 0) {
644
+ this.emit(`float ${driveAttr}:damping = ${drive.damping}`);
645
+ }
646
+ }
647
+ // ===========================================================================
648
+ // EXTRACTION FROM COMPOSITION
649
+ // ===========================================================================
650
+ extractFromComposition(composition) {
651
+ this.materials.set("default", {
652
+ path: "/PhysicsMaterials/DefaultMaterial",
653
+ name: "DefaultMaterial",
654
+ staticFriction: this.options.defaultStaticFriction,
655
+ dynamicFriction: this.options.defaultDynamicFriction,
656
+ restitution: this.options.defaultRestitution
657
+ });
658
+ if (composition.objects) {
659
+ for (const obj of composition.objects) {
660
+ const prim = this.processObject(obj);
661
+ if (prim) {
662
+ this.prims.push(prim);
663
+ }
664
+ }
665
+ }
666
+ if (composition.spatialGroups) {
667
+ for (const group of composition.spatialGroups) {
668
+ const groupPrims = this.processSpatialGroup(group);
669
+ this.prims.push(...groupPrims);
670
+ }
671
+ }
672
+ }
673
+ processObject(obj, parentPath) {
674
+ const name = this.sanitizeName(obj.name);
675
+ const path = parentPath ? `${parentPath}/${name}` : name;
676
+ const hasPhysics = this.hasTrait(obj, "physics") || this.hasTrait(obj, "rigid");
677
+ const hasCollider = this.hasTrait(obj, "collidable") || this.hasTrait(obj, "trigger");
678
+ const isKinematic = this.hasTrait(obj, "kinematic");
679
+ const isArticulationRoot = this.hasTrait(obj, "articulation_root");
680
+ const physicsConfig = this.getTraitConfig(obj, "physics") || {};
681
+ const jointConfig = this.getTraitConfig(obj, "joint");
682
+ const geometry = this.extractGeometry(obj);
683
+ const position = this.extractPosition(obj);
684
+ const rotation = this.extractRotation(obj);
685
+ const scale = this.extractScale(obj);
686
+ let typeName = "Xform";
687
+ if (geometry) {
688
+ typeName = geometry.type === "Reference" ? "Xform" : geometry.type;
689
+ }
690
+ const apis = [];
691
+ if (hasPhysics) {
692
+ apis.push({
693
+ type: "PhysicsRigidBodyAPI",
694
+ rigidBodyEnabled: true,
695
+ kinematicEnabled: isKinematic
696
+ });
697
+ }
698
+ if (hasCollider || hasPhysics) {
699
+ const collisionApi = {
700
+ type: "PhysicsCollisionAPI",
701
+ collisionEnabled: true
702
+ };
703
+ if (geometry && geometry.type !== "Reference") {
704
+ collisionApi.collisionShape = geometry.type;
705
+ if (geometry.size) {
706
+ collisionApi.collisionSize = geometry.size;
707
+ }
708
+ if (geometry.radius !== void 0) {
709
+ collisionApi.collisionRadius = geometry.radius;
710
+ }
711
+ if (geometry.type === "Cylinder" || geometry.type === "Capsule" || geometry.type === "Cone") {
712
+ collisionApi.collisionHeight = scale[1];
713
+ }
714
+ }
715
+ apis.push(collisionApi);
716
+ }
717
+ if (hasPhysics) {
718
+ const mass = physicsConfig.mass ?? this.options.defaultMass;
719
+ apis.push({
720
+ type: "PhysicsMassAPI",
721
+ mass
722
+ });
723
+ }
724
+ if (isArticulationRoot) {
725
+ apis.push({
726
+ type: "PhysicsArticulationRootAPI",
727
+ articulationEnabled: true
728
+ });
729
+ }
730
+ if (jointConfig) {
731
+ const jointType = this.mapJointType(String(jointConfig.type || "fixed"));
732
+ const rawParentBody = String(jointConfig.connectedBody || "");
733
+ const articulationRoot = `/${this.compositionName}`;
734
+ const body0Path = rawParentBody ? rawParentBody.startsWith("/") ? rawParentBody : `${articulationRoot}/${this.sanitizeName(rawParentBody)}` : articulationRoot;
735
+ const body1Path = `/${this.compositionName}/${this.sanitizeName(name)}`;
736
+ const axis = this.mapAxis(jointConfig.axis);
737
+ const joint = {
738
+ type: "PhysicsJoint",
739
+ jointType,
740
+ body0: body0Path,
741
+ body1: body1Path,
742
+ axis
743
+ };
744
+ if (jointConfig.lowerLimit !== void 0 || jointConfig.upperLimit !== void 0) {
745
+ const isRevolute = jointType === "revolute";
746
+ joint.lowerLimit = jointConfig.lowerLimit !== void 0 ? isRevolute ? Number(jointConfig.lowerLimit) * (Math.PI / 180) : Number(jointConfig.lowerLimit) : void 0;
747
+ joint.upperLimit = jointConfig.upperLimit !== void 0 ? isRevolute ? Number(jointConfig.upperLimit) * (Math.PI / 180) : Number(jointConfig.upperLimit) : void 0;
748
+ }
749
+ if (jointConfig.motor) {
750
+ const motorConfig = jointConfig.motor;
751
+ joint.drives = [
752
+ {
753
+ type: "PhysicsDriveAPI",
754
+ driveType: motorConfig.type || "position",
755
+ maxForce: motorConfig.maxForce,
756
+ stiffness: motorConfig.stiffness,
757
+ damping: motorConfig.damping
758
+ }
759
+ ];
760
+ }
761
+ this.joints.push(joint);
762
+ }
763
+ return {
764
+ path,
765
+ name,
766
+ typeName,
767
+ translation: position,
768
+ rotation,
769
+ scale,
770
+ children: [],
771
+ apis
772
+ };
773
+ }
774
+ processSpatialGroup(group) {
775
+ const prims = [];
776
+ const groupName = this.sanitizeName(group.name);
777
+ const groupPrim = {
778
+ path: groupName,
779
+ name: groupName,
780
+ typeName: "Xform",
781
+ children: [],
782
+ apis: []
783
+ };
784
+ const hasRobotObjects = group.objects?.some((obj) => this.hasTrait(obj, "joint"));
785
+ if (hasRobotObjects) {
786
+ groupPrim.apis.push({
787
+ type: "PhysicsArticulationRootAPI",
788
+ articulationEnabled: true
789
+ });
790
+ }
791
+ if (group.objects) {
792
+ for (const obj of group.objects) {
793
+ const childPrim = this.processObject(obj, groupName);
794
+ if (childPrim) {
795
+ groupPrim.children.push(childPrim);
796
+ }
797
+ }
798
+ }
799
+ prims.push(groupPrim);
800
+ return prims;
801
+ }
802
+ // ===========================================================================
803
+ // SEMANTIC AST EMBEDDING (Metaverse Standards Forum interoperability)
804
+ // ===========================================================================
805
+ /**
806
+ * Emit a `customData` block on the root Xform carrying a compact
807
+ * representation of the HoloScript semantic AST.
808
+ *
809
+ * This enables downstream consumers (Omniverse extensions, Isaac Lab
810
+ * pipelines, or any USD-aware tool) to read the original behavioral
811
+ * intent without needing a HoloScript parser.
812
+ *
813
+ * The payload follows the MSF 3D Asset Interoperability WG recommendation
814
+ * of placing behavioral metadata in `customData` (USD) or `extras` (glTF).
815
+ */
816
+ emitSemanticCustomData(composition) {
817
+ this.emit(`# HoloScript Semantic AST (MSF Interoperability)`);
818
+ this.emit(`customData = {`);
819
+ this.indentLevel++;
820
+ this.emit(`string holoscript:version = "6.0"`);
821
+ this.emit(`string holoscript:compositionName = "${this.escapeStringValue(composition.name, "USD")}"`);
822
+ const objectNames = (composition.objects || []).map((o) => o.name);
823
+ if (objectNames.length > 0) {
824
+ const namesStr = objectNames.map((n) => `"${this.escapeStringValue(n, "USD")}"`).join(", ");
825
+ this.emit(`string[] holoscript:objects = [${namesStr}]`);
826
+ }
827
+ const allTraits = /* @__PURE__ */ new Set();
828
+ for (const obj of composition.objects || []) {
829
+ for (const trait of obj.traits || []) {
830
+ const tName = typeof trait === "string" ? trait : trait.name;
831
+ allTraits.add(tName);
832
+ }
833
+ }
834
+ if (allTraits.size > 0) {
835
+ const traitsStr = [...allTraits].map((t) => `"${this.escapeStringValue(t, "USD")}"`).join(", ");
836
+ this.emit(`string[] holoscript:traits = [${traitsStr}]`);
837
+ }
838
+ const groupNames = (composition.spatialGroups || []).map((g) => g.name);
839
+ if (groupNames.length > 0) {
840
+ const groupsStr = groupNames.map((n) => `"${this.escapeStringValue(n, "USD")}"`).join(", ");
841
+ this.emit(`string[] holoscript:spatialGroups = [${groupsStr}]`);
842
+ }
843
+ this.emit(`string holoscript:targetContext = "${this.options.targetContext}"`);
844
+ this.indentLevel--;
845
+ this.emit(`}`);
846
+ }
847
+ /**
848
+ * Convert a quaternion (x, y, z, w) back to Euler angles in degrees.
849
+ * Used when targetContext === 'isaac_sim' requires rotateXYZ ops.
850
+ */
851
+ quaternionToEulerDegrees(q) {
852
+ const [x, y, z, w] = q;
853
+ const RAD2DEG = 180 / Math.PI;
854
+ const sinr_cosp = 2 * (w * x + y * z);
855
+ const cosr_cosp = 1 - 2 * (x * x + y * y);
856
+ const roll = Math.atan2(sinr_cosp, cosr_cosp) * RAD2DEG;
857
+ const sinp = 2 * (w * y - z * x);
858
+ const pitch = Math.abs(sinp) >= 1 ? Math.sign(sinp) * 90 : Math.asin(sinp) * RAD2DEG;
859
+ const siny_cosp = 2 * (w * z + x * y);
860
+ const cosy_cosp = 1 - 2 * (y * y + z * z);
861
+ const yaw = Math.atan2(siny_cosp, cosy_cosp) * RAD2DEG;
862
+ return [roll, pitch, yaw];
863
+ }
864
+ };
865
+ function compileToUSDPhysics(composition, options) {
866
+ const compiler = new USDPhysicsCompiler(options);
867
+ return compiler.compile(composition, "system");
868
+ }
869
+ function compileForIsaacSim(composition, options) {
870
+ const isaacOptions = {
871
+ upAxis: "Z",
872
+ metersPerUnit: 1,
873
+ enableGPUDynamics: true,
874
+ enableArticulation: true,
875
+ timeCodesPerSecond: 60,
876
+ ...options
877
+ };
878
+ const compiler = new USDPhysicsCompiler(isaacOptions);
879
+ return compiler.compile(composition, "system");
880
+ }
881
+
882
+ exports.USDPhysicsCompiler = USDPhysicsCompiler;
883
+ exports.compileForIsaacSim = compileForIsaacSim;
884
+ exports.compileToUSDPhysics = compileToUSDPhysics;
885
+ //# sourceMappingURL=chunk-3AO425MZ.cjs.map
886
+ //# sourceMappingURL=chunk-3AO425MZ.cjs.map