@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,882 @@
1
+ import { init_DomainBlockCompilerMixin, compileDomainBlocks, compileWeatherBlock, weatherToUSD, compileAudioSourceBlock, audioSourceToUSD, compilePostProcessingBlock, postProcessingToUSD, compileParticleBlock, particlesToUSD, compilePhysicsBlock, physicsToURDF, compileMaterialBlock, materialToUSD } from './chunk-JCLBKPMX.js';
2
+ import { init_CompilerBase, CompilerBase } from './chunk-QPSKHBJP.js';
3
+ import { ANSCapabilityPath } from '@holoscript/core-types/ans';
4
+
5
+ // src/compiler/USDPhysicsCompiler.ts
6
+ init_CompilerBase();
7
+ init_DomainBlockCompilerMixin();
8
+ var USDPhysicsCompiler = class extends CompilerBase {
9
+ constructor(options = {}) {
10
+ super();
11
+ this.compilerName = "USDPhysicsCompiler";
12
+ this.lines = [];
13
+ /** Root composition name, set during compile() for USD path resolution. */
14
+ this.compositionName = "World";
15
+ this.indentLevel = 0;
16
+ this.prims = [];
17
+ this.joints = [];
18
+ this.materials = /* @__PURE__ */ new Map();
19
+ this.options = {
20
+ stageName: options.stageName ?? "HoloScriptPhysicsStage",
21
+ upAxis: options.upAxis ?? "Z",
22
+ // Isaac Sim default
23
+ metersPerUnit: options.metersPerUnit ?? 1,
24
+ timeCodesPerSecond: options.timeCodesPerSecond ?? 60,
25
+ includePhysicsScene: options.includePhysicsScene ?? true,
26
+ gravity: options.gravity ?? [0, 0, -9.81],
27
+ physicsTimestep: options.physicsTimestep ?? 1 / 60,
28
+ enableGPUDynamics: options.enableGPUDynamics ?? true,
29
+ includeCollision: options.includeCollision ?? true,
30
+ includeVisual: options.includeVisual ?? true,
31
+ defaultMass: options.defaultMass ?? 1,
32
+ defaultStaticFriction: options.defaultStaticFriction ?? 0.5,
33
+ defaultDynamicFriction: options.defaultDynamicFriction ?? 0.5,
34
+ defaultRestitution: options.defaultRestitution ?? 0.1,
35
+ enableArticulation: options.enableArticulation ?? true,
36
+ targetContext: options.targetContext ?? "isaac_sim",
37
+ embedSemanticAST: options.embedSemanticAST ?? true,
38
+ provenanceHash: options.provenanceHash ?? ""
39
+ };
40
+ }
41
+ getRequiredCapability() {
42
+ return ANSCapabilityPath.USD;
43
+ }
44
+ // ===========================================================================
45
+ // HELPER METHODS
46
+ // ===========================================================================
47
+ /** Get trait name from either string or object format */
48
+ getTraitName(trait) {
49
+ return typeof trait === "string" ? trait : trait.name;
50
+ }
51
+ /** Check if object has a specific trait */
52
+ hasTrait(obj, traitName) {
53
+ return obj.traits?.some((t) => this.getTraitName(t) === traitName) ?? false;
54
+ }
55
+ /** Get trait configuration object */
56
+ getTraitConfig(obj, traitName) {
57
+ const trait = obj.traits?.find((t) => this.getTraitName(t) === traitName);
58
+ if (!trait) return void 0;
59
+ if (typeof trait === "string") return {};
60
+ const traitObj = trait;
61
+ if ("config" in traitObj && typeof traitObj.config === "object") {
62
+ return traitObj.config;
63
+ }
64
+ const { name: _name, ...rest } = traitObj;
65
+ if (rest.type === "ObjectTrait") {
66
+ const { type: _type, ...config } = rest;
67
+ return config;
68
+ }
69
+ return rest;
70
+ }
71
+ /** Sanitize name for USD path */
72
+ sanitizeName(name) {
73
+ let sanitized = name.replace(/[^a-zA-Z0-9_]/g, "_");
74
+ if (/^[0-9]/.test(sanitized)) {
75
+ sanitized = "_" + sanitized;
76
+ }
77
+ return sanitized;
78
+ }
79
+ /** Emit a line with current indent */
80
+ emit(line) {
81
+ const indent = " ".repeat(this.indentLevel);
82
+ this.lines.push(indent + line);
83
+ }
84
+ /** Emit empty line */
85
+ emitBlank() {
86
+ this.lines.push("");
87
+ }
88
+ /** Get property value from object properties array */
89
+ getPropertyValue(obj, key) {
90
+ const prop = obj.properties?.find((p) => p.key === key);
91
+ return prop?.value;
92
+ }
93
+ /** Extract position from object properties */
94
+ extractPosition(obj) {
95
+ const pos = this.getPropertyValue(obj, "position");
96
+ if (Array.isArray(pos) && pos.length >= 3) {
97
+ return [Number(pos[0]) || 0, Number(pos[1]) || 0, Number(pos[2]) || 0];
98
+ }
99
+ return [0, 0, 0];
100
+ }
101
+ /** Extract rotation as quaternion from object properties */
102
+ extractRotation(obj) {
103
+ const rot = this.getPropertyValue(obj, "rotation");
104
+ if (Array.isArray(rot) && rot.length >= 3) {
105
+ const euler = [
106
+ (Number(rot[0]) || 0) * (Math.PI / 180),
107
+ (Number(rot[1]) || 0) * (Math.PI / 180),
108
+ (Number(rot[2]) || 0) * (Math.PI / 180)
109
+ ];
110
+ return this.eulerToQuaternion(euler[0], euler[1], euler[2]);
111
+ }
112
+ return [0, 0, 0, 1];
113
+ }
114
+ /** Convert Euler angles (radians) to quaternion */
115
+ eulerToQuaternion(roll, pitch, yaw) {
116
+ const cy = Math.cos(yaw * 0.5);
117
+ const sy = Math.sin(yaw * 0.5);
118
+ const cp = Math.cos(pitch * 0.5);
119
+ const sp = Math.sin(pitch * 0.5);
120
+ const cr = Math.cos(roll * 0.5);
121
+ const sr = Math.sin(roll * 0.5);
122
+ return [
123
+ sr * cp * cy - cr * sp * sy,
124
+ // x
125
+ cr * sp * cy + sr * cp * sy,
126
+ // y
127
+ cr * cp * sy - sr * sp * cy,
128
+ // z
129
+ cr * cp * cy + sr * sp * sy
130
+ // w
131
+ ];
132
+ }
133
+ /** Extract scale from object properties */
134
+ extractScale(obj) {
135
+ const scale = this.getPropertyValue(obj, "scale");
136
+ if (Array.isArray(scale) && scale.length >= 3) {
137
+ return [Number(scale[0]) || 1, Number(scale[1]) || 1, Number(scale[2]) || 1];
138
+ }
139
+ if (typeof scale === "number") {
140
+ return [scale, scale, scale];
141
+ }
142
+ return [1, 1, 1];
143
+ }
144
+ /** Extract geometry type from object */
145
+ extractGeometry(obj) {
146
+ const geom = this.getPropertyValue(obj, "geometry");
147
+ if (!geom) return void 0;
148
+ const geomType = String(geom);
149
+ const scale = this.extractScale(obj);
150
+ switch (geomType) {
151
+ case "cube":
152
+ case "box":
153
+ return { type: "Cube", size: scale };
154
+ case "sphere":
155
+ return { type: "Sphere", radius: Math.max(...scale) / 2 };
156
+ case "cylinder":
157
+ return { type: "Cylinder", radius: Math.max(scale[0], scale[2]) / 2 };
158
+ case "capsule":
159
+ return { type: "Capsule", radius: Math.max(scale[0], scale[2]) / 2 };
160
+ case "cone":
161
+ return { type: "Cone", radius: Math.max(scale[0], scale[2]) / 2 };
162
+ default:
163
+ if (geomType.endsWith(".usd") || geomType.endsWith(".usda") || geomType.endsWith(".usdc")) {
164
+ return { type: "Reference", size: scale };
165
+ }
166
+ return { type: "Cube", size: scale };
167
+ }
168
+ }
169
+ /** Map HoloScript joint types to USD joint types */
170
+ mapJointType(holoType) {
171
+ switch (holoType) {
172
+ case "hinge":
173
+ case "revolute":
174
+ return "revolute";
175
+ case "slider":
176
+ case "prismatic":
177
+ return "prismatic";
178
+ case "ball":
179
+ case "spherical":
180
+ return "spherical";
181
+ case "fixed":
182
+ return "fixed";
183
+ case "6dof":
184
+ case "d6":
185
+ return "d6";
186
+ default:
187
+ return "fixed";
188
+ }
189
+ }
190
+ /** Map axis string to USD axis */
191
+ mapAxis(axis) {
192
+ if (Array.isArray(axis)) {
193
+ const absX = Math.abs(Number(axis[0]) || 0);
194
+ const absY = Math.abs(Number(axis[1]) || 0);
195
+ const absZ = Math.abs(Number(axis[2]) || 0);
196
+ if (absX >= absY && absX >= absZ) return "X";
197
+ if (absY >= absX && absY >= absZ) return "Y";
198
+ return "Z";
199
+ }
200
+ const axisStr = String(axis).toUpperCase();
201
+ if (axisStr === "X" || axisStr === "Y" || axisStr === "Z") {
202
+ return axisStr;
203
+ }
204
+ return "Z";
205
+ }
206
+ // ===========================================================================
207
+ // COMPILATION
208
+ // ===========================================================================
209
+ /**
210
+ * Compile HoloScript composition to USD ASCII with physics schemas
211
+ */
212
+ compile(composition, agentToken, outputPath) {
213
+ this.validateCompilerAccess(agentToken, outputPath);
214
+ this.compositionName = this.sanitizeName(composition.name);
215
+ this.lines = [];
216
+ this.prims = [];
217
+ this.joints = [];
218
+ this.materials.clear();
219
+ this.indentLevel = 0;
220
+ this.extractFromComposition(composition);
221
+ this.emitHeader(composition.name);
222
+ this.emitBlank();
223
+ this.emit(`def Xform "${this.sanitizeName(composition.name)}" (`);
224
+ this.indentLevel++;
225
+ this.emit(`kind = "component"`);
226
+ this.indentLevel--;
227
+ this.emit(`)
228
+ {`);
229
+ this.indentLevel++;
230
+ if (this.options.embedSemanticAST) {
231
+ this.emitSemanticCustomData(composition);
232
+ this.emitBlank();
233
+ }
234
+ if (this.options.includePhysicsScene) {
235
+ this.emitPhysicsScene();
236
+ this.emitBlank();
237
+ }
238
+ if (this.materials.size > 0) {
239
+ this.emitPhysicsMaterials();
240
+ this.emitBlank();
241
+ }
242
+ const isRobot = this.prims.some(
243
+ (p) => p.apis.some((a) => a.type === "PhysicsArticulationRootAPI")
244
+ );
245
+ if (isRobot && this.options.enableArticulation) {
246
+ this.emitArticulationRoot();
247
+ } else {
248
+ for (const prim of this.prims) {
249
+ this.emitPrim(prim);
250
+ this.emitBlank();
251
+ }
252
+ }
253
+ for (const joint of this.joints) {
254
+ this.emitJoint(joint);
255
+ this.emitBlank();
256
+ }
257
+ const domainBlocks = composition.domainBlocks ?? [];
258
+ if (domainBlocks.length > 0) {
259
+ this.emitBlank();
260
+ this.emit(`# === v4.2 Domain Blocks ===`);
261
+ const compiled = compileDomainBlocks(
262
+ domainBlocks,
263
+ {
264
+ material: (block) => {
265
+ const mat = compileMaterialBlock(block);
266
+ return materialToUSD(mat);
267
+ },
268
+ physics: (block) => {
269
+ const phys = compilePhysicsBlock(block);
270
+ const urdf = physicsToURDF(phys);
271
+ return `# Physics: ${phys.keyword} "${phys.name || ""}"
272
+ ` + urdf.split("\n").map((l) => `# URDF: ${l}`).join("\n");
273
+ },
274
+ vfx: (block) => {
275
+ const ps = compileParticleBlock(block);
276
+ return particlesToUSD(ps);
277
+ },
278
+ postfx: (block) => {
279
+ const pp = compilePostProcessingBlock(block);
280
+ return postProcessingToUSD(pp);
281
+ },
282
+ audio: (block) => {
283
+ const audio = compileAudioSourceBlock(block);
284
+ return audioSourceToUSD(audio);
285
+ },
286
+ weather: (block) => {
287
+ const weather = compileWeatherBlock(block);
288
+ return weatherToUSD(weather);
289
+ }
290
+ },
291
+ (block) => `# Domain block: ${block.domain}/${block.keyword} "${this.escapeStringValue(block.name, "TypeScript")}"`
292
+ );
293
+ for (const output of compiled) {
294
+ this.emitBlank();
295
+ for (const line of output.split("\n")) {
296
+ this.emit(line);
297
+ }
298
+ }
299
+ }
300
+ this.indentLevel--;
301
+ this.emit(`}`);
302
+ return this.lines.join("\n");
303
+ }
304
+ // ===========================================================================
305
+ // HEADER EMISSION
306
+ // ===========================================================================
307
+ emitHeader(name) {
308
+ const runtimeLabel = this.options.targetContext === "isaac_sim" ? "NVIDIA Isaac Sim / Isaac Lab" : this.options.targetContext === "omniverse" ? "NVIDIA Omniverse" : "Generic USD Runtime";
309
+ this.emit(`#usda 1.0`);
310
+ this.emit(`(`);
311
+ this.indentLevel++;
312
+ this.emit(`defaultPrim = "${this.sanitizeName(name)}"`);
313
+ this.emit(`doc = "Generated by HoloScript USDPhysicsCompiler for ${runtimeLabel}"`);
314
+ this.emit(`metersPerUnit = ${this.options.metersPerUnit}`);
315
+ this.emit(`upAxis = "${this.options.upAxis}"`);
316
+ this.emit(`timeCodesPerSecond = ${this.options.timeCodesPerSecond}`);
317
+ this.emit(`customLayerData = {`);
318
+ this.indentLevel++;
319
+ this.emit(`string generator = "HoloScript v6.0"`);
320
+ this.emit(`string targetRuntime = "${runtimeLabel}"`);
321
+ this.emit(`string holoscript:targetContext = "${this.options.targetContext}"`);
322
+ this.indentLevel--;
323
+ this.emit(`}`);
324
+ this.indentLevel--;
325
+ this.emit(`)`);
326
+ if (this.options.provenanceHash) {
327
+ this.emit(`# Provenance Hash: ${this.options.provenanceHash}`);
328
+ }
329
+ }
330
+ // ===========================================================================
331
+ // PHYSICS SCENE
332
+ // ===========================================================================
333
+ emitPhysicsScene() {
334
+ const gravityMag = Math.sqrt(
335
+ this.options.gravity[0] ** 2 + this.options.gravity[1] ** 2 + this.options.gravity[2] ** 2
336
+ );
337
+ const gravityDir = gravityMag > 0 ? [
338
+ this.options.gravity[0] / gravityMag,
339
+ this.options.gravity[1] / gravityMag,
340
+ this.options.gravity[2] / gravityMag
341
+ ] : [0, 0, -1];
342
+ this.emit(`def PhysicsScene "PhysicsScene"`);
343
+ this.emit(`{`);
344
+ this.indentLevel++;
345
+ this.emit(
346
+ `float3 physics:gravityDirection = (${gravityDir[0]}, ${gravityDir[1]}, ${gravityDir[2]})`
347
+ );
348
+ this.emit(`float physics:gravityMagnitude = ${gravityMag}`);
349
+ this.emit(`# Isaac Sim GPU dynamics`);
350
+ this.emit(`bool physxScene:enableGPUDynamics = ${this.options.enableGPUDynamics}`);
351
+ this.emit(`float physxScene:timestep = ${this.options.physicsTimestep}`);
352
+ this.emit(`uint physxScene:solverType = 1 # TGS solver`);
353
+ this.indentLevel--;
354
+ this.emit(`}`);
355
+ }
356
+ // ===========================================================================
357
+ // PHYSICS MATERIALS
358
+ // ===========================================================================
359
+ emitPhysicsMaterials() {
360
+ this.emit(`def Scope "PhysicsMaterials"`);
361
+ this.emit(`{`);
362
+ this.indentLevel++;
363
+ for (const [_key, mat] of this.materials) {
364
+ this.emit(`def Material "${this.escapeStringValue(mat.name, "TypeScript")}" (`);
365
+ this.indentLevel++;
366
+ this.emit(`prepend apiSchemas = ["PhysicsMaterialAPI"]`);
367
+ this.indentLevel--;
368
+ this.emit(`)`);
369
+ this.emit(`{`);
370
+ this.indentLevel++;
371
+ this.emit(`float physics:staticFriction = ${mat.staticFriction}`);
372
+ this.emit(`float physics:dynamicFriction = ${mat.dynamicFriction}`);
373
+ this.emit(`float physics:restitution = ${mat.restitution}`);
374
+ if (mat.density !== void 0) {
375
+ this.emit(`float physics:density = ${mat.density}`);
376
+ }
377
+ this.indentLevel--;
378
+ this.emit(`}`);
379
+ }
380
+ this.indentLevel--;
381
+ this.emit(`}`);
382
+ }
383
+ // ===========================================================================
384
+ // ARTICULATION ROOT
385
+ // ===========================================================================
386
+ emitArticulationRoot() {
387
+ this.emit(`def Xform "RobotArticulation" (`);
388
+ this.indentLevel++;
389
+ this.emit(`prepend apiSchemas = ["PhysicsArticulationRootAPI"]`);
390
+ this.indentLevel--;
391
+ this.emit(`)`);
392
+ this.emit(`{`);
393
+ this.indentLevel++;
394
+ this.emit(`bool physics:articulationEnabled = true`);
395
+ this.emit(`# Isaac Sim articulation settings`);
396
+ this.emit(`bool physxArticulation:enabledSelfCollisions = false`);
397
+ this.emit(`uint physxArticulation:solverPositionIterationCount = 32`);
398
+ this.emit(`uint physxArticulation:solverVelocityIterationCount = 1`);
399
+ this.emitBlank();
400
+ for (const prim of this.prims) {
401
+ this.emitPrim(prim);
402
+ this.emitBlank();
403
+ }
404
+ this.indentLevel--;
405
+ this.emit(`}`);
406
+ }
407
+ // ===========================================================================
408
+ // PRIM EMISSION
409
+ // ===========================================================================
410
+ emitPrim(prim) {
411
+ const apiSchemas = prim.apis.map((api) => {
412
+ switch (api.type) {
413
+ case "PhysicsRigidBodyAPI":
414
+ return "PhysicsRigidBodyAPI";
415
+ case "PhysicsCollisionAPI":
416
+ return "PhysicsCollisionAPI";
417
+ case "PhysicsMassAPI":
418
+ return "PhysicsMassAPI";
419
+ case "PhysicsArticulationRootAPI":
420
+ return "PhysicsArticulationRootAPI";
421
+ default:
422
+ return null;
423
+ }
424
+ }).filter(Boolean);
425
+ if (apiSchemas.length > 0) {
426
+ const schemasStr = apiSchemas.map((s) => `"${s}"`).join(", ");
427
+ this.emit(
428
+ `def ${prim.typeName} "${this.escapeStringValue(prim.name, "TypeScript")}" (`
429
+ );
430
+ this.indentLevel++;
431
+ this.emit(`prepend apiSchemas = [${schemasStr}]`);
432
+ this.indentLevel--;
433
+ this.emit(`)`);
434
+ } else {
435
+ this.emit(
436
+ `def ${prim.typeName} "${this.escapeStringValue(prim.name, "TypeScript")}"`
437
+ );
438
+ }
439
+ this.emit(`{`);
440
+ this.indentLevel++;
441
+ if (prim.translation) {
442
+ this.emit(
443
+ `double3 xformOp:translate = (${prim.translation[0]}, ${prim.translation[1]}, ${prim.translation[2]})`
444
+ );
445
+ }
446
+ const useEulerRotation = this.options.targetContext === "isaac_sim";
447
+ if (prim.rotation && !this.isIdentityQuaternion(prim.rotation)) {
448
+ if (useEulerRotation) {
449
+ const euler = this.quaternionToEulerDegrees(prim.rotation);
450
+ this.emit(
451
+ `float3 xformOp:rotateXYZ = (${euler[0].toFixed(4)}, ${euler[1].toFixed(4)}, ${euler[2].toFixed(4)})`
452
+ );
453
+ } else {
454
+ this.emit(
455
+ `quatd xformOp:orient = (${prim.rotation[3]}, ${prim.rotation[0]}, ${prim.rotation[1]}, ${prim.rotation[2]})`
456
+ );
457
+ }
458
+ }
459
+ if (prim.scale && !this.isUniformScale(prim.scale)) {
460
+ this.emit(`double3 xformOp:scale = (${prim.scale[0]}, ${prim.scale[1]}, ${prim.scale[2]})`);
461
+ }
462
+ const hasTransform = prim.translation || prim.rotation || prim.scale;
463
+ if (hasTransform) {
464
+ const ops = [];
465
+ if (prim.translation) ops.push('"xformOp:translate"');
466
+ if (prim.rotation && !this.isIdentityQuaternion(prim.rotation)) {
467
+ ops.push(useEulerRotation ? '"xformOp:rotateXYZ"' : '"xformOp:orient"');
468
+ }
469
+ if (prim.scale && !this.isUniformScale(prim.scale)) ops.push('"xformOp:scale"');
470
+ this.emit(`uniform token[] xformOpOrder = [${ops.join(", ")}]`);
471
+ }
472
+ for (const api of prim.apis) {
473
+ this.emitAPIAttributes(api);
474
+ }
475
+ for (const child of prim.children) {
476
+ this.emitBlank();
477
+ this.emitPrim(child);
478
+ }
479
+ this.indentLevel--;
480
+ this.emit(`}`);
481
+ }
482
+ isIdentityQuaternion(q) {
483
+ 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;
484
+ }
485
+ isUniformScale(s) {
486
+ return Math.abs(s[0] - 1) < 1e-4 && Math.abs(s[1] - 1) < 1e-4 && Math.abs(s[2] - 1) < 1e-4;
487
+ }
488
+ emitAPIAttributes(api) {
489
+ switch (api.type) {
490
+ case "PhysicsRigidBodyAPI":
491
+ this.emitBlank();
492
+ this.emit(`# PhysicsRigidBodyAPI`);
493
+ this.emit(`bool physics:rigidBodyEnabled = ${api.rigidBodyEnabled}`);
494
+ if (api.kinematicEnabled !== void 0) {
495
+ this.emit(`bool physics:kinematicEnabled = ${api.kinematicEnabled}`);
496
+ }
497
+ if (api.startsAsleep !== void 0) {
498
+ this.emit(`bool physics:startsAsleep = ${api.startsAsleep}`);
499
+ }
500
+ if (api.linearVelocity) {
501
+ this.emit(
502
+ `float3 physics:velocity = (${api.linearVelocity[0]}, ${api.linearVelocity[1]}, ${api.linearVelocity[2]})`
503
+ );
504
+ }
505
+ if (api.angularVelocity) {
506
+ this.emit(
507
+ `float3 physics:angularVelocity = (${api.angularVelocity[0]}, ${api.angularVelocity[1]}, ${api.angularVelocity[2]})`
508
+ );
509
+ }
510
+ break;
511
+ case "PhysicsCollisionAPI":
512
+ this.emitBlank();
513
+ this.emit(`# PhysicsCollisionAPI`);
514
+ this.emit(`bool physics:collisionEnabled = ${api.collisionEnabled}`);
515
+ if (api.collisionShape) {
516
+ this.emit(`token physics:collisionShape = "${api.collisionShape}"`);
517
+ }
518
+ if (api.collisionSize) {
519
+ this.emit(
520
+ `float3 physics:collisionSize = (${api.collisionSize[0]}, ${api.collisionSize[1]}, ${api.collisionSize[2]})`
521
+ );
522
+ }
523
+ if (api.collisionRadius !== void 0) {
524
+ this.emit(`float physics:collisionRadius = ${api.collisionRadius}`);
525
+ }
526
+ if (api.collisionHeight !== void 0) {
527
+ this.emit(`float physics:collisionHeight = ${api.collisionHeight}`);
528
+ }
529
+ break;
530
+ case "PhysicsMassAPI":
531
+ this.emitBlank();
532
+ this.emit(`# PhysicsMassAPI`);
533
+ this.emit(`float physics:mass = ${api.mass}`);
534
+ if (api.density !== void 0) {
535
+ this.emit(`float physics:density = ${api.density}`);
536
+ }
537
+ if (api.centerOfMass) {
538
+ this.emit(
539
+ `point3f physics:centerOfMass = (${api.centerOfMass[0]}, ${api.centerOfMass[1]}, ${api.centerOfMass[2]})`
540
+ );
541
+ }
542
+ if (api.diagonalInertia) {
543
+ this.emit(
544
+ `float3 physics:diagonalInertia = (${api.diagonalInertia[0]}, ${api.diagonalInertia[1]}, ${api.diagonalInertia[2]})`
545
+ );
546
+ }
547
+ break;
548
+ case "PhysicsArticulationRootAPI":
549
+ this.emitBlank();
550
+ this.emit(`# PhysicsArticulationRootAPI`);
551
+ this.emit(`bool physics:articulationEnabled = ${api.articulationEnabled}`);
552
+ break;
553
+ }
554
+ }
555
+ // ===========================================================================
556
+ // JOINT EMISSION
557
+ // ===========================================================================
558
+ emitJoint(joint) {
559
+ const jointClass = this.getUSDJointClass(joint.jointType);
560
+ const hasLimits = joint.lowerLimit !== void 0 || joint.upperLimit !== void 0;
561
+ const hasDrives = joint.drives && joint.drives.length > 0;
562
+ this.emit(`def ${jointClass} "${joint.body0}_to_${joint.body1}_joint"`);
563
+ this.emit(`{`);
564
+ this.indentLevel++;
565
+ this.emit(`rel physics:body0 = <${joint.body0}>`);
566
+ this.emit(`rel physics:body1 = <${joint.body1}>`);
567
+ if (joint.localPos0) {
568
+ this.emit(
569
+ `point3f physics:localPos0 = (${joint.localPos0[0]}, ${joint.localPos0[1]}, ${joint.localPos0[2]})`
570
+ );
571
+ }
572
+ if (joint.localPos1) {
573
+ this.emit(
574
+ `point3f physics:localPos1 = (${joint.localPos1[0]}, ${joint.localPos1[1]}, ${joint.localPos1[2]})`
575
+ );
576
+ }
577
+ if (joint.localRot0) {
578
+ this.emit(
579
+ `quatf physics:localRot0 = (${joint.localRot0[3]}, ${joint.localRot0[0]}, ${joint.localRot0[1]}, ${joint.localRot0[2]})`
580
+ );
581
+ }
582
+ if (joint.localRot1) {
583
+ this.emit(
584
+ `quatf physics:localRot1 = (${joint.localRot1[3]}, ${joint.localRot1[0]}, ${joint.localRot1[1]}, ${joint.localRot1[2]})`
585
+ );
586
+ }
587
+ if (joint.jointType === "revolute" || joint.jointType === "prismatic") {
588
+ this.emit(`token physics:axis = "${joint.axis || "Z"}"`);
589
+ }
590
+ if (hasLimits) {
591
+ this.emitBlank();
592
+ this.emit(`# Joint limits`);
593
+ if (joint.lowerLimit !== void 0) {
594
+ this.emit(`float physics:lowerLimit = ${joint.lowerLimit}`);
595
+ }
596
+ if (joint.upperLimit !== void 0) {
597
+ this.emit(`float physics:upperLimit = ${joint.upperLimit}`);
598
+ }
599
+ }
600
+ if (hasDrives) {
601
+ for (const drive of joint.drives) {
602
+ this.emitDrive(drive, joint.axis || "Z");
603
+ }
604
+ }
605
+ this.indentLevel--;
606
+ this.emit(`}`);
607
+ }
608
+ getUSDJointClass(jointType) {
609
+ switch (jointType) {
610
+ case "revolute":
611
+ return "PhysicsRevoluteJoint";
612
+ case "prismatic":
613
+ return "PhysicsPrismaticJoint";
614
+ case "spherical":
615
+ return "PhysicsSphericalJoint";
616
+ case "fixed":
617
+ return "PhysicsFixedJoint";
618
+ case "d6":
619
+ return "PhysicsD6Joint";
620
+ default:
621
+ return "PhysicsFixedJoint";
622
+ }
623
+ }
624
+ emitDrive(drive, axis) {
625
+ const driveAttr = `physics:${axis.toLowerCase()}Drive`;
626
+ this.emitBlank();
627
+ this.emit(`# PhysicsDriveAPI`);
628
+ this.emit(`token ${driveAttr}:type = "${drive.driveType}"`);
629
+ if (drive.maxForce !== void 0) {
630
+ this.emit(`float ${driveAttr}:maxForce = ${drive.maxForce}`);
631
+ }
632
+ if (drive.targetPosition !== void 0) {
633
+ this.emit(`float ${driveAttr}:targetPosition = ${drive.targetPosition}`);
634
+ }
635
+ if (drive.targetVelocity !== void 0) {
636
+ this.emit(`float ${driveAttr}:targetVelocity = ${drive.targetVelocity}`);
637
+ }
638
+ if (drive.stiffness !== void 0) {
639
+ this.emit(`float ${driveAttr}:stiffness = ${drive.stiffness}`);
640
+ }
641
+ if (drive.damping !== void 0) {
642
+ this.emit(`float ${driveAttr}:damping = ${drive.damping}`);
643
+ }
644
+ }
645
+ // ===========================================================================
646
+ // EXTRACTION FROM COMPOSITION
647
+ // ===========================================================================
648
+ extractFromComposition(composition) {
649
+ this.materials.set("default", {
650
+ path: "/PhysicsMaterials/DefaultMaterial",
651
+ name: "DefaultMaterial",
652
+ staticFriction: this.options.defaultStaticFriction,
653
+ dynamicFriction: this.options.defaultDynamicFriction,
654
+ restitution: this.options.defaultRestitution
655
+ });
656
+ if (composition.objects) {
657
+ for (const obj of composition.objects) {
658
+ const prim = this.processObject(obj);
659
+ if (prim) {
660
+ this.prims.push(prim);
661
+ }
662
+ }
663
+ }
664
+ if (composition.spatialGroups) {
665
+ for (const group of composition.spatialGroups) {
666
+ const groupPrims = this.processSpatialGroup(group);
667
+ this.prims.push(...groupPrims);
668
+ }
669
+ }
670
+ }
671
+ processObject(obj, parentPath) {
672
+ const name = this.sanitizeName(obj.name);
673
+ const path = parentPath ? `${parentPath}/${name}` : name;
674
+ const hasPhysics = this.hasTrait(obj, "physics") || this.hasTrait(obj, "rigid");
675
+ const hasCollider = this.hasTrait(obj, "collidable") || this.hasTrait(obj, "trigger");
676
+ const isKinematic = this.hasTrait(obj, "kinematic");
677
+ const isArticulationRoot = this.hasTrait(obj, "articulation_root");
678
+ const physicsConfig = this.getTraitConfig(obj, "physics") || {};
679
+ const jointConfig = this.getTraitConfig(obj, "joint");
680
+ const geometry = this.extractGeometry(obj);
681
+ const position = this.extractPosition(obj);
682
+ const rotation = this.extractRotation(obj);
683
+ const scale = this.extractScale(obj);
684
+ let typeName = "Xform";
685
+ if (geometry) {
686
+ typeName = geometry.type === "Reference" ? "Xform" : geometry.type;
687
+ }
688
+ const apis = [];
689
+ if (hasPhysics) {
690
+ apis.push({
691
+ type: "PhysicsRigidBodyAPI",
692
+ rigidBodyEnabled: true,
693
+ kinematicEnabled: isKinematic
694
+ });
695
+ }
696
+ if (hasCollider || hasPhysics) {
697
+ const collisionApi = {
698
+ type: "PhysicsCollisionAPI",
699
+ collisionEnabled: true
700
+ };
701
+ if (geometry && geometry.type !== "Reference") {
702
+ collisionApi.collisionShape = geometry.type;
703
+ if (geometry.size) {
704
+ collisionApi.collisionSize = geometry.size;
705
+ }
706
+ if (geometry.radius !== void 0) {
707
+ collisionApi.collisionRadius = geometry.radius;
708
+ }
709
+ if (geometry.type === "Cylinder" || geometry.type === "Capsule" || geometry.type === "Cone") {
710
+ collisionApi.collisionHeight = scale[1];
711
+ }
712
+ }
713
+ apis.push(collisionApi);
714
+ }
715
+ if (hasPhysics) {
716
+ const mass = physicsConfig.mass ?? this.options.defaultMass;
717
+ apis.push({
718
+ type: "PhysicsMassAPI",
719
+ mass
720
+ });
721
+ }
722
+ if (isArticulationRoot) {
723
+ apis.push({
724
+ type: "PhysicsArticulationRootAPI",
725
+ articulationEnabled: true
726
+ });
727
+ }
728
+ if (jointConfig) {
729
+ const jointType = this.mapJointType(String(jointConfig.type || "fixed"));
730
+ const rawParentBody = String(jointConfig.connectedBody || "");
731
+ const articulationRoot = `/${this.compositionName}`;
732
+ const body0Path = rawParentBody ? rawParentBody.startsWith("/") ? rawParentBody : `${articulationRoot}/${this.sanitizeName(rawParentBody)}` : articulationRoot;
733
+ const body1Path = `/${this.compositionName}/${this.sanitizeName(name)}`;
734
+ const axis = this.mapAxis(jointConfig.axis);
735
+ const joint = {
736
+ type: "PhysicsJoint",
737
+ jointType,
738
+ body0: body0Path,
739
+ body1: body1Path,
740
+ axis
741
+ };
742
+ if (jointConfig.lowerLimit !== void 0 || jointConfig.upperLimit !== void 0) {
743
+ const isRevolute = jointType === "revolute";
744
+ joint.lowerLimit = jointConfig.lowerLimit !== void 0 ? isRevolute ? Number(jointConfig.lowerLimit) * (Math.PI / 180) : Number(jointConfig.lowerLimit) : void 0;
745
+ joint.upperLimit = jointConfig.upperLimit !== void 0 ? isRevolute ? Number(jointConfig.upperLimit) * (Math.PI / 180) : Number(jointConfig.upperLimit) : void 0;
746
+ }
747
+ if (jointConfig.motor) {
748
+ const motorConfig = jointConfig.motor;
749
+ joint.drives = [
750
+ {
751
+ type: "PhysicsDriveAPI",
752
+ driveType: motorConfig.type || "position",
753
+ maxForce: motorConfig.maxForce,
754
+ stiffness: motorConfig.stiffness,
755
+ damping: motorConfig.damping
756
+ }
757
+ ];
758
+ }
759
+ this.joints.push(joint);
760
+ }
761
+ return {
762
+ path,
763
+ name,
764
+ typeName,
765
+ translation: position,
766
+ rotation,
767
+ scale,
768
+ children: [],
769
+ apis
770
+ };
771
+ }
772
+ processSpatialGroup(group) {
773
+ const prims = [];
774
+ const groupName = this.sanitizeName(group.name);
775
+ const groupPrim = {
776
+ path: groupName,
777
+ name: groupName,
778
+ typeName: "Xform",
779
+ children: [],
780
+ apis: []
781
+ };
782
+ const hasRobotObjects = group.objects?.some((obj) => this.hasTrait(obj, "joint"));
783
+ if (hasRobotObjects) {
784
+ groupPrim.apis.push({
785
+ type: "PhysicsArticulationRootAPI",
786
+ articulationEnabled: true
787
+ });
788
+ }
789
+ if (group.objects) {
790
+ for (const obj of group.objects) {
791
+ const childPrim = this.processObject(obj, groupName);
792
+ if (childPrim) {
793
+ groupPrim.children.push(childPrim);
794
+ }
795
+ }
796
+ }
797
+ prims.push(groupPrim);
798
+ return prims;
799
+ }
800
+ // ===========================================================================
801
+ // SEMANTIC AST EMBEDDING (Metaverse Standards Forum interoperability)
802
+ // ===========================================================================
803
+ /**
804
+ * Emit a `customData` block on the root Xform carrying a compact
805
+ * representation of the HoloScript semantic AST.
806
+ *
807
+ * This enables downstream consumers (Omniverse extensions, Isaac Lab
808
+ * pipelines, or any USD-aware tool) to read the original behavioral
809
+ * intent without needing a HoloScript parser.
810
+ *
811
+ * The payload follows the MSF 3D Asset Interoperability WG recommendation
812
+ * of placing behavioral metadata in `customData` (USD) or `extras` (glTF).
813
+ */
814
+ emitSemanticCustomData(composition) {
815
+ this.emit(`# HoloScript Semantic AST (MSF Interoperability)`);
816
+ this.emit(`customData = {`);
817
+ this.indentLevel++;
818
+ this.emit(`string holoscript:version = "6.0"`);
819
+ this.emit(`string holoscript:compositionName = "${this.escapeStringValue(composition.name, "USD")}"`);
820
+ const objectNames = (composition.objects || []).map((o) => o.name);
821
+ if (objectNames.length > 0) {
822
+ const namesStr = objectNames.map((n) => `"${this.escapeStringValue(n, "USD")}"`).join(", ");
823
+ this.emit(`string[] holoscript:objects = [${namesStr}]`);
824
+ }
825
+ const allTraits = /* @__PURE__ */ new Set();
826
+ for (const obj of composition.objects || []) {
827
+ for (const trait of obj.traits || []) {
828
+ const tName = typeof trait === "string" ? trait : trait.name;
829
+ allTraits.add(tName);
830
+ }
831
+ }
832
+ if (allTraits.size > 0) {
833
+ const traitsStr = [...allTraits].map((t) => `"${this.escapeStringValue(t, "USD")}"`).join(", ");
834
+ this.emit(`string[] holoscript:traits = [${traitsStr}]`);
835
+ }
836
+ const groupNames = (composition.spatialGroups || []).map((g) => g.name);
837
+ if (groupNames.length > 0) {
838
+ const groupsStr = groupNames.map((n) => `"${this.escapeStringValue(n, "USD")}"`).join(", ");
839
+ this.emit(`string[] holoscript:spatialGroups = [${groupsStr}]`);
840
+ }
841
+ this.emit(`string holoscript:targetContext = "${this.options.targetContext}"`);
842
+ this.indentLevel--;
843
+ this.emit(`}`);
844
+ }
845
+ /**
846
+ * Convert a quaternion (x, y, z, w) back to Euler angles in degrees.
847
+ * Used when targetContext === 'isaac_sim' requires rotateXYZ ops.
848
+ */
849
+ quaternionToEulerDegrees(q) {
850
+ const [x, y, z, w] = q;
851
+ const RAD2DEG = 180 / Math.PI;
852
+ const sinr_cosp = 2 * (w * x + y * z);
853
+ const cosr_cosp = 1 - 2 * (x * x + y * y);
854
+ const roll = Math.atan2(sinr_cosp, cosr_cosp) * RAD2DEG;
855
+ const sinp = 2 * (w * y - z * x);
856
+ const pitch = Math.abs(sinp) >= 1 ? Math.sign(sinp) * 90 : Math.asin(sinp) * RAD2DEG;
857
+ const siny_cosp = 2 * (w * z + x * y);
858
+ const cosy_cosp = 1 - 2 * (y * y + z * z);
859
+ const yaw = Math.atan2(siny_cosp, cosy_cosp) * RAD2DEG;
860
+ return [roll, pitch, yaw];
861
+ }
862
+ };
863
+ function compileToUSDPhysics(composition, options) {
864
+ const compiler = new USDPhysicsCompiler(options);
865
+ return compiler.compile(composition, "system");
866
+ }
867
+ function compileForIsaacSim(composition, options) {
868
+ const isaacOptions = {
869
+ upAxis: "Z",
870
+ metersPerUnit: 1,
871
+ enableGPUDynamics: true,
872
+ enableArticulation: true,
873
+ timeCodesPerSecond: 60,
874
+ ...options
875
+ };
876
+ const compiler = new USDPhysicsCompiler(isaacOptions);
877
+ return compiler.compile(composition, "system");
878
+ }
879
+
880
+ export { USDPhysicsCompiler, compileForIsaacSim, compileToUSDPhysics };
881
+ //# sourceMappingURL=chunk-IVSZDECV.js.map
882
+ //# sourceMappingURL=chunk-IVSZDECV.js.map