three-usd-robot 0.13.0 → 0.14.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 (43) hide show
  1. package/README.md +19 -1
  2. package/dist/{MeshBinding-B_8RhuQE.d.ts → MeshBinding-5Dad1EOh.d.ts} +16 -4
  3. package/dist/{ThreeUsdRobot-X1zbpRZo.d.ts → ThreeUsdRobot-CurQqRqu.d.ts} +78 -2
  4. package/dist/{ThreeUsdRobotLoader-u3d1yoLM.d.ts → ThreeUsdRobotLoader-DrYXpMta.d.ts} +28 -4
  5. package/dist/chunk-ALC7RBKC.js +68 -0
  6. package/dist/chunk-ALC7RBKC.js.map +1 -0
  7. package/dist/{chunk-JN2QPDB3.js → chunk-HDZGWL6P.js} +36 -3
  8. package/dist/chunk-HDZGWL6P.js.map +1 -0
  9. package/dist/{chunk-YGJ23CG3.js → chunk-IAOPNN6V.js} +3 -66
  10. package/dist/chunk-IAOPNN6V.js.map +1 -0
  11. package/dist/{chunk-5ZPHZ5ZH.js → chunk-IT5RWB7A.js} +5 -4
  12. package/dist/chunk-IT5RWB7A.js.map +1 -0
  13. package/dist/{chunk-FUVHAORT.js → chunk-KRT4NL3H.js} +190 -126
  14. package/dist/chunk-KRT4NL3H.js.map +1 -0
  15. package/dist/{chunk-GRJGPHLW.js → chunk-WQRP5IDJ.js} +382 -59
  16. package/dist/chunk-WQRP5IDJ.js.map +1 -0
  17. package/dist/chunk-ZQXYVBQI.js +154 -0
  18. package/dist/chunk-ZQXYVBQI.js.map +1 -0
  19. package/dist/core.d.ts +5 -4
  20. package/dist/core.js +5 -3
  21. package/dist/extras.d.ts +2 -2
  22. package/dist/helpers.d.ts +2 -2
  23. package/dist/helpers.js +3 -2
  24. package/dist/helpers.js.map +1 -1
  25. package/dist/index.d.ts +61 -8
  26. package/dist/index.js +10 -8
  27. package/dist/index.js.map +1 -1
  28. package/dist/nodes.d.ts +4 -4
  29. package/dist/{parseMdl-vfzBGoMr.d.ts → parseMdl-M862hSal.d.ts} +1 -29
  30. package/dist/react.d.ts +5 -5
  31. package/dist/react.js +6 -4
  32. package/dist/react.js.map +1 -1
  33. package/dist/rendering.d.ts +114 -0
  34. package/dist/rendering.js +174 -0
  35. package/dist/rendering.js.map +1 -0
  36. package/dist/usdGeomCamera-BEsGuz7m.d.ts +53 -0
  37. package/dist/{buildKinematicTree-Q9JOjAjM.d.ts → usdLux-BqQlSOwG.d.ts} +108 -1
  38. package/package.json +5 -1
  39. package/dist/chunk-5ZPHZ5ZH.js.map +0 -1
  40. package/dist/chunk-FUVHAORT.js.map +0 -1
  41. package/dist/chunk-GRJGPHLW.js.map +0 -1
  42. package/dist/chunk-JN2QPDB3.js.map +0 -1
  43. package/dist/chunk-YGJ23CG3.js.map +0 -1
package/dist/helpers.js CHANGED
@@ -1,5 +1,6 @@
1
- import { ThreeUsdRobot } from './chunk-JN2QPDB3.js';
2
- import './chunk-YGJ23CG3.js';
1
+ import { ThreeUsdRobot } from './chunk-HDZGWL6P.js';
2
+ import './chunk-ALC7RBKC.js';
3
+ import './chunk-IAOPNN6V.js';
3
4
  import './chunk-JGIVJXBU.js';
4
5
  import * as THREE3 from 'three';
