three-usd-robot 0.2.0 → 0.3.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/dist/core.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { n as UsdaFile, g as MetadataMap, m as UsdValue, P as PrimSpec, k as Specifier, j as RelationshipSpec, S as SdfPath, b as AttributeSpec, V as Variability, M as Mat4, R as RobotDescription, d as JointType, A as Axis } from './buildKinematicTree-2fg6ZN8m.js';
2
- export { a as AssetPath, B as BuildTreeOptions, C as CompositionArc, D as DEG2RAD, J as JointDescription, c as JointDriveDescription, K as KinematicNode, e as KinematicTree, L as LinkDescription, f as ListOp, h as PropertySpec, Q as Quat, i as RAD2DEG, T as TreeEdge, U as UsdDictionary, l as UsdMatrix, o as Vec2, p as Vec3, q as Vec4, r as buildKinematicTree, s as fromUsdMatrix, t as getTranslation, u as identity4, v as invert, w as makeEuler, x as makeRotationFromQuat, y as makeRotationX, z as makeRotationY, E as makeRotationZ, F as makeScale, G as makeTranslation, H as multiply, I as multiplyAll } from './buildKinematicTree-2fg6ZN8m.js';
1
+ import { n as UsdaFile, g as MetadataMap, m as UsdValue, P as PrimSpec, k as Specifier, j as RelationshipSpec, S as SdfPath, c as AttributeSpec, o as Variability, M as Mat4, R as RobotDescription, J as JointType, A as Axis } from './buildKinematicTree-BJuC_-5_.js';
2
+ export { b as AssetPath, B as BuildTreeOptions, C as CompositionArc, D as DEG2RAD, a as JointDescription, d as JointDriveDescription, e as KinematicNode, K as KinematicTree, L as LinkDescription, f as ListOp, h as PropertySpec, Q as Quat, i as RAD2DEG, T as TreeEdge, U as UsdDictionary, l as UsdMatrix, p as Vec2, V as Vec3, q as Vec4, r as buildKinematicTree, s as fromUsdMatrix, t as getTranslation, u as identity4, v as invert, w as makeEuler, x as makeRotationFromQuat, y as makeRotationX, z as makeRotationY, E as makeRotationZ, F as makeScale, G as makeTranslation, H as multiply, I as multiplyAll } from './buildKinematicTree-BJuC_-5_.js';
3
3
 
4
4
  /** Package identity. Kept in one place so every entry point can re-export it. */
5
5
  declare const PACKAGE_NAME = "three-usd-robot";
@@ -217,13 +217,16 @@ declare function createMemoryResolver(files: Record<string, string>): AssetResol
217
217
  declare function joinPosix(baseUrl: string, rel: string): string;
218
218
 
219
219
  /**
220
- * Minimal USD composition: flattens references, payloads and sublayers into a
221
- * single {@link UsdaFile} so the rest of the pipeline keeps working on one layer.
220
+ * Minimal USD composition: flattens references, payloads, sublayers, variant
221
+ * selections, and internal (intra-layer) reference/inherit arcs into a single
222
+ * {@link UsdaFile} so the rest of the pipeline keeps working on one layer.
222
223
  *
223
- * Scope (M8): the arcs robots actually use. References and payloads pull a prim
224
- * subtree from another asset (weaker than local opinions); sublayers overlay a
225
- * weaker layer stack. Inherits / variants / specializes are out of scope (M10).
226
- * This is not a full LIVRPS implementation it is a pragmatic flattener.
224
+ * Scope: the arcs robots actually use. References/payloads/inherits pull a prim
225
+ * subtree (weaker than local opinions); a `variants` selection grafts the chosen
226
+ * variant's content; internal arcs (`</Path>` with no asset) resolve within the
227
+ * same layer which is what `instanceable` prims use to pull a prototype.
228
+ * Specializes ordering and live instancing are approximated. Not a full LIVRPS
229
+ * engine — a pragmatic flattener.
227
230
  */
228
231
 
229
232
  type ComposeOptions = {
@@ -231,11 +234,6 @@ type ComposeOptions = {
231
234
  /** Guard against pathological recursion (default 64). */
232
235
  maxDepth?: number;
233
236
  };
234
- /**
235
- * Parse and fully compose a layer: resolve its sublayers and every prim's
236
- * references/payloads (recursively), returning a flattened layer. Unresolvable
237
- * arcs are reported via `onWarn` and skipped.
238
- */
239
237
  declare function composeLayer(text: string, baseUrl: string, resolver: AssetResolver, options?: ComposeOptions, stack?: ReadonlySet<string>): Promise<UsdaFile>;
240
238
 
241
239
  /**
package/dist/core.js CHANGED
@@ -1,3 +1,3 @@
1
- export { ARTICULATION_ROOT_API, AssetPath, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, DEG2RAD, DefaultAssetResolver, Layer, PACKAGE_NAME, ParseError, Prim, Quat, RAD2DEG, RIGID_BODY_API, Relationship, Stage, TokenizeError, UsdMatrix, VERSION, buildKinematicTree, composeLayer, computeLocalTransform, crateToUsdaFile, createMemoryResolver, driveKindFor, extractRobotDescription, fromUsdMatrix, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getTranslation, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, identity4, invert, isMesh, isScope, isXform, iterDescendants, joinPosix, jointValueToSI, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, tokenize } from './chunk-XCP5GZPY.js';
1
+ export { ARTICULATION_ROOT_API, AssetPath, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, DEG2RAD, DefaultAssetResolver, Layer, PACKAGE_NAME, ParseError, Prim, Quat, RAD2DEG, RIGID_BODY_API, Relationship, Stage, TokenizeError, UsdMatrix, VERSION, buildKinematicTree, composeLayer, computeLocalTransform, crateToUsdaFile, createMemoryResolver, driveKindFor, extractRobotDescription, fromUsdMatrix, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getTranslation, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, identity4, invert, isMesh, isScope, isXform, iterDescendants, joinPosix, jointValueToSI, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, tokenize } from './chunk-XH3L7XDJ.js';
2
2
  //# sourceMappingURL=core.js.map
3
3
  //# sourceMappingURL=core.js.map
package/dist/extras.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { T as ThreeUsdRobot } from './ThreeUsdRobot-lMZHW-it.js';
1
+ import { T as ThreeUsdRobot } from './ThreeUsdRobot-C6uqpNZA.js';
2
2
  import 'three';
3
- import './buildKinematicTree-2fg6ZN8m.js';
3
+ import './buildKinematicTree-BJuC_-5_.js';
4
4
 
5
5
  /**
6
6
  * `three-usd-robot/extras`
package/dist/helpers.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as THREE from 'three';
2
- import { J as JointObject, T as ThreeUsdRobot } from './ThreeUsdRobot-lMZHW-it.js';
3
- import './buildKinematicTree-2fg6ZN8m.js';
2
+ import { J as JointObject, T as ThreeUsdRobot } from './ThreeUsdRobot-C6uqpNZA.js';
3
+ import './buildKinematicTree-BJuC_-5_.js';
4
4
 
5
5
  /**
6
6
  * An arrow drawn along a joint's motion axis (the rotation axis for
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { Stage, Prim, AssetResolver } from './core.js';
2
2
  export { ARTICULATION_ROOT_API, Attribute, COLLISION_API, ComposeOptions, CrateReader, DEFAULT_METERS_PER_UNIT, DefaultAssetResolver, ExtractOptions, Layer, PACKAGE_NAME, ParseError, RIGID_BODY_API, Relationship, ResolvedXform, TokenizeError, UpAxis, UsdzPackage, VERSION, composeLayer, computeLocalTransform, crateToUsdaFile, createMemoryResolver, driveKindFor, extractRobotDescription, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, isMesh, isScope, isXform, iterDescendants, joinPosix, jointValueToSI, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, tokenize } from './core.js';
3
3
  import * as THREE from 'three';
4
- import { A as Axis, R as RobotDescription } from './buildKinematicTree-2fg6ZN8m.js';
5
- export { a as AssetPath, b as AttributeSpec, B as BuildTreeOptions, C as CompositionArc, D as DEG2RAD, J as JointDescription, c as JointDriveDescription, d as JointType, K as KinematicNode, e as KinematicTree, L as LinkDescription, f as ListOp, M as Mat4, g as MetadataMap, P as PrimSpec, h as PropertySpec, Q as Quat, i as RAD2DEG, j as RelationshipSpec, S as SdfPath, k as Specifier, T as TreeEdge, U as UsdDictionary, l as UsdMatrix, m as UsdValue, n as UsdaFile, V as Variability, o as Vec2, p as Vec3, q as Vec4, r as buildKinematicTree, s as fromUsdMatrix, t as getTranslation, u as identity4, v as invert, w as makeEuler, x as makeRotationFromQuat, y as makeRotationX, z as makeRotationY, E as makeRotationZ, F as makeScale, G as makeTranslation, H as multiply, I as multiplyAll } from './buildKinematicTree-2fg6ZN8m.js';
6
- import { T as ThreeUsdRobot } from './ThreeUsdRobot-lMZHW-it.js';
7
- export { J as JointObject, L as LinkObject, a as ThreeUsdRobotOptions } from './ThreeUsdRobot-lMZHW-it.js';
4
+ import { A as Axis, R as RobotDescription, V as Vec3 } from './buildKinematicTree-BJuC_-5_.js';
5
+ export { b as AssetPath, c as AttributeSpec, B as BuildTreeOptions, C as CompositionArc, D as DEG2RAD, a as JointDescription, d as JointDriveDescription, J as JointType, e as KinematicNode, K as KinematicTree, L as LinkDescription, f as ListOp, M as Mat4, g as MetadataMap, P as PrimSpec, h as PropertySpec, Q as Quat, i as RAD2DEG, j as RelationshipSpec, S as SdfPath, k as Specifier, T as TreeEdge, U as UsdDictionary, l as UsdMatrix, m as UsdValue, n as UsdaFile, o as Variability, p as Vec2, q as Vec4, r as buildKinematicTree, s as fromUsdMatrix, t as getTranslation, u as identity4, v as invert, w as makeEuler, x as makeRotationFromQuat, y as makeRotationX, z as makeRotationY, E as makeRotationZ, F as makeScale, G as makeTranslation, H as multiply, I as multiplyAll } from './buildKinematicTree-BJuC_-5_.js';
6
+ import { T as ThreeUsdRobot } from './ThreeUsdRobot-C6uqpNZA.js';
7
+ export { J as JointObject, L as LinkObject, a as ThreeUsdRobotOptions } from './ThreeUsdRobot-C6uqpNZA.js';
8
8
 
9
9
  /** Unit vector for a USD joint axis token. Returns a fresh vector each call. */
10
10
  declare function axisVector(axis: Axis): THREE.Vector3;
@@ -26,8 +26,12 @@ type BindMeshesOptions = {
26
26
  };
27
27
  /** Build a `BufferGeometry` from a Mesh prim, or `null` if it has no points. */
28
28
  declare function buildMeshGeometry(meshPrim: Prim): THREE.BufferGeometry | null;
29
- /** Build a default material for a Mesh prim from `displayColor` / `doubleSided`. */
30
- declare function buildMeshMaterial(meshPrim: Prim): THREE.Material;
29
+ /**
30
+ * Build a material for a Mesh prim. Color priority: bound `UsdShade` material
31
+ * (when `stage` is given) → `primvars:displayColor` → default gray. Metalness /
32
+ * roughness / opacity come from the bound material when present.
33
+ */
34
+ declare function buildMeshMaterial(meshPrim: Prim, stage?: Stage): THREE.Material;
31
35
  /**
32
36
  * Attach visual (and optionally collision) meshes to every link of a built
33
37
  * {@link ThreeUsdRobot}. Each mesh is positioned by its transform relative to
@@ -35,6 +39,25 @@ declare function buildMeshMaterial(meshPrim: Prim): THREE.Material;
35
39
  */
36
40
  declare function bindRobotMeshes(stage: Stage, robot3d: ThreeUsdRobot, desc: RobotDescription, options?: BindMeshesOptions): void;
37
41
 
42
+ /**
43
+ * Resolves `UsdShade` material bindings to flat PBR parameters.
44
+ *
45
+ * Follows a prim's (or an ancestor's) `material:binding` to a `Material`, finds
46
+ * its surface `Shader`, and reads constant color/metalness/roughness/opacity
47
+ * inputs. Handles both `UsdPreviewSurface` (`inputs:diffuseColor`, …) and
48
+ * Omniverse `OmniPBR` MDL (`inputs:diffuse_color_constant`, …) input names.
49
+ * Texture inputs and shading networks are not evaluated — constants only.
50
+ */
51
+
52
+ type ResolvedMaterial = {
53
+ color?: Vec3;
54
+ opacity?: number;
55
+ metalness?: number;
56
+ roughness?: number;
57
+ };
58
+ /** Resolve the bound material's flat parameters for `prim`, or `undefined`. */
59
+ declare function resolveBoundMaterial(stage: Stage, prim: Prim): ResolvedMaterial | undefined;
60
+
38
61
  type ThreeUsdRobotLoaderOptions = {
39
62
  /** Resolver for references / payloads / sublayers (default {@link DefaultAssetResolver}). */
40
63
  assetResolver?: AssetResolver;
@@ -86,4 +109,4 @@ declare class ThreeUsdRobotLoader {
86
109
  private extractOptions;
87
110
  }
88
111
 
89
- export { AssetResolver, Axis, type BindMeshesOptions, type MeshKind, Prim, RobotDescription, Stage, ThreeUsdRobot, ThreeUsdRobotLoader, type ThreeUsdRobotLoaderOptions, axisVector, bindRobotMeshes, buildMeshGeometry, buildMeshMaterial };
112
+ export { AssetResolver, Axis, type BindMeshesOptions, type MeshKind, Prim, type ResolvedMaterial, RobotDescription, Stage, ThreeUsdRobot, ThreeUsdRobotLoader, type ThreeUsdRobotLoaderOptions, Vec3, axisVector, bindRobotMeshes, buildMeshGeometry, buildMeshMaterial, resolveBoundMaterial };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { identity4, multiply, computeLocalTransform, invert, DefaultAssetResolver, CrateReader, openUsdz, crateToUsdaFile, Stage, extractRobotDescription, buildKinematicTree, composeLayer } from './chunk-XCP5GZPY.js';
2
- export { ARTICULATION_ROOT_API, AssetPath, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, DEG2RAD, DefaultAssetResolver, Layer, PACKAGE_NAME, ParseError, Prim, Quat, RAD2DEG, RIGID_BODY_API, Relationship, Stage, TokenizeError, UsdMatrix, VERSION, buildKinematicTree, composeLayer, computeLocalTransform, crateToUsdaFile, createMemoryResolver, driveKindFor, extractRobotDescription, fromUsdMatrix, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getTranslation, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, identity4, invert, isMesh, isScope, isXform, iterDescendants, joinPosix, jointValueToSI, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, tokenize } from './chunk-XCP5GZPY.js';
1
+ import { identity4, multiply, computeLocalTransform, invert, DefaultAssetResolver, CrateReader, openUsdz, crateToUsdaFile, Stage, extractRobotDescription, buildKinematicTree, composeLayer } from './chunk-XH3L7XDJ.js';
2
+ export { ARTICULATION_ROOT_API, AssetPath, Attribute, COLLISION_API, CrateReader, DEFAULT_METERS_PER_UNIT, DEG2RAD, DefaultAssetResolver, Layer, PACKAGE_NAME, ParseError, Prim, Quat, RAD2DEG, RIGID_BODY_API, Relationship, Stage, TokenizeError, UsdMatrix, VERSION, buildKinematicTree, composeLayer, computeLocalTransform, crateToUsdaFile, createMemoryResolver, driveKindFor, extractRobotDescription, fromUsdMatrix, gatherMeshDescendants, getJointAxis, getJointBodies, getJointDrive, getJointLimits, getJointLocalFrame, getJointStatePosition, getJointType, getTranslation, hasArticulationRootAPI, hasCollisionAPI, hasRigidBodyAPI, identity4, invert, isMesh, isScope, isXform, iterDescendants, joinPosix, jointValueToSI, makeEuler, makeRotationFromQuat, makeRotationX, makeRotationY, makeRotationZ, makeScale, makeTranslation, multiply, multiplyAll, normalizeJointLimits, openUsdz, parseOpType, parseUsda, refineJointType, tokenize } from './chunk-XH3L7XDJ.js';
3
3
  import * as THREE4 from 'three';
4
4
 
5
5
  function axisVector(axis) {
@@ -71,6 +71,77 @@ var LinkObject = class extends THREE4.Object3D {
71
71
  this.matrixAutoUpdate = false;
72
72
  }
73
73
  };
74
+
75
+ // src/three/MaterialBinding.ts
76
+ var DIFFUSE_INPUTS = [
77
+ "inputs:diffuseColor",
78
+ // UsdPreviewSurface
79
+ "inputs:diffuse_color_constant",
80
+ // OmniPBR
81
+ "inputs:diffuse_tint",
82
+ "inputs:base_color",
83
+ "inputs:baseColor"
84
+ ];
85
+ var OPACITY_INPUTS = ["inputs:opacity", "inputs:opacity_constant"];
86
+ var METALLIC_INPUTS = ["inputs:metallic", "inputs:metallic_constant"];
87
+ var ROUGHNESS_INPUTS = ["inputs:roughness", "inputs:reflection_roughness_constant"];
88
+ var SURFACE_OUTPUTS = ["outputs:surface", "outputs:mdl:surface"];
89
+ function resolveBoundMaterial(stage, prim) {
90
+ const materialPath = findBinding(prim);
91
+ if (!materialPath) return void 0;
92
+ const material = stage.GetPrimAtPath(materialPath);
93
+ if (!material) return void 0;
94
+ const shader = findSurfaceShader(material);
95
+ if (!shader) return void 0;
96
+ const result = {};
97
+ const color = firstColor(shader, DIFFUSE_INPUTS);
98
+ if (color) result.color = color;
99
+ const opacity = firstNumber(shader, OPACITY_INPUTS);
100
+ if (opacity !== void 0) result.opacity = opacity;
101
+ const metalness = firstNumber(shader, METALLIC_INPUTS);
102
+ if (metalness !== void 0) result.metalness = metalness;
103
+ const roughness = firstNumber(shader, ROUGHNESS_INPUTS);
104
+ if (roughness !== void 0) result.roughness = roughness;
105
+ return result;
106
+ }
107
+ function findBinding(prim) {
108
+ let p = prim;
109
+ while (p) {
110
+ const targets = p.GetRelationship("material:binding").GetTargets();
111
+ if (targets.length > 0) return targets[0];
112
+ p = p.GetParent();
113
+ }
114
+ return void 0;
115
+ }
116
+ function findSurfaceShader(material) {
117
+ for (const out of SURFACE_OUTPUTS) {
118
+ const conn = material.GetAttribute(out).GetConnections()[0];
119
+ if (conn) {
120
+ const shaderPath = conn.split(".")[0];
121
+ const shader = material.GetStage().GetPrimAtPath(shaderPath);
122
+ if (shader) return shader;
123
+ }
124
+ }
125
+ return material.GetChildren().find((c) => c.GetTypeName() === "Shader") ?? void 0;
126
+ }
127
+ function firstColor(shader, names) {
128
+ for (const name of names) {
129
+ const v = shader.GetAttribute(name).Get();
130
+ if (Array.isArray(v) && v.length >= 3 && v.every((n) => typeof n === "number")) {
131
+ return [v[0], v[1], v[2]];
132
+ }
133
+ }
134
+ return void 0;
135
+ }
136
+ function firstNumber(shader, names) {
137
+ for (const name of names) {
138
+ const v = shader.GetAttribute(name).Get();
139
+ if (typeof v === "number") return v;
140
+ }
141
+ return void 0;
142
+ }
143
+
144
+ // src/three/MeshBinding.ts
74
145
  var DEFAULT_COLOR = 10132122;
75
146
  function buildMeshGeometry(meshPrim) {
76
147
  const points = meshPrim.GetAttribute("points").Get();
@@ -96,18 +167,31 @@ function buildMeshGeometry(meshPrim) {
96
167
  }
97
168
  return geometry;
98
169
  }
99
- function buildMeshMaterial(meshPrim) {
170
+ function buildMeshMaterial(meshPrim, stage) {
100
171
  const color = new THREE4.Color(DEFAULT_COLOR);
101
- const displayColor = meshPrim.GetAttribute("primvars:displayColor").Get();
102
- if (isVec3Array(displayColor) && displayColor[0]) {
103
- const [r, g, b] = displayColor[0];
104
- color.setRGB(r, g, b);
172
+ let metalness = 0.1;
173
+ let roughness = 0.8;
174
+ let opacity = 1;
175
+ const bound = stage ? resolveBoundMaterial(stage, meshPrim) : void 0;
176
+ if (bound?.color) {
177
+ color.setRGB(bound.color[0], bound.color[1], bound.color[2]);
178
+ } else {
179
+ const displayColor = meshPrim.GetAttribute("primvars:displayColor").Get();
180
+ if (isVec3Array(displayColor) && displayColor[0]) {
181
+ const [r, g, b] = displayColor[0];
182
+ color.setRGB(r, g, b);
183
+ }
105
184
  }
185
+ if (bound?.metalness !== void 0) metalness = bound.metalness;
186
+ if (bound?.roughness !== void 0) roughness = bound.roughness;
187
+ if (bound?.opacity !== void 0) opacity = bound.opacity;
106
188
  const doubleSided = meshPrim.GetAttribute("doubleSided").Get() === true;
107
189
  return new THREE4.MeshStandardMaterial({
108
190
  color,
109
- metalness: 0.1,
110
- roughness: 0.8,
191
+ metalness,
192
+ roughness,
193
+ transparent: opacity < 1,
194
+ opacity,
111
195
  side: doubleSided ? THREE4.DoubleSide : THREE4.FrontSide
112
196
  });
113
197
  }
@@ -137,7 +221,7 @@ function attachMesh(stage, linkPrim, meshPath, parent, kind) {
137
221
  if (!meshPrim) return;
138
222
  const geometry = buildMeshGeometry(meshPrim);
139
223
  if (!geometry) return;
140
- const mesh = new THREE4.Mesh(geometry, buildMeshMaterial(meshPrim));
224
+ const mesh = new THREE4.Mesh(geometry, buildMeshMaterial(meshPrim, stage));
141
225
  mesh.name = meshPrim.GetName();
142
226
  mesh.userData.kind = kind;
143
227
  mesh.userData.primPath = meshPath;
@@ -488,6 +572,6 @@ var ThreeUsdRobotLoader = class {
488
572
  }
489
573
  };
490
574
 
491
- export { JointObject, LinkObject, ThreeUsdRobot, ThreeUsdRobotLoader, axisVector, bindRobotMeshes, buildMeshGeometry, buildMeshMaterial };
575
+ export { JointObject, LinkObject, ThreeUsdRobot, ThreeUsdRobotLoader, axisVector, bindRobotMeshes, buildMeshGeometry, buildMeshMaterial, resolveBoundMaterial };
492
576
  //# sourceMappingURL=index.js.map
493
577
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/three/axis.ts","../src/three/JointObject.ts","../src/three/LinkObject.ts","../src/three/MeshBinding.ts","../src/three/ThreeUsdRobot.ts","../src/three/ThreeUsdRobotLoader.ts"],"names":["THREE","THREE2","THREE3","THREE5"],"mappings":"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","file":"index.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 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.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","/**\n * Binds `UsdGeom.Mesh` prims to Three.js geometry and attaches them under the\n * robot's link objects.\n *\n * Triangulates polygons with a simple fan, uses authored per-vertex normals\n * when present (else computes smooth normals), and reads `primvars:st` UVs and\n * `primvars:displayColor`. Geometry is left in stage units; the global\n * `metersPerUnit` scale is applied at the root in M9.\n */\n\nimport * as THREE from \"three\";\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\nexport type MeshKind = \"visual\" | \"collision\";\n\nconst DEFAULT_COLOR = 0x9a9a9a;\n\nexport type BindMeshesOptions = {\n loadVisuals?: boolean;\n loadCollisions?: boolean;\n};\n\n/** Build a `BufferGeometry` from a Mesh prim, or `null` if it has no points. */\nexport function buildMeshGeometry(meshPrim: Prim): THREE.BufferGeometry | null {\n const points = meshPrim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return null;\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(flat3(points), 3));\n\n const counts = meshPrim.GetAttribute(\"faceVertexCounts\").Get();\n const indices = meshPrim.GetAttribute(\"faceVertexIndices\").Get();\n if (isNumberArray(counts) && isNumberArray(indices)) {\n geometry.setIndex(triangulate(counts, indices));\n } else if (isNumberArray(indices)) {\n geometry.setIndex(indices.slice());\n }\n\n const normals = meshPrim.GetAttribute(\"normals\").Get();\n if (isVec3Array(normals) && normals.length === points.length) {\n geometry.setAttribute(\"normal\", new THREE.Float32BufferAttribute(flat3(normals), 3));\n } else {\n geometry.computeVertexNormals();\n }\n\n const st = meshPrim.GetAttribute(\"primvars:st\").Get();\n if (isVec2Array(st) && st.length === points.length) {\n geometry.setAttribute(\"uv\", new THREE.Float32BufferAttribute(flat2(st), 2));\n }\n\n return geometry;\n}\n\n/** Build a default material for a Mesh prim from `displayColor` / `doubleSided`. */\nexport function buildMeshMaterial(meshPrim: Prim): THREE.Material {\n const color = new THREE.Color(DEFAULT_COLOR);\n const displayColor = meshPrim.GetAttribute(\"primvars:displayColor\").Get();\n if (isVec3Array(displayColor) && displayColor[0]) {\n const [r, g, b] = displayColor[0];\n color.setRGB(r, g, b);\n }\n const doubleSided = meshPrim.GetAttribute(\"doubleSided\").Get() === true;\n return new THREE.MeshStandardMaterial({\n color,\n metalness: 0.1,\n roughness: 0.8,\n side: doubleSided ? THREE.DoubleSide : THREE.FrontSide,\n });\n}\n\n/**\n * Attach visual (and optionally collision) meshes to every link of a built\n * {@link ThreeUsdRobot}. Each mesh is positioned by its transform relative to\n * the owning link prim.\n */\nexport function bindRobotMeshes(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n desc: RobotDescription,\n options: BindMeshesOptions = {},\n): void {\n const loadVisuals = options.loadVisuals ?? true;\n const loadCollisions = options.loadCollisions ?? false;\n\n for (const [key, link] of Object.entries(desc.links)) {\n const linkObj = robot3d.getLinkObject(key);\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkObj || !linkPrim) continue;\n\n const collisionSet = new Set(link.collisionPrims ?? []);\n\n if (loadVisuals) {\n for (const meshPath of link.visualPrims) {\n if (collisionSet.has(meshPath)) continue; // collision-only handled below\n attachMesh(stage, linkPrim, meshPath, linkObj, \"visual\");\n }\n }\n if (loadCollisions) {\n for (const meshPath of link.collisionPrims ?? []) {\n attachMesh(stage, linkPrim, meshPath, linkObj, \"collision\");\n }\n }\n }\n}\n\nfunction attachMesh(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n parent: THREE.Object3D,\n kind: MeshKind,\n): void {\n const meshPrim = stage.GetPrimAtPath(meshPath);\n if (!meshPrim) return;\n const geometry = buildMeshGeometry(meshPrim);\n if (!geometry) return;\n\n const mesh = new THREE.Mesh(geometry, buildMeshMaterial(meshPrim));\n mesh.name = meshPrim.GetName();\n mesh.userData.kind = kind;\n mesh.userData.primPath = meshPath;\n // Collision meshes are loaded hidden; reveal via `robot.showCollision = true`.\n if (kind === \"collision\") mesh.visible = false;\n mesh.matrixAutoUpdate = false;\n mesh.matrix.fromArray(relativeTransform(linkPrim, meshPrim));\n mesh.matrixWorldNeedsUpdate = true;\n parent.add(mesh);\n}\n\n/** Accumulated local transform from `linkPrim` (exclusive) down to `meshPrim` (inclusive). */\nfunction relativeTransform(linkPrim: Prim, meshPrim: Prim): Mat4 {\n const chain: Prim[] = [];\n let p: Prim | null = meshPrim;\n const stop = linkPrim.GetPath();\n while (p && p.GetPath() !== stop) {\n chain.push(p);\n p = p.GetParent();\n }\n chain.reverse(); // top-most (just under link) → mesh\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\n// --- triangulation & typed-array helpers -----------------------------------\n\n/** Fan-triangulate USD polygon faces into a flat triangle index list. */\nfunction triangulate(faceVertexCounts: number[], faceVertexIndices: number[]): number[] {\n const tris: number[] = [];\n let offset = 0;\n for (const count of faceVertexCounts) {\n for (let k = 2; k < count; k++) {\n tris.push(\n faceVertexIndices[offset]!,\n faceVertexIndices[offset + k - 1]!,\n faceVertexIndices[offset + k]!,\n );\n }\n offset += count;\n }\n return tris;\n}\n\nfunction flat3(v: Vec3[]): number[] {\n const out = new Array<number>(v.length * 3);\n for (let i = 0; i < v.length; i++) {\n out[i * 3] = v[i]![0];\n out[i * 3 + 1] = v[i]![1];\n out[i * 3 + 2] = v[i]![2];\n }\n return out;\n}\n\nfunction flat2(v: Vec2[]): number[] {\n const out = new Array<number>(v.length * 2);\n for (let i = 0; i < v.length; i++) {\n out[i * 2] = v[i]![0];\n out[i * 2 + 1] = v[i]![1];\n }\n return out;\n}\n\nfunction isNumberArray(v: unknown): v is number[] {\n return Array.isArray(v) && v.every((n) => typeof n === \"number\");\n}\n\nfunction isVec3Array(v: unknown): v is Vec3[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 3);\n}\n\nfunction isVec2Array(v: unknown): v is Vec2[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 2);\n}\n","import * as THREE from \"three\";\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 { JointObject } from \"./JointObject.js\";\nimport { LinkObject } from \"./LinkObject.js\";\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 * Up-axis correction applied at the robot root. `\"auto\"` rotates Z-up assets\n * into the Three.js Y-up scene; `\"Z\"` forces it, `\"Y\"`/`\"none\"` leave the\n * orientation as authored. Default `\"none\"` (the loader defaults to `\"auto\"`).\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 */\nexport class ThreeUsdRobot extends THREE.Object3D {\n readonly isThreeUsdRobot = true;\n readonly robot: RobotDescription;\n readonly tree: KinematicTree;\n readonly clampJointLimits: boolean;\n\n private readonly linkObjects = new Map<string, LinkObject>();\n private readonly jointObjects = new Map<string, JointObject>();\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.\n for (const [key, link] of Object.entries(robot.links)) {\n this.linkObjects.set(key, new LinkObject(link));\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 (Z-up → Y-up) and scale (metersPerUnit × unitScale) the robot 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 conv = options.upAxisConversion ?? \"none\";\n const toY = conv === \"Z\" || (conv === \"auto\" && robot.upAxis === \"Z\");\n if (toY) this.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0), -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 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 }\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) this.add(obj);\n }\n }\n\n // -- Joint control -------------------------------------------------------\n\n /** Set one joint value. Unknown joints are ignored. Returns whether it applied. */\n setJointValue(name: string, value: number): boolean {\n const joint = this.jointObjects.get(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(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(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 getLinkWorldMatrix(name: string): THREE.Matrix4 {\n const obj = this.linkObjects.get(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 getLinkObject(name: string): LinkObject | undefined {\n return this.linkObjects.get(name);\n }\n\n getJointObject(name: string): JointObject | undefined {\n return this.jointObjects.get(name);\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 // -- 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","import type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport { extractRobotDescription } from \"../robot/RobotExtractor.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { type AssetResolver, DefaultAssetResolver } from \"../usd/AssetResolver.js\";\nimport { Stage } from \"../usd/Stage.js\";\nimport { composeLayer } from \"../usd/composition.js\";\nimport { CrateReader } from \"../usd/crate/CrateReader.js\";\nimport { crateToUsdaFile } from \"../usd/crate/toUsdaFile.js\";\nimport { openUsdz } from \"../usd/usdz.js\";\nimport { bindRobotMeshes } from \"./MeshBinding.js\";\nimport { ThreeUsdRobot, type ThreeUsdRobotOptions } from \"./ThreeUsdRobot.js\";\n\nexport type ThreeUsdRobotLoaderOptions = {\n /** Resolver for references / payloads / sublayers (default {@link DefaultAssetResolver}). */\n assetResolver?: AssetResolver;\n /** Render visual meshes (M6). */\n loadVisuals?: boolean;\n /** Render collision meshes (M6). */\n loadCollisions?: boolean;\n /** Up-axis correction strategy (M9). */\n upAxisConversion?: \"auto\" | \"Y\" | \"Z\" | \"none\";\n /** Extra uniform scale multiplied with `metersPerUnit` (M9). */\n unitScale?: number;\n /** Clamp `setJointValue` to authored limits (default `true`). */\n clampJointLimits?: boolean;\n /** Seed joints from drive targets / joint state (M9). */\n applyDriveTargetsAsInitialPose?: boolean;\n /** Override the robot name. */\n robotName?: string;\n /** Receives non-fatal load diagnostics. */\n onWarn?: (message: string) => void;\n};\n\n/**\n * Loads Isaac Sim / OpenUSD robot assets into a controllable {@link ThreeUsdRobot}.\n *\n * Composition (references / payloads / sublayers, M8) is resolved through an\n * {@link AssetResolver}. Mesh rendering is M6; unit / up-axis / initial-pose\n * handling is M9; USDC and variants are M10.\n */\nexport class ThreeUsdRobotLoader {\n readonly options: ThreeUsdRobotLoaderOptions;\n\n constructor(options: ThreeUsdRobotLoaderOptions = {}) {\n this.options = options;\n }\n\n private get resolver(): AssetResolver {\n return this.options.assetResolver ?? new DefaultAssetResolver();\n }\n\n /**\n * Fetch an asset by URL and build the robot. `.usdz` packages are unzipped and\n * composed from their entries; everything else is treated as USDA text.\n */\n async loadAsync(url: string): Promise<ThreeUsdRobot> {\n if (/\\.usdz$/i.test(url)) {\n return this.parseUsdz(await this.fetchRootBytes(url));\n }\n // Fetch bytes so we can detect a binary crate (`.usd` may be USDC or USDA).\n const bytes = await this.fetchRootBytes(url);\n if (CrateReader.isCrate(bytes)) return this.parseCrate(bytes);\n return this.parse(new TextDecoder().decode(bytes), url);\n }\n\n private async fetchRootBytes(url: string): Promise<Uint8Array> {\n const resolver = this.resolver;\n if (resolver.fetchBytes) return resolver.fetchBytes(url);\n return new TextEncoder().encode(await resolver.fetchText(url));\n }\n\n /** Build a robot (composed, with meshes) from USDA source text. */\n async parse(text: string, baseUrl = \"\"): Promise<ThreeUsdRobot> {\n return this.buildFromStage(await this.composeStage(text, baseUrl, this.resolver));\n }\n\n /** Build a robot from the bytes of a `.usdz` package. */\n async parseUsdz(bytes: Uint8Array): Promise<ThreeUsdRobot> {\n const pkg = openUsdz(bytes);\n const rootText = await pkg.resolver.fetchText(pkg.rootEntry);\n return this.buildFromStage(await this.composeStage(rootText, pkg.rootEntry, pkg.resolver));\n }\n\n /** Build a robot from the bytes of a binary crate (`.usdc` / binary `.usd`). */\n parseCrate(bytes: Uint8Array): Promise<ThreeUsdRobot> {\n const file = crateToUsdaFile(new CrateReader(bytes));\n return Promise.resolve(this.buildFromStage(Stage.OpenFromFile(file)));\n }\n\n /** Parse + compose USDA source into the Three.js-independent robot IR. */\n async parseRobotDescription(text: string, baseUrl = \"\"): Promise<RobotDescription> {\n const stage = await this.composeStage(text, baseUrl, this.resolver);\n return extractRobotDescription(stage, this.extractOptions());\n }\n\n private buildFromStage(stage: Stage): ThreeUsdRobot {\n const robot = extractRobotDescription(stage, this.extractOptions());\n const tree = buildKinematicTree(robot);\n const robot3d = new ThreeUsdRobot(robot, tree, this.robotOptions());\n\n const loadVisuals = this.options.loadVisuals ?? true;\n const loadCollisions = this.options.loadCollisions ?? false;\n if (loadVisuals || loadCollisions) {\n bindRobotMeshes(stage, robot3d, robot, { loadVisuals, loadCollisions });\n }\n return robot3d;\n }\n\n private async composeStage(\n text: string,\n baseUrl: string,\n resolver: AssetResolver,\n ): Promise<Stage> {\n const composeOptions = this.options.onWarn ? { onWarn: this.options.onWarn } : {};\n return Stage.OpenFromFile(await composeLayer(text, baseUrl, resolver, composeOptions));\n }\n\n private robotOptions(): ThreeUsdRobotOptions {\n return {\n upAxisConversion: this.options.upAxisConversion ?? \"auto\",\n ...(this.options.clampJointLimits !== undefined\n ? { clampJointLimits: this.options.clampJointLimits }\n : {}),\n ...(this.options.unitScale !== undefined ? { unitScale: this.options.unitScale } : {}),\n ...(this.options.applyDriveTargetsAsInitialPose !== undefined\n ? { applyInitialPose: this.options.applyDriveTargetsAsInitialPose }\n : {}),\n };\n }\n\n private extractOptions(): { robotName?: string; onWarn?: (message: string) => void } {\n return {\n ...(this.options.robotName !== undefined ? { robotName: this.options.robotName } : {}),\n ...(this.options.onWarn !== undefined ? { onWarn: this.options.onWarn } : {}),\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/three/axis.ts","../src/three/JointObject.ts","../src/three/LinkObject.ts","../src/three/MaterialBinding.ts","../src/three/MeshBinding.ts","../src/three/ThreeUsdRobot.ts","../src/three/ThreeUsdRobotLoader.ts"],"names":["THREE","THREE2","THREE3","THREE5"],"mappings":"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","file":"index.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 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.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","/**\n * Resolves `UsdShade` material bindings to flat PBR parameters.\n *\n * Follows a prim's (or an ancestor's) `material:binding` to a `Material`, finds\n * its surface `Shader`, and reads constant color/metalness/roughness/opacity\n * inputs. Handles both `UsdPreviewSurface` (`inputs:diffuseColor`, …) and\n * Omniverse `OmniPBR` MDL (`inputs:diffuse_color_constant`, …) input names.\n * Texture inputs and shading networks are not evaluated — constants only.\n */\n\nimport type { Vec3 } from \"../parser/ast.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\n\nexport type ResolvedMaterial = {\n color?: Vec3;\n opacity?: number;\n metalness?: number;\n roughness?: number;\n};\n\nconst DIFFUSE_INPUTS = [\n \"inputs:diffuseColor\", // UsdPreviewSurface\n \"inputs:diffuse_color_constant\", // OmniPBR\n \"inputs:diffuse_tint\",\n \"inputs:base_color\",\n \"inputs:baseColor\",\n];\nconst OPACITY_INPUTS = [\"inputs:opacity\", \"inputs:opacity_constant\"];\nconst METALLIC_INPUTS = [\"inputs:metallic\", \"inputs:metallic_constant\"];\nconst ROUGHNESS_INPUTS = [\"inputs:roughness\", \"inputs:reflection_roughness_constant\"];\n\nconst SURFACE_OUTPUTS = [\"outputs:surface\", \"outputs:mdl:surface\"];\n\n/** Resolve the bound material's flat parameters for `prim`, or `undefined`. */\nexport function resolveBoundMaterial(stage: Stage, prim: Prim): ResolvedMaterial | undefined {\n const materialPath = findBinding(prim);\n if (!materialPath) return undefined;\n const material = stage.GetPrimAtPath(materialPath);\n if (!material) return undefined;\n const shader = findSurfaceShader(material);\n if (!shader) return undefined;\n\n const result: ResolvedMaterial = {};\n const color = firstColor(shader, DIFFUSE_INPUTS);\n if (color) result.color = color;\n const opacity = firstNumber(shader, OPACITY_INPUTS);\n if (opacity !== undefined) result.opacity = opacity;\n const metalness = firstNumber(shader, METALLIC_INPUTS);\n if (metalness !== undefined) result.metalness = metalness;\n const roughness = firstNumber(shader, ROUGHNESS_INPUTS);\n if (roughness !== undefined) result.roughness = roughness;\n return result;\n}\n\n/** Walk up from `prim` to the first ancestor with a `material:binding`. */\nfunction findBinding(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];\n p = p.GetParent();\n }\n return undefined;\n}\n\nfunction findSurfaceShader(material: Prim): Prim | undefined {\n // Prefer the shader connected to a surface output.\n for (const out of SURFACE_OUTPUTS) {\n const conn = material.GetAttribute(out).GetConnections()[0];\n if (conn) {\n const shaderPath = conn.split(\".\")[0]!;\n const shader = material.GetStage().GetPrimAtPath(shaderPath);\n if (shader) return shader;\n }\n }\n // Fallback: the first child Shader prim.\n return material.GetChildren().find((c) => c.GetTypeName() === \"Shader\") ?? undefined;\n}\n\nfunction firstColor(shader: Prim, names: string[]): Vec3 | undefined {\n for (const name of names) {\n const v = shader.GetAttribute(name).Get();\n if (Array.isArray(v) && v.length >= 3 && v.every((n) => typeof n === \"number\")) {\n return [v[0], v[1], v[2]] as Vec3;\n }\n }\n return undefined;\n}\n\nfunction firstNumber(shader: Prim, names: string[]): number | undefined {\n for (const name of names) {\n const v = shader.GetAttribute(name).Get();\n if (typeof v === \"number\") return v;\n }\n return undefined;\n}\n","/**\n * Binds `UsdGeom.Mesh` prims to Three.js geometry and attaches them under the\n * robot's link objects.\n *\n * Triangulates polygons with a simple fan, uses authored per-vertex normals\n * when present (else computes smooth normals), and reads `primvars:st` UVs and\n * `primvars:displayColor`. Geometry is left in stage units; the global\n * `metersPerUnit` scale is applied at the root in M9.\n */\n\nimport * as THREE from \"three\";\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\nimport { resolveBoundMaterial } from \"./MaterialBinding.js\";\nimport type { ThreeUsdRobot } from \"./ThreeUsdRobot.js\";\n\nexport type MeshKind = \"visual\" | \"collision\";\n\nconst DEFAULT_COLOR = 0x9a9a9a;\n\nexport type BindMeshesOptions = {\n loadVisuals?: boolean;\n loadCollisions?: boolean;\n};\n\n/** Build a `BufferGeometry` from a Mesh prim, or `null` if it has no points. */\nexport function buildMeshGeometry(meshPrim: Prim): THREE.BufferGeometry | null {\n const points = meshPrim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return null;\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(flat3(points), 3));\n\n const counts = meshPrim.GetAttribute(\"faceVertexCounts\").Get();\n const indices = meshPrim.GetAttribute(\"faceVertexIndices\").Get();\n if (isNumberArray(counts) && isNumberArray(indices)) {\n geometry.setIndex(triangulate(counts, indices));\n } else if (isNumberArray(indices)) {\n geometry.setIndex(indices.slice());\n }\n\n const normals = meshPrim.GetAttribute(\"normals\").Get();\n if (isVec3Array(normals) && normals.length === points.length) {\n geometry.setAttribute(\"normal\", new THREE.Float32BufferAttribute(flat3(normals), 3));\n } else {\n geometry.computeVertexNormals();\n }\n\n const st = meshPrim.GetAttribute(\"primvars:st\").Get();\n if (isVec2Array(st) && st.length === points.length) {\n geometry.setAttribute(\"uv\", new THREE.Float32BufferAttribute(flat2(st), 2));\n }\n\n return geometry;\n}\n\n/**\n * Build a material for a Mesh prim. Color priority: bound `UsdShade` material\n * (when `stage` is given) → `primvars:displayColor` → default gray. Metalness /\n * roughness / opacity come from the bound material when present.\n */\nexport function buildMeshMaterial(meshPrim: Prim, stage?: Stage): THREE.Material {\n const color = new THREE.Color(DEFAULT_COLOR);\n let metalness = 0.1;\n let roughness = 0.8;\n let opacity = 1;\n\n const bound = stage ? resolveBoundMaterial(stage, meshPrim) : undefined;\n if (bound?.color) {\n color.setRGB(bound.color[0], bound.color[1], bound.color[2]);\n } else {\n const displayColor = meshPrim.GetAttribute(\"primvars:displayColor\").Get();\n if (isVec3Array(displayColor) && displayColor[0]) {\n const [r, g, b] = displayColor[0];\n color.setRGB(r, g, b);\n }\n }\n if (bound?.metalness !== undefined) metalness = bound.metalness;\n if (bound?.roughness !== undefined) roughness = bound.roughness;\n if (bound?.opacity !== undefined) opacity = bound.opacity;\n\n const doubleSided = meshPrim.GetAttribute(\"doubleSided\").Get() === true;\n return new THREE.MeshStandardMaterial({\n color,\n metalness,\n roughness,\n transparent: opacity < 1,\n opacity,\n side: doubleSided ? THREE.DoubleSide : THREE.FrontSide,\n });\n}\n\n/**\n * Attach visual (and optionally collision) meshes to every link of a built\n * {@link ThreeUsdRobot}. Each mesh is positioned by its transform relative to\n * the owning link prim.\n */\nexport function bindRobotMeshes(\n stage: Stage,\n robot3d: ThreeUsdRobot,\n desc: RobotDescription,\n options: BindMeshesOptions = {},\n): void {\n const loadVisuals = options.loadVisuals ?? true;\n const loadCollisions = options.loadCollisions ?? false;\n\n for (const [key, link] of Object.entries(desc.links)) {\n const linkObj = robot3d.getLinkObject(key);\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkObj || !linkPrim) continue;\n\n const collisionSet = new Set(link.collisionPrims ?? []);\n\n if (loadVisuals) {\n for (const meshPath of link.visualPrims) {\n if (collisionSet.has(meshPath)) continue; // collision-only handled below\n attachMesh(stage, linkPrim, meshPath, linkObj, \"visual\");\n }\n }\n if (loadCollisions) {\n for (const meshPath of link.collisionPrims ?? []) {\n attachMesh(stage, linkPrim, meshPath, linkObj, \"collision\");\n }\n }\n }\n}\n\nfunction attachMesh(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n parent: THREE.Object3D,\n kind: MeshKind,\n): void {\n const meshPrim = stage.GetPrimAtPath(meshPath);\n if (!meshPrim) return;\n const geometry = buildMeshGeometry(meshPrim);\n if (!geometry) return;\n\n const mesh = new THREE.Mesh(geometry, buildMeshMaterial(meshPrim, stage));\n mesh.name = meshPrim.GetName();\n mesh.userData.kind = kind;\n mesh.userData.primPath = meshPath;\n // Collision meshes are loaded hidden; reveal via `robot.showCollision = true`.\n if (kind === \"collision\") mesh.visible = false;\n mesh.matrixAutoUpdate = false;\n mesh.matrix.fromArray(relativeTransform(linkPrim, meshPrim));\n mesh.matrixWorldNeedsUpdate = true;\n parent.add(mesh);\n}\n\n/** Accumulated local transform from `linkPrim` (exclusive) down to `meshPrim` (inclusive). */\nfunction relativeTransform(linkPrim: Prim, meshPrim: Prim): Mat4 {\n const chain: Prim[] = [];\n let p: Prim | null = meshPrim;\n const stop = linkPrim.GetPath();\n while (p && p.GetPath() !== stop) {\n chain.push(p);\n p = p.GetParent();\n }\n chain.reverse(); // top-most (just under link) → mesh\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\n// --- triangulation & typed-array helpers -----------------------------------\n\n/** Fan-triangulate USD polygon faces into a flat triangle index list. */\nfunction triangulate(faceVertexCounts: number[], faceVertexIndices: number[]): number[] {\n const tris: number[] = [];\n let offset = 0;\n for (const count of faceVertexCounts) {\n for (let k = 2; k < count; k++) {\n tris.push(\n faceVertexIndices[offset]!,\n faceVertexIndices[offset + k - 1]!,\n faceVertexIndices[offset + k]!,\n );\n }\n offset += count;\n }\n return tris;\n}\n\nfunction flat3(v: Vec3[]): number[] {\n const out = new Array<number>(v.length * 3);\n for (let i = 0; i < v.length; i++) {\n out[i * 3] = v[i]![0];\n out[i * 3 + 1] = v[i]![1];\n out[i * 3 + 2] = v[i]![2];\n }\n return out;\n}\n\nfunction flat2(v: Vec2[]): number[] {\n const out = new Array<number>(v.length * 2);\n for (let i = 0; i < v.length; i++) {\n out[i * 2] = v[i]![0];\n out[i * 2 + 1] = v[i]![1];\n }\n return out;\n}\n\nfunction isNumberArray(v: unknown): v is number[] {\n return Array.isArray(v) && v.every((n) => typeof n === \"number\");\n}\n\nfunction isVec3Array(v: unknown): v is Vec3[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 3);\n}\n\nfunction isVec2Array(v: unknown): v is Vec2[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 2);\n}\n","import * as THREE from \"three\";\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 { JointObject } from \"./JointObject.js\";\nimport { LinkObject } from \"./LinkObject.js\";\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 * Up-axis correction applied at the robot root. `\"auto\"` rotates Z-up assets\n * into the Three.js Y-up scene; `\"Z\"` forces it, `\"Y\"`/`\"none\"` leave the\n * orientation as authored. Default `\"none\"` (the loader defaults to `\"auto\"`).\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 */\nexport class ThreeUsdRobot extends THREE.Object3D {\n readonly isThreeUsdRobot = true;\n readonly robot: RobotDescription;\n readonly tree: KinematicTree;\n readonly clampJointLimits: boolean;\n\n private readonly linkObjects = new Map<string, LinkObject>();\n private readonly jointObjects = new Map<string, JointObject>();\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.\n for (const [key, link] of Object.entries(robot.links)) {\n this.linkObjects.set(key, new LinkObject(link));\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 (Z-up → Y-up) and scale (metersPerUnit × unitScale) the robot 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 conv = options.upAxisConversion ?? \"none\";\n const toY = conv === \"Z\" || (conv === \"auto\" && robot.upAxis === \"Z\");\n if (toY) this.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0), -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 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 }\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) this.add(obj);\n }\n }\n\n // -- Joint control -------------------------------------------------------\n\n /** Set one joint value. Unknown joints are ignored. Returns whether it applied. */\n setJointValue(name: string, value: number): boolean {\n const joint = this.jointObjects.get(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(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(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 getLinkWorldMatrix(name: string): THREE.Matrix4 {\n const obj = this.linkObjects.get(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 getLinkObject(name: string): LinkObject | undefined {\n return this.linkObjects.get(name);\n }\n\n getJointObject(name: string): JointObject | undefined {\n return this.jointObjects.get(name);\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 // -- 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","import type { RobotDescription } from \"../robot/RobotDescription.js\";\nimport { extractRobotDescription } from \"../robot/RobotExtractor.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { type AssetResolver, DefaultAssetResolver } from \"../usd/AssetResolver.js\";\nimport { Stage } from \"../usd/Stage.js\";\nimport { composeLayer } from \"../usd/composition.js\";\nimport { CrateReader } from \"../usd/crate/CrateReader.js\";\nimport { crateToUsdaFile } from \"../usd/crate/toUsdaFile.js\";\nimport { openUsdz } from \"../usd/usdz.js\";\nimport { bindRobotMeshes } from \"./MeshBinding.js\";\nimport { ThreeUsdRobot, type ThreeUsdRobotOptions } from \"./ThreeUsdRobot.js\";\n\nexport type ThreeUsdRobotLoaderOptions = {\n /** Resolver for references / payloads / sublayers (default {@link DefaultAssetResolver}). */\n assetResolver?: AssetResolver;\n /** Render visual meshes (M6). */\n loadVisuals?: boolean;\n /** Render collision meshes (M6). */\n loadCollisions?: boolean;\n /** Up-axis correction strategy (M9). */\n upAxisConversion?: \"auto\" | \"Y\" | \"Z\" | \"none\";\n /** Extra uniform scale multiplied with `metersPerUnit` (M9). */\n unitScale?: number;\n /** Clamp `setJointValue` to authored limits (default `true`). */\n clampJointLimits?: boolean;\n /** Seed joints from drive targets / joint state (M9). */\n applyDriveTargetsAsInitialPose?: boolean;\n /** Override the robot name. */\n robotName?: string;\n /** Receives non-fatal load diagnostics. */\n onWarn?: (message: string) => void;\n};\n\n/**\n * Loads Isaac Sim / OpenUSD robot assets into a controllable {@link ThreeUsdRobot}.\n *\n * Composition (references / payloads / sublayers, M8) is resolved through an\n * {@link AssetResolver}. Mesh rendering is M6; unit / up-axis / initial-pose\n * handling is M9; USDC and variants are M10.\n */\nexport class ThreeUsdRobotLoader {\n readonly options: ThreeUsdRobotLoaderOptions;\n\n constructor(options: ThreeUsdRobotLoaderOptions = {}) {\n this.options = options;\n }\n\n private get resolver(): AssetResolver {\n return this.options.assetResolver ?? new DefaultAssetResolver();\n }\n\n /**\n * Fetch an asset by URL and build the robot. `.usdz` packages are unzipped and\n * composed from their entries; everything else is treated as USDA text.\n */\n async loadAsync(url: string): Promise<ThreeUsdRobot> {\n if (/\\.usdz$/i.test(url)) {\n return this.parseUsdz(await this.fetchRootBytes(url));\n }\n // Fetch bytes so we can detect a binary crate (`.usd` may be USDC or USDA).\n const bytes = await this.fetchRootBytes(url);\n if (CrateReader.isCrate(bytes)) return this.parseCrate(bytes);\n return this.parse(new TextDecoder().decode(bytes), url);\n }\n\n private async fetchRootBytes(url: string): Promise<Uint8Array> {\n const resolver = this.resolver;\n if (resolver.fetchBytes) return resolver.fetchBytes(url);\n return new TextEncoder().encode(await resolver.fetchText(url));\n }\n\n /** Build a robot (composed, with meshes) from USDA source text. */\n async parse(text: string, baseUrl = \"\"): Promise<ThreeUsdRobot> {\n return this.buildFromStage(await this.composeStage(text, baseUrl, this.resolver));\n }\n\n /** Build a robot from the bytes of a `.usdz` package. */\n async parseUsdz(bytes: Uint8Array): Promise<ThreeUsdRobot> {\n const pkg = openUsdz(bytes);\n const rootText = await pkg.resolver.fetchText(pkg.rootEntry);\n return this.buildFromStage(await this.composeStage(rootText, pkg.rootEntry, pkg.resolver));\n }\n\n /** Build a robot from the bytes of a binary crate (`.usdc` / binary `.usd`). */\n parseCrate(bytes: Uint8Array): Promise<ThreeUsdRobot> {\n const file = crateToUsdaFile(new CrateReader(bytes));\n return Promise.resolve(this.buildFromStage(Stage.OpenFromFile(file)));\n }\n\n /** Parse + compose USDA source into the Three.js-independent robot IR. */\n async parseRobotDescription(text: string, baseUrl = \"\"): Promise<RobotDescription> {\n const stage = await this.composeStage(text, baseUrl, this.resolver);\n return extractRobotDescription(stage, this.extractOptions());\n }\n\n private buildFromStage(stage: Stage): ThreeUsdRobot {\n const robot = extractRobotDescription(stage, this.extractOptions());\n const tree = buildKinematicTree(robot);\n const robot3d = new ThreeUsdRobot(robot, tree, this.robotOptions());\n\n const loadVisuals = this.options.loadVisuals ?? true;\n const loadCollisions = this.options.loadCollisions ?? false;\n if (loadVisuals || loadCollisions) {\n bindRobotMeshes(stage, robot3d, robot, { loadVisuals, loadCollisions });\n }\n return robot3d;\n }\n\n private async composeStage(\n text: string,\n baseUrl: string,\n resolver: AssetResolver,\n ): Promise<Stage> {\n const composeOptions = this.options.onWarn ? { onWarn: this.options.onWarn } : {};\n return Stage.OpenFromFile(await composeLayer(text, baseUrl, resolver, composeOptions));\n }\n\n private robotOptions(): ThreeUsdRobotOptions {\n return {\n upAxisConversion: this.options.upAxisConversion ?? \"auto\",\n ...(this.options.clampJointLimits !== undefined\n ? { clampJointLimits: this.options.clampJointLimits }\n : {}),\n ...(this.options.unitScale !== undefined ? { unitScale: this.options.unitScale } : {}),\n ...(this.options.applyDriveTargetsAsInitialPose !== undefined\n ? { applyInitialPose: this.options.applyDriveTargetsAsInitialPose }\n : {}),\n };\n }\n\n private extractOptions(): { robotName?: string; onWarn?: (message: string) => void } {\n return {\n ...(this.options.robotName !== undefined ? { robotName: this.options.robotName } : {}),\n ...(this.options.onWarn !== undefined ? { onWarn: this.options.onWarn } : {}),\n };\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-usd-robot",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Kinematic OpenUSD robot loader for Three.js — load Isaac Sim / OpenUSD robot assets, extract joints and links, and control articulations in the browser.",
5
5
  "type": "module",
6
6
  "license": "MIT",