@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.
- package/README.md +84 -1
- package/dist/index.js +107 -1
- package/dist/index.js.map +1 -1
- package/dist/three/authoring.d.ts +5 -2
- package/dist/three/authoringTypes.d.ts +7 -0
- package/dist/three/index.d.ts +2 -0
- package/dist/three/sceneVideoCapture.d.ts +12 -0
- package/dist/three.js +107 -1
- package/dist/three.js.map +1 -1
- package/dist/wasm/README.md +84 -1
- package/dist/wasm/auDescriptors.d.ts +9 -0
- package/dist/wasm/embody_wasm.d.ts +131 -131
- package/dist/wasm/embody_wasm_bg.wasm +0 -0
- package/dist/wasm/embody_wasm_bg.wasm.d.ts +131 -131
- package/dist/wasm/index.d.ts +1 -1
- package/dist/wasm.js.map +1 -1
- package/model-tools/extract-garment.mjs +599 -0
- package/model-tools/glb-source.mjs +31 -0
- package/model-tools/index.d.ts +21 -0
- package/model-tools/index.mjs +3 -29
- package/package.json +2 -2
|
@@ -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;
|
package/dist/three/index.d.ts
CHANGED
|
@@ -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
|