5
6
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers/appearance.ts","../src/helpers/JointAxisHelper.ts","../src/helpers/JointLimitHelper.ts","../src/helpers/LinkFrameHelper.ts","../src/helpers/attach.ts"],"names":["THREE","THREE2","lo","hi","THREE4"],"mappings":";;;;;AAiBA,IAAM,cAAA,uBAAqB,OAAA,EAAuD;AAGlF,IAAM,cAAA,GAAiB,0BAAA;AAOhB,SAAS,aAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,GAAqB,KAAA,EACP;AACd,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,QAAA,EAAU;AAChC,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,CAAA,GAAK,KAAK,QAAA,CAA+B,IAAA;AAC/C,IAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,WAAA,EAAa;AACzC,IAAA,IAAI,IAAA,KAAS,KAAA,IAAS,CAAA,KAAM,IAAA,EAAM;AAClC,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA;AACT;AAoBO,SAAS,aAAA,CACd,KAAA,EACA,IAAA,EACA,OAAA,GAAgC,EAAC,EACxB;AACT,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAClE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,IAAUA,MAAA,CAAA,KAAA,CAAM,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACvD,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,CAAC,eAAe,GAAA,CAAI,IAAI,GAAG,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,QAAQ,CAAA;AACrE,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AACpC,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAC9B,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,OAAO,OAAO,CAAC,IAC5C,SAAA,CAAU,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CACP,IAAA,EACA,KAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,EAAM;AACrB,EAAA,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,GAAI,IAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,IAAI,IAAI,sBAAA,EAAwB;AAC9B,IAAA,GAAA,CAAI,QAAA,CAAS,KAAK,KAAK,CAAA;AACvB,IAAA,GAAA,CAAI,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,GAAA;AAAA,EACvD,CAAA,MAAA,IAAW,WAAW,CAAA,EAAG;AACvB,IAAC,CAAA,CAA8B,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,CAAA,CAAE,WAAA,GAAc,QAAQ,OAAA,GAAU,CAAA;AAClC,IAAA,CAAA,CAAE,UAAU,OAAA,CAAQ,OAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;AAQO,SAAS,eAAA,CACd,KAAA,EACA,IAAA,EACA,QAAA,EACA,OAAqB,QAAA,EACZ;AACT,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAC9C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,CAAC,eAAe,GAAA,CAAI,IAAI,GAAG,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,QAAQ,CAAA;AACrE,IAAA,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,oBAAA,CAAqB,OAAsB,IAAA,EAAoB;AAC7E,EAAA,KAAA,MAAW,IAAA,IAAQ,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,IAAA,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,EAC5B;AACF;AAGO,SAAS,wBAAwB,KAAA,EAA4B;AAClE,EAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,YAAA,EAAa,EAAG,oBAAA,CAAqB,OAAO,IAAI,CAAA;AAC3E;AAGA,SAAS,uBAAuB,OAAA,EAAkD;AAChF,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,CAAC,OAAO,CAAA,EAAG;AAC5D,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,IAAK,OAAA,EAAQ;AAAA,EAC5C;AACF;AAwBO,SAAS,gBAAA,CACd,KAAA,EACA,OAAA,GAA6B,EAAC,EACf;AACf,EAAA,MAAM,QAAQ,IAAI,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,MAAM,IAAA,EAAM;AAAA,IACvD,kBAAkB,KAAA,CAAM,gBAAA;AAAA,IACxB,gBAAA,EAAkB,KAAA;AAAA,IAClB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,MAAA,CAAA;AAE1B,EAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,EAAA,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACtC,EAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE5B,EAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,QAAA,IACR,IAAUA,MAAA,CAAA,oBAAA,CAAqB;AAAA,IAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS,OAAA;AAAA,IACxB,WAAA,EAAa,IAAA;AAAA,IACb,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACZ,CAAA;AAEH,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,QAAA;AAC7B,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,YAAA,EAAa,EAAG;AACtC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,aAAA,CAAc,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,KAAA,MAAW,GAAA,IAAO,aAAA,CAAc,KAAA,EAAO,GAAA,EAAK,IAAI,CAAA,EAAG;AACjD,MAAA,MAAM,IAAA,GAAO,IAAUA,MAAA,CAAA,IAAA,CAAK,GAAA,CAAI,UAAU,QAAQ,CAAA;AAClD,MAAA,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,MAAA,CAAA;AACvB,MAAA,IAAA,CAAK,SAAS,IAAA,GAAO,OAAA;AACrB,MAAA,IAAA,CAAK,QAAA,CAAS,QAAA,GAAY,GAAA,CAAI,QAAA,CAAmC,QAAA;AACjE,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,MAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,aAAA,EAAc,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,KAAA,CAAM,cAAA,CAAe,QAAQ,WAAW,CAAA;AACjE,EAAA,OAAO,KAAA;AACT;ACpNO,IAAM,eAAA,GAAN,cAAoCC,MAAA,CAAA,WAAA,CAAY;AAAA,EAC5C,iBAAA,GAAoB,IAAA;AAAA,EAE7B,WAAA,CAAY,KAAA,EAAoB,MAAA,GAAS,GAAA,EAAK,QAAmC,QAAA,EAAU;AACzF,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAM,CAAE,SAAA,EAAU,EAAG,IAAUA,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,QAAQ,KAAK,CAAA;AAC/E,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,SAAS,CAAA,KAAA,CAAA;AAAA,EAChC;AACF;ACNO,IAAM,gBAAA,GAAN,cAAqC,MAAA,CAAA,IAAA,CAAK;AAAA,EACtC,kBAAA,GAAqB,IAAA;AAAA,EAE9B,WAAA,CAAY,KAAA,EAAoB,MAAA,GAAS,IAAA,EAAM,QAAmC,KAAA,EAAU;AAC1F,IAAA,KAAA,CAAM,kBAAA,CAAmB,OAAO,MAAM,CAAA,EAAG,IAAU,MAAA,CAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,CAAC,CAAA;AAC/E,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,SAAS,CAAA,MAAA,CAAA;AAAA,EAChC;AACF;AAEA,SAAS,kBAAA,CAAmB,OAAoB,MAAA,EAAsC;AACpF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,SAAA,EAAU;AAE1C,EAAA,IAAI,KAAA,CAAM,cAAc,WAAA,EAAa;AACnC,IAAA,MAAMC,GAAAA,GAAK,KAAA,CAAM,KAAA,IAAS,CAAC,MAAA;AAC3B,IAAA,MAAMC,GAAAA,GAAK,MAAM,KAAA,IAAS,MAAA;AAC1B,IAAA,OAAO,IAAU,MAAA,CAAA,cAAA,EAAe,CAAE,aAAA,CAAc;AAAA,MAC9C,IAAA,CAAK,KAAA,EAAM,CAAE,cAAA,CAAeD,GAAE,CAAA;AAAA,MAC9B,IAAA,CAAK,KAAA,EAAM,CAAE,cAAA,CAAeC,GAAE;AAAA,KAC/B,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAA,GAAK,MAAM,KAAA,IAAS,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,EAAA,GAAK,CAAA;AACpC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,mBAAmB,IAAI,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,EAAA,GAAA,CAAO,EAAA,GAAK,EAAA,IAAM,CAAA,GAAK,QAAA;AACjC,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,EACG,KAAA,EAAM,CACN,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,CACnC,gBAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,MAAM;AAAA,KAC5C;AAAA,EACF;AACA,EAAA,OAAO,IAAU,MAAA,CAAA,cAAA,EAAe,CAAE,aAAA,CAAc,MAAM,CAAA;AACxD;AAEA,SAAS,mBAAmB,IAAA,EAA6D;AACvF,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,IAAI,GAAA,GAAM,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3F,EAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,OAAA,EAAQ,CAAE,aAAa,IAAA,EAAM,GAAG,EAAE,SAAA,EAAU;AAChE,EAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,OAAA,EAAQ,CAAE,aAAa,IAAA,EAAM,CAAC,EAAE,SAAA,EAAU;AAC9D,EAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAChB;AClDO,IAAM,eAAA,GAAN,cAAoCC,MAAA,CAAA,UAAA,CAAW;AAAA,EAC3C,iBAAA,GAAoB,IAAA;AAAA,EAE7B,WAAA,CAAY,OAAO,GAAA,EAAK;AACtB,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EACd;AACF;;;ACHO,SAAS,mBAAA,CACd,KAAA,EACA,MAAA,EACA,KAAA,EACmB;AACnB,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,aAAA,EAAc,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,QAAQ,KAAK,CAAA;AACvD,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,oBAAA,CACd,KAAA,EACA,MAAA,EACA,KAAA,EACoB;AACpB,EAAA,MAAM,MAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,aAAA,EAAc,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,KAAA,EAAO,QAAQ,KAAK,CAAA;AACxD,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,mBAAA,CAAoB,OAAsB,IAAA,EAAkC;AAC1F,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,YAAA,EAAa,EAAG;AACvC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACT","file":"helpers.js","sourcesContent":["/**\n * Per-link appearance helpers: highlight (tint), material replacement, and\n * translucent \"ghost\" clones for pose previews.\n *\n * Material overrides are reversible — the original materials are kept aside on\n * first override and put back exactly by {@link restoreLinkMaterials} /\n * {@link restoreAllLinkMaterials}. Links are addressed like everywhere else:\n * by key or by full prim path.\n */\n\nimport * as THREE from \"three\";\nimport { ThreeUsdRobot } from \"../three/ThreeUsdRobot.js\";\n\n/** Which meshes of a link an operation affects. */\nexport type LinkMeshKind = \"visual\" | \"collision\" | \"all\";\n\n/** Originals saved on first override (per mesh; first save wins until restore). */\nconst savedMaterials = new WeakMap<THREE.Mesh, THREE.Material | THREE.Material[]>();\n\n/** Marks materials created by {@link highlightLink}, so restore can dispose them. */\nconst HIGHLIGHT_FLAG = \"__threeUsdRobotHighlight\";\n\n/**\n * The meshes belonging to exactly this link — not those of child links, which\n * live under their own `LinkObject` deeper in the kinematic chain. Helpers and\n * joint-frame groups are excluded.\n */\nexport function getLinkMeshes(\n robot: ThreeUsdRobot,\n link: string,\n kind: LinkMeshKind = \"all\",\n): THREE.Mesh[] {\n const obj = robot.getLinkObject(link);\n if (!obj) return [];\n const out: THREE.Mesh[] = [];\n for (const child of obj.children) {\n const mesh = child as THREE.Mesh;\n if (!mesh.isMesh) continue;\n const k = (mesh.userData as { kind?: string }).kind;\n if (k !== \"visual\" && k !== \"collision\") continue;\n if (kind !== \"all\" && k !== kind) continue;\n out.push(mesh);\n }\n return out;\n}\n\nexport type HighlightLinkOptions = {\n /** Highlight color (default red `0xff4444`). */\n color?: THREE.ColorRepresentation;\n /** Emissive strength of the tint (default `0.8`). */\n emissiveIntensity?: number;\n /** Force translucency while highlighted (e.g. `0.5`); default keeps the material's own. */\n opacity?: number;\n /** Which meshes of the link to affect (default `\"visual\"`). */\n kind?: LinkMeshKind;\n};\n\n/**\n * Tint a link's meshes (emissive red by default) while keeping their maps and\n * base colors — e.g. to flag a colliding link. Repeated calls re-tint from the\n * *original* materials, so highlights don't stack; restore with\n * {@link restoreLinkMaterials}. Returns `false` when the link has no matching\n * meshes.\n */\nexport function highlightLink(\n robot: ThreeUsdRobot,\n link: string,\n options: HighlightLinkOptions = {},\n): boolean {\n const meshes = getLinkMeshes(robot, link, options.kind ?? \"visual\");\n if (meshes.length === 0) return false;\n\n const color = new THREE.Color(options.color ?? 0xff4444);\n for (const mesh of meshes) {\n if (!savedMaterials.has(mesh)) savedMaterials.set(mesh, mesh.material);\n const base = savedMaterials.get(mesh)!;\n disposeHighlightClones(mesh.material);\n mesh.material = Array.isArray(base)\n ? base.map((m) => tintClone(m, color, options))\n : tintClone(base, color, options);\n }\n return true;\n}\n\nfunction tintClone(\n base: THREE.Material,\n color: THREE.Color,\n options: HighlightLinkOptions,\n): THREE.Material {\n const m = base.clone();\n m.userData[HIGHLIGHT_FLAG] = true;\n const std = m as THREE.MeshStandardMaterial;\n if (std.isMeshStandardMaterial) {\n std.emissive.copy(color);\n std.emissiveIntensity = options.emissiveIntensity ?? 0.8;\n } else if (\"color\" in m) {\n (m as THREE.MeshBasicMaterial).color.copy(color);\n }\n if (options.opacity !== undefined) {\n m.transparent = options.opacity < 1;\n m.opacity = options.opacity;\n }\n return m;\n}\n\n/**\n * Replace a link's mesh materials with `material` (one shared instance). The\n * caller keeps ownership — it is never disposed here. Restore the originals\n * with {@link restoreLinkMaterials}. Returns `false` when the link has no\n * matching meshes.\n */\nexport function setLinkMaterial(\n robot: ThreeUsdRobot,\n link: string,\n material: THREE.Material,\n kind: LinkMeshKind = \"visual\",\n): boolean {\n const meshes = getLinkMeshes(robot, link, kind);\n if (meshes.length === 0) return false;\n for (const mesh of meshes) {\n if (!savedMaterials.has(mesh)) savedMaterials.set(mesh, mesh.material);\n disposeHighlightClones(mesh.material);\n mesh.material = material;\n }\n return true;\n}\n\n/** Put back a link's original materials (no-op for untouched meshes). */\nexport function restoreLinkMaterials(robot: ThreeUsdRobot, link: string): void {\n for (const mesh of getLinkMeshes(robot, link, \"all\")) {\n const original = savedMaterials.get(mesh);\n if (original === undefined) continue;\n disposeHighlightClones(mesh.material);\n mesh.material = original;\n savedMaterials.delete(mesh);\n }\n}\n\n/** Put back the original materials of every link of the robot. */\nexport function restoreAllLinkMaterials(robot: ThreeUsdRobot): void {\n for (const name of robot.getLinkNames()) restoreLinkMaterials(robot, name);\n}\n\n/** Dispose materials created by {@link highlightLink} (never user-supplied ones). */\nfunction disposeHighlightClones(current: THREE.Material | THREE.Material[]): void {\n for (const m of Array.isArray(current) ? current : [current]) {\n if (m.userData[HIGHLIGHT_FLAG]) m.dispose();\n }\n}\n\nexport type GhostRobotOptions = {\n /** Ghost tint (default `0x66aaff`). */\n color?: THREE.ColorRepresentation;\n /** Ghost opacity (default `0.35`). */\n opacity?: number;\n /** Complete material override; `color` / `opacity` are ignored when given. */\n material?: THREE.Material;\n /** Which meshes to clone (default `\"visual\"`). */\n kind?: \"visual\" | \"collision\";\n /** Joint overrides applied on top of the source robot's current pose. */\n jointValues?: Record<string, number>;\n};\n\n/**\n * Build a translucent clone of the robot for pose previews (target pose,\n * onion-skinning). Geometry is shared with the source; every mesh uses one\n * ghost material and is tagged `userData.kind = \"ghost\"`, so the source's\n * `showVisual` / `showCollision` toggles never affect it. The clone is a full\n * {@link ThreeUsdRobot} — drive it with `setJointValues` — starting from the\n * source's current joint values (plus `jointValues` overrides) and mirroring\n * its root transform. Add it to the same parent/scene as the source.\n */\nexport function createGhostRobot(\n robot: ThreeUsdRobot,\n options: GhostRobotOptions = {},\n): ThreeUsdRobot {\n const ghost = new ThreeUsdRobot(robot.robot, robot.tree, {\n clampJointLimits: robot.clampJointLimits,\n applyInitialPose: false,\n upAxisConversion: \"none\",\n });\n ghost.name = `${robot.name}_ghost`;\n // Mirror the source root exactly (stage normalization + any user transform).\n ghost.position.copy(robot.position);\n ghost.quaternion.copy(robot.quaternion);\n ghost.scale.copy(robot.scale);\n\n const material =\n options.material ??\n new THREE.MeshStandardMaterial({\n color: options.color ?? 0x66aaff,\n transparent: true,\n opacity: options.opacity ?? 0.35,\n depthWrite: false,\n metalness: 0,\n roughness: 1,\n });\n\n const kind = options.kind ?? \"visual\";\n for (const key of robot.getLinkNames()) {\n const target = ghost.getLinkObject(key);\n if (!target) continue;\n for (const src of getLinkMeshes(robot, key, kind)) {\n const mesh = new THREE.Mesh(src.geometry, material);\n mesh.name = `${src.name}_ghost`;\n mesh.userData.kind = \"ghost\";\n mesh.userData.primPath = (src.userData as { primPath?: string }).primPath;\n mesh.matrixAutoUpdate = false;\n mesh.matrix.copy(src.matrix);\n mesh.matrixWorldNeedsUpdate = true;\n target.add(mesh);\n }\n }\n\n for (const name of robot.getJointNames()) {\n const value = robot.getJointValue(name);\n if (value !== undefined) ghost.setJointValue(name, value);\n }\n if (options.jointValues) ghost.setJointValues(options.jointValues);\n return ghost;\n}\n","import * as THREE from \"three\";\nimport type { JointObject } from \"../three/JointObject.js\";\n\n/**\n * An arrow drawn along a joint's motion axis (the rotation axis for\n * revolute/continuous joints, the slide direction for prismatic). Add it to the\n * joint's motion node so it tracks the joint.\n */\nexport class JointAxisHelper extends THREE.ArrowHelper {\n readonly isJointAxisHelper = true;\n\n constructor(joint: JointObject, length = 0.2, color: THREE.ColorRepresentation = 0xffd000) {\n super(joint.axis.clone().normalize(), new THREE.Vector3(0, 0, 0), length, color);\n this.name = `${joint.jointName}:axis`;\n }\n}\n","import * as THREE from \"three\";\nimport type { JointObject } from \"../three/JointObject.js\";\n\n/**\n * Visualizes a joint's range of motion: an arc swept between the lower and\n * upper limits (revolute/continuous) or a line segment between them\n * (prismatic). A limitless revolute joint draws a full circle. Add it to the\n * joint's motion node's parent frame (or the joint node) to anchor it.\n */\nexport class JointLimitHelper extends THREE.Line {\n readonly isJointLimitHelper = true;\n\n constructor(joint: JointObject, radius = 0.15, color: THREE.ColorRepresentation = 0x00aaff) {\n super(buildLimitGeometry(joint, radius), new THREE.LineBasicMaterial({ color }));\n this.name = `${joint.jointName}:limit`;\n }\n}\n\nfunction buildLimitGeometry(joint: JointObject, radius: number): THREE.BufferGeometry {\n const axis = joint.axis.clone().normalize();\n\n if (joint.jointType === \"prismatic\") {\n const lo = joint.lower ?? -radius;\n const hi = joint.upper ?? radius;\n return new THREE.BufferGeometry().setFromPoints([\n axis.clone().multiplyScalar(lo),\n axis.clone().multiplyScalar(hi),\n ]);\n }\n\n // Revolute / continuous: sweep an arc in the plane perpendicular to the axis.\n const lo = joint.lower ?? 0;\n const hi = joint.upper ?? Math.PI * 2;\n const { u, v } = perpendicularBasis(axis);\n const segments = 48;\n const points: THREE.Vector3[] = [];\n for (let i = 0; i <= segments; i++) {\n const t = lo + ((hi - lo) * i) / segments;\n points.push(\n u\n .clone()\n .multiplyScalar(Math.cos(t) * radius)\n .addScaledVector(v, Math.sin(t) * radius),\n );\n }\n return new THREE.BufferGeometry().setFromPoints(points);\n}\n\nfunction perpendicularBasis(axis: THREE.Vector3): { u: THREE.Vector3; v: THREE.Vector3 } {\n const ref = Math.abs(axis.x) < 0.9 ? new THREE.Vector3(1, 0, 0) : new THREE.Vector3(0, 1, 0);\n const u = new THREE.Vector3().crossVectors(axis, ref).normalize();\n const v = new THREE.Vector3().crossVectors(axis, u).normalize();\n return { u, v };\n}\n","import * as THREE from \"three\";\n\n/** A small RGB axes gizmo for a link's local frame. Add it to a `LinkObject`. */\nexport class LinkFrameHelper extends THREE.AxesHelper {\n readonly isLinkFrameHelper = true;\n\n constructor(size = 0.2) {\n super(size);\n this.name = \"linkFrame\";\n }\n}\n","import type * as THREE from \"three\";\nimport type { ThreeUsdRobot } from \"../three/ThreeUsdRobot.js\";\nimport { JointAxisHelper } from \"./JointAxisHelper.js\";\nimport { JointLimitHelper } from \"./JointLimitHelper.js\";\nimport { LinkFrameHelper } from \"./LinkFrameHelper.js\";\n\n/** Attach a {@link JointAxisHelper} to every articulated joint. Returns the helpers. */\nexport function addJointAxisHelpers(\n robot: ThreeUsdRobot,\n length?: number,\n color?: THREE.ColorRepresentation,\n): JointAxisHelper[] {\n const out: JointAxisHelper[] = [];\n for (const name of robot.getJointNames()) {\n const joint = robot.getJointObject(name);\n if (!joint?.articulated) continue;\n const helper = new JointAxisHelper(joint, length, color);\n joint.add(helper);\n out.push(helper);\n }\n return out;\n}\n\n/** Attach a {@link JointLimitHelper} to every articulated joint. Returns the helpers. */\nexport function addJointLimitHelpers(\n robot: ThreeUsdRobot,\n radius?: number,\n color?: THREE.ColorRepresentation,\n): JointLimitHelper[] {\n const out: JointLimitHelper[] = [];\n for (const name of robot.getJointNames()) {\n const joint = robot.getJointObject(name);\n if (!joint?.articulated) continue;\n const helper = new JointLimitHelper(joint, radius, color);\n joint.add(helper);\n out.push(helper);\n }\n return out;\n}\n\n/** Attach a {@link LinkFrameHelper} to every link. Returns the helpers. */\nexport function addLinkFrameHelpers(robot: ThreeUsdRobot, size?: number): LinkFrameHelper[] {\n const out: LinkFrameHelper[] = [];\n for (const name of robot.getLinkNames()) {\n const link = robot.getLinkObject(name);\n if (!link) continue;\n const helper = new LinkFrameHelper(size);\n link.add(helper);\n out.push(helper);\n }\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../src/helpers/appearance.ts","../src/helpers/JointAxisHelper.ts","../src/helpers/JointLimitHelper.ts","../src/helpers/LinkFrameHelper.ts","../src/helpers/attach.ts"],"names":["THREE","THREE2","lo","hi","THREE4"],"mappings":"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","file":"helpers.js","sourcesContent":["/**\n * Per-link appearance helpers: highlight (tint), material replacement, and\n * translucent \"ghost\" clones for pose previews.\n *\n * Material overrides are reversible — the original materials are kept aside on\n * first override and put back exactly by {@link restoreLinkMaterials} /\n * {@link restoreAllLinkMaterials}. Links are addressed like everywhere else:\n * by key or by full prim path.\n */\n\nimport * as THREE from \"three\";\nimport { ThreeUsdRobot } from \"../three/ThreeUsdRobot.js\";\n\n/** Which meshes of a link an operation affects. */\nexport type LinkMeshKind = \"visual\" | \"collision\" | \"all\";\n\n/** Originals saved on first override (per mesh; first save wins until restore). */\nconst savedMaterials = new WeakMap<THREE.Mesh, THREE.Material | THREE.Material[]>();\n\n/** Marks materials created by {@link highlightLink}, so restore can dispose them. */\nconst HIGHLIGHT_FLAG = \"__threeUsdRobotHighlight\";\n\n/**\n * The meshes belonging to exactly this link — not those of child links, which\n * live under their own `LinkObject` deeper in the kinematic chain. Helpers and\n * joint-frame groups are excluded.\n */\nexport function getLinkMeshes(\n robot: ThreeUsdRobot,\n link: string,\n kind: LinkMeshKind = \"all\",\n): THREE.Mesh[] {\n const obj = robot.getLinkObject(link);\n if (!obj) return [];\n const out: THREE.Mesh[] = [];\n for (const child of obj.children) {\n const mesh = child as THREE.Mesh;\n if (!mesh.isMesh) continue;\n const k = (mesh.userData as { kind?: string }).kind;\n if (k !== \"visual\" && k !== \"collision\") continue;\n if (kind !== \"all\" && k !== kind) continue;\n out.push(mesh);\n }\n return out;\n}\n\nexport type HighlightLinkOptions = {\n /** Highlight color (default red `0xff4444`). */\n color?: THREE.ColorRepresentation;\n /** Emissive strength of the tint (default `0.8`). */\n emissiveIntensity?: number;\n /** Force translucency while highlighted (e.g. `0.5`); default keeps the material's own. */\n opacity?: number;\n /** Which meshes of the link to affect (default `\"visual\"`). */\n kind?: LinkMeshKind;\n};\n\n/**\n * Tint a link's meshes (emissive red by default) while keeping their maps and\n * base colors — e.g. to flag a colliding link. Repeated calls re-tint from the\n * *original* materials, so highlights don't stack; restore with\n * {@link restoreLinkMaterials}. Returns `false` when the link has no matching\n * meshes.\n */\nexport function highlightLink(\n robot: ThreeUsdRobot,\n link: string,\n options: HighlightLinkOptions = {},\n): boolean {\n const meshes = getLinkMeshes(robot, link, options.kind ?? \"visual\");\n if (meshes.length === 0) return false;\n\n const color = new THREE.Color(options.color ?? 0xff4444);\n for (const mesh of meshes) {\n if (!savedMaterials.has(mesh)) savedMaterials.set(mesh, mesh.material);\n const base = savedMaterials.get(mesh)!;\n disposeHighlightClones(mesh.material);\n mesh.material = Array.isArray(base)\n ? base.map((m) => tintClone(m, color, options))\n : tintClone(base, color, options);\n }\n return true;\n}\n\nfunction tintClone(\n base: THREE.Material,\n color: THREE.Color,\n options: HighlightLinkOptions,\n): THREE.Material {\n const m = base.clone();\n m.userData[HIGHLIGHT_FLAG] = true;\n const std = m as THREE.MeshStandardMaterial;\n if (std.isMeshStandardMaterial) {\n std.emissive.copy(color);\n std.emissiveIntensity = options.emissiveIntensity ?? 0.8;\n } else if (\"color\" in m) {\n (m as THREE.MeshBasicMaterial).color.copy(color);\n }\n if (options.opacity !== undefined) {\n m.transparent = options.opacity < 1;\n m.opacity = options.opacity;\n }\n return m;\n}\n\n/**\n * Replace a link's mesh materials with `material` (one shared instance). The\n * caller keeps ownership — it is never disposed here. Restore the originals\n * with {@link restoreLinkMaterials}. Returns `false` when the link has no\n * matching meshes.\n */\nexport function setLinkMaterial(\n robot: ThreeUsdRobot,\n link: string,\n material: THREE.Material,\n kind: LinkMeshKind = \"visual\",\n): boolean {\n const meshes = getLinkMeshes(robot, link, kind);\n if (meshes.length === 0) return false;\n for (const mesh of meshes) {\n if (!savedMaterials.has(mesh)) savedMaterials.set(mesh, mesh.material);\n disposeHighlightClones(mesh.material);\n mesh.material = material;\n }\n return true;\n}\n\n/** Put back a link's original materials (no-op for untouched meshes). */\nexport function restoreLinkMaterials(robot: ThreeUsdRobot, link: string): void {\n for (const mesh of getLinkMeshes(robot, link, \"all\")) {\n const original = savedMaterials.get(mesh);\n if (original === undefined) continue;\n disposeHighlightClones(mesh.material);\n mesh.material = original;\n savedMaterials.delete(mesh);\n }\n}\n\n/** Put back the original materials of every link of the robot. */\nexport function restoreAllLinkMaterials(robot: ThreeUsdRobot): void {\n for (const name of robot.getLinkNames()) restoreLinkMaterials(robot, name);\n}\n\n/** Dispose materials created by {@link highlightLink} (never user-supplied ones). */\nfunction disposeHighlightClones(current: THREE.Material | THREE.Material[]): void {\n for (const m of Array.isArray(current) ? current : [current]) {\n if (m.userData[HIGHLIGHT_FLAG]) m.dispose();\n }\n}\n\nexport type GhostRobotOptions = {\n /** Ghost tint (default `0x66aaff`). */\n color?: THREE.ColorRepresentation;\n /** Ghost opacity (default `0.35`). */\n opacity?: number;\n /** Complete material override; `color` / `opacity` are ignored when given. */\n material?: THREE.Material;\n /** Which meshes to clone (default `\"visual\"`). */\n kind?: \"visual\" | \"collision\";\n /** Joint overrides applied on top of the source robot's current pose. */\n jointValues?: Record<string, number>;\n};\n\n/**\n * Build a translucent clone of the robot for pose previews (target pose,\n * onion-skinning). Geometry is shared with the source; every mesh uses one\n * ghost material and is tagged `userData.kind = \"ghost\"`, so the source's\n * `showVisual` / `showCollision` toggles never affect it. The clone is a full\n * {@link ThreeUsdRobot} — drive it with `setJointValues` — starting from the\n * source's current joint values (plus `jointValues` overrides) and mirroring\n * its root transform. Add it to the same parent/scene as the source.\n */\nexport function createGhostRobot(\n robot: ThreeUsdRobot,\n options: GhostRobotOptions = {},\n): ThreeUsdRobot {\n const ghost = new ThreeUsdRobot(robot.robot, robot.tree, {\n clampJointLimits: robot.clampJointLimits,\n applyInitialPose: false,\n upAxisConversion: \"none\",\n });\n ghost.name = `${robot.name}_ghost`;\n // Mirror the source root exactly (stage normalization + any user transform).\n ghost.position.copy(robot.position);\n ghost.quaternion.copy(robot.quaternion);\n ghost.scale.copy(robot.scale);\n\n const material =\n options.material ??\n new THREE.MeshStandardMaterial({\n color: options.color ?? 0x66aaff,\n transparent: true,\n opacity: options.opacity ?? 0.35,\n depthWrite: false,\n metalness: 0,\n roughness: 1,\n });\n\n const kind = options.kind ?? \"visual\";\n for (const key of robot.getLinkNames()) {\n const target = ghost.getLinkObject(key);\n if (!target) continue;\n for (const src of getLinkMeshes(robot, key, kind)) {\n const mesh = new THREE.Mesh(src.geometry, material);\n mesh.name = `${src.name}_ghost`;\n mesh.userData.kind = \"ghost\";\n mesh.userData.primPath = (src.userData as { primPath?: string }).primPath;\n mesh.matrixAutoUpdate = false;\n mesh.matrix.copy(src.matrix);\n mesh.matrixWorldNeedsUpdate = true;\n target.add(mesh);\n }\n }\n\n for (const name of robot.getJointNames()) {\n const value = robot.getJointValue(name);\n if (value !== undefined) ghost.setJointValue(name, value);\n }\n if (options.jointValues) ghost.setJointValues(options.jointValues);\n return ghost;\n}\n","import * as THREE from \"three\";\nimport type { JointObject } from \"../three/JointObject.js\";\n\n/**\n * An arrow drawn along a joint's motion axis (the rotation axis for\n * revolute/continuous joints, the slide direction for prismatic). Add it to the\n * joint's motion node so it tracks the joint.\n */\nexport class JointAxisHelper extends THREE.ArrowHelper {\n readonly isJointAxisHelper = true;\n\n constructor(joint: JointObject, length = 0.2, color: THREE.ColorRepresentation = 0xffd000) {\n super(joint.axis.clone().normalize(), new THREE.Vector3(0, 0, 0), length, color);\n this.name = `${joint.jointName}:axis`;\n }\n}\n","import * as THREE from \"three\";\nimport type { JointObject } from \"../three/JointObject.js\";\n\n/**\n * Visualizes a joint's range of motion: an arc swept between the lower and\n * upper limits (revolute/continuous) or a line segment between them\n * (prismatic). A limitless revolute joint draws a full circle. Add it to the\n * joint's motion node's parent frame (or the joint node) to anchor it.\n */\nexport class JointLimitHelper extends THREE.Line {\n readonly isJointLimitHelper = true;\n\n constructor(joint: JointObject, radius = 0.15, color: THREE.ColorRepresentation = 0x00aaff) {\n super(buildLimitGeometry(joint, radius), new THREE.LineBasicMaterial({ color }));\n this.name = `${joint.jointName}:limit`;\n }\n}\n\nfunction buildLimitGeometry(joint: JointObject, radius: number): THREE.BufferGeometry {\n const axis = joint.axis.clone().normalize();\n\n if (joint.jointType === \"prismatic\") {\n const lo = joint.lower ?? -radius;\n const hi = joint.upper ?? radius;\n return new THREE.BufferGeometry().setFromPoints([\n axis.clone().multiplyScalar(lo),\n axis.clone().multiplyScalar(hi),\n ]);\n }\n\n // Revolute / continuous: sweep an arc in the plane perpendicular to the axis.\n const lo = joint.lower ?? 0;\n const hi = joint.upper ?? Math.PI * 2;\n const { u, v } = perpendicularBasis(axis);\n const segments = 48;\n const points: THREE.Vector3[] = [];\n for (let i = 0; i <= segments; i++) {\n const t = lo + ((hi - lo) * i) / segments;\n points.push(\n u\n .clone()\n .multiplyScalar(Math.cos(t) * radius)\n .addScaledVector(v, Math.sin(t) * radius),\n );\n }\n return new THREE.BufferGeometry().setFromPoints(points);\n}\n\nfunction perpendicularBasis(axis: THREE.Vector3): { u: THREE.Vector3; v: THREE.Vector3 } {\n const ref = Math.abs(axis.x) < 0.9 ? new THREE.Vector3(1, 0, 0) : new THREE.Vector3(0, 1, 0);\n const u = new THREE.Vector3().crossVectors(axis, ref).normalize();\n const v = new THREE.Vector3().crossVectors(axis, u).normalize();\n return { u, v };\n}\n","import * as THREE from \"three\";\n\n/** A small RGB axes gizmo for a link's local frame. Add it to a `LinkObject`. */\nexport class LinkFrameHelper extends THREE.AxesHelper {\n readonly isLinkFrameHelper = true;\n\n constructor(size = 0.2) {\n super(size);\n this.name = \"linkFrame\";\n }\n}\n","import type * as THREE from \"three\";\nimport type { ThreeUsdRobot } from \"../three/ThreeUsdRobot.js\";\nimport { JointAxisHelper } from \"./JointAxisHelper.js\";\nimport { JointLimitHelper } from \"./JointLimitHelper.js\";\nimport { LinkFrameHelper } from \"./LinkFrameHelper.js\";\n\n/** Attach a {@link JointAxisHelper} to every articulated joint. Returns the helpers. */\nexport function addJointAxisHelpers(\n robot: ThreeUsdRobot,\n length?: number,\n color?: THREE.ColorRepresentation,\n): JointAxisHelper[] {\n const out: JointAxisHelper[] = [];\n for (const name of robot.getJointNames()) {\n const joint = robot.getJointObject(name);\n if (!joint?.articulated) continue;\n const helper = new JointAxisHelper(joint, length, color);\n joint.add(helper);\n out.push(helper);\n }\n return out;\n}\n\n/** Attach a {@link JointLimitHelper} to every articulated joint. Returns the helpers. */\nexport function addJointLimitHelpers(\n robot: ThreeUsdRobot,\n radius?: number,\n color?: THREE.ColorRepresentation,\n): JointLimitHelper[] {\n const out: JointLimitHelper[] = [];\n for (const name of robot.getJointNames()) {\n const joint = robot.getJointObject(name);\n if (!joint?.articulated) continue;\n const helper = new JointLimitHelper(joint, radius, color);\n joint.add(helper);\n out.push(helper);\n }\n return out;\n}\n\n/** Attach a {@link LinkFrameHelper} to every link. Returns the helpers. */\nexport function addLinkFrameHelpers(robot: ThreeUsdRobot, size?: number): LinkFrameHelper[] {\n const out: LinkFrameHelper[] = [];\n for (const name of robot.getLinkNames()) {\n const link = robot.getLinkObject(name);\n if (!link) continue;\n const helper = new LinkFrameHelper(size);\n link.add(helper);\n out.push(helper);\n }\n return out;\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,18 +1,71 @@
1
1
  import { CollisionApproximation, ExportPhysicsMaterial, RobotGeometryProvider, ExportRobotOptions, ExportMaterial, ExportMesh } from './core.js';
2
2
  export { ARTICULATION_ROOT_API, COLLISION_API, ComposeOptions, CrateReader, ExtractOptions, JointDofInput, JointRelativeDecomposition, MASS_API, MESH_COLLISION_API, PACKAGE_NAME, PHYSICS_MATERIAL_API, ParseError, RIGID_BODY_API, ResolvedXform, TextureChannel, TokenizeError, UsdzPackage, VERSION, ValidateRobotOptions, ValidationIssue, ValidationSeverity, collectMdlAssetPaths, composeFile, composeLayer, computeLocalTransform, computeWorldTransform, crateToUsdaFile, decomposeJointRelative, driveKindFor, exportRobotUsda, extractRobotDescription, gatherGprimDescendants, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getMassProperties, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, isBasisCurves, isMesh, isPoints, isRenderableGprim, isScope, isSolidGprim, isUnsupportedGprim, isXform, isZip, iterDescendants, jointValueFromSI, jointValueToSI, loadMdlModules, nearestAngleBranch, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, serializeUsda, stageGeometryProvider, tokenize, validateRobotDescription, writeUsdz } from './core.js';
3
3
  import * as THREE from 'three';
4
- import { A as Axis, J as JointDriveDescription, L as LinkInertialDescription, R as RobotDescription, K as KinematicTree, U as UsdaFile, S as Stage, M as Mat4 } from './buildKinematicTree-Q9JOjAjM.js';
5
- export { a as AssetPath, b as Attribute, c as AttributeSpec, B as BuildTreeOptions, C as CompositionArc, D as DEFAULT_METERS_PER_UNIT, d as DEG2RAD, e as JointDescription, f as JointMimicDescription, g as JointType, h as KinematicNode, i as Layer, j as LinkDescription, k as ListOp, l as MetadataMap, P as Prim, m as PrimSpec, n as PropertySpec, Q as Quat, o as RAD2DEG, p as Relationship, q as RelationshipSpec, r as SampleChannel, s as SdfPath, t as Specifier, T as TreeEdge, u as UpAxis, v as UsdDictionary, w as UsdMatrix, x as UsdValue, V as Variability, y as Vec2, z as Vec3, E as Vec4, F as buildKinematicTree, G as channelFromSamples, H as decomposeRigid, I as fromUsdMatrix, N as getTranslation, O as identity4, W as interpolate, X as invert, Y as makeEuler, Z as makeRotationFromQuat, _ as makeRotationX, $ as makeRotationY, a0 as makeRotationZ, a1 as makeScale, a2 as makeTranslation, a3 as multiply, a4 as multiplyAll, a5 as toUsdMatrix } from './buildKinematicTree-Q9JOjAjM.js';
6
- import { T as ThreeUsdRobot } from './ThreeUsdRobot-X1zbpRZo.js';
7
- export { J as JointObject, b as JointResidual, c as JointValuesFromLinkTransformsOptions, L as LinkObject, d as LinkPose, e as LinkPoseSpace, f as LinkPosesOptions, a as ThreeUsdRobotOptions, W as WorldUpAxis } from './ThreeUsdRobot-X1zbpRZo.js';
8
- export { B as BindMeshesOptions, a as BuildGprimOptions, M as MaterialFactory, b as MeshKind, R as ResolveMaterialOptions, c as ResolvedMaterial, d as ResolvedTexture, e as TextureColorSpace, f as TextureOptions, T as TextureProvider, g as TextureTransform, h as TextureWrap, i as bindRobotMeshes, j as bindSceneMeshes, k as buildGprimGeometry, l as buildGprimObject, m as buildMeshGeometry, n as buildMeshMaterial, o as createTextureProvider, p as findBoundSurfaceShader, r as resolveBoundMaterial } from './MeshBinding-B_8RhuQE.js';
9
- export { a as ThreeUsdRobotLoader, T as ThreeUsdRobotLoaderOptions } from './ThreeUsdRobotLoader-u3d1yoLM.js';
10
- export { A as AssetResolver, D as DefaultAssetResolver, M as MdlMaterialDecl, a as MdlModule, b as MdlModuleProvider, c as MdlTextureValue, d as MdlValue, e as createMemoryResolver, i as isMdlTexture, j as joinPosix, p as parseMdl, f as parseMdlLiteral } from './parseMdl-vfzBGoMr.js';
4
+ import { b as Axis, L as LightDescription, S as Stage, J as JointDriveDescription, c as LinkInertialDescription, R as RobotDescription, K as KinematicTree, U as UsdaFile, M as Mat4 } from './usdLux-BqQlSOwG.js';
5
+ export { d as AssetPath, A as AssetResolver, e as Attribute, f as AttributeSpec, B as BuildTreeOptions, C as CompositionArc, D as DEFAULT_METERS_PER_UNIT, g as DEG2RAD, h as DefaultAssetResolver, i as JointDescription, j as JointMimicDescription, k as JointType, l as KinematicNode, m as Layer, n as LinkDescription, o as ListOp, p as MetadataMap, P as Prim, q as PrimSpec, r as PropertySpec, Q as Quat, s as RAD2DEG, t as Relationship, u as RelationshipSpec, v as SampleChannel, w as SdfPath, x as Specifier, T as TreeEdge, y as UpAxis, z as UsdDictionary, E as UsdLightKind, F as UsdMatrix, G as UsdValue, H as Variability, V as Vec2, a as Vec3, I as Vec4, N as buildKinematicTree, O as channelFromSamples, W as colorTemperatureToRgb, X as createMemoryResolver, Y as decomposeRigid, Z as fromUsdMatrix, _ as getLightKind, $ as getTranslation, a0 as identity4, a1 as interpolate, a2 as invert, a3 as isLight, a4 as isUnsupportedLight, a5 as joinPosix, a6 as makeEuler, a7 as makeRotationFromQuat, a8 as makeRotationX, a9 as makeRotationY, aa as makeRotationZ, ab as makeScale, ac as makeTranslation, ad as multiply, ae as multiplyAll, af as readLightDescription, ag as toUsdMatrix } from './usdLux-BqQlSOwG.js';
6
+ import { T as ThreeUsdRobot } from './ThreeUsdRobot-CurQqRqu.js';
7
+ export { A as AspectConformPolicy, B as BindCamerasOptions, J as JointObject, b as JointResidual, c as JointValuesFromLinkTransformsOptions, L as LinkObject, d as LinkPose, e as LinkPoseSpace, f as LinkPosesOptions, a as ThreeUsdRobotOptions, U as UsdBoundCamera, W as WorldUpAxis, g as bindCameras, h as conformCameraAspect } from './ThreeUsdRobot-CurQqRqu.js';
8
+ export { B as BindMeshesOptions, a as BuildGprimOptions, M as MaterialFactory, b as MeshKind, R as ResolveMaterialOptions, c as ResolvedMaterial, d as ResolvedTexture, e as TextureColorSpace, f as TextureOptions, T as TextureProvider, g as TextureTransform, h as TextureWrap, i as bindRobotMeshes, j as bindSceneMeshes, k as buildGprimGeometry, l as buildGprimObject, m as buildMeshGeometry, n as buildMeshMaterial, o as createTextureProvider, p as findBoundSurfaceShader, r as resolveBoundMaterial } from './MeshBinding-5Dad1EOh.js';
9
+ export { a as ThreeUsdRobotLoader, T as ThreeUsdRobotLoaderOptions } from './ThreeUsdRobotLoader-DrYXpMta.js';
11
10
  export { B as BinarySource, U as UsdSource, t as toBytes } from './bytes-CxGRGry_.js';
11
+ export { a as MdlMaterialDecl, b as MdlModule, M as MdlModuleProvider, c as MdlTextureValue, d as MdlValue, i as isMdlTexture, p as parseMdl, e as parseMdlLiteral } from './parseMdl-M862hSal.js';
12
+ export { C as CameraDescription, c as computeCameraExposureScale, i as isCamera, r as readCameraDescription } from './usdGeomCamera-BEsGuz7m.js';
12
13
 
13
14
  /** Unit vector for a USD joint axis token. Returns a fresh vector each call. */
14
15
  declare function axisVector(axis: Axis): THREE.Vector3;
15
16
 
17
+ /**
18
+ * Binds UsdLux light prims to Three.js lights and attaches them into the
19
+ * robot's hierarchy (M25).
20
+ *
21
+ * Placement mirrors the gprim binding: a light under a link prim parents to
22
+ * that link's object (so a wrist lamp moves with the joint chain), anything
23
+ * else parents to the deepest already-mirrored ancestor — a scenery group from
24
+ * `bindSceneMeshes` — or the robot root, positioned by its accumulated local
25
+ * transform. Up-axis and unit normalization then apply at the root as usual.
26
+ *
27
+ * DomeLights create no Three.js light: they are collected on
28
+ * {@link ThreeUsdRobot.domeLights}, to be applied as the scene environment by
29
+ * `applyUsdEnvironment` from `three-usd-robot/rendering` (M26).
30
+ */
31
+
32
+ type BindLightsOptions = {
33
+ /**
34
+ * Multiplies every light's effective emission (`intensity × 2^exposure`).
35
+ * Default `1` — the authored UsdLux value passes through unchanged. Stages
36
+ * authored in Omniverse/RTX photometric units (intensities in the thousands)
37
+ * typically want `0.001` to land in Three.js's exposure-1 range; see
38
+ * docs/lighting.md.
39
+ */
40
+ lightIntensityScale?: number;
41
+ /**
42
+ * Configure shadow casting: `castShadow` per the light's ShadowAPI, with the
43
+ * shadow camera fitted to the scene bounds. Default `false` here — the
44
+ * loader defaults it on.
45
+ */
46
+ shadows?: boolean;
47
+ /** Receives fidelity diagnostics (unsupported/approximated light types). */
48
+ onWarn?: (message: string) => void;
49
+ };
50
+ /** Result of {@link bindLights}. */
51
+ type BoundLights = {
52
+ /**
53
+ * The Three.js lights created, already attached to the hierarchy. Each
54
+ * carries `userData.primPath` and `userData.usdLight` (its
55
+ * {@link LightDescription}).
56
+ */
57
+ lights: THREE.Light[];
58
+ /** DomeLights parsed but not realized — apply via `applyUsdEnvironment` (M26). */
59
+ domes: LightDescription[];
60
+ };
61
+ /**
62
+ * Traverse the stage and bind every supported UsdLux light. Call after mesh
63
+ * binding so lights can anchor to the mirrored scenery groups and shadow
64
+ * cameras can fit the scene bounds. Lights with `visibility = "invisible"` or
65
+ * a guide/proxy purpose are skipped.
66
+ */
67
+ declare function bindLights(stage: Stage, robot3d: ThreeUsdRobot, options?: BindLightsOptions): BoundLights;
68
+
16
69
  /**
17
70
  * Authoring API (M14): assemble a robot from Three.js objects and export it.
18
71
  *
@@ -156,4 +209,4 @@ type ExportThreeUsdRobotOptions = Omit<ExportRobotOptions, "geometry"> & {
156
209
  /** Export a loaded robot back to a USDA AST (pass the result to `serializeUsda`). */
157
210
  declare function exportThreeUsdRobot(robot: ThreeUsdRobot, options?: ExportThreeUsdRobotOptions): UsdaFile;
158
211
 
159
- export { type AddJointOptions, type AddLinkOptions, Axis, CollisionApproximation, ExportMaterial, ExportMesh, ExportPhysicsMaterial, ExportRobotOptions, type ExportThreeUsdRobotOptions, type GeometryToExportMeshOptions, JointDriveDescription, KinematicTree, LinkInertialDescription, Mat4, RobotBuilder, type RobotBuilderOptions, RobotDescription, RobotGeometryProvider, Stage, ThreeUsdRobot, UsdaFile, type WorldFrame, axisVector, exportThreeUsdRobot, geometryToExportMesh, materialToExportMaterial, threeGeometryProvider };
212
+ export { type AddJointOptions, type AddLinkOptions, Axis, type BindLightsOptions, type BoundLights, CollisionApproximation, ExportMaterial, ExportMesh, ExportPhysicsMaterial, ExportRobotOptions, type ExportThreeUsdRobotOptions, type GeometryToExportMeshOptions, JointDriveDescription, KinematicTree, LightDescription, LinkInertialDescription, Mat4, RobotBuilder, type RobotBuilderOptions, RobotDescription, RobotGeometryProvider, Stage, ThreeUsdRobot, UsdaFile, type WorldFrame, axisVector, bindLights, exportThreeUsdRobot, geometryToExportMesh, materialToExportMaterial, threeGeometryProvider };
package/dist/index.js CHANGED
@@ -1,12 +1,14 @@
1
- import { stageGeometryProvider, exportRobotUsda } from './chunk-5ZPHZ5ZH.js';
2
- export { PACKAGE_NAME, VERSION, exportRobotUsda, stageGeometryProvider, validateRobotDescription, writeUsdz } from './chunk-5ZPHZ5ZH.js';
3
- export { ThreeUsdRobotLoader, bindRobotMeshes, bindSceneMeshes, buildGprimGeometry, buildGprimObject, buildMeshGeometry, buildMeshMaterial, createTextureProvider } from './chunk-GRJGPHLW.js';
4
- import { refineJointType, buildKinematicTree } from './chunk-FUVHAORT.js';
5
- export { ARTICULATION_ROOT_API, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, Layer, MASS_API, MESH_COLLISION_API, PHYSICS_MATERIAL_API, ParseError, Prim, RIGID_BODY_API, Relationship, Stage, TokenizeError, buildKinematicTree, collectMdlAssetPaths, composeFile, composeLayer, computeLocalTransform, computeWorldTransform, crateToUsdaFile, driveKindFor, extractRobotDescription, gatherGprimDescendants, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getMassProperties, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, isBasisCurves, isMesh, isPoints, isRenderableGprim, isScope, isSolidGprim, isUnsupportedGprim, isXform, isZip, iterDescendants, jointValueFromSI, jointValueToSI, loadMdlModules, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, serializeUsda, toBytes, tokenize } from './chunk-FUVHAORT.js';
6
- export { JointObject, LinkObject, ThreeUsdRobot, axisVector } from './chunk-JN2QPDB3.js';
7
- import { identity4, multiply, invert } from './chunk-YGJ23CG3.js';
8
- export { DEG2RAD, RAD2DEG, channelFromSamples, decomposeJointRelative, decomposeRigid, fromUsdMatrix, getTranslation, identity4, interpolate, invert, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, nearestAngleBranch, toUsdMatrix } from './chunk-YGJ23CG3.js';
1
+ import { stageGeometryProvider, exportRobotUsda } from './chunk-IT5RWB7A.js';
2
+ export { PACKAGE_NAME, VERSION, exportRobotUsda, stageGeometryProvider, validateRobotDescription, writeUsdz } from './chunk-IT5RWB7A.js';
3
+ export { ThreeUsdRobotLoader, bindCameras, bindLights, bindRobotMeshes, bindSceneMeshes, buildGprimGeometry, buildGprimObject, buildMeshGeometry, buildMeshMaterial, conformCameraAspect, createTextureProvider } from './chunk-WQRP5IDJ.js';
4
+ import { refineJointType, buildKinematicTree } from './chunk-KRT4NL3H.js';
5
+ export { ARTICULATION_ROOT_API, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, Layer, MASS_API, MESH_COLLISION_API, PHYSICS_MATERIAL_API, ParseError, Prim, RIGID_BODY_API, Relationship, Stage, TokenizeError, buildKinematicTree, collectMdlAssetPaths, colorTemperatureToRgb, composeFile, composeLayer, crateToUsdaFile, driveKindFor, extractRobotDescription, gatherGprimDescendants, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getLightKind, getMassProperties, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, isBasisCurves, isLight, isMesh, isPoints, isRenderableGprim, isScope, isSolidGprim, isUnsupportedGprim, isUnsupportedLight, isXform, isZip, iterDescendants, jointValueFromSI, jointValueToSI, loadMdlModules, normalizeJointLimits, openUsdz, parseUsda, readLightDescription, refineJointType, serializeUsda, toBytes, tokenize } from './chunk-KRT4NL3H.js';
6
+ export { JointObject, LinkObject, ThreeUsdRobot, axisVector } from './chunk-HDZGWL6P.js';
7
+ export { channelFromSamples, decomposeJointRelative, interpolate, nearestAngleBranch } from './chunk-ALC7RBKC.js';
9
8
  export { DefaultAssetResolver, createMemoryResolver, findBoundSurfaceShader, isMdlTexture, joinPosix, parseMdl, parseMdlLiteral, resolveBoundMaterial } from './chunk-PPPRB6KE.js';
9
+ export { computeCameraExposureScale, computeLocalTransform, computeWorldTransform, isCamera, parseOpType, readCameraDescription } from './chunk-ZQXYVBQI.js';
10
+ import { identity4, multiply, invert } from './chunk-IAOPNN6V.js';
11
+ export { DEG2RAD, RAD2DEG, decomposeRigid, fromUsdMatrix, getTranslation, identity4, invert, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, toUsdMatrix } from './chunk-IAOPNN6V.js';
10
12
  export { AssetPath, Quat, UsdMatrix } from './chunk-JGIVJXBU.js';
11
13
  import * as THREE from 'three';
12
14
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/three/exportThreeUsdRobot.ts","../src/three/RobotBuilder.ts"],"names":["material","exportMaterial","mesh","isIdentityMat4","THREE2"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Three.js-side export (M14).\n *\n * Converts `BufferGeometry` / `MeshStandardMaterial` into the plain\n * {@link ExportMesh} data the exporter consumes, harvests the meshes attached\n * under a loaded robot's links, and re-exports a {@link ThreeUsdRobot} as a\n * USDA AST. Texture maps are not carried yet (M15) — constants only.\n */\n\nimport * as THREE from \"three\";\nimport type {\n ExportMaterial,\n ExportMesh,\n RobotGeometryProvider,\n} from \"../export/GeometryProvider.js\";\nimport { stageGeometryProvider } from \"../export/GeometryProvider.js\";\nimport { type ExportRobotOptions, exportRobotUsda } from \"../export/exportRobot.js\";\nimport type { Mat4 } from \"../kinematics/transforms.js\";\nimport type { UsdaFile, Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\nexport type GeometryToExportMeshOptions = {\n name: string;\n kind?: \"visual\" | \"collision\";\n /** Transform relative to the link frame (column-major); identity when omitted. */\n transform?: Mat4;\n material?: ExportMaterial;\n doubleSided?: boolean;\n /**\n * Export only this slice of the index buffer — a `BufferGeometry` group, as\n * used by multi-material meshes. Vertices are re-indexed onto the slice.\n */\n group?: { start: number; count: number };\n};\n\n/**\n * Convert a triangle `BufferGeometry` into exportable mesh data. Non-indexed\n * geometry becomes sequential triangles; a trailing partial triangle (or the\n * absence of a position attribute) returns `null`.\n */\nexport function geometryToExportMesh(\n geometry: THREE.BufferGeometry,\n options: GeometryToExportMeshOptions,\n): ExportMesh | null {\n const position = geometry.getAttribute(\"position\");\n if (!position || position.count === 0) return null;\n\n const index = geometry.getIndex();\n const all = index\n ? Array.from(index.array as ArrayLike<number>)\n : Array.from({ length: position.count }, (_, i) => i);\n const slice = options.group\n ? all.slice(options.group.start, options.group.start + options.group.count)\n : all;\n const triangles = Math.floor(slice.length / 3);\n if (triangles === 0) return null;\n\n const normal = geometry.getAttribute(\"normal\");\n const uv = geometry.getAttribute(\"uv\");\n const hasNormals = !!normal && normal.count === position.count;\n const hasUv = !!uv && uv.count === position.count;\n\n const points: Vec3[] = [];\n const normals: Vec3[] = [];\n const st: Vec2[] = [];\n let faceVertexIndices: number[];\n\n if (options.group) {\n // Re-index onto just the vertices this group touches.\n const remap = new Map<number, number>();\n faceVertexIndices = [];\n for (const vertex of slice.slice(0, triangles * 3)) {\n let mapped = remap.get(vertex);\n if (mapped === undefined) {\n mapped = points.length;\n remap.set(vertex, mapped);\n points.push([position.getX(vertex), position.getY(vertex), position.getZ(vertex)]);\n if (hasNormals)\n normals.push([normal.getX(vertex), normal.getY(vertex), normal.getZ(vertex)]);\n if (hasUv) st.push([uv.getX(vertex), uv.getY(vertex)]);\n }\n faceVertexIndices.push(mapped);\n }\n } else {\n for (let i = 0; i < position.count; i++) {\n points.push([position.getX(i), position.getY(i), position.getZ(i)]);\n if (hasNormals) normals.push([normal.getX(i), normal.getY(i), normal.getZ(i)]);\n if (hasUv) st.push([uv.getX(i), uv.getY(i)]);\n }\n faceVertexIndices = slice.slice(0, triangles * 3);\n }\n\n const mesh: ExportMesh = {\n name: options.name,\n kind: options.kind ?? \"visual\",\n points,\n faceVertexCounts: new Array(triangles).fill(3),\n faceVertexIndices,\n };\n if (hasNormals) mesh.normals = normals;\n if (hasUv) mesh.st = st;\n\n if (options.transform && !isIdentityMat4(options.transform)) mesh.transform = options.transform;\n if (options.material) mesh.material = options.material;\n if (options.doubleSided) mesh.doubleSided = true;\n return mesh;\n}\n\n/**\n * Extract constant PBR parameters from a Three.js material. Only\n * `MeshStandardMaterial` maps onto `UsdPreviewSurface`; anything else returns\n * `undefined` (with a warning). Texture maps are reported but not carried.\n */\nexport function materialToExportMaterial(\n material: THREE.Material,\n name: string,\n onWarn?: (message: string) => void,\n): ExportMaterial | undefined {\n const std = material as THREE.MeshStandardMaterial;\n if (!std.isMeshStandardMaterial) {\n onWarn?.(`material \"${name}\": only MeshStandardMaterial exports to UsdPreviewSurface; skipped`);\n return undefined;\n }\n if (\n std.map ||\n std.normalMap ||\n std.roughnessMap ||\n std.metalnessMap ||\n std.aoMap ||\n std.emissiveMap ||\n std.alphaMap\n ) {\n onWarn?.(\n `material \"${name}\": texture maps are not carried from Three.js materials (image extraction is app-side); constants only`,\n );\n }\n\n const out: ExportMaterial = {\n name,\n diffuseColor: [std.color.r, std.color.g, std.color.b],\n metallic: std.metalness,\n roughness: std.roughness,\n };\n if (std.transparent && std.opacity < 1) out.opacity = std.opacity;\n if (std.emissive.r > 0 || std.emissive.g > 0 || std.emissive.b > 0) {\n out.emissiveColor = [std.emissive.r, std.emissive.g, std.emissive.b];\n }\n return out;\n}\n\n/**\n * Provider over the meshes `bindRobotMeshes` attached under each link of a\n * loaded robot (direct children tagged `userData.kind`), with their link-local\n * transforms and materials.\n */\nexport function threeGeometryProvider(\n robot: ThreeUsdRobot,\n onWarn?: (message: string) => void,\n): RobotGeometryProvider {\n const materialNames = new Map<THREE.Material, ExportMaterial | undefined>();\n let autoId = 0;\n const convertMaterial = (material: THREE.Material): ExportMaterial | undefined => {\n if (!materialNames.has(material)) {\n const name = material.name || `Material_${autoId++}`;\n materialNames.set(material, materialToExportMaterial(material, name, onWarn));\n }\n return materialNames.get(material);\n };\n\n return (linkKey) => {\n const linkObj = robot.getLinkObject(linkKey);\n if (!linkObj) return [];\n\n const out: ExportMesh[] = [];\n for (const childObj of linkObj.children) {\n const meshObj = childObj as THREE.Mesh;\n if (!meshObj.isMesh) continue;\n const kind = meshObj.userData.kind === \"collision\" ? \"collision\" : \"visual\";\n const transform = [...meshObj.matrix.elements];\n const baseName = meshObj.name || \"mesh\";\n const materials = Array.isArray(meshObj.material) ? meshObj.material : [meshObj.material];\n const groups = meshObj.geometry.groups;\n\n // A multi-material mesh exports one USD Mesh per geometry group, so each\n // group keeps its own material instead of collapsing to the first.\n if (materials.length > 1 && groups.length > 0) {\n for (const [i, group] of groups.entries()) {\n const material = materials[group.materialIndex ?? 0];\n const exportMaterial = material ? convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: `${baseName}_${material?.name || i}`,\n kind,\n transform,\n group: { start: group.start, count: group.count },\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) out.push(mesh);\n }\n continue;\n }\n\n const material = materials[0];\n const exportMaterial = material ? convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: baseName,\n kind,\n transform,\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) out.push(mesh);\n }\n return out;\n };\n}\n\nexport type ExportThreeUsdRobotOptions = Omit<ExportRobotOptions, \"geometry\"> & {\n /** Re-read mesh data from the source stage instead of the Three.js scene. */\n stage?: Stage;\n};\n\n/** Export a loaded robot back to a USDA AST (pass the result to `serializeUsda`). */\nexport function exportThreeUsdRobot(\n robot: ThreeUsdRobot,\n options: ExportThreeUsdRobotOptions = {},\n): UsdaFile {\n const { stage, ...rest } = options;\n const geometry = stage\n ? stageGeometryProvider(stage)\n : threeGeometryProvider(robot, options.onWarn);\n return exportRobotUsda(robot.robot, { ...rest, geometry });\n}\n\nfunction isIdentityMat4(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n","/**\n * Authoring API (M14): assemble a robot from Three.js objects and export it.\n *\n * Links and joints are declared by name. Every joint takes **one** world-space\n * frame; both body-local joint frames derive from it —\n * `frame0 = linkWorld(parent)⁻¹ · frame`, `frame1 = linkWorld(child)⁻¹ · frame`\n * — so the arrangement at build time is the robot's zero pose. Values are SI\n * (radians / stage linear units); the exporter converts to authored units on\n * write. World matrices are captured at `addLink`/`add*Joint` time.\n */\n\nimport * as THREE from \"three\";\nimport type {\n CollisionApproximation,\n ExportMaterial,\n ExportMesh,\n ExportPhysicsMaterial,\n RobotGeometryProvider,\n} from \"../export/GeometryProvider.js\";\nimport { type ExportRobotOptions, exportRobotUsda } from \"../export/exportRobot.js\";\nimport { type Mat4, identity4, invert, multiply } from \"../kinematics/transforms.js\";\nimport type { UsdaFile } from \"../parser/ast.js\";\nimport type {\n Axis,\n JointDescription,\n JointDriveDescription,\n JointType,\n LinkDescription,\n LinkInertialDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport { type KinematicTree, buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { refineJointType } from \"../robot/normalize.js\";\nimport { geometryToExportMesh, materialToExportMaterial } from \"./exportThreeUsdRobot.js\";\n\n/** A world-space frame: a matrix, or an object whose `matrixWorld` is used. */\nexport type WorldFrame = THREE.Matrix4 | THREE.Object3D;\n\nexport type RobotBuilderOptions = {\n name: string;\n /** Stage up axis; defaults to `\"Z\"` (Isaac Sim convention). */\n upAxis?: \"Y\" | \"Z\";\n /** Stage linear unit; defaults to `1` (meters). */\n metersPerUnit?: number;\n /** Link to flag with `PhysicsArticulationRootAPI` (default: the container prim). */\n articulationRoot?: string;\n onWarn?: (message: string) => void;\n};\n\nexport type AddLinkOptions = {\n name: string;\n /** Link frame in world space at build pose (default identity). */\n frame?: WorldFrame;\n /** Objects whose `THREE.Mesh` descendants become the link's visual meshes. */\n visuals?: THREE.Object3D[];\n /** Objects whose `THREE.Mesh` descendants become collision meshes. */\n collisions?: THREE.Object3D[];\n /** Mass properties, exported as `PhysicsMassAPI` (M16). */\n inertial?: LinkInertialDescription;\n /** `physics:approximation` applied to this link's collision meshes (M16). */\n collisionApproximation?: CollisionApproximation;\n /** Physics material bound to this link's collision meshes (M16). */\n physicsMaterial?: ExportPhysicsMaterial;\n};\n\nexport type AddJointOptions = {\n name: string;\n /** Parent link name; omit to fix the child to the world. */\n parent?: string;\n child: string;\n /** Joint frame in world space (default: the child link's frame). */\n frame?: WorldFrame;\n /** Rotation / sliding axis token in the joint frame (default `\"X\"`). */\n axis?: Axis;\n /** Limits in SI: radians (revolute) or stage linear units (prismatic). */\n lower?: number;\n upper?: number;\n /** Initial joint value in SI, exported as `PhysicsJointStateAPI`. */\n initialValue?: number;\n drive?: JointDriveDescription;\n /**\n * Follow another joint: `value = multiplier · leader + offset` (SI), exported\n * as `NewtonMimicAPI`. The leader must be declared (in any order) and share\n * the motion kind. `multiplier` defaults to `1`, `offset` to `0`.\n */\n mimic?: { joint: string; multiplier?: number; offset?: number };\n};\n\ntype PendingJoint = {\n type: JointType;\n options: AddJointOptions;\n /** Joint frame world matrix captured at add time (undefined → child frame). */\n world?: Mat4;\n};\n\nexport class RobotBuilder {\n private readonly robotName: string;\n private readonly upAxis: \"Y\" | \"Z\";\n private readonly metersPerUnit: number;\n private readonly articulationRoot?: string;\n private readonly warn: (message: string) => void;\n\n private readonly links = new Map<\n string,\n { world: Mat4; meshes: ExportMesh[]; inertial?: LinkInertialDescription }\n >();\n private readonly joints = new Map<string, PendingJoint>();\n private readonly materialCache = new Map<THREE.Material, ExportMaterial | undefined>();\n private materialAutoId = 0;\n\n constructor(options: RobotBuilderOptions) {\n this.robotName = options.name;\n this.upAxis = options.upAxis ?? \"Z\";\n this.metersPerUnit = options.metersPerUnit ?? 1;\n if (options.articulationRoot !== undefined) this.articulationRoot = options.articulationRoot;\n this.warn = options.onWarn ?? (() => {});\n }\n\n addLink(options: AddLinkOptions): this {\n if (this.links.has(options.name)) {\n throw new Error(`RobotBuilder: link \"${options.name}\" is already defined`);\n }\n const world = resolveFrame(options.frame) ?? identity4();\n const collisionExtras = {\n ...(options.collisionApproximation !== undefined\n ? { approximation: options.collisionApproximation }\n : {}),\n ...(options.physicsMaterial ? { material: options.physicsMaterial } : {}),\n };\n const meshes = [\n ...this.gatherMeshes(options.visuals ?? [], world, \"visual\"),\n ...this.gatherMeshes(options.collisions ?? [], world, \"collision\", collisionExtras),\n ];\n this.links.set(options.name, {\n world,\n meshes,\n ...(options.inertial ? { inertial: options.inertial } : {}),\n });\n return this;\n }\n\n addFixedJoint(options: Omit<AddJointOptions, \"axis\" | \"lower\" | \"upper\" | \"mimic\">): this {\n return this.addJoint(\"fixed\", options);\n }\n\n addRevoluteJoint(options: AddJointOptions): this {\n return this.addJoint(\"revolute\", options);\n }\n\n addPrismaticJoint(options: AddJointOptions): this {\n return this.addJoint(\"prismatic\", options);\n }\n\n private addJoint(type: JointType, options: AddJointOptions): this {\n if (this.joints.has(options.name)) {\n throw new Error(`RobotBuilder: joint \"${options.name}\" is already defined`);\n }\n const world = resolveFrame(options.frame);\n this.joints.set(options.name, { type, options, ...(world ? { world } : {}) });\n return this;\n }\n\n /** Assemble the IR + geometry provider (validates the kinematic graph). */\n build(): { desc: RobotDescription; geometry: RobotGeometryProvider; tree: KinematicTree } {\n const links: Record<string, LinkDescription> = {};\n for (const [name, link] of this.links) {\n links[name] = {\n name,\n primPath: `/${this.robotName}/${name}`,\n visualPrims: [],\n ...(link.inertial ? { inertial: link.inertial } : {}),\n // Authored placement, so links no joint reaches keep their build pose.\n ...(isIdentityMat4(link.world) ? {} : { worldTransform: link.world }),\n };\n }\n\n const joints: Record<string, JointDescription> = {};\n for (const [name, pending] of this.joints) {\n const { options } = pending;\n const parent = options.parent ?? \"\";\n if (parent !== \"\" && !this.links.has(parent)) {\n throw new Error(`RobotBuilder: joint \"${name}\" references unknown parent \"${parent}\"`);\n }\n const childLink = this.links.get(options.child);\n if (!childLink) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" references unknown child \"${options.child}\"`,\n );\n }\n\n const jointWorld = pending.world ?? childLink.world;\n const parentWorld = parent === \"\" ? identity4() : this.links.get(parent)!.world;\n const type = refineJointType(pending.type, options.lower, options.upper);\n\n if (options.mimic) {\n const leader = this.joints.get(options.mimic.joint);\n if (!leader) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" mimics unknown joint \"${options.mimic.joint}\"`,\n );\n }\n if (options.mimic.joint === name) {\n throw new Error(`RobotBuilder: joint \"${name}\" cannot mimic itself`);\n }\n const linear = (t: JointType) => t === \"prismatic\";\n if (leader.type === \"fixed\" || linear(leader.type) !== linear(pending.type)) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" (${pending.type}) cannot mimic \"${options.mimic.joint}\" (${leader.type})`,\n );\n }\n }\n\n joints[name] = {\n name,\n primPath: `/${this.robotName}/${name}`,\n type,\n parent,\n child: options.child,\n axis: options.axis ?? \"X\",\n jointFrame0: multiply(invert(parentWorld), jointWorld),\n jointFrame1: multiply(invert(childLink.world), jointWorld),\n ...(options.lower !== undefined ? { lower: options.lower } : {}),\n ...(options.upper !== undefined ? { upper: options.upper } : {}),\n ...(options.initialValue !== undefined ? { initialValue: options.initialValue } : {}),\n ...(options.drive ? { drive: options.drive } : {}),\n ...(options.mimic\n ? {\n mimic: {\n joint: options.mimic.joint,\n multiplier: options.mimic.multiplier ?? 1,\n offset: options.mimic.offset ?? 0,\n },\n }\n : {}),\n };\n }\n\n if (this.articulationRoot !== undefined && !this.links.has(this.articulationRoot)) {\n throw new Error(`RobotBuilder: articulationRoot \"${this.articulationRoot}\" is not a link`);\n }\n\n const desc: RobotDescription = {\n name: this.robotName,\n rootLink: \"\",\n links,\n joints,\n upAxis: this.upAxis,\n metersPerUnit: this.metersPerUnit,\n ...(this.articulationRoot !== undefined\n ? { articulationRoots: [this.articulationRoot] }\n : {}),\n };\n\n const tree = buildKinematicTree(desc, { onWarn: this.warn });\n desc.rootLink = tree.root;\n if (tree.loopJoints.length > 0) desc.loopJoints = tree.loopJoints;\n if (tree.warnings.length > 0) desc.warnings = tree.warnings;\n\n const byLink = this.links;\n const geometry: RobotGeometryProvider = (linkKey) => byLink.get(linkKey)?.meshes ?? [];\n return { desc, geometry, tree };\n }\n\n /** Build and export in one step (pass the result to `serializeUsda`). */\n toUsda(options: Omit<ExportRobotOptions, \"geometry\"> = {}): UsdaFile {\n const { desc, geometry } = this.build();\n return exportRobotUsda(desc, { onWarn: this.warn, ...options, geometry });\n }\n\n /** Collect `THREE.Mesh` descendants of `roots` as link-relative export meshes. */\n private gatherMeshes(\n roots: THREE.Object3D[],\n linkWorld: Mat4,\n kind: \"visual\" | \"collision\",\n collisionExtras: {\n approximation?: CollisionApproximation;\n material?: ExportPhysicsMaterial;\n } = {},\n ): ExportMesh[] {\n const linkInverse = invert(linkWorld);\n const out: ExportMesh[] = [];\n for (const root of roots) {\n root.updateWorldMatrix(true, true);\n root.traverse((obj) => {\n const meshObj = obj as THREE.Mesh;\n if (!meshObj.isMesh) return;\n const material = Array.isArray(meshObj.material) ? meshObj.material[0] : meshObj.material;\n if (Array.isArray(meshObj.material) && meshObj.material.length > 1) {\n this.warn(\n `mesh \"${meshObj.name}\": multi-material meshes export their first material only`,\n );\n }\n const exportMaterial = material ? this.convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: meshObj.name || \"mesh\",\n kind,\n transform: multiply(linkInverse, [...meshObj.matrixWorld.elements]),\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) {\n if (kind === \"collision\") {\n if (collisionExtras.approximation !== undefined) {\n mesh.collisionApproximation = collisionExtras.approximation;\n }\n if (collisionExtras.material) mesh.physicsMaterial = collisionExtras.material;\n }\n out.push(mesh);\n } else {\n this.warn(`mesh \"${meshObj.name}\": no triangle geometry; skipped`);\n }\n });\n }\n return out;\n }\n\n private convertMaterial(material: THREE.Material): ExportMaterial | undefined {\n if (!this.materialCache.has(material)) {\n const name = material.name || `Material_${this.materialAutoId++}`;\n this.materialCache.set(material, materialToExportMaterial(material, name, this.warn));\n }\n return this.materialCache.get(material);\n }\n}\n\nfunction isIdentityMat4(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n\n/** World matrix of a frame argument (`matrixWorld` refreshed for objects). */\nfunction resolveFrame(frame: WorldFrame | undefined): Mat4 | undefined {\n if (!frame) return undefined;\n if ((frame as THREE.Object3D).isObject3D) {\n const obj = frame as THREE.Object3D;\n obj.updateWorldMatrix(true, false);\n return [...obj.matrixWorld.elements];\n }\n return [...(frame as THREE.Matrix4).elements];\n}\n"]}
1
+ {"version":3,"sources":["../src/three/exportThreeUsdRobot.ts","../src/three/RobotBuilder.ts"],"names":["material","exportMaterial","mesh","isIdentityMat4","THREE2"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Three.js-side export (M14).\n *\n * Converts `BufferGeometry` / `MeshStandardMaterial` into the plain\n * {@link ExportMesh} data the exporter consumes, harvests the meshes attached\n * under a loaded robot's links, and re-exports a {@link ThreeUsdRobot} as a\n * USDA AST. Texture maps are not carried yet (M15) — constants only.\n */\n\nimport * as THREE from \"three\";\nimport type {\n ExportMaterial,\n ExportMesh,\n RobotGeometryProvider,\n} from \"../export/GeometryProvider.js\";\nimport { stageGeometryProvider } from \"../export/GeometryProvider.js\";\nimport { type ExportRobotOptions, exportRobotUsda } from \"../export/exportRobot.js\";\nimport type { Mat4 } from \"../kinematics/transforms.js\";\nimport type { UsdaFile, Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\nexport type GeometryToExportMeshOptions = {\n name: string;\n kind?: \"visual\" | \"collision\";\n /** Transform relative to the link frame (column-major); identity when omitted. */\n transform?: Mat4;\n material?: ExportMaterial;\n doubleSided?: boolean;\n /**\n * Export only this slice of the index buffer — a `BufferGeometry` group, as\n * used by multi-material meshes. Vertices are re-indexed onto the slice.\n */\n group?: { start: number; count: number };\n};\n\n/**\n * Convert a triangle `BufferGeometry` into exportable mesh data. Non-indexed\n * geometry becomes sequential triangles; a trailing partial triangle (or the\n * absence of a position attribute) returns `null`.\n */\nexport function geometryToExportMesh(\n geometry: THREE.BufferGeometry,\n options: GeometryToExportMeshOptions,\n): ExportMesh | null {\n const position = geometry.getAttribute(\"position\");\n if (!position || position.count === 0) return null;\n\n const index = geometry.getIndex();\n const all = index\n ? Array.from(index.array as ArrayLike<number>)\n : Array.from({ length: position.count }, (_, i) => i);\n const slice = options.group\n ? all.slice(options.group.start, options.group.start + options.group.count)\n : all;\n const triangles = Math.floor(slice.length / 3);\n if (triangles === 0) return null;\n\n const normal = geometry.getAttribute(\"normal\");\n const uv = geometry.getAttribute(\"uv\");\n const hasNormals = !!normal && normal.count === position.count;\n const hasUv = !!uv && uv.count === position.count;\n\n const points: Vec3[] = [];\n const normals: Vec3[] = [];\n const st: Vec2[] = [];\n let faceVertexIndices: number[];\n\n if (options.group) {\n // Re-index onto just the vertices this group touches.\n const remap = new Map<number, number>();\n faceVertexIndices = [];\n for (const vertex of slice.slice(0, triangles * 3)) {\n let mapped = remap.get(vertex);\n if (mapped === undefined) {\n mapped = points.length;\n remap.set(vertex, mapped);\n points.push([position.getX(vertex), position.getY(vertex), position.getZ(vertex)]);\n if (hasNormals)\n normals.push([normal.getX(vertex), normal.getY(vertex), normal.getZ(vertex)]);\n if (hasUv) st.push([uv.getX(vertex), uv.getY(vertex)]);\n }\n faceVertexIndices.push(mapped);\n }\n } else {\n for (let i = 0; i < position.count; i++) {\n points.push([position.getX(i), position.getY(i), position.getZ(i)]);\n if (hasNormals) normals.push([normal.getX(i), normal.getY(i), normal.getZ(i)]);\n if (hasUv) st.push([uv.getX(i), uv.getY(i)]);\n }\n faceVertexIndices = slice.slice(0, triangles * 3);\n }\n\n const mesh: ExportMesh = {\n name: options.name,\n kind: options.kind ?? \"visual\",\n points,\n faceVertexCounts: new Array(triangles).fill(3),\n faceVertexIndices,\n };\n if (hasNormals) mesh.normals = normals;\n if (hasUv) mesh.st = st;\n\n if (options.transform && !isIdentityMat4(options.transform)) mesh.transform = options.transform;\n if (options.material) mesh.material = options.material;\n if (options.doubleSided) mesh.doubleSided = true;\n return mesh;\n}\n\n/**\n * Extract constant PBR parameters from a Three.js material. Only\n * `MeshStandardMaterial` maps onto `UsdPreviewSurface`; anything else returns\n * `undefined` (with a warning). Texture maps are reported but not carried.\n */\nexport function materialToExportMaterial(\n material: THREE.Material,\n name: string,\n onWarn?: (message: string) => void,\n): ExportMaterial | undefined {\n const std = material as THREE.MeshStandardMaterial;\n if (!std.isMeshStandardMaterial) {\n onWarn?.(`material \"${name}\": only MeshStandardMaterial exports to UsdPreviewSurface; skipped`);\n return undefined;\n }\n if (\n std.map ||\n std.normalMap ||\n std.roughnessMap ||\n std.metalnessMap ||\n std.aoMap ||\n std.emissiveMap ||\n std.alphaMap\n ) {\n onWarn?.(\n `material \"${name}\": texture maps are not carried from Three.js materials (image extraction is app-side); constants only`,\n );\n }\n\n const out: ExportMaterial = {\n name,\n diffuseColor: [std.color.r, std.color.g, std.color.b],\n metallic: std.metalness,\n roughness: std.roughness,\n };\n if (std.transparent && std.opacity < 1) out.opacity = std.opacity;\n if (std.emissive.r > 0 || std.emissive.g > 0 || std.emissive.b > 0) {\n out.emissiveColor = [std.emissive.r, std.emissive.g, std.emissive.b];\n }\n return out;\n}\n\n/**\n * Provider over the meshes `bindRobotMeshes` attached under each link of a\n * loaded robot (direct children tagged `userData.kind`), with their link-local\n * transforms and materials.\n */\nexport function threeGeometryProvider(\n robot: ThreeUsdRobot,\n onWarn?: (message: string) => void,\n): RobotGeometryProvider {\n const materialNames = new Map<THREE.Material, ExportMaterial | undefined>();\n let autoId = 0;\n const convertMaterial = (material: THREE.Material): ExportMaterial | undefined => {\n if (!materialNames.has(material)) {\n const name = material.name || `Material_${autoId++}`;\n materialNames.set(material, materialToExportMaterial(material, name, onWarn));\n }\n return materialNames.get(material);\n };\n\n return (linkKey) => {\n const linkObj = robot.getLinkObject(linkKey);\n if (!linkObj) return [];\n\n const out: ExportMesh[] = [];\n for (const childObj of linkObj.children) {\n const meshObj = childObj as THREE.Mesh;\n if (!meshObj.isMesh) continue;\n const kind = meshObj.userData.kind === \"collision\" ? \"collision\" : \"visual\";\n const transform = [...meshObj.matrix.elements];\n const baseName = meshObj.name || \"mesh\";\n const materials = Array.isArray(meshObj.material) ? meshObj.material : [meshObj.material];\n const groups = meshObj.geometry.groups;\n\n // A multi-material mesh exports one USD Mesh per geometry group, so each\n // group keeps its own material instead of collapsing to the first.\n if (materials.length > 1 && groups.length > 0) {\n for (const [i, group] of groups.entries()) {\n const material = materials[group.materialIndex ?? 0];\n const exportMaterial = material ? convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: `${baseName}_${material?.name || i}`,\n kind,\n transform,\n group: { start: group.start, count: group.count },\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) out.push(mesh);\n }\n continue;\n }\n\n const material = materials[0];\n const exportMaterial = material ? convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: baseName,\n kind,\n transform,\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) out.push(mesh);\n }\n return out;\n };\n}\n\nexport type ExportThreeUsdRobotOptions = Omit<ExportRobotOptions, \"geometry\"> & {\n /** Re-read mesh data from the source stage instead of the Three.js scene. */\n stage?: Stage;\n};\n\n/** Export a loaded robot back to a USDA AST (pass the result to `serializeUsda`). */\nexport function exportThreeUsdRobot(\n robot: ThreeUsdRobot,\n options: ExportThreeUsdRobotOptions = {},\n): UsdaFile {\n const { stage, ...rest } = options;\n const geometry = stage\n ? stageGeometryProvider(stage)\n : threeGeometryProvider(robot, options.onWarn);\n return exportRobotUsda(robot.robot, { ...rest, geometry });\n}\n\nfunction isIdentityMat4(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n","/**\n * Authoring API (M14): assemble a robot from Three.js objects and export it.\n *\n * Links and joints are declared by name. Every joint takes **one** world-space\n * frame; both body-local joint frames derive from it —\n * `frame0 = linkWorld(parent)⁻¹ · frame`, `frame1 = linkWorld(child)⁻¹ · frame`\n * — so the arrangement at build time is the robot's zero pose. Values are SI\n * (radians / stage linear units); the exporter converts to authored units on\n * write. World matrices are captured at `addLink`/`add*Joint` time.\n */\n\nimport * as THREE from \"three\";\nimport type {\n CollisionApproximation,\n ExportMaterial,\n ExportMesh,\n ExportPhysicsMaterial,\n RobotGeometryProvider,\n} from \"../export/GeometryProvider.js\";\nimport { type ExportRobotOptions, exportRobotUsda } from \"../export/exportRobot.js\";\nimport { type Mat4, identity4, invert, multiply } from \"../kinematics/transforms.js\";\nimport type { UsdaFile } from \"../parser/ast.js\";\nimport type {\n Axis,\n JointDescription,\n JointDriveDescription,\n JointType,\n LinkDescription,\n LinkInertialDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport { type KinematicTree, buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { refineJointType } from \"../robot/normalize.js\";\nimport { geometryToExportMesh, materialToExportMaterial } from \"./exportThreeUsdRobot.js\";\n\n/** A world-space frame: a matrix, or an object whose `matrixWorld` is used. */\nexport type WorldFrame = THREE.Matrix4 | THREE.Object3D;\n\nexport type RobotBuilderOptions = {\n name: string;\n /** Stage up axis; defaults to `\"Z\"` (Isaac Sim convention). */\n upAxis?: \"Y\" | \"Z\";\n /** Stage linear unit; defaults to `1` (meters). */\n metersPerUnit?: number;\n /** Link to flag with `PhysicsArticulationRootAPI` (default: the container prim). */\n articulationRoot?: string;\n onWarn?: (message: string) => void;\n};\n\nexport type AddLinkOptions = {\n name: string;\n /** Link frame in world space at build pose (default identity). */\n frame?: WorldFrame;\n /** Objects whose `THREE.Mesh` descendants become the link's visual meshes. */\n visuals?: THREE.Object3D[];\n /** Objects whose `THREE.Mesh` descendants become collision meshes. */\n collisions?: THREE.Object3D[];\n /** Mass properties, exported as `PhysicsMassAPI` (M16). */\n inertial?: LinkInertialDescription;\n /** `physics:approximation` applied to this link's collision meshes (M16). */\n collisionApproximation?: CollisionApproximation;\n /** Physics material bound to this link's collision meshes (M16). */\n physicsMaterial?: ExportPhysicsMaterial;\n};\n\nexport type AddJointOptions = {\n name: string;\n /** Parent link name; omit to fix the child to the world. */\n parent?: string;\n child: string;\n /** Joint frame in world space (default: the child link's frame). */\n frame?: WorldFrame;\n /** Rotation / sliding axis token in the joint frame (default `\"X\"`). */\n axis?: Axis;\n /** Limits in SI: radians (revolute) or stage linear units (prismatic). */\n lower?: number;\n upper?: number;\n /** Initial joint value in SI, exported as `PhysicsJointStateAPI`. */\n initialValue?: number;\n drive?: JointDriveDescription;\n /**\n * Follow another joint: `value = multiplier · leader + offset` (SI), exported\n * as `NewtonMimicAPI`. The leader must be declared (in any order) and share\n * the motion kind. `multiplier` defaults to `1`, `offset` to `0`.\n */\n mimic?: { joint: string; multiplier?: number; offset?: number };\n};\n\ntype PendingJoint = {\n type: JointType;\n options: AddJointOptions;\n /** Joint frame world matrix captured at add time (undefined → child frame). */\n world?: Mat4;\n};\n\nexport class RobotBuilder {\n private readonly robotName: string;\n private readonly upAxis: \"Y\" | \"Z\";\n private readonly metersPerUnit: number;\n private readonly articulationRoot?: string;\n private readonly warn: (message: string) => void;\n\n private readonly links = new Map<\n string,\n { world: Mat4; meshes: ExportMesh[]; inertial?: LinkInertialDescription }\n >();\n private readonly joints = new Map<string, PendingJoint>();\n private readonly materialCache = new Map<THREE.Material, ExportMaterial | undefined>();\n private materialAutoId = 0;\n\n constructor(options: RobotBuilderOptions) {\n this.robotName = options.name;\n this.upAxis = options.upAxis ?? \"Z\";\n this.metersPerUnit = options.metersPerUnit ?? 1;\n if (options.articulationRoot !== undefined) this.articulationRoot = options.articulationRoot;\n this.warn = options.onWarn ?? (() => {});\n }\n\n addLink(options: AddLinkOptions): this {\n if (this.links.has(options.name)) {\n throw new Error(`RobotBuilder: link \"${options.name}\" is already defined`);\n }\n const world = resolveFrame(options.frame) ?? identity4();\n const collisionExtras = {\n ...(options.collisionApproximation !== undefined\n ? { approximation: options.collisionApproximation }\n : {}),\n ...(options.physicsMaterial ? { material: options.physicsMaterial } : {}),\n };\n const meshes = [\n ...this.gatherMeshes(options.visuals ?? [], world, \"visual\"),\n ...this.gatherMeshes(options.collisions ?? [], world, \"collision\", collisionExtras),\n ];\n this.links.set(options.name, {\n world,\n meshes,\n ...(options.inertial ? { inertial: options.inertial } : {}),\n });\n return this;\n }\n\n addFixedJoint(options: Omit<AddJointOptions, \"axis\" | \"lower\" | \"upper\" | \"mimic\">): this {\n return this.addJoint(\"fixed\", options);\n }\n\n addRevoluteJoint(options: AddJointOptions): this {\n return this.addJoint(\"revolute\", options);\n }\n\n addPrismaticJoint(options: AddJointOptions): this {\n return this.addJoint(\"prismatic\", options);\n }\n\n private addJoint(type: JointType, options: AddJointOptions): this {\n if (this.joints.has(options.name)) {\n throw new Error(`RobotBuilder: joint \"${options.name}\" is already defined`);\n }\n const world = resolveFrame(options.frame);\n this.joints.set(options.name, { type, options, ...(world ? { world } : {}) });\n return this;\n }\n\n /** Assemble the IR + geometry provider (validates the kinematic graph). */\n build(): { desc: RobotDescription; geometry: RobotGeometryProvider; tree: KinematicTree } {\n const links: Record<string, LinkDescription> = {};\n for (const [name, link] of this.links) {\n links[name] = {\n name,\n primPath: `/${this.robotName}/${name}`,\n visualPrims: [],\n ...(link.inertial ? { inertial: link.inertial } : {}),\n // Authored placement, so links no joint reaches keep their build pose.\n ...(isIdentityMat4(link.world) ? {} : { worldTransform: link.world }),\n };\n }\n\n const joints: Record<string, JointDescription> = {};\n for (const [name, pending] of this.joints) {\n const { options } = pending;\n const parent = options.parent ?? \"\";\n if (parent !== \"\" && !this.links.has(parent)) {\n throw new Error(`RobotBuilder: joint \"${name}\" references unknown parent \"${parent}\"`);\n }\n const childLink = this.links.get(options.child);\n if (!childLink) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" references unknown child \"${options.child}\"`,\n );\n }\n\n const jointWorld = pending.world ?? childLink.world;\n const parentWorld = parent === \"\" ? identity4() : this.links.get(parent)!.world;\n const type = refineJointType(pending.type, options.lower, options.upper);\n\n if (options.mimic) {\n const leader = this.joints.get(options.mimic.joint);\n if (!leader) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" mimics unknown joint \"${options.mimic.joint}\"`,\n );\n }\n if (options.mimic.joint === name) {\n throw new Error(`RobotBuilder: joint \"${name}\" cannot mimic itself`);\n }\n const linear = (t: JointType) => t === \"prismatic\";\n if (leader.type === \"fixed\" || linear(leader.type) !== linear(pending.type)) {\n throw new Error(\n `RobotBuilder: joint \"${name}\" (${pending.type}) cannot mimic \"${options.mimic.joint}\" (${leader.type})`,\n );\n }\n }\n\n joints[name] = {\n name,\n primPath: `/${this.robotName}/${name}`,\n type,\n parent,\n child: options.child,\n axis: options.axis ?? \"X\",\n jointFrame0: multiply(invert(parentWorld), jointWorld),\n jointFrame1: multiply(invert(childLink.world), jointWorld),\n ...(options.lower !== undefined ? { lower: options.lower } : {}),\n ...(options.upper !== undefined ? { upper: options.upper } : {}),\n ...(options.initialValue !== undefined ? { initialValue: options.initialValue } : {}),\n ...(options.drive ? { drive: options.drive } : {}),\n ...(options.mimic\n ? {\n mimic: {\n joint: options.mimic.joint,\n multiplier: options.mimic.multiplier ?? 1,\n offset: options.mimic.offset ?? 0,\n },\n }\n : {}),\n };\n }\n\n if (this.articulationRoot !== undefined && !this.links.has(this.articulationRoot)) {\n throw new Error(`RobotBuilder: articulationRoot \"${this.articulationRoot}\" is not a link`);\n }\n\n const desc: RobotDescription = {\n name: this.robotName,\n rootLink: \"\",\n links,\n joints,\n upAxis: this.upAxis,\n metersPerUnit: this.metersPerUnit,\n ...(this.articulationRoot !== undefined\n ? { articulationRoots: [this.articulationRoot] }\n : {}),\n };\n\n const tree = buildKinematicTree(desc, { onWarn: this.warn });\n desc.rootLink = tree.root;\n if (tree.loopJoints.length > 0) desc.loopJoints = tree.loopJoints;\n if (tree.warnings.length > 0) desc.warnings = tree.warnings;\n\n const byLink = this.links;\n const geometry: RobotGeometryProvider = (linkKey) => byLink.get(linkKey)?.meshes ?? [];\n return { desc, geometry, tree };\n }\n\n /** Build and export in one step (pass the result to `serializeUsda`). */\n toUsda(options: Omit<ExportRobotOptions, \"geometry\"> = {}): UsdaFile {\n const { desc, geometry } = this.build();\n return exportRobotUsda(desc, { onWarn: this.warn, ...options, geometry });\n }\n\n /** Collect `THREE.Mesh` descendants of `roots` as link-relative export meshes. */\n private gatherMeshes(\n roots: THREE.Object3D[],\n linkWorld: Mat4,\n kind: \"visual\" | \"collision\",\n collisionExtras: {\n approximation?: CollisionApproximation;\n material?: ExportPhysicsMaterial;\n } = {},\n ): ExportMesh[] {\n const linkInverse = invert(linkWorld);\n const out: ExportMesh[] = [];\n for (const root of roots) {\n root.updateWorldMatrix(true, true);\n root.traverse((obj) => {\n const meshObj = obj as THREE.Mesh;\n if (!meshObj.isMesh) return;\n const material = Array.isArray(meshObj.material) ? meshObj.material[0] : meshObj.material;\n if (Array.isArray(meshObj.material) && meshObj.material.length > 1) {\n this.warn(\n `mesh \"${meshObj.name}\": multi-material meshes export their first material only`,\n );\n }\n const exportMaterial = material ? this.convertMaterial(material) : undefined;\n const mesh = geometryToExportMesh(meshObj.geometry, {\n name: meshObj.name || \"mesh\",\n kind,\n transform: multiply(linkInverse, [...meshObj.matrixWorld.elements]),\n ...(exportMaterial ? { material: exportMaterial } : {}),\n doubleSided: material?.side === THREE.DoubleSide,\n });\n if (mesh) {\n if (kind === \"collision\") {\n if (collisionExtras.approximation !== undefined) {\n mesh.collisionApproximation = collisionExtras.approximation;\n }\n if (collisionExtras.material) mesh.physicsMaterial = collisionExtras.material;\n }\n out.push(mesh);\n } else {\n this.warn(`mesh \"${meshObj.name}\": no triangle geometry; skipped`);\n }\n });\n }\n return out;\n }\n\n private convertMaterial(material: THREE.Material): ExportMaterial | undefined {\n if (!this.materialCache.has(material)) {\n const name = material.name || `Material_${this.materialAutoId++}`;\n this.materialCache.set(material, materialToExportMaterial(material, name, this.warn));\n }\n return this.materialCache.get(material);\n }\n}\n\nfunction isIdentityMat4(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n\n/** World matrix of a frame argument (`matrixWorld` refreshed for objects). */\nfunction resolveFrame(frame: WorldFrame | undefined): Mat4 | undefined {\n if (!frame) return undefined;\n if ((frame as THREE.Object3D).isObject3D) {\n const obj = frame as THREE.Object3D;\n obj.updateWorldMatrix(true, false);\n return [...obj.matrixWorld.elements];\n }\n return [...(frame as THREE.Matrix4).elements];\n}\n"]}
package/dist/nodes.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { LoadingManager } from 'three';
2
2
  import { MeshPhysicalNodeMaterial } from 'three/webgpu';
