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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/three/MeshBinding.ts","../src/three/TextureBinding.ts","../src/three/ThreeUsdRobotLoader.ts"],"names":["begin","THREE2"],"mappings":"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","file":"chunk-GRJGPHLW.js","sourcesContent":["/**\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};\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\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 return new THREE.Mesh(\n geometry,\n custom ??\n buildMeshMaterials(prim, stage, options.textureProvider, options.onWarn, options.mdl),\n );\n }\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 };\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 } = {},\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 };\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 if (kind === \"collision\") object.visible = false;\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 */\nexport function createTextureProvider(resolver: AssetResolver, baseUrl: string): TextureProvider {\n const images = new Map<string, Promise<TexImageSource>>();\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 url: string;\n try {\n url = resolver.resolve(assetPath, 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 { 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 * 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\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 if (loadVisuals || loadCollisions || loadScene) {\n const textureProvider =\n (this.options.loadTextures ?? true) ? createTextureProvider(resolver, baseUrl) : undefined;\n const curveTubes = this.options.curveTubes ?? false;\n const onWarn = this.options.onWarn;\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 });\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 });\n }\n this.warnUnsupportedGprims(stage);\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/three/axis.ts","../src/three/JointObject.ts","../src/three/LinkObject.ts","../src/three/ThreeUsdRobot.ts"],"names":["THREE","THREE2","THREE3"],"mappings":"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","file":"chunk-JN2QPDB3.js","sourcesContent":["import * as THREE from \"three\";\nimport type { Axis } from \"../robot/RobotDescription.js\";\n\n/** Unit vector for a USD joint axis token. Returns a fresh vector each call. */\nexport function axisVector(axis: Axis): THREE.Vector3 {\n switch (axis) {\n case \"X\":\n return new THREE.Vector3(1, 0, 0);\n case \"Y\":\n return new THREE.Vector3(0, 1, 0);\n case \"Z\":\n return new THREE.Vector3(0, 0, 1);\n }\n}\n","import * as THREE from \"three\";\nimport type {\n Axis,\n JointDescription,\n JointMimicDescription,\n JointType,\n} from \"../robot/RobotDescription.js\";\nimport { axisVector } from \"./axis.js\";\n\n/**\n * The articulated \"motion\" node of a joint, inserted between the joint's two\n * fixed frames (`jointFrame0` and `inverse(jointFrame1)`). {@link setValue}\n * rotates it about the axis (revolute/continuous) or slides it along the axis\n * (prismatic); fixed joints are inert.\n */\nexport class JointObject extends THREE.Object3D {\n readonly isJointObject = true;\n readonly jointName: string;\n /** Full USD prim path of the joint — the collision-proof address. */\n readonly primPath: string;\n readonly jointType: JointType;\n readonly axisToken: Axis;\n readonly axis: THREE.Vector3;\n readonly lower: number | undefined;\n readonly upper: number | undefined;\n /** Mimic constraint this joint follows, if any (see {@link JointMimicDescription}). */\n readonly mimic: JointMimicDescription | undefined;\n\n private _value = 0;\n\n constructor(joint: JointDescription) {\n super();\n this.name = joint.name;\n this.jointName = joint.name;\n this.primPath = joint.primPath;\n this.jointType = joint.type;\n this.axisToken = joint.axis;\n this.axis = axisVector(joint.axis);\n this.lower = joint.lower;\n this.upper = joint.upper;\n this.mimic = joint.mimic;\n }\n\n get value(): number {\n return this._value;\n }\n\n get articulated(): boolean {\n return this.jointType !== \"fixed\";\n }\n\n /**\n * Set the joint value (radians for revolute/continuous, length for prismatic).\n * Optionally clamps to authored limits. Returns the value actually applied.\n */\n setValue(value: number, clampToLimits = true): number {\n if (!this.articulated) return this._value; // fixed joint: inert\n\n let v = value;\n if (clampToLimits) {\n if (this.lower !== undefined && v < this.lower) v = this.lower;\n if (this.upper !== undefined && v > this.upper) v = this.upper;\n }\n this._value = v;\n\n if (this.jointType === \"prismatic\") {\n this.position.copy(this.axis).multiplyScalar(v);\n this.quaternion.identity();\n } else {\n this.quaternion.setFromAxisAngle(this.axis, v);\n this.position.set(0, 0, 0);\n }\n return v;\n }\n}\n","import * as THREE from \"three\";\nimport type { LinkDescription } from \"../robot/RobotDescription.js\";\n\n/**\n * Three.js node for a robot link. Its frame is the USD link prim's frame;\n * visual/collision meshes (M6) attach as children relative to it. Placement\n * relative to the parent is supplied by the joint chain, so a link's own local\n * matrix is identity (except the root, which carries the world-fixed placement).\n */\nexport class LinkObject extends THREE.Object3D {\n readonly isLinkObject = true;\n readonly linkName: string;\n readonly primPath: string;\n\n constructor(link: LinkDescription) {\n super();\n this.name = link.name;\n this.linkName = link.name;\n this.primPath = link.primPath;\n // Placement comes from the parent joint chain; keep the local matrix fixed.\n this.matrixAutoUpdate = false;\n }\n}\n","import * as THREE from \"three\";\nimport {\n type JointRelativeDecomposition,\n decomposeJointRelative,\n nearestAngleBranch,\n} from \"../kinematics/jointResiduals.js\";\nimport { interpolate } from \"../kinematics/sampling.js\";\nimport { type Mat4, identity4, invert, multiply, multiplyAll } from \"../kinematics/transforms.js\";\nimport type {\n JointDescription,\n LinkDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport type { KinematicTree } from \"../robot/buildKinematicTree.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { JointObject } from \"./JointObject.js\";\nimport { LinkObject } from \"./LinkObject.js\";\n\n/** Target world up-axis: normalize to Y-up / Z-up, or keep the authored orientation. */\nexport type WorldUpAxis = \"Y\" | \"Z\" | \"keep\";\n\nexport type ThreeUsdRobotOptions = {\n /** Clamp `setJointValue` to authored limits (default `true`). */\n clampJointLimits?: boolean;\n /** Size of the built-in joint-axis / link-frame helpers (stage units, default `0.15`). */\n helperSize?: number;\n /**\n * Target world up-axis. The root is rotated so the stage's authored `upAxis`\n * lands in that convention: `\"Y\"` for a standard three.js scene, `\"Z\"` for a\n * robotics-style Z-up world, `\"keep\"` for no correction. Takes precedence\n * over the deprecated {@link ThreeUsdRobotOptions.upAxisConversion}.\n */\n worldUp?: WorldUpAxis;\n /**\n * Legacy up-axis correction: `\"auto\"` ≡ `worldUp: \"Y\"`, `\"Y\"` / `\"none\"` ≡\n * `worldUp: \"keep\"`, and `\"Z\"` forces the Z-up→Y-up rotation regardless of\n * stage metadata. Default `\"none\"` (the loader defaults to `\"auto\"`).\n * @deprecated Use {@link ThreeUsdRobotOptions.worldUp}.\n */\n upAxisConversion?: \"auto\" | \"Y\" | \"Z\" | \"none\";\n /** Extra uniform scale multiplied with the stage `metersPerUnit` (default `1`). */\n unitScale?: number;\n /** Seed joints from their authored initial value (drive target / joint state). Default `true`. */\n applyInitialPose?: boolean;\n /**\n * Diagnose {@link ThreeUsdRobot.setLinkTransforms} poses against the joint\n * constraints and `console.warn` once per baked session when one deviates\n * beyond tolerance (default 1 mm anchor / 0.01 rad axis). `true` uses the\n * defaults; pass an object to tune them.\n */\n debugBakedTransforms?: boolean | { anchorTolerance?: number; axisTolerance?: number };\n};\n\n/**\n * A rigid world pose for {@link ThreeUsdRobot.setLinkTransforms} —\n * `quaternion` in Three.js `[x, y, z, w]` order (USD authors quatf as\n * `(w, x, y, z)`; reorder when reading recorded USD by hand).\n */\nexport type LinkPose = {\n position: [number, number, number];\n quaternion: [number, number, number, number];\n};\n\n/**\n * Coordinate space of {@link LinkPose} batches. `\"world\"` (default) is the\n * Three.js scene world *after* `worldUp` / unit normalization — with\n * `worldUp: \"Z\"` you hand in Z-up poses — including any transform on the\n * robot object itself (which must stay a similarity: uniform scale, no\n * shear). `\"stage\"` is the authored USD stage space (before up-axis rotation\n * and `metersPerUnit` scaling), as prim world transforms are written in the\n * file.\n */\nexport type LinkPoseSpace = \"world\" | \"stage\";\n\nexport type LinkPosesOptions = {\n /** Interpretation of the poses (default `\"world\"`). */\n space?: LinkPoseSpace;\n};\n\nexport type JointValuesFromLinkTransformsOptions = LinkPosesOptions & {\n /**\n * Previous joint values (keyed like the returned `values`): each\n * revolute/continuous joint picks the 2πk branch of its projection nearest\n * this, for frame-to-frame continuity past ±π.\n */\n previous?: Record<string, number>;\n /** Clamp `values` to authored limits (default `false` — deviations are reported, not hidden). */\n clampLimits?: boolean;\n};\n\n/**\n * Per-joint constraint residual of a link-pose batch, keyed by joint prim\n * path. The ideal parent→child transform of a joint is a pure motion along\n * its DOF; whatever the poses leave over splits into `anchorError` /\n * `axisError` (see {@link ThreeUsdRobot.validateLinkTransforms}).\n */\nexport type JointResidual = {\n /** Translation residual at the joint anchor, in meters (`metersPerUnit` applied). */\n anchorError: number;\n /** Rotation residual off the joint DOF, in radians. */\n axisError: number;\n /** Projected joint value (SI: radians / stage length units; `0` for fixed joints). */\n q: number;\n /** Whether `q` lies outside the authored limits. */\n limitExceeded: boolean;\n};\n\n/**\n * A Three.js `Object3D` that realizes a {@link RobotDescription} as a kinematic\n * hierarchy and drives forward kinematics via {@link setJointValue}.\n *\n * Per joint the hierarchy is\n * `parentLink → jointFrame0 → jointMotion → jointFrame1⁻¹ → childLink`,\n * where only `jointMotion` (a {@link JointObject}) changes with the joint value;\n * world poses then fall out of Three.js's `updateMatrixWorld`.\n *\n * **Naming contract** — a link/joint's key is its prim's leaf name when that\n * is unique across the robot, else its full prim path (deterministic; see the\n * extractor). Every accessor taking a name equally accepts the full prim path,\n * which is stable regardless of collisions; {@link getLinkObjectsByPath} /\n * {@link getJointObjectsByPath} enumerate the path-keyed tables.\n */\nexport class ThreeUsdRobot extends THREE.Object3D {\n readonly isThreeUsdRobot = true;\n readonly robot: RobotDescription;\n readonly tree: KinematicTree;\n readonly clampJointLimits: boolean;\n /**\n * The composed USD stage this robot was built from — the full prim tree, for\n * inspection tooling (structure panels, attribute browsers). Attached by\n * {@link ThreeUsdRobotLoader}; `undefined` for programmatically-built robots.\n */\n stage?: Stage;\n\n private readonly linkObjects = new Map<string, LinkObject>();\n private readonly jointObjects = new Map<string, JointObject>();\n private readonly linkKeyByPath = new Map<string, string>();\n private readonly jointKeyByPath = new Map<string, string>();\n /** Mimic edges among realized joints: leader key → followers. */\n private readonly mimicFollowers = new Map<\n string,\n { key: string; multiplier: number; offset: number }[]\n >();\n private readonly mimicLeaderByFollower = new Map<string, string>();\n private warnedMimicDrive = false;\n private dirty = true;\n\n /** Constructed (fk rest) local matrix of every link, for baked→fk restore. */\n private readonly restLocal = new Map<string, Mat4>();\n private _displayMode: \"fk\" | \"baked\" = \"fk\";\n /** Stage-space link worlds while baked (`null` in fk mode). */\n private bakedStageWorld: Map<string, Mat4> | null = null;\n /** Frozen `frame0 · motion · frame1⁻¹` per tree joint while baked. */\n private bakedChainRel: Map<string, Mat4> | null = null;\n private readonly debugBaked: { anchorTolerance: number; axisTolerance: number } | null;\n private bakedDebugWarned = false;\n private readonly warnedPoseKeys = new Set<string>();\n private warnedNonUniformScale = false;\n\n private readonly helperSize: number;\n private _showVisual = true;\n private _showCollision = false;\n private _showJointAxes = false;\n private _showLinkFrames = false;\n private jointAxesHelpers: THREE.AxesHelper[] = [];\n private linkFrameHelpers: THREE.AxesHelper[] = [];\n\n constructor(robot: RobotDescription, tree: KinematicTree, options: ThreeUsdRobotOptions = {}) {\n super();\n this.name = robot.name;\n this.robot = robot;\n this.tree = tree;\n this.clampJointLimits = options.clampJointLimits ?? true;\n this.helperSize = options.helperSize ?? 0.15;\n\n // Create a node for every link up front; index links and joints by path.\n for (const [key, link] of Object.entries(robot.links)) {\n this.linkObjects.set(key, new LinkObject(link));\n this.linkKeyByPath.set(link.primPath, key);\n }\n for (const [key, joint] of Object.entries(robot.joints)) {\n this.jointKeyByPath.set(joint.primPath, key);\n }\n\n this.attachRoot();\n this.attachTreeEdges();\n this.attachIsolatedLinks();\n this.registerMimicFollowers();\n this.applyStageNormalization(robot, options);\n if (options.applyInitialPose ?? true) this.applyInitialPose(robot);\n this.propagateAllMimic();\n\n for (const [key, obj] of this.linkObjects) this.restLocal.set(key, obj.matrix.toArray());\n const debug = options.debugBakedTransforms;\n this.debugBaked = debug\n ? {\n anchorTolerance: (typeof debug === \"object\" ? debug.anchorTolerance : undefined) ?? 1e-3,\n axisTolerance: (typeof debug === \"object\" ? debug.axisTolerance : undefined) ?? 0.01,\n }\n : null;\n }\n\n /** Orient (authored upAxis → target world up) and scale (metersPerUnit × unitScale) the root. */\n private applyStageNormalization(robot: RobotDescription, options: ThreeUsdRobotOptions): void {\n const scale = (robot.metersPerUnit || 1) * (options.unitScale ?? 1);\n if (scale !== 1) this.scale.setScalar(scale);\n\n const rotateX = (angle: number) =>\n this.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0), angle);\n\n if (options.worldUp) {\n if (options.worldUp === \"Y\" && robot.upAxis === \"Z\") rotateX(-Math.PI / 2);\n else if (options.worldUp === \"Z\" && robot.upAxis === \"Y\") rotateX(Math.PI / 2);\n return; // matching axis or \"keep\": leave as authored\n }\n const conv = options.upAxisConversion ?? \"none\";\n if (conv === \"Z\" || (conv === \"auto\" && robot.upAxis === \"Z\")) rotateX(-Math.PI / 2);\n }\n\n /** Apply each joint's authored initial value, if any. */\n private applyInitialPose(robot: RobotDescription): void {\n for (const [key, joint] of Object.entries(robot.joints)) {\n if (joint.initialValue === undefined) continue;\n this.jointObjects.get(key)?.setValue(joint.initialValue, this.clampJointLimits);\n }\n this.dirty = true;\n }\n\n // -- Mimic joints ---------------------------------------------------------\n\n /** Index the mimic edges realized in the tree (leader and follower both driven). */\n private registerMimicFollowers(): void {\n for (const [key, joint] of Object.entries(this.robot.joints)) {\n const mimic = joint.mimic;\n if (!mimic || !this.jointObjects.has(key)) continue;\n const leaderKey = this.jointKey(mimic.joint);\n // A leader outside the fk tree (loop joint) cannot drive; leave the\n // follower independently commandable.\n if (!this.jointObjects.has(leaderKey)) continue;\n this.mimicLeaderByFollower.set(key, leaderKey);\n const list = this.mimicFollowers.get(leaderKey) ?? [];\n list.push({ key, multiplier: mimic.multiplier, offset: mimic.offset });\n this.mimicFollowers.set(leaderKey, list);\n }\n }\n\n /** Drive the followers of `leaderKey` from its current value (recursive, cycle-safe). */\n private propagateMimic(leaderKey: string, visited?: Set<string>): void {\n const followers = this.mimicFollowers.get(leaderKey);\n if (!followers) return;\n const leaderValue = this.jointObjects.get(leaderKey)?.value;\n if (leaderValue === undefined) return;\n const seen = visited ?? new Set([leaderKey]);\n for (const { key, multiplier, offset } of followers) {\n if (seen.has(key)) continue; // cycle — reported by the validator\n seen.add(key);\n this.jointObjects\n .get(key)\n ?.setValue(multiplier * leaderValue + offset, this.clampJointLimits);\n this.propagateMimic(key, seen);\n }\n }\n\n /** Re-derive every follower from its chain's top-most leader. */\n private propagateAllMimic(): void {\n for (const leaderKey of this.mimicFollowers.keys()) {\n if (!this.mimicLeaderByFollower.has(leaderKey)) this.propagateMimic(leaderKey);\n }\n if (this.mimicFollowers.size > 0) this.dirty = true;\n }\n\n /** Whether the joint (key or prim path) is a mimic follower, driven by its leader. */\n isMimicFollower(name: string): boolean {\n return this.mimicLeaderByFollower.has(this.jointKey(name));\n }\n\n /** Keys of the mimic-follower joints (excluded from {@link getJointNames}). */\n getMimicJointNames(): string[] {\n return [...this.mimicLeaderByFollower.keys()];\n }\n\n private warnMimicDriveOnce(key: string): void {\n if (this.warnedMimicDrive) return;\n this.warnedMimicDrive = true;\n const leader = this.mimicLeaderByFollower.get(key);\n console.warn(\n `three-usd-robot: \"${key}\" is a mimic follower of \"${leader}\" — its value derives from the leader; direct sets are ignored (warned once)`,\n );\n }\n\n private attachRoot(): void {\n const rootObj = this.linkObjects.get(this.tree.root);\n if (!rootObj) return; // empty robot\n const rootJointKey = this.tree.rootJoint;\n const rootLink = this.robot.links[this.tree.root];\n if (rootJointKey) {\n const j = this.robot.joints[rootJointKey];\n // World-fixed placement: jointFrame0 (in world) · inverse(jointFrame1).\n if (j) setMatrix(rootObj, multiply(j.jointFrame0, invert(j.jointFrame1)));\n } else if (rootLink?.worldTransform) {\n // Floating base: keep the authored stage placement.\n setMatrix(rootObj, rootLink.worldTransform);\n }\n this.add(rootObj);\n }\n\n private attachTreeEdges(): void {\n for (const linkKey of this.tree.order) {\n const node = this.tree.nodes[linkKey];\n if (!node || node.parent === null || node.jointToParent === null) continue;\n\n const parentObj = this.linkObjects.get(node.parent);\n const childObj = this.linkObjects.get(linkKey);\n const joint = this.robot.joints[node.jointToParent];\n if (!parentObj || !childObj || !joint) continue;\n\n this.attachJointChain(parentObj, childObj, node.jointToParent, joint);\n }\n }\n\n /** Build `parent → frame0 → motion → frame1⁻¹ → child` for one joint. */\n private attachJointChain(\n parent: LinkObject,\n child: LinkObject,\n jointKey: string,\n joint: JointDescription,\n ): void {\n const frame0 = new THREE.Group();\n frame0.name = `${joint.name}:frame0`;\n setMatrix(frame0, joint.jointFrame0);\n\n const motion = new JointObject(joint);\n\n const frame1Inv = new THREE.Group();\n frame1Inv.name = `${joint.name}:frame1Inv`;\n setMatrix(frame1Inv, invert(joint.jointFrame1));\n\n parent.add(frame0);\n frame0.add(motion);\n motion.add(frame1Inv);\n frame1Inv.add(child);\n\n this.jointObjects.set(jointKey, motion);\n }\n\n private attachIsolatedLinks(): void {\n for (const key of this.tree.isolatedLinks) {\n const obj = this.linkObjects.get(key);\n if (!obj || obj.parent) continue;\n // Not placeable by any joint chain — keep the authored stage placement\n // (other machines / free bodies on a multi-articulation stage).\n const worldTransform = this.robot.links[key]?.worldTransform;\n if (worldTransform) setMatrix(obj, worldTransform);\n this.add(obj);\n }\n }\n\n // -- Naming --------------------------------------------------------------\n\n /** Resolve a link reference — key or full prim path — to the extractor key. */\n private linkKey(ref: string): string {\n if (this.linkObjects.has(ref)) return ref;\n return this.linkKeyByPath.get(ref) ?? ref;\n }\n\n /** Resolve a joint reference — key or full prim path — to the extractor key. */\n private jointKey(ref: string): string {\n if (this.jointObjects.has(ref)) return ref;\n return this.jointKeyByPath.get(ref) ?? ref;\n }\n\n // -- Joint control -------------------------------------------------------\n\n /**\n * Set one joint value, addressed by key or full prim path. Unknown joints\n * are ignored, and so are mimic followers (their value derives from the\n * leader; a warning is logged once). Driving a leader also updates its\n * followers. Returns whether it applied. Always restores `\"fk\"` display\n * mode first (see {@link setLinkTransforms}).\n */\n setJointValue(name: string, value: number): boolean {\n this.exitBakedMode();\n const key = this.jointKey(name);\n if (this.mimicLeaderByFollower.has(key)) {\n this.warnMimicDriveOnce(key);\n return false;\n }\n const joint = this.jointObjects.get(key);\n if (!joint) return false;\n joint.setValue(value, this.clampJointLimits);\n this.propagateMimic(key);\n this.dirty = true;\n return true;\n }\n\n /**\n * Set several joint values at once (matrix update is coalesced). Mimic\n * followers in the batch are skipped like in {@link setJointValue}. Always\n * restores `\"fk\"` display mode first, recomputing every link purely from\n * joint values — even an empty batch returns from baked playback (see\n * {@link setLinkTransforms}).\n */\n setJointValues(values: Record<string, number>): void {\n this.exitBakedMode();\n for (const [name, value] of Object.entries(values)) {\n const key = this.jointKey(name);\n if (this.mimicLeaderByFollower.has(key)) {\n this.warnMimicDriveOnce(key);\n continue;\n }\n const joint = this.jointObjects.get(key);\n if (joint) {\n joint.setValue(value, this.clampJointLimits);\n this.propagateMimic(key);\n this.dirty = true;\n }\n }\n }\n\n getJointValue(name: string): number | undefined {\n return this.jointObjects.get(this.jointKey(name))?.value;\n }\n\n /** Recompute world matrices. Called lazily by the getters; safe to call directly. */\n updateKinematics(): void {\n this.updateMatrixWorld(true);\n this.dirty = false;\n }\n\n private ensureUpdated(): void {\n if (this.dirty) this.updateKinematics();\n }\n\n // -- Baked link transforms (M23) -----------------------------------------\n\n /**\n * `\"fk\"` (default): link placements derive from joint values. `\"baked\"`:\n * {@link setLinkTransforms} wrote link poses directly and the joints no\n * longer constrain the display; any `setJointValue`-family call restores fk.\n */\n get displayMode(): \"fk\" | \"baked\" {\n return this._displayMode;\n }\n\n /**\n * Drive link world poses directly — the display path for baked recordings\n * (Isaac Sim body-transform time samples, maximal-coordinate playback).\n * usdview-like semantics: constraint deviations are shown, never corrected —\n * {@link validateLinkTransforms} measures them,\n * {@link jointValuesFromLinkTransforms} projects onto the joints instead.\n *\n * Enters `\"baked\"` display mode; joint values stay untouched. Return to fk\n * with {@link setJointValues} (any batch, even `{}`), which recomputes\n * every link purely from joint values.\n *\n * Keys are link keys or full prim paths; unknown keys warn once and are\n * skipped. Unspecified links KEEP their current world pose — a track that\n * omits a link means \"it did not move\". Poses are rigid, `quaternion` in\n * `[x, y, z, w]` order, interpreted per `opts.space` (default `\"world\"`:\n * the Three.js scene world after `worldUp` normalization — pair a Z-up\n * meter track with `worldUp: \"Z\"`). Matrix updates are coalesced into the\n * next render / world query. Returns the number of poses applied.\n */\n setLinkTransforms(poses: Record<string, LinkPose>, opts: LinkPosesOptions = {}): number {\n const targets = this.resolvePoseTargets(poses, opts.space ?? \"world\");\n if (this._displayMode !== \"baked\") this.enterBakedMode();\n const current = this.bakedStageWorld ?? new Map<string, Mat4>();\n const rels = this.bakedChainRel ?? new Map<string, Mat4>();\n\n // Rewrite every link's local matrix parents-first: written links land on\n // their target, held links keep their world pose while ancestors move.\n // The chain nodes in between stay frozen at their fk values; each link's\n // local absorbs the difference, so world matrices come out exact.\n const next = new Map<string, Mat4>();\n for (const key of this.tree.order) {\n const node = this.tree.nodes[key];\n const obj = this.linkObjects.get(key);\n if (!node || !obj) continue;\n const world = targets.get(key) ?? current.get(key);\n if (!world) continue;\n if (node.parent === null || node.jointToParent === null) {\n next.set(key, world); // the root's Object3D parent is the robot itself\n setMatrix(obj, world);\n continue;\n }\n const parentWorld = next.get(node.parent);\n const chainRel = rels.get(node.jointToParent);\n if (!parentWorld || !chainRel) continue;\n next.set(key, world);\n setMatrix(obj, multiply(invert(multiply(parentWorld, chainRel)), world));\n }\n for (const key of this.tree.isolatedLinks) {\n const obj = this.linkObjects.get(key);\n const world = targets.get(key) ?? current.get(key);\n if (!obj || !world) continue;\n next.set(key, world);\n setMatrix(obj, world);\n }\n\n this.bakedStageWorld = next;\n this.dirty = true;\n this.warnBakedDeviationOnce(next);\n return targets.size;\n }\n\n /**\n * Measure how far a link-pose batch deviates from the joint constraints,\n * without touching the display. Unspecified links resolve to their current\n * displayed pose, so the report predicts exactly what\n * {@link setLinkTransforms} with the same batch would show.\n *\n * Keyed by joint prim path; covers every joint — fixed joints (`q` = 0\n * check), loop joints dropped from the fk tree (closure error) and the\n * world-fixed root attachment (a moved base against a fixed-base model).\n * Typical signatures: a constant `anchorError` offset on every joint —\n * recording/model mismatch (wrong version or scale); growth over time —\n * maximal-coordinate solver drift; large uniform `axisError` — a\n * coordinate-convention bug (Y/Z-up or quaternion order).\n */\n validateLinkTransforms(\n poses: Record<string, LinkPose>,\n opts: LinkPosesOptions = {},\n ): Record<string, JointResidual> {\n const out: Record<string, JointResidual> = {};\n for (const { joint, rel } of this.decomposeJoints(poses, opts.space ?? \"world\")) {\n out[joint.primPath] = this.buildResidual(joint, rel.q, rel);\n }\n return out;\n }\n\n /**\n * Project a link-pose batch onto the joint manifold: the closed-form 1-DOF\n * joint values that best reproduce it, plus the same residuals as\n * {@link validateLinkTransforms}. `values` covers the commandable\n * articulated tree joints (mimic followers excluded — their leaders\n * re-derive them), keyed by joint prim path, and feeds\n * {@link setJointValues} directly — the constraint-respecting playback of\n * the same track:\n *\n * ```ts\n * robot.setJointValues(robot.jointValuesFromLinkTransforms(poses, { previous }).values);\n * ```\n *\n * Residual `q` / `limitExceeded` always report the unclamped projection,\n * also when `clampLimits` clamps `values`.\n */\n jointValuesFromLinkTransforms(\n poses: Record<string, LinkPose>,\n opts: JointValuesFromLinkTransformsOptions = {},\n ): { values: Record<string, number>; residuals: Record<string, JointResidual> } {\n const values: Record<string, number> = {};\n const residuals: Record<string, JointResidual> = {};\n for (const { key, joint, rel } of this.decomposeJoints(poses, opts.space ?? \"world\")) {\n let q = rel.q;\n if (joint.type === \"revolute\" || joint.type === \"continuous\") {\n const previous = opts.previous?.[joint.primPath] ?? opts.previous?.[key];\n if (previous !== undefined) q = nearestAngleBranch(q, previous);\n }\n residuals[joint.primPath] = this.buildResidual(joint, q, rel);\n if (!this.jointObjects.get(key)?.articulated) continue;\n // Followers are not commandable — the constraint re-derives them when\n // the returned values are fed to setJointValues.\n if (this.mimicLeaderByFollower.has(key)) continue;\n if (opts.clampLimits) {\n if (joint.lower !== undefined && q < joint.lower) q = joint.lower;\n if (joint.upper !== undefined && q > joint.upper) q = joint.upper;\n }\n values[joint.primPath] = q;\n }\n return { values, residuals };\n }\n\n /** Restore the constructed fk link placements (no-op when already `\"fk\"`). */\n private exitBakedMode(): void {\n if (this._displayMode === \"fk\") return;\n for (const [key, local] of this.restLocal) {\n const obj = this.linkObjects.get(key);\n if (obj) setMatrix(obj, local);\n }\n this.bakedStageWorld = null;\n this.bakedChainRel = null;\n this.bakedDebugWarned = false;\n this._displayMode = \"fk\";\n this.dirty = true;\n }\n\n /** Freeze the fk state a baked session builds on (joints cannot move while baked). */\n private enterBakedMode(): void {\n const rels = this.computeChainRels();\n this.bakedChainRel = rels;\n this.bakedStageWorld = this.computeStageWorlds(rels);\n this._displayMode = \"baked\";\n }\n\n /** `frame0 · motion(q) · frame1⁻¹` of every tree joint, from live joint values. */\n private computeChainRels(): Map<string, Mat4> {\n const rels = new Map<string, Mat4>();\n for (const [key, motion] of this.jointObjects) {\n const joint = this.robot.joints[key];\n if (!joint) continue;\n motion.updateMatrix();\n rels.set(\n key,\n multiplyAll([joint.jointFrame0, motion.matrix.toArray(), invert(joint.jointFrame1)]),\n );\n }\n return rels;\n }\n\n /** Stage-space world transform of every link under the current display state. */\n private computeStageWorlds(rels: Map<string, Mat4>): Map<string, Mat4> {\n const worlds = new Map<string, Mat4>();\n for (const key of this.tree.order) {\n const node = this.tree.nodes[key];\n const obj = this.linkObjects.get(key);\n if (!node || !obj) continue;\n const local = obj.matrix.toArray();\n if (node.parent === null || node.jointToParent === null) {\n worlds.set(key, local);\n continue;\n }\n const parentWorld = worlds.get(node.parent);\n const chainRel = rels.get(node.jointToParent);\n if (!parentWorld || !chainRel) continue;\n worlds.set(key, multiplyAll([parentWorld, chainRel, local]));\n }\n for (const key of this.tree.isolatedLinks) {\n const obj = this.linkObjects.get(key);\n if (obj) worlds.set(key, obj.matrix.toArray());\n }\n return worlds;\n }\n\n private currentStageWorlds(): Map<string, Mat4> {\n return this.bakedStageWorld ?? this.computeStageWorlds(this.computeChainRels());\n }\n\n /** Resolve pose keys to link keys and convert each pose to a rigid stage-space matrix. */\n private resolvePoseTargets(\n poses: Record<string, LinkPose>,\n space: LinkPoseSpace,\n ): Map<string, Mat4> {\n const targets = new Map<string, Mat4>();\n const entries = Object.entries(poses);\n if (entries.length === 0) return targets;\n\n const toStage = space === \"world\" ? this.sceneToStageConverter() : null;\n const position = new THREE.Vector3();\n const quaternion = new THREE.Quaternion();\n const matrix = new THREE.Matrix4();\n for (const [ref, pose] of entries) {\n const key = this.linkKey(ref);\n if (!this.linkObjects.has(key)) {\n this.warnUnknownPoseKey(ref);\n continue;\n }\n position.fromArray(pose.position);\n quaternion.fromArray(pose.quaternion).normalize();\n toStage?.(position, quaternion);\n targets.set(key, matrix.compose(position, quaternion, UNIT_SCALE).toArray());\n }\n return targets;\n }\n\n /**\n * Scene world → stage space, undoing the robot's own world transform\n * (up-axis rotation, unit scale, any user placement) as a similarity — so\n * link locals stay rigid and the root keeps carrying the scale.\n */\n private sceneToStageConverter(): (position: THREE.Vector3, quaternion: THREE.Quaternion) => void {\n this.updateWorldMatrix(true, false);\n const rootPosition = new THREE.Vector3();\n const rootQuaternion = new THREE.Quaternion();\n const rootScale = new THREE.Vector3();\n this.matrixWorld.decompose(rootPosition, rootQuaternion, rootScale);\n const s = rootScale.x;\n if (\n !this.warnedNonUniformScale &&\n (Math.abs(rootScale.y - s) > 1e-6 * Math.abs(s) ||\n Math.abs(rootScale.z - s) > 1e-6 * Math.abs(s))\n ) {\n this.warnedNonUniformScale = true;\n console.warn(\n `three-usd-robot: non-uniform world scale on \"${this.name}\"; space:\"world\" poses are off`,\n );\n }\n const invQuaternion = rootQuaternion.clone().invert();\n const invScale = s !== 0 ? 1 / s : 1;\n return (position, quaternion) => {\n position.sub(rootPosition).applyQuaternion(invQuaternion).multiplyScalar(invScale);\n quaternion.premultiply(invQuaternion);\n };\n }\n\n /**\n * Decompose every joint's parent→child transform under a pose batch\n * (unspecified links resolve to their current displayed pose, mirroring\n * {@link setLinkTransforms}). Pure — the display is untouched.\n */\n private decomposeJoints(\n poses: Record<string, LinkPose>,\n space: LinkPoseSpace,\n ): { key: string; joint: JointDescription; rel: JointRelativeDecomposition }[] {\n const worlds = new Map(this.currentStageWorlds());\n for (const [key, world] of this.resolvePoseTargets(poses, space)) worlds.set(key, world);\n\n const out: { key: string; joint: JointDescription; rel: JointRelativeDecomposition }[] = [];\n for (const [key, joint] of Object.entries(this.robot.joints)) {\n const childWorld = worlds.get(joint.child);\n const parentWorld = joint.parent === \"\" ? IDENTITY4 : worlds.get(joint.parent);\n if (!childWorld || !parentWorld) continue;\n out.push({ key, joint, rel: decomposeJointRelative(joint, parentWorld, childWorld) });\n }\n return out;\n }\n\n private buildResidual(\n joint: JointDescription,\n q: number,\n rel: JointRelativeDecomposition,\n ): JointResidual {\n return {\n anchorError: rel.anchorError * this.robot.metersPerUnit,\n axisError: rel.axisError,\n q,\n limitExceeded:\n (joint.lower !== undefined && q < joint.lower - LIMIT_EPS) ||\n (joint.upper !== undefined && q > joint.upper + LIMIT_EPS),\n };\n }\n\n private warnUnknownPoseKey(ref: string): void {\n if (this.warnedPoseKeys.has(ref)) return;\n this.warnedPoseKeys.add(ref);\n console.warn(`three-usd-robot: unknown link \"${ref}\" in a pose batch; ignoring`);\n }\n\n /** `debugBakedTransforms`: warn once per baked session when poses break the constraints. */\n private warnBakedDeviationOnce(worlds: Map<string, Mat4>): void {\n if (!this.debugBaked || this.bakedDebugWarned) return;\n const { anchorTolerance, axisTolerance } = this.debugBaked;\n let count = 0;\n let worst: { path: string; anchor: number; axis: number; score: number } | null = null;\n for (const joint of Object.values(this.robot.joints)) {\n const childWorld = worlds.get(joint.child);\n const parentWorld = joint.parent === \"\" ? IDENTITY4 : worlds.get(joint.parent);\n if (!childWorld || !parentWorld) continue;\n const rel = decomposeJointRelative(joint, parentWorld, childWorld);\n const anchor = rel.anchorError * this.robot.metersPerUnit;\n if (anchor <= anchorTolerance && rel.axisError <= axisTolerance) continue;\n count++;\n const score = anchor / anchorTolerance + rel.axisError / axisTolerance;\n if (!worst || score > worst.score) {\n worst = { path: joint.primPath, anchor, axis: rel.axisError, score };\n }\n }\n if (!worst) return;\n this.bakedDebugWarned = true;\n console.warn(\n `three-usd-robot: baked poses deviate from ${count} joint constraint(s) — worst ` +\n `${worst.path}: anchor ${(worst.anchor * 1e3).toFixed(3)} mm, axis ` +\n `${worst.axis.toFixed(4)} rad (recording/model mismatch? warned once per baked session)`,\n );\n }\n\n // -- Queries -------------------------------------------------------------\n\n /** World matrix of a link, addressed by key or full prim path. */\n getLinkWorldMatrix(name: string): THREE.Matrix4 {\n const obj = this.linkObjects.get(this.linkKey(name));\n if (!obj) throw new Error(`unknown link \"${name}\"`);\n this.ensureUpdated();\n return obj.matrixWorld.clone();\n }\n\n getLinkWorldPosition(name: string): THREE.Vector3 {\n return new THREE.Vector3().setFromMatrixPosition(this.getLinkWorldMatrix(name));\n }\n\n /** Link object by key or full prim path. */\n getLinkObject(name: string): LinkObject | undefined {\n return this.linkObjects.get(this.linkKey(name));\n }\n\n /** Joint object by key or full prim path. */\n getJointObject(name: string): JointObject | undefined {\n return this.jointObjects.get(this.jointKey(name));\n }\n\n /**\n * Table of link prim path → {@link LinkObject}. Prim paths are the\n * collision-proof way to pin a link (e.g. to attach tools or gizmos).\n */\n getLinkObjectsByPath(): Map<string, LinkObject> {\n const out = new Map<string, LinkObject>();\n for (const [path, key] of this.linkKeyByPath) {\n const obj = this.linkObjects.get(key);\n if (obj) out.set(path, obj);\n }\n return out;\n }\n\n /**\n * Table of joint prim path → {@link JointObject}, covering the joints\n * realized in the kinematic tree (loop joints have no motion node).\n */\n getJointObjectsByPath(): Map<string, JointObject> {\n const out = new Map<string, JointObject>();\n for (const [path, key] of this.jointKeyByPath) {\n const obj = this.jointObjects.get(key);\n if (obj) out.set(path, obj);\n }\n return out;\n }\n\n getJoints(): JointDescription[] {\n return Object.values(this.robot.joints);\n }\n\n getLinks(): LinkDescription[] {\n return Object.values(this.robot.links);\n }\n\n /**\n * Names of the commandable joints — articulated tree joints minus mimic\n * followers, whose values derive from their leader\n * (see {@link getMimicJointNames}).\n */\n getJointNames(): string[] {\n return [...this.jointObjects.keys()].filter((key) => !this.mimicLeaderByFollower.has(key));\n }\n\n getLinkNames(): string[] {\n return [...this.linkObjects.keys()];\n }\n\n getKinematicTree(): KinematicTree {\n return this.tree;\n }\n\n /** Authored stage up-axis (`\"Y\"` or `\"Z\"`) — unaffected by `worldUp` normalization. */\n get upAxis(): \"Y\" | \"Z\" {\n return this.robot.upAxis;\n }\n\n /** Authored stage scale in meters per unit (already applied to the root). */\n get metersPerUnit(): number {\n return this.robot.metersPerUnit;\n }\n\n // -- Animation playback --------------------------------------------------\n\n /** Playback rate in time codes per second (from the stage; default 24). */\n getTimeCodesPerSecond(): number {\n return this.robot.timeCodesPerSecond ?? 24;\n }\n\n /** Whether any joint has a time-sampled trajectory. */\n hasAnimation(): boolean {\n return Object.values(this.robot.joints).some((j) => j.valueSamples !== undefined);\n }\n\n /**\n * Animation range in time codes: the union of authored joint sample ranges,\n * falling back to the stage `startTimeCode`/`endTimeCode`. `null` if neither.\n */\n getTimeRange(): { start: number; end: number } | null {\n let start = Number.POSITIVE_INFINITY;\n let end = Number.NEGATIVE_INFINITY;\n for (const joint of Object.values(this.robot.joints)) {\n const times = joint.valueSamples?.times;\n if (!times || times.length === 0) continue;\n start = Math.min(start, times[0]!);\n end = Math.max(end, times[times.length - 1]!);\n }\n if (start <= end) return { start, end };\n\n const { startTimeCode, endTimeCode } = this.robot;\n if (startTimeCode !== undefined && endTimeCode !== undefined) {\n return { start: startTimeCode, end: endTimeCode };\n }\n return null;\n }\n\n /**\n * Sample every animated joint at time code `t` and apply the values (an fk\n * drive — leaves baked mode). Samples on mimic followers are ignored; the\n * constraint re-derives them from their leader.\n */\n setTime(t: number): void {\n this.exitBakedMode();\n for (const [key, joint] of Object.entries(this.robot.joints)) {\n if (!joint.valueSamples || this.mimicLeaderByFollower.has(key)) continue;\n this.setJointValue(key, interpolate(joint.valueSamples, t));\n }\n }\n\n // -- Display toggles -----------------------------------------------------\n\n get showVisual(): boolean {\n return this._showVisual;\n }\n set showVisual(v: boolean) {\n this._showVisual = v;\n this.setKindVisibility(\"visual\", v);\n }\n\n get showCollision(): boolean {\n return this._showCollision;\n }\n set showCollision(v: boolean) {\n this._showCollision = v;\n this.setKindVisibility(\"collision\", v);\n }\n\n get showJointAxes(): boolean {\n return this._showJointAxes;\n }\n set showJointAxes(v: boolean) {\n this._showJointAxes = v;\n if (v && this.jointAxesHelpers.length === 0) {\n for (const joint of this.jointObjects.values()) {\n const h = new THREE.AxesHelper(this.helperSize);\n h.name = `${joint.jointName}:axes`;\n joint.add(h);\n this.jointAxesHelpers.push(h);\n }\n }\n for (const h of this.jointAxesHelpers) h.visible = v;\n }\n\n get showLinkFrames(): boolean {\n return this._showLinkFrames;\n }\n set showLinkFrames(v: boolean) {\n this._showLinkFrames = v;\n if (v && this.linkFrameHelpers.length === 0) {\n for (const link of this.linkObjects.values()) {\n const h = new THREE.AxesHelper(this.helperSize);\n h.name = `${link.linkName}:frame`;\n link.add(h);\n this.linkFrameHelpers.push(h);\n }\n }\n for (const h of this.linkFrameHelpers) h.visible = v;\n }\n\n private setKindVisibility(kind: string, visible: boolean): void {\n this.traverse((o) => {\n if ((o.userData as { kind?: string }).kind === kind) o.visible = visible;\n });\n }\n}\n\nconst UNIT_SCALE = new THREE.Vector3(1, 1, 1);\nconst IDENTITY4: Mat4 = identity4();\n/** Slack for `limitExceeded` so poses exactly at a limit round-trip clean. */\nconst LIMIT_EPS = 1e-9;\n\n/** Assign a fixed local matrix to an object (disables Three.js auto-update). */\nfunction setMatrix(obj: THREE.Object3D, m: Mat4): void {\n obj.matrixAutoUpdate = false;\n obj.matrix.fromArray(m);\n obj.matrixWorldNeedsUpdate = true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/kinematics/transforms.ts","../src/kinematics/jointResiduals.ts","../src/kinematics/sampling.ts"],"names":[],"mappings":"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","file":"chunk-YGJ23CG3.js","sourcesContent":["/**\n * Minimal 4×4 matrix math, Three.js-independent.\n *\n * ## Convention\n *\n * A {@link Mat4} is a flat 16-element array in **column-major** order — the\n * exact layout of `THREE.Matrix4.elements`, so a `Mat4` can be handed to\n * `matrix4.fromArray(m)` with no transposition. Transforms use the\n * column-vector convention `v' = M · v`; the translation lives at indices\n * `[12, 13, 14]`.\n *\n * Conveniently, OpenUSD stores `GfMatrix4d` **row-major** with a row-vector\n * convention (`v' = v · M`). The two raw 16-number arrays for the *same*\n * transform are therefore bit-identical, which is why {@link fromUsdMatrix} is\n * a plain copy. See the module test for a worked example.\n */\n\nimport { Quat, UsdMatrix, type Vec3 } from \"../parser/ast.js\";\n\n/** Column-major 4×4 matrix (Three.js `elements` layout). */\nexport type Mat4 = number[];\n\nexport const DEG2RAD = Math.PI / 180;\nexport const RAD2DEG = 180 / Math.PI;\n\nexport function identity4(): Mat4 {\n // biome-ignore format: matrix layout\n return [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n ];\n}\n\n/** Matrix product `a · b` (column-major), matching `THREE.Matrix4.multiplyMatrices`. */\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const a11 = a[0]!,\n a21 = a[1]!,\n a31 = a[2]!,\n a41 = a[3]!;\n const a12 = a[4]!,\n a22 = a[5]!,\n a32 = a[6]!,\n a42 = a[7]!;\n const a13 = a[8]!,\n a23 = a[9]!,\n a33 = a[10]!,\n a43 = a[11]!;\n const a14 = a[12]!,\n a24 = a[13]!,\n a34 = a[14]!,\n a44 = a[15]!;\n\n const b11 = b[0]!,\n b21 = b[1]!,\n b31 = b[2]!,\n b41 = b[3]!;\n const b12 = b[4]!,\n b22 = b[5]!,\n b32 = b[6]!,\n b42 = b[7]!;\n const b13 = b[8]!,\n b23 = b[9]!,\n b33 = b[10]!,\n b43 = b[11]!;\n const b14 = b[12]!,\n b24 = b[13]!,\n b34 = b[14]!,\n b44 = b[15]!;\n\n return [\n a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41,\n a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41,\n a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41,\n a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41,\n\n a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42,\n a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42,\n a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42,\n a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42,\n\n a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43,\n a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43,\n a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43,\n a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43,\n\n a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44,\n a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44,\n a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44,\n a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44,\n ];\n}\n\n/** Product of a list of matrices, left-to-right (`m[0] · m[1] · …`). */\nexport function multiplyAll(matrices: Mat4[]): Mat4 {\n let m = identity4();\n for (const next of matrices) m = multiply(m, next);\n return m;\n}\n\n/** Inverse (column-major), matching `THREE.Matrix4.invert`. Throws if singular. */\nexport function invert(m: Mat4): Mat4 {\n const n11 = m[0]!,\n n21 = m[1]!,\n n31 = m[2]!,\n n41 = m[3]!;\n const n12 = m[4]!,\n n22 = m[5]!,\n n32 = m[6]!,\n n42 = m[7]!;\n const n13 = m[8]!,\n n23 = m[9]!,\n n33 = m[10]!,\n n43 = m[11]!;\n const n14 = m[12]!,\n n24 = m[13]!,\n n34 = m[14]!,\n n44 = m[15]!;\n\n const t11 =\n n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44;\n const t12 =\n n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44;\n const t13 =\n n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44;\n const t14 =\n n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n if (det === 0) throw new Error(\"cannot invert a singular matrix\");\n const idet = 1 / det;\n\n return [\n t11 * idet,\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n idet,\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n idet,\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n idet,\n\n t12 * idet,\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n idet,\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n idet,\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n idet,\n\n t13 * idet,\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n idet,\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n idet,\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n idet,\n\n t14 * idet,\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n idet,\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n idet,\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n idet,\n ];\n}\n\nexport function makeTranslation([x, y, z]: Vec3): Mat4 {\n // biome-ignore format: matrix layout\n return [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n x, y, z, 1,\n ];\n}\n\nexport function makeScale([x, y, z]: Vec3): Mat4 {\n // biome-ignore format: matrix layout\n return [\n x, 0, 0, 0,\n 0, y, 0, 0,\n 0, 0, z, 0,\n 0, 0, 0, 1,\n ];\n}\n\nexport function makeRotationX(rad: number): Mat4 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n // biome-ignore format: matrix layout\n return [\n 1, 0, 0, 0,\n 0, c, s, 0,\n 0, -s, c, 0,\n 0, 0, 0, 1,\n ];\n}\n\nexport function makeRotationY(rad: number): Mat4 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n // biome-ignore format: matrix layout\n return [\n c, 0, -s, 0,\n 0, 1, 0, 0,\n s, 0, c, 0,\n 0, 0, 0, 1,\n ];\n}\n\nexport function makeRotationZ(rad: number): Mat4 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n // biome-ignore format: matrix layout\n return [\n c, s, 0, 0,\n -s, c, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n ];\n}\n\n/** Rotation matrix from a (normalized) quaternion, matching `THREE.Matrix4.compose`. */\nexport function makeRotationFromQuat(q: Quat): Mat4 {\n let x = q.imaginary[0];\n let y = q.imaginary[1];\n let z = q.imaginary[2];\n let w = q.real;\n const len = Math.hypot(x, y, z, w);\n if (len > 0 && Math.abs(len - 1) > 1e-9) {\n x /= len;\n y /= len;\n z /= len;\n w /= len;\n }\n\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n // biome-ignore format: matrix layout\n return [\n 1 - (yy + zz), xy + wz, xz - wy, 0,\n xy - wz, 1 - (xx + zz), yz + wx, 0,\n xz + wy, yz - wx, 1 - (xx + yy), 0,\n 0, 0, 0, 1,\n ];\n}\n\n/**\n * Euler rotation matrix for the given axis order (e.g. `\"XYZ\"`), with per-axis\n * angles in **radians** indexed by axis (`angles[0]`=X, `[1]`=Y, `[2]`=Z).\n *\n * Follows OpenUSD's `rotate<ORDER>` semantics: the first listed axis is applied\n * first to the geometry, so `\"XYZ\"` yields `Rz · Ry · Rx` in column-vector form.\n */\nexport function makeEuler(angles: Vec3, order: string): Mat4 {\n const perAxis: Record<string, Mat4> = {\n X: makeRotationX(angles[0]),\n Y: makeRotationY(angles[1]),\n Z: makeRotationZ(angles[2]),\n };\n let m = identity4();\n for (let i = order.length - 1; i >= 0; i--) {\n const axis = perAxis[order[i]!];\n if (!axis)\n throw new Error(\n `invalid euler axis ${JSON.stringify(order[i])} in order ${JSON.stringify(order)}`,\n );\n m = multiply(m, axis);\n }\n return m;\n}\n\n/**\n * Copy a USD matrix into a {@link Mat4}. USD's row-major storage is identical to\n * Three.js column-major elements for the same transform (see module docs), so\n * this is a straight copy after a dimension check.\n */\nexport function fromUsdMatrix(m: UsdMatrix): Mat4 {\n if (m.dim !== 4 || m.values.length !== 16) {\n throw new Error(`expected a 4x4 matrix but got dim=${m.dim}, length=${m.values.length}`);\n }\n return [...m.values];\n}\n\n/** Extract the translation component `[x, y, z]` from a {@link Mat4}. */\nexport function getTranslation(m: Mat4): Vec3 {\n return [m[12]!, m[13]!, m[14]!];\n}\n\n/** Copy a {@link Mat4} into a USD `matrix4d` — same flat layout (see module docs). */\nexport function toUsdMatrix(m: Mat4): UsdMatrix {\n if (m.length !== 16) {\n throw new Error(`expected 16 matrix elements but got ${m.length}`);\n }\n return new UsdMatrix([...m], 4);\n}\n\n/**\n * Decompose a rigid transform into translation + orientation (M13 export).\n *\n * The rotation basis is orthonormalized (Gram-Schmidt, right-handed) before\n * quaternion extraction; `rigid` reports whether the input already was rigid\n * within tolerance, so callers can warn that scale/shear/reflection was\n * discarded.\n */\nexport function decomposeRigid(m: Mat4): { position: Vec3; orientation: Quat; rigid: boolean } {\n const position: Vec3 = [m[12]!, m[13]!, m[14]!];\n\n // Rotation-block basis columns.\n const b0: Vec3 = [m[0]!, m[1]!, m[2]!];\n const b1: Vec3 = [m[4]!, m[5]!, m[6]!];\n const b2: Vec3 = [m[8]!, m[9]!, m[10]!];\n\n const EPS = 1e-6;\n const rigid =\n Math.abs(norm(b0) - 1) < EPS &&\n Math.abs(norm(b1) - 1) < EPS &&\n Math.abs(norm(b2) - 1) < EPS &&\n Math.abs(dot(b0, b1)) < EPS &&\n Math.abs(dot(b1, b2)) < EPS &&\n Math.abs(dot(b0, b2)) < EPS &&\n dot(cross(b0, b1), b2) > 0; // right-handed (no reflection)\n\n const c0 = normalizeVec(b0);\n const c1 = normalizeVec(subVec(b1, scaleVec(c0, dot(c0, b1))));\n const c2 = cross(c0, c1);\n\n // Row-major rotation entries from the orthonormal columns.\n const r11 = c0[0],\n r12 = c1[0],\n r13 = c2[0];\n const r21 = c0[1],\n r22 = c1[1],\n r23 = c2[1];\n const r31 = c0[2],\n r32 = c1[2],\n r33 = c2[2];\n\n // Matrix → quaternion (Shepperd's method, as in THREE.Quaternion.setFromRotationMatrix).\n const trace = r11 + r22 + r33;\n let w: number;\n let x: number;\n let y: number;\n let z: number;\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1);\n w = 0.25 / s;\n x = (r32 - r23) * s;\n y = (r13 - r31) * s;\n z = (r21 - r12) * s;\n } else if (r11 > r22 && r11 > r33) {\n const s = 2 * Math.sqrt(1 + r11 - r22 - r33);\n w = (r32 - r23) / s;\n x = 0.25 * s;\n y = (r12 + r21) / s;\n z = (r13 + r31) / s;\n } else if (r22 > r33) {\n const s = 2 * Math.sqrt(1 + r22 - r11 - r33);\n w = (r13 - r31) / s;\n x = (r12 + r21) / s;\n y = 0.25 * s;\n z = (r23 + r32) / s;\n } else {\n const s = 2 * Math.sqrt(1 + r33 - r11 - r22);\n w = (r21 - r12) / s;\n x = (r13 + r31) / s;\n y = (r23 + r32) / s;\n z = 0.25 * s;\n }\n\n return { position, orientation: new Quat(w, [x, y, z]), rigid };\n}\n\n// --- small Vec3 helpers for decomposeRigid ---------------------------------\n\nfunction dot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction norm(v: Vec3): number {\n return Math.hypot(v[0], v[1], v[2]);\n}\n\nfunction subVec(a: Vec3, b: Vec3): Vec3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction scaleVec(v: Vec3, s: number): Vec3 {\n return [v[0] * s, v[1] * s, v[2] * s];\n}\n\nfunction normalizeVec(v: Vec3): Vec3 {\n const n = norm(v);\n return n > 0 ? scaleVec(v, 1 / n) : [1, 0, 0];\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n","/**\n * Closed-form decomposition of a joint's observed parent→child transform\n * against its ideal single-DOF model (baked-playback diagnostics, M23).\n *\n * A UsdPhysics joint constrains child body1 to parent body0 through its two\n * authored frames: `inv(Wp) · Wc = F0 · M(q) · inv(F1)`, where `M(q)` rotates\n * about the joint axis (revolute / continuous), slides along it (prismatic),\n * or is identity (fixed). Observed world transforms therefore yield\n *\n * D = inv(F0) · inv(Wp) · Wc · F1\n *\n * which equals `M(q)` exactly for a constraint-consistent pose. This module\n * extracts `q` from `D` and reports what remains as residuals: translation at\n * the joint anchor (`anchorError`, stage linear units) and rotation off the\n * DOF (`axisError`, radians — the swing of a swing–twist split for revolute\n * joints). Inputs must be rigid stage-space transforms, before any\n * `metersPerUnit` or up-axis normalization.\n */\n\nimport { type Mat4, decomposeRigid, invert, multiplyAll } from \"./transforms.js\";\n\n/** The slice of a joint description the decomposition needs (structurally satisfied by `JointDescription`). */\nexport type JointDofInput = {\n type: \"fixed\" | \"revolute\" | \"continuous\" | \"prismatic\";\n /** Axis token as authored (`physics:axis`). */\n axis: \"X\" | \"Y\" | \"Z\";\n /** Joint frame in the parent (body0) local space. */\n jointFrame0: Mat4;\n /** Joint frame in the child (body1) local space. */\n jointFrame1: Mat4;\n};\n\nexport type JointRelativeDecomposition = {\n /** Joint value along the DOF (radians / stage length units; `0` for fixed). */\n q: number;\n /** Translation residual at the joint anchor (stage linear units). */\n anchorError: number;\n /** Rotation residual off the DOF (radians). */\n axisError: number;\n};\n\nconst AXIS_INDEX = { X: 0, Y: 1, Z: 2 } as const;\n\n/** Decompose `inv(Wp)·Wc` against the joint's single-DOF model (see module docs). */\nexport function decomposeJointRelative(\n joint: JointDofInput,\n parentWorld: Mat4,\n childWorld: Mat4,\n): JointRelativeDecomposition {\n const d = multiplyAll([\n invert(joint.jointFrame0),\n invert(parentWorld),\n childWorld,\n joint.jointFrame1,\n ]);\n const t: [number, number, number] = [d[12]!, d[13]!, d[14]!];\n\n // Principal-branch (w ≥ 0) unit quaternion of D's rotation block.\n const { orientation } = decomposeRigid(d);\n const sign = orientation.real < 0 ? -1 : 1;\n const w = sign * orientation.real;\n const vx = sign * orientation.imaginary[0];\n const vy = sign * orientation.imaginary[1];\n const vz = sign * orientation.imaginary[2];\n const rotationAngle = 2 * Math.atan2(Math.hypot(vx, vy, vz), w);\n\n const i = AXIS_INDEX[joint.axis];\n if (joint.type === \"prismatic\") {\n const anchor = Math.hypot(i === 0 ? 0 : t[0], i === 1 ? 0 : t[1], i === 2 ? 0 : t[2]);\n return { q: t[i], anchorError: anchor, axisError: rotationAngle };\n }\n if (joint.type === \"fixed\") {\n return { q: 0, anchorError: Math.hypot(...t), axisError: rotationAngle };\n }\n\n // Revolute / continuous — swing–twist about the axis: the twist is the joint\n // value, the swing is the violation. With d normalized and w ≥ 0 the twist\n // is (w, proj·axis)/‖(w, proj)‖ and cos(swing/2) = ‖(w, proj)‖.\n const proj = i === 0 ? vx : i === 1 ? vy : vz;\n const twistNorm = Math.hypot(w, proj);\n const q = twistNorm > 1e-12 ? 2 * Math.atan2(proj, w) : 0;\n const swing = 2 * Math.atan2(Math.sqrt(Math.max(0, 1 - twistNorm * twistNorm)), twistNorm);\n return { q, anchorError: Math.hypot(...t), axisError: swing };\n}\n\n/**\n * Move `q` to the 2πk branch nearest `previous` — frame-to-frame continuity\n * past ±π for revolute/continuous joints (`opts.previous` of\n * `jointValuesFromLinkTransforms`).\n */\nexport function nearestAngleBranch(q: number, previous: number): number {\n const TWO_PI = 2 * Math.PI;\n return q + TWO_PI * Math.round((previous - q) / TWO_PI);\n}\n","/**\n * Time-sample interpolation for animated values (e.g. joint trajectories).\n *\n * USD time samples are keyed by time code. We linearly interpolate between the\n * two bracketing samples and hold the endpoints outside the authored range\n * (matching USD's held extrapolation).\n */\n\n/** A sorted time-sampled scalar channel. */\nexport type SampleChannel = {\n /** Sample times, ascending. */\n times: number[];\n /** Sample values, parallel to {@link times} (SI units). */\n values: number[];\n};\n\n/** Linearly sample `channel` at time `t` (held outside the range). */\nexport function interpolate(channel: SampleChannel, t: number): number {\n const { times, values } = channel;\n const n = times.length;\n if (n === 0) return 0;\n if (t <= times[0]!) return values[0]!;\n if (t >= times[n - 1]!) return values[n - 1]!;\n\n // Binary search for the first sample time > t.\n let lo = 0;\n let hi = n - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (times[mid]! <= t) lo = mid + 1;\n else hi = mid;\n }\n const i = lo - 1; // times[i] <= t < times[i+1]\n const t0 = times[i]!;\n const t1 = times[i + 1]!;\n const span = t1 - t0;\n const f = span > 0 ? (t - t0) / span : 0;\n return values[i]! + (values[i + 1]! - values[i]!) * f;\n}\n\n/** Build a sorted {@link SampleChannel} from `(time → value)` pairs via `map`. */\nexport function channelFromSamples(samples: Map<number, number>): SampleChannel {\n const times = [...samples.keys()].sort((a, b) => a - b);\n const values = times.map((t) => samples.get(t) ?? 0);\n return { times, values };\n}\n"]}