@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.
@@ -10,6 +10,8 @@ export declare const extendCharacterConfigWithPreset: <T extends Types.ProfileRu
10
10
  export declare const extractProfileOverrides: (config: Types.ProfileRuntimeConfig) => Partial<Types.Profile>;
11
11
  export declare const mergeCharacterRegionsByName: (base?: Region[], override?: Region[]) => Region[];
12
12
  export declare const getMeshNamesForAUProfile: (profile: Types.Profile, auId: number) => string[];
13
+ /** Resolve routing and legacy mesh aliases once for an editor inventory. */
14
+ export declare const resolveMorphMeshSelections: (profile: Partial<Pick<Types.Profile, "morphToMesh" | "visemeMeshCategory">>, categories: string[], availableNames: string[]) => Record<string, Types.MorphMeshSelection>;
13
15
  export declare const getHumanoidSpecification: () => Types.HumanoidSpecification;
14
16
  export declare const setAUMorphTargets: (profile: Types.Profile, auId: number, side: "left" | "right" | "center", targets: Types.MorphTargetRef[]) => Types.Profile;
15
17
  export declare const setHumanoidRoleBinding: (profile: Types.Profile, role: Types.VRMHumanoidRole, boneName: string | null) => Types.Profile;
@@ -34,6 +36,8 @@ export declare const getBoneAxisBindingState: (profile: Types.Profile, boneName:
34
36
  export declare const resolveBoneAxisChannel: (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey) => Types.RotationChannel;
35
37
  export declare const getBilateralAxisBindingState: (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey) => Types.BilateralAxisBindingState | null;
36
38
  export declare const getAUBoneBindingState: (profile: Types.Profile, auId: number) => Types.AUBoneBindingState;
39
+ /** Resolve a panel's bone links without repeatedly serializing its full character. */
40
+ export declare const getAUBoneBindingStates: (profile: Partial<Pick<Types.Profile, "auToBones" | "boneNodes" | "bonePrefix" | "boneSuffix" | "suffixPattern" | "compositeRotations" | "continuumPairs" | "humanoidCharacterization">>, auIds: readonly number[]) => Record<number, Types.AUBoneBindingState>;
37
41
  export declare const inferEyeControlScope: (profile: Pick<Types.Profile, "auToBones">, binding: Pick<Types.BoneAxisBindingState, "nodeKey" | "negativeAuId" | "positiveAuId">) => Types.BoneControlScope | null;
38
42
  export declare const inferEyeControlFamily: (binding: Pick<Types.BoneAxisBindingState, "nodeKey" | "axis">) => Types.BoneControlFamily | null;
39
43
  export declare const applyBoneAxisBindingUpdate: (profile: Types.Profile, boneName: string, axis: Types.BoneAxisKey, update: Types.BoneAxisBindingUpdate) => Types.Profile;
@@ -18,6 +18,13 @@ export type BoneControlScope = 'Both Eyes' | 'Left Eye Only' | 'Right Eye Only';
18
18
  export type HumanoidSkeletonTemplateVec3 = readonly [number, number, number];
19
19
  export type HumanoidSkeletonTemplateBounds = readonly [number, number, number, number, number, number];
20
20
  export type MorphTargetRef = string | number;
21
+ export interface MorphMeshSelection {
22
+ category: string;
23
+ /** Includes an explicit empty selection. */
24
+ hasSelection: boolean;
25
+ resolvedNames: string[];
26
+ unresolvedNames: string[];
27
+ }
21
28
  export type MeshCategory = 'body' | 'eye' | 'eyeOcclusion' | 'tearLine' | 'teeth' | 'tongue' | 'hair' | 'eyebrow' | 'cornea' | 'eyelash';
22
29
  export type BlendingMode = 'Normal' | 'Additive' | 'Subtractive' | 'Multiply' | 'None';
23
30
  export interface MorphTargetsBySide {
@@ -15,7 +15,7 @@ export interface MorphVertexPreviewRenderData {
15
15
  }
16
16
  export declare function resolveMorphPreviewMeshes(root: THREE.Object3D, morphName: string, meshNames?: string[]): THREE.Mesh[];
17
17
  export declare function buildMorphVertexPreviewSample(mesh: THREE.Mesh, morphName: string, options?: MorphVertexPreviewOptions): MorphVertexPreviewSample | null;
18
- export declare function buildMorphVertexPreviewRenderData(meshes: THREE.Mesh[], morphName: string, cache: Map<string, MorphVertexPreviewSample>, options?: MorphVertexPreviewOptions): MorphVertexPreviewRenderData | null;
18
+ export declare function buildMorphVertexPreviewRenderData(meshes: THREE.Mesh[], morphName: string, cache: Map<string, MorphVertexPreviewSample>, options?: MorphVertexPreviewOptions, previous?: MorphVertexPreviewRenderData | null): MorphVertexPreviewRenderData | null;
19
19
  /** Editor overlay sampled by the existing Three render loop, without a separate frame timer. */
20
20
  export declare class MorphVertexPreview {
21
21
  private readonly scene;
@@ -23,6 +23,7 @@ export declare class MorphVertexPreview {
23
23
  private readonly cache;
24
24
  private points;
25
25
  private active;
26
+ private renderData;
26
27
  private disposed;
27
28
  private unbindRender;
28
29
  constructor(scene: THREE.Scene, options?: MorphVertexPreviewOptions);
@@ -31,5 +32,5 @@ export declare class MorphVertexPreview {
31
32
  dispose(): void;
32
33
  private createPoints;
33
34
  private update;
34
- private updateAttribute;
35
+ private updateGeometry;
35
36
  }
package/dist/three.js CHANGED
@@ -2266,6 +2266,7 @@ var extendCharacterConfigWithPreset = (config) => request2("profile.extendConfig
2266
2266
  var extractProfileOverrides = (config) => request2("profile.extractOverrides", { config });
2267
2267
  var mergeCharacterRegionsByName = (base, override) => request2("profile.mergeRegions", { base, override });
2268
2268
  var getMeshNamesForAUProfile = (profile, auId) => request2("profile.getMeshNamesForAU", { profile, auId });
2269
+ var resolveMorphMeshSelections = (profile, categories, availableNames) => request2("profile.resolveMorphMeshSelections", { profile, categories, availableNames });
2269
2270
  var getHumanoidSpecification = () => request2("humanoid.getSpecification");
2270
2271
  var setAUMorphTargets = (profile, auId, side, targets) => request2("profile.setAUMorphTargets", { profile, auId, side, targets });
2271
2272
  var setHumanoidRoleBinding = (profile, role, boneName) => request2("profile.setHumanoidRoleBinding", { profile, role, boneName });
@@ -2287,6 +2288,19 @@ var getBoneAxisBindingState = (profile, boneName, axis) => request2("bone.getAxi
2287
2288
  var resolveBoneAxisChannel = (profile, boneName, axis) => request2("bone.resolveAxisChannel", { profile, boneName, axis });
2288
2289
  var getBilateralAxisBindingState = (profile, boneName, axis) => request2("bone.getBilateralAxisState", { profile, boneName, axis });
2289
2290
  var getAUBoneBindingState = (profile, auId) => request2("bone.getAUBindingState", { profile, auId });
2291
+ var getAUBoneBindingStates = (profile, auIds) => request2("bone.getAUBindingStates", {
2292
+ profile: {
2293
+ auToBones: profile.auToBones,
2294
+ boneNodes: profile.boneNodes,
2295
+ bonePrefix: profile.bonePrefix,
2296
+ boneSuffix: profile.boneSuffix,
2297
+ suffixPattern: profile.suffixPattern,
2298
+ compositeRotations: profile.compositeRotations,
2299
+ continuumPairs: profile.continuumPairs,
2300
+ humanoidCharacterization: profile.humanoidCharacterization
2301
+ },
2302
+ auIds
2303
+ });
2290
2304
  var inferEyeControlScope = (profile, binding) => request2("bone.inferEyeScope", { profile, binding });
2291
2305
  var inferEyeControlFamily = (binding) => request2("bone.inferEyeFamily", { binding });
2292
2306
  var applyBoneAxisBindingUpdate = (profile, boneName, axis, update) => request2("bone.applyAxisUpdate", { profile, boneName, axis, update });
@@ -2483,16 +2497,18 @@ function withComponentTracks(clip) {
2483
2497
  if (!Number.isInteger(width) || width < 1 || euler && width !== 3) throw new Error(`Invalid component track ${JSON.stringify(track.name)}.`);
2484
2498
  expanded = true;
2485
2499
  return Array.from({ length: width }, (_, component) => {
2486
- const scalar = track.clone();
2487
- scalar.name = `${track.name}[${euler ? ["x", "y", "z"][component] : component}]`;
2488
- scalar.values = track.values.slice(0, track.times.length * parts);
2489
- for (let sample = 0; sample < scalar.values.length; sample += 1) scalar.values[sample] = track.values[sample * width + component];
2500
+ const values = track.values.slice(0, track.times.length * parts);
2501
+ for (let sample = 0; sample < values.length; sample += 1) values[sample] = track.values[sample * width + component];
2502
+ const Track = track.constructor;
2503
+ const scalar = new Track(`${track.name}[${euler ? ["x", "y", "z"][component] : component}]`, track.times.slice(), values);
2504
+ scalar.createInterpolant = track.createInterpolant;
2490
2505
  return scalar;
2491
2506
  });
2492
2507
  });
2493
2508
  if (!expanded) return clip;
2494
- const indexed = clip.clone();
2495
- indexed.tracks = tracks;
2509
+ const Clip = clip.constructor;
2510
+ const indexed = new Clip(clip.name, clip.duration, tracks, clip.blendMode);
2511
+ indexed.userData = JSON.parse(JSON.stringify(clip.userData));
2496
2512
  return indexed;
2497
2513
  }
2498
2514
  function concreteTrackName(target, inspection) {
@@ -6581,7 +6597,7 @@ function getDeltaMagnitudeAtIndex(mesh, morphAttribute, index) {
6581
6597
  return Math.hypot(dx, dy, dz);
6582
6598
  }
6583
6599
  function resolveMorphPreviewMeshes(root, morphName, meshNames) {
6584
- const nameFilter = meshNames?.length ? new Set(meshNames) : null;
6600
+ const nameFilter = meshNames ? new Set(meshNames) : null;
6585
6601
  const meshes = [];
6586
6602
  root.traverse((obj) => {
6587
6603
  const mesh = obj;
@@ -6630,7 +6646,7 @@ function writePointColor(colors, offset, intensity2) {
6630
6646
  colors[offset + 1] = COLOR_LOW.g + (COLOR_HIGH.g - COLOR_LOW.g) * intensity2;
6631
6647
  colors[offset + 2] = COLOR_LOW.b + (COLOR_HIGH.b - COLOR_LOW.b) * intensity2;
6632
6648
  }
6633
- function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {}) {
6649
+ function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {}, previous = null) {
6634
6650
  const threshold = options.threshold ?? DEFAULT_THRESHOLD;
6635
6651
  const maxPoints = options.maxPoints ?? DEFAULT_MAX_POINTS;
6636
6652
  const sampledMeshes = [];
@@ -6647,8 +6663,8 @@ function buildMorphVertexPreviewRenderData(meshes, morphName, cache, options = {
6647
6663
  pointCount += sample.indices.length;
6648
6664
  }
6649
6665
  if (pointCount === 0) return null;
6650
- const positions = new Float32Array(pointCount * 3);
6651
- const colors = new Float32Array(pointCount * 3);
6666
+ const positions = previous?.positions.length === pointCount * 3 ? previous.positions : new Float32Array(pointCount * 3);
6667
+ const colors = previous?.colors.length === pointCount * 3 ? previous.colors : new Float32Array(pointCount * 3);
6652
6668
  const vertex = new THREE10.Vector3();
6653
6669
  let cursor = 0;
6654
6670
  for (const { mesh, sample } of sampledMeshes) {
@@ -6705,6 +6721,7 @@ var MorphVertexPreview = class {
6705
6721
  __publicField(this, "cache", /* @__PURE__ */ new Map());
6706
6722
  __publicField(this, "points", null);
6707
6723
  __publicField(this, "active", null);
6724
+ __publicField(this, "renderData", null);
6708
6725
  __publicField(this, "disposed", false);
6709
6726
  __publicField(this, "unbindRender", null);
6710
6727
  }
@@ -6714,12 +6731,18 @@ var MorphVertexPreview = class {
6714
6731
  this.hide();
6715
6732
  return;
6716
6733
  }
6734
+ if (this.active?.morphName !== morphName || this.active?.meshNames?.length !== meshNames?.length || meshNames?.some((name, index) => name !== this.active?.meshNames?.[index])) {
6735
+ this.cache.clear();
6736
+ this.renderData = null;
6737
+ }
6717
6738
  this.active = { morphName, meshNames: meshNames?.slice() };
6718
6739
  this.unbindRender ?? (this.unbindRender = bindPreviewRender(this.scene, () => this.update()));
6719
6740
  this.update();
6720
6741
  }
6721
6742
  hide() {
6722
6743
  this.active = null;
6744
+ this.cache.clear();
6745
+ this.renderData = null;
6723
6746
  this.unbindRender?.();
6724
6747
  this.unbindRender = null;
6725
6748
  if (this.points) this.points.visible = false;
@@ -6757,26 +6780,31 @@ var MorphVertexPreview = class {
6757
6780
  if (this.disposed || !this.active) return;
6758
6781
  const { morphName, meshNames } = this.active;
6759
6782
  const meshes = resolveMorphPreviewMeshes(this.scene, morphName, meshNames);
6760
- const data = buildMorphVertexPreviewRenderData(meshes, morphName, this.cache, this.options);
6783
+ const data = buildMorphVertexPreviewRenderData(meshes, morphName, this.cache, this.options, this.renderData);
6784
+ this.renderData = data;
6761
6785
  if (!data) {
6762
6786
  if (this.points) this.points.visible = false;
6763
6787
  return;
6764
6788
  }
6765
6789
  const points = this.points ?? this.createPoints();
6766
- this.updateAttribute(points.geometry, "position", data.positions, data.pointCount);
6767
- this.updateAttribute(points.geometry, "color", data.colors, data.pointCount);
6790
+ this.updateGeometry(points.geometry, data);
6768
6791
  points.geometry.computeBoundingSphere();
6769
6792
  points.material.size = data.pointCount > 6e3 ? 9e-3 : 0.012;
6770
6793
  points.visible = true;
6771
6794
  }
6772
- updateAttribute(geometry, name, values, pointCount) {
6773
- const attribute = geometry.getAttribute(name);
6774
- if (!attribute || attribute.count !== pointCount) {
6775
- geometry.setAttribute(name, new THREE10.BufferAttribute(values, 3));
6795
+ updateGeometry(geometry, data) {
6796
+ const position = geometry.getAttribute("position");
6797
+ const color = geometry.getAttribute("color");
6798
+ if (!position || !color || position.count !== data.pointCount || color.count !== data.pointCount) {
6799
+ if (position || color) geometry.dispose();
6800
+ geometry.setAttribute("position", new THREE10.BufferAttribute(data.positions, 3));
6801
+ geometry.setAttribute("color", new THREE10.BufferAttribute(data.colors, 3));
6776
6802
  return;
6777
6803
  }
6778
- attribute.array.set(values);
6779
- attribute.needsUpdate = true;
6804
+ if (position.array !== data.positions) position.array.set(data.positions);
6805
+ if (color.array !== data.colors) color.array.set(data.colors);
6806
+ position.needsUpdate = true;
6807
+ color.needsUpdate = true;
6780
6808
  }
6781
6809
  };
6782
6810
 
@@ -7032,6 +7060,16 @@ function serializeAnimationClips(model, clips, inspection) {
7032
7060
  const meshIds = new Map(Array.from(inspection.meshBindings, ([id, mesh]) => [mesh, id]));
7033
7061
  const boneIds = new Map(Array.from(inspection.boneBindings, ([id, bone]) => [bone, id]));
7034
7062
  const objectIds = new Map(Array.from(inspection.objectBindings, ([id, object]) => [object, id]));
7063
+ const morphIds = /* @__PURE__ */ new Map();
7064
+ for (const [id, { mesh, index }] of inspection.morphBindings) {
7065
+ let indices = morphIds.get(mesh);
7066
+ if (!indices) {
7067
+ indices = /* @__PURE__ */ new Map();
7068
+ morphIds.set(mesh, indices);
7069
+ }
7070
+ if (!indices.has(index)) indices.set(index, id);
7071
+ }
7072
+ const destinations = /* @__PURE__ */ new Map();
7035
7073
  return clips.map((clip) => {
7036
7074
  const tracks = [];
7037
7075
  const channelKinds = /* @__PURE__ */ new Map();
@@ -7043,7 +7081,11 @@ function serializeAnimationClips(model, clips, inspection) {
7043
7081
  return id;
7044
7082
  };
7045
7083
  withComponentTracks(clip).tracks.forEach((track, index) => {
7046
- const found = findTrackTarget(model, track);
7084
+ let found = destinations.get(track.name);
7085
+ if (found === void 0) {
7086
+ found = findTrackTarget(model, track);
7087
+ destinations.set(track.name, found);
7088
+ }
7047
7089
  if (!found?.object) return;
7048
7090
  const { parsed, object } = found;
7049
7091
  let target = null;
@@ -7052,8 +7094,9 @@ function serializeAnimationClips(model, clips, inspection) {
7052
7094
  const mesh = object;
7053
7095
  const requested = parsed.propertyIndex;
7054
7096
  const indexValue = typeof requested === "number" ? requested : Number.isFinite(Number(requested)) ? Number(requested) : mesh.morphTargetDictionary?.[String(requested)];
7055
- const binding = Array.from(inspection.morphBindings).find(([, entry]) => entry.mesh === mesh && entry.index === indexValue);
7056
- if (binding) target = { kind: "morphTarget", meshId: meshIds.get(mesh), morphTargetId: binding[0] };
7097
+ if (indexValue === void 0) return;
7098
+ const morphTargetId = morphIds.get(mesh)?.get(indexValue);
7099
+ if (morphTargetId !== void 0) target = { kind: "morphTarget", meshId: meshIds.get(mesh), morphTargetId };
7057
7100
  } else if (property === "visible" && object.isMesh) {
7058
7101
  target = { kind: "meshVisibility", meshId: meshIds.get(object) };
7059
7102
  } else {
@@ -7067,7 +7110,7 @@ function serializeAnimationClips(model, clips, inspection) {
7067
7110
  const kind = target.kind === "morphTarget" ? "face" : target.kind === "boneTransform" ? "body" : "scene";
7068
7111
  const cubic = !!track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline;
7069
7112
  const size = track.getValueSize() / (cubic ? 3 : 1);
7070
- if (!Array.from(track.values).every(Number.isFinite)) {
7113
+ if (!track.values.every(Number.isFinite)) {
7071
7114
  throw new Error(`Animation track ${JSON.stringify(track.name)} contains non-finite samples.`);
7072
7115
  }
7073
7116
  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);
@@ -7321,13 +7364,19 @@ var ThreeFrameApplier = class {
7321
7364
  applyMaterial(mesh, config) {
7322
7365
  if (typeof config.renderOrder === "number") mesh.renderOrder = config.renderOrder;
7323
7366
  for (const material of materials(mesh.material)) {
7324
- if (typeof config.opacity === "number") material.opacity = config.opacity;
7325
- if (typeof config.transparent === "boolean") material.transparent = config.transparent;
7326
- else if (typeof config.opacity === "number" && config.opacity < 1) material.transparent = true;
7327
- if (typeof config.depthWrite === "boolean") material.depthWrite = config.depthWrite;
7328
- if (typeof config.depthTest === "boolean") material.depthTest = config.depthTest;
7329
- if (config.blending) material.blending = THREE_BLENDING_MODES[config.blending];
7330
- material.needsUpdate = true;
7367
+ let changed = false;
7368
+ const assign = (key, value) => {
7369
+ if (material[key] === value) return;
7370
+ material[key] = value;
7371
+ changed = true;
7372
+ };
7373
+ if (typeof config.opacity === "number") assign("opacity", config.opacity);
7374
+ if (typeof config.transparent === "boolean") assign("transparent", config.transparent);
7375
+ else if (typeof config.opacity === "number" && config.opacity < 1) assign("transparent", true);
7376
+ if (typeof config.depthWrite === "boolean") assign("depthWrite", config.depthWrite);
7377
+ if (typeof config.depthTest === "boolean") assign("depthTest", config.depthTest);
7378
+ if (config.blending) assign("blending", THREE_BLENDING_MODES[config.blending]);
7379
+ if (changed) material.needsUpdate = true;
7331
7380
  }
7332
7381
  }
7333
7382
  visitMesh(root, name, visit) {
@@ -7344,6 +7393,6 @@ var collectMorphMeshes = (root) => {
7344
7393
  return meshes;
7345
7394
  };
7346
7395
 
7347
- 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 };
7396
+ 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 };
7348
7397
  //# sourceMappingURL=three.js.map
7349
7398
  //# sourceMappingURL=three.js.map