3
- import { T as TextureProvider, M as MaterialFactory } from './MeshBinding-B_8RhuQE.js';
4
- import { P as Prim } from './buildKinematicTree-Q9JOjAjM.js';
5
- import './parseMdl-vfzBGoMr.js';
6
- import './ThreeUsdRobot-X1zbpRZo.js';
3
+ import { T as TextureProvider, M as MaterialFactory } from './MeshBinding-5Dad1EOh.js';
4
+ import { P as Prim } from './usdLux-BqQlSOwG.js';
5
+ import './parseMdl-M862hSal.js';
6
+ import './ThreeUsdRobot-CurQqRqu.js';
7
7
 
8
8
  /**
9
9
  * Load an external `.mtlx` document with three's official `MaterialXLoader`
@@ -1,31 +1,3 @@
1
- /**
2
- * Resolves USD asset paths (from references / payloads / sublayers) to URLs and
3
- * fetches their text. Composition (`composition.ts`) is I/O-agnostic and goes
4
- * through an {@link AssetResolver}, so the same engine works in the browser, in
5
- * Node, or against an in-memory file map in tests.
6
- */
7
- interface AssetResolver {
8
- /** Resolve an authored asset path against the layer's base URL to an absolute key. */
9
- resolve(assetPath: string, baseUrl: string): string;
10
- /** Fetch the text of a resolved asset; rejects if it cannot be read. */
11
- fetchText(url: string): Promise<string>;
12
- /** Fetch the raw bytes of a resolved asset (for binary USDC / USDZ). Optional. */
13
- fetchBytes?(url: string): Promise<Uint8Array>;
14
- }
15
- /** URL-based resolver using the global `fetch` (browser / Node 18+). */
16
- declare class DefaultAssetResolver implements AssetResolver {
17
- resolve(assetPath: string, baseUrl: string): string;
18
- fetchText(url: string): Promise<string>;
19
- fetchBytes(url: string): Promise<Uint8Array>;
20
- }
21
- /**
22
- * Resolver over an in-memory `{ path: contents }` map (text or bytes), with
23
- * posix-style joins. Useful for tests and bundled assets.
24
- */
25
- declare function createMemoryResolver(files: Record<string, string | Uint8Array>): AssetResolver;
26
- /** Resolve `rel` against `baseUrl` using posix semantics, normalizing `.`/`..`. */
27
- declare function joinPosix(baseUrl: string, rel: string): string;
28
-
29
1
  /**
30
2
  * Minimal `.mdl` **declaration** parser (M20) — reads material signatures, not
31
3
  * the MDL language.
@@ -84,4 +56,4 @@ declare function parseMdl(text: string): MdlModule;
84
56
  */
