@lovelace_lol/embody 0.0.14 → 0.0.15

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 CHANGED
@@ -38,6 +38,26 @@ The Rust core owns:
38
38
  - profile-aware screen-space gaze geometry for eye/head AU trajectories
39
39
  - renderer-neutral model analysis and packed live frame generation
40
40
 
41
+ `resolveMorphMeshSelections(profile, categories, availableNames)` resolves editor
42
+ mesh selections in one Rust request. It returns each requested category's effective
43
+ category, `hasSelection` (including explicit empty arrays), resolved loaded names,
44
+ and unresolved configured names. Request `viseme` for speech routing. Facial
45
+ categories share an authored `face` selection; body and hair stay independent.
46
+ Exact names take precedence over legacy mesh aliases. Consumers save concrete
47
+ resolved names plus unresolved names when editing, so deselecting one mesh does
48
+ not reactivate it through a legacy alias. This query does not change the profile.
49
+
50
+ `getAUBoneBindingStates(profile, auIds)` resolves a panel's AU bone links in one
51
+ Rust request and returns an object keyed by AU ID. It uses the existing
52
+ `getAUBoneBindingState` semantics, including custom bone names, axis/range,
53
+ continuum opposites and explicitly cleared bindings. Its profile input contains
54
+ only `auToBones`, `boneNodes`, `bonePrefix`, `boneSuffix`, `suffixPattern`,
55
+ `compositeRotations`, `continuumPairs` and `humanoidCharacterization`.
56
+ The adapter omits unrelated morph/mesh configuration, authored vertices and saved
57
+ clips before serialization. Mesh selection edits do not invalidate these bone
58
+ links; hosts can cache by those bone inputs and the requested AU IDs. This is a
59
+ read-only authoring query, with no rig replacement or playback effects.
60
+
41
61
  The host animation library (Three `AnimationMixer`, Unity Animator, etc.) owns
42
62
  clip playback, lerping, blending, looping, seeking, and crossfades. Rust must
43
63
  not sample or lerp clips on the hot path.
@@ -63,9 +83,18 @@ mesh visibility and material overrides when a host binds or replaces a profile.
63
83
  It applies explicit `visible: false` and `visible: true` even without a material
64
84
  entry, and restores render order, opacity, transparency, depth flags and blending
65
85
  from `material`. Omitted fields leave the model's current values unchanged.
86
+ Replaying identical material values during a mapping edit leaves the material
87
+ version unchanged; render-order-only edits also avoid invalidating material programs.
66
88
  Polymer calls this adapter during model binding and profile replacement; hosts
67
89
  do not need a separate mesh-visibility replay loop.
68
90
 
91
+ `MorphVertexPreview` owns the editor's affected-vertex overlay and updates from
92
+ the existing Three scene render callback. It reuses position/color frame arrays,
93
+ retains samples only for the active hover, and releases old GPU attributes before
94
+ replacing differently sized geometry. Hiding or changing the hover clears its
95
+ sample cache; an explicitly empty mesh selection produces no preview. Applications
96
+ forward hover/show/hide events and dispose the overlay when its scene is released.
97
+
69
98
  ### Annotation runtime
70
99
 
71
100
  `AnnotationRuntime` in `src/annotation_runtime/` owns the annotation behavior
