three-usd-robot 0.8.0 → 0.9.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.
- package/README.md +23 -3
- package/dist/{ThreeUsdRobot-CsjraHqP.d.ts → ThreeUsdRobot-BAh-48DD.d.ts} +26 -6
- package/dist/{ThreeUsdRobotLoader-CxOGRLXH.d.ts → ThreeUsdRobotLoader-DYtvelif.d.ts} +13 -3
- package/dist/{buildKinematicTree-D4R0hEtN.d.ts → buildKinematicTree-DQ4Vr4sJ.d.ts} +164 -1
- package/dist/{chunk-PHHMWMCA.js → chunk-2UD32EGU.js} +11 -2
- package/dist/chunk-2UD32EGU.js.map +1 -0
- package/dist/{chunk-P6CHTMGW.js → chunk-TE4MPP5Q.js} +3 -3
- package/dist/{chunk-P6CHTMGW.js.map → chunk-TE4MPP5Q.js.map} +1 -1
- package/dist/{chunk-3CANZKP3.js → chunk-WROYLUSS.js} +24 -5
- package/dist/chunk-WROYLUSS.js.map +1 -0
- package/dist/{chunk-YX5GIEMT.js → chunk-XEXFGL7R.js} +30 -9
- package/dist/chunk-XEXFGL7R.js.map +1 -0
- package/dist/core.d.ts +3 -160
- package/dist/core.js +2 -2
- package/dist/extras.d.ts +2 -2
- package/dist/helpers.d.ts +2 -2
- package/dist/helpers.js +1 -1
- package/dist/index.d.ts +13 -10
- package/dist/index.js +6 -6
- package/dist/react.d.ts +3 -3
- package/dist/react.js +3 -3
- package/package.json +3 -3
- package/dist/chunk-3CANZKP3.js.map +0 -1
- package/dist/chunk-PHHMWMCA.js.map +0 -1
- package/dist/chunk-YX5GIEMT.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildKinematicTree, ARTICULATION_ROOT_API, COLLISION_API, MESH_COLLISION_API, PHYSICS_MATERIAL_API, driveKindFor, jointValueFromSI, getMaterialSubsets, resolveBoundMaterial, computeLocalTransform, RIGID_BODY_API, MASS_API } from './chunk-
|
|
1
|
+
import { buildKinematicTree, ARTICULATION_ROOT_API, COLLISION_API, MESH_COLLISION_API, PHYSICS_MATERIAL_API, driveKindFor, jointValueFromSI, getMaterialSubsets, resolveBoundMaterial, computeLocalTransform, RIGID_BODY_API, MASS_API } from './chunk-2UD32EGU.js';
|
|
2
2
|
import { multiply, invert, identity4, Quat, AssetPath, toUsdMatrix, decomposeRigid } from './chunk-IYKPVUZ2.js';
|
|
3
3
|
import { strToU8, zipSync } from 'fflate';
|
|
4
4
|
|
|
@@ -932,5 +932,5 @@ function validateRobotDescription(desc, options = {}) {
|
|
|
932
932
|
}
|
|
933
933
|
|
|
934
934
|
export { PACKAGE_NAME, VERSION, exportRobotUsda, stageGeometryProvider, validateRobotDescription, writeUsdz };
|
|
935
|
-
//# sourceMappingURL=chunk-
|
|
936
|
-
//# sourceMappingURL=chunk-
|
|
935
|
+
//# sourceMappingURL=chunk-TE4MPP5Q.js.map
|
|
936
|
+
//# sourceMappingURL=chunk-TE4MPP5Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/export/exportRobot.ts","../src/export/GeometryProvider.ts","../src/export/writeUsdz.ts","../src/robot/RobotValidator.ts"],"names":["attr"],"mappings":"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","file":"chunk-P6CHTMGW.js","sourcesContent":["/** Package identity. Kept in one place so every entry point can re-export it. */\nexport const PACKAGE_NAME = \"three-usd-robot\";\n\n/** Library version. Replaced by the release tooling at publish time. */\nexport const VERSION = \"0.0.0\";\n","/**\n * Robot IR → USDA layer (M13).\n *\n * Builds a self-contained UsdPhysics robot layer from a {@link RobotDescription}:\n * one `Xform` prim per link placed at its **zero-pose** world transform\n * (folding joint frames root-down, `T_child = T_parent · frame0 · frame1⁻¹` —\n * see docs/export-design.md §4), one `Physics*Joint` prim per joint, and the\n * link meshes supplied by a {@link RobotGeometryProvider}. Initial joint values\n * author as `PhysicsJointStateAPI` opinions rather than being baked into link\n * transforms, so a re-import applies them exactly once. Values convert back\n * from SI to authored units (angular radians → degrees).\n */\n\nimport {\n type Mat4,\n decomposeRigid,\n identity4,\n invert,\n multiply,\n toUsdMatrix,\n} from \"../kinematics/transforms.js\";\nimport type {\n AttributeSpec,\n MetadataMap,\n PrimSpec,\n PropertySpec,\n RelationshipSpec,\n UsdValue,\n UsdaFile,\n} from \"../parser/ast.js\";\nimport { AssetPath, Quat } from \"../parser/ast.js\";\nimport type {\n JointDescription,\n JointType,\n LinkInertialDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { jointValueFromSI } from \"../robot/normalize.js\";\nimport {\n ARTICULATION_ROOT_API,\n COLLISION_API,\n MASS_API,\n MESH_COLLISION_API,\n PHYSICS_MATERIAL_API,\n RIGID_BODY_API,\n driveKindFor,\n} from \"../schemas/usdPhysics.js\";\nimport type {\n ExportMaterial,\n ExportMesh,\n ExportPhysicsMaterial,\n RobotGeometryProvider,\n TextureChannel,\n} from \"./GeometryProvider.js\";\n\n/** PhysX articulation tuning API (Isaac / Omniverse). */\nconst PHYSX_ARTICULATION_API = \"PhysxArticulationAPI\";\n\nexport type ExportRobotOptions = {\n /** Supplies each link's meshes; omit for a kinematics-only layer. */\n geometry?: RobotGeometryProvider;\n /** Root prim name; defaults to the (sanitized) robot name. */\n robotName?: string;\n /**\n * Author `physxArticulation:enabledSelfCollisions` on the articulation root\n * (M16). `false` is the common Isaac stabilizer for adjacent-link contact.\n */\n enabledSelfCollisions?: boolean;\n /**\n * Apply the Isaac Sim Robot Schema (M16): `IsaacRobotAPI` on the root with\n * ordered `isaac:physics:robotLinks` / `robotJoints` relationships,\n * `IsaacLinkAPI` per link, and `IsaacJointAPI` (+ DOF order) per joint.\n */\n isaacRobotSchema?: boolean;\n /** Receives non-fatal export diagnostics. */\n onWarn?: (message: string) => void;\n};\n\nconst JOINT_SCHEMA_BY_TYPE: Record<JointType, string> = {\n fixed: \"PhysicsFixedJoint\",\n revolute: \"PhysicsRevoluteJoint\",\n continuous: \"PhysicsRevoluteJoint\",\n prismatic: \"PhysicsPrismaticJoint\",\n};\n\n/** Serialize a robot IR into a single-layer USDA AST (pass to `serializeUsda`). */\nexport function exportRobotUsda(\n desc: RobotDescription,\n options: ExportRobotOptions = {},\n): UsdaFile {\n const warn = (m: string) => options.onWarn?.(m);\n const tree = buildKinematicTree(desc, { onWarn: warn });\n\n const robotName = sanitizeName(options.robotName ?? desc.name ?? \"robot\");\n\n // One flat sibling namespace under the root prim for links and joints.\n const alloc = nameAllocator(warn);\n const linkNames = new Map<string, string>();\n for (const key of Object.keys(desc.links)) linkNames.set(key, alloc(key, `link \"${key}\"`));\n const jointNames = new Map<string, string>();\n for (const key of Object.keys(desc.joints)) jointNames.set(key, alloc(key, `joint \"${key}\"`));\n const linkPath = (key: string) => `/${robotName}/${linkNames.get(key)}`;\n\n // Zero-pose world placement per link, folded root-down along the tree.\n // Links no joint chain reaches (floating root / isolated) keep their\n // authored stage placement when the IR carries one.\n const authoredWorld = (key: string) => desc.links[key]?.worldTransform ?? identity4();\n const worldByLink = new Map<string, Mat4>();\n for (const key of tree.order) {\n const node = tree.nodes[key]!;\n if (node.parent === null || node.jointToParent === null) {\n const rootJoint = tree.rootJoint ? desc.joints[tree.rootJoint] : undefined;\n worldByLink.set(\n key,\n rootJoint\n ? multiply(rootJoint.jointFrame0, invert(rootJoint.jointFrame1))\n : authoredWorld(key),\n );\n continue;\n }\n const joint = desc.joints[node.jointToParent]!;\n const parentWorld = worldByLink.get(node.parent) ?? identity4();\n worldByLink.set(\n key,\n multiply(multiply(parentWorld, joint.jointFrame0), invert(joint.jointFrame1)),\n );\n }\n for (const key of tree.isolatedLinks) worldByLink.set(key, authoredWorld(key));\n\n // Articulation root: preserve link-level APIs from the IR; otherwise apply it\n // on the container prim (never both — nested articulation roots are invalid).\n const articulationLinks = new Set(desc.articulationRoots ?? []);\n\n // Gather meshes once, then dedupe their (physics) materials by name.\n const meshesByLink = new Map<string, ExportMesh[]>();\n const materials = new Map<string, ExportMaterial>();\n const physicsMaterials = new Map<string, ExportPhysicsMaterial>();\n for (const [key, link] of Object.entries(desc.links)) {\n const meshes = options.geometry?.(key, link) ?? [];\n meshesByLink.set(key, meshes);\n for (const mesh of meshes) {\n if (mesh.material && !materials.has(mesh.material.name)) {\n materials.set(mesh.material.name, mesh.material);\n }\n if (mesh.physicsMaterial && !physicsMaterials.has(mesh.physicsMaterial.name)) {\n physicsMaterials.set(mesh.physicsMaterial.name, mesh.physicsMaterial);\n }\n }\n }\n const looksName = materials.size > 0 ? alloc(\"Looks\") : undefined;\n const materialAlloc = nameAllocator();\n const materialNames = new Map<string, string>();\n for (const name of materials.keys()) materialNames.set(name, materialAlloc(name));\n const materialPath = (name: string) =>\n looksName ? `/${robotName}/${looksName}/${materialNames.get(name)}` : undefined;\n\n const physicsScopeName = physicsMaterials.size > 0 ? alloc(\"PhysicsMaterials\") : undefined;\n const physicsMaterialAlloc = nameAllocator();\n const physicsMaterialNames = new Map<string, string>();\n for (const name of physicsMaterials.keys()) {\n physicsMaterialNames.set(name, physicsMaterialAlloc(name));\n }\n const physicsMaterialPath = (name: string) =>\n physicsScopeName\n ? `/${robotName}/${physicsScopeName}/${physicsMaterialNames.get(name)}`\n : undefined;\n\n const isaac = options.isaacRobotSchema === true;\n const children: PrimSpec[] = [];\n for (const [key, link] of Object.entries(desc.links)) {\n const apiSchemas = [RIGID_BODY_API];\n if (articulationLinks.has(key)) apiSchemas.push(ARTICULATION_ROOT_API);\n if (link.inertial) apiSchemas.push(MASS_API);\n if (isaac) apiSchemas.push(\"IsaacLinkAPI\");\n const selfCollision = articulationLinks.has(key) ? options.enabledSelfCollisions : undefined;\n if (selfCollision !== undefined) apiSchemas.push(PHYSX_ARTICULATION_API);\n children.push(\n buildLinkPrim({\n name: linkNames.get(key)!,\n world: worldByLink.get(key) ?? identity4(),\n apiSchemas,\n meshes: meshesByLink.get(key) ?? [],\n materialPath,\n physicsMaterialPath,\n warn,\n ...(link.inertial ? { inertial: link.inertial } : {}),\n ...(selfCollision !== undefined ? { selfCollision } : {}),\n }),\n );\n }\n const emittedJoints = new Set<string>();\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (!desc.links[joint.child] || (joint.parent !== \"\" && !desc.links[joint.parent])) {\n warn(`joint \"${key}\" references an unknown link; skipped`);\n continue;\n }\n emittedJoints.add(key);\n children.push(buildJointPrim(jointNames.get(key)!, key, joint, linkPath, isaac, warn));\n }\n if (looksName) {\n children.push(buildLooksPrim(looksName, materials, materialNames, materialPath));\n }\n if (physicsScopeName) {\n children.push(\n buildPhysicsMaterialsPrim(physicsScopeName, physicsMaterials, physicsMaterialNames),\n );\n }\n\n const rootApiSchemas: string[] = [];\n const rootProperties: PropertySpec[] = [];\n if (articulationLinks.size === 0) {\n rootApiSchemas.push(ARTICULATION_ROOT_API);\n if (options.enabledSelfCollisions !== undefined) {\n rootApiSchemas.push(PHYSX_ARTICULATION_API);\n rootProperties.push(\n attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", options.enabledSelfCollisions),\n );\n }\n }\n if (isaac) {\n rootApiSchemas.push(\"IsaacRobotAPI\");\n const orderedLinks = [...tree.order, ...tree.isolatedLinks];\n const orderedJoints: string[] = [];\n const pushJoint = (key: string | null | undefined) => {\n if (key && emittedJoints.has(key) && !orderedJoints.includes(key)) orderedJoints.push(key);\n };\n pushJoint(tree.rootJoint);\n for (const linkKey of tree.order) pushJoint(tree.nodes[linkKey]?.jointToParent);\n for (const jointKey of tree.loopJoints) pushJoint(jointKey);\n for (const jointKey of Object.keys(desc.joints)) pushJoint(jointKey);\n\n rootProperties.push(rel(\"isaac:physics:robotLinks\", orderedLinks.map(linkPath)));\n rootProperties.push(\n rel(\n \"isaac:physics:robotJoints\",\n orderedJoints.map((key) => `/${robotName}/${jointNames.get(key)}`),\n ),\n );\n }\n\n const root: PrimSpec = {\n specifier: \"def\",\n typeName: \"Xform\",\n name: robotName,\n metadata: rootApiSchemas.length > 0 ? { apiSchemas: rootApiSchemas } : {},\n properties: rootProperties,\n children,\n line: 0,\n };\n\n const metadata: MetadataMap = {\n defaultPrim: robotName,\n metersPerUnit: desc.metersPerUnit,\n upAxis: desc.upAxis,\n ...(desc.timeCodesPerSecond !== undefined\n ? { timeCodesPerSecond: desc.timeCodesPerSecond }\n : {}),\n ...(desc.startTimeCode !== undefined ? { startTimeCode: desc.startTimeCode } : {}),\n ...(desc.endTimeCode !== undefined ? { endTimeCode: desc.endTimeCode } : {}),\n };\n\n return { version: \"1.0\", metadata, prims: [root] };\n}\n\n// ---------------------------------------------------------------------------\n// Links & meshes\n// ---------------------------------------------------------------------------\n\ntype LinkPrimArgs = {\n name: string;\n world: Mat4;\n apiSchemas: string[];\n meshes: ExportMesh[];\n inertial?: LinkInertialDescription;\n /** `physxArticulation:enabledSelfCollisions` for link-level articulation roots. */\n selfCollision?: boolean;\n materialPath: (name: string) => string | undefined;\n physicsMaterialPath: (name: string) => string | undefined;\n warn: (message: string) => void;\n};\n\nfunction buildLinkPrim(args: LinkPrimArgs): PrimSpec {\n const meshAlloc = nameAllocator();\n const properties: PropertySpec[] = transformProps(args.world);\n if (args.inertial) properties.push(...massProps(args.inertial, args.name, args.warn));\n if (args.selfCollision !== undefined) {\n properties.push(attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", args.selfCollision));\n }\n return {\n specifier: \"def\",\n typeName: \"Xform\",\n name: args.name,\n metadata: { apiSchemas: args.apiSchemas },\n properties,\n children: args.meshes.map((mesh) =>\n buildMeshPrim(mesh, meshAlloc(mesh.name), args.materialPath, args.physicsMaterialPath),\n ),\n line: 0,\n };\n}\n\n/**\n * `UsdPhysicsMassAPI` attributes for a link's mass properties. UsdPhysics\n * requires `diagonalInertia` and `principalAxes` to be authored together, so a\n * missing principal-axes frame is completed with the identity quaternion\n * (equivalent — the diagonal is then in the body frame) and axes without a\n * diagonal are dropped (meaningless alone).\n */\nfunction massProps(\n inertial: LinkInertialDescription,\n linkName: string,\n warn: (message: string) => void,\n): PropertySpec[] {\n const out: PropertySpec[] = [];\n if (inertial.mass !== undefined) out.push(attr(\"physics:mass\", \"float\", inertial.mass));\n if (inertial.density !== undefined) out.push(attr(\"physics:density\", \"float\", inertial.density));\n if (inertial.centerOfMass) {\n out.push(attr(\"physics:centerOfMass\", \"point3f\", inertial.centerOfMass));\n }\n if (inertial.diagonalInertia) {\n out.push(attr(\"physics:diagonalInertia\", \"float3\", inertial.diagonalInertia));\n out.push(attr(\"physics:principalAxes\", \"quatf\", inertial.principalAxes ?? Quat.identity()));\n } else if (inertial.principalAxes) {\n warn(`link \"${linkName}\": principalAxes without diagonalInertia is meaningless; dropped`);\n }\n return out;\n}\n\nfunction buildMeshPrim(\n mesh: ExportMesh,\n name: string,\n materialPath: (name: string) => string | undefined,\n physicsMaterialPath: (name: string) => string | undefined,\n): PrimSpec {\n const properties: PropertySpec[] = [];\n if (mesh.transform) properties.push(...transformProps(mesh.transform));\n properties.push(\n arrayAttr(\"faceVertexCounts\", \"int\", mesh.faceVertexCounts),\n arrayAttr(\"faceVertexIndices\", \"int\", mesh.faceVertexIndices),\n arrayAttr(\"points\", \"point3f\", mesh.points),\n );\n if (mesh.normals) properties.push(arrayAttr(\"normals\", \"normal3f\", mesh.normals));\n if (mesh.st) {\n properties.push(arrayAttr(\"primvars:st\", \"texCoord2f\", mesh.st, { interpolation: \"vertex\" }));\n }\n if (mesh.displayColor) {\n properties.push(arrayAttr(\"primvars:displayColor\", \"color3f\", [mesh.displayColor]));\n }\n if (mesh.doubleSided) properties.push(attr(\"doubleSided\", \"bool\", true));\n properties.push(uniformToken(\"subdivisionScheme\", \"none\"));\n\n const apiSchemas: string[] = [];\n if (mesh.kind === \"collision\") {\n apiSchemas.push(COLLISION_API);\n // `guide` keeps collision shapes out of the render pass (usdview, Isaac Sim,\n // and this package's own loader) while PhysX still collides with them.\n properties.push(uniformToken(\"purpose\", \"guide\"));\n if (mesh.collisionApproximation) {\n apiSchemas.push(MESH_COLLISION_API);\n properties.push(uniformToken(\"physics:approximation\", mesh.collisionApproximation));\n }\n }\n const binding = mesh.material ? materialPath(mesh.material.name) : undefined;\n if (binding) properties.push(rel(\"material:binding\", [binding]));\n const physicsBinding =\n mesh.kind === \"collision\" && mesh.physicsMaterial\n ? physicsMaterialPath(mesh.physicsMaterial.name)\n : undefined;\n if (physicsBinding) properties.push(rel(\"material:binding:physics\", [physicsBinding]));\n if (binding || physicsBinding) apiSchemas.push(\"MaterialBindingAPI\");\n\n return {\n specifier: \"def\",\n typeName: \"Mesh\",\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Physics materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `PhysicsMaterialAPI` material per unique name. */\nfunction buildPhysicsMaterialsPrim(\n scopeName: string,\n materials: Map<string, ExportPhysicsMaterial>,\n names: Map<string, string>,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildPhysicsMaterialPrim(names.get(key)!, material));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: scopeName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\nfunction buildPhysicsMaterialPrim(name: string, material: ExportPhysicsMaterial): PrimSpec {\n const properties: PropertySpec[] = [];\n if (material.staticFriction !== undefined) {\n properties.push(attr(\"physics:staticFriction\", \"float\", material.staticFriction));\n }\n if (material.dynamicFriction !== undefined) {\n properties.push(attr(\"physics:dynamicFriction\", \"float\", material.dynamicFriction));\n }\n if (material.restitution !== undefined) {\n properties.push(attr(\"physics:restitution\", \"float\", material.restitution));\n }\n if (material.density !== undefined) {\n properties.push(attr(\"physics:density\", \"float\", material.density));\n }\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: { apiSchemas: [PHYSICS_MATERIAL_API] },\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `Material` + `UsdPreviewSurface` shader per material. */\nfunction buildLooksPrim(\n looksName: string,\n materials: Map<string, ExportMaterial>,\n materialNames: Map<string, string>,\n materialPath: (name: string) => string | undefined,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildMaterialPrim(materialNames.get(key)!, material, materialPath(key)!));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: looksName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\n/** How each texture channel wires into `UsdPreviewSurface`. */\nconst TEXTURE_WIRING: Record<\n TextureChannel,\n { input: string; inputType: string; output: string; outputType: string; colorSpace: string }\n> = {\n color: {\n input: \"inputs:diffuseColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n emissive: {\n input: \"inputs:emissiveColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n normal: {\n input: \"inputs:normal\",\n inputType: \"normal3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"raw\",\n },\n opacity: {\n input: \"inputs:opacity\",\n inputType: \"float\",\n output: \"outputs:a\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n roughness: {\n input: \"inputs:roughness\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n metalness: {\n input: \"inputs:metallic\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n occlusion: {\n input: \"inputs:occlusion\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n};\n\nfunction buildMaterialPrim(name: string, material: ExportMaterial, selfPath: string): PrimSpec {\n const textures = material.textures ?? {};\n const shaderProps: PropertySpec[] = [uniformToken(\"info:id\", \"UsdPreviewSurface\")];\n\n // A surface input: constant value, texture connection, or both (the\n // connection wins per UsdShade; the constant stays for flat consumers).\n const input = (channel: TextureChannel, value?: UsdValue) => {\n const wiring = TEXTURE_WIRING[channel];\n const texturePath = textures[channel];\n if (value === undefined && texturePath === undefined) return;\n const spec = attr(wiring.input, wiring.inputType, value);\n if (texturePath !== undefined) {\n spec.connections = [`${selfPath}/${channel}Texture.${wiring.output}`];\n }\n shaderProps.push(spec);\n };\n input(\"color\", material.diffuseColor);\n input(\"metalness\", material.metallic);\n input(\"roughness\", material.roughness);\n input(\"opacity\", material.opacity);\n input(\"emissive\", material.emissiveColor);\n input(\"normal\");\n input(\"occlusion\");\n shaderProps.push(attr(\"outputs:surface\", \"token\", undefined));\n\n const children: PrimSpec[] = [shaderPrim(\"PreviewSurface\", shaderProps)];\n const textureEntries = Object.entries(textures) as [TextureChannel, string][];\n if (textureEntries.length > 0) {\n children.push(\n shaderPrim(\"stReader\", [\n uniformToken(\"info:id\", \"UsdPrimvarReader_float2\"),\n attr(\"inputs:varname\", \"string\", \"st\"),\n attr(\"outputs:result\", \"float2\", undefined),\n ]),\n );\n for (const [channel, path] of textureEntries) {\n children.push(buildUvTexturePrim(channel, path, selfPath));\n }\n }\n\n const surfaceConnect = attr(\"outputs:surface\", \"token\", undefined);\n surfaceConnect.connections = [`${selfPath}/PreviewSurface.outputs:surface`];\n\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: {},\n properties: [surfaceConnect],\n children,\n line: 0,\n };\n}\n\n/** `UsdUVTexture` node for one channel, fed by the material's `stReader`. */\nfunction buildUvTexturePrim(channel: TextureChannel, path: string, selfPath: string): PrimSpec {\n const wiring = TEXTURE_WIRING[channel];\n const st = attr(\"inputs:st\", \"float2\", undefined);\n st.connections = [`${selfPath}/stReader.outputs:result`];\n return shaderPrim(`${channel}Texture`, [\n uniformToken(\"info:id\", \"UsdUVTexture\"),\n attr(\"inputs:file\", \"asset\", new AssetPath(path)),\n uniformToken(\"inputs:sourceColorSpace\", wiring.colorSpace),\n st,\n attr(wiring.output, wiring.outputType, undefined),\n ]);\n}\n\nfunction shaderPrim(name: string, properties: PropertySpec[]): PrimSpec {\n return {\n specifier: \"def\",\n typeName: \"Shader\",\n name,\n metadata: {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n/** `xformOp:transform` + `xformOpOrder` for an explicit matrix placement. */\nfunction transformProps(m: Mat4): PropertySpec[] {\n return [\n attr(\"xformOp:transform\", \"matrix4d\", toUsdMatrix(m)),\n arrayAttr(\"xformOpOrder\", \"token\", [\"xformOp:transform\"], undefined, \"uniform\"),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Joints\n// ---------------------------------------------------------------------------\n\nfunction buildJointPrim(\n name: string,\n key: string,\n joint: JointDescription,\n linkPath: (key: string) => string,\n isaac: boolean,\n warn: (m: string) => void,\n): PrimSpec {\n const kind = driveKindFor(joint.type);\n const angular = kind === \"angular\";\n const properties: PropertySpec[] = [];\n const apiSchemas: string[] = [];\n\n if (joint.parent !== \"\") properties.push(rel(\"physics:body0\", [linkPath(joint.parent)]));\n properties.push(rel(\"physics:body1\", [linkPath(joint.child)]));\n if (joint.type !== \"fixed\") properties.push(uniformToken(\"physics:axis\", joint.axis));\n if (joint.lower !== undefined) {\n properties.push(attr(\"physics:lowerLimit\", \"float\", jointValueFromSI(angular, joint.lower)));\n }\n if (joint.upper !== undefined) {\n properties.push(attr(\"physics:upperLimit\", \"float\", jointValueFromSI(angular, joint.upper)));\n }\n\n for (const index of [0, 1] as const) {\n const frame = index === 0 ? joint.jointFrame0 : joint.jointFrame1;\n const { position, orientation, rigid } = decomposeRigid(frame);\n if (!rigid) {\n warn(`joint \"${key}\": jointFrame${index} is not rigid; scale/shear was discarded`);\n }\n properties.push(attr(`physics:localPos${index}`, \"point3f\", position));\n properties.push(attr(`physics:localRot${index}`, \"quatf\", orientation));\n }\n\n // Joint state: the initial value and/or the sampled trajectory (SI → authored).\n if (joint.initialValue !== undefined || joint.valueSamples) {\n const state = attr(\n `state:${kind}:physics:position`,\n \"float\",\n joint.initialValue !== undefined ? jointValueFromSI(angular, joint.initialValue) : undefined,\n );\n if (joint.valueSamples) {\n state.timeSamples = new Map(\n joint.valueSamples.times.map((t, i) => [\n t,\n jointValueFromSI(angular, joint.valueSamples!.values[i] ?? 0),\n ]),\n );\n }\n properties.push(state);\n apiSchemas.push(`PhysicsJointStateAPI:${kind}`);\n }\n\n if (joint.drive) {\n const d = joint.drive;\n if (d.targetPosition !== undefined) {\n properties.push(\n attr(\n `drive:${kind}:physics:targetPosition`,\n \"float\",\n jointValueFromSI(angular, d.targetPosition),\n ),\n );\n }\n if (d.stiffness !== undefined) {\n properties.push(attr(`drive:${kind}:physics:stiffness`, \"float\", d.stiffness));\n }\n if (d.damping !== undefined) {\n properties.push(attr(`drive:${kind}:physics:damping`, \"float\", d.damping));\n }\n if (d.maxForce !== undefined) {\n properties.push(attr(`drive:${kind}:physics:maxForce`, \"float\", d.maxForce));\n }\n apiSchemas.push(`PhysicsDriveAPI:${kind}`);\n }\n\n if (isaac) {\n apiSchemas.push(\"IsaacJointAPI\");\n if (joint.type !== \"fixed\") {\n const prefix = joint.type === \"prismatic\" ? \"Trans\" : \"Rot\";\n properties.push(\n arrayAttr(\"isaac:physics:DofOffsetOpOrder\", \"token\", [`${prefix}${joint.axis}`]),\n );\n }\n }\n\n return {\n specifier: \"def\",\n typeName: JOINT_SCHEMA_BY_TYPE[joint.type],\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Naming & spec helpers\n// ---------------------------------------------------------------------------\n\n/** Make a valid USD identifier out of an arbitrary key (`/a/b c` → `_a_b_c`). */\nfunction sanitizeName(raw: string): string {\n const cleaned = raw.replace(/[^A-Za-z0-9_]/g, \"_\");\n const named = cleaned.length > 0 ? cleaned : \"_\";\n return /^[0-9]/.test(named) ? `_${named}` : named;\n}\n\n/** Allocates unique sanitized sibling names, warning when a name changes. */\nfunction nameAllocator(warn?: (m: string) => void): (raw: string, label?: string) => string {\n const used = new Set<string>();\n return (raw, label) => {\n let name = sanitizeName(raw);\n for (let i = 2; used.has(name); i++) name = `${sanitizeName(raw)}_${i}`;\n used.add(name);\n if (name !== raw && label && warn) warn(`${label} exported as prim \"${name}\"`);\n return name;\n };\n}\n\nfunction attr(\n name: string,\n typeName: string,\n value: UsdValue | undefined,\n metadata: MetadataMap = {},\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: false,\n variability: \"varying\",\n custom: false,\n ...(value !== undefined ? { value } : {}),\n metadata,\n line: 0,\n };\n}\n\nfunction arrayAttr(\n name: string,\n typeName: string,\n value: UsdValue[],\n metadata: MetadataMap = {},\n variability: \"varying\" | \"uniform\" = \"varying\",\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: true,\n variability,\n custom: false,\n value,\n metadata,\n line: 0,\n };\n}\n\nfunction uniformToken(name: string, value: string): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName: \"token\",\n isArray: false,\n variability: \"uniform\",\n custom: false,\n value,\n metadata: {},\n line: 0,\n };\n}\n\nfunction rel(name: string, targets: string[]): RelationshipSpec {\n return {\n kind: \"relationship\",\n name,\n custom: false,\n listOp: \"explicit\",\n targets,\n metadata: {},\n line: 0,\n };\n}\n","/**\n * Geometry access for the robot exporter (M13).\n *\n * `exportRobotUsda` is geometry-agnostic: a {@link RobotGeometryProvider}\n * supplies each link's meshes as plain data. {@link stageGeometryProvider}\n * reads them back off a loaded {@link Stage} for round-trip export; the\n * Three.js authoring side (M14) supplies one backed by `BufferGeometry`.\n */\n\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { LinkDescription } from \"../robot/RobotDescription.js\";\nimport { getMaterialSubsets } from \"../schemas/usdGeom.js\";\nimport { resolveBoundMaterial } from \"../three/MaterialBinding.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\n\n/** Texture channels a `UsdPreviewSurface` network can reference (M15). */\nexport type TextureChannel =\n | \"color\"\n | \"opacity\"\n | \"normal\"\n | \"roughness\"\n | \"metalness\"\n | \"occlusion\"\n | \"emissive\";\n\n/**\n * PBR parameters for a mesh, written as a `UsdPreviewSurface` material (M14).\n * `textures` holds per-channel image **asset paths** (M15) — emitted as a\n * `UsdUVTexture` + `UsdPrimvarReader_float2` network; sampler details\n * (wrap/scale/bias/transform) are not carried. Bundle the image bytes\n * themselves with `writeUsdz` under the same paths.\n */\nexport type ExportMaterial = {\n /** Material identity: meshes sharing a name share one Material prim. */\n name: string;\n diffuseColor?: Vec3;\n metallic?: number;\n roughness?: number;\n /** Sub-unit opacity renders as a translucent blend. */\n opacity?: number;\n emissiveColor?: Vec3;\n /** Per-channel texture asset paths. */\n textures?: Partial<Record<TextureChannel, string>>;\n};\n\n/** `UsdPhysicsMaterialAPI` parameters, bound via `material:binding:physics` (M16). */\nexport type ExportPhysicsMaterial = {\n /** Identity: meshes sharing a name share one physics-material prim. */\n name: string;\n staticFriction?: number;\n dynamicFriction?: number;\n restitution?: number;\n density?: number;\n};\n\n/** `physics:approximation` tokens of `UsdPhysicsMeshCollisionAPI`. */\nexport type CollisionApproximation =\n | \"none\"\n | \"convexHull\"\n | \"convexDecomposition\"\n | \"boundingSphere\"\n | \"boundingCube\"\n | \"meshSimplification\";\n\n/** One mesh of a link, as plain exportable data (stage units, link-relative). */\nexport type ExportMesh = {\n /** Prim-name hint; the exporter sanitizes and uniquifies it. */\n name: string;\n kind: \"visual\" | \"collision\";\n points: Vec3[];\n /** Authored polygon topology (not re-triangulated). */\n faceVertexCounts: number[];\n faceVertexIndices: number[];\n /** Per-vertex normals (only written when one per point). */\n normals?: Vec3[];\n /** `primvars:st` UVs, vertex interpolation (one per point). */\n st?: Vec2[];\n displayColor?: Vec3;\n doubleSided?: boolean;\n /** Transform relative to the link frame (column-major); identity when omitted. */\n transform?: Mat4;\n /** Bound material constants, if any. */\n material?: ExportMaterial;\n /** Collision approximation token (collision meshes only, M16). */\n collisionApproximation?: CollisionApproximation;\n /** Bound physics material (collision meshes only, M16). */\n physicsMaterial?: ExportPhysicsMaterial;\n};\n\n/** Supplies the meshes of a link for export. */\nexport type RobotGeometryProvider = (linkKey: string, link: LinkDescription) => ExportMesh[];\n\n/** Provider that reads each link's visual/collision Mesh prims from a stage. */\nexport function stageGeometryProvider(stage: Stage): RobotGeometryProvider {\n return (_linkKey, link) => {\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkPrim) return [];\n\n // Meshes that are both visual and collision export once, as visual.\n const visualSet = new Set(link.visualPrims);\n const out: ExportMesh[] = [];\n for (const path of link.visualPrims) {\n out.push(...readMeshes(stage, linkPrim, path, \"visual\"));\n }\n for (const path of link.collisionPrims ?? []) {\n if (visualSet.has(path)) continue;\n out.push(...readMeshes(stage, linkPrim, path, \"collision\"));\n }\n return out;\n };\n}\n\n/**\n * Read a Mesh prim as exportable data. A mesh painted by `materialBind` face\n * subsets becomes one {@link ExportMesh} per subset (points re-indexed to the\n * faces each one covers), so the export keeps its materials instead of\n * collapsing to a single colour.\n */\nfunction readMeshes(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n kind: \"visual\" | \"collision\",\n): ExportMesh[] {\n const prim = stage.GetPrimAtPath(meshPath);\n if (!prim) return [];\n\n const points = prim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return [];\n\n const countsValue = prim.GetAttribute(\"faceVertexCounts\").Get();\n const indicesValue = prim.GetAttribute(\"faceVertexIndices\").Get();\n const counts = isNumberArray(countsValue) ? countsValue : [];\n const indices = isNumberArray(indicesValue) ? indicesValue : [];\n const normalsValue = prim.GetAttribute(\"normals\").Get();\n const stValue = prim.GetAttribute(\"primvars:st\").Get();\n const displayColor = prim.GetAttribute(\"primvars:displayColor\").Get();\n const normals =\n isVec3Array(normalsValue) && normalsValue.length === points.length ? normalsValue : undefined;\n const st = isVec2Array(stValue) && stValue.length === points.length ? stValue : undefined;\n\n // Attributes shared by every piece of this mesh.\n const transform = relativeTransform(linkPrim, prim);\n const common = {\n kind,\n ...(isVec3Array(displayColor) && displayColor[0] ? { displayColor: displayColor[0] } : {}),\n ...(prim.GetAttribute(\"doubleSided\").Get() === true ? { doubleSided: true } : {}),\n ...(isIdentity(transform) ? {} : { transform }),\n } satisfies Partial<ExportMesh>;\n\n const withPhysics = (mesh: ExportMesh): ExportMesh => {\n if (kind !== \"collision\") return mesh;\n const approximation = prim.GetAttribute(\"physics:approximation\").Get();\n if (typeof approximation === \"string\" && APPROXIMATIONS.has(approximation)) {\n mesh.collisionApproximation = approximation as CollisionApproximation;\n }\n const physicsMaterial = readBoundPhysicsMaterial(stage, prim);\n if (physicsMaterial) mesh.physicsMaterial = physicsMaterial;\n return mesh;\n };\n\n const subsets = getMaterialSubsets(prim);\n if (subsets.length === 0) {\n const material = readBoundMaterial(stage, prim);\n return [\n withPhysics({\n ...common,\n name: prim.GetName(),\n points: points.slice(),\n faceVertexCounts: counts.slice(),\n faceVertexIndices: indices.slice(),\n ...(normals ? { normals: normals.slice() } : {}),\n ...(st ? { st: st.slice() } : {}),\n ...(material ? { material } : {}),\n }),\n ];\n }\n\n const faceStart: number[] = [];\n let offset = 0;\n for (const count of counts) {\n faceStart.push(offset);\n offset += count;\n }\n\n /** Re-index the given faces onto their own point list. */\n const piece = (faces: number[], name: string, material?: ExportMaterial): ExportMesh | null => {\n const remap = new Map<number, number>();\n const outPoints: Vec3[] = [];\n const outNormals: Vec3[] = [];\n const outSt: Vec2[] = [];\n const outCounts: number[] = [];\n const outIndices: number[] = [];\n\n for (const face of faces) {\n const start = faceStart[face];\n const count = counts[face];\n if (start === undefined || count === undefined) continue;\n outCounts.push(count);\n for (let k = 0; k < count; k++) {\n const vertex = indices[start + k];\n if (vertex === undefined || !points[vertex]) continue;\n let mapped = remap.get(vertex);\n if (mapped === undefined) {\n mapped = outPoints.length;\n remap.set(vertex, mapped);\n outPoints.push(points[vertex]!);\n if (normals) outNormals.push(normals[vertex]!);\n if (st) outSt.push(st[vertex]!);\n }\n outIndices.push(mapped);\n }\n }\n if (outPoints.length === 0) return null;\n\n return withPhysics({\n ...common,\n name,\n points: outPoints,\n faceVertexCounts: outCounts,\n faceVertexIndices: outIndices,\n ...(normals ? { normals: outNormals } : {}),\n ...(st ? { st: outSt } : {}),\n ...(material ? { material } : {}),\n });\n };\n\n const out: ExportMesh[] = [];\n const claimed = new Set<number>();\n subsets.forEach((subset, index) => {\n const faces = subset.faces.filter((f) => f >= 0 && f < counts.length && !claimed.has(f));\n for (const f of faces) claimed.add(f);\n const material = readBoundMaterial(stage, subset.prim);\n const mesh = piece(faces, `${prim.GetName()}_${material?.name ?? index}`, material);\n if (mesh) out.push(mesh);\n });\n\n const leftover = counts.map((_, f) => f).filter((f) => !claimed.has(f));\n if (leftover.length > 0) {\n const material = readBoundMaterial(stage, prim);\n const mesh = piece(leftover, prim.GetName(), material);\n if (mesh) out.push(mesh);\n }\n return out;\n}\n\nconst APPROXIMATIONS: ReadonlySet<string> = new Set([\n \"none\",\n \"convexHull\",\n \"convexDecomposition\",\n \"boundingSphere\",\n \"boundingCube\",\n \"meshSimplification\",\n]);\n\n/** `UsdPhysicsMaterialAPI` parameters bound via `material:binding:physics`. */\nfunction readBoundPhysicsMaterial(stage: Stage, prim: Prim): ExportPhysicsMaterial | undefined {\n const target = firstBindingTarget(prim, \"material:binding:physics\");\n if (!target) return undefined;\n const materialPrim = stage.GetPrimAtPath(target);\n if (!materialPrim) return undefined;\n\n const out: ExportPhysicsMaterial = {\n name: target.split(\"/\").filter(Boolean).pop() ?? \"PhysicsMaterial\",\n };\n const read = (attr: string): number | undefined => {\n const v = materialPrim.GetAttribute(attr).Get();\n return typeof v === \"number\" ? v : undefined;\n };\n const staticFriction = read(\"physics:staticFriction\");\n if (staticFriction !== undefined) out.staticFriction = staticFriction;\n const dynamicFriction = read(\"physics:dynamicFriction\");\n if (dynamicFriction !== undefined) out.dynamicFriction = dynamicFriction;\n const restitution = read(\"physics:restitution\");\n if (restitution !== undefined) out.restitution = restitution;\n const density = read(\"physics:density\");\n if (density !== undefined) out.density = density;\n return Object.keys(out).length > 1 ? out : undefined;\n}\n\n/** First target of `relName` on the prim or an ancestor. */\nfunction firstBindingTarget(prim: Prim, relName: string): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(relName).GetTargets();\n if (targets.length > 0) return targets[0];\n p = p.GetParent();\n }\n return undefined;\n}\n\n/** PBR constants + texture asset paths of the bound material. */\nfunction readBoundMaterial(stage: Stage, prim: Prim): ExportMaterial | undefined {\n const bound = resolveBoundMaterial(stage, prim);\n if (!bound) return undefined;\n const material: ExportMaterial = { name: boundMaterialName(prim) ?? \"Material\" };\n if (bound.color) material.diffuseColor = bound.color;\n if (bound.metalness !== undefined) material.metallic = bound.metalness;\n if (bound.roughness !== undefined) material.roughness = bound.roughness;\n if (bound.opacity !== undefined) material.opacity = bound.opacity;\n if (bound.emissiveColor) material.emissiveColor = bound.emissiveColor;\n\n const textures: Partial<Record<TextureChannel, string>> = {};\n if (bound.colorTexture) textures.color = bound.colorTexture.path;\n if (bound.opacityTexture) textures.opacity = bound.opacityTexture.path;\n if (bound.normalTexture) textures.normal = bound.normalTexture.path;\n if (bound.roughnessTexture) textures.roughness = bound.roughnessTexture.path;\n if (bound.metalnessTexture) textures.metalness = bound.metalnessTexture.path;\n if (bound.occlusionTexture) textures.occlusion = bound.occlusionTexture.path;\n if (bound.emissiveTexture) textures.emissive = bound.emissiveTexture.path;\n if (Object.keys(textures).length > 0) material.textures = textures;\n\n return Object.keys(material).length > 1 ? material : undefined;\n}\n\n/** Leaf name of the first `material:binding` target on the prim or an ancestor. */\nfunction boundMaterialName(prim: Prim): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(\"material:binding\").GetTargets();\n if (targets.length > 0) return targets[0]!.split(\"/\").filter(Boolean).pop();\n p = p.GetParent();\n }\n return undefined;\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();\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\nfunction isIdentity(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n\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 * USDZ package writer (M15) — the write-direction counterpart of `openUsdz`.\n *\n * A `.usdz` is a **stored** (uncompressed) zip whose entries' file data must\n * start on 64-byte boundaries; alignment is achieved with padding placed in a\n * local-header extra field (the fflate-sanctioned trick, as used by Three.js's\n * USDZExporter). The first entry is the package's root USD layer — `openUsdz`\n * and other USDZ readers open that one.\n */\n\nimport { type Zippable, strToU8, zipSync } from \"fflate\";\n\nconst USD_ENTRY = /\\.(usda|usdc|usd)$/i;\n/** Private extra-field id used purely as alignment padding. */\nconst PAD_EXTRA_ID = 12345;\n/** Bytes of a zip local file header before the name/extra fields. */\nconst LOCAL_HEADER_SIZE = 30;\n/** An extra field costs 4 header bytes (id + size) plus its data. */\nconst EXTRA_HEADER_SIZE = 4;\n\n/**\n * Pack entries into USDZ bytes. `entries` maps archive paths to file contents\n * (strings are UTF-8 encoded — pass the `serializeUsda` output directly). One\n * entry must be a USD layer (`.usda`/`.usdc`/`.usd`); the first such entry\n * becomes the package root and is moved to the front of the archive.\n */\nexport function writeUsdz(entries: Record<string, Uint8Array | string>): Uint8Array {\n const names = Object.keys(entries);\n const root = names.find((n) => USD_ENTRY.test(n));\n if (!root) {\n throw new Error(\"writeUsdz: entries must include a root USD layer (.usda/.usdc/.usd)\");\n }\n const ordered = [root, ...names.filter((n) => n !== root)];\n\n const files: Zippable = {};\n let offset = 0;\n for (const name of ordered) {\n const raw = entries[name]!;\n const data = typeof raw === \"string\" ? strToU8(raw) : raw;\n const nameLength = strToU8(name).length;\n\n // Where this entry's data would start without an extra field.\n const dataStart = offset + LOCAL_HEADER_SIZE + nameLength;\n if ((dataStart & 63) === 0) {\n files[name] = data;\n offset = dataStart + data.length;\n } else {\n // Pad so the data starts on the next 64-byte boundary past the 4-byte\n // extra-field header.\n const padLength = (64 - ((dataStart + EXTRA_HEADER_SIZE) & 63)) & 63;\n files[name] = [data, { extra: { [PAD_EXTRA_ID]: new Uint8Array(padLength) } }];\n offset = dataStart + EXTRA_HEADER_SIZE + padLength + data.length;\n }\n }\n\n return zipSync(files, { level: 0 });\n}\n","/**\n * Simulation-readiness checks for a {@link RobotDescription} (M16).\n *\n * Validates what Isaac Sim's Asset Validator cares about that is visible from\n * the IR (plus, optionally, the export geometry): graph connectivity, limit\n * sanity, mass properties, and collision setup. `error` issues break\n * simulation; `warning` issues are quality gaps a physics engine tolerates\n * but misbehaves on.\n */\n\nimport type { RobotGeometryProvider } from \"../export/GeometryProvider.js\";\nimport { decomposeRigid } from \"../kinematics/transforms.js\";\nimport type { RobotDescription } from \"./RobotDescription.js\";\nimport { buildKinematicTree } from \"./buildKinematicTree.js\";\n\nexport type ValidationSeverity = \"error\" | \"warning\";\n\nexport type ValidationIssue = {\n severity: ValidationSeverity;\n /** Stable machine-readable code (e.g. `unknown-link`, `no-collision`). */\n code: string;\n message: string;\n /** Link or joint key the issue refers to, when applicable. */\n subject?: string;\n};\n\nexport type ValidateRobotOptions = {\n /** Enables mesh-level checks (collision presence / approximation). */\n geometry?: RobotGeometryProvider;\n};\n\n/** Check a robot IR for simulation-readiness; returns errors first. */\nexport function validateRobotDescription(\n desc: RobotDescription,\n options: ValidateRobotOptions = {},\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const add = (severity: ValidationSeverity, code: string, message: string, subject?: string) =>\n issues.push({ severity, code, message, ...(subject !== undefined ? { subject } : {}) });\n\n if (Object.keys(desc.links).length === 0) {\n add(\"error\", \"no-links\", \"robot has no links\");\n }\n\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (joint.parent !== \"\" && !desc.links[joint.parent]) {\n add(\n \"error\",\n \"unknown-link\",\n `joint \"${key}\" references unknown parent \"${joint.parent}\"`,\n key,\n );\n }\n if (!desc.links[joint.child]) {\n add(\"error\", \"unknown-link\", `joint \"${key}\" references unknown child \"${joint.child}\"`, key);\n }\n if (joint.lower !== undefined && joint.upper !== undefined && joint.lower > joint.upper) {\n add(\n \"error\",\n \"invalid-limits\",\n `joint \"${key}\" lower limit ${joint.lower} exceeds upper ${joint.upper}`,\n key,\n );\n }\n if (\n joint.initialValue !== undefined &&\n ((joint.lower !== undefined && joint.initialValue < joint.lower) ||\n (joint.upper !== undefined && joint.initialValue > joint.upper))\n ) {\n add(\n \"warning\",\n \"initial-out-of-limits\",\n `joint \"${key}\" initial value ${joint.initialValue} is outside its limits`,\n key,\n );\n }\n const frames = [\n [\"jointFrame0\", joint.jointFrame0],\n [\"jointFrame1\", joint.jointFrame1],\n ] as const;\n for (const [label, frame] of frames) {\n if (!decomposeRigid(frame).rigid) {\n add(\n \"warning\",\n \"non-rigid-frame\",\n `joint \"${key}\" ${label} carries scale/shear/reflection (discarded on export)`,\n key,\n );\n }\n }\n }\n\n const tree = buildKinematicTree(desc);\n for (const jointKey of tree.loopJoints) {\n add(\n \"warning\",\n \"closed-loop\",\n `joint \"${jointKey}\" closes a kinematic loop (dropped from the spanning tree)`,\n jointKey,\n );\n }\n for (const linkKey of tree.isolatedLinks) {\n add(\n \"warning\",\n \"isolated-link\",\n `link \"${linkKey}\" is unreachable from root \"${tree.root}\"`,\n linkKey,\n );\n }\n if ((desc.articulationRoots ?? []).length === 0 && !tree.rootJoint) {\n add(\n \"warning\",\n \"no-articulation-root\",\n \"no ArticulationRootAPI link and no world-fixed joint — the base will float\",\n );\n }\n\n for (const [key, link] of Object.entries(desc.links)) {\n const inertial = link.inertial;\n if (!inertial || (inertial.mass === undefined && inertial.density === undefined)) {\n add(\"warning\", \"no-inertial\", `link \"${key}\" has no mass or density (PhysicsMassAPI)`, key);\n }\n if (inertial?.mass !== undefined && inertial.mass <= 0) {\n add(\"error\", \"bad-mass\", `link \"${key}\" has non-positive mass ${inertial.mass}`, key);\n }\n if (inertial?.diagonalInertia?.some((v) => v < 0)) {\n add(\"error\", \"bad-inertia\", `link \"${key}\" has a negative diagonal-inertia component`, key);\n }\n if (inertial?.principalAxes && !inertial.diagonalInertia) {\n add(\n \"warning\",\n \"inertia-pairing\",\n `link \"${key}\" authors principalAxes without diagonalInertia (dropped on export)`,\n key,\n );\n }\n\n if (options.geometry) {\n const meshes = options.geometry(key, link);\n const collisions = meshes.filter((mesh) => mesh.kind === \"collision\");\n if (collisions.length === 0) {\n add(\"warning\", \"no-collision\", `link \"${key}\" has no collision geometry`, key);\n }\n for (const mesh of collisions) {\n if (!mesh.collisionApproximation) {\n add(\n \"warning\",\n \"collision-approximation\",\n `link \"${key}\" collision mesh \"${mesh.name}\" has no physics:approximation (PhysX dynamic bodies need a convex or primitive approximation)`,\n key,\n );\n }\n }\n }\n }\n\n return issues.sort((a, b) => (a.severity === b.severity ? 0 : a.severity === \"error\" ? -1 : 1));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/export/exportRobot.ts","../src/export/GeometryProvider.ts","../src/export/writeUsdz.ts","../src/robot/RobotValidator.ts"],"names":["attr"],"mappings":"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","file":"chunk-TE4MPP5Q.js","sourcesContent":["/** Package identity. Kept in one place so every entry point can re-export it. */\nexport const PACKAGE_NAME = \"three-usd-robot\";\n\n/** Library version. Replaced by the release tooling at publish time. */\nexport const VERSION = \"0.0.0\";\n","/**\n * Robot IR → USDA layer (M13).\n *\n * Builds a self-contained UsdPhysics robot layer from a {@link RobotDescription}:\n * one `Xform` prim per link placed at its **zero-pose** world transform\n * (folding joint frames root-down, `T_child = T_parent · frame0 · frame1⁻¹` —\n * see docs/export-design.md §4), one `Physics*Joint` prim per joint, and the\n * link meshes supplied by a {@link RobotGeometryProvider}. Initial joint values\n * author as `PhysicsJointStateAPI` opinions rather than being baked into link\n * transforms, so a re-import applies them exactly once. Values convert back\n * from SI to authored units (angular radians → degrees).\n */\n\nimport {\n type Mat4,\n decomposeRigid,\n identity4,\n invert,\n multiply,\n toUsdMatrix,\n} from \"../kinematics/transforms.js\";\nimport type {\n AttributeSpec,\n MetadataMap,\n PrimSpec,\n PropertySpec,\n RelationshipSpec,\n UsdValue,\n UsdaFile,\n} from \"../parser/ast.js\";\nimport { AssetPath, Quat } from \"../parser/ast.js\";\nimport type {\n JointDescription,\n JointType,\n LinkInertialDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { jointValueFromSI } from \"../robot/normalize.js\";\nimport {\n ARTICULATION_ROOT_API,\n COLLISION_API,\n MASS_API,\n MESH_COLLISION_API,\n PHYSICS_MATERIAL_API,\n RIGID_BODY_API,\n driveKindFor,\n} from \"../schemas/usdPhysics.js\";\nimport type {\n ExportMaterial,\n ExportMesh,\n ExportPhysicsMaterial,\n RobotGeometryProvider,\n TextureChannel,\n} from \"./GeometryProvider.js\";\n\n/** PhysX articulation tuning API (Isaac / Omniverse). */\nconst PHYSX_ARTICULATION_API = \"PhysxArticulationAPI\";\n\nexport type ExportRobotOptions = {\n /** Supplies each link's meshes; omit for a kinematics-only layer. */\n geometry?: RobotGeometryProvider;\n /** Root prim name; defaults to the (sanitized) robot name. */\n robotName?: string;\n /**\n * Author `physxArticulation:enabledSelfCollisions` on the articulation root\n * (M16). `false` is the common Isaac stabilizer for adjacent-link contact.\n */\n enabledSelfCollisions?: boolean;\n /**\n * Apply the Isaac Sim Robot Schema (M16): `IsaacRobotAPI` on the root with\n * ordered `isaac:physics:robotLinks` / `robotJoints` relationships,\n * `IsaacLinkAPI` per link, and `IsaacJointAPI` (+ DOF order) per joint.\n */\n isaacRobotSchema?: boolean;\n /** Receives non-fatal export diagnostics. */\n onWarn?: (message: string) => void;\n};\n\nconst JOINT_SCHEMA_BY_TYPE: Record<JointType, string> = {\n fixed: \"PhysicsFixedJoint\",\n revolute: \"PhysicsRevoluteJoint\",\n continuous: \"PhysicsRevoluteJoint\",\n prismatic: \"PhysicsPrismaticJoint\",\n};\n\n/** Serialize a robot IR into a single-layer USDA AST (pass to `serializeUsda`). */\nexport function exportRobotUsda(\n desc: RobotDescription,\n options: ExportRobotOptions = {},\n): UsdaFile {\n const warn = (m: string) => options.onWarn?.(m);\n const tree = buildKinematicTree(desc, { onWarn: warn });\n\n const robotName = sanitizeName(options.robotName ?? desc.name ?? \"robot\");\n\n // One flat sibling namespace under the root prim for links and joints.\n const alloc = nameAllocator(warn);\n const linkNames = new Map<string, string>();\n for (const key of Object.keys(desc.links)) linkNames.set(key, alloc(key, `link \"${key}\"`));\n const jointNames = new Map<string, string>();\n for (const key of Object.keys(desc.joints)) jointNames.set(key, alloc(key, `joint \"${key}\"`));\n const linkPath = (key: string) => `/${robotName}/${linkNames.get(key)}`;\n\n // Zero-pose world placement per link, folded root-down along the tree.\n // Links no joint chain reaches (floating root / isolated) keep their\n // authored stage placement when the IR carries one.\n const authoredWorld = (key: string) => desc.links[key]?.worldTransform ?? identity4();\n const worldByLink = new Map<string, Mat4>();\n for (const key of tree.order) {\n const node = tree.nodes[key]!;\n if (node.parent === null || node.jointToParent === null) {\n const rootJoint = tree.rootJoint ? desc.joints[tree.rootJoint] : undefined;\n worldByLink.set(\n key,\n rootJoint\n ? multiply(rootJoint.jointFrame0, invert(rootJoint.jointFrame1))\n : authoredWorld(key),\n );\n continue;\n }\n const joint = desc.joints[node.jointToParent]!;\n const parentWorld = worldByLink.get(node.parent) ?? identity4();\n worldByLink.set(\n key,\n multiply(multiply(parentWorld, joint.jointFrame0), invert(joint.jointFrame1)),\n );\n }\n for (const key of tree.isolatedLinks) worldByLink.set(key, authoredWorld(key));\n\n // Articulation root: preserve link-level APIs from the IR; otherwise apply it\n // on the container prim (never both — nested articulation roots are invalid).\n const articulationLinks = new Set(desc.articulationRoots ?? []);\n\n // Gather meshes once, then dedupe their (physics) materials by name.\n const meshesByLink = new Map<string, ExportMesh[]>();\n const materials = new Map<string, ExportMaterial>();\n const physicsMaterials = new Map<string, ExportPhysicsMaterial>();\n for (const [key, link] of Object.entries(desc.links)) {\n const meshes = options.geometry?.(key, link) ?? [];\n meshesByLink.set(key, meshes);\n for (const mesh of meshes) {\n if (mesh.material && !materials.has(mesh.material.name)) {\n materials.set(mesh.material.name, mesh.material);\n }\n if (mesh.physicsMaterial && !physicsMaterials.has(mesh.physicsMaterial.name)) {\n physicsMaterials.set(mesh.physicsMaterial.name, mesh.physicsMaterial);\n }\n }\n }\n const looksName = materials.size > 0 ? alloc(\"Looks\") : undefined;\n const materialAlloc = nameAllocator();\n const materialNames = new Map<string, string>();\n for (const name of materials.keys()) materialNames.set(name, materialAlloc(name));\n const materialPath = (name: string) =>\n looksName ? `/${robotName}/${looksName}/${materialNames.get(name)}` : undefined;\n\n const physicsScopeName = physicsMaterials.size > 0 ? alloc(\"PhysicsMaterials\") : undefined;\n const physicsMaterialAlloc = nameAllocator();\n const physicsMaterialNames = new Map<string, string>();\n for (const name of physicsMaterials.keys()) {\n physicsMaterialNames.set(name, physicsMaterialAlloc(name));\n }\n const physicsMaterialPath = (name: string) =>\n physicsScopeName\n ? `/${robotName}/${physicsScopeName}/${physicsMaterialNames.get(name)}`\n : undefined;\n\n const isaac = options.isaacRobotSchema === true;\n const children: PrimSpec[] = [];\n for (const [key, link] of Object.entries(desc.links)) {\n const apiSchemas = [RIGID_BODY_API];\n if (articulationLinks.has(key)) apiSchemas.push(ARTICULATION_ROOT_API);\n if (link.inertial) apiSchemas.push(MASS_API);\n if (isaac) apiSchemas.push(\"IsaacLinkAPI\");\n const selfCollision = articulationLinks.has(key) ? options.enabledSelfCollisions : undefined;\n if (selfCollision !== undefined) apiSchemas.push(PHYSX_ARTICULATION_API);\n children.push(\n buildLinkPrim({\n name: linkNames.get(key)!,\n world: worldByLink.get(key) ?? identity4(),\n apiSchemas,\n meshes: meshesByLink.get(key) ?? [],\n materialPath,\n physicsMaterialPath,\n warn,\n ...(link.inertial ? { inertial: link.inertial } : {}),\n ...(selfCollision !== undefined ? { selfCollision } : {}),\n }),\n );\n }\n const emittedJoints = new Set<string>();\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (!desc.links[joint.child] || (joint.parent !== \"\" && !desc.links[joint.parent])) {\n warn(`joint \"${key}\" references an unknown link; skipped`);\n continue;\n }\n emittedJoints.add(key);\n children.push(buildJointPrim(jointNames.get(key)!, key, joint, linkPath, isaac, warn));\n }\n if (looksName) {\n children.push(buildLooksPrim(looksName, materials, materialNames, materialPath));\n }\n if (physicsScopeName) {\n children.push(\n buildPhysicsMaterialsPrim(physicsScopeName, physicsMaterials, physicsMaterialNames),\n );\n }\n\n const rootApiSchemas: string[] = [];\n const rootProperties: PropertySpec[] = [];\n if (articulationLinks.size === 0) {\n rootApiSchemas.push(ARTICULATION_ROOT_API);\n if (options.enabledSelfCollisions !== undefined) {\n rootApiSchemas.push(PHYSX_ARTICULATION_API);\n rootProperties.push(\n attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", options.enabledSelfCollisions),\n );\n }\n }\n if (isaac) {\n rootApiSchemas.push(\"IsaacRobotAPI\");\n const orderedLinks = [...tree.order, ...tree.isolatedLinks];\n const orderedJoints: string[] = [];\n const pushJoint = (key: string | null | undefined) => {\n if (key && emittedJoints.has(key) && !orderedJoints.includes(key)) orderedJoints.push(key);\n };\n pushJoint(tree.rootJoint);\n for (const linkKey of tree.order) pushJoint(tree.nodes[linkKey]?.jointToParent);\n for (const jointKey of tree.loopJoints) pushJoint(jointKey);\n for (const jointKey of Object.keys(desc.joints)) pushJoint(jointKey);\n\n rootProperties.push(rel(\"isaac:physics:robotLinks\", orderedLinks.map(linkPath)));\n rootProperties.push(\n rel(\n \"isaac:physics:robotJoints\",\n orderedJoints.map((key) => `/${robotName}/${jointNames.get(key)}`),\n ),\n );\n }\n\n const root: PrimSpec = {\n specifier: \"def\",\n typeName: \"Xform\",\n name: robotName,\n metadata: rootApiSchemas.length > 0 ? { apiSchemas: rootApiSchemas } : {},\n properties: rootProperties,\n children,\n line: 0,\n };\n\n const metadata: MetadataMap = {\n defaultPrim: robotName,\n metersPerUnit: desc.metersPerUnit,\n upAxis: desc.upAxis,\n ...(desc.timeCodesPerSecond !== undefined\n ? { timeCodesPerSecond: desc.timeCodesPerSecond }\n : {}),\n ...(desc.startTimeCode !== undefined ? { startTimeCode: desc.startTimeCode } : {}),\n ...(desc.endTimeCode !== undefined ? { endTimeCode: desc.endTimeCode } : {}),\n };\n\n return { version: \"1.0\", metadata, prims: [root] };\n}\n\n// ---------------------------------------------------------------------------\n// Links & meshes\n// ---------------------------------------------------------------------------\n\ntype LinkPrimArgs = {\n name: string;\n world: Mat4;\n apiSchemas: string[];\n meshes: ExportMesh[];\n inertial?: LinkInertialDescription;\n /** `physxArticulation:enabledSelfCollisions` for link-level articulation roots. */\n selfCollision?: boolean;\n materialPath: (name: string) => string | undefined;\n physicsMaterialPath: (name: string) => string | undefined;\n warn: (message: string) => void;\n};\n\nfunction buildLinkPrim(args: LinkPrimArgs): PrimSpec {\n const meshAlloc = nameAllocator();\n const properties: PropertySpec[] = transformProps(args.world);\n if (args.inertial) properties.push(...massProps(args.inertial, args.name, args.warn));\n if (args.selfCollision !== undefined) {\n properties.push(attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", args.selfCollision));\n }\n return {\n specifier: \"def\",\n typeName: \"Xform\",\n name: args.name,\n metadata: { apiSchemas: args.apiSchemas },\n properties,\n children: args.meshes.map((mesh) =>\n buildMeshPrim(mesh, meshAlloc(mesh.name), args.materialPath, args.physicsMaterialPath),\n ),\n line: 0,\n };\n}\n\n/**\n * `UsdPhysicsMassAPI` attributes for a link's mass properties. UsdPhysics\n * requires `diagonalInertia` and `principalAxes` to be authored together, so a\n * missing principal-axes frame is completed with the identity quaternion\n * (equivalent — the diagonal is then in the body frame) and axes without a\n * diagonal are dropped (meaningless alone).\n */\nfunction massProps(\n inertial: LinkInertialDescription,\n linkName: string,\n warn: (message: string) => void,\n): PropertySpec[] {\n const out: PropertySpec[] = [];\n if (inertial.mass !== undefined) out.push(attr(\"physics:mass\", \"float\", inertial.mass));\n if (inertial.density !== undefined) out.push(attr(\"physics:density\", \"float\", inertial.density));\n if (inertial.centerOfMass) {\n out.push(attr(\"physics:centerOfMass\", \"point3f\", inertial.centerOfMass));\n }\n if (inertial.diagonalInertia) {\n out.push(attr(\"physics:diagonalInertia\", \"float3\", inertial.diagonalInertia));\n out.push(attr(\"physics:principalAxes\", \"quatf\", inertial.principalAxes ?? Quat.identity()));\n } else if (inertial.principalAxes) {\n warn(`link \"${linkName}\": principalAxes without diagonalInertia is meaningless; dropped`);\n }\n return out;\n}\n\nfunction buildMeshPrim(\n mesh: ExportMesh,\n name: string,\n materialPath: (name: string) => string | undefined,\n physicsMaterialPath: (name: string) => string | undefined,\n): PrimSpec {\n const properties: PropertySpec[] = [];\n if (mesh.transform) properties.push(...transformProps(mesh.transform));\n properties.push(\n arrayAttr(\"faceVertexCounts\", \"int\", mesh.faceVertexCounts),\n arrayAttr(\"faceVertexIndices\", \"int\", mesh.faceVertexIndices),\n arrayAttr(\"points\", \"point3f\", mesh.points),\n );\n if (mesh.normals) properties.push(arrayAttr(\"normals\", \"normal3f\", mesh.normals));\n if (mesh.st) {\n properties.push(arrayAttr(\"primvars:st\", \"texCoord2f\", mesh.st, { interpolation: \"vertex\" }));\n }\n if (mesh.displayColor) {\n properties.push(arrayAttr(\"primvars:displayColor\", \"color3f\", [mesh.displayColor]));\n }\n if (mesh.doubleSided) properties.push(attr(\"doubleSided\", \"bool\", true));\n properties.push(uniformToken(\"subdivisionScheme\", \"none\"));\n\n const apiSchemas: string[] = [];\n if (mesh.kind === \"collision\") {\n apiSchemas.push(COLLISION_API);\n // `guide` keeps collision shapes out of the render pass (usdview, Isaac Sim,\n // and this package's own loader) while PhysX still collides with them.\n properties.push(uniformToken(\"purpose\", \"guide\"));\n if (mesh.collisionApproximation) {\n apiSchemas.push(MESH_COLLISION_API);\n properties.push(uniformToken(\"physics:approximation\", mesh.collisionApproximation));\n }\n }\n const binding = mesh.material ? materialPath(mesh.material.name) : undefined;\n if (binding) properties.push(rel(\"material:binding\", [binding]));\n const physicsBinding =\n mesh.kind === \"collision\" && mesh.physicsMaterial\n ? physicsMaterialPath(mesh.physicsMaterial.name)\n : undefined;\n if (physicsBinding) properties.push(rel(\"material:binding:physics\", [physicsBinding]));\n if (binding || physicsBinding) apiSchemas.push(\"MaterialBindingAPI\");\n\n return {\n specifier: \"def\",\n typeName: \"Mesh\",\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Physics materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `PhysicsMaterialAPI` material per unique name. */\nfunction buildPhysicsMaterialsPrim(\n scopeName: string,\n materials: Map<string, ExportPhysicsMaterial>,\n names: Map<string, string>,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildPhysicsMaterialPrim(names.get(key)!, material));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: scopeName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\nfunction buildPhysicsMaterialPrim(name: string, material: ExportPhysicsMaterial): PrimSpec {\n const properties: PropertySpec[] = [];\n if (material.staticFriction !== undefined) {\n properties.push(attr(\"physics:staticFriction\", \"float\", material.staticFriction));\n }\n if (material.dynamicFriction !== undefined) {\n properties.push(attr(\"physics:dynamicFriction\", \"float\", material.dynamicFriction));\n }\n if (material.restitution !== undefined) {\n properties.push(attr(\"physics:restitution\", \"float\", material.restitution));\n }\n if (material.density !== undefined) {\n properties.push(attr(\"physics:density\", \"float\", material.density));\n }\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: { apiSchemas: [PHYSICS_MATERIAL_API] },\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `Material` + `UsdPreviewSurface` shader per material. */\nfunction buildLooksPrim(\n looksName: string,\n materials: Map<string, ExportMaterial>,\n materialNames: Map<string, string>,\n materialPath: (name: string) => string | undefined,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildMaterialPrim(materialNames.get(key)!, material, materialPath(key)!));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: looksName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\n/** How each texture channel wires into `UsdPreviewSurface`. */\nconst TEXTURE_WIRING: Record<\n TextureChannel,\n { input: string; inputType: string; output: string; outputType: string; colorSpace: string }\n> = {\n color: {\n input: \"inputs:diffuseColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n emissive: {\n input: \"inputs:emissiveColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n normal: {\n input: \"inputs:normal\",\n inputType: \"normal3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"raw\",\n },\n opacity: {\n input: \"inputs:opacity\",\n inputType: \"float\",\n output: \"outputs:a\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n roughness: {\n input: \"inputs:roughness\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n metalness: {\n input: \"inputs:metallic\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n occlusion: {\n input: \"inputs:occlusion\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n};\n\nfunction buildMaterialPrim(name: string, material: ExportMaterial, selfPath: string): PrimSpec {\n const textures = material.textures ?? {};\n const shaderProps: PropertySpec[] = [uniformToken(\"info:id\", \"UsdPreviewSurface\")];\n\n // A surface input: constant value, texture connection, or both (the\n // connection wins per UsdShade; the constant stays for flat consumers).\n const input = (channel: TextureChannel, value?: UsdValue) => {\n const wiring = TEXTURE_WIRING[channel];\n const texturePath = textures[channel];\n if (value === undefined && texturePath === undefined) return;\n const spec = attr(wiring.input, wiring.inputType, value);\n if (texturePath !== undefined) {\n spec.connections = [`${selfPath}/${channel}Texture.${wiring.output}`];\n }\n shaderProps.push(spec);\n };\n input(\"color\", material.diffuseColor);\n input(\"metalness\", material.metallic);\n input(\"roughness\", material.roughness);\n input(\"opacity\", material.opacity);\n input(\"emissive\", material.emissiveColor);\n input(\"normal\");\n input(\"occlusion\");\n shaderProps.push(attr(\"outputs:surface\", \"token\", undefined));\n\n const children: PrimSpec[] = [shaderPrim(\"PreviewSurface\", shaderProps)];\n const textureEntries = Object.entries(textures) as [TextureChannel, string][];\n if (textureEntries.length > 0) {\n children.push(\n shaderPrim(\"stReader\", [\n uniformToken(\"info:id\", \"UsdPrimvarReader_float2\"),\n attr(\"inputs:varname\", \"string\", \"st\"),\n attr(\"outputs:result\", \"float2\", undefined),\n ]),\n );\n for (const [channel, path] of textureEntries) {\n children.push(buildUvTexturePrim(channel, path, selfPath));\n }\n }\n\n const surfaceConnect = attr(\"outputs:surface\", \"token\", undefined);\n surfaceConnect.connections = [`${selfPath}/PreviewSurface.outputs:surface`];\n\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: {},\n properties: [surfaceConnect],\n children,\n line: 0,\n };\n}\n\n/** `UsdUVTexture` node for one channel, fed by the material's `stReader`. */\nfunction buildUvTexturePrim(channel: TextureChannel, path: string, selfPath: string): PrimSpec {\n const wiring = TEXTURE_WIRING[channel];\n const st = attr(\"inputs:st\", \"float2\", undefined);\n st.connections = [`${selfPath}/stReader.outputs:result`];\n return shaderPrim(`${channel}Texture`, [\n uniformToken(\"info:id\", \"UsdUVTexture\"),\n attr(\"inputs:file\", \"asset\", new AssetPath(path)),\n uniformToken(\"inputs:sourceColorSpace\", wiring.colorSpace),\n st,\n attr(wiring.output, wiring.outputType, undefined),\n ]);\n}\n\nfunction shaderPrim(name: string, properties: PropertySpec[]): PrimSpec {\n return {\n specifier: \"def\",\n typeName: \"Shader\",\n name,\n metadata: {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n/** `xformOp:transform` + `xformOpOrder` for an explicit matrix placement. */\nfunction transformProps(m: Mat4): PropertySpec[] {\n return [\n attr(\"xformOp:transform\", \"matrix4d\", toUsdMatrix(m)),\n arrayAttr(\"xformOpOrder\", \"token\", [\"xformOp:transform\"], undefined, \"uniform\"),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Joints\n// ---------------------------------------------------------------------------\n\nfunction buildJointPrim(\n name: string,\n key: string,\n joint: JointDescription,\n linkPath: (key: string) => string,\n isaac: boolean,\n warn: (m: string) => void,\n): PrimSpec {\n const kind = driveKindFor(joint.type);\n const angular = kind === \"angular\";\n const properties: PropertySpec[] = [];\n const apiSchemas: string[] = [];\n\n if (joint.parent !== \"\") properties.push(rel(\"physics:body0\", [linkPath(joint.parent)]));\n properties.push(rel(\"physics:body1\", [linkPath(joint.child)]));\n if (joint.type !== \"fixed\") properties.push(uniformToken(\"physics:axis\", joint.axis));\n if (joint.lower !== undefined) {\n properties.push(attr(\"physics:lowerLimit\", \"float\", jointValueFromSI(angular, joint.lower)));\n }\n if (joint.upper !== undefined) {\n properties.push(attr(\"physics:upperLimit\", \"float\", jointValueFromSI(angular, joint.upper)));\n }\n\n for (const index of [0, 1] as const) {\n const frame = index === 0 ? joint.jointFrame0 : joint.jointFrame1;\n const { position, orientation, rigid } = decomposeRigid(frame);\n if (!rigid) {\n warn(`joint \"${key}\": jointFrame${index} is not rigid; scale/shear was discarded`);\n }\n properties.push(attr(`physics:localPos${index}`, \"point3f\", position));\n properties.push(attr(`physics:localRot${index}`, \"quatf\", orientation));\n }\n\n // Joint state: the initial value and/or the sampled trajectory (SI → authored).\n if (joint.initialValue !== undefined || joint.valueSamples) {\n const state = attr(\n `state:${kind}:physics:position`,\n \"float\",\n joint.initialValue !== undefined ? jointValueFromSI(angular, joint.initialValue) : undefined,\n );\n if (joint.valueSamples) {\n state.timeSamples = new Map(\n joint.valueSamples.times.map((t, i) => [\n t,\n jointValueFromSI(angular, joint.valueSamples!.values[i] ?? 0),\n ]),\n );\n }\n properties.push(state);\n apiSchemas.push(`PhysicsJointStateAPI:${kind}`);\n }\n\n if (joint.drive) {\n const d = joint.drive;\n if (d.targetPosition !== undefined) {\n properties.push(\n attr(\n `drive:${kind}:physics:targetPosition`,\n \"float\",\n jointValueFromSI(angular, d.targetPosition),\n ),\n );\n }\n if (d.stiffness !== undefined) {\n properties.push(attr(`drive:${kind}:physics:stiffness`, \"float\", d.stiffness));\n }\n if (d.damping !== undefined) {\n properties.push(attr(`drive:${kind}:physics:damping`, \"float\", d.damping));\n }\n if (d.maxForce !== undefined) {\n properties.push(attr(`drive:${kind}:physics:maxForce`, \"float\", d.maxForce));\n }\n apiSchemas.push(`PhysicsDriveAPI:${kind}`);\n }\n\n if (isaac) {\n apiSchemas.push(\"IsaacJointAPI\");\n if (joint.type !== \"fixed\") {\n const prefix = joint.type === \"prismatic\" ? \"Trans\" : \"Rot\";\n properties.push(\n arrayAttr(\"isaac:physics:DofOffsetOpOrder\", \"token\", [`${prefix}${joint.axis}`]),\n );\n }\n }\n\n return {\n specifier: \"def\",\n typeName: JOINT_SCHEMA_BY_TYPE[joint.type],\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Naming & spec helpers\n// ---------------------------------------------------------------------------\n\n/** Make a valid USD identifier out of an arbitrary key (`/a/b c` → `_a_b_c`). */\nfunction sanitizeName(raw: string): string {\n const cleaned = raw.replace(/[^A-Za-z0-9_]/g, \"_\");\n const named = cleaned.length > 0 ? cleaned : \"_\";\n return /^[0-9]/.test(named) ? `_${named}` : named;\n}\n\n/** Allocates unique sanitized sibling names, warning when a name changes. */\nfunction nameAllocator(warn?: (m: string) => void): (raw: string, label?: string) => string {\n const used = new Set<string>();\n return (raw, label) => {\n let name = sanitizeName(raw);\n for (let i = 2; used.has(name); i++) name = `${sanitizeName(raw)}_${i}`;\n used.add(name);\n if (name !== raw && label && warn) warn(`${label} exported as prim \"${name}\"`);\n return name;\n };\n}\n\nfunction attr(\n name: string,\n typeName: string,\n value: UsdValue | undefined,\n metadata: MetadataMap = {},\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: false,\n variability: \"varying\",\n custom: false,\n ...(value !== undefined ? { value } : {}),\n metadata,\n line: 0,\n };\n}\n\nfunction arrayAttr(\n name: string,\n typeName: string,\n value: UsdValue[],\n metadata: MetadataMap = {},\n variability: \"varying\" | \"uniform\" = \"varying\",\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: true,\n variability,\n custom: false,\n value,\n metadata,\n line: 0,\n };\n}\n\nfunction uniformToken(name: string, value: string): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName: \"token\",\n isArray: false,\n variability: \"uniform\",\n custom: false,\n value,\n metadata: {},\n line: 0,\n };\n}\n\nfunction rel(name: string, targets: string[]): RelationshipSpec {\n return {\n kind: \"relationship\",\n name,\n custom: false,\n listOp: \"explicit\",\n targets,\n metadata: {},\n line: 0,\n };\n}\n","/**\n * Geometry access for the robot exporter (M13).\n *\n * `exportRobotUsda` is geometry-agnostic: a {@link RobotGeometryProvider}\n * supplies each link's meshes as plain data. {@link stageGeometryProvider}\n * reads them back off a loaded {@link Stage} for round-trip export; the\n * Three.js authoring side (M14) supplies one backed by `BufferGeometry`.\n */\n\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { LinkDescription } from \"../robot/RobotDescription.js\";\nimport { getMaterialSubsets } from \"../schemas/usdGeom.js\";\nimport { resolveBoundMaterial } from \"../three/MaterialBinding.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\n\n/** Texture channels a `UsdPreviewSurface` network can reference (M15). */\nexport type TextureChannel =\n | \"color\"\n | \"opacity\"\n | \"normal\"\n | \"roughness\"\n | \"metalness\"\n | \"occlusion\"\n | \"emissive\";\n\n/**\n * PBR parameters for a mesh, written as a `UsdPreviewSurface` material (M14).\n * `textures` holds per-channel image **asset paths** (M15) — emitted as a\n * `UsdUVTexture` + `UsdPrimvarReader_float2` network; sampler details\n * (wrap/scale/bias/transform) are not carried. Bundle the image bytes\n * themselves with `writeUsdz` under the same paths.\n */\nexport type ExportMaterial = {\n /** Material identity: meshes sharing a name share one Material prim. */\n name: string;\n diffuseColor?: Vec3;\n metallic?: number;\n roughness?: number;\n /** Sub-unit opacity renders as a translucent blend. */\n opacity?: number;\n emissiveColor?: Vec3;\n /** Per-channel texture asset paths. */\n textures?: Partial<Record<TextureChannel, string>>;\n};\n\n/** `UsdPhysicsMaterialAPI` parameters, bound via `material:binding:physics` (M16). */\nexport type ExportPhysicsMaterial = {\n /** Identity: meshes sharing a name share one physics-material prim. */\n name: string;\n staticFriction?: number;\n dynamicFriction?: number;\n restitution?: number;\n density?: number;\n};\n\n/** `physics:approximation` tokens of `UsdPhysicsMeshCollisionAPI`. */\nexport type CollisionApproximation =\n | \"none\"\n | \"convexHull\"\n | \"convexDecomposition\"\n | \"boundingSphere\"\n | \"boundingCube\"\n | \"meshSimplification\";\n\n/** One mesh of a link, as plain exportable data (stage units, link-relative). */\nexport type ExportMesh = {\n /** Prim-name hint; the exporter sanitizes and uniquifies it. */\n name: string;\n kind: \"visual\" | \"collision\";\n points: Vec3[];\n /** Authored polygon topology (not re-triangulated). */\n faceVertexCounts: number[];\n faceVertexIndices: number[];\n /** Per-vertex normals (only written when one per point). */\n normals?: Vec3[];\n /** `primvars:st` UVs, vertex interpolation (one per point). */\n st?: Vec2[];\n displayColor?: Vec3;\n doubleSided?: boolean;\n /** Transform relative to the link frame (column-major); identity when omitted. */\n transform?: Mat4;\n /** Bound material constants, if any. */\n material?: ExportMaterial;\n /** Collision approximation token (collision meshes only, M16). */\n collisionApproximation?: CollisionApproximation;\n /** Bound physics material (collision meshes only, M16). */\n physicsMaterial?: ExportPhysicsMaterial;\n};\n\n/** Supplies the meshes of a link for export. */\nexport type RobotGeometryProvider = (linkKey: string, link: LinkDescription) => ExportMesh[];\n\n/** Provider that reads each link's visual/collision Mesh prims from a stage. */\nexport function stageGeometryProvider(stage: Stage): RobotGeometryProvider {\n return (_linkKey, link) => {\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkPrim) return [];\n\n // Meshes that are both visual and collision export once, as visual.\n const visualSet = new Set(link.visualPrims);\n const out: ExportMesh[] = [];\n for (const path of link.visualPrims) {\n out.push(...readMeshes(stage, linkPrim, path, \"visual\"));\n }\n for (const path of link.collisionPrims ?? []) {\n if (visualSet.has(path)) continue;\n out.push(...readMeshes(stage, linkPrim, path, \"collision\"));\n }\n return out;\n };\n}\n\n/**\n * Read a Mesh prim as exportable data. A mesh painted by `materialBind` face\n * subsets becomes one {@link ExportMesh} per subset (points re-indexed to the\n * faces each one covers), so the export keeps its materials instead of\n * collapsing to a single colour.\n */\nfunction readMeshes(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n kind: \"visual\" | \"collision\",\n): ExportMesh[] {\n const prim = stage.GetPrimAtPath(meshPath);\n if (!prim) return [];\n\n const points = prim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return [];\n\n const countsValue = prim.GetAttribute(\"faceVertexCounts\").Get();\n const indicesValue = prim.GetAttribute(\"faceVertexIndices\").Get();\n const counts = isNumberArray(countsValue) ? countsValue : [];\n const indices = isNumberArray(indicesValue) ? indicesValue : [];\n const normalsValue = prim.GetAttribute(\"normals\").Get();\n const stValue = prim.GetAttribute(\"primvars:st\").Get();\n const displayColor = prim.GetAttribute(\"primvars:displayColor\").Get();\n const normals =\n isVec3Array(normalsValue) && normalsValue.length === points.length ? normalsValue : undefined;\n const st = isVec2Array(stValue) && stValue.length === points.length ? stValue : undefined;\n\n // Attributes shared by every piece of this mesh.\n const transform = relativeTransform(linkPrim, prim);\n const common = {\n kind,\n ...(isVec3Array(displayColor) && displayColor[0] ? { displayColor: displayColor[0] } : {}),\n ...(prim.GetAttribute(\"doubleSided\").Get() === true ? { doubleSided: true } : {}),\n ...(isIdentity(transform) ? {} : { transform }),\n } satisfies Partial<ExportMesh>;\n\n const withPhysics = (mesh: ExportMesh): ExportMesh => {\n if (kind !== \"collision\") return mesh;\n const approximation = prim.GetAttribute(\"physics:approximation\").Get();\n if (typeof approximation === \"string\" && APPROXIMATIONS.has(approximation)) {\n mesh.collisionApproximation = approximation as CollisionApproximation;\n }\n const physicsMaterial = readBoundPhysicsMaterial(stage, prim);\n if (physicsMaterial) mesh.physicsMaterial = physicsMaterial;\n return mesh;\n };\n\n const subsets = getMaterialSubsets(prim);\n if (subsets.length === 0) {\n const material = readBoundMaterial(stage, prim);\n return [\n withPhysics({\n ...common,\n name: prim.GetName(),\n points: points.slice(),\n faceVertexCounts: counts.slice(),\n faceVertexIndices: indices.slice(),\n ...(normals ? { normals: normals.slice() } : {}),\n ...(st ? { st: st.slice() } : {}),\n ...(material ? { material } : {}),\n }),\n ];\n }\n\n const faceStart: number[] = [];\n let offset = 0;\n for (const count of counts) {\n faceStart.push(offset);\n offset += count;\n }\n\n /** Re-index the given faces onto their own point list. */\n const piece = (faces: number[], name: string, material?: ExportMaterial): ExportMesh | null => {\n const remap = new Map<number, number>();\n const outPoints: Vec3[] = [];\n const outNormals: Vec3[] = [];\n const outSt: Vec2[] = [];\n const outCounts: number[] = [];\n const outIndices: number[] = [];\n\n for (const face of faces) {\n const start = faceStart[face];\n const count = counts[face];\n if (start === undefined || count === undefined) continue;\n outCounts.push(count);\n for (let k = 0; k < count; k++) {\n const vertex = indices[start + k];\n if (vertex === undefined || !points[vertex]) continue;\n let mapped = remap.get(vertex);\n if (mapped === undefined) {\n mapped = outPoints.length;\n remap.set(vertex, mapped);\n outPoints.push(points[vertex]!);\n if (normals) outNormals.push(normals[vertex]!);\n if (st) outSt.push(st[vertex]!);\n }\n outIndices.push(mapped);\n }\n }\n if (outPoints.length === 0) return null;\n\n return withPhysics({\n ...common,\n name,\n points: outPoints,\n faceVertexCounts: outCounts,\n faceVertexIndices: outIndices,\n ...(normals ? { normals: outNormals } : {}),\n ...(st ? { st: outSt } : {}),\n ...(material ? { material } : {}),\n });\n };\n\n const out: ExportMesh[] = [];\n const claimed = new Set<number>();\n subsets.forEach((subset, index) => {\n const faces = subset.faces.filter((f) => f >= 0 && f < counts.length && !claimed.has(f));\n for (const f of faces) claimed.add(f);\n const material = readBoundMaterial(stage, subset.prim);\n const mesh = piece(faces, `${prim.GetName()}_${material?.name ?? index}`, material);\n if (mesh) out.push(mesh);\n });\n\n const leftover = counts.map((_, f) => f).filter((f) => !claimed.has(f));\n if (leftover.length > 0) {\n const material = readBoundMaterial(stage, prim);\n const mesh = piece(leftover, prim.GetName(), material);\n if (mesh) out.push(mesh);\n }\n return out;\n}\n\nconst APPROXIMATIONS: ReadonlySet<string> = new Set([\n \"none\",\n \"convexHull\",\n \"convexDecomposition\",\n \"boundingSphere\",\n \"boundingCube\",\n \"meshSimplification\",\n]);\n\n/** `UsdPhysicsMaterialAPI` parameters bound via `material:binding:physics`. */\nfunction readBoundPhysicsMaterial(stage: Stage, prim: Prim): ExportPhysicsMaterial | undefined {\n const target = firstBindingTarget(prim, \"material:binding:physics\");\n if (!target) return undefined;\n const materialPrim = stage.GetPrimAtPath(target);\n if (!materialPrim) return undefined;\n\n const out: ExportPhysicsMaterial = {\n name: target.split(\"/\").filter(Boolean).pop() ?? \"PhysicsMaterial\",\n };\n const read = (attr: string): number | undefined => {\n const v = materialPrim.GetAttribute(attr).Get();\n return typeof v === \"number\" ? v : undefined;\n };\n const staticFriction = read(\"physics:staticFriction\");\n if (staticFriction !== undefined) out.staticFriction = staticFriction;\n const dynamicFriction = read(\"physics:dynamicFriction\");\n if (dynamicFriction !== undefined) out.dynamicFriction = dynamicFriction;\n const restitution = read(\"physics:restitution\");\n if (restitution !== undefined) out.restitution = restitution;\n const density = read(\"physics:density\");\n if (density !== undefined) out.density = density;\n return Object.keys(out).length > 1 ? out : undefined;\n}\n\n/** First target of `relName` on the prim or an ancestor. */\nfunction firstBindingTarget(prim: Prim, relName: string): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(relName).GetTargets();\n if (targets.length > 0) return targets[0];\n p = p.GetParent();\n }\n return undefined;\n}\n\n/** PBR constants + texture asset paths of the bound material. */\nfunction readBoundMaterial(stage: Stage, prim: Prim): ExportMaterial | undefined {\n const bound = resolveBoundMaterial(stage, prim);\n if (!bound) return undefined;\n const material: ExportMaterial = { name: boundMaterialName(prim) ?? \"Material\" };\n if (bound.color) material.diffuseColor = bound.color;\n if (bound.metalness !== undefined) material.metallic = bound.metalness;\n if (bound.roughness !== undefined) material.roughness = bound.roughness;\n if (bound.opacity !== undefined) material.opacity = bound.opacity;\n if (bound.emissiveColor) material.emissiveColor = bound.emissiveColor;\n\n const textures: Partial<Record<TextureChannel, string>> = {};\n if (bound.colorTexture) textures.color = bound.colorTexture.path;\n if (bound.opacityTexture) textures.opacity = bound.opacityTexture.path;\n if (bound.normalTexture) textures.normal = bound.normalTexture.path;\n if (bound.roughnessTexture) textures.roughness = bound.roughnessTexture.path;\n if (bound.metalnessTexture) textures.metalness = bound.metalnessTexture.path;\n if (bound.occlusionTexture) textures.occlusion = bound.occlusionTexture.path;\n if (bound.emissiveTexture) textures.emissive = bound.emissiveTexture.path;\n if (Object.keys(textures).length > 0) material.textures = textures;\n\n return Object.keys(material).length > 1 ? material : undefined;\n}\n\n/** Leaf name of the first `material:binding` target on the prim or an ancestor. */\nfunction boundMaterialName(prim: Prim): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(\"material:binding\").GetTargets();\n if (targets.length > 0) return targets[0]!.split(\"/\").filter(Boolean).pop();\n p = p.GetParent();\n }\n return undefined;\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();\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\nfunction isIdentity(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n\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 * USDZ package writer (M15) — the write-direction counterpart of `openUsdz`.\n *\n * A `.usdz` is a **stored** (uncompressed) zip whose entries' file data must\n * start on 64-byte boundaries; alignment is achieved with padding placed in a\n * local-header extra field (the fflate-sanctioned trick, as used by Three.js's\n * USDZExporter). The first entry is the package's root USD layer — `openUsdz`\n * and other USDZ readers open that one.\n */\n\nimport { type Zippable, strToU8, zipSync } from \"fflate\";\n\nconst USD_ENTRY = /\\.(usda|usdc|usd)$/i;\n/** Private extra-field id used purely as alignment padding. */\nconst PAD_EXTRA_ID = 12345;\n/** Bytes of a zip local file header before the name/extra fields. */\nconst LOCAL_HEADER_SIZE = 30;\n/** An extra field costs 4 header bytes (id + size) plus its data. */\nconst EXTRA_HEADER_SIZE = 4;\n\n/**\n * Pack entries into USDZ bytes. `entries` maps archive paths to file contents\n * (strings are UTF-8 encoded — pass the `serializeUsda` output directly). One\n * entry must be a USD layer (`.usda`/`.usdc`/`.usd`); the first such entry\n * becomes the package root and is moved to the front of the archive.\n */\nexport function writeUsdz(entries: Record<string, Uint8Array | string>): Uint8Array {\n const names = Object.keys(entries);\n const root = names.find((n) => USD_ENTRY.test(n));\n if (!root) {\n throw new Error(\"writeUsdz: entries must include a root USD layer (.usda/.usdc/.usd)\");\n }\n const ordered = [root, ...names.filter((n) => n !== root)];\n\n const files: Zippable = {};\n let offset = 0;\n for (const name of ordered) {\n const raw = entries[name]!;\n const data = typeof raw === \"string\" ? strToU8(raw) : raw;\n const nameLength = strToU8(name).length;\n\n // Where this entry's data would start without an extra field.\n const dataStart = offset + LOCAL_HEADER_SIZE + nameLength;\n if ((dataStart & 63) === 0) {\n files[name] = data;\n offset = dataStart + data.length;\n } else {\n // Pad so the data starts on the next 64-byte boundary past the 4-byte\n // extra-field header.\n const padLength = (64 - ((dataStart + EXTRA_HEADER_SIZE) & 63)) & 63;\n files[name] = [data, { extra: { [PAD_EXTRA_ID]: new Uint8Array(padLength) } }];\n offset = dataStart + EXTRA_HEADER_SIZE + padLength + data.length;\n }\n }\n\n return zipSync(files, { level: 0 });\n}\n","/**\n * Simulation-readiness checks for a {@link RobotDescription} (M16).\n *\n * Validates what Isaac Sim's Asset Validator cares about that is visible from\n * the IR (plus, optionally, the export geometry): graph connectivity, limit\n * sanity, mass properties, and collision setup. `error` issues break\n * simulation; `warning` issues are quality gaps a physics engine tolerates\n * but misbehaves on.\n */\n\nimport type { RobotGeometryProvider } from \"../export/GeometryProvider.js\";\nimport { decomposeRigid } from \"../kinematics/transforms.js\";\nimport type { RobotDescription } from \"./RobotDescription.js\";\nimport { buildKinematicTree } from \"./buildKinematicTree.js\";\n\nexport type ValidationSeverity = \"error\" | \"warning\";\n\nexport type ValidationIssue = {\n severity: ValidationSeverity;\n /** Stable machine-readable code (e.g. `unknown-link`, `no-collision`). */\n code: string;\n message: string;\n /** Link or joint key the issue refers to, when applicable. */\n subject?: string;\n};\n\nexport type ValidateRobotOptions = {\n /** Enables mesh-level checks (collision presence / approximation). */\n geometry?: RobotGeometryProvider;\n};\n\n/** Check a robot IR for simulation-readiness; returns errors first. */\nexport function validateRobotDescription(\n desc: RobotDescription,\n options: ValidateRobotOptions = {},\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const add = (severity: ValidationSeverity, code: string, message: string, subject?: string) =>\n issues.push({ severity, code, message, ...(subject !== undefined ? { subject } : {}) });\n\n if (Object.keys(desc.links).length === 0) {\n add(\"error\", \"no-links\", \"robot has no links\");\n }\n\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (joint.parent !== \"\" && !desc.links[joint.parent]) {\n add(\n \"error\",\n \"unknown-link\",\n `joint \"${key}\" references unknown parent \"${joint.parent}\"`,\n key,\n );\n }\n if (!desc.links[joint.child]) {\n add(\"error\", \"unknown-link\", `joint \"${key}\" references unknown child \"${joint.child}\"`, key);\n }\n if (joint.lower !== undefined && joint.upper !== undefined && joint.lower > joint.upper) {\n add(\n \"error\",\n \"invalid-limits\",\n `joint \"${key}\" lower limit ${joint.lower} exceeds upper ${joint.upper}`,\n key,\n );\n }\n if (\n joint.initialValue !== undefined &&\n ((joint.lower !== undefined && joint.initialValue < joint.lower) ||\n (joint.upper !== undefined && joint.initialValue > joint.upper))\n ) {\n add(\n \"warning\",\n \"initial-out-of-limits\",\n `joint \"${key}\" initial value ${joint.initialValue} is outside its limits`,\n key,\n );\n }\n const frames = [\n [\"jointFrame0\", joint.jointFrame0],\n [\"jointFrame1\", joint.jointFrame1],\n ] as const;\n for (const [label, frame] of frames) {\n if (!decomposeRigid(frame).rigid) {\n add(\n \"warning\",\n \"non-rigid-frame\",\n `joint \"${key}\" ${label} carries scale/shear/reflection (discarded on export)`,\n key,\n );\n }\n }\n }\n\n const tree = buildKinematicTree(desc);\n for (const jointKey of tree.loopJoints) {\n add(\n \"warning\",\n \"closed-loop\",\n `joint \"${jointKey}\" closes a kinematic loop (dropped from the spanning tree)`,\n jointKey,\n );\n }\n for (const linkKey of tree.isolatedLinks) {\n add(\n \"warning\",\n \"isolated-link\",\n `link \"${linkKey}\" is unreachable from root \"${tree.root}\"`,\n linkKey,\n );\n }\n if ((desc.articulationRoots ?? []).length === 0 && !tree.rootJoint) {\n add(\n \"warning\",\n \"no-articulation-root\",\n \"no ArticulationRootAPI link and no world-fixed joint — the base will float\",\n );\n }\n\n for (const [key, link] of Object.entries(desc.links)) {\n const inertial = link.inertial;\n if (!inertial || (inertial.mass === undefined && inertial.density === undefined)) {\n add(\"warning\", \"no-inertial\", `link \"${key}\" has no mass or density (PhysicsMassAPI)`, key);\n }\n if (inertial?.mass !== undefined && inertial.mass <= 0) {\n add(\"error\", \"bad-mass\", `link \"${key}\" has non-positive mass ${inertial.mass}`, key);\n }\n if (inertial?.diagonalInertia?.some((v) => v < 0)) {\n add(\"error\", \"bad-inertia\", `link \"${key}\" has a negative diagonal-inertia component`, key);\n }\n if (inertial?.principalAxes && !inertial.diagonalInertia) {\n add(\n \"warning\",\n \"inertia-pairing\",\n `link \"${key}\" authors principalAxes without diagonalInertia (dropped on export)`,\n key,\n );\n }\n\n if (options.geometry) {\n const meshes = options.geometry(key, link);\n const collisions = meshes.filter((mesh) => mesh.kind === \"collision\");\n if (collisions.length === 0) {\n add(\"warning\", \"no-collision\", `link \"${key}\" has no collision geometry`, key);\n }\n for (const mesh of collisions) {\n if (!mesh.collisionApproximation) {\n add(\n \"warning\",\n \"collision-approximation\",\n `link \"${key}\" collision mesh \"${mesh.name}\" has no physics:approximation (PhysX dynamic bodies need a convex or primitive approximation)`,\n key,\n );\n }\n }\n }\n }\n\n return issues.sort((a, b) => (a.severity === b.severity ? 0 : a.severity === \"error\" ? -1 : 1));\n}\n"]}
|
|
@@ -78,6 +78,12 @@ var ThreeUsdRobot = class extends THREE4.Object3D {
|
|
|
78
78
|
robot;
|
|
79
79
|
tree;
|
|
80
80
|
clampJointLimits;
|
|
81
|
+
/**
|
|
82
|
+
* The composed USD stage this robot was built from — the full prim tree, for
|
|
83
|
+
* inspection tooling (structure panels, attribute browsers). Attached by
|
|
84
|
+
* {@link ThreeUsdRobotLoader}; `undefined` for programmatically-built robots.
|
|
85
|
+
*/
|
|
86
|
+
stage;
|
|
81
87
|
linkObjects = /* @__PURE__ */ new Map();
|
|
82
88
|
jointObjects = /* @__PURE__ */ new Map();
|
|
83
89
|
linkKeyByPath = /* @__PURE__ */ new Map();
|
|
@@ -110,13 +116,18 @@ var ThreeUsdRobot = class extends THREE4.Object3D {
|
|
|
110
116
|
this.applyStageNormalization(robot, options);
|
|
111
117
|
if (options.applyInitialPose ?? true) this.applyInitialPose(robot);
|
|
112
118
|
}
|
|
113
|
-
/** Orient (
|
|
119
|
+
/** Orient (authored upAxis → target world up) and scale (metersPerUnit × unitScale) the root. */
|
|
114
120
|
applyStageNormalization(robot, options) {
|
|
115
121
|
const scale = (robot.metersPerUnit || 1) * (options.unitScale ?? 1);
|
|
116
122
|
if (scale !== 1) this.scale.setScalar(scale);
|
|
123
|
+
const rotateX = (angle) => this.quaternion.setFromAxisAngle(new THREE4.Vector3(1, 0, 0), angle);
|
|
124
|
+
if (options.worldUp) {
|
|
125
|
+
if (options.worldUp === "Y" && robot.upAxis === "Z") rotateX(-Math.PI / 2);
|
|
126
|
+
else if (options.worldUp === "Z" && robot.upAxis === "Y") rotateX(Math.PI / 2);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
117
129
|
const conv = options.upAxisConversion ?? "none";
|
|
118
|
-
|
|
119
|
-
if (toY) this.quaternion.setFromAxisAngle(new THREE4.Vector3(1, 0, 0), -Math.PI / 2);
|
|
130
|
+
if (conv === "Z" || conv === "auto" && robot.upAxis === "Z") rotateX(-Math.PI / 2);
|
|
120
131
|
}
|
|
121
132
|
/** Apply each joint's authored initial value, if any. */
|
|
122
133
|
applyInitialPose(robot) {
|
|
@@ -277,6 +288,14 @@ var ThreeUsdRobot = class extends THREE4.Object3D {
|
|
|
277
288
|
getKinematicTree() {
|
|
278
289
|
return this.tree;
|
|
279
290
|
}
|
|
291
|
+
/** Authored stage up-axis (`"Y"` or `"Z"`) — unaffected by `worldUp` normalization. */
|
|
292
|
+
get upAxis() {
|
|
293
|
+
return this.robot.upAxis;
|
|
294
|
+
}
|
|
295
|
+
/** Authored stage scale in meters per unit (already applied to the root). */
|
|
296
|
+
get metersPerUnit() {
|
|
297
|
+
return this.robot.metersPerUnit;
|
|
298
|
+
}
|
|
280
299
|
// -- Animation playback --------------------------------------------------
|
|
281
300
|
/** Playback rate in time codes per second (from the stage; default 24). */
|
|
282
301
|
getTimeCodesPerSecond() {
|
|
@@ -370,5 +389,5 @@ function setMatrix(obj, m) {
|
|
|
370
389
|
}
|
|
371
390
|
|
|
372
391
|
export { JointObject, LinkObject, ThreeUsdRobot, axisVector };
|
|
373
|
-
//# sourceMappingURL=chunk-
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
392
|
+
//# sourceMappingURL=chunk-WROYLUSS.js.map
|
|
393
|
+
//# sourceMappingURL=chunk-WROYLUSS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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-WROYLUSS.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 { Axis, JointDescription, JointType } 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\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 }\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 { interpolate } from \"../kinematics/sampling.js\";\nimport { type Mat4, invert, multiply } 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\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 private dirty = true;\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.applyStageNormalization(robot, options);\n if (options.applyInitialPose ?? true) this.applyInitialPose(robot);\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 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. Returns whether it applied.\n */\n setJointValue(name: string, value: number): boolean {\n const joint = this.jointObjects.get(this.jointKey(name));\n if (!joint) return false;\n joint.setValue(value, this.clampJointLimits);\n this.dirty = true;\n return true;\n }\n\n /** Set several joint values at once (matrix update is coalesced). */\n setJointValues(values: Record<string, number>): void {\n for (const [name, value] of Object.entries(values)) {\n const joint = this.jointObjects.get(this.jointKey(name));\n if (joint) {\n joint.setValue(value, this.clampJointLimits);\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 // -- 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 /** Names of the articulated (controllable) joints. */\n getJointNames(): string[] {\n return [...this.jointObjects.keys()];\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 /** Sample every animated joint at time code `t` and apply the values. */\n setTime(t: number): void {\n for (const [key, joint] of Object.entries(this.robot.joints)) {\n if (joint.valueSamples) 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\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"]}
|