@lovelace_lol/embody 0.0.16 → 0.0.18

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.
@@ -58,8 +58,11 @@ export declare const buildBoneAuOptions: (profile: Partial<Types.Profile>) => Ar
58
58
  value: string;
59
59
  label: string;
60
60
  detail?: string;
61
+ category?: import("@lovelace_lol/embody/wasm").ControlCategory;
62
+ section?: string | null;
63
+ order?: number | null;
61
64
  }>;
62
- export declare const isJointControlAuInfo: (info?: Pick<Types.AUInfo, "facePart"> | null) => boolean;
65
+ export declare const isJointControlAuInfo: (info?: Pick<Types.AUInfo, "facePart" | "category"> | null) => boolean;
63
66
  export declare const classifyAuAsJointControl: (profile: Types.Profile, auId: number, options?: {
64
67
  boneName?: string | null;
65
68
  nodeKey?: string | null;
@@ -96,4 +99,4 @@ export declare function extractHumanoidSkeletonTemplateFromModel(model: Object3D
96
99
  sourceAsset?: string;
97
100
  sourceSkinName?: string;
98
101
  }): Types.HumanoidSkeletonTemplate;
99
- export type { AUDescriptor } from '@lovelace_lol/embody/wasm';
102
+ export type { AUDescriptor, ControlCategory } from '@lovelace_lol/embody/wasm';
@@ -1,4 +1,5 @@
1
1
  import type { Region, MarkerStyle, MarkerGroup, LineConfig, MarkerStyleOverrides } from './annotations/types';
2
+ import type { ControlCategory } from '@lovelace_lol/embody/wasm';
2
3
  export interface AuthoringVector3 {
3
4
  x: number;
4
5
  y: number;
@@ -47,6 +48,10 @@ export interface AUInfo {
47
48
  links?: string[];
48
49
  faceArea?: 'Upper' | 'Lower' | 'Body';
49
50
  facePart?: string;
51
+ category?: ControlCategory | null;
52
+ section?: string | null;
53
+ order?: number | null;
54
+ controlLabel?: string | null;
50
55
  }
51
56
  export interface RotationAxis {
52
57
  aus: number[];
@@ -243,6 +248,8 @@ export interface Profile {
243
248
  visemeTongueTargets?: VisemeTongueTarget[];
244
249
  auMixDefaults?: Record<number, number>;
245
250
  auInfo?: Record<string, AUInfo>;
251
+ /** Legacy metadata spelling retained for authored custom profiles. */
252
+ actionInfo?: Record<string, AUInfo>;
246
253
  eyeMeshNodes?: {
247
254
  LEFT: string;
248
255
  RIGHT: string;
@@ -169,6 +169,8 @@ export declare class ThreeFrameApplier {
169
169
  export declare const collectMorphMeshes: (root: Object3D) => Mesh<import("three").BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>, Material<import("three").MaterialEventMap> | Material<import("three").MaterialEventMap>[], import("three").Object3DEventMap>[];
170
170
  export * from './model';
171
171
  export * from './scene';
172
+ export { acquireCharacterSceneVideoCapture } from './sceneVideoCapture';
173
+ export type { CharacterSceneVideoCapture, CharacterSceneVideoCaptureOptions } from './sceneVideoCapture';
172
174
  export * from './scenery';
173
175
  export * from './editor/SkeletonOverlay';
174
176
  export * from './editor/morphVertexPreview';
@@ -0,0 +1,12 @@
1
+ import type { CharacterSceneRenderingController } from './scene';
2
+ export type CharacterSceneVideoCaptureOptions = {
3
+ fps?: number;
4
+ };
5
+ export type CharacterSceneVideoCapture = {
6
+ readonly stream: MediaStream;
7
+ release(): void;
8
+ };
9
+ /** Internal scene-owner hook: long-lived video must not block model/scenery retirement. */
10
+ export declare function endCharacterSceneVideoCaptures(rendering: CharacterSceneRenderingController): void;
11
+ /** Borrows the managed renderer without drawing, resizing, or replacing its loop. */
12
+ export declare function acquireCharacterSceneVideoCapture(rendering: CharacterSceneRenderingController, options?: CharacterSceneVideoCaptureOptions): CharacterSceneVideoCapture;
package/dist/three.js CHANGED
@@ -5150,6 +5150,111 @@ function disposeSceneBackground(scene) {
5150
5150
  owner.override?.onSceneDispose();
5151
5151
  }
5152
5152
 
5153
+ // three/sceneVideoCapture.ts
5154
+ var activeCaptures = /* @__PURE__ */ new WeakMap();
5155
+ function endCharacterSceneVideoCaptures(rendering) {
5156
+ for (const end of [...activeCaptures.get(rendering) ?? []]) end();
5157
+ }
5158
+ function acquireCharacterSceneVideoCapture(rendering, options = {}) {
5159
+ const fps = options.fps ?? 30;
5160
+ if (!Number.isFinite(fps) || fps < 1 || fps > 60) throw new Error("Video capture frame rate must be between 1 and 60 fps.");
5161
+ if (typeof MutationObserver === "undefined") throw new Error("Canvas size observation is unavailable for video capture.");
5162
+ const lease = rendering.acquireRenderer();
5163
+ const canvas = lease.renderer.domElement;
5164
+ let tracks = [];
5165
+ let unsubscribe = null;
5166
+ let observer = null;
5167
+ let released = false;
5168
+ let leaseReleased = false;
5169
+ const trackListeners = [];
5170
+ const stoppedTracks = /* @__PURE__ */ new Set();
5171
+ const captures = activeCaptures.get(rendering) ?? /* @__PURE__ */ new Set();
5172
+ activeCaptures.set(rendering, captures);
5173
+ const terminate = () => finish(true);
5174
+ captures.add(terminate);
5175
+ function cleanup() {
5176
+ captures.delete(terminate);
5177
+ if (!captures.size && activeCaptures.get(rendering) === captures) activeCaptures.delete(rendering);
5178
+ const observing = observer;
5179
+ observer = null;
5180
+ try {
5181
+ observing?.disconnect();
5182
+ } catch {
5183
+ }
5184
+ const subscribed = unsubscribe;
5185
+ unsubscribe = null;
5186
+ try {
5187
+ subscribed?.();
5188
+ } catch {
5189
+ }
5190
+ for (const remove of trackListeners.splice(0)) {
5191
+ try {
5192
+ remove();
5193
+ } catch {
5194
+ }
5195
+ }
5196
+ for (const track of tracks) {
5197
+ if (stoppedTracks.has(track)) continue;
5198
+ stoppedTracks.add(track);
5199
+ try {
5200
+ track.stop();
5201
+ } catch {
5202
+ }
5203
+ }
5204
+ if (!leaseReleased) {
5205
+ leaseReleased = true;
5206
+ lease.release();
5207
+ }
5208
+ }
5209
+ function finish(notify) {
5210
+ if (released) {
5211
+ cleanup();
5212
+ return;
5213
+ }
5214
+ released = true;
5215
+ const ended = notify ? tracks.filter((track) => track.readyState !== "ended") : [];
5216
+ cleanup();
5217
+ for (const track of ended) {
5218
+ try {
5219
+ track.dispatchEvent(new Event("ended"));
5220
+ } catch {
5221
+ }
5222
+ }
5223
+ }
5224
+ function check(snapshot3) {
5225
+ if (snapshot3.renderer !== lease.renderer || !["ready", "error"].includes(snapshot3.status)) finish(true);
5226
+ }
5227
+ try {
5228
+ if (typeof canvas.captureStream !== "function") throw new Error("This renderer canvas cannot provide a video stream.");
5229
+ const stream = canvas.captureStream(fps);
5230
+ tracks = stream.getTracks();
5231
+ if (released) throw new Error("Video capture ended during canvas acquisition.");
5232
+ if (!stream.getVideoTracks().some((track) => track.readyState === "live")) throw new Error("The renderer canvas did not provide a live video track.");
5233
+ for (const track of tracks) {
5234
+ const ended = () => finish(true);
5235
+ trackListeners.push(() => track.removeEventListener("ended", ended));
5236
+ track.addEventListener("ended", ended);
5237
+ if (released) throw new Error("Video capture ended during acquisition.");
5238
+ }
5239
+ const width = canvas.width, height = canvas.height;
5240
+ unsubscribe = rendering.subscribe(check);
5241
+ if (released) throw new Error("The renderer changed during video capture acquisition.");
5242
+ check(rendering.getSnapshot());
5243
+ if (released) throw new Error("The renderer is unavailable for video capture.");
5244
+ observer = new MutationObserver(() => {
5245
+ if (canvas.width !== width || canvas.height !== height) finish(true);
5246
+ });
5247
+ if (released) throw new Error("Video capture ended during size observer creation.");
5248
+ observer.observe(canvas, { attributes: true, attributeFilter: ["width", "height"] });
5249
+ if (canvas.width !== width || canvas.height !== height) finish(true);
5250
+ if (released) throw new Error("The renderer canvas changed size during video capture acquisition.");
5251
+ return { stream, release: () => finish(false) };
5252
+ } catch (error) {
5253
+ finish(false);
5254
+ throw error;
5255
+ }
5256
+ }
5257
+
5153
5258
  // three/scene.ts
5154
5259
  var DEFAULT_CHARACTER_LIGHTING_PRESETS = {
5155
5260
  cleanStudio: { id: "cleanStudio", label: "Soft Studio", settings: { envMapEnabled: true, environmentIntensity: 0.24, environmentBlur: 0.04, exposure: 1.08, ambientIntensity: 0.32, keyIntensity: 0.52, fillIntensity: 0.18, rimIntensity: 0.08, shadowOpacity: 0.22 } },
@@ -5861,6 +5966,7 @@ function createDefaultCharacterSceneRuntime(container, options = {}) {
5861
5966
  pendingResourceReleases--;
5862
5967
  });
5863
5968
  pending = operation;
5969
+ endCharacterSceneVideoCaptures(rendering);
5864
5970
  void operation.then(() => {
5865
5971
  if (pending === operation) pending = null;
5866
5972
  }, () => {
@@ -8332,6 +8438,6 @@ var collectMorphMeshes = (root) => {
8332
8438
  return meshes;
8333
8439
  };
8334
8440
 
8335
- 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, convertMixamoFbxToVrmAnimations, convertMixamoToVrmAnimation, createAnimationClipFromClipIR, createAnimationClipFromVrmAnimation, createBilateralBoneAxisAu, createBoneAxisAu, createCharacterHost, createDefaultCharacterLighting, createDefaultCharacterScene, createDefaultCharacterSceneAsync, createDefaultCharacterSceneRuntime, createMarkerLifecycleRevealOptions, createMarkerVisibilityLifecycle, createRuntimeAnnotationPreviewLifecycle, createRustAnnotationCameraCore, createRustEmbodyHost, createRustEmbodyHostUnbound, createScenePlaybackFrame, createSceneSceneryRenderer, 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, inspectVrmAnimation, 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 };
8441
+ 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, acquireCharacterSceneVideoCapture, analyzeModel, applyAUBoneBindingUpdate, applyBilateralAxisBindingUpdate, applyBoneAxisBindingUpdate, applyCharacterModelTransform, bindModelReferencePose, boneResolutionProfile, buildBoneAuOptions, buildMappedBoneInfo, buildMorphVertexPreviewRenderData, buildMorphVertexPreviewSample, buildRegionDisplayOptions, captureModelReferencePose, classifyAuAsJointControl, collectMorphMeshes, collectSkeletonBones, computeHumanoidSkeletonTemplateRestBounds, convertMixamoFbxToVrmAnimations, convertMixamoToVrmAnimation, createAnimationClipFromClipIR, createAnimationClipFromVrmAnimation, createBilateralBoneAxisAu, createBoneAxisAu, createCharacterHost, createDefaultCharacterLighting, createDefaultCharacterScene, createDefaultCharacterSceneAsync, createDefaultCharacterSceneRuntime, createMarkerLifecycleRevealOptions, createMarkerVisibilityLifecycle, createRuntimeAnnotationPreviewLifecycle, createRustAnnotationCameraCore, createRustEmbodyHost, createRustEmbodyHostUnbound, createScenePlaybackFrame, createSceneSceneryRenderer, 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, inspectVrmAnimation, 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 };
8336
8442
  //# sourceMappingURL=three.js.map
8337
8443
  //# sourceMappingURL=three.js.map