package/dist/index.js CHANGED
@@ -2267,6 +2267,7 @@ var extendCharacterConfigWithPreset = (config) => request2("profile.extendConfig
2267
2267
  var extractProfileOverrides = (config) => request2("profile.extractOverrides", { config });
2268
2268
  var mergeCharacterRegionsByName = (base, override) => request2("profile.mergeRegions", { base, override });
2269
2269
  var getMeshNamesForAUProfile = (profile, auId) => request2("profile.getMeshNamesForAU", { profile, auId });
2270
+ var resolveMorphMeshSelections = (profile, categories, availableNames) => request2("profile.resolveMorphMeshSelections", { profile, categories, availableNames });
2270
2271
  var getHumanoidSpecification = () => request2("humanoid.getSpecification");
2271
2272
  var setAUMorphTargets = (profile, auId, side, targets) => request2("profile.setAUMorphTargets", { profile, auId, side, targets });
2272
2273
  var setHumanoidRoleBinding = (profile, role, boneName) => request2("profile.setHumanoidRoleBinding", { profile, role, boneName });
@@ -2288,6 +2289,19 @@ var getBoneAxisBindingState = (profile, boneName, axis) => request2("bone.getAxi
2288
2289
  var resolveBoneAxisChannel = (profile, boneName, axis) => request2("bone.resolveAxisChannel", { profile, boneName, axis });
2289
2290
  var getBilateralAxisBindingState = (profile, boneName, axis) => request2("bone.getBilateralAxisState", { profile, boneName, axis });
2290
2291
  var getAUBoneBindingState = (profile, auId) => request2("bone.getAUBindingState", { profile, auId });
2292
+ var getAUBoneBindingStates = (profile, auIds) => request2("bone.getAUBindingStates", {
2293
+ profile: {
2294
+ auToBones: profile.auToBones,
2295
+ boneNodes: profile.boneNodes,
2296
+ bonePrefix: profile.bonePrefix,
2297
+ boneSuffix: profile.boneSuffix,
2298
+ suffixPattern: profile.suffixPattern,
2299
+ compositeRotations: profile.compositeRotations,
2300
+ continuumPairs: profile.continuumPairs,
2301
+ humanoidCharacterization: profile.humanoidCharacterization
2302
+ },
2303
+ auIds
2304
+ });
2291
2305
  var inferEyeControlScope = (profile, binding) => request2("bone.inferEyeScope", { profile, binding });
2292
2306
  var inferEyeControlFamily = (binding) => request2("bone.inferEyeFamily", { binding });
2293
2307
  var applyBoneAxisBindingUpdate = (profile, boneName, axis, update) => request2("bone.applyAxisUpdate", { profile, boneName, axis, update });
@@ -2484,16 +2498,18 @@ function withComponentTracks(clip) {
2484
2498
  if (!Number.isInteger(width) || width < 1 || euler && width !== 3) throw new Error(`Invalid component track ${JSON.stringify(track.name)}.`);
2485
2499
  expanded = true;
2486
2500
  return Array.from({ length: width }, (_, component) => {
2487
- const scalar = track.clone();
2488
- scalar.name = `${track.name}[${euler ? ["x", "y", "z"][component] : component}]`;
2489
- scalar.values = track.values.slice(0, track.times.length * parts);
2490
- for (let sample = 0; sample < scalar.values.length; sample += 1) scalar.values[sample] = track.values[sample * width + component];
2501
+ const values = track.values.slice(0, track.times.length * parts);
2502
+ for (let sample = 0; sample < values.length; sample += 1) values[sample] = track.values[sample * width + component];
2503
+ const Track = track.constructor;
2504
+ const scalar = new Track(`${track.name}[${euler ? ["x", "y", "z"][component] : component}]`, track.times.slice(), values);
2505
+ scalar.createInterpolant = track.createInterpolant;
2491
2506
  return scalar;
2492
2507
  });
2493
2508
  });
2494
2509
  if (!expanded) return clip;
2495
- const indexed = clip.clone();
2496
- indexed.tracks = tracks;
2510
+ const Clip = clip.constructor;
2511
+ const indexed = new Clip(clip.name, clip.duration, tracks, clip.blendMode);
2512
+ indexed.userData = JSON.parse(JSON.stringify(clip.userData));
2497
2513
  return indexed;
2498
2514
  }
