@lovelace_lol/embody 0.0.6 → 0.0.8
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 +541 -2394
- package/dist/index.d.ts +2 -100
- package/dist/index.js +7714 -12951
- package/dist/index.js.map +1 -1
- package/dist/three/annotations/DOMControls.d.ts +73 -0
- package/dist/three/annotations/DPthree.d.ts +113 -0
- package/dist/three/annotations/DPthree3DMarkers.d.ts +319 -0
- package/dist/three/annotations/DPthreeCameraController.d.ts +414 -0
- package/dist/three/annotations/DPthreeHTMLMarkers.d.ts +131 -0
- package/dist/three/annotations/DPthreeMarkers.d.ts +52 -0
- package/dist/three/annotations/adapter.d.ts +157 -0
- package/dist/three/annotations/animationFrameTaskScheduler.d.ts +18 -0
- package/dist/three/annotations/annotationAnchorModel.d.ts +16 -0
- package/dist/three/annotations/annotationCameraCore.d.ts +5 -0
- package/dist/three/annotations/boneResolutionProfile.d.ts +7 -0
- package/dist/three/annotations/index.d.ts +20 -0
- package/dist/three/annotations/loadFrame.d.ts +2 -0
- package/dist/three/annotations/markerSurfaceRaycast.d.ts +11 -0
- package/dist/three/annotations/markerVisibilityLifecycle.d.ts +21 -0
- package/dist/three/annotations/modelRenderPreparation.d.ts +6 -0
- package/dist/three/annotations/runtimeAnnotationPreview.d.ts +15 -0
- package/dist/three/annotations/runtimeAnnotationPreviewSide.d.ts +10 -0
- package/dist/three/annotations/runtimeAnnotationSidePreview.d.ts +5 -0
- package/dist/three/annotations/types.d.ts +262 -0
- package/dist/three/gaze.d.ts +122 -0
- package/dist/three/index.d.ts +147 -0
- package/dist/three/model.d.ts +31 -0
- package/dist/three/modelSkinning.d.ts +3 -0
- package/dist/three/reference-pose.d.ts +73 -0
- package/dist/three/scene.d.ts +253 -0
- package/dist/three/sceneRenderingBinding.d.ts +22 -0
- package/dist/three.js +7696 -8936
- package/dist/three.js.map +1 -1
- package/dist/wasm/README.md +551 -62
- package/dist/wasm/auto.d.ts +1 -0
- package/dist/wasm/embody_wasm.d.ts +388 -52
- package/dist/wasm/embody_wasm.js +1514 -119
- package/dist/wasm/embody_wasm_bg.wasm +0 -0
- package/dist/wasm/embody_wasm_bg.wasm.d.ts +115 -40
- package/dist/wasm/index.d.ts +126 -0
- package/dist/wasm.d.ts +1 -43
- package/dist/wasm.js +1043 -239
- package/dist/wasm.js.map +1 -1
- package/package.json +34 -39
- package/service-worker/character-asset-service-worker.js +295 -0
- package/dist/authoring/boneAuthoring.d.ts +0 -132
- package/dist/camera/annotationCameraAngles.d.ts +0 -28
- package/dist/camera/cameraRelativeGaze.d.ts +0 -15
- package/dist/camera/rustAnnotationCameraCore.d.ts +0 -136
- package/dist/cljs.cjs +0 -362
- package/dist/cljs.cjs.map +0 -1
- package/dist/cljs.d.ts +0 -5
- package/dist/cljs.js +0 -359
- package/dist/cljs.js.map +0 -1
- package/dist/core/TsClipCompiler.d.ts +0 -51
- package/dist/core/WasmRuntimeCore.d.ts +0 -41
- package/dist/core/compositeAxis.d.ts +0 -4
- package/dist/core/contracts/abi.d.ts +0 -70
- package/dist/core/contracts/clip.d.ts +0 -44
- package/dist/core/contracts/frame.d.ts +0 -27
- package/dist/core/contracts/host.d.ts +0 -28
- package/dist/core/contracts/ids.d.ts +0 -15
- package/dist/core/contracts/index.d.ts +0 -10
- package/dist/core/contracts/model.d.ts +0 -31
- package/dist/core/contracts/primitives.d.ts +0 -17
- package/dist/core/contracts/skeletonFit.d.ts +0 -41
- package/dist/core/index.d.ts +0 -6
- package/dist/core/types.d.ts +0 -472
- package/dist/core.cjs +0 -343
- package/dist/core.cjs.map +0 -1
- package/dist/core.js +0 -323
- package/dist/core.js.map +0 -1
- package/dist/engines/three/Embody.d.ts +0 -372
- package/dist/engines/three/ThreeAnimationRuntime.d.ts +0 -203
- package/dist/engines/three/ThreeClipAdapter.d.ts +0 -24
- package/dist/engines/three/ThreeFrameApplier.d.ts +0 -68
- package/dist/engines/three/ThreeModelInspector.d.ts +0 -54
- package/dist/engines/three/bakedClipPartitioning.d.ts +0 -16
- package/dist/engines/three/balanceUtils.d.ts +0 -3
- package/dist/engines/three/characterHost.d.ts +0 -80
- package/dist/engines/three/characterScene.d.ts +0 -98
- package/dist/engines/three/hair/HairPhysicsController.d.ts +0 -124
- package/dist/engines/three/index.d.ts +0 -20
- package/dist/engines/three/modelLoader.d.ts +0 -61
- package/dist/engines/three/profileTestScene.d.ts +0 -52
- package/dist/engines/three/types.d.ts +0 -20
- package/dist/hair/appearance.d.ts +0 -29
- package/dist/index.cjs +0 -14871
- package/dist/index.cjs.map +0 -1
- package/dist/interfaces/Animation.d.ts +0 -315
- package/dist/interfaces/EmbodyRuntime.d.ts +0 -90
- package/dist/interfaces/Hair.d.ts +0 -181
- package/dist/interfaces/HairPhysics.d.ts +0 -90
- package/dist/interfaces/index.d.ts +0 -11
- package/dist/mappings/extendPresetWithProfile.d.ts +0 -17
- package/dist/mappings/types.d.ts +0 -309
- package/dist/mappings/visemeSystem.d.ts +0 -26
- package/dist/physics/HairPhysics.d.ts +0 -86
- package/dist/physics/RustHairPhysics.d.ts +0 -18
- package/dist/physics/index.d.ts +0 -6
- package/dist/preset.cjs +0 -2005
- package/dist/preset.cjs.map +0 -1
- package/dist/preset.js +0 -2003
- package/dist/preset.js.map +0 -1
- package/dist/presets/bettaFish.d.ts +0 -328
- package/dist/presets/cc4.d.ts +0 -145
- package/dist/presets/index.d.ts +0 -30
- package/dist/presets/registry.d.ts +0 -57
- package/dist/profiles/resolveProfileConfig.d.ts +0 -36
- package/dist/profiles/rustResolvedProfile.d.ts +0 -31
- package/dist/profiles/types.d.ts +0 -118
- package/dist/regions/normalizeRegionTree.d.ts +0 -6
- package/dist/regions/regionMapping.d.ts +0 -17
- package/dist/regions/types.d.ts +0 -122
- package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +0 -32
- package/dist/test/setupWasm.d.ts +0 -1
- package/dist/three.cjs +0 -9550
- package/dist/three.cjs.map +0 -1
- package/dist/validation/analyzeModel.d.ts +0 -68
- package/dist/validation/extractModelData.d.ts +0 -90
- package/dist/validation/generateMappingCorrections.d.ts +0 -32
- package/dist/validation/geometryHelpers.d.ts +0 -66
- package/dist/validation/types.d.ts +0 -10
- package/dist/validation/validateMappings.d.ts +0 -77
- package/dist/wasm.cjs +0 -302
- package/dist/wasm.cjs.map +0 -1
- package/dist/wasmTypes.d.ts +0 -123
package/dist/core.cjs
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
-
|
|
7
|
-
// src/core/contracts/abi.ts
|
|
8
|
-
var PACKED_MORPH_FRAME_DELTA_STRIDE = 4;
|
|
9
|
-
var PACKED_BONE_FRAME_DELTA_STRIDE = 9;
|
|
10
|
-
var PACKED_BONE_FLAG_HAS_POSITION = 1;
|
|
11
|
-
var PACKED_BONE_FLAG_HAS_ROTATION = 2;
|
|
12
|
-
var TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;
|
|
13
|
-
var MESH_PROPORTIONS_STRIDE = 16;
|
|
14
|
-
var TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;
|
|
15
|
-
var TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [
|
|
16
|
-
"scale",
|
|
17
|
-
"translationX",
|
|
18
|
-
"translationY",
|
|
19
|
-
"translationZ"
|
|
20
|
-
];
|
|
21
|
-
var MESH_PROPORTIONS_FIELDS = [
|
|
22
|
-
"minX",
|
|
23
|
-
"minY",
|
|
24
|
-
"minZ",
|
|
25
|
-
"maxX",
|
|
26
|
-
"maxY",
|
|
27
|
-
"maxZ",
|
|
28
|
-
"centerX",
|
|
29
|
-
"centerY",
|
|
30
|
-
"centerZ",
|
|
31
|
-
"spanX",
|
|
32
|
-
"spanY",
|
|
33
|
-
"spanZ",
|
|
34
|
-
"verticalHeight",
|
|
35
|
-
"crossAxisWideSpan",
|
|
36
|
-
"crossAxisNarrowSpan",
|
|
37
|
-
"humanoidLikelihood"
|
|
38
|
-
];
|
|
39
|
-
var TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [
|
|
40
|
-
"scale",
|
|
41
|
-
"translationX",
|
|
42
|
-
"translationY",
|
|
43
|
-
"translationZ",
|
|
44
|
-
"confidence",
|
|
45
|
-
"meshHeight",
|
|
46
|
-
"templateHeight",
|
|
47
|
-
"meshCrossAxisWideSpan",
|
|
48
|
-
"templateCrossAxisWideSpan",
|
|
49
|
-
"status"
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
// src/core/contracts/skeletonFit.ts
|
|
53
|
-
var TEMPLATE_SKELETON_FIT_METADATA_KIND = "template-skeleton-fit";
|
|
54
|
-
var TEMPLATE_SKELETON_FIT_METADATA_VERSION = 1;
|
|
55
|
-
var TEMPLATE_SKELETON_FIT_STATUSES = [
|
|
56
|
-
"unfitted",
|
|
57
|
-
"estimated",
|
|
58
|
-
"manual-adjusted",
|
|
59
|
-
"invalid"
|
|
60
|
-
];
|
|
61
|
-
var TEMPLATE_SKELETON_FIT_VERTICAL_AXES = ["x", "y", "z"];
|
|
62
|
-
var TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = ["min", "center", "max"];
|
|
63
|
-
function isTemplateSkeletonFitStatus(value) {
|
|
64
|
-
return typeof value === "string" && TEMPLATE_SKELETON_FIT_STATUSES.includes(value);
|
|
65
|
-
}
|
|
66
|
-
function composeTemplateSkeletonFitTransform(fit, manualAdjustment = {}) {
|
|
67
|
-
return {
|
|
68
|
-
scale: positiveFiniteOr(fit.scale, 1) * positiveFiniteOr(manualAdjustment.scale ?? 1, 1),
|
|
69
|
-
translation: {
|
|
70
|
-
x: finiteOr(fit.translation.x, 0) + finiteOr(manualAdjustment.translation?.x ?? 0, 0),
|
|
71
|
-
y: finiteOr(fit.translation.y, 0) + finiteOr(manualAdjustment.translation?.y ?? 0, 0),
|
|
72
|
-
z: finiteOr(fit.translation.z, 0) + finiteOr(manualAdjustment.translation?.z ?? 0, 0)
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function validateTemplateSkeletonFitMetadata(metadata) {
|
|
77
|
-
const errors = [];
|
|
78
|
-
if (!isRecord(metadata)) {
|
|
79
|
-
return { valid: false, errors: ["metadata must be an object"] };
|
|
80
|
-
}
|
|
81
|
-
if (metadata.kind !== TEMPLATE_SKELETON_FIT_METADATA_KIND) {
|
|
82
|
-
errors.push(`kind must be "${TEMPLATE_SKELETON_FIT_METADATA_KIND}"`);
|
|
83
|
-
}
|
|
84
|
-
if (metadata.version !== TEMPLATE_SKELETON_FIT_METADATA_VERSION) {
|
|
85
|
-
errors.push(`version must be ${TEMPLATE_SKELETON_FIT_METADATA_VERSION}`);
|
|
86
|
-
}
|
|
87
|
-
if (!isNonEmptyString(metadata.templateId)) {
|
|
88
|
-
errors.push("templateId must be a non-empty string");
|
|
89
|
-
}
|
|
90
|
-
if (!isNonEmptyString(metadata.sourceCharacterId)) {
|
|
91
|
-
errors.push("sourceCharacterId must be a non-empty string");
|
|
92
|
-
}
|
|
93
|
-
if (!TEMPLATE_SKELETON_FIT_VERTICAL_AXES.includes(metadata.verticalAxis)) {
|
|
94
|
-
errors.push(`verticalAxis must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_AXES.join(", ")}`);
|
|
95
|
-
}
|
|
96
|
-
if (!TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.includes(metadata.verticalAnchor)) {
|
|
97
|
-
errors.push(`verticalAnchor must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.join(", ")}`);
|
|
98
|
-
}
|
|
99
|
-
validateFitMetrics(metadata.fit, errors);
|
|
100
|
-
validateManualAdjustment(metadata.manualAdjustment, errors);
|
|
101
|
-
return { valid: errors.length === 0, errors };
|
|
102
|
-
}
|
|
103
|
-
function validateFitMetrics(value, errors) {
|
|
104
|
-
if (!isRecord(value)) {
|
|
105
|
-
errors.push("fit must be an object");
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
if (!isPositiveFiniteNumber(value.scale)) {
|
|
109
|
-
errors.push("fit.scale must be a positive finite number");
|
|
110
|
-
}
|
|
111
|
-
validateVec3(value.translation, "fit.translation", errors);
|
|
112
|
-
if (!isFiniteNumber(value.confidence) || value.confidence < 0 || value.confidence > 1) {
|
|
113
|
-
errors.push("fit.confidence must be a finite number between 0 and 1");
|
|
114
|
-
}
|
|
115
|
-
if (!isPositiveFiniteNumber(value.meshHeight)) {
|
|
116
|
-
errors.push("fit.meshHeight must be a positive finite number");
|
|
117
|
-
}
|
|
118
|
-
if (!isPositiveFiniteNumber(value.templateHeight)) {
|
|
119
|
-
errors.push("fit.templateHeight must be a positive finite number");
|
|
120
|
-
}
|
|
121
|
-
validateVec3(value.crossAxisSpans, "fit.crossAxisSpans", errors, { min: 0 });
|
|
122
|
-
if (!isTemplateSkeletonFitStatus(value.status)) {
|
|
123
|
-
errors.push(`fit.status must be one of: ${TEMPLATE_SKELETON_FIT_STATUSES.join(", ")}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
function validateManualAdjustment(value, errors) {
|
|
127
|
-
if (value == null) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
if (!isRecord(value)) {
|
|
131
|
-
errors.push("manualAdjustment must be an object");
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (value.scale != null && !isPositiveFiniteNumber(value.scale)) {
|
|
135
|
-
errors.push("manualAdjustment.scale must be a positive finite number");
|
|
136
|
-
}
|
|
137
|
-
if (value.translation != null) {
|
|
138
|
-
validateVec3(value.translation, "manualAdjustment.translation", errors);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
function validateVec3(value, field, errors, options = {}) {
|
|
142
|
-
if (!isRecord(value)) {
|
|
143
|
-
errors.push(`${field} must be an object with finite x, y, and z values`);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
for (const axis of ["x", "y", "z"]) {
|
|
147
|
-
const axisValue = value[axis];
|
|
148
|
-
if (!isFiniteNumber(axisValue)) {
|
|
149
|
-
errors.push(`${field}.${axis} must be a finite number`);
|
|
150
|
-
} else if (options.min != null && axisValue < options.min) {
|
|
151
|
-
errors.push(`${field}.${axis} must be a finite number >= ${options.min}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
function isRecord(value) {
|
|
156
|
-
return typeof value === "object" && value != null && !Array.isArray(value);
|
|
157
|
-
}
|
|
158
|
-
function isNonEmptyString(value) {
|
|
159
|
-
return typeof value === "string" && value.trim().length > 0;
|
|
160
|
-
}
|
|
161
|
-
function isFiniteNumber(value) {
|
|
162
|
-
return typeof value === "number" && Number.isFinite(value);
|
|
163
|
-
}
|
|
164
|
-
function isPositiveFiniteNumber(value) {
|
|
165
|
-
return isFiniteNumber(value) && value > 0;
|
|
166
|
-
}
|
|
167
|
-
function finiteOr(value, fallback) {
|
|
168
|
-
return Number.isFinite(value) ? value : fallback;
|
|
169
|
-
}
|
|
170
|
-
function positiveFiniteOr(value, fallback) {
|
|
171
|
-
return Number.isFinite(value) && value > 0 ? value : fallback;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// src/core/TsClipCompiler.ts
|
|
175
|
-
var TsClipCompiler = class {
|
|
176
|
-
constructor(core) {
|
|
177
|
-
this.core = core;
|
|
178
|
-
}
|
|
179
|
-
compile(input) {
|
|
180
|
-
return JSON.parse(this.core.compile_clip(JSON.stringify(input)));
|
|
181
|
-
}
|
|
182
|
-
compileCurves(input) {
|
|
183
|
-
return JSON.parse(this.core.compile_clip_curves(JSON.stringify(input)));
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
function numericArrayToNumbers(values) {
|
|
187
|
-
return Array.from(values);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// src/core/WasmRuntimeCore.ts
|
|
191
|
-
var WasmRuntimeCore = class {
|
|
192
|
-
constructor(options) {
|
|
193
|
-
__publicField(this, "wasm");
|
|
194
|
-
__publicField(this, "core");
|
|
195
|
-
__publicField(this, "allowEmptyBindings");
|
|
196
|
-
__publicField(this, "profile");
|
|
197
|
-
__publicField(this, "model");
|
|
198
|
-
this.wasm = options.wasm;
|
|
199
|
-
this.profile = options.profile;
|
|
200
|
-
this.model = options.model;
|
|
201
|
-
this.allowEmptyBindings = options.allowEmptyBindings ?? false;
|
|
202
|
-
const RuntimeCtor = options.wasm.RuntimeCore;
|
|
203
|
-
if (!RuntimeCtor) {
|
|
204
|
-
throw new Error("Embody Wasm module does not export RuntimeCore");
|
|
205
|
-
}
|
|
206
|
-
this.core = new RuntimeCtor(0);
|
|
207
|
-
this.reloadBindings();
|
|
208
|
-
}
|
|
209
|
-
setProfile(profile) {
|
|
210
|
-
this.profile = profile;
|
|
211
|
-
this.reloadBindings();
|
|
212
|
-
}
|
|
213
|
-
setModelDescriptor(model) {
|
|
214
|
-
this.model = model;
|
|
215
|
-
this.reloadBindings();
|
|
216
|
-
}
|
|
217
|
-
setAU(id, value, balance = 0) {
|
|
218
|
-
this.core.set_au(id >>> 0, value, balance);
|
|
219
|
-
}
|
|
220
|
-
setContinuum(negativeAU, positiveAU, value, balance = 0) {
|
|
221
|
-
this.core.set_continuum(negativeAU >>> 0, positiveAU >>> 0, value, balance);
|
|
222
|
-
}
|
|
223
|
-
transitionAU(id, to, durationMs, balance = Number.NaN) {
|
|
224
|
-
this.core.transition_au(id >>> 0, to, durationMs, balance);
|
|
225
|
-
}
|
|
226
|
-
transitionViseme(visemeIndex, to, durationMs, jawScale = 1) {
|
|
227
|
-
this.core.transition_viseme(visemeIndex >>> 0, to, durationMs, jawScale);
|
|
228
|
-
}
|
|
229
|
-
update(deltaSeconds) {
|
|
230
|
-
return this.core.update(deltaSeconds);
|
|
231
|
-
}
|
|
232
|
-
activeTransitionCount() {
|
|
233
|
-
return this.core.active_transition_count();
|
|
234
|
-
}
|
|
235
|
-
clearTransitions() {
|
|
236
|
-
this.core.clear_transitions();
|
|
237
|
-
}
|
|
238
|
-
getAU(id) {
|
|
239
|
-
return this.core.get_au(id >>> 0);
|
|
240
|
-
}
|
|
241
|
-
setAUMixWeight(id, weight) {
|
|
242
|
-
this.core.set_au_mix_weight(id >>> 0, weight);
|
|
243
|
-
}
|
|
244
|
-
setViseme(visemeIndex, value, jawScale) {
|
|
245
|
-
this.core.set_viseme(visemeIndex >>> 0, value);
|
|
246
|
-
if (jawScale !== void 0) {
|
|
247
|
-
this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
clear() {
|
|
251
|
-
this.core.clear();
|
|
252
|
-
}
|
|
253
|
-
evaluatePackedMorphFrameDelta() {
|
|
254
|
-
return this.core.evaluate_morph_frame_delta();
|
|
255
|
-
}
|
|
256
|
-
evaluatePackedBoneFrameDelta() {
|
|
257
|
-
return this.core.evaluate_bone_frame_delta();
|
|
258
|
-
}
|
|
259
|
-
evaluateMorphFrameDelta(deltaSeconds) {
|
|
260
|
-
return {
|
|
261
|
-
deltaSeconds,
|
|
262
|
-
morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta())
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
evaluateFrameDelta(deltaSeconds) {
|
|
266
|
-
return {
|
|
267
|
-
deltaSeconds,
|
|
268
|
-
morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),
|
|
269
|
-
bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta())
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
reloadBindings() {
|
|
273
|
-
const profileJson = JSON.stringify(this.profile);
|
|
274
|
-
const modelJson = JSON.stringify(this.model);
|
|
275
|
-
if (this.allowEmptyBindings) {
|
|
276
|
-
this.core.configure(profileJson, modelJson);
|
|
277
|
-
} else {
|
|
278
|
-
this.core.configure_with_profile(profileJson, modelJson);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
function unpackBoneFrameDelta(values) {
|
|
283
|
-
const stride = PACKED_BONE_FRAME_DELTA_STRIDE;
|
|
284
|
-
const writes = [];
|
|
285
|
-
for (let index = 0; index + stride <= values.length; index += stride) {
|
|
286
|
-
const flags = values[index + 8] ?? 0;
|
|
287
|
-
const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;
|
|
288
|
-
const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;
|
|
289
|
-
if (!hasPosition && !hasRotation) continue;
|
|
290
|
-
writes.push({
|
|
291
|
-
boneId: values[index],
|
|
292
|
-
transform: {
|
|
293
|
-
...hasPosition ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } } : {},
|
|
294
|
-
...hasRotation ? {
|
|
295
|
-
rotation: {
|
|
296
|
-
x: values[index + 4],
|
|
297
|
-
y: values[index + 5],
|
|
298
|
-
z: values[index + 6],
|
|
299
|
-
w: values[index + 7]
|
|
300
|
-
}
|
|
301
|
-
} : {}
|
|
302
|
-
},
|
|
303
|
-
mode: "absolute",
|
|
304
|
-
space: "local"
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
return writes;
|
|
308
|
-
}
|
|
309
|
-
function unpackMorphFrameDelta(values) {
|
|
310
|
-
const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;
|
|
311
|
-
const writes = [];
|
|
312
|
-
for (let index = 0; index + stride <= values.length; index += stride) {
|
|
313
|
-
writes.push({
|
|
314
|
-
meshId: values[index],
|
|
315
|
-
morphTargetId: values[index + 1],
|
|
316
|
-
value: values[index + 2] ?? 0,
|
|
317
|
-
mode: (values[index + 3] ?? 0) === 1 ? "additive" : "absolute"
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
return writes;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
exports.MESH_PROPORTIONS_FIELDS = MESH_PROPORTIONS_FIELDS;
|
|
324
|
-
exports.MESH_PROPORTIONS_STRIDE = MESH_PROPORTIONS_STRIDE;
|
|
325
|
-
exports.TEMPLATE_SKELETON_FIT_METADATA_KIND = TEMPLATE_SKELETON_FIT_METADATA_KIND;
|
|
326
|
-
exports.TEMPLATE_SKELETON_FIT_METADATA_VERSION = TEMPLATE_SKELETON_FIT_METADATA_VERSION;
|
|
327
|
-
exports.TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;
|
|
328
|
-
exports.TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;
|
|
329
|
-
exports.TEMPLATE_SKELETON_FIT_STATUSES = TEMPLATE_SKELETON_FIT_STATUSES;
|
|
330
|
-
exports.TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;
|
|
331
|
-
exports.TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;
|
|
332
|
-
exports.TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS;
|
|
333
|
-
exports.TEMPLATE_SKELETON_FIT_VERTICAL_AXES = TEMPLATE_SKELETON_FIT_VERTICAL_AXES;
|
|
334
|
-
exports.TsClipCompiler = TsClipCompiler;
|
|
335
|
-
exports.WasmRuntimeCore = WasmRuntimeCore;
|
|
336
|
-
exports.composeTemplateSkeletonFitTransform = composeTemplateSkeletonFitTransform;
|
|
337
|
-
exports.isTemplateSkeletonFitStatus = isTemplateSkeletonFitStatus;
|
|
338
|
-
exports.numericArrayToNumbers = numericArrayToNumbers;
|
|
339
|
-
exports.unpackBoneFrameDelta = unpackBoneFrameDelta;
|
|
340
|
-
exports.unpackMorphFrameDelta = unpackMorphFrameDelta;
|
|
341
|
-
exports.validateTemplateSkeletonFitMetadata = validateTemplateSkeletonFitMetadata;
|
|
342
|
-
//# sourceMappingURL=core.cjs.map
|
|
343
|
-
//# sourceMappingURL=core.cjs.map
|
package/dist/core.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/contracts/abi.ts","../src/core/contracts/skeletonFit.ts","../src/core/TsClipCompiler.ts","../src/core/WasmRuntimeCore.ts"],"names":[],"mappings":"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","file":"core.cjs","sourcesContent":["import type { NumericArray } from './primitives';\n\nexport const EMBODY_CORE_ABI_VERSION = 1;\n\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = 4;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = [\n 'meshId',\n 'morphTargetId',\n 'value',\n 'mode',\n] as const;\n\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = 9;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = [\n 'boneId',\n 'positionX',\n 'positionY',\n 'positionZ',\n 'rotationX',\n 'rotationY',\n 'rotationZ',\n 'rotationW',\n 'flags',\n] as const;\n\n/** Packed bone FrameDelta flags: bit 0 = has position, bit 1 = has rotation. */\nexport const PACKED_BONE_FLAG_HAS_POSITION = 1;\nexport const PACKED_BONE_FLAG_HAS_ROTATION = 2;\n\nexport const HAIR_CONFIG_STRIDE = 11;\nexport const HAIR_STATE_STRIDE = 4;\nexport const HAIR_HEAD_STATE_STRIDE = 5;\nexport const HAIR_MORPH_OUTPUT_STRIDE = 6;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;\nexport const MESH_PROPORTIONS_STRIDE = 16;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = 7;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = 7;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = 3;\nexport const MARKER_ENDPOINT_STRIDE = 3;\n\nexport const HAIR_CONFIG_FIELDS = [\n 'mass',\n 'stiffness',\n 'damping',\n 'gravity',\n 'headInfluence',\n 'windEnabled',\n 'windStrength',\n 'windDirectionX',\n 'windDirectionZ',\n 'windTurbulence',\n 'windFrequency',\n] as const;\n\nexport const HAIR_STATE_FIELDS = ['x', 'z', 'vx', 'vz'] as const;\nexport const HAIR_HEAD_STATE_FIELDS = ['yaw', 'pitch', 'roll', 'yawVelocity', 'pitchVelocity'] as const;\nexport const HAIR_MORPH_OUTPUT_FIELDS = [\n 'L_Hair_Left',\n 'L_Hair_Right',\n 'L_Hair_Front',\n 'R_Hair_Left',\n 'R_Hair_Right',\n 'R_Hair_Front',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n] as const;\nexport const MESH_PROPORTIONS_FIELDS = [\n 'minX',\n 'minY',\n 'minZ',\n 'maxX',\n 'maxY',\n 'maxZ',\n 'centerX',\n 'centerY',\n 'centerZ',\n 'spanX',\n 'spanY',\n 'spanZ',\n 'verticalHeight',\n 'crossAxisWideSpan',\n 'crossAxisNarrowSpan',\n 'humanoidLikelihood',\n] as const;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [\n 'scale',\n 'translationX',\n 'translationY',\n 'translationZ',\n 'confidence',\n 'meshHeight',\n 'templateHeight',\n 'meshCrossAxisWideSpan',\n 'templateCrossAxisWideSpan',\n 'status',\n] as const;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'distance',\n] as const;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = [\n 'positionX',\n 'positionY',\n 'positionZ',\n 'targetX',\n 'targetY',\n 'targetZ',\n 'done',\n] as const;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = [\n 'itemOpacityFactor',\n 'labelScaleFactor',\n 'lineOpacityFactor',\n] as const;\nexport const MARKER_ENDPOINT_FIELDS = ['x', 'y', 'z'] as const;\n\nexport type PackedMorphFrameDeltaField = (typeof PACKED_MORPH_FRAME_DELTA_FIELDS)[number];\nexport type HairConfigField = (typeof HAIR_CONFIG_FIELDS)[number];\nexport type HairStateField = (typeof HAIR_STATE_FIELDS)[number];\nexport type HairHeadStateField = (typeof HAIR_HEAD_STATE_FIELDS)[number];\nexport type HairMorphOutputField = (typeof HAIR_MORPH_OUTPUT_FIELDS)[number];\nexport type TemplateSkeletonFitTransformField = (typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS)[number];\nexport type MeshProportionsField = (typeof MESH_PROPORTIONS_FIELDS)[number];\nexport type TemplateSkeletonFitSolutionField = (typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS)[number];\n\nexport interface PackedMorphFrameDelta {\n readonly abiVersion: typeof EMBODY_CORE_ABI_VERSION;\n readonly stride: typeof PACKED_MORPH_FRAME_DELTA_STRIDE;\n readonly fields: typeof PACKED_MORPH_FRAME_DELTA_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairPhysicsState {\n readonly stride: typeof HAIR_STATE_STRIDE;\n readonly fields: typeof HAIR_STATE_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedHairMorphOutput {\n readonly stride: typeof HAIR_MORPH_OUTPUT_STRIDE;\n readonly fields: typeof HAIR_MORPH_OUTPUT_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitTransform {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedMeshProportions {\n readonly stride: typeof MESH_PROPORTIONS_STRIDE;\n readonly fields: typeof MESH_PROPORTIONS_FIELDS;\n readonly values: NumericArray;\n}\n\nexport interface PackedTemplateSkeletonFitSolution {\n readonly stride: typeof TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\n readonly fields: typeof TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\n readonly values: NumericArray;\n}\n","import type { Vec3 } from './primitives';\n\nexport const TEMPLATE_SKELETON_FIT_METADATA_KIND = 'template-skeleton-fit';\nexport const TEMPLATE_SKELETON_FIT_METADATA_VERSION = 1;\n\nexport const TEMPLATE_SKELETON_FIT_STATUSES = [\n 'unfitted',\n 'estimated',\n 'manual-adjusted',\n 'invalid',\n] as const;\n\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_AXES = ['x', 'y', 'z'] as const;\nexport const TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS = ['min', 'center', 'max'] as const;\n\nexport type TemplateSkeletonFitStatus = (typeof TEMPLATE_SKELETON_FIT_STATUSES)[number];\nexport type TemplateSkeletonFitVerticalAxis = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_AXES)[number];\nexport type TemplateSkeletonFitVerticalAnchor = (typeof TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS)[number];\n\nexport interface TemplateSkeletonFitTransform {\n readonly scale: number;\n readonly translation: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetrics extends TemplateSkeletonFitTransform {\n readonly confidence: number;\n readonly meshHeight: number;\n readonly templateHeight: number;\n readonly crossAxisSpans: Vec3;\n readonly status: TemplateSkeletonFitStatus;\n}\n\nexport interface TemplateSkeletonFitManualAdjustment {\n readonly scale?: number;\n readonly translation?: Vec3;\n}\n\nexport interface TemplateSkeletonFitMetadata {\n readonly kind: typeof TEMPLATE_SKELETON_FIT_METADATA_KIND;\n readonly version: typeof TEMPLATE_SKELETON_FIT_METADATA_VERSION;\n readonly templateId: string;\n readonly sourceCharacterId: string;\n readonly verticalAxis: TemplateSkeletonFitVerticalAxis;\n readonly verticalAnchor: TemplateSkeletonFitVerticalAnchor;\n readonly fit: TemplateSkeletonFitMetrics;\n readonly manualAdjustment?: TemplateSkeletonFitManualAdjustment;\n}\n\nexport interface TemplateSkeletonFitValidationResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport function isTemplateSkeletonFitStatus(value: unknown): value is TemplateSkeletonFitStatus {\n return typeof value === 'string' && TEMPLATE_SKELETON_FIT_STATUSES.includes(value as TemplateSkeletonFitStatus);\n}\n\nexport function composeTemplateSkeletonFitTransform(\n fit: TemplateSkeletonFitTransform,\n manualAdjustment: TemplateSkeletonFitManualAdjustment = {},\n): TemplateSkeletonFitTransform {\n return {\n scale: positiveFiniteOr(fit.scale, 1) * positiveFiniteOr(manualAdjustment.scale ?? 1, 1),\n translation: {\n x: finiteOr(fit.translation.x, 0) + finiteOr(manualAdjustment.translation?.x ?? 0, 0),\n y: finiteOr(fit.translation.y, 0) + finiteOr(manualAdjustment.translation?.y ?? 0, 0),\n z: finiteOr(fit.translation.z, 0) + finiteOr(manualAdjustment.translation?.z ?? 0, 0),\n },\n };\n}\n\nexport function validateTemplateSkeletonFitMetadata(metadata: unknown): TemplateSkeletonFitValidationResult {\n const errors: string[] = [];\n\n if (!isRecord(metadata)) {\n return { valid: false, errors: ['metadata must be an object'] };\n }\n\n if (metadata.kind !== TEMPLATE_SKELETON_FIT_METADATA_KIND) {\n errors.push(`kind must be \"${TEMPLATE_SKELETON_FIT_METADATA_KIND}\"`);\n }\n if (metadata.version !== TEMPLATE_SKELETON_FIT_METADATA_VERSION) {\n errors.push(`version must be ${TEMPLATE_SKELETON_FIT_METADATA_VERSION}`);\n }\n if (!isNonEmptyString(metadata.templateId)) {\n errors.push('templateId must be a non-empty string');\n }\n if (!isNonEmptyString(metadata.sourceCharacterId)) {\n errors.push('sourceCharacterId must be a non-empty string');\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_AXES.includes(metadata.verticalAxis as TemplateSkeletonFitVerticalAxis)) {\n errors.push(`verticalAxis must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_AXES.join(', ')}`);\n }\n if (!TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.includes(metadata.verticalAnchor as TemplateSkeletonFitVerticalAnchor)) {\n errors.push(`verticalAnchor must be one of: ${TEMPLATE_SKELETON_FIT_VERTICAL_ANCHORS.join(', ')}`);\n }\n\n validateFitMetrics(metadata.fit, errors);\n validateManualAdjustment(metadata.manualAdjustment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFitMetrics(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push('fit must be an object');\n return;\n }\n\n if (!isPositiveFiniteNumber(value.scale)) {\n errors.push('fit.scale must be a positive finite number');\n }\n validateVec3(value.translation, 'fit.translation', errors);\n if (!isFiniteNumber(value.confidence) || value.confidence < 0 || value.confidence > 1) {\n errors.push('fit.confidence must be a finite number between 0 and 1');\n }\n if (!isPositiveFiniteNumber(value.meshHeight)) {\n errors.push('fit.meshHeight must be a positive finite number');\n }\n if (!isPositiveFiniteNumber(value.templateHeight)) {\n errors.push('fit.templateHeight must be a positive finite number');\n }\n validateVec3(value.crossAxisSpans, 'fit.crossAxisSpans', errors, { min: 0 });\n if (!isTemplateSkeletonFitStatus(value.status)) {\n errors.push(`fit.status must be one of: ${TEMPLATE_SKELETON_FIT_STATUSES.join(', ')}`);\n }\n}\n\nfunction validateManualAdjustment(value: unknown, errors: string[]): void {\n if (value == null) {\n return;\n }\n if (!isRecord(value)) {\n errors.push('manualAdjustment must be an object');\n return;\n }\n if (value.scale != null && !isPositiveFiniteNumber(value.scale)) {\n errors.push('manualAdjustment.scale must be a positive finite number');\n }\n if (value.translation != null) {\n validateVec3(value.translation, 'manualAdjustment.translation', errors);\n }\n}\n\nfunction validateVec3(\n value: unknown,\n field: string,\n errors: string[],\n options: { min?: number } = {},\n): void {\n if (!isRecord(value)) {\n errors.push(`${field} must be an object with finite x, y, and z values`);\n return;\n }\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const axisValue = value[axis];\n if (!isFiniteNumber(axisValue)) {\n errors.push(`${field}.${axis} must be a finite number`);\n } else if (options.min != null && axisValue < options.min) {\n errors.push(`${field}.${axis} must be a finite number >= ${options.min}`);\n }\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return isFiniteNumber(value) && value > 0;\n}\n\nfunction finiteOr(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction positiveFiniteOr(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n","import type {\n ChannelId,\n ClipChannelIR,\n ClipIR,\n ClipInterpolation,\n ClipTrackTarget,\n ClipTrackValueType,\n NumericArray,\n TrackId,\n} from './contracts';\nimport type { CurvePoint } from './types';\nimport type { EmbodyCoreWasmModule } from '../wasmTypes';\n\nexport interface TsClipCompilerKeyframe {\n readonly time: number;\n readonly value: number | readonly number[];\n}\n\nexport interface TsClipCompilerTrackInput {\n readonly id?: TrackId;\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType: ClipTrackValueType;\n readonly keyframes: readonly TsClipCompilerKeyframe[];\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCompilerInput {\n readonly id?: string;\n readonly name: string;\n readonly durationSeconds?: number;\n readonly channels?: readonly ClipChannelIR[];\n readonly tracks: readonly TsClipCompilerTrackInput[];\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TsClipCurveTarget {\n readonly channelId?: ChannelId;\n readonly target: ClipTrackTarget;\n readonly valueType?: Extract<ClipTrackValueType, 'scalar'>;\n readonly scale?: number;\n readonly interpolation?: ClipInterpolation;\n}\n\nexport interface TsClipCurvesInput {\n readonly id?: string;\n readonly name: string;\n readonly curves: Record<string, readonly CurvePoint[]>;\n readonly targets: Record<string, TsClipCurveTarget | readonly TsClipCurveTarget[]>;\n readonly channels?: readonly ClipChannelIR[];\n readonly durationSeconds?: number;\n readonly intensityScale?: number;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Thin host facade over the Rust clip compiler (`compile_clip` /\n * `compile_clip_curves`). Callers pass the Wasm module from `initEmbodyCore()`.\n */\nexport class TsClipCompiler {\n constructor(private readonly core: EmbodyCoreWasmModule) {}\n\n compile(input: TsClipCompilerInput): ClipIR {\n return JSON.parse(this.core.compile_clip(JSON.stringify(input))) as ClipIR;\n }\n\n compileCurves(input: TsClipCurvesInput): ClipIR {\n return JSON.parse(this.core.compile_clip_curves(JSON.stringify(input))) as ClipIR;\n }\n}\n\nexport function numericArrayToNumbers(values: NumericArray): number[] {\n return Array.from(values);\n}\n","import type {\n BoneFrameDelta,\n BoneId,\n FrameDelta,\n MeshId,\n ModelDescriptor,\n MorphTargetFrameDelta,\n MorphTargetId,\n} from './contracts';\nimport {\n PACKED_BONE_FLAG_HAS_POSITION,\n PACKED_BONE_FLAG_HAS_ROTATION,\n PACKED_BONE_FRAME_DELTA_STRIDE,\n PACKED_MORPH_FRAME_DELTA_STRIDE,\n} from './contracts';\nimport type { Profile } from '../mappings/types';\nimport type { EmbodyCoreWasmModule, WasmRuntimeCoreHandle } from '../wasmTypes';\n\nexport interface WasmRuntimeCoreOptions {\n readonly profile: Profile;\n readonly model: ModelDescriptor;\n readonly wasm: EmbodyCoreWasmModule;\n readonly allowEmptyBindings?: boolean;\n}\n\n/**\n * TypeScript facade over the host-neutral Rust Wasm RuntimeCore.\n * JavaScript only owns JSON handoff and packed FrameDelta unpacking here.\n */\nexport class WasmRuntimeCore {\n private readonly wasm: EmbodyCoreWasmModule;\n private readonly core: WasmRuntimeCoreHandle;\n private readonly allowEmptyBindings: boolean;\n private profile: Profile;\n private model: ModelDescriptor;\n\n constructor(options: WasmRuntimeCoreOptions) {\n this.wasm = options.wasm;\n this.profile = options.profile;\n this.model = options.model;\n this.allowEmptyBindings = options.allowEmptyBindings ?? false;\n const RuntimeCtor = options.wasm.RuntimeCore;\n if (!RuntimeCtor) {\n throw new Error('Embody Wasm module does not export RuntimeCore');\n }\n this.core = new RuntimeCtor(0);\n this.reloadBindings();\n }\n\n setProfile(profile: Profile): void {\n this.profile = profile;\n this.reloadBindings();\n }\n\n setModelDescriptor(model: ModelDescriptor): void {\n this.model = model;\n this.reloadBindings();\n }\n\n setAU(id: number, value: number, balance = 0): void {\n this.core.set_au(id >>> 0, value, balance);\n }\n\n setContinuum(negativeAU: number, positiveAU: number, value: number, balance = 0): void {\n this.core.set_continuum(negativeAU >>> 0, positiveAU >>> 0, value, balance);\n }\n\n transitionAU(id: number, to: number, durationMs: number, balance = Number.NaN): void {\n this.core.transition_au(id >>> 0, to, durationMs, balance);\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs: number, jawScale = 1): void {\n this.core.transition_viseme(visemeIndex >>> 0, to, durationMs, jawScale);\n }\n\n update(deltaSeconds: number): number {\n return this.core.update(deltaSeconds);\n }\n\n activeTransitionCount(): number {\n return this.core.active_transition_count();\n }\n\n clearTransitions(): void {\n this.core.clear_transitions();\n }\n\n getAU(id: number): number {\n return this.core.get_au(id >>> 0);\n }\n\n setAUMixWeight(id: number, weight: number): void {\n this.core.set_au_mix_weight(id >>> 0, weight);\n }\n\n setViseme(visemeIndex: number, value: number, jawScale?: number): void {\n this.core.set_viseme(visemeIndex >>> 0, value);\n if (jawScale !== undefined) {\n this.core.set_viseme_jaw_scale(visemeIndex >>> 0, jawScale);\n }\n }\n\n clear(): void {\n this.core.clear();\n }\n\n evaluatePackedMorphFrameDelta(): Float32Array {\n return this.core.evaluate_morph_frame_delta();\n }\n\n evaluatePackedBoneFrameDelta(): Float32Array {\n return this.core.evaluate_bone_frame_delta();\n }\n\n evaluateMorphFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n };\n }\n\n evaluateFrameDelta(deltaSeconds?: number): FrameDelta {\n return {\n deltaSeconds,\n morphTargets: unpackMorphFrameDelta(this.evaluatePackedMorphFrameDelta()),\n bones: unpackBoneFrameDelta(this.evaluatePackedBoneFrameDelta()),\n };\n }\n\n private reloadBindings(): void {\n const profileJson = JSON.stringify(this.profile);\n const modelJson = JSON.stringify(this.model);\n if (this.allowEmptyBindings) {\n this.core.configure(profileJson, modelJson);\n } else {\n this.core.configure_with_profile(profileJson, modelJson);\n }\n }\n}\n\nexport function unpackBoneFrameDelta(values: ArrayLike<number>): BoneFrameDelta[] {\n const stride = PACKED_BONE_FRAME_DELTA_STRIDE;\n const writes: BoneFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n const flags = values[index + 8] ?? 0;\n const hasPosition = (flags & PACKED_BONE_FLAG_HAS_POSITION) !== 0;\n const hasRotation = (flags & PACKED_BONE_FLAG_HAS_ROTATION) !== 0;\n if (!hasPosition && !hasRotation) continue;\n writes.push({\n boneId: values[index] as BoneId,\n transform: {\n ...(hasPosition\n ? { position: { x: values[index + 1], y: values[index + 2], z: values[index + 3] } }\n : {}),\n ...(hasRotation\n ? {\n rotation: {\n x: values[index + 4],\n y: values[index + 5],\n z: values[index + 6],\n w: values[index + 7],\n },\n }\n : {}),\n },\n mode: 'absolute',\n space: 'local',\n });\n }\n return writes;\n}\n\nexport function unpackMorphFrameDelta(values: ArrayLike<number>): MorphTargetFrameDelta[] {\n const stride = PACKED_MORPH_FRAME_DELTA_STRIDE;\n const writes: MorphTargetFrameDelta[] = [];\n for (let index = 0; index + stride <= values.length; index += stride) {\n writes.push({\n meshId: values[index] as MeshId,\n morphTargetId: values[index + 1] as MorphTargetId,\n value: values[index + 2] ?? 0,\n mode: (values[index + 3] ?? 0) === 1 ? 'additive' : 'absolute',\n });\n }\n return writes;\n}\n"]}
|