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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/three/stageAnchors.ts","../src/three/CameraBinding.ts","../src/three/LightBinding.ts","../src/three/MeshBinding.ts","../src/three/TextureBinding.ts","../src/three/ThreeUsdRobotLoader.ts"],"names":["THREE","THREE2","begin","THREE4"],"mappings":"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","file":"chunk-WQRP5IDJ.js","sourcesContent":["/**\n * Shared placement machinery for binding non-gprim stage prims (lights M25,\n * cameras M27) into an already-built {@link ThreeUsdRobot} hierarchy: find the\n * deepest ancestor that owns a Three.js object — a link frame, a mirrored\n * scenery group, a gprim — and accumulate the local transform chain from it.\n */\n\nimport type * as THREE from \"three\";\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport { computeLocalTransform, computeWorldTransform } from \"../usd/xformOps.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\n/**\n * Index `primPath → object` over everything already bound: scenery groups and\n * gprims register through `userData.primPath`, links by their own prim path.\n */\nexport function collectAnchors(robot3d: ThreeUsdRobot): Map<string, THREE.Object3D> {\n const anchors = new Map<string, THREE.Object3D>();\n robot3d.traverse((object) => {\n const path = (object.userData as { primPath?: unknown }).primPath;\n if (typeof path === \"string\" && !anchors.has(path)) anchors.set(path, object);\n });\n for (const [path, link] of robot3d.getLinkObjectsByPath()) anchors.set(path, link);\n return anchors;\n}\n\n/** The deepest ancestor prim that already has a Three.js object to anchor to. */\nexport function findAnchor(\n prim: Prim,\n anchors: Map<string, THREE.Object3D>,\n): { object: THREE.Object3D; prim: Prim } | null {\n for (let p = prim.GetParent(); p && !p.IsPseudoRoot(); p = p.GetParent()) {\n const object = anchors.get(p.GetPath());\n if (object) return { object, prim: p };\n }\n return null;\n}\n\n/**\n * Accumulated local transform from `anchorPrim` (exclusive) down to `prim`\n * (inclusive); from the stage root when `anchorPrim` is `null`.\n */\nexport function transformFrom(anchorPrim: Prim | null, prim: Prim): Mat4 {\n const stop = anchorPrim?.GetPath();\n const chain: Prim[] = [];\n for (\n let p: Prim | null = prim;\n p && !p.IsPseudoRoot() && p.GetPath() !== stop;\n p = p.GetParent()\n ) {\n chain.push(p);\n }\n chain.reverse();\n let m = identity4();\n for (const link of chain) m = multiply(m, computeLocalTransform(link).matrix);\n return m;\n}\n\n/** Uniform-ish world scale at `prim`: root normalization × the prim chain's scale. */\nexport function worldScaleOf(prim: Prim, rootScale: number): number {\n const m = computeWorldTransform(prim);\n const sx = Math.hypot(m[0]!, m[1]!, m[2]!);\n const sy = Math.hypot(m[4]!, m[5]!, m[6]!);\n const sz = Math.hypot(m[8]!, m[9]!, m[10]!);\n return rootScale * ((sx + sy + sz) / 3);\n}\n\n/**\n * Place `object` under the anchor's Three.js object (or the robot root) by\n * its accumulated USD local transform — the shared attach step of the light\n * and camera binders.\n */\nexport function attachAtPrim(\n object: THREE.Object3D,\n prim: Prim,\n anchors: Map<string, THREE.Object3D>,\n robot3d: ThreeUsdRobot,\n): void {\n const anchor = findAnchor(prim, anchors);\n object.matrixAutoUpdate = false;\n object.matrix.fromArray(transformFrom(anchor?.prim ?? null, prim));\n object.matrixWorldNeedsUpdate = true;\n (anchor?.object ?? robot3d).add(object);\n}\n","/**\n * Binds `UsdGeomCamera` prims to Three.js cameras and attaches them into the\n * robot's hierarchy (M27).\n *\n * USD and Three.js share the same camera frame (−Z forward, +Y up), so a\n * camera places with its prim transform alone — under its link object when it\n * is mounted on the robot (a wrist or sensor camera follows the joints), else\n * under the mirrored scenery groups or the root. Focal length and apertures\n * are millimeters on a film back; clipping range and focus distance are stage\n * units and get the same world normalization as everything else.\n */\n\nimport * as THREE from \"three\";\nimport { isNonVisualPurpose } from \"../schemas/usdGeom.js\";\nimport {\n type CameraDescription,\n isCamera,\n readCameraDescription,\n} from \"../schemas/usdGeomCamera.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\nimport { attachAtPrim, collectAnchors, worldScaleOf } from \"./stageAnchors.js\";\n\n/** A bound USD camera — perspective or orthographic. */\nexport type UsdBoundCamera = THREE.PerspectiveCamera | THREE.OrthographicCamera;\n\nexport type BindCamerasOptions = {\n /** Receives fidelity diagnostics. */\n onWarn?: (message: string) => void;\n};\n\n/**\n * Traverse the stage and bind every `Camera` prim. Call after mesh binding so\n * cameras anchor into the existing hierarchy. Cameras with\n * `visibility = \"invisible\"` or a guide/proxy purpose are skipped. Each\n * result carries `userData.primPath` and `userData.usdCamera` (its\n * {@link CameraDescription}).\n */\nexport function bindCameras(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n options: BindCamerasOptions = {},\n): UsdBoundCamera[] {\n const cameras: UsdBoundCamera[] = [];\n const anchors = collectAnchors(robot3d);\n const rootScale = robot3d.scale.x || 1;\n\n for (const prim of stage.Traverse()) {\n if (!isCamera(prim)) continue;\n if (prim.GetAttribute(\"visibility\").Get() === \"invisible\") continue;\n if (isNonVisualPurpose(prim)) continue;\n const desc = readCameraDescription(prim);\n if (!desc) continue;\n\n const worldScale = worldScaleOf(prim, rootScale);\n const camera = createThreeCamera(desc, worldScale, options.onWarn);\n\n camera.name = desc.name;\n camera.userData.kind = \"camera\";\n camera.userData.primPath = desc.primPath;\n camera.userData.usdCamera = desc;\n camera.userData.usdCameraWorldScale = worldScale;\n\n attachAtPrim(camera, prim, anchors, robot3d);\n cameras.push(camera);\n }\n return cameras;\n}\n\nfunction createThreeCamera(\n desc: CameraDescription,\n worldScale: number,\n onWarn: ((message: string) => void) | undefined,\n): UsdBoundCamera {\n const near = Math.max(desc.clippingRange[0] * worldScale, 1e-5);\n const far = Math.max(desc.clippingRange[1] * worldScale, near + 1e-5);\n\n if (desc.projection === \"orthographic\") {\n // Orthographic apertures are tenths of a stage unit (GfCamera).\n const halfWidth = (desc.horizontalAperture / 10 / 2) * worldScale;\n const halfHeight = (desc.verticalAperture / 10 / 2) * worldScale;\n return new THREE.OrthographicCamera(-halfWidth, halfWidth, halfHeight, -halfHeight, near, far);\n }\n\n const camera = new THREE.PerspectiveCamera(\n THREE.MathUtils.radToDeg(2 * Math.atan(desc.verticalAperture / (2 * desc.focalLength))),\n desc.horizontalAperture / desc.verticalAperture,\n near,\n far,\n );\n // Film metrics for consumers that think in lens terms (mm).\n camera.filmGauge = desc.horizontalAperture;\n camera.filmOffset = desc.horizontalApertureOffset;\n if (desc.verticalApertureOffset !== 0) {\n onWarn?.(\n `Camera ${desc.primPath} authors a verticalApertureOffset; Three.js has no vertical film offset — ignored`,\n );\n }\n if (desc.focusDistance > 0) camera.focus = desc.focusDistance * worldScale;\n camera.updateProjectionMatrix();\n return camera;\n}\n\n/**\n * `UsdRender` aspect-ratio conform policies: how a camera's fixed aperture\n * meets a viewport of a different aspect. `expandAperture` (the USD default)\n * always shows at least the authored view; `cropAperture` never shows more;\n * the `adjust*` policies pin one axis outright.\n */\nexport type AspectConformPolicy =\n | \"expandAperture\"\n | \"cropAperture\"\n | \"adjustApertureWidth\"\n | \"adjustApertureHeight\";\n\n/**\n * Fit a bound USD camera to a viewport aspect ratio (width / height) and\n * update its projection. Call on resize, or before rendering through a camera\n * from {@link ThreeUsdRobot.cameras}. Cameras without USD metadata just get\n * the aspect applied.\n */\nexport function conformCameraAspect(\n camera: UsdBoundCamera,\n viewportAspect: number,\n policy: AspectConformPolicy = \"expandAperture\",\n): void {\n const desc = camera.userData.usdCamera as CameraDescription | undefined;\n\n if ((camera as THREE.OrthographicCamera).isOrthographicCamera) {\n const ortho = camera as THREE.OrthographicCamera;\n const worldScale = (camera.userData.usdCameraWorldScale as number | undefined) ?? 1;\n const halfWidth = desc ? (desc.horizontalAperture / 10 / 2) * worldScale : ortho.right;\n const halfHeight = desc ? (desc.verticalAperture / 10 / 2) * worldScale : ortho.top;\n if (widthFollows(policy, viewportAspect, halfWidth / halfHeight)) {\n ortho.top = halfHeight;\n ortho.bottom = -halfHeight;\n ortho.right = halfHeight * viewportAspect;\n ortho.left = -ortho.right;\n } else {\n ortho.right = halfWidth;\n ortho.left = -halfWidth;\n ortho.top = halfWidth / viewportAspect;\n ortho.bottom = -ortho.top;\n }\n ortho.updateProjectionMatrix();\n return;\n }\n\n const persp = camera as THREE.PerspectiveCamera;\n persp.aspect = viewportAspect;\n if (desc) {\n const vFov = 2 * Math.atan(desc.verticalAperture / (2 * desc.focalLength));\n const hFov = 2 * Math.atan(desc.horizontalAperture / (2 * desc.focalLength));\n const apertureAspect = desc.horizontalAperture / desc.verticalAperture;\n persp.fov = THREE.MathUtils.radToDeg(\n widthFollows(policy, viewportAspect, apertureAspect)\n ? vFov // keep the vertical view; width follows the viewport\n : 2 * Math.atan(Math.tan(hFov / 2) / viewportAspect), // keep the horizontal view\n );\n }\n persp.updateProjectionMatrix();\n}\n\n/** True when the policy keeps the vertical extent and lets width follow. */\nfunction widthFollows(\n policy: AspectConformPolicy,\n viewportAspect: number,\n apertureAspect: number,\n): boolean {\n switch (policy) {\n case \"adjustApertureWidth\":\n return true;\n case \"adjustApertureHeight\":\n return false;\n case \"expandAperture\":\n return viewportAspect >= apertureAspect;\n case \"cropAperture\":\n return viewportAspect < apertureAspect;\n }\n}\n","/**\n * Binds UsdLux light prims to Three.js lights and attaches them into the\n * robot's hierarchy (M25).\n *\n * Placement mirrors the gprim binding: a light under a link prim parents to\n * that link's object (so a wrist lamp moves with the joint chain), anything\n * else parents to the deepest already-mirrored ancestor — a scenery group from\n * `bindSceneMeshes` — or the robot root, positioned by its accumulated local\n * transform. Up-axis and unit normalization then apply at the root as usual.\n *\n * DomeLights create no Three.js light: they are collected on\n * {@link ThreeUsdRobot.domeLights}, to be applied as the scene environment by\n * `applyUsdEnvironment` from `three-usd-robot/rendering` (M26).\n */\n\nimport * as THREE from \"three\";\nimport { isNonVisualPurpose } from \"../schemas/usdGeom.js\";\nimport {\n type LightDescription,\n getLightKind,\n isUnsupportedLight,\n readLightDescription,\n} from \"../schemas/usdLux.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeWorldTransform } from \"../usd/xformOps.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\nimport { attachAtPrim, collectAnchors, worldScaleOf } from \"./stageAnchors.js\";\n\nexport type BindLightsOptions = {\n /**\n * Multiplies every light's effective emission (`intensity × 2^exposure`).\n * Default `1` — the authored UsdLux value passes through unchanged. Stages\n * authored in Omniverse/RTX photometric units (intensities in the thousands)\n * typically want `0.001` to land in Three.js's exposure-1 range; see\n * docs/lighting.md.\n */\n lightIntensityScale?: number;\n /**\n * Configure shadow casting: `castShadow` per the light's ShadowAPI, with the\n * shadow camera fitted to the scene bounds. Default `false` here — the\n * loader defaults it on.\n */\n shadows?: boolean;\n /** Receives fidelity diagnostics (unsupported/approximated light types). */\n onWarn?: (message: string) => void;\n};\n\n/** Result of {@link bindLights}. */\nexport type BoundLights = {\n /**\n * The Three.js lights created, already attached to the hierarchy. Each\n * carries `userData.primPath` and `userData.usdLight` (its\n * {@link LightDescription}).\n */\n lights: THREE.Light[];\n /** DomeLights parsed but not realized — apply via `applyUsdEnvironment` (M26). */\n domes: LightDescription[];\n};\n\n/**\n * Traverse the stage and bind every supported UsdLux light. Call after mesh\n * binding so lights can anchor to the mirrored scenery groups and shadow\n * cameras can fit the scene bounds. Lights with `visibility = \"invisible\"` or\n * a guide/proxy purpose are skipped.\n */\nexport function bindLights(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n options: BindLightsOptions = {},\n): BoundLights {\n const intensityScale = options.lightIntensityScale ?? 1;\n const shadows = options.shadows ?? false;\n const lights: THREE.Light[] = [];\n const domes: LightDescription[] = [];\n\n const warned = new Set<string>();\n const warnOnce = (key: string, message: string) => {\n if (warned.has(key)) return;\n warned.add(key);\n options.onWarn?.(message);\n };\n\n // The deepest already-bound ancestor (scenery group, gprim, link frame)\n // anchors each light so it inherits that subtree's motion.\n const anchors = collectAnchors(robot3d);\n\n const rootScale = robot3d.scale.x || 1;\n let metrics: { center: THREE.Vector3; radius: number } | null = null;\n const sceneMetrics = () => {\n if (!metrics) {\n // Lights carry no geometry, so bounds are the meshes bound before us —\n // in the normalized (post-root) world, i.e. meters.\n const box = new THREE.Box3().setFromObject(robot3d);\n const sphere = new THREE.Sphere();\n if (!box.isEmpty()) box.getBoundingSphere(sphere);\n metrics = { center: sphere.center.clone(), radius: Math.max(sphere.radius, 0.5) };\n }\n return metrics;\n };\n\n for (const prim of stage.Traverse()) {\n if (isUnsupportedLight(prim)) {\n warnOnce(\n prim.GetTypeName(),\n `${prim.GetTypeName()} lights are not supported yet; skipping (e.g. ${prim.GetPath()})`,\n );\n continue;\n }\n if (!getLightKind(prim)) continue;\n if (prim.GetAttribute(\"visibility\").Get() === \"invisible\") continue;\n if (isNonVisualPurpose(prim)) continue;\n\n const desc = readLightDescription(prim);\n if (!desc) continue;\n\n if (desc.kind === \"dome\") {\n domes.push(desc);\n warnOnce(\n \"DomeLight\",\n `DomeLight ${desc.primPath} is surfaced on robot.domeLights — apply it as the scene environment with applyUsdEnvironment from three-usd-robot/rendering`,\n );\n continue;\n }\n\n const light = createThreeLight(desc, worldScaleOf(prim, rootScale), intensityScale, warnOnce);\n if (!light) continue;\n\n light.name = desc.name;\n light.userData.kind = \"light\";\n light.userData.primPath = desc.primPath;\n light.userData.usdLight = desc;\n\n attachAtPrim(light, prim, anchors, robot3d);\n\n if (shadows) configureShadow(light, desc, prim, rootScale, robot3d, sceneMetrics);\n lights.push(light);\n }\n\n return { lights, domes };\n}\n\n/** UsdLux lights emit along their local −Z; Three.js directional/spot lights\n * aim at a `target` object, so one is parented inside the light at (0, 0, −1). */\nfunction aimAlongMinusZ(light: THREE.DirectionalLight | THREE.SpotLight): void {\n const target = new THREE.Object3D();\n target.name = \"target\";\n target.position.set(0, 0, -1);\n light.add(target);\n light.target = target;\n}\n\n/**\n * Realize a (non-dome) light description as a Three.js light. `worldScale`\n * converts authored emitter sizes (stage units under the prim's accumulated\n * scale — stock Isaac rooms scale their light prims) into world meters, which\n * `RectAreaLight` sizes require because Three.js ignores ancestor scale there.\n */\nfunction createThreeLight(\n desc: LightDescription,\n worldScale: number,\n intensityScale: number,\n warnOnce: (key: string, message: string) => void,\n): THREE.Light | null {\n const color = new THREE.Color(desc.color[0], desc.color[1], desc.color[2]);\n const intensity = desc.intensity * intensityScale;\n\n switch (desc.kind) {\n case \"distant\": {\n const light = new THREE.DirectionalLight(color, intensity);\n aimAlongMinusZ(light);\n return light;\n }\n case \"sphere\": {\n if (desc.cone) {\n const angle = THREE.MathUtils.degToRad(Math.min(desc.cone.angleDeg, 89.9));\n const penumbra = Math.min(Math.max(desc.cone.softness, 0), 1);\n const light = new THREE.SpotLight(color, intensity, 0, angle, penumbra);\n aimAlongMinusZ(light);\n return light;\n }\n return new THREE.PointLight(color, intensity);\n }\n case \"rect\": {\n const width = (desc.width ?? 1) * worldScale;\n const height = (desc.height ?? 1) * worldScale;\n return new THREE.RectAreaLight(color, intensity, width, height);\n }\n case \"disk\": {\n // Square area light matched to the disk: side 2r, emission scaled by the\n // disk/square area ratio (π/4) so total output stays comparable.\n const side = 2 * (desc.radius ?? 0.5) * worldScale;\n return new THREE.RectAreaLight(color, intensity * (Math.PI / 4), side, side);\n }\n case \"cylinder\":\n warnOnce(\n \"CylinderLight\",\n `CylinderLight has no Three.js equivalent; approximating as a point light (e.g. ${desc.primPath})`,\n );\n return new THREE.PointLight(color, intensity);\n case \"dome\":\n return null; // collected by the caller\n }\n}\n\n/**\n * Enable and fit shadows. Directional and spot lights cast per ShadowAPI\n * (`shadow:enable` defaults on); point lights only when `shadow:enable` is\n * explicitly authored `true` — a point shadow renders six cube faces, too\n * expensive to switch on for every stock ceiling light. RectAreaLight cannot\n * cast shadows in Three.js.\n */\nfunction configureShadow(\n light: THREE.Light,\n desc: LightDescription,\n prim: Prim,\n rootScale: number,\n robot3d: ThreeUsdRobot,\n sceneMetrics: () => { center: THREE.Vector3; radius: number },\n): void {\n const directionalOrSpot =\n (light as THREE.DirectionalLight).isDirectionalLight || (light as THREE.SpotLight).isSpotLight;\n const cast = directionalOrSpot\n ? desc.shadowEnabled\n : (light as THREE.PointLight).isPointLight && desc.shadowAuthored && desc.shadowEnabled;\n if (!cast) return;\n\n const { center, radius } = sceneMetrics();\n // Light position in the normalized world (stage world × root scale/rotation);\n // good enough to range the shadow camera even for link-mounted lights.\n const m = computeWorldTransform(prim);\n const position = new THREE.Vector3(m[12], m[13], m[14])\n .multiplyScalar(rootScale)\n .applyQuaternion(robot3d.quaternion);\n const distance = position.distanceTo(center);\n\n light.castShadow = true;\n\n if ((light as THREE.DirectionalLight).isDirectionalLight) {\n const shadow = (light as THREE.DirectionalLight).shadow;\n shadow.normalBias = 0.02 * radius;\n const camera = shadow.camera;\n const extent = radius * 1.5;\n camera.left = -extent;\n camera.right = extent;\n camera.top = extent;\n camera.bottom = -extent;\n // Negative near keeps geometry behind a light placed inside the scene\n // (distant lights often sit at the origin) inside the ortho frustum.\n camera.near = distance - 2.5 * radius;\n camera.far = distance + 2.5 * radius;\n camera.updateProjectionMatrix();\n shadow.mapSize.set(2048, 2048);\n } else if ((light as THREE.SpotLight).isSpotLight) {\n const shadow = (light as THREE.SpotLight).shadow;\n shadow.normalBias = 0.02 * radius;\n shadow.camera.near = radius / 100;\n shadow.camera.far = distance + 2.5 * radius;\n shadow.camera.updateProjectionMatrix();\n shadow.mapSize.set(1024, 1024);\n } else {\n const shadow = (light as THREE.PointLight).shadow;\n shadow.normalBias = 0.02 * radius;\n shadow.camera.near = radius / 100;\n shadow.camera.far = Math.max(4 * radius, distance + 2 * radius);\n shadow.camera.updateProjectionMatrix();\n shadow.mapSize.set(512, 512);\n }\n}\n","/**\n * Binds renderable gprims — `UsdGeom.Mesh` plus the parametric solids (`Cube` /\n * `Sphere` / `Cylinder` / `Capsule` / `Cone`) — to Three.js geometry and\n * attaches them under the robot's link objects.\n *\n * Meshes are triangulated with a simple fan. Primvars (`st` UV sets, `normals`,\n * `displayColor`) resolve with USD interpolation semantics — `:indices`\n * de-referencing, vertex vs faceVarying (de-indexed) layouts, multiple UV\n * channels. Solids tessellate from their schema attributes. Geometry is left\n * in stage units; the global `metersPerUnit` scale is applied at the root in M9.\n */\n\nimport * as THREE from \"three\";\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport {\n type MaterialSubset,\n getMaterialSubsets,\n isNonVisualPurpose,\n isRenderableGprim,\n} from \"../schemas/usdGeom.js\";\nimport { COLLISION_API } from \"../schemas/usdPhysics.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport type { MdlModuleProvider } from \"../usd/mdl/parseMdl.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\nimport {\n type ResolveMaterialOptions,\n type ResolvedTexture,\n resolveBoundMaterial,\n} from \"./MaterialBinding.js\";\nimport type { TextureProvider } from \"./TextureBinding.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\nexport type MeshKind = \"visual\" | \"collision\";\n\n/**\n * Replaces material creation for mesh-like gprims (`Mesh` and the parametric\n * solids). Return `null` to fall back to the default `UsdShade` resolution —\n * the hook that lets the optional `three-usd-robot/nodes` entry build TSL\n * `NodeMaterial`s without the core depending on `three/webgpu` (M22).\n */\nexport type MaterialFactory = (prim: Prim, stage: Stage) => THREE.Material | null;\n\nconst DEFAULT_COLOR = 0x9a9a9a;\n\nexport type BindMeshesOptions = {\n loadVisuals?: boolean;\n loadCollisions?: boolean;\n /** Resolves diffuse texture asset paths to `THREE.Texture` (M-tex). */\n textureProvider?: TextureProvider;\n /** Render `BasisCurves` with authored `widths` as tube meshes (M18). */\n curveTubes?: boolean;\n /** Receives fidelity diagnostics (channel-packing mismatches, M19). */\n onWarn?: (message: string) => void;\n /** Parsed `.mdl` modules for MDL material family/value resolution (M20). */\n mdl?: MdlModuleProvider;\n /** Overrides material creation for mesh-like gprims (M22). */\n materialFactory?: MaterialFactory;\n /** Flag visual meshes `castShadow` / `receiveShadow` (M25). */\n shadows?: boolean;\n};\n\n/** Interpolation domain of a resolved primvar (UsdGeom tokens; `varying` ⇒ `vertex`). */\ntype PrimvarInterpolation = \"constant\" | \"uniform\" | \"vertex\" | \"faceVarying\";\n\ntype ResolvedPrimvar = {\n /** Tuples after `primvars:<name>:indices` de-referencing. */\n values: number[][];\n interpolation: PrimvarInterpolation;\n};\n\n/** Element counts of the interpolation domains on a mesh. */\ntype MeshLens = { points: number; faceVertices: number; faces: number };\n\n/**\n * Read a primvar (or a bare attribute like `normals`): applies the paired\n * `:indices` array, then resolves the interpolation — authored metadata\n * first, else inferred from the value count. Data too short for its domain\n * degrades to constant instead of producing a broken attribute.\n */\nfunction readPrimvar(\n meshPrim: Prim,\n attrName: string,\n isTuple: (v: unknown) => boolean,\n lens: MeshLens,\n): ResolvedPrimvar | null {\n const attr = meshPrim.GetAttribute(attrName);\n const raw = attr.Get();\n if (!isTuple(raw) || (raw as number[][]).length === 0) return null;\n const base = raw as number[][];\n let values = base;\n const idx = meshPrim.GetAttribute(`${attrName}:indices`).Get();\n if (isNumberArray(idx)) values = idx.map((i) => base[i] ?? base[0]!);\n\n const authored = attr.GetMetadata(\"interpolation\");\n let interpolation: PrimvarInterpolation;\n if (authored === \"varying\")\n interpolation = \"vertex\"; // ≡ vertex on polygon meshes\n else if (\n authored === \"constant\" ||\n authored === \"uniform\" ||\n authored === \"vertex\" ||\n authored === \"faceVarying\"\n ) {\n interpolation = authored;\n } else if (values.length === lens.points && lens.points > 0) interpolation = \"vertex\";\n else if (values.length === lens.faceVertices && lens.faceVertices > 0)\n interpolation = \"faceVarying\";\n else if (values.length === lens.faces && lens.faces > 0) interpolation = \"uniform\";\n else interpolation = \"constant\";\n\n const needed =\n interpolation === \"vertex\"\n ? lens.points\n : interpolation === \"faceVarying\"\n ? lens.faceVertices\n : interpolation === \"uniform\"\n ? lens.faces\n : 1;\n if (values.length < needed) interpolation = \"constant\";\n return { values, interpolation };\n}\n\n/**\n * UV-set primvar names authored on a mesh — `\"st\"` first (three's `uv`\n * attribute / channel 0), extras sorted (`uv1`, `uv2`, …). The geometry and\n * material builders both derive the channel mapping from this order.\n */\n/** UV-capable primvar value types (pxr spells it `texCoord2f`, assets vary). */\nconst UV_TYPE_NAMES: ReadonlySet<string> = new Set([\"texcoord2f\", \"float2\"]);\n\nfunction meshUvSetNames(meshPrim: Prim): string[] {\n const sets: string[] = [];\n for (const attr of meshPrim.GetAttributes()) {\n const name = attr.GetName();\n if (!name.startsWith(\"primvars:\") || name.endsWith(\":indices\")) continue;\n if (!attr.IsArray()) continue;\n if (!UV_TYPE_NAMES.has(attr.GetTypeName().toLowerCase())) continue;\n sets.push(name.slice(\"primvars:\".length));\n }\n sets.sort((a, b) => (a === \"st\" ? -1 : b === \"st\" ? 1 : a < b ? -1 : 1));\n return sets;\n}\n\nfunction uvAttrName(index: number): string {\n return index === 0 ? \"uv\" : `uv${index}`;\n}\n\nfunction meshLens(meshPrim: Prim): MeshLens {\n const points = meshPrim.GetAttribute(\"points\").Get();\n const counts = meshPrim.GetAttribute(\"faceVertexCounts\").Get();\n const indices = meshPrim.GetAttribute(\"faceVertexIndices\").Get();\n const hasTopology = isNumberArray(counts) && isNumberArray(indices);\n return {\n points: isVec3Array(points) ? points.length : 0,\n faceVertices: hasTopology ? (indices as number[]).length : 0,\n faces: hasTopology ? (counts as number[]).length : 0,\n };\n}\n\n/** The mesh's `primvars:displayColor`, resolved — shared by geometry & material. */\nfunction displayColorPrimvar(meshPrim: Prim): ResolvedPrimvar | null {\n return readPrimvar(meshPrim, \"primvars:displayColor\", isVec3Array, meshLens(meshPrim));\n}\n\n/**\n * Build a `BufferGeometry` from a Mesh prim, or `null` if it has no points.\n *\n * Primvars resolve with full interpolation semantics (M19): `:indices` arrays\n * are de-referenced, vertex-interpolated `st` sets / `normals` /\n * `displayColor` bind onto the shared vertices, and any faceVarying primvar\n * (or per-face color) switches the mesh to a de-indexed layout where every\n * face corner owns its vertex. Extra UV sets become `uv1`, `uv2`, … in\n * {@link meshUvSetNames} order.\n *\n * When the mesh carries `materialBind` face subsets, the triangles are ordered\n * subset by subset and a geometry group is added for each — so the mesh can be\n * drawn with one material per subset (see {@link buildMeshMaterials}). Group\n * order matches {@link getMaterialSubsets}, with any unassigned faces last.\n */\nexport function buildMeshGeometry(meshPrim: Prim): THREE.BufferGeometry | null {\n const points = meshPrim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return null;\n\n const countsRaw = meshPrim.GetAttribute(\"faceVertexCounts\").Get();\n const indicesRaw = meshPrim.GetAttribute(\"faceVertexIndices\").Get();\n const counts = isNumberArray(countsRaw) ? countsRaw : null;\n const indices = isNumberArray(indicesRaw) ? indicesRaw : null;\n const lens: MeshLens = {\n points: points.length,\n faceVertices: counts && indices ? indices.length : 0,\n faces: counts && indices ? counts.length : 0,\n };\n\n const uvSets = meshUvSetNames(meshPrim).map((set) =>\n readPrimvar(meshPrim, `primvars:${set}`, isVec2Array, lens),\n );\n const normals =\n readPrimvar(meshPrim, \"primvars:normals\", isVec3Array, lens) ??\n readPrimvar(meshPrim, \"normals\", isVec3Array, lens);\n const color = displayColorPrimvar(meshPrim);\n\n // Face-varying data (or per-face color) cannot live on shared vertices.\n const expand =\n counts !== null &&\n indices !== null &&\n ([...uvSets, normals].some((p) => p?.interpolation === \"faceVarying\") ||\n color?.interpolation === \"faceVarying\" ||\n color?.interpolation === \"uniform\");\n\n return expand\n ? buildExpandedGeometry(meshPrim, points, counts!, indices!, uvSets, normals, color)\n : buildIndexedGeometry(meshPrim, points, counts, indices, uvSets, normals, color);\n}\n\n/** Shared-vertex (indexed) layout: all primvars are per-vertex or absent. */\nfunction buildIndexedGeometry(\n meshPrim: Prim,\n points: Vec3[],\n counts: number[] | null,\n indices: number[] | null,\n uvSets: (ResolvedPrimvar | null)[],\n normals: ResolvedPrimvar | null,\n color: ResolvedPrimvar | null,\n): THREE.BufferGeometry {\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(flat3(points), 3));\n\n if (counts && indices) {\n const subsets = getMaterialSubsets(meshPrim);\n if (subsets.length > 0) {\n geometry.setIndex(triangulateBySubset(geometry, counts, indices, subsets));\n } else {\n geometry.setIndex(triangulate(counts, indices));\n }\n } else if (indices) {\n geometry.setIndex(indices.slice());\n }\n\n if (normals?.interpolation === \"vertex\") {\n geometry.setAttribute(\n \"normal\",\n new THREE.Float32BufferAttribute(flat3(normals.values.slice(0, points.length) as Vec3[]), 3),\n );\n } else {\n geometry.computeVertexNormals();\n }\n for (const [i, uv] of uvSets.entries()) {\n if (uv?.interpolation !== \"vertex\") continue;\n geometry.setAttribute(\n uvAttrName(i),\n new THREE.Float32BufferAttribute(flat2(uv.values.slice(0, points.length) as Vec2[]), 2),\n );\n }\n if (color?.interpolation === \"vertex\") {\n geometry.setAttribute(\n \"color\",\n new THREE.Float32BufferAttribute(flat3(color.values.slice(0, points.length) as Vec3[]), 3),\n );\n }\n return geometry;\n}\n\n/**\n * De-indexed layout for faceVarying primvars: triangulate to face-corner\n * \"slots\", then emit one vertex per corner, sampling each primvar in its own\n * interpolation domain. Subset groups carry over in corner units.\n */\nfunction buildExpandedGeometry(\n meshPrim: Prim,\n points: Vec3[],\n counts: number[],\n indices: number[],\n uvSets: (ResolvedPrimvar | null)[],\n normals: ResolvedPrimvar | null,\n color: ResolvedPrimvar | null,\n): THREE.BufferGeometry {\n const { slots, faces, groups } = triangulateToSlots(counts, getMaterialSubsets(meshPrim));\n\n const sample = (p: ResolvedPrimvar, corner: number): number[] => {\n switch (p.interpolation) {\n case \"faceVarying\":\n return p.values[slots[corner]!] ?? p.values[0]!;\n case \"vertex\":\n return p.values[indices[slots[corner]!]!] ?? p.values[0]!;\n case \"uniform\":\n return p.values[faces[corner]!] ?? p.values[0]!;\n default:\n return p.values[0]!;\n }\n };\n\n const geometry = new THREE.BufferGeometry();\n const position = new Array<number>(slots.length * 3);\n for (let c = 0; c < slots.length; c++) {\n const v = points[indices[slots[c]!]!] ?? [0, 0, 0];\n position[c * 3] = v[0];\n position[c * 3 + 1] = v[1];\n position[c * 3 + 2] = v[2];\n }\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(position, 3));\n\n for (const [i, uv] of uvSets.entries()) {\n if (!uv || uv.interpolation === \"constant\") continue;\n const out = new Array<number>(slots.length * 2);\n for (let c = 0; c < slots.length; c++) {\n const t = sample(uv, c);\n out[c * 2] = t[0] ?? 0;\n out[c * 2 + 1] = t[1] ?? 0;\n }\n geometry.setAttribute(uvAttrName(i), new THREE.Float32BufferAttribute(out, 2));\n }\n\n const emitVec3 = (p: ResolvedPrimvar, name: string) => {\n const out = new Array<number>(slots.length * 3);\n for (let c = 0; c < slots.length; c++) {\n const t = sample(p, c);\n out[c * 3] = t[0] ?? 0;\n out[c * 3 + 1] = t[1] ?? 0;\n out[c * 3 + 2] = t[2] ?? 0;\n }\n geometry.setAttribute(name, new THREE.Float32BufferAttribute(out, 3));\n };\n if (normals && normals.interpolation !== \"constant\") emitVec3(normals, \"normal\");\n else geometry.computeVertexNormals();\n if (color && color.interpolation !== \"constant\") emitVec3(color, \"color\");\n\n for (const g of groups) geometry.addGroup(g.start, g.count, g.materialIndex);\n return geometry;\n}\n\n/**\n * Triangulate faces into corner-slot triples (subset by subset, unassigned\n * faces last — the ordering contract of {@link triangulateBySubset}), keeping\n * the owning face of every corner and the subset group ranges.\n */\nfunction triangulateToSlots(\n faceVertexCounts: number[],\n subsets: MaterialSubset[],\n): {\n slots: number[];\n faces: number[];\n groups: { start: number; count: number; materialIndex: number }[];\n} {\n const faceStart: number[] = [];\n let offset = 0;\n for (const count of faceVertexCounts) {\n faceStart.push(offset);\n offset += count;\n }\n\n const slots: number[] = [];\n const faces: number[] = [];\n const emit = (face: number) => {\n const start = faceStart[face]!;\n const count = faceVertexCounts[face]!;\n for (let k = 2; k < count; k++) {\n slots.push(start, start + k - 1, start + k);\n faces.push(face, face, face);\n }\n };\n\n const groups: { start: number; count: number; materialIndex: number }[] = [];\n if (subsets.length === 0) {\n for (let face = 0; face < faceVertexCounts.length; face++) emit(face);\n return { slots, faces, groups };\n }\n\n const claimed = new Uint8Array(faceVertexCounts.length);\n for (const [index, subset] of subsets.entries()) {\n const begin = slots.length;\n for (const face of subset.faces) {\n if (face < 0 || face >= faceVertexCounts.length || claimed[face]) continue;\n claimed[face] = 1;\n emit(face);\n }\n if (slots.length > begin) {\n groups.push({ start: begin, count: slots.length - begin, materialIndex: index });\n }\n }\n const begin = slots.length;\n for (let face = 0; face < faceVertexCounts.length; face++) {\n if (!claimed[face]) emit(face);\n }\n if (slots.length > begin) {\n groups.push({ start: begin, count: slots.length - begin, materialIndex: subsets.length });\n }\n return { slots, faces, groups };\n}\n\n/**\n * Build geometry for any renderable gprim: `Mesh` via {@link buildMeshGeometry},\n * parametric solids from their schema attributes. Solids follow UsdGeom\n * semantics — sizes in stage units, centered at the origin, `axis` (default\n * `\"Z\"`) along the spine, and a capsule's `height` spans only its cylindrical\n * section. Returns `null` for unsupported prim types.\n */\nexport function buildGprimGeometry(prim: Prim): THREE.BufferGeometry | null {\n switch (prim.GetTypeName()) {\n case \"Mesh\":\n return buildMeshGeometry(prim);\n case \"Cube\": {\n const size = getNumber(prim, \"size\") ?? 2;\n return new THREE.BoxGeometry(size, size, size);\n }\n case \"Sphere\":\n return new THREE.SphereGeometry(getNumber(prim, \"radius\") ?? 1, 32, 16);\n case \"Cylinder\": {\n const radius = getNumber(prim, \"radius\") ?? 1;\n const height = getNumber(prim, \"height\") ?? 2;\n return orientSpine(new THREE.CylinderGeometry(radius, radius, height, 32), prim);\n }\n case \"Capsule\": {\n const radius = getNumber(prim, \"radius\") ?? 0.5;\n const height = getNumber(prim, \"height\") ?? 1;\n return orientSpine(new THREE.CapsuleGeometry(radius, height, 8, 32), prim);\n }\n case \"Cone\": {\n const radius = getNumber(prim, \"radius\") ?? 1;\n const height = getNumber(prim, \"height\") ?? 2;\n return orientSpine(new THREE.ConeGeometry(radius, height, 32), prim);\n }\n default:\n return null;\n }\n}\n\nexport type BuildGprimOptions = {\n /** Resolves texture asset paths for mesh materials. */\n textureProvider?: TextureProvider;\n /**\n * Render `BasisCurves` that author `widths` as tube meshes instead of\n * 1-px lines (default `false`).\n */\n curveTubes?: boolean;\n /** Receives fidelity diagnostics (channel-packing mismatches, M19). */\n onWarn?: (message: string) => void;\n /** Parsed `.mdl` modules for MDL material family/value resolution (M20). */\n mdl?: MdlModuleProvider;\n /** Overrides material creation for mesh-like gprims (M22). */\n materialFactory?: MaterialFactory;\n /**\n * Flag mesh-like gprims `castShadow` / `receiveShadow` (M25). Free until a\n * renderer enables shadow maps; fully transparent / transmissive meshes\n * still receive but do not cast (Three.js shadows would be opaque black).\n */\n shadows?: boolean;\n};\n\n/**\n * Build a renderable `THREE.Object3D` for any supported gprim (M18):\n * `Mesh` and the parametric solids become a `THREE.Mesh` (via\n * {@link buildGprimGeometry} + {@link buildMeshMaterials}), `Points` a\n * `THREE.Points`, and `BasisCurves` a `THREE.Group` holding one line — or,\n * with {@link BuildGprimOptions.curveTubes}, one tube mesh — per curve.\n * Returns `null` for unsupported prim types and degenerate geometry.\n */\nexport function buildGprimObject(\n prim: Prim,\n stage?: Stage,\n options: BuildGprimOptions = {},\n): THREE.Object3D | null {\n switch (prim.GetTypeName()) {\n case \"Points\":\n return buildPointsObject(prim, stage, options.mdl);\n case \"BasisCurves\":\n return buildBasisCurvesObject(prim, stage, options.curveTubes ?? false, options.mdl);\n default: {\n const geometry = buildGprimGeometry(prim);\n if (!geometry) return null;\n // The factory (M22) replaces the whole material; `null` means \"not mine\".\n const custom = stage && options.materialFactory ? options.materialFactory(prim, stage) : null;\n const mesh = new THREE.Mesh(\n geometry,\n custom ??\n buildMeshMaterials(prim, stage, options.textureProvider, options.onWarn, options.mdl),\n );\n if (options.shadows) applyShadowFlags(mesh);\n return mesh;\n }\n }\n}\n\n/**\n * Mark a mesh for shadow rendering (M25): it always receives; it casts unless\n * every material slot is transparent or transmissive — Three.js shadow maps\n * render such a mesh as an opaque blocker, which reads worse than no shadow.\n */\nfunction applyShadowFlags(mesh: THREE.Mesh): void {\n mesh.receiveShadow = true;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n mesh.castShadow = materials.some((material) => {\n const transmission = (material as THREE.MeshPhysicalMaterial).transmission ?? 0;\n return !material.transparent && transmission === 0;\n });\n}\n\n/**\n * Flat color/opacity for point/curve materials — the same priority as meshes:\n * bound `UsdShade` diffuse → constant `primvars:displayColor` → default gray.\n */\nfunction resolveFlatColor(\n prim: Prim,\n stage?: Stage,\n mdl?: MdlModuleProvider,\n): { color: THREE.Color; opacity: number; name?: string } {\n const color = new THREE.Color(DEFAULT_COLOR);\n const bound = stage ? resolveBoundMaterial(stage, prim, mdl ? { mdl } : {}) : undefined;\n if (bound?.color) {\n color.setRGB(bound.color[0], bound.color[1], bound.color[2]);\n } else {\n const displayColor = prim.GetAttribute(\"primvars:displayColor\").Get();\n if (isVec3Array(displayColor) && displayColor[0]) {\n color.setRGB(displayColor[0][0], displayColor[0][1], displayColor[0][2]);\n }\n }\n const result: { color: THREE.Color; opacity: number; name?: string } = {\n color,\n opacity: bound?.opacity ?? 1,\n };\n if (bound?.name) result.name = bound.name;\n return result;\n}\n\n/** Mean of an authored `widths` array (USD widths are world-space diameters). */\nfunction meanWidth(prim: Prim): number | undefined {\n const widths = prim.GetAttribute(\"widths\").Get();\n if (!isNumberArray(widths) || widths.length === 0) return undefined;\n return widths.reduce((a, b) => a + b, 0) / widths.length;\n}\n\n/**\n * `Points` → `THREE.Points`. Per-point `primvars:displayColor` becomes vertex\n * colors; `widths` (diameters) have no per-point equivalent in\n * `PointsMaterial`, so their mean becomes the world-space point size. Without\n * widths, points draw as fixed 3-px dots.\n */\nfunction buildPointsObject(\n prim: Prim,\n stage?: Stage,\n mdl?: MdlModuleProvider,\n): THREE.Points | null {\n const points = prim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return null;\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(flat3(points), 3));\n\n const flat = resolveFlatColor(prim, stage, mdl);\n const material = new THREE.PointsMaterial({ color: flat.color });\n if (flat.opacity < 1) {\n material.transparent = true;\n material.opacity = flat.opacity;\n }\n if (flat.name) material.name = flat.name;\n\n const displayColor = prim.GetAttribute(\"primvars:displayColor\").Get();\n if (isVec3Array(displayColor) && displayColor.length === points.length && points.length > 1) {\n geometry.setAttribute(\"color\", new THREE.Float32BufferAttribute(flat3(displayColor), 3));\n material.vertexColors = true;\n material.color.set(0xffffff); // let the vertex colors drive\n }\n\n const width = meanWidth(prim);\n if (width !== undefined && width > 0) {\n material.size = width;\n material.sizeAttenuation = true;\n } else {\n material.size = 3;\n material.sizeAttenuation = false;\n }\n return new THREE.Points(geometry, material);\n}\n\n/** Polyline samples per cubic curve segment. */\nconst CURVE_DIVISIONS = 8;\n\n/**\n * Uniform cubic basis matrices, rows weighting `[t³, t², t, 1]` —\n * `p(t) = [t³ t² t 1] · M · [P0 P1 P2 P3]ᵀ` (RenderMan/USD conventions).\n */\nconst CUBIC_BASES: Record<string, { m: number[][]; vstep: number }> = {\n // biome-ignore format: keep matrix layout readable\n bezier: {\n m: [\n [-1, 3, -3, 1],\n [3, -6, 3, 0],\n [-3, 3, 0, 0],\n [1, 0, 0, 0],\n ],\n vstep: 3,\n },\n // biome-ignore format: keep matrix layout readable\n bspline: {\n m: [\n [-1 / 6, 3 / 6, -3 / 6, 1 / 6],\n [3 / 6, -6 / 6, 3 / 6, 0],\n [-3 / 6, 0, 3 / 6, 0],\n [1 / 6, 4 / 6, 1 / 6, 0],\n ],\n vstep: 1,\n },\n // biome-ignore format: keep matrix layout readable\n catmullRom: {\n m: [\n [-1 / 2, 3 / 2, -3 / 2, 1 / 2],\n [2 / 2, -5 / 2, 4 / 2, -1 / 2],\n [-1 / 2, 0, 1 / 2, 0],\n [0, 2 / 2, 0, 0],\n ],\n vstep: 1,\n },\n};\n\n/**\n * Sample one cubic curve into a polyline. Periodic curves wrap their control\n * points and omit the closing sample (the caller closes with a `LineLoop`);\n * nonperiodic curves include both endpoints. Returns `null` when there are\n * too few CVs for a single segment.\n */\nfunction sampleCubicCurve(cvs: Vec3[], basisName: string, periodic: boolean): Vec3[] | null {\n const basis = CUBIC_BASES[basisName] ?? CUBIC_BASES.bezier!;\n const n = cvs.length;\n const nseg = periodic ? Math.floor(n / basis.vstep) : Math.floor((n - 4) / basis.vstep) + 1;\n if (n < 4 || nseg < 1) return null;\n\n const out: Vec3[] = [];\n for (let s = 0; s < nseg; s++) {\n const i0 = s * basis.vstep;\n const P = [cvs[i0 % n]!, cvs[(i0 + 1) % n]!, cvs[(i0 + 2) % n]!, cvs[(i0 + 3) % n]!];\n // Segments share boundary points: sample [0, 1) per segment, plus the\n // final t=1 endpoint only on the last nonperiodic segment.\n const last = !periodic && s === nseg - 1 ? CURVE_DIVISIONS : CURVE_DIVISIONS - 1;\n for (let k = 0; k <= last; k++) {\n const t = k / CURVE_DIVISIONS;\n const w = [t * t * t, t * t, t, 1];\n const point: Vec3 = [0, 0, 0];\n for (let i = 0; i < 4; i++) {\n let b = 0;\n for (let j = 0; j < 4; j++) b += w[j]! * basis.m[j]![i]!;\n point[0] += b * P[i]![0];\n point[1] += b * P[i]![1];\n point[2] += b * P[i]![2];\n }\n out.push(point);\n }\n }\n return out;\n}\n\n/** A piecewise-linear `CurvePath` through `samples`, for tube tessellation. */\nfunction polylinePath(samples: Vec3[], closed: boolean): THREE.CurvePath<THREE.Vector3> {\n const path = new THREE.CurvePath<THREE.Vector3>();\n const vecs = samples.map(([x, y, z]) => new THREE.Vector3(x, y, z));\n for (let i = 0; i < vecs.length - 1; i++) path.add(new THREE.LineCurve3(vecs[i]!, vecs[i + 1]!));\n if (closed) path.add(new THREE.LineCurve3(vecs[vecs.length - 1]!, vecs[0]!));\n return path;\n}\n\n/**\n * `BasisCurves` → a `THREE.Group` with one object per curve. `type=\"linear\"`\n * connects the CVs directly; `type=\"cubic\"` samples the authored `basis`\n * (`bezier` / `bspline` / `catmullRom`, uniform cubic evaluation) at\n * {@link CURVE_DIVISIONS} points per segment. `wrap=\"periodic\"` closes each\n * curve (`THREE.LineLoop`). With `curveTubes` and authored `widths`, curves\n * tessellate into `TubeGeometry` meshes of radius `mean(widths) / 2` instead.\n */\nfunction buildBasisCurvesObject(\n prim: Prim,\n stage: Stage | undefined,\n curveTubes: boolean,\n mdl?: MdlModuleProvider,\n): THREE.Object3D | null {\n const points = prim.GetAttribute(\"points\").Get();\n const counts = prim.GetAttribute(\"curveVertexCounts\").Get();\n if (!isVec3Array(points) || !isNumberArray(counts) || counts.length === 0) return null;\n\n const curveType = prim.GetAttribute(\"type\").Get() ?? \"cubic\";\n const basisName = prim.GetAttribute(\"basis\").Get() ?? \"bezier\";\n const periodic = prim.GetAttribute(\"wrap\").Get() === \"periodic\";\n\n const flat = resolveFlatColor(prim, stage, mdl);\n const width = meanWidth(prim);\n const asTubes = curveTubes && width !== undefined && width > 0;\n\n const material = asTubes\n ? new THREE.MeshStandardMaterial({ color: flat.color, roughness: 0.8, metalness: 0.1 })\n : new THREE.LineBasicMaterial({ color: flat.color });\n if (flat.opacity < 1) {\n material.transparent = true;\n material.opacity = flat.opacity;\n }\n if (flat.name) material.name = flat.name;\n\n const group = new THREE.Group();\n let offset = 0;\n for (const count of counts) {\n const cvs = points.slice(offset, offset + count);\n offset += count;\n const samples =\n curveType === \"linear\"\n ? cvs.length >= 2\n ? cvs\n : null\n : sampleCubicCurve(cvs, typeof basisName === \"string\" ? basisName : \"bezier\", periodic);\n if (!samples || samples.length < 2) continue;\n\n if (asTubes) {\n const path = polylinePath(samples, periodic);\n const geometry = new THREE.TubeGeometry(\n path,\n Math.max(samples.length, 2),\n width / 2,\n 8,\n periodic,\n );\n group.add(new THREE.Mesh(geometry, material));\n } else {\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(flat3(samples), 3));\n group.add(\n periodic ? new THREE.LineLoop(geometry, material) : new THREE.Line(geometry, material),\n );\n }\n }\n return group.children.length > 0 ? group : null;\n}\n\nfunction getNumber(prim: Prim, name: string): number | undefined {\n const v = prim.GetAttribute(name).Get();\n return typeof v === \"number\" ? v : undefined;\n}\n\n/** Rotate a Y-spined three.js primitive onto the prim's `axis` (USD default `Z`). */\nfunction orientSpine(geometry: THREE.BufferGeometry, prim: Prim): THREE.BufferGeometry {\n const axis = prim.GetAttribute(\"axis\").Get();\n if (axis === \"Y\") return geometry;\n if (axis === \"X\") return geometry.rotateZ(-Math.PI / 2);\n return geometry.rotateX(Math.PI / 2);\n}\n\n/**\n * Build a material for a gprim. Color priority: bound `UsdShade` material\n * (when `stage` is given) → `primvars:displayColor` → default gray. Textures\n * (via `textures`) become the matching `MeshStandardMaterial` maps — diffuse →\n * `map` (sRGB), plus `normalMap` / `roughnessMap` / `metalnessMap` / `aoMap`\n * (linear data) and emissive `emissiveMap`. Metalness / roughness / opacity /\n * emissive constants come from the bound material when present.\n */\nexport function buildMeshMaterial(\n meshPrim: Prim,\n stage?: Stage,\n textures?: TextureProvider,\n /** Resolve the material binding from here instead (a `GeomSubset`). */\n bindingPrim?: Prim,\n /** Receives fidelity diagnostics (channel-packing mismatches, M19). */\n onWarn?: (message: string) => void,\n /** Parsed `.mdl` modules for MDL material family/value resolution (M20). */\n mdl?: MdlModuleProvider,\n): THREE.Material {\n const color = new THREE.Color(DEFAULT_COLOR);\n let opacity = 1;\n let vertexColors = false;\n\n const resolveOptions: ResolveMaterialOptions = {\n ...(mdl ? { mdl } : {}),\n ...(onWarn ? { onWarn } : {}),\n };\n const bound = stage\n ? resolveBoundMaterial(stage, bindingPrim ?? meshPrim, resolveOptions)\n : undefined;\n if (bound?.color) {\n color.setRGB(bound.color[0], bound.color[1], bound.color[2]);\n } else {\n const displayColor = displayColorPrimvar(meshPrim);\n if (displayColor && displayColor.interpolation !== \"constant\") {\n // Per-vertex / per-face displayColor → vertex colors; the geometry\n // builder authors the matching `color` attribute.\n vertexColors = true;\n color.setRGB(1, 1, 1);\n } else if (displayColor?.values[0]) {\n const [r, g, b] = displayColor.values[0];\n color.setRGB(r ?? 0, g ?? 0, b ?? 0);\n }\n }\n if (bound?.opacity !== undefined) opacity = bound.opacity;\n\n // Resolve a channel's `THREE.Texture`, forwarding its wrap modes, UV-set\n // channel, colorspace, and `UsdTransform2d` (the `UsdUVTexture\n // .inputs:scale`/`bias` are folded into the material factors below, not the\n // sampler). `inputs:sourceColorSpace` overrides the per-channel default.\n const uvSetNames = meshUvSetNames(meshPrim);\n const tex = (rt: ResolvedTexture | undefined, cs: \"srgb\" | \"linear\") => {\n if (!rt || !textures) return null;\n const channel = rt.uvChannel ?? (rt.uvSet ? Math.max(uvSetNames.indexOf(rt.uvSet), 0) : 0);\n const colorSpace =\n rt.sourceColorSpace === \"raw\" ? \"linear\" : rt.sourceColorSpace === \"sRGB\" ? \"srgb\" : cs;\n return textures(rt.path, {\n colorSpace,\n ...(rt.wrapS ? { wrapS: rt.wrapS } : {}),\n ...(rt.wrapT ? { wrapT: rt.wrapT } : {}),\n ...(rt.transform ? { transform: rt.transform } : {}),\n ...(channel > 0 ? { channel } : {}),\n });\n };\n\n // three.js samples fixed channels from packed maps (glTF convention). A\n // network wired to a different single-channel output can't be honoured\n // without repacking — surface it instead of sampling silently wrong data.\n if (onWarn) {\n const packed = [\n [bound?.roughnessTexture, \"g\", \"roughness\"],\n [bound?.metalnessTexture, \"b\", \"metalness\"],\n [bound?.occlusionTexture, \"r\", \"occlusion\"],\n ] as const;\n for (const [rt, expected, label] of packed) {\n const channel = rt?.outputChannel;\n if (channel && channel !== \"rgb\" && channel !== expected) {\n onWarn(\n `${meshPrim.GetPath()}: ${label} reads outputs:${channel}, but three.js samples the \"${expected}\" channel of the map — repack the texture to the glTF ORM layout`,\n );\n }\n }\n }\n\n const map = tex(bound?.colorTexture, \"srgb\");\n // `inputs:scale` on the diffuse texture tints the map; otherwise pass through.\n if (map) {\n const s = bound?.colorTexture?.scale;\n if (s) color.setRGB(s[0], s[1], s[2]);\n else color.setRGB(1, 1, 1);\n }\n const normalMap = tex(bound?.normalTexture, \"linear\");\n const roughnessMap = tex(bound?.roughnessTexture, \"linear\");\n const metalnessMap = tex(bound?.metalnessTexture, \"linear\");\n const aoMap = tex(bound?.occlusionTexture, \"linear\");\n const emissiveMap = tex(bound?.emissiveTexture, \"srgb\");\n\n // A scalar map's `inputs:scale[0]` (or an authored constant) becomes three's\n // factor; three multiplies factor × map, so default to 1 to pass it through.\n const metalness =\n bound?.metalness ?? bound?.metalnessTexture?.scale?.[0] ?? (metalnessMap ? 1 : 0.1);\n const roughness =\n bound?.roughness ?? bound?.roughnessTexture?.scale?.[0] ?? (roughnessMap ? 1 : 0.8);\n\n const emissive = new THREE.Color(0x000000);\n if (bound?.emissiveColor) {\n emissive.setRGB(bound.emissiveColor[0], bound.emissiveColor[1], bound.emissiveColor[2]);\n } else if (emissiveMap) {\n emissive.setRGB(1, 1, 1); // let the map drive emission\n }\n\n // Opacity sourcing: a dedicated opacity texture → `alphaMap`; an opacity input\n // wired to the *same* image as the diffuse map → that map's own alpha channel\n // (no separate map needed). `opacityThreshold > 0` means alpha clip (a binary\n // cutout rendered in the opaque pass); otherwise sub-unit alpha blends.\n const opacityTex = bound?.opacityTexture;\n const sharesColorMap = !!(opacityTex && opacityTex.path === bound?.colorTexture?.path);\n const alphaMap = sharesColorMap ? null : tex(opacityTex, \"linear\");\n const hasAlphaSource = opacity < 1 || sharesColorMap || !!alphaMap;\n const threshold = bound?.opacityThreshold;\n const alphaTest = threshold !== undefined && threshold > 0 ? threshold : 0;\n // Alpha-clip masks render opaque (depth-written, discarded below the cutoff);\n // only true translucency uses the transparent/blended pass.\n const transparent = alphaTest === 0 && hasAlphaSource;\n\n const doubleSided = meshPrim.GetAttribute(\"doubleSided\").Get() === true;\n const params: THREE.MeshStandardMaterialParameters = {\n color,\n metalness,\n roughness,\n emissive,\n transparent,\n opacity,\n ...(vertexColors ? { vertexColors: true } : {}),\n ...(alphaTest > 0 ? { alphaTest } : {}),\n side: doubleSided ? THREE.DoubleSide : THREE.FrontSide,\n ...(map ? { map } : {}),\n ...(alphaMap ? { alphaMap } : {}),\n ...(normalMap ? { normalMap } : {}),\n ...(roughnessMap ? { roughnessMap } : {}),\n ...(metalnessMap ? { metalnessMap } : {}),\n ...(aoMap ? { aoMap } : {}),\n ...(emissiveMap ? { emissiveMap } : {}),\n };\n\n // UsdPreviewSurface / Omni-MDL physical inputs promote the material (M19 /\n // M20); plain assets keep getting the cheaper MeshStandardMaterial.\n const physical =\n bound !== undefined &&\n (bound.ior !== undefined ||\n bound.clearcoat !== undefined ||\n bound.clearcoatRoughness !== undefined ||\n bound.specularColor !== undefined ||\n bound.transmission !== undefined ||\n bound.clearcoatNormalTexture !== undefined);\n const material = physical\n ? new THREE.MeshPhysicalMaterial(params)\n : new THREE.MeshStandardMaterial(params);\n if (material instanceof THREE.MeshPhysicalMaterial && bound) {\n if (bound.ior !== undefined) material.ior = bound.ior;\n if (bound.clearcoat !== undefined) material.clearcoat = bound.clearcoat;\n if (bound.clearcoatRoughness !== undefined)\n material.clearcoatRoughness = bound.clearcoatRoughness;\n if (bound.specularColor) {\n material.specularColor.setRGB(\n bound.specularColor[0],\n bound.specularColor[1],\n bound.specularColor[2],\n );\n }\n // OmniGlass (M20): a transmissive dielectric with a refraction volume.\n if (bound.transmission !== undefined) material.transmission = bound.transmission;\n if (bound.thickness !== undefined) material.thickness = bound.thickness;\n const clearcoatNormalMap = tex(bound.clearcoatNormalTexture, \"linear\");\n if (clearcoatNormalMap) material.clearcoatNormalMap = clearcoatNormalMap;\n }\n if (bound?.emissiveIntensity !== undefined) material.emissiveIntensity = bound.emissiveIntensity;\n // UsdPreviewSurface normal maps author scale (2,2,2,1) / bias (−1,−1,−1,0)\n // to decode [0,1] → [−1,1]; three does that internally, so scale/2 is the\n // residual normalScale (the sign carries DirectX-style green flips).\n if (normalMap && bound?.normalTexture?.scale) {\n material.normalScale.set(bound.normalTexture.scale[0] / 2, bound.normalTexture.scale[1] / 2);\n }\n // Carry the USD material name so re-exports keep it (and dedupe by it).\n if (bound?.name) material.name = bound.name;\n return material;\n}\n\n/**\n * Attach visual (and optionally collision) meshes to every link of a built\n * {@link ThreeUsdRobot}. Each mesh is positioned by its transform relative to\n * the owning link prim.\n */\nexport function bindRobotMeshes(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n desc: RobotDescription,\n options: BindMeshesOptions = {},\n): void {\n const loadVisuals = options.loadVisuals ?? true;\n const loadCollisions = options.loadCollisions ?? false;\n const gprimOptions: BuildGprimOptions = {\n ...(options.textureProvider ? { textureProvider: options.textureProvider } : {}),\n ...(options.curveTubes ? { curveTubes: true } : {}),\n ...(options.onWarn ? { onWarn: options.onWarn } : {}),\n ...(options.mdl ? { mdl: options.mdl } : {}),\n ...(options.materialFactory ? { materialFactory: options.materialFactory } : {}),\n ...(options.shadows ? { shadows: true } : {}),\n };\n\n for (const [key, link] of Object.entries(desc.links)) {\n const linkObj = robot3d.getLinkObject(key);\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkObj || !linkPrim) continue;\n\n // A mesh may be both visual and collision; attach it once, as visual.\n const visualSet = new Set(link.visualPrims);\n\n if (loadVisuals) {\n for (const meshPath of link.visualPrims) {\n attachGprim(stage, linkPrim, meshPath, linkObj, \"visual\", gprimOptions);\n }\n }\n if (loadCollisions) {\n for (const meshPath of link.collisionPrims ?? []) {\n if (loadVisuals && visualSet.has(meshPath)) continue;\n attachGprim(stage, linkPrim, meshPath, linkObj, \"collision\", gprimOptions);\n }\n }\n }\n}\n\n/**\n * Attach the gprims that belong to no link — the static scenery of a cell that\n * also contains robots. The authored prim hierarchy is mirrored with\n * `THREE.Group` nodes (each carrying `userData.primPath` and its prim's local\n * transform), so grouped scenery — a pallet and its cartons, a fence and its\n * wires — stays one movable subtree. World placements are unchanged, and the\n * loader's up-axis and unit normalization still applies at the robot root.\n * Collision-only and guide/proxy prims are skipped.\n */\nexport function bindSceneMeshes(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n desc: RobotDescription,\n options: {\n textureProvider?: TextureProvider;\n curveTubes?: boolean;\n onWarn?: (message: string) => void;\n mdl?: MdlModuleProvider;\n materialFactory?: MaterialFactory;\n shadows?: boolean;\n } = {},\n): number {\n const owned = new Set<string>();\n for (const link of Object.values(desc.links)) {\n for (const path of link.visualPrims) owned.add(path);\n for (const path of link.collisionPrims ?? []) owned.add(path);\n owned.add(link.primPath);\n }\n\n // Ancestor prims materialize lazily, so subtrees with nothing renderable\n // produce no empty groups. Meshes register too: gprims can nest.\n const nodes = new Map<string, THREE.Object3D>();\n const containerFor = (prim: Prim): THREE.Object3D => {\n const parent = prim.GetParent();\n if (!parent || parent.IsPseudoRoot()) return robot3d;\n let node = nodes.get(parent.GetPath());\n if (!node) {\n node = new THREE.Group();\n node.name = parent.GetName();\n node.userData.kind = \"scene\";\n node.userData.primPath = parent.GetPath();\n placeAtLocal(node, parent);\n containerFor(parent).add(node);\n nodes.set(parent.GetPath(), node);\n }\n return node;\n };\n\n const gprimOptions: BuildGprimOptions = {\n ...(options.textureProvider ? { textureProvider: options.textureProvider } : {}),\n ...(options.curveTubes ? { curveTubes: true } : {}),\n ...(options.onWarn ? { onWarn: options.onWarn } : {}),\n ...(options.mdl ? { mdl: options.mdl } : {}),\n ...(options.materialFactory ? { materialFactory: options.materialFactory } : {}),\n ...(options.shadows ? { shadows: true } : {}),\n };\n\n let attached = 0;\n for (const prim of stage.Traverse()) {\n if (!isRenderableGprim(prim) || owned.has(prim.GetPath())) continue;\n if (prim.HasAPI(COLLISION_API) || isNonVisualPurpose(prim)) continue;\n // Skip gprims under a link (already bound relative to their link).\n if ([...owned].some((path) => prim.GetPath().startsWith(`${path}/`))) continue;\n\n const object = buildGprimObject(prim, stage, gprimOptions);\n if (!object) continue;\n object.name = prim.GetName();\n object.userData.kind = \"scene\";\n object.userData.primPath = prim.GetPath();\n placeAtLocal(object, prim);\n containerFor(prim).add(object);\n nodes.set(prim.GetPath(), object);\n attached++;\n }\n return attached;\n}\n\n/** Fix `object` at its prim's local transform (scenery is static). */\nfunction placeAtLocal(object: THREE.Object3D, prim: Prim): void {\n object.matrixAutoUpdate = false;\n object.matrix.fromArray(computeLocalTransform(prim).matrix);\n object.matrixWorldNeedsUpdate = true;\n}\n\n/**\n * Materials for a mesh: one per `materialBind` face subset (matching the\n * geometry groups {@link buildMeshGeometry} adds) plus a trailing fallback for\n * faces no subset claims. A mesh without subsets gets a single material.\n */\nexport function buildMeshMaterials(\n meshPrim: Prim,\n stage?: Stage,\n textures?: TextureProvider,\n onWarn?: (message: string) => void,\n mdl?: MdlModuleProvider,\n): THREE.Material | THREE.Material[] {\n const subsets = stage ? getMaterialSubsets(meshPrim) : [];\n if (subsets.length === 0)\n return buildMeshMaterial(meshPrim, stage, textures, undefined, onWarn, mdl);\n return [\n ...subsets.map((s) => buildMeshMaterial(meshPrim, stage, textures, s.prim, onWarn, mdl)),\n buildMeshMaterial(meshPrim, stage, textures, undefined, onWarn, mdl),\n ];\n}\n\nfunction attachGprim(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n parent: THREE.Object3D,\n kind: MeshKind,\n options: BuildGprimOptions,\n): void {\n const meshPrim = stage.GetPrimAtPath(meshPath);\n if (!meshPrim) return;\n const object = buildGprimObject(meshPrim, stage, options);\n if (!object) return;\n\n object.name = meshPrim.GetName();\n object.userData.kind = kind;\n object.userData.primPath = meshPath;\n // Collision gprims are loaded hidden; reveal via `robot.showCollision = true`.\n // They stay out of shadow passes even when revealed.\n if (kind === \"collision\") {\n object.visible = false;\n object.castShadow = false;\n object.receiveShadow = false;\n }\n object.matrixAutoUpdate = false;\n object.matrix.fromArray(relativeTransform(linkPrim, meshPrim));\n object.matrixWorldNeedsUpdate = true;\n parent.add(object);\n}\n\n/** Accumulated local transform from `linkPrim` (exclusive) down to `meshPrim` (inclusive). */\nfunction relativeTransform(linkPrim: Prim, meshPrim: Prim): Mat4 {\n const chain: Prim[] = [];\n let p: Prim | null = meshPrim;\n const stop = linkPrim.GetPath();\n while (p && p.GetPath() !== stop) {\n chain.push(p);\n p = p.GetParent();\n }\n chain.reverse(); // top-most (just under link) → mesh\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\n// --- triangulation & typed-array helpers -----------------------------------\n\n/** Fan-triangulate USD polygon faces into a flat triangle index list. */\nfunction triangulate(faceVertexCounts: number[], faceVertexIndices: number[]): number[] {\n const tris: number[] = [];\n let offset = 0;\n for (const count of faceVertexCounts) {\n for (let k = 2; k < count; k++) {\n tris.push(\n faceVertexIndices[offset]!,\n faceVertexIndices[offset + k - 1]!,\n faceVertexIndices[offset + k]!,\n );\n }\n offset += count;\n }\n return tris;\n}\n\n/**\n * Triangulate subset by subset so each subset owns a contiguous run of the\n * index buffer, and register that run as a geometry group.\n */\nfunction triangulateBySubset(\n geometry: THREE.BufferGeometry,\n faceVertexCounts: number[],\n faceVertexIndices: number[],\n subsets: MaterialSubset[],\n): number[] {\n const faceStart: number[] = [];\n let offset = 0;\n for (const count of faceVertexCounts) {\n faceStart.push(offset);\n offset += count;\n }\n\n const tris: number[] = [];\n const emit = (face: number) => {\n const start = faceStart[face]!;\n const count = faceVertexCounts[face]!;\n for (let k = 2; k < count; k++) {\n tris.push(\n faceVertexIndices[start]!,\n faceVertexIndices[start + k - 1]!,\n faceVertexIndices[start + k]!,\n );\n }\n };\n\n const claimed = new Uint8Array(faceVertexCounts.length);\n subsets.forEach((subset, index) => {\n const begin = tris.length;\n for (const face of subset.faces) {\n if (face < 0 || face >= faceVertexCounts.length || claimed[face]) continue;\n claimed[face] = 1;\n emit(face);\n }\n if (tris.length > begin) geometry.addGroup(begin, tris.length - begin, index);\n });\n\n const begin = tris.length;\n for (let face = 0; face < faceVertexCounts.length; face++) {\n if (!claimed[face]) emit(face);\n }\n if (tris.length > begin) geometry.addGroup(begin, tris.length - begin, subsets.length);\n\n return tris;\n}\n\nfunction flat3(v: Vec3[]): number[] {\n const out = new Array<number>(v.length * 3);\n for (let i = 0; i < v.length; i++) {\n out[i * 3] = v[i]![0];\n out[i * 3 + 1] = v[i]![1];\n out[i * 3 + 2] = v[i]![2];\n }\n return out;\n}\n\nfunction flat2(v: Vec2[]): number[] {\n const out = new Array<number>(v.length * 2);\n for (let i = 0; i < v.length; i++) {\n out[i * 2] = v[i]![0];\n out[i * 2 + 1] = v[i]![1];\n }\n return out;\n}\n\nfunction isNumberArray(v: unknown): v is number[] {\n return Array.isArray(v) && v.every((n) => typeof n === \"number\");\n}\n\nfunction isVec3Array(v: unknown): v is Vec3[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 3);\n}\n\nfunction isVec2Array(v: unknown): v is Vec2[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 2);\n}\n","/**\n * Loads texture image assets referenced by `UsdShade` materials.\n *\n * A {@link TextureProvider} maps an authored asset path (plus sampler/transform\n * options) to a `THREE.Texture`. The default provider fetches the image **bytes**\n * through the {@link AssetResolver} and decodes them via a blob URL — so it works\n * uniformly for textures served over HTTP and for images embedded inside a\n * `.usdz` package (whose resolver serves zip entries, not real URLs). Decoded\n * images are cached per resolved URL and shared across every texture that uses\n * them; each `THREE.Texture` carries its own color space / wrap / transform.\n */\n\nimport * as THREE from \"three\";\nimport type { AssetResolver } from \"../usd/AssetResolver.js\";\nimport type { TextureTransform, TextureWrap } from \"./MaterialBinding.js\";\n\n/**\n * Color space to interpret a texture in. Color/albedo and emissive maps are\n * `\"srgb\"`; data maps (normal, roughness, metalness, occlusion) are `\"linear\"`.\n */\nexport type TextureColorSpace = \"srgb\" | \"linear\";\n\n/** Per-use sampler state applied to the returned `THREE.Texture`. */\nexport type TextureOptions = {\n /** Defaults to `\"srgb\"`. */\n colorSpace?: TextureColorSpace;\n wrapS?: TextureWrap;\n wrapT?: TextureWrap;\n transform?: TextureTransform;\n /** UV channel index (0 = `uv`, 1 = `uv1`, …) for multi-UV-set meshes. */\n channel?: number;\n};\n\n/** Resolve an authored texture asset path to a `THREE.Texture` (or `null`). */\nexport type TextureProvider = (assetPath: string, options?: TextureOptions) => THREE.Texture | null;\n\nconst DEG2RAD = Math.PI / 180;\n\n/**\n * A {@link TextureProvider} backed by the {@link AssetResolver}, resolving paths\n * against `baseUrl`. Image bytes are fetched once per URL (works for HTTP and\n * `.usdz` entries alike) and the decoded image is shared; each call returns a\n * distinct `THREE.Texture` carrying the requested color space / wrap / transform.\n *\n * `<UDIM>` paths resolve to their first tile (1001) with a one-time `onWarn`\n * diagnostic — full UDIM sets are out of scope (M26).\n */\nexport function createTextureProvider(\n resolver: AssetResolver,\n baseUrl: string,\n onWarn?: (message: string) => void,\n): TextureProvider {\n const images = new Map<string, Promise<TexImageSource>>();\n let warnedUdim = false;\n\n const imageFor = (url: string): Promise<TexImageSource> => {\n let p = images.get(url);\n if (!p) {\n p = loadImage(resolver, url);\n images.set(url, p);\n }\n return p;\n };\n\n return (assetPath: string, options: TextureOptions = {}) => {\n let path = assetPath;\n if (/<UDIM>/i.test(path)) {\n path = path.replace(/<UDIM>/gi, \"1001\");\n if (!warnedUdim) {\n warnedUdim = true;\n onWarn?.(`UDIM texture sets are not supported; using tile 1001 only (e.g. ${path})`);\n }\n }\n let url: string;\n try {\n url = resolver.resolve(path, baseUrl);\n } catch {\n return null;\n }\n\n const texture = new THREE.Texture();\n texture.colorSpace =\n options.colorSpace === \"linear\" ? THREE.NoColorSpace : THREE.SRGBColorSpace;\n texture.wrapS = toThreeWrap(options.wrapS);\n texture.wrapT = toThreeWrap(options.wrapT);\n if (options.channel !== undefined) texture.channel = options.channel;\n applyTransform(texture, options.transform);\n\n imageFor(url)\n .then((image) => {\n texture.image = image;\n texture.needsUpdate = true;\n })\n .catch(() => {\n /* leave the texture blank if the image can't be decoded */\n });\n return texture;\n };\n}\n\n/**\n * Fetch image bytes through the resolver and decode them via a blob URL into an\n * `HTMLImageElement` (so three's default `flipY = true` orients USD's bottom-left\n * `st` origin correctly, matching the prior `TextureLoader` HTTP path).\n */\nasync function loadImage(resolver: AssetResolver, url: string): Promise<TexImageSource> {\n const bytes = resolver.fetchBytes\n ? await resolver.fetchBytes(url)\n : new TextEncoder().encode(await resolver.fetchText(url));\n const blob = new Blob([bytes as BlobPart], { type: mimeOf(url) });\n const objectUrl = URL.createObjectURL(blob);\n try {\n return await new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`failed to decode texture: ${url}`));\n img.src = objectUrl;\n });\n } finally {\n // The decoded image keeps its pixels; the blob URL can be released.\n URL.revokeObjectURL(objectUrl);\n }\n}\n\nfunction toThreeWrap(wrap: TextureWrap | undefined): THREE.Wrapping {\n switch (wrap) {\n case \"clamp\":\n case \"black\": // three has no border color; clamp is the closest mode\n return THREE.ClampToEdgeWrapping;\n case \"mirror\":\n return THREE.MirroredRepeatWrapping;\n default:\n return THREE.RepeatWrapping;\n }\n}\n\n/** Map a `UsdTransform2d` onto a texture's offset / repeat / rotation. */\nfunction applyTransform(texture: THREE.Texture, t: TextureTransform | undefined): void {\n if (!t) return;\n if (t.scale) texture.repeat.set(t.scale[0], t.scale[1]);\n if (t.translation) texture.offset.set(t.translation[0], t.translation[1]);\n if (t.rotation !== undefined) {\n texture.rotation = t.rotation * DEG2RAD;\n texture.center.set(0, 0); // UsdTransform2d rotates about the origin\n }\n}\n\nfunction mimeOf(url: string): string {\n if (/\\.jpe?g$/i.test(url)) return \"image/jpeg\";\n if (/\\.webp$/i.test(url)) return \"image/webp\";\n return \"image/png\";\n}\n","import type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport { extractRobotDescription } from \"../robot/RobotExtractor.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { isUnsupportedGprim } from \"../schemas/usdGeom.js\";\nimport { type AssetResolver, DefaultAssetResolver } from \"../usd/AssetResolver.js\";\nimport { Stage } from \"../usd/Stage.js\";\nimport { type BinarySource, type UsdSource, toBytes } from \"../usd/bytes.js\";\nimport { composeFile, composeLayer } from \"../usd/composition.js\";\nimport { CrateReader } from \"../usd/crate/CrateReader.js\";\nimport { crateToUsdaFile } from \"../usd/crate/toUsdaFile.js\";\nimport { loadMdlModules } from \"../usd/mdl/loadMdlModules.js\";\nimport { isZip, openUsdz } from \"../usd/usdz.js\";\nimport { bindCameras } from \"./CameraBinding.js\";\nimport { bindLights } from \"./LightBinding.js\";\nimport { type MaterialFactory, bindRobotMeshes, bindSceneMeshes } from \"./MeshBinding.js\";\nimport { createTextureProvider } from \"./TextureBinding.js\";\nimport { ThreeUsdRobot, type ThreeUsdRobotOptions, type WorldUpAxis } from \"./ThreeUsdRobot.js\";\n\nexport type ThreeUsdRobotLoaderOptions = {\n /** Resolver for references / payloads / sublayers (default {@link DefaultAssetResolver}). */\n assetResolver?: AssetResolver;\n /** Render visual meshes (M6). */\n loadVisuals?: boolean;\n /** Render collision meshes (M6). */\n loadCollisions?: boolean;\n /**\n * Also render gprims that belong to no link — the static scenery of a cell\n * that contains robots (floor, guarding, racking, …). Placed by their\n * authored stage transform. Default `false`; a stage with no articulation at\n * all (a pure static scene) defaults to `true` so it renders out of the box.\n */\n loadSceneGeometry?: boolean;\n /** Load diffuse textures referenced by materials (default `true`). */\n loadTextures?: boolean;\n /**\n * Bind `UsdLux` lights into the hierarchy (M25, default `true`) — even when\n * scene geometry is off, since they light the robot. Bound lights land on\n * {@link ThreeUsdRobot.lights}; DomeLights on {@link ThreeUsdRobot.domeLights}.\n */\n loadLights?: boolean;\n /**\n * Bind `UsdGeomCamera` prims into the hierarchy (M27, default `true`) —\n * they land on {@link ThreeUsdRobot.cameras}, link-mounted sensor cameras\n * following the joints.\n */\n loadCameras?: boolean;\n /**\n * Multiplies every light's authored emission (`intensity × 2^exposure`,\n * default `1`). Stages authored in Omniverse/RTX photometric units\n * (intensities in the thousands) typically want `0.001` to land in\n * Three.js's exposure-1 range; see docs/lighting.md.\n */\n lightIntensityScale?: number;\n /**\n * Flag meshes `castShadow` / `receiveShadow` and configure light shadows per\n * `ShadowAPI` (M25, default `true`). Costs nothing until a renderer enables\n * shadow maps.\n */\n shadows?: boolean;\n /**\n * Render `BasisCurves` that author `widths` as tube meshes instead of\n * 1-px lines (default `false`, M18).\n */\n curveTubes?: boolean;\n /**\n * Target world up-axis. Any stage (Y-up or Z-up) is normalized into this\n * convention: `\"Y\"` for a standard three.js scene (the default behavior),\n * `\"Z\"` for a robotics-style Z-up world, `\"keep\"` to leave the authored\n * orientation. Takes precedence over {@link upAxisConversion}.\n */\n worldUp?: WorldUpAxis;\n /**\n * Legacy up-axis correction (M9). Default `\"auto\"` ≡ `worldUp: \"Y\"`.\n * @deprecated Use {@link worldUp}.\n */\n upAxisConversion?: \"auto\" | \"Y\" | \"Z\" | \"none\";\n /** Extra uniform scale multiplied with `metersPerUnit` (M9). */\n unitScale?: number;\n /** Clamp `setJointValue` to authored limits (default `true`). */\n clampJointLimits?: boolean;\n /** Seed joints from drive targets / joint state (M9). */\n applyDriveTargetsAsInitialPose?: boolean;\n /**\n * Diagnose {@link ThreeUsdRobot.setLinkTransforms} poses against the joint\n * constraints and warn once per baked session past tolerance (default\n * 1 mm anchor / 0.01 rad axis).\n */\n debugBakedTransforms?: ThreeUsdRobotOptions[\"debugBakedTransforms\"];\n /** Override the robot name. */\n robotName?: string;\n /** Receives non-fatal load diagnostics. */\n onWarn?: (message: string) => void;\n /**\n * Overrides material creation for mesh-like gprims (M22) — e.g. the TSL\n * MaterialX factory from `three-usd-robot/nodes`. Return `null` per prim to\n * keep the default `UsdShade` resolution.\n */\n materialFactory?: MaterialFactory;\n};\n\n/** A composed stage plus the context needed to bind its meshes and textures. */\ntype OpenedStage = { stage: Stage; baseUrl: string; resolver: AssetResolver };\n\n/**\n * Loads Isaac Sim / OpenUSD robot assets into a controllable {@link ThreeUsdRobot}.\n *\n * Assets load by URL ({@link loadAsync}) or from in-memory content\n * ({@link parse} — USDA text, `ArrayBuffer`, typed array, or `Blob`/`File`).\n * Composition (references / payloads / sublayers, M8) is resolved through an\n * {@link AssetResolver}. Mesh rendering is M6; unit / up-axis / initial-pose\n * handling is M9; USDC and variants are M10.\n */\nexport class ThreeUsdRobotLoader {\n readonly options: ThreeUsdRobotLoaderOptions;\n\n constructor(options: ThreeUsdRobotLoaderOptions = {}) {\n this.options = options;\n }\n\n private get resolver(): AssetResolver {\n return this.options.assetResolver ?? new DefaultAssetResolver();\n }\n\n /**\n * Fetch an asset by URL and build the robot. `.usdz` packages are unzipped and\n * composed from their entries; everything else is sniffed for the zip / crate\n * magic and parsed as USDZ, binary USDC, or USDA text.\n */\n async loadAsync(url: string): Promise<ThreeUsdRobot> {\n const bytes = await this.fetchRootBytes(url);\n // Extension first: sniffing only sees offset 0, the extension also covers\n // zip archives with a prefix (fflate reads the central directory anyway).\n if (/\\.usdz$/i.test(url)) return this.parseUsdz(bytes);\n return this.parse(bytes, url);\n }\n\n private async fetchRootBytes(url: string): Promise<Uint8Array> {\n const resolver = this.resolver;\n if (resolver.fetchBytes) return resolver.fetchBytes(url);\n return new TextEncoder().encode(await resolver.fetchText(url));\n }\n\n /**\n * Build a robot from in-memory content — no fetch involved. Accepts USDA\n * source text, or an `ArrayBuffer` / typed array / `Blob` (e.g. a dropped\n * `File`) holding USDA text, a binary crate, or a `.usdz` package; binary\n * input is sniffed for the zip / crate magic. `baseUrl` anchors relative\n * references, payloads, and texture paths of non-package input.\n */\n async parse(data: UsdSource, baseUrl = \"\"): Promise<ThreeUsdRobot> {\n return this.buildFromStage(await this.openSource(data, baseUrl));\n }\n\n /** Build a robot from a `.usdz` package (bytes, `ArrayBuffer`, or `Blob`). */\n async parseUsdz(data: BinarySource): Promise<ThreeUsdRobot> {\n return this.buildFromStage(await this.openUsdzStage(await toBytes(data)));\n }\n\n /** Build a robot from a binary crate (`.usdc` / binary `.usd`). */\n async parseCrate(data: BinarySource, baseUrl = \"\"): Promise<ThreeUsdRobot> {\n const stage = await this.composeStageFromBytes(await toBytes(data), baseUrl, this.resolver);\n return this.buildFromStage({ stage, baseUrl, resolver: this.resolver });\n }\n\n /**\n * Parse + compose in-memory content (same formats as {@link parse}) into the\n * Three.js-independent robot IR.\n */\n async parseRobotDescription(data: UsdSource, baseUrl = \"\"): Promise<RobotDescription> {\n const { stage } = await this.openSource(data, baseUrl);\n return extractRobotDescription(stage, this.extractOptions());\n }\n\n /** Sniff in-memory content (text / zip / crate) and compose it into a stage. */\n private async openSource(data: UsdSource, baseUrl: string): Promise<OpenedStage> {\n const resolver = this.resolver;\n if (typeof data === \"string\") {\n return { stage: await this.composeStage(data, baseUrl, resolver), baseUrl, resolver };\n }\n const bytes = await toBytes(data);\n if (isZip(bytes)) return this.openUsdzStage(bytes);\n const stage = CrateReader.isCrate(bytes)\n ? await this.composeStageFromBytes(bytes, baseUrl, resolver)\n : await this.composeStage(new TextDecoder().decode(bytes), baseUrl, resolver);\n return { stage, baseUrl, resolver };\n }\n\n private async openUsdzStage(bytes: Uint8Array): Promise<OpenedStage> {\n const pkg = openUsdz(bytes);\n // The root layer of a usdz is typically binary USDC — sniff, don't assume text.\n const rootBytes = await pkg.resolver.fetchBytes(pkg.rootEntry);\n const stage = await this.composeStageFromBytes(rootBytes, pkg.rootEntry, pkg.resolver);\n return { stage, baseUrl: pkg.rootEntry, resolver: pkg.resolver };\n }\n\n private async buildFromStage({ stage, baseUrl, resolver }: OpenedStage): Promise<ThreeUsdRobot> {\n const robot = extractRobotDescription(stage, this.extractOptions());\n const tree = buildKinematicTree(robot);\n const robot3d = new ThreeUsdRobot(robot, tree, this.robotOptions());\n robot3d.stage = stage;\n // For deferred asset fetches (M26): dome HDRIs load through the same\n // resolver, so relative CDN paths and `.usdz` entries keep working.\n robot3d.assetContext = { resolver, baseUrl };\n if (this.options.lightIntensityScale !== undefined) {\n robot3d.lightIntensityScale = this.options.lightIntensityScale;\n }\n\n const loadVisuals = this.options.loadVisuals ?? true;\n const loadCollisions = this.options.loadCollisions ?? false;\n // A stage with no articulation at all is a pure static scene; default to\n // drawing its geometry — otherwise the load would be silently empty.\n const isStaticScene =\n Object.keys(robot.links).length === 0 && Object.keys(robot.joints).length === 0;\n if (isStaticScene && this.options.loadSceneGeometry === undefined) {\n this.options.onWarn?.(\n \"no articulation found (0 links / 0 joints); rendering the stage as static scene geometry\",\n );\n }\n const loadScene = this.options.loadSceneGeometry ?? isStaticScene;\n const shadows = this.options.shadows ?? true;\n const onWarn = this.options.onWarn;\n if (loadVisuals || loadCollisions || loadScene) {\n const textureProvider =\n (this.options.loadTextures ?? true)\n ? createTextureProvider(resolver, baseUrl, onWarn)\n : undefined;\n const curveTubes = this.options.curveTubes ?? false;\n const materialFactory = this.options.materialFactory;\n // Prefetch referenced `.mdl` modules (M20) — wrapper materials often\n // carry the whole look while the USD shader authors no inputs at all.\n const mdl = await loadMdlModules(stage, resolver, baseUrl);\n if (loadVisuals || loadCollisions) {\n bindRobotMeshes(stage, robot3d, robot, {\n loadVisuals,\n loadCollisions,\n ...(textureProvider ? { textureProvider } : {}),\n ...(curveTubes ? { curveTubes } : {}),\n ...(onWarn ? { onWarn } : {}),\n ...(mdl ? { mdl } : {}),\n ...(materialFactory ? { materialFactory } : {}),\n ...(shadows ? { shadows } : {}),\n });\n }\n if (loadScene) {\n bindSceneMeshes(stage, robot3d, robot, {\n ...(textureProvider ? { textureProvider } : {}),\n ...(curveTubes ? { curveTubes } : {}),\n ...(onWarn ? { onWarn } : {}),\n ...(mdl ? { mdl } : {}),\n ...(materialFactory ? { materialFactory } : {}),\n ...(shadows ? { shadows } : {}),\n });\n }\n this.warnUnsupportedGprims(stage);\n }\n if (this.options.loadLights ?? true) {\n // After mesh binding: lights anchor to the mirrored scenery groups and\n // shadow cameras fit the bound geometry (M25).\n const bound = bindLights(stage, robot3d, {\n ...(this.options.lightIntensityScale !== undefined\n ? { lightIntensityScale: this.options.lightIntensityScale }\n : {}),\n ...(shadows ? { shadows } : {}),\n ...(onWarn ? { onWarn } : {}),\n });\n robot3d.lights = bound.lights;\n robot3d.domeLights = bound.domes;\n }\n if (this.options.loadCameras ?? true) {\n robot3d.cameras = bindCameras(stage, robot3d, {\n ...(onWarn ? { onWarn } : {}),\n });\n }\n return robot3d;\n }\n\n /** Surface recognized-but-unrenderable gprim schemas instead of silence (M18). */\n private warnUnsupportedGprims(stage: Stage): void {\n const firstByType = new Map<string, string>();\n for (const prim of stage.Traverse()) {\n const type = prim.GetTypeName();\n if (isUnsupportedGprim(prim) && !firstByType.has(type)) {\n firstByType.set(type, prim.GetPath());\n }\n }\n for (const [type, path] of firstByType) {\n this.options.onWarn?.(`${type} gprims are not supported yet; skipping (e.g. ${path})`);\n }\n }\n\n private async composeStage(\n text: string,\n baseUrl: string,\n resolver: AssetResolver,\n ): Promise<Stage> {\n const composeOptions = this.options.onWarn ? { onWarn: this.options.onWarn } : {};\n return Stage.OpenFromFile(await composeLayer(text, baseUrl, resolver, composeOptions));\n }\n\n /** Compose a layer from raw bytes, sniffing binary crate vs USDA text. */\n private async composeStageFromBytes(\n bytes: Uint8Array,\n baseUrl: string,\n resolver: AssetResolver,\n ): Promise<Stage> {\n const composeOptions = this.options.onWarn ? { onWarn: this.options.onWarn } : {};\n const composed = CrateReader.isCrate(bytes)\n ? await composeFile(\n crateToUsdaFile(new CrateReader(bytes)),\n baseUrl,\n resolver,\n composeOptions,\n )\n : await composeLayer(new TextDecoder().decode(bytes), baseUrl, resolver, composeOptions);\n return Stage.OpenFromFile(composed);\n }\n\n private robotOptions(): ThreeUsdRobotOptions {\n return {\n ...(this.options.worldUp\n ? { worldUp: this.options.worldUp }\n : { upAxisConversion: this.options.upAxisConversion ?? \"auto\" }),\n ...(this.options.clampJointLimits !== undefined\n ? { clampJointLimits: this.options.clampJointLimits }\n : {}),\n ...(this.options.unitScale !== undefined ? { unitScale: this.options.unitScale } : {}),\n ...(this.options.applyDriveTargetsAsInitialPose !== undefined\n ? { applyInitialPose: this.options.applyDriveTargetsAsInitialPose }\n : {}),\n ...(this.options.debugBakedTransforms !== undefined\n ? { debugBakedTransforms: this.options.debugBakedTransforms }\n : {}),\n };\n }\n\n private extractOptions(): { robotName?: string; onWarn?: (message: string) => void } {\n return {\n ...(this.options.robotName !== undefined ? { robotName: this.options.robotName } : {}),\n ...(this.options.onWarn !== undefined ? { onWarn: this.options.onWarn } : {}),\n };\n }\n}\n"]}
@@ -0,0 +1,154 @@
1
+ import { identity4, multiply, invert, makeEuler, DEG2RAD, makeRotationZ, makeRotationY, makeRotationX, fromUsdMatrix, makeRotationFromQuat, makeScale, makeTranslation } from './chunk-IAOPNN6V.js';
2
+
3
+ // src/schemas/usdGeomCamera.ts
4
+ function isCamera(prim) {
5
+ return prim.GetTypeName() === "Camera";
6
+ }
7
+ function readCameraDescription(prim) {
8
+ if (!isCamera(prim)) return null;
9
+ const projection = attrString(prim, "projection");
10
+ const range = attrVec2(prim, "clippingRange") ?? [1, 1e6];
11
+ const desc = {
12
+ primPath: prim.GetPath(),
13
+ name: prim.GetName(),
14
+ projection: projection === "orthographic" ? "orthographic" : "perspective",
15
+ focalLength: attrNumber(prim, "focalLength") ?? 50,
16
+ horizontalAperture: attrNumber(prim, "horizontalAperture") ?? 20.955,
17
+ verticalAperture: attrNumber(prim, "verticalAperture") ?? 15.2908,
18
+ horizontalApertureOffset: attrNumber(prim, "horizontalApertureOffset") ?? 0,
19
+ verticalApertureOffset: attrNumber(prim, "verticalApertureOffset") ?? 0,
20
+ clippingRange: [range[0], range[1]],
21
+ fStop: attrNumber(prim, "fStop") ?? 0,
22
+ focusDistance: attrNumber(prim, "focusDistance") ?? 0,
23
+ exposure: attrNumber(prim, "exposure") ?? 0
24
+ };
25
+ const iso = attrNumber(prim, "exposure:iso");
26
+ if (iso !== void 0) desc.exposureIso = iso;
27
+ const time = attrNumber(prim, "exposure:time");
28
+ if (time !== void 0) desc.exposureTime = time;
29
+ const fStop = attrNumber(prim, "exposure:fStop");
30
+ if (fStop !== void 0) desc.exposureFStop = fStop;
31
+ const responsivity = attrNumber(prim, "exposure:responsivity");
32
+ if (responsivity !== void 0) desc.exposureResponsivity = responsivity;
33
+ return desc;
34
+ }
35
+ function computeCameraExposureScale(camera) {
36
+ const fStop = camera.exposureFStop ?? 1;
37
+ return (camera.exposureTime ?? 1) * ((camera.exposureIso ?? 100) / 100) * (camera.exposureResponsivity ?? 1) * 2 ** camera.exposure / (fStop * fStop);
38
+ }
39
+ function attrNumber(prim, name) {
40
+ const v = prim.GetAttribute(name).Get();
41
+ return typeof v === "number" ? v : void 0;
42
+ }
43
+ function attrString(prim, name) {
44
+ const v = prim.GetAttribute(name).Get();
45
+ return typeof v === "string" ? v : void 0;
46
+ }
47
+ function attrVec2(prim, name) {
48
+ const v = prim.GetAttribute(name).Get();
49
+ if (Array.isArray(v) && v.length === 2 && typeof v[0] === "number" && typeof v[1] === "number") {
50
+ return [v[0], v[1]];
51
+ }
52
+ return void 0;
53
+ }
54
+
55
+ // src/usd/xformOps.ts
56
+ var INVERT_PREFIX = "!invert!";
57
+ var RESET_STACK = "!resetXformStack!";
58
+ var ROTATE_ORDERS = /* @__PURE__ */ new Set([
59
+ "rotateXYZ",
60
+ "rotateXZY",
61
+ "rotateYXZ",
62
+ "rotateYZX",
63
+ "rotateZXY",
64
+ "rotateZYX"
65
+ ]);
66
+ function computeWorldTransform(prim) {
67
+ const chain = [];
68
+ for (let p = prim; p && !p.IsPseudoRoot(); p = p.GetParent()) chain.push(p);
69
+ let m = identity4();
70
+ for (let i = chain.length - 1; i >= 0; i--) {
71
+ m = multiply(m, computeLocalTransform(chain[i]).matrix);
72
+ }
73
+ return m;
74
+ }
75
+ function computeLocalTransform(prim) {
76
+ const orderAttr = prim.GetAttribute("xformOpOrder");
77
+ const order = orderAttr.Get();
78
+ if (!Array.isArray(order)) {
79
+ return { matrix: identity4(), resetsXformStack: false };
80
+ }
81
+ let matrix = identity4();
82
+ let resetsXformStack = false;
83
+ for (const entry of order) {
84
+ if (typeof entry !== "string") continue;
85
+ if (entry === RESET_STACK) {
86
+ resetsXformStack = true;
87
+ continue;
88
+ }
89
+ let opName = entry;
90
+ let doInvert = false;
91
+ if (opName.startsWith(INVERT_PREFIX)) {
92
+ doInvert = true;
93
+ opName = opName.slice(INVERT_PREFIX.length);
94
+ }
95
+ const attr = prim.GetAttribute(opName);
96
+ if (!attr.IsValid()) continue;
97
+ const opValue = attr.Get();
98
+ if (opValue === void 0) continue;
99
+ let opMatrix = opMatrixFor(parseOpType(opName), opValue, `${prim.GetPath()}.${opName}`);
100
+ if (doInvert) opMatrix = invert(opMatrix);
101
+ matrix = multiply(matrix, opMatrix);
102
+ }
103
+ return { matrix, resetsXformStack };
104
+ }
105
+ function parseOpType(opName) {
106
+ const body = opName.startsWith("xformOp:") ? opName.slice("xformOp:".length) : opName;
107
+ return body.split(":")[0] ?? body;
108
+ }
109
+ function opMatrixFor(opType, value, where) {
110
+ switch (opType) {
111
+ case "translate":
112
+ return makeTranslation(asVec3(value, where));
113
+ case "scale":
114
+ return makeScale(asVec3(value, where));
115
+ case "orient":
116
+ return makeRotationFromQuat(asQuat(value, where));
117
+ case "transform":
118
+ return fromUsdMatrix(asMatrix(value, where));
119
+ case "rotateX":
120
+ return makeRotationX(asNumber(value, where) * DEG2RAD);
121
+ case "rotateY":
122
+ return makeRotationY(asNumber(value, where) * DEG2RAD);
123
+ case "rotateZ":
124
+ return makeRotationZ(asNumber(value, where) * DEG2RAD);
125
+ default:
126
+ if (ROTATE_ORDERS.has(opType)) {
127
+ const [x, y, z] = asVec3(value, where);
128
+ return makeEuler([x * DEG2RAD, y * DEG2RAD, z * DEG2RAD], opType.slice("rotate".length));
129
+ }
130
+ throw new Error(`${where}: unsupported xformOp type "${opType}"`);
131
+ }
132
+ }
133
+ function asVec3(v, where) {
134
+ if (Array.isArray(v) && v.length === 3 && v.every((n) => typeof n === "number")) {
135
+ return v;
136
+ }
137
+ throw new Error(`${where}: expected a 3-component value`);
138
+ }
139
+ function asNumber(v, where) {
140
+ if (typeof v === "number") return v;
141
+ throw new Error(`${where}: expected a number`);
142
+ }
143
+ function asQuat(v, where) {
144
+ if (v && typeof v === "object" && "real" in v && "imaginary" in v) return v;
145
+ throw new Error(`${where}: expected a quaternion`);
146
+ }
147
+ function asMatrix(v, where) {
148
+ if (v && typeof v === "object" && "values" in v && "dim" in v) return v;
149
+ throw new Error(`${where}: expected a matrix`);
150
+ }
151
+
152
+ export { computeCameraExposureScale, computeLocalTransform, computeWorldTransform, isCamera, parseOpType, readCameraDescription };
153
+ //# sourceMappingURL=chunk-ZQXYVBQI.js.map
154
+ //# sourceMappingURL=chunk-ZQXYVBQI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/usdGeomCamera.ts","../src/usd/xformOps.ts"],"names":[],"mappings":"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","file":"chunk-ZQXYVBQI.js","sourcesContent":["/**\n * UsdGeomCamera schema helpers (M27) — type check, description extraction,\n * and the linear exposure-scale math.\n *\n * Focal length and apertures follow the practical convention of every DCC\n * (Isaac Sim, Blender, usdview): they are millimeters on a virtual film back,\n * regardless of stage units. Clipping range and focus distance are stage\n * units. Orthographic apertures are tenths of a stage unit (GfCamera's\n * `APERTURE_UNIT`), so `aperture / 10` is the view-box size.\n */\n\nimport type { Prim } from \"../usd/Prim.js\";\n\nexport function isCamera(prim: Prim): boolean {\n return prim.GetTypeName() === \"Camera\";\n}\n\n/** A UsdGeomCamera resolved to plain values (schema fallbacks applied). */\nexport type CameraDescription = {\n primPath: string;\n name: string;\n projection: \"perspective\" | \"orthographic\";\n /** Millimeters (see module doc). */\n focalLength: number;\n horizontalAperture: number;\n verticalAperture: number;\n /** Lens shift, millimeters. */\n horizontalApertureOffset: number;\n verticalApertureOffset: number;\n /** Near/far, stage units. */\n clippingRange: [number, number];\n /** `0` disables depth of field. */\n fStop: number;\n /** Stage units; `0` = unset. */\n focusDistance: number;\n /** Exposure compensation, stops (EV). */\n exposure: number;\n /** Exposure system (USD 24.11) — authored values only, see {@link computeCameraExposureScale}. */\n exposureIso?: number;\n exposureTime?: number;\n exposureFStop?: number;\n exposureResponsivity?: number;\n};\n\n/** Resolve a Camera prim into a {@link CameraDescription}, or `null` if not one. */\nexport function readCameraDescription(prim: Prim): CameraDescription | null {\n if (!isCamera(prim)) return null;\n\n const projection = attrString(prim, \"projection\");\n const range = attrVec2(prim, \"clippingRange\") ?? [1, 1000000];\n const desc: CameraDescription = {\n primPath: prim.GetPath(),\n name: prim.GetName(),\n projection: projection === \"orthographic\" ? \"orthographic\" : \"perspective\",\n focalLength: attrNumber(prim, \"focalLength\") ?? 50,\n horizontalAperture: attrNumber(prim, \"horizontalAperture\") ?? 20.955,\n verticalAperture: attrNumber(prim, \"verticalAperture\") ?? 15.2908,\n horizontalApertureOffset: attrNumber(prim, \"horizontalApertureOffset\") ?? 0,\n verticalApertureOffset: attrNumber(prim, \"verticalApertureOffset\") ?? 0,\n clippingRange: [range[0], range[1]],\n fStop: attrNumber(prim, \"fStop\") ?? 0,\n focusDistance: attrNumber(prim, \"focusDistance\") ?? 0,\n exposure: attrNumber(prim, \"exposure\") ?? 0,\n };\n const iso = attrNumber(prim, \"exposure:iso\");\n if (iso !== undefined) desc.exposureIso = iso;\n const time = attrNumber(prim, \"exposure:time\");\n if (time !== undefined) desc.exposureTime = time;\n const fStop = attrNumber(prim, \"exposure:fStop\");\n if (fStop !== undefined) desc.exposureFStop = fStop;\n const responsivity = attrNumber(prim, \"exposure:responsivity\");\n if (responsivity !== undefined) desc.exposureResponsivity = responsivity;\n return desc;\n}\n\n/**\n * `UsdGeomCamera::ComputeLinearExposureScale` (USD 24.11):\n * `time × iso/100 × responsivity ÷ fStop² × 2^exposure`. Schema fallbacks\n * make an unauthored camera scale by exactly `2^exposure` (i.e. `1`), so it\n * is safe to feed straight into `renderer.toneMappingExposure` — a stage\n * authored with real photographic values yields a physically small scale that\n * pairs with `lightIntensityScale: 1` raw photometric lighting.\n */\nexport function computeCameraExposureScale(camera: CameraDescription): number {\n const fStop = camera.exposureFStop ?? 1;\n return (\n ((camera.exposureTime ?? 1) *\n ((camera.exposureIso ?? 100) / 100) *\n (camera.exposureResponsivity ?? 1) *\n 2 ** camera.exposure) /\n (fStop * fStop)\n );\n}\n\nfunction attrNumber(prim: Prim, name: string): number | undefined {\n const v = prim.GetAttribute(name).Get();\n return typeof v === \"number\" ? v : undefined;\n}\n\nfunction attrString(prim: Prim, name: string): string | undefined {\n const v = prim.GetAttribute(name).Get();\n return typeof v === \"string\" ? v : undefined;\n}\n\nfunction attrVec2(prim: Prim, name: string): [number, number] | undefined {\n const v = prim.GetAttribute(name).Get();\n if (Array.isArray(v) && v.length === 2 && typeof v[0] === \"number\" && typeof v[1] === \"number\") {\n return [v[0], v[1]];\n }\n return undefined;\n}\n","/**\n * Resolves a prim's `xformOpOrder` into a single local transform matrix.\n *\n * Supports `translate`, `scale`, `orient` (quat), `transform` (matrix4d),\n * single-axis `rotateX|Y|Z`, and the six `rotate<ORDER>` Euler ops, plus the\n * `!invert!` op prefix and the `!resetXformStack!` sentinel. Rotation op values\n * are in degrees and converted to radians here.\n */\n\nimport {\n DEG2RAD,\n type Mat4,\n fromUsdMatrix,\n identity4,\n invert,\n makeEuler,\n makeRotationFromQuat,\n makeRotationX,\n makeRotationY,\n makeRotationZ,\n makeScale,\n makeTranslation,\n multiply,\n} from \"../kinematics/transforms.js\";\nimport type { Quat, UsdMatrix, UsdValue, Vec3 } from \"../parser/ast.js\";\nimport type { Prim } from \"./Prim.js\";\n\nconst INVERT_PREFIX = \"!invert!\";\nconst RESET_STACK = \"!resetXformStack!\";\nconst ROTATE_ORDERS = new Set([\n \"rotateXYZ\",\n \"rotateXZY\",\n \"rotateYXZ\",\n \"rotateYZX\",\n \"rotateZXY\",\n \"rotateZYX\",\n]);\n\nexport type ResolvedXform = {\n /** Local-to-parent transform (column-major {@link Mat4}). */\n matrix: Mat4;\n /**\n * True if `xformOpOrder` began with `!resetXformStack!`, meaning this prim\n * does not inherit its parent's transform. Honored by FK in M5.\n */\n resetsXformStack: boolean;\n};\n\n/**\n * Compute a prim's local transform from its `xformOpOrder`. Returns identity\n * when the prim authors no `xformOpOrder`.\n */\n/**\n * Accumulated transform from the stage root down to `prim` — the prim's world\n * placement as authored (`UsdGeomXformCache::GetLocalToWorldTransform`-like).\n */\nexport function computeWorldTransform(prim: Prim): Mat4 {\n const chain: Prim[] = [];\n for (let p: Prim | null = prim; p && !p.IsPseudoRoot(); p = p.GetParent()) chain.push(p);\n let m = identity4();\n for (let i = chain.length - 1; i >= 0; i--) {\n m = multiply(m, computeLocalTransform(chain[i]!).matrix);\n }\n return m;\n}\n\nexport function computeLocalTransform(prim: Prim): ResolvedXform {\n const orderAttr = prim.GetAttribute(\"xformOpOrder\");\n const order = orderAttr.Get();\n if (!Array.isArray(order)) {\n return { matrix: identity4(), resetsXformStack: false };\n }\n\n let matrix = identity4();\n let resetsXformStack = false;\n\n for (const entry of order) {\n if (typeof entry !== \"string\") continue;\n if (entry === RESET_STACK) {\n resetsXformStack = true;\n continue;\n }\n\n let opName = entry;\n let doInvert = false;\n if (opName.startsWith(INVERT_PREFIX)) {\n doInvert = true;\n opName = opName.slice(INVERT_PREFIX.length);\n }\n\n // A listed op with no authored attribute is malformed, but shipped assets\n // do contain it (an op removed while the order was left behind). USD treats\n // the op as identity rather than failing the whole stage, so do the same.\n const attr = prim.GetAttribute(opName);\n if (!attr.IsValid()) continue;\n\n // No resolvable value (e.g. time-sampled only — M10 reads defaults) → identity.\n const opValue = attr.Get();\n if (opValue === undefined) continue;\n\n let opMatrix = opMatrixFor(parseOpType(opName), opValue, `${prim.GetPath()}.${opName}`);\n if (doInvert) opMatrix = invert(opMatrix);\n // Post-multiply in list order: M = op0 · op1 · … so the LAST-listed op is\n // applied first to the geometry (innermost). For [translate, orient, scale]\n // this yields the usual scale-then-rotate-then-translate.\n matrix = multiply(matrix, opMatrix);\n }\n\n return { matrix, resetsXformStack };\n}\n\n/** Extract the op type token from an op attribute name (`xformOp:translate:pivot` → `translate`). */\nexport function parseOpType(opName: string): string {\n const body = opName.startsWith(\"xformOp:\") ? opName.slice(\"xformOp:\".length) : opName;\n return body.split(\":\")[0] ?? body;\n}\n\nfunction opMatrixFor(opType: string, value: UsdValue | undefined, where: string): Mat4 {\n switch (opType) {\n case \"translate\":\n return makeTranslation(asVec3(value, where));\n case \"scale\":\n return makeScale(asVec3(value, where));\n case \"orient\":\n return makeRotationFromQuat(asQuat(value, where));\n case \"transform\":\n return fromUsdMatrix(asMatrix(value, where));\n case \"rotateX\":\n return makeRotationX(asNumber(value, where) * DEG2RAD);\n case \"rotateY\":\n return makeRotationY(asNumber(value, where) * DEG2RAD);\n case \"rotateZ\":\n return makeRotationZ(asNumber(value, where) * DEG2RAD);\n default:\n if (ROTATE_ORDERS.has(opType)) {\n const [x, y, z] = asVec3(value, where);\n return makeEuler([x * DEG2RAD, y * DEG2RAD, z * DEG2RAD], opType.slice(\"rotate\".length));\n }\n throw new Error(`${where}: unsupported xformOp type \"${opType}\"`);\n }\n}\n\nfunction asVec3(v: UsdValue | undefined, where: string): Vec3 {\n if (Array.isArray(v) && v.length === 3 && v.every((n) => typeof n === \"number\")) {\n return v as Vec3;\n }\n throw new Error(`${where}: expected a 3-component value`);\n}\n\nfunction asNumber(v: UsdValue | undefined, where: string): number {\n if (typeof v === \"number\") return v;\n throw new Error(`${where}: expected a number`);\n}\n\nfunction asQuat(v: UsdValue | undefined, where: string): Quat {\n if (v && typeof v === \"object\" && \"real\" in v && \"imaginary\" in v) return v as Quat;\n throw new Error(`${where}: expected a quaternion`);\n}\n\nfunction asMatrix(v: UsdValue | undefined, where: string): UsdMatrix {\n if (v && typeof v === \"object\" && \"values\" in v && \"dim\" in v) return v as UsdMatrix;\n throw new Error(`${where}: expected a matrix`);\n}\n"]}
package/dist/core.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { U as UsdaFile, z as Vec3, y as Vec2, M as Mat4, j as LinkDescription, S as Stage, R as RobotDescription, P as Prim, x as UsdValue, g as JointType, A as Axis, s as SdfPath, L as LinkInertialDescription } from './buildKinematicTree-Q9JOjAjM.js';
2
- 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, J as JointDriveDescription, f as JointMimicDescription, h as KinematicNode, K as KinematicTree, i as Layer, k as ListOp, l as MetadataMap, m as PrimSpec, n as PropertySpec, Q as Quat, o as RAD2DEG, p as Relationship, q as RelationshipSpec, r as SampleChannel, t as Specifier, T as TreeEdge, u as UpAxis, v as UsdDictionary, w as UsdMatrix, V as Variability, 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';
3
- import { A as AssetResolver, b as MdlModuleProvider } from './parseMdl-vfzBGoMr.js';
4
- export { D as DefaultAssetResolver, M as MdlMaterialDecl, a as MdlModule, 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';
1
+ import { U as UsdaFile, a as Vec3, V as Vec2, M as Mat4, n as LinkDescription, S as Stage, R as RobotDescription, A as AssetResolver, P as Prim, G as UsdValue, k as JointType, b as Axis, w as SdfPath, c as LinkInertialDescription } from './usdLux-BqQlSOwG.js';
2
+ export { d as AssetPath, 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 JointDriveDescription, j as JointMimicDescription, l as KinematicNode, K as KinematicTree, m as Layer, L as LightDescription, o as ListOp, p as MetadataMap, q as PrimSpec, r as PropertySpec, Q as Quat, s as RAD2DEG, t as Relationship, u as RelationshipSpec, v as SampleChannel, x as Specifier, T as TreeEdge, y as UpAxis, z as UsdDictionary, E as UsdLightKind, F as UsdMatrix, H as Variability, 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';
5
3
  export { B as BinarySource, U as UsdSource, t as toBytes } from './bytes-CxGRGry_.js';
4
+ import { M as MdlModuleProvider } from './parseMdl-M862hSal.js';
5
+ export { a as MdlMaterialDecl, b as MdlModule, c as MdlTextureValue, d as MdlValue, i as isMdlTexture, p as parseMdl, e as parseMdlLiteral } from './parseMdl-M862hSal.js';
6
+ export { C as CameraDescription, c as computeCameraExposureScale, i as isCamera, r as readCameraDescription } from './usdGeomCamera-BEsGuz7m.js';
6
7
 
7
8
  /** Package identity. Kept in one place so every entry point can re-export it. */
8
9
  declare const PACKAGE_NAME = "three-usd-robot";
package/dist/core.js CHANGED
@@ -1,7 +1,9 @@
1
- export { PACKAGE_NAME, VERSION, exportRobotUsda, stageGeometryProvider, validateRobotDescription, writeUsdz } from './chunk-5ZPHZ5ZH.js';
2
- 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';
3
- 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
+ export { PACKAGE_NAME, VERSION, exportRobotUsda, stageGeometryProvider, validateRobotDescription, writeUsdz } from './chunk-IT5RWB7A.js';
2
+ 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';
3
+ export { channelFromSamples, decomposeJointRelative, interpolate, nearestAngleBranch } from './chunk-ALC7RBKC.js';
4
4
  export { DefaultAssetResolver, createMemoryResolver, isMdlTexture, joinPosix, parseMdl, parseMdlLiteral } from './chunk-PPPRB6KE.js';
5
+ export { computeCameraExposureScale, computeLocalTransform, computeWorldTransform, isCamera, parseOpType, readCameraDescription } from './chunk-ZQXYVBQI.js';
6
+ export { DEG2RAD, RAD2DEG, decomposeRigid, fromUsdMatrix, getTranslation, identity4, invert, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, toUsdMatrix } from './chunk-IAOPNN6V.js';
5
7
  export { AssetPath, Quat, UsdMatrix } from './chunk-JGIVJXBU.js';
6
8
  //# sourceMappingURL=core.js.map
7
9
  //# sourceMappingURL=core.js.map
package/dist/extras.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { T as ThreeUsdRobot } from './ThreeUsdRobot-X1zbpRZo.js';
1
+ import { T as ThreeUsdRobot } from './ThreeUsdRobot-CurQqRqu.js';
2
2
  import 'three';
3
- import './buildKinematicTree-Q9JOjAjM.js';
3
+ import './usdLux-BqQlSOwG.js';
4
4
 
5
5
  /**
6
6
  * `three-usd-robot/extras`
package/dist/helpers.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as THREE from 'three';
2
- import { T as ThreeUsdRobot, J as JointObject } from './ThreeUsdRobot-X1zbpRZo.js';
3
- import './buildKinematicTree-Q9JOjAjM.js';
2
+ import { T as ThreeUsdRobot, J as JointObject } from './ThreeUsdRobot-CurQqRqu.js';
3
+ import './usdLux-BqQlSOwG.js';
4
4
 
5
5
  /**
6
6
  * Per-link appearance helpers: highlight (tint), material replacement, and