85
57
  declare function parseMdlLiteral(src: string): MdlValue | undefined;
86
58
 
87
- export { type AssetResolver as A, DefaultAssetResolver as D, type MdlMaterialDecl as M, type MdlModule as a, type MdlModuleProvider as b, type MdlTextureValue as c, type MdlValue as d, createMemoryResolver as e, parseMdlLiteral as f, isMdlTexture as i, joinPosix as j, parseMdl as p };
59
+ export { type MdlModuleProvider as M, type MdlMaterialDecl as a, type MdlModule as b, type MdlTextureValue as c, type MdlValue as d, parseMdlLiteral as e, isMdlTexture as i, parseMdl as p };
package/dist/react.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import * as _react_three_fiber from '@react-three/fiber';
2
2
  import { ThreeElements } from '@react-three/fiber';
3
3
  import * as React from 'react';
4
- import { T as ThreeUsdRobot } from './ThreeUsdRobot-X1zbpRZo.js';
5
- import { T as ThreeUsdRobotLoaderOptions } from './ThreeUsdRobotLoader-u3d1yoLM.js';
4
+ import { T as ThreeUsdRobot } from './ThreeUsdRobot-CurQqRqu.js';
5
+ import { T as ThreeUsdRobotLoaderOptions } from './ThreeUsdRobotLoader-DrYXpMta.js';
6
6
  import 'three';