2499
2515
  function concreteTrackName(target, inspection) {
@@ -6582,7 +6598,7 @@ function getDeltaMagnitudeAtIndex(mesh, morphAttribute, index) {
6582
6598
  return Math.hypot(dx, dy, dz);
6583
6599
  }
6584
6600
  function resolveMorphPreviewMeshes(root, morphName, meshNames) {
6585
- const nameFilter = meshNames?.length ? new Set(meshNames) : null;
6601
+ const nameFilter = meshNames ? new Set(meshNames) : null;
6586
6602
  const meshes = [];
6587
6603
  root.traverse((obj) => {
6588
6604
  const mesh = obj;
@@ -6631,7 +6647,7 @@ function writePointColor(colors, offset, intensity2) {
6631
6647
  colors[offset + 1] = COLOR_LOW.g + (COLOR_HIGH.g - COLOR_LOW.g) * intensity2;
6632
6648
  colors[offset + 2] = COLOR_LOW.b + (COLOR_HIGH.b - COLOR_LOW.b) * intensity2;
6633
6649
  }
6634
- function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {}) {
6650
+ function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {}, previous = null) {
6635
6651
  const threshold = options.threshold ?? DEFAULT_THRESHOLD;
6636
6652
  const maxPoints = options.maxPoints ?? DEFAULT_MAX_POINTS;
6637
6653
  const sampledMeshes = [];
@@ -6648,8 +6664,8 @@ function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {
6648
6664
  pointCount += sample.indices.length;
6649
6665
  }
6650
6666
  if (pointCount === 0) return null;
6651
- const positions = new Float32Array(pointCount * 3);
6652
- const colors = new Float32Array(pointCount * 3);
6667
+ const positions = previous?.positions.length === pointCount * 3 ? previous.positions : new Float32Array(pointCount * 3);
6668
+ const colors = previous?.colors.length === pointCount * 3 ? previous.colors : new Float32Array(pointCount * 3);
6653
6669
  const vertex = new THREE10.Vector3();
6654
6670
  let cursor = 0;
6655
6671
  for (const { mesh, sample } of sampledMeshes) {
@@ -6706,6 +6722,7 @@ var MorphVertexPreview = class {
6706
6722
  __publicField(this, "cache", /* @__PURE__ */ new Map());
6707
6723
  __publicField(this, "points", null);
6708
6724
  __publicField(this, "active", null);
6725
+ __publicField(this, "renderData", null);
6709
6726
  __publicField(this, "disposed", false);
6710
6727
  __publicField(this, "unbindRender", null);
6711
6728
  }
@@ -6715,12 +6732,18 @@ var MorphVertexPreview = class {
6715
6732
  this.hide();
6716
6733
  return;
6717
6734
  }
6735
+ if (this.active?.morphName !== morphName || this.active?.meshNames?.length !== meshNames?.length || meshNames?.some((name, index) => name !== this.active?.meshNames?.[index])) {
6736
+ this.cache.clear();
6737
+ this.renderData = null;
6738
+ }
6718
6739
  this.active = { morphName, meshNames: meshNames?.slice() };
6719
6740
  this.unbindRender ?? (this.unbindRender = bindPreviewRender(this.scene, () => this.update()));
6720
6741
  this.update();
6721
6742
  }
6722
6743
  hide() {
6723
6744
  this.active = null;
6745
+ this.cache.clear();
6746
+ this.renderData = null;
6724
6747
  this.unbindRender?.();
6725
6748
  this.unbindRender = null;
6726
6749
  if (this.points) this.points.visible = false;
@@ -6758,26 +6781,31 @@ var MorphVertexPreview = class {
6758
6781
  if (this.disposed || !this.active) return;
6759
6782
  const { morphName, meshNames } = this.active;
6760
6783
  const meshes = resolveMorphPreviewMeshes(this.scene, morphName, meshNames);
6761
- const data = buildMorphVertexPreviewRenderData(meshes, morphName, this.cache, this.options);
6784
+ const data = buildMorphVertexPreviewRenderData(meshes, morphName, this.cache, this.options, this.renderData);
6785
+ this.renderData = data;
6762
6786
  if (!data) {
6763
6787
  if (this.points) this.points.visible = false;
6764
6788
  return;
6765
6789
  }
6766
6790
  const points = this.points ?? this.createPoints();
6767
- this.updateAttribute(points.geometry, "position", data.positions, data.pointCount);
6768
- this.updateAttribute(points.geometry, "color", data.colors, data.pointCount);
6791
+ this.updateGeometry(points.geometry, data);
6769
6792
  points.geometry.computeBoundingSphere();
6770
6793
  points.material.size = data.pointCount > 6e3 ? 9e-3 : 0.012;
6771
6794
  points.visible = true;
6772
6795
  }
6773
- updateAttribute(geometry, name, values, pointCount) {
6774
- const attribute = geometry.getAttribute(name);
6775
- if (!attribute || attribute.count !== pointCount) {
6776
- geometry.setAttribute(name, new THREE10.BufferAttribute(values, 3));
6796
+ updateGeometry(geometry, data) {
6797
+ const position = geometry.getAttribute("position");
6798
+ const color = geometry.getAttribute("color");
6799
+ if (!position || !color || position.count !== data.pointCount || color.count !== data.pointCount) {
6800
+ if (position || color) geometry.dispose();
6801
+ geometry.setAttribute("position", new THREE10.BufferAttribute(data.positions, 3));
6802
+ geometry.setAttribute("color", new THREE10.BufferAttribute(data.colors, 3));
6777
6803
  return;
6778
6804
  }
6779
- attribute.array.set(values);
6780
- attribute.needsUpdate = true;
6805
+ if (position.array !== data.positions) position.array.set(data.positions);
6806
+ if (color.array !== data.colors) color.array.set(data.colors);
6807
+ position.needsUpdate = true;
6808
+ color.needsUpdate = true;
6781
6809
  }
6782
6810
  };
6783
6811
 
@@ -7033,6 +7061,16 @@ function serializeAnimationClips(model, clips, inspection) {
7033
7061
  const meshIds = new Map(Array.from(inspection.meshBindings, ([id, mesh]) => [mesh, id]));
7034
7062
  const boneIds = new Map(Array.from(inspection.boneBindings, ([id, bone]) => [bone, id]));
7035
7063
  const objectIds = new Map(Array.from(inspection.objectBindings, ([id, object]) => [object, id]));
7064
+ const morphIds = /* @__PURE__ */ new Map();
7065
+ for (const [id, { mesh, index }] of inspection.morphBindings) {
7066
+ let indices = morphIds.get(mesh);
7067
+ if (!indices) {
7068
+ indices = /* @__PURE__ */ new Map();
7069
+ morphIds.set(mesh, indices);
7070
+ }
7071
+ if (!indices.has(index)) indices.set(index, id);
7072
+ }
7073
+ const destinations = /* @__PURE__ */ new Map();
7036
7074
  return clips.map((clip) => {
7037
7075
  const tracks = [];
7038
7076
  const channelKinds = /* @__PURE__ */ new Map();
@@ -7044,7 +7082,11 @@ function serializeAnimationClips(model, clips, inspection) {
7044
7082
  return id;
7045
7083
  };
7046
7084
  withComponentTracks(clip).tracks.forEach((track, index) => {
7047
- const found = findTrackTarget(model, track);
7085
+ let found = destinations.get(track.name);
7086
+ if (found === void 0) {
7087
+ found = findTrackTarget(model, track);
7088
+ destinations.set(track.name, found);
7089
+ }
7048
7090
  if (!found?.object) return;
7049
7091
  const { parsed, object } = found;
7050
7092
  let target = null;
@@ -7053,8 +7095,9 @@ function serializeAnimationClips(model, clips, inspection) {
7053
7095
  const mesh = object;
7054
7096
  const requested = parsed.propertyIndex;
7055
7097
  const indexValue = typeof requested === "number" ? requested : Number.isFinite(Number(requested)) ? Number(requested) : mesh.morphTargetDictionary?.[String(requested)];
7056
- const binding = Array.from(inspection.morphBindings).find(([, entry]) => entry.mesh === mesh && entry.index === indexValue);
7057
- if (binding) target = { kind: "morphTarget", meshId: meshIds.get(mesh), morphTargetId: binding[0] };
7098
+ if (indexValue === void 0) return;
7099
+ const morphTargetId = morphIds.get(mesh)?.get(indexValue);
7100
+ if (morphTargetId !== void 0) target = { kind: "morphTarget", meshId: meshIds.get(mesh), morphTargetId };
7058
7101
  } else if (property === "visible" && object.isMesh) {
7059
7102
  target = { kind: "meshVisibility", meshId: meshIds.get(object) };
7060
7103
  } else {
@@ -7068,7 +7111,7 @@ function serializeAnimationClips(model, clips, inspection) {
7068
7111
  const kind = target.kind === "morphTarget" ? "face" : target.kind === "boneTransform" ? "body" : "scene";
7069
7112
  const cubic = !!track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline;
7070
7113
  const size = track.getValueSize() / (cubic ? 3 : 1);
7071
- if (!Array.from(track.values).every(Number.isFinite)) {
7114
+ if (!track.values.every(Number.isFinite)) {
7072
7115
  throw new Error(`Animation track ${JSON.stringify(track.name)} contains non-finite samples.`);
7073
7116
  }
7074
7117
  const values = cubic ? Array.from(track.times).flatMap((_, key) => Array.from(track.values.slice((key * 3 + 1) * size, (key * 3 + 2) * size))) : Array.from(track.values);
@@ -7322,13 +7365,19 @@ var ThreeFrameApplier = class {
7322
7365
  applyMaterial(mesh, config) {
7323
7366
  if (typeof config.renderOrder === "number") mesh.renderOrder = config.renderOrder;
7324
7367
  for (const material of materials(mesh.material)) {
7325
- if (typeof config.opacity === "number") material.opacity = config.opacity;
7326
- if (typeof config.transparent === "boolean") material.transparent = config.transparent;
7327
- else if (typeof config.opacity === "number" && config.opacity < 1) material.transparent = true;
7328
- if (typeof config.depthWrite === "boolean") material.depthWrite = config.depthWrite;
7329
- if (typeof config.depthTest === "boolean") material.depthTest = config.depthTest;
7330
- if (config.blending) material.blending = THREE_BLENDING_MODES[config.blending];
7331
- material.needsUpdate = true;
7368
+ let changed = false;
7369
+ const assign = (key, value) => {
7370
+ if (material[key] === value) return;
7371
+ material[key] = value;
7372
+ changed = true;
7373
+ };
7374
+ if (typeof config.opacity === "number") assign("opacity", config.opacity);
7375
+ if (typeof config.transparent === "boolean") assign("transparent", config.transparent);
7376
+ else if (typeof config.opacity === "number" && config.opacity < 1) assign("transparent", true);
7377
+ if (typeof config.depthWrite === "boolean") assign("depthWrite", config.depthWrite);
7378
+ if (typeof config.depthTest === "boolean") assign("depthTest", config.depthTest);
7379
+ if (config.blending) assign("blending", THREE_BLENDING_MODES[config.blending]);
7380
+ if (changed) material.needsUpdate = true;
7332
7381
  }
7333
7382
  }
7334
7383
  visitMesh(root, name, visit) {
@@ -7345,6 +7394,6 @@ var collectMorphMeshes = (root) => {
7345
7394
  return meshes;
7346
7395
  };
7347
7396
 
7348
- export { BLENDING_MODES, CHARACTER_SCENE_TYPES, CHARACTER_SCENE_TYPE_IDS, ThreeAnnotationController as CameraController, CameraDOMControls, CameraDOMControls as Controls, DEFAULT_CHARACTER_LIGHTING_PRESETS, DEFAULT_CHARACTER_LIGHTING_PRESET_ID, DEFAULT_CHARACTER_LIGHTING_PRESET_IDS, DEFAULT_CHARACTER_LIGHTING_SETTINGS, DEFAULT_CHARACTER_SCENE_TYPE_ID, DEFAULT_MARKER_AUTO_HIDE_MS, DEFAULT_PREVIEW_AUTO_CLEAR_MS, Embody, HtmlAnnotationMarkers, ThreeAnnotationMarkers as Markers3D, HtmlAnnotationMarkers as MarkersHTML, MorphVertexPreview, HtmlAnnotationMarkers as OverlayAnnotationMarkers, RUNTIME_ANNOTATION_REGION_PREFIX, RustAnnotationCameraCore, SkeletonOverlay, THREE_BLENDING_MODES, ThreeAnnotationController, ThreeAnnotationMarkers, ThreeAnnotations, ThreeFrameApplier, ThreeModelInspector, ThreeNativePlaybackConnector, analyzeModel, applyAUBoneBindingUpdate, applyBilateralAxisBindingUpdate, applyBoneAxisBindingUpdate, applyCharacterModelTransform, bindModelReferencePose, boneResolutionProfile, buildBoneAuOptions, buildMappedBoneInfo, buildMorphVertexPreviewRenderData, buildMorphVertexPreviewSample, buildRegionDisplayOptions, captureModelReferencePose, classifyAuAsJointControl, collectMorphMeshes, collectSkeletonBones, computeHumanoidSkeletonTemplateRestBounds, createAnimationClipFromClipIR, createBilateralBoneAxisAu, createBoneAxisAu, createCharacterHost, createDefaultCharacterLighting, createDefaultCharacterScene, createDefaultCharacterSceneAsync, createDefaultCharacterSceneRuntime, createMarkerLifecycleRevealOptions, createMarkerVisibilityLifecycle, createRuntimeAnnotationPreviewLifecycle, createRustAnnotationCameraCore, createRustEmbodyHost, createRustEmbodyHostUnbound, createScenePlaybackFrame, createShadowPlane, createValidationSkeletonFromHumanoidTemplate, detectAnnotationLaterality, disposeCharacterModel, ensureBilateralBoneNodeKeys, ensureBoneNodeKey, extendCharacterConfigWithPreset, extendModelReferencePose, extractHumanoidSkeletonTemplateFromModel, extractModelData, extractProfileOverrides, filterCameraViewRegions, findModelRoot, findNodeKeyForBone, formatAxisDirectionLabel, formatAxisLabel, fuzzyNameMatch, getAUBoneBindingState, getAxisFromChannel, getBilateralAxisBindingState, getBoneAxisBindingState, getDefaultAnnotationLaterality, getHumanoidSkeletonTemplate, getHumanoidSkeletonTemplateBoneNames, getHumanoidSpecification, getMeshNamesForAUProfile, getModelLocalOrbitAngle, getPreset, getRuntimeAUMeshSideOffset, getRuntimeAUMorphAnchorPoint, getRuntimeAnnotationSide, getSemanticHorizontalSign, getSemanticHorizontalSignForSide, getWorldDirectionForCameraAngle, hasLeftRightMorphs, inferChiralBoneNamePair, inferEyeControlFamily, inferEyeControlScope, inferRuntimeAnnotationPreviewSide, isJointControlAuInfo, isMaxDegreesOnlyAxisBindingUpdate, isMixedAU, isRuntimeAnnotationRegionName, loadCharacterModel, mergeCharacterRegionsByName, normalizeDefaultCharacterLightingSettings, normalizeHairColorAppearance, parseCharacterModel, passesMarkerCameraAngleGate, pickContinuumAnnotationAuId, renderScenePlayback, resolveAnnotationCharacterConfig, resolveBoneAxisChannel, resolveBoneNameForNodeKey, resolveBoneNames, resolveContinuumDisplayLabel, resolveFaceCenter, resolveHumanoidCharacterization, resolveMarkerAnchorRegion, resolveMorphPreviewMeshes, resolveRegionCameraAngle, resolveRegionVisibilityCameraAngle, resolveSkeletonOverlayStartBoneName, resolveVisemeProfile, serializeAnimationClips, setAUMorphTargets, setHumanoidRoleBinding, shouldProjectMarkerAnchorToSurface, shouldUseFaceCenterForMarkerAnchor, stripConfiguredBoneAffixes, supportsRustEmbodyPreset, toWorldDirection, validateHumanoidCharacterization, validateMappings };
7397
+ export { BLENDING_MODES, CHARACTER_SCENE_TYPES, CHARACTER_SCENE_TYPE_IDS, ThreeAnnotationController as CameraController, CameraDOMControls, CameraDOMControls as Controls, DEFAULT_CHARACTER_LIGHTING_PRESETS, DEFAULT_CHARACTER_LIGHTING_PRESET_ID, DEFAULT_CHARACTER_LIGHTING_PRESET_IDS, DEFAULT_CHARACTER_LIGHTING_SETTINGS, DEFAULT_CHARACTER_SCENE_TYPE_ID, DEFAULT_MARKER_AUTO_HIDE_MS, DEFAULT_PREVIEW_AUTO_CLEAR_MS, Embody, HtmlAnnotationMarkers, ThreeAnnotationMarkers as Markers3D, HtmlAnnotationMarkers as MarkersHTML, MorphVertexPreview, HtmlAnnotationMarkers as OverlayAnnotationMarkers, RUNTIME_ANNOTATION_REGION_PREFIX, RustAnnotationCameraCore, SkeletonOverlay, THREE_BLENDING_MODES, ThreeAnnotationController, ThreeAnnotationMarkers, ThreeAnnotations, ThreeFrameApplier, ThreeModelInspector, ThreeNativePlaybackConnector, analyzeModel, applyAUBoneBindingUpdate, applyBilateralAxisBindingUpdate, applyBoneAxisBindingUpdate, applyCharacterModelTransform, bindModelReferencePose, boneResolutionProfile, buildBoneAuOptions, buildMappedBoneInfo, buildMorphVertexPreviewRenderData, buildMorphVertexPreviewSample, buildRegionDisplayOptions, captureModelReferencePose, classifyAuAsJointControl, collectMorphMeshes, collectSkeletonBones, computeHumanoidSkeletonTemplateRestBounds, createAnimationClipFromClipIR, createBilateralBoneAxisAu, createBoneAxisAu, createCharacterHost, createDefaultCharacterLighting, createDefaultCharacterScene, createDefaultCharacterSceneAsync, createDefaultCharacterSceneRuntime, createMarkerLifecycleRevealOptions, createMarkerVisibilityLifecycle, createRuntimeAnnotationPreviewLifecycle, createRustAnnotationCameraCore, createRustEmbodyHost, createRustEmbodyHostUnbound, createScenePlaybackFrame, createShadowPlane, createValidationSkeletonFromHumanoidTemplate, detectAnnotationLaterality, disposeCharacterModel, ensureBilateralBoneNodeKeys, ensureBoneNodeKey, extendCharacterConfigWithPreset, extendModelReferencePose, extractHumanoidSkeletonTemplateFromModel, extractModelData, extractProfileOverrides, filterCameraViewRegions, findModelRoot, findNodeKeyForBone, formatAxisDirectionLabel, formatAxisLabel, fuzzyNameMatch, getAUBoneBindingState, getAUBoneBindingStates, getAxisFromChannel, getBilateralAxisBindingState, getBoneAxisBindingState, getDefaultAnnotationLaterality, getHumanoidSkeletonTemplate, getHumanoidSkeletonTemplateBoneNames, getHumanoidSpecification, getMeshNamesForAUProfile, getModelLocalOrbitAngle, getPreset, getRuntimeAUMeshSideOffset, getRuntimeAUMorphAnchorPoint, getRuntimeAnnotationSide, getSemanticHorizontalSign, getSemanticHorizontalSignForSide, getWorldDirectionForCameraAngle, hasLeftRightMorphs, inferChiralBoneNamePair, inferEyeControlFamily, inferEyeControlScope, inferRuntimeAnnotationPreviewSide, isJointControlAuInfo, isMaxDegreesOnlyAxisBindingUpdate, isMixedAU, isRuntimeAnnotationRegionName, loadCharacterModel, mergeCharacterRegionsByName, normalizeDefaultCharacterLightingSettings, normalizeHairColorAppearance, parseCharacterModel, passesMarkerCameraAngleGate, pickContinuumAnnotationAuId, renderScenePlayback, resolveAnnotationCharacterConfig, resolveBoneAxisChannel, resolveBoneNameForNodeKey, resolveBoneNames, resolveContinuumDisplayLabel, resolveFaceCenter, resolveHumanoidCharacterization, resolveMarkerAnchorRegion, resolveMorphMeshSelections, resolveMorphPreviewMeshes, resolveRegionCameraAngle, resolveRegionVisibilityCameraAngle, resolveSkeletonOverlayStartBoneName, resolveVisemeProfile, serializeAnimationClips, setAUMorphTargets, setHumanoidRoleBinding, shouldProjectMarkerAnchorToSurface, shouldUseFaceCenterForMarkerAnchor, stripConfiguredBoneAffixes, supportsRustEmbodyPreset, toWorldDirection, validateHumanoidCharacterization, validateMappings };
7349
7398
  //# sourceMappingURL=index.js.map
7350
7399
  //# sourceMappingURL=index.js.map