7
- import './buildKinematicTree-Q9JOjAjM.js';
8
- import './parseMdl-vfzBGoMr.js';
7
+ import './usdLux-BqQlSOwG.js';
9
8
  import './bytes-CxGRGry_.js';
10
- import './MeshBinding-B_8RhuQE.js';
9
+ import './MeshBinding-5Dad1EOh.js';
10
+ import './parseMdl-M862hSal.js';
11
11
 
12
12
  /**
13
13
  * Load a robot for use under `<Suspense>`. Throws the load promise until ready
package/dist/react.js CHANGED
@@ -1,8 +1,10 @@
1
- import { ThreeUsdRobotLoader } from './chunk-GRJGPHLW.js';
2
- import './chunk-FUVHAORT.js';
3
- import './chunk-JN2QPDB3.js';
4
- import './chunk-YGJ23CG3.js';
1
+ import { ThreeUsdRobotLoader } from './chunk-WQRP5IDJ.js';
2
+ import './chunk-KRT4NL3H.js';
3
+ import './chunk-HDZGWL6P.js';
4
+ import './chunk-ALC7RBKC.js';
5
5
  import './chunk-PPPRB6KE.js';
6
+ import './chunk-ZQXYVBQI.js';
7
+ import './chunk-IAOPNN6V.js';
6
8
  import './chunk-JGIVJXBU.js';
7
9
  import { useFrame } from '@react-three/fiber';
8
10
  import * as React from 'react';
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx"],"names":["UsdRobot"],"mappings":";;;;;;;;;;AAwBA,IAAM,KAAA,uBAAY,GAAA,EAAwB;AAE1C,SAAS,SAAA,CAAU,KAAa,OAAA,EAAkD;AAChF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,KAAA,CAAM,UAAU,IAAI,mBAAA,CAAoB,OAAO,CAAA,CAAE,SAAA,CAAU,GAAG,CAAA,CAAE,IAAA;AAAA,IAC9D,CAAC,KAAA,KAAU;AACT,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AACpB,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,WAAA,CAAY,KAAa,OAAA,EAAqD;AAC5F,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACpC,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAC7B,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA;AAC9B,EAAA,OAAO,KAAA,CAAM,KAAA;AACf;AAGO,SAAS,eAAA,CAAgB,KAAa,OAAA,EAA4C;AACvF,EAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AACxB;AAGO,SAAS,mBAAmB,GAAA,EAAoB;AACrD,EAAA,IAAI,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAAA,aACd,KAAA,EAAM;AACnB;AAMO,SAAS,iBAAA,CAAkB,KAAA,EAAyC,OAAA,GAAU,IAAA,EAAY;AAC/F,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,YAAA,EAAa,IAAK,IAAA;AACvC,EAAA,MAAM,IAAA,GAAa,KAAA,CAAA,MAAA,CAAO,KAAA,EAAO,KAAA,IAAS,CAAC,CAAA;AAC3C,EAAA,QAAA,CAAS,CAAC,GAAG,KAAA,KAAU;AACrB,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AAClC,IAAA,IAAA,CAAK,OAAA,IAAW,KAAA,GAAQ,KAAA,CAAM,qBAAA,EAAsB;AACpD,IAAA,IAAI,KAAK,OAAA,GAAU,KAAA,CAAM,GAAA,EAAK,IAAA,CAAK,UAAU,KAAA,CAAM,KAAA;AACnD,IAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EAC5B,CAAC,CAAA;AACH;AAmDO,IAAM,QAAA,GAAiB,KAAA,CAAA,UAAA;AAAA,EAC5B,SAASA,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,GAAU,KAAA;AAAA,MACV,UAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,aAAa,CAAA;AAC5C,IAAM,0BAAoB,GAAA,EAAK,MAAM,KAAA,EAAO,CAAC,KAAK,CAAC,CAAA;AAEnD,IAAM,gBAAU,MAAM;AACpB,MAAA,MAAA,GAAS,KAAK,CAAA;AAAA,IAChB,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,WAAA,EAAa,KAAA,CAAM,cAAA,CAAe,WAAW,CAAA;AAAA,IACnD,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAEvB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AAAA,IACnD,CAAA,EAAG,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AACtB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,KAAA,CAAM,aAAA,GAAgB,aAAA;AAAA,IACzD,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AACzB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,KAAA,CAAM,aAAA,GAAgB,aAAA;AAAA,IACzD,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AACzB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,cAAA,KAAmB,MAAA,EAAW,KAAA,CAAM,cAAA,GAAiB,cAAA;AAAA,IAC3D,CAAA,EAAG,CAAC,KAAA,EAAO,cAAc,CAAC,CAAA;AAI1B,IAAA,uBACE,GAAA,CAAC,WAAA,EAAA,EAAU,MAAA,EAAQ,KAAA,EAAQ,GAAG,IAAA,EAC3B,QAAA,EAAA,OAAA,mBAAU,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,CAAA,GAAK,IAAA,EAC/C,CAAA;AAAA,EAEJ;AACF;AAEA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAM,EAAmC;AAChE,EAAA,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAC7B,EAAA,OAAO,IAAA;AACT","file":"react.js","sourcesContent":["/**\n * `three-usd-robot/react`\n *\n * React Three Fiber bindings: a `<UsdRobot>` component plus hooks. `react` and\n * `@react-three/fiber` are optional peer dependencies — non-React consumers are\n * unaffected. A {@link ThreeUsdRobot} is a `THREE.Object3D`, so it mounts via\n * R3F's `<primitive>`; joint values, toggles and animation are driven through\n * effects/`useFrame` (R3F does not re-render on object mutation).\n */\n\nimport { type ThreeElements, useFrame } from \"@react-three/fiber\";\nimport * as React from \"react\";\nimport type { ThreeUsdRobot } from \"./three/ThreeUsdRobot.js\";\nimport {\n ThreeUsdRobotLoader,\n type ThreeUsdRobotLoaderOptions,\n} from \"./three/ThreeUsdRobotLoader.js\";\n\ntype CacheEntry = {\n promise: Promise<ThreeUsdRobot>;\n robot?: ThreeUsdRobot;\n error?: unknown;\n};\n\nconst cache = new Map<string, CacheEntry>();\n\nfunction loadEntry(url: string, options?: ThreeUsdRobotLoaderOptions): CacheEntry {\n const cached = cache.get(url);\n if (cached) return cached;\n\n const entry = {} as CacheEntry;\n entry.promise = new ThreeUsdRobotLoader(options).loadAsync(url).then(\n (robot) => {\n entry.robot = robot;\n return robot;\n },\n (error) => {\n entry.error = error;\n throw error;\n },\n );\n cache.set(url, entry);\n return entry;\n}\n\n/**\n * Load a robot for use under `<Suspense>`. Throws the load promise until ready\n * (suspends) and the error if it fails (for an error boundary). Cached by `url`.\n */\nexport function useUsdRobot(url: string, options?: ThreeUsdRobotLoaderOptions): ThreeUsdRobot {\n const entry = loadEntry(url, options);\n if (entry.error) throw entry.error;\n if (!entry.robot) throw entry.promise;\n return entry.robot;\n}\n\n/** Warm the cache so a later `<UsdRobot>`/`useUsdRobot` resolves instantly. */\nexport function preloadUsdRobot(url: string, options?: ThreeUsdRobotLoaderOptions): void {\n loadEntry(url, options);\n}\n\n/** Drop one cached robot (or the whole cache) so it reloads next time. */\nexport function clearUsdRobotCache(url?: string): void {\n if (url) cache.delete(url);\n else cache.clear();\n}\n\n/**\n * Advance a robot's time-sampled animation every frame while `playing`. No-op\n * for robots without an authored time range.\n */\nexport function useRobotAnimation(robot: ThreeUsdRobot | null | undefined, playing = true): void {\n const range = robot?.getTimeRange() ?? null;\n const time = React.useRef(range?.start ?? 0);\n useFrame((_, delta) => {\n if (!robot || !range || !playing) return;\n time.current += delta * robot.getTimeCodesPerSecond();\n if (time.current > range.end) time.current = range.start;\n robot.setTime(time.current);\n });\n}\n\n/**\n * Transform / event props forwarded to the underlying `<primitive>`. Picked\n * explicitly so R3F's broad element index signature doesn't widen our own props.\n */\ntype ForwardedProps = Partial<\n Pick<\n ThreeElements[\"primitive\"],\n | \"position\"\n | \"rotation\"\n | \"quaternion\"\n | \"scale\"\n | \"visible\"\n | \"renderOrder\"\n | \"name\"\n | \"userData\"\n | \"onClick\"\n | \"onPointerOver\"\n | \"onPointerOut\"\n | \"onPointerMove\"\n >\n>;\n\nexport type UsdRobotProps = ForwardedProps & {\n /** Asset URL (`.usda` / `.usdc` / binary `.usd` / `.usdz`). */\n url: string;\n /** Loader options (resolver, up-axis, textures, …). */\n loaderOptions?: ThreeUsdRobotLoaderOptions;\n /** Controlled joint values (re-applied when this object changes). */\n jointValues?: Record<string, number>;\n /** Auto-play time-sampled joint animation (default `false`). */\n animate?: boolean;\n showVisual?: boolean;\n showCollision?: boolean;\n showJointAxes?: boolean;\n showLinkFrames?: boolean;\n /** Called once the robot has loaded. */\n onLoad?: (robot: ThreeUsdRobot) => void;\n};\n\n/**\n * Declaratively mount a USD robot in an R3F `<Canvas>`. Wrap in `<Suspense>`.\n *\n * @example\n * ```tsx\n * <Suspense fallback={null}>\n * <UsdRobot url=\"/robot.usda\" jointValues={{ joint1: 0.4 }} showJointAxes />\n * </Suspense>\n * ```\n */\nexport const UsdRobot = React.forwardRef<ThreeUsdRobot, UsdRobotProps>(\n function UsdRobot(props, ref) {\n const {\n url,\n loaderOptions,\n jointValues,\n animate = false,\n showVisual,\n showCollision,\n showJointAxes,\n showLinkFrames,\n onLoad,\n ...rest\n } = props;\n\n const robot = useUsdRobot(url, loaderOptions);\n React.useImperativeHandle(ref, () => robot, [robot]);\n\n React.useEffect(() => {\n onLoad?.(robot);\n }, [robot, onLoad]);\n\n React.useEffect(() => {\n if (jointValues) robot.setJointValues(jointValues);\n }, [robot, jointValues]);\n\n React.useEffect(() => {\n if (showVisual !== undefined) robot.showVisual = showVisual;\n }, [robot, showVisual]);\n React.useEffect(() => {\n if (showCollision !== undefined) robot.showCollision = showCollision;\n }, [robot, showCollision]);\n React.useEffect(() => {\n if (showJointAxes !== undefined) robot.showJointAxes = showJointAxes;\n }, [robot, showJointAxes]);\n React.useEffect(() => {\n if (showLinkFrames !== undefined) robot.showLinkFrames = showLinkFrames;\n }, [robot, showLinkFrames]);\n\n // `useFrame` only runs inside a Canvas, so gate it behind a child component —\n // this keeps <UsdRobot> renderable (and testable) without an R3F frame loop.\n return (\n <primitive object={robot} {...rest}>\n {animate ? <RobotAnimator robot={robot} /> : null}\n </primitive>\n );\n },\n);\n\nfunction RobotAnimator({ robot }: { robot: ThreeUsdRobot }): null {\n useRobotAnimation(robot, true);\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../src/react.tsx"],"names":["UsdRobot"],"mappings":"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","file":"react.js","sourcesContent":["/**\n * `three-usd-robot/react`\n *\n * React Three Fiber bindings: a `<UsdRobot>` component plus hooks. `react` and\n * `@react-three/fiber` are optional peer dependencies — non-React consumers are\n * unaffected. A {@link ThreeUsdRobot} is a `THREE.Object3D`, so it mounts via\n * R3F's `<primitive>`; joint values, toggles and animation are driven through\n * effects/`useFrame` (R3F does not re-render on object mutation).\n */\n\nimport { type ThreeElements, useFrame } from \"@react-three/fiber\";\nimport * as React from \"react\";\nimport type { ThreeUsdRobot } from \"./three/ThreeUsdRobot.js\";\nimport {\n ThreeUsdRobotLoader,\n type ThreeUsdRobotLoaderOptions,\n} from \"./three/ThreeUsdRobotLoader.js\";\n\ntype CacheEntry = {\n promise: Promise<ThreeUsdRobot>;\n robot?: ThreeUsdRobot;\n error?: unknown;\n};\n\nconst cache = new Map<string, CacheEntry>();\n\nfunction loadEntry(url: string, options?: ThreeUsdRobotLoaderOptions): CacheEntry {\n const cached = cache.get(url);\n if (cached) return cached;\n\n const entry = {} as CacheEntry;\n entry.promise = new ThreeUsdRobotLoader(options).loadAsync(url).then(\n (robot) => {\n entry.robot = robot;\n return robot;\n },\n (error) => {\n entry.error = error;\n throw error;\n },\n );\n cache.set(url, entry);\n return entry;\n}\n\n/**\n * Load a robot for use under `<Suspense>`. Throws the load promise until ready\n * (suspends) and the error if it fails (for an error boundary). Cached by `url`.\n */\nexport function useUsdRobot(url: string, options?: ThreeUsdRobotLoaderOptions): ThreeUsdRobot {\n const entry = loadEntry(url, options);\n if (entry.error) throw entry.error;\n if (!entry.robot) throw entry.promise;\n return entry.robot;\n}\n\n/** Warm the cache so a later `<UsdRobot>`/`useUsdRobot` resolves instantly. */\nexport function preloadUsdRobot(url: string, options?: ThreeUsdRobotLoaderOptions): void {\n loadEntry(url, options);\n}\n\n/** Drop one cached robot (or the whole cache) so it reloads next time. */\nexport function clearUsdRobotCache(url?: string): void {\n if (url) cache.delete(url);\n else cache.clear();\n}\n\n/**\n * Advance a robot's time-sampled animation every frame while `playing`. No-op\n * for robots without an authored time range.\n */\nexport function useRobotAnimation(robot: ThreeUsdRobot | null | undefined, playing = true): void {\n const range = robot?.getTimeRange() ?? null;\n const time = React.useRef(range?.start ?? 0);\n useFrame((_, delta) => {\n if (!robot || !range || !playing) return;\n time.current += delta * robot.getTimeCodesPerSecond();\n if (time.current > range.end) time.current = range.start;\n robot.setTime(time.current);\n });\n}\n\n/**\n * Transform / event props forwarded to the underlying `<primitive>`. Picked\n * explicitly so R3F's broad element index signature doesn't widen our own props.\n */\ntype ForwardedProps = Partial<\n Pick<\n ThreeElements[\"primitive\"],\n | \"position\"\n | \"rotation\"\n | \"quaternion\"\n | \"scale\"\n | \"visible\"\n | \"renderOrder\"\n | \"name\"\n | \"userData\"\n | \"onClick\"\n | \"onPointerOver\"\n | \"onPointerOut\"\n | \"onPointerMove\"\n >\n>;\n\nexport type UsdRobotProps = ForwardedProps & {\n /** Asset URL (`.usda` / `.usdc` / binary `.usd` / `.usdz`). */\n url: string;\n /** Loader options (resolver, up-axis, textures, …). */\n loaderOptions?: ThreeUsdRobotLoaderOptions;\n /** Controlled joint values (re-applied when this object changes). */\n jointValues?: Record<string, number>;\n /** Auto-play time-sampled joint animation (default `false`). */\n animate?: boolean;\n showVisual?: boolean;\n showCollision?: boolean;\n showJointAxes?: boolean;\n showLinkFrames?: boolean;\n /** Called once the robot has loaded. */\n onLoad?: (robot: ThreeUsdRobot) => void;\n};\n\n/**\n * Declaratively mount a USD robot in an R3F `<Canvas>`. Wrap in `<Suspense>`.\n *\n * @example\n * ```tsx\n * <Suspense fallback={null}>\n * <UsdRobot url=\"/robot.usda\" jointValues={{ joint1: 0.4 }} showJointAxes />\n * </Suspense>\n * ```\n */\nexport const UsdRobot = React.forwardRef<ThreeUsdRobot, UsdRobotProps>(\n function UsdRobot(props, ref) {\n const {\n url,\n loaderOptions,\n jointValues,\n animate = false,\n showVisual,\n showCollision,\n showJointAxes,\n showLinkFrames,\n onLoad,\n ...rest\n } = props;\n\n const robot = useUsdRobot(url, loaderOptions);\n React.useImperativeHandle(ref, () => robot, [robot]);\n\n React.useEffect(() => {\n onLoad?.(robot);\n }, [robot, onLoad]);\n\n React.useEffect(() => {\n if (jointValues) robot.setJointValues(jointValues);\n }, [robot, jointValues]);\n\n React.useEffect(() => {\n if (showVisual !== undefined) robot.showVisual = showVisual;\n }, [robot, showVisual]);\n React.useEffect(() => {\n if (showCollision !== undefined) robot.showCollision = showCollision;\n }, [robot, showCollision]);\n React.useEffect(() => {\n if (showJointAxes !== undefined) robot.showJointAxes = showJointAxes;\n }, [robot, showJointAxes]);\n React.useEffect(() => {\n if (showLinkFrames !== undefined) robot.showLinkFrames = showLinkFrames;\n }, [robot, showLinkFrames]);\n\n // `useFrame` only runs inside a Canvas, so gate it behind a child component —\n // this keeps <UsdRobot> renderable (and testable) without an R3F frame loop.\n return (\n <primitive object={robot} {...rest}>\n {animate ? <RobotAnimator robot={robot} /> : null}\n </primitive>\n );\n },\n);\n\nfunction RobotAnimator({ robot }: { robot: ThreeUsdRobot }): null {\n useRobotAnimation(robot, true);\n return null;\n}\n"]}