@lovelace_lol/embody 0.0.1

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.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2411 -0
  3. package/dist/authoring/boneAuthoring.d.ts +132 -0
  4. package/dist/camera/annotationCameraAngles.d.ts +28 -0
  5. package/dist/camera/cameraRelativeGaze.d.ts +15 -0
  6. package/dist/camera/rustAnnotationCameraCore.d.ts +136 -0
  7. package/dist/cljs.cjs +362 -0
  8. package/dist/cljs.cjs.map +1 -0
  9. package/dist/cljs.d.ts +5 -0
  10. package/dist/cljs.js +359 -0
  11. package/dist/cljs.js.map +1 -0
  12. package/dist/core/TsClipCompiler.d.ts +51 -0
  13. package/dist/core/TsRuntimeCore.d.ts +40 -0
  14. package/dist/core/WasmRuntimeCore.d.ts +55 -0
  15. package/dist/core/compositeAxis.d.ts +4 -0
  16. package/dist/core/contracts/abi.d.ts +70 -0
  17. package/dist/core/contracts/clip.d.ts +44 -0
  18. package/dist/core/contracts/frame.d.ts +27 -0
  19. package/dist/core/contracts/host.d.ts +28 -0
  20. package/dist/core/contracts/ids.d.ts +15 -0
  21. package/dist/core/contracts/index.d.ts +10 -0
  22. package/dist/core/contracts/model.d.ts +31 -0
  23. package/dist/core/contracts/primitives.d.ts +17 -0
  24. package/dist/core/contracts/skeletonFit.d.ts +41 -0
  25. package/dist/core/index.d.ts +8 -0
  26. package/dist/core/types.d.ts +472 -0
  27. package/dist/core.cjs +1065 -0
  28. package/dist/core.cjs.map +1 -0
  29. package/dist/core.js +1040 -0
  30. package/dist/core.js.map +1 -0
  31. package/dist/engines/three/Embody.d.ts +373 -0
  32. package/dist/engines/three/ThreeAnimationRuntime.d.ts +203 -0
  33. package/dist/engines/three/ThreeClipAdapter.d.ts +24 -0
  34. package/dist/engines/three/ThreeFrameApplier.d.ts +68 -0
  35. package/dist/engines/three/ThreeModelInspector.d.ts +54 -0
  36. package/dist/engines/three/bakedClipPartitioning.d.ts +16 -0
  37. package/dist/engines/three/balanceUtils.d.ts +3 -0
  38. package/dist/engines/three/characterHost.d.ts +80 -0
  39. package/dist/engines/three/characterScene.d.ts +98 -0
  40. package/dist/engines/three/hair/HairPhysicsController.d.ts +124 -0
  41. package/dist/engines/three/index.d.ts +20 -0
  42. package/dist/engines/three/modelLoader.d.ts +61 -0
  43. package/dist/engines/three/profileTestScene.d.ts +52 -0
  44. package/dist/engines/three/types.d.ts +20 -0
  45. package/dist/hair/appearance.d.ts +29 -0
  46. package/dist/index.cjs +15431 -0
  47. package/dist/index.cjs.map +1 -0
  48. package/dist/index.d.ts +100 -0
  49. package/dist/index.js +15141 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interfaces/Animation.d.ts +315 -0
  52. package/dist/interfaces/EmbodyRuntime.d.ts +90 -0
  53. package/dist/interfaces/Hair.d.ts +181 -0
  54. package/dist/interfaces/HairPhysics.d.ts +90 -0
  55. package/dist/interfaces/index.d.ts +11 -0
  56. package/dist/mappings/extendPresetWithProfile.d.ts +17 -0
  57. package/dist/mappings/types.d.ts +309 -0
  58. package/dist/mappings/visemeSystem.d.ts +26 -0
  59. package/dist/physics/HairPhysics.d.ts +86 -0
  60. package/dist/physics/RustHairPhysics.d.ts +18 -0
  61. package/dist/physics/index.d.ts +6 -0
  62. package/dist/preset.cjs +2000 -0
  63. package/dist/preset.cjs.map +1 -0
  64. package/dist/preset.js +1997 -0
  65. package/dist/preset.js.map +1 -0
  66. package/dist/presets/bettaFish.d.ts +328 -0
  67. package/dist/presets/cc4.d.ts +145 -0
  68. package/dist/presets/index.d.ts +27 -0
  69. package/dist/profiles/resolveProfileConfig.d.ts +36 -0
  70. package/dist/profiles/types.d.ts +118 -0
  71. package/dist/regions/normalizeRegionTree.d.ts +6 -0
  72. package/dist/regions/regionMapping.d.ts +17 -0
  73. package/dist/regions/types.d.ts +122 -0
  74. package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +32 -0
  75. package/dist/test/setupWasm.d.ts +1 -0
  76. package/dist/three.cjs +10115 -0
  77. package/dist/three.cjs.map +1 -0
  78. package/dist/three.js +10086 -0
  79. package/dist/three.js.map +1 -0
  80. package/dist/validation/analyzeModel.d.ts +68 -0
  81. package/dist/validation/extractModelData.d.ts +90 -0
  82. package/dist/validation/generateMappingCorrections.d.ts +32 -0
  83. package/dist/validation/geometryHelpers.d.ts +66 -0
  84. package/dist/validation/types.d.ts +10 -0
  85. package/dist/validation/validateMappings.d.ts +77 -0
  86. package/dist/wasm/LICENSE +21 -0
  87. package/dist/wasm/README.md +72 -0
  88. package/dist/wasm/embody_wasm.d.ts +531 -0
  89. package/dist/wasm/embody_wasm.js +1635 -0
  90. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  91. package/dist/wasm/embody_wasm_bg.wasm.d.ts +107 -0
  92. package/dist/wasm.cjs +302 -0
  93. package/dist/wasm.cjs.map +1 -0
  94. package/dist/wasm.d.ts +43 -0
  95. package/dist/wasm.js +268 -0
  96. package/dist/wasm.js.map +1 -0
  97. package/dist/wasmTypes.d.ts +121 -0
  98. package/package.json +99 -0
package/dist/wasm.js ADDED
@@ -0,0 +1,268 @@
1
+ // src/core/contracts/abi.ts
2
+ var EMBODY_CORE_ABI_VERSION = 1;
3
+ var PACKED_MORPH_FRAME_DELTA_STRIDE = 4;
4
+ var PACKED_MORPH_FRAME_DELTA_FIELDS = [
5
+ "meshId",
6
+ "morphTargetId",
7
+ "value",
8
+ "mode"
9
+ ];
10
+ var PACKED_BONE_FRAME_DELTA_STRIDE = 9;
11
+ var PACKED_BONE_FRAME_DELTA_FIELDS = [
12
+ "boneId",
13
+ "positionX",
14
+ "positionY",
15
+ "positionZ",
16
+ "rotationX",
17
+ "rotationY",
18
+ "rotationZ",
19
+ "rotationW",
20
+ "flags"
21
+ ];
22
+ var HAIR_CONFIG_STRIDE = 11;
23
+ var HAIR_STATE_STRIDE = 4;
24
+ var HAIR_HEAD_STATE_STRIDE = 5;
25
+ var HAIR_MORPH_OUTPUT_STRIDE = 6;
26
+ var TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = 4;
27
+ var MESH_PROPORTIONS_STRIDE = 16;
28
+ var TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = 10;
29
+ var ANNOTATION_CAMERA_FRAMING_STRIDE = 7;
30
+ var CAMERA_FLIGHT_SAMPLE_STRIDE = 7;
31
+ var MARKER_VISIBILITY_FACTORS_STRIDE = 3;
32
+ var MARKER_ENDPOINT_STRIDE = 3;
33
+ var HAIR_CONFIG_FIELDS = [
34
+ "mass",
35
+ "stiffness",
36
+ "damping",
37
+ "gravity",
38
+ "headInfluence",
39
+ "windEnabled",
40
+ "windStrength",
41
+ "windDirectionX",
42
+ "windDirectionZ",
43
+ "windTurbulence",
44
+ "windFrequency"
45
+ ];
46
+ var HAIR_STATE_FIELDS = ["x", "z", "vx", "vz"];
47
+ var HAIR_HEAD_STATE_FIELDS = ["yaw", "pitch", "roll", "yawVelocity", "pitchVelocity"];
48
+ var HAIR_MORPH_OUTPUT_FIELDS = [
49
+ "L_Hair_Left",
50
+ "L_Hair_Right",
51
+ "L_Hair_Front",
52
+ "R_Hair_Left",
53
+ "R_Hair_Right",
54
+ "R_Hair_Front"
55
+ ];
56
+ var TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = [
57
+ "scale",
58
+ "translationX",
59
+ "translationY",
60
+ "translationZ"
61
+ ];
62
+ var MESH_PROPORTIONS_FIELDS = [
63
+ "minX",
64
+ "minY",
65
+ "minZ",
66
+ "maxX",
67
+ "maxY",
68
+ "maxZ",
69
+ "centerX",
70
+ "centerY",
71
+ "centerZ",
72
+ "spanX",
73
+ "spanY",
74
+ "spanZ",
75
+ "verticalHeight",
76
+ "crossAxisWideSpan",
77
+ "crossAxisNarrowSpan",
78
+ "humanoidLikelihood"
79
+ ];
80
+ var TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = [
81
+ "scale",
82
+ "translationX",
83
+ "translationY",
84
+ "translationZ",
85
+ "confidence",
86
+ "meshHeight",
87
+ "templateHeight",
88
+ "meshCrossAxisWideSpan",
89
+ "templateCrossAxisWideSpan",
90
+ "status"
91
+ ];
92
+ var ANNOTATION_CAMERA_FRAMING_FIELDS = [
93
+ "positionX",
94
+ "positionY",
95
+ "positionZ",
96
+ "targetX",
97
+ "targetY",
98
+ "targetZ",
99
+ "distance"
100
+ ];
101
+ var CAMERA_FLIGHT_SAMPLE_FIELDS = [
102
+ "positionX",
103
+ "positionY",
104
+ "positionZ",
105
+ "targetX",
106
+ "targetY",
107
+ "targetZ",
108
+ "done"
109
+ ];
110
+ var MARKER_VISIBILITY_FACTORS_FIELDS = [
111
+ "itemOpacityFactor",
112
+ "labelScaleFactor",
113
+ "lineOpacityFactor"
114
+ ];
115
+ var MARKER_ENDPOINT_FIELDS = ["x", "y", "z"];
116
+
117
+ // src/wasm.ts
118
+ var EMBODY_CORE_ABI_VERSION2 = EMBODY_CORE_ABI_VERSION;
119
+ var PACKED_MORPH_FRAME_DELTA_STRIDE2 = PACKED_MORPH_FRAME_DELTA_STRIDE;
120
+ var PACKED_MORPH_FRAME_DELTA_FIELDS2 = PACKED_MORPH_FRAME_DELTA_FIELDS;
121
+ var PACKED_BONE_FRAME_DELTA_STRIDE2 = PACKED_BONE_FRAME_DELTA_STRIDE;
122
+ var PACKED_BONE_FRAME_DELTA_FIELDS2 = PACKED_BONE_FRAME_DELTA_FIELDS;
123
+ var HAIR_CONFIG_STRIDE2 = HAIR_CONFIG_STRIDE;
124
+ var HAIR_CONFIG_FIELDS2 = HAIR_CONFIG_FIELDS;
125
+ var HAIR_STATE_STRIDE2 = HAIR_STATE_STRIDE;
126
+ var HAIR_STATE_FIELDS2 = HAIR_STATE_FIELDS;
127
+ var HAIR_HEAD_STATE_STRIDE2 = HAIR_HEAD_STATE_STRIDE;
128
+ var HAIR_HEAD_STATE_FIELDS2 = HAIR_HEAD_STATE_FIELDS;
129
+ var HAIR_MORPH_OUTPUT_STRIDE2 = HAIR_MORPH_OUTPUT_STRIDE;
130
+ var HAIR_MORPH_OUTPUT_FIELDS2 = HAIR_MORPH_OUTPUT_FIELDS;
131
+ var MESH_PROPORTIONS_STRIDE2 = MESH_PROPORTIONS_STRIDE;
132
+ var MESH_PROPORTIONS_FIELDS2 = MESH_PROPORTIONS_FIELDS;
133
+ var TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE2 = TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;
134
+ var TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS2 = TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;
135
+ var TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE2 = TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;
136
+ var TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS2 = TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;
137
+ var ANNOTATION_CAMERA_FRAMING_STRIDE2 = ANNOTATION_CAMERA_FRAMING_STRIDE;
138
+ var ANNOTATION_CAMERA_FRAMING_FIELDS2 = ANNOTATION_CAMERA_FRAMING_FIELDS;
139
+ var CAMERA_FLIGHT_SAMPLE_STRIDE2 = CAMERA_FLIGHT_SAMPLE_STRIDE;
140
+ var CAMERA_FLIGHT_SAMPLE_FIELDS2 = CAMERA_FLIGHT_SAMPLE_FIELDS;
141
+ var MARKER_VISIBILITY_FACTORS_STRIDE2 = MARKER_VISIBILITY_FACTORS_STRIDE;
142
+ var MARKER_VISIBILITY_FACTORS_FIELDS2 = MARKER_VISIBILITY_FACTORS_FIELDS;
143
+ var MARKER_ENDPOINT_STRIDE2 = MARKER_ENDPOINT_STRIDE;
144
+ var MARKER_ENDPOINT_FIELDS2 = MARKER_ENDPOINT_FIELDS;
145
+ var WASM_MODULE_SPECIFIER = "./wasm/embody_wasm.js";
146
+ var WASM_BINARY_SPECIFIER = "./wasm/embody_wasm_bg.wasm";
147
+ var corePromise = null;
148
+ var cachedCore = null;
149
+ async function initEmbodyCore() {
150
+ if (!corePromise) {
151
+ corePromise = loadCoreModule().catch((error) => {
152
+ corePromise = null;
153
+ cachedCore = null;
154
+ throw error;
155
+ });
156
+ }
157
+ return corePromise;
158
+ }
159
+ async function getEmbodyCore() {
160
+ return initEmbodyCore();
161
+ }
162
+ function requireInitializedEmbodyCore() {
163
+ if (!cachedCore) {
164
+ throw new Error(
165
+ "Embody Wasm core is not initialized. Await initEmbodyCore() before calling sync engine helpers."
166
+ );
167
+ }
168
+ return cachedCore;
169
+ }
170
+ function resetEmbodyCoreForTests() {
171
+ corePromise = null;
172
+ cachedCore = null;
173
+ }
174
+ function setEmbodyCoreForTests(mod) {
175
+ assertCoreAbi(mod);
176
+ cachedCore = mod;
177
+ corePromise = Promise.resolve(mod);
178
+ }
179
+ async function loadCoreModule() {
180
+ const mod = await importGeneratedWasmModule();
181
+ if (typeof mod.default === "function") {
182
+ await mod.default({ module_or_path: await resolveWasmInitInput() });
183
+ }
184
+ assertCoreAbi(mod);
185
+ cachedCore = mod;
186
+ return mod;
187
+ }
188
+ async function importGeneratedWasmModule() {
189
+ const dynamicImport = (
190
+ /** @type {(specifier: string) => Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */
191
+ new Function("specifier", "return import(specifier)")
192
+ );
193
+ try {
194
+ return await dynamicImport(resolveWasmModuleSpecifier());
195
+ } catch (error) {
196
+ const message = error instanceof Error ? error.message : String(error);
197
+ throw new Error(
198
+ `Unable to load Embody Wasm core from generated package artifacts. Run "npm run build" before using @lovelace_lol/embody/wasm. Cause: ${message}`
199
+ );
200
+ }
201
+ }
202
+ function resolveWasmModuleSpecifier() {
203
+ if (typeof import.meta.url === "string" && import.meta.url.length > 0) {
204
+ return new URL(WASM_MODULE_SPECIFIER, import.meta.url).href;
205
+ }
206
+ return WASM_MODULE_SPECIFIER;
207
+ }
208
+ async function resolveWasmInitInput() {
209
+ if (!isNodeLikeRuntime()) {
210
+ return void 0;
211
+ }
212
+ const binaryUrl = resolveWasmBinarySpecifier();
213
+ if (!binaryUrl.startsWith("file:")) {
214
+ return void 0;
215
+ }
216
+ const dynamicImport = (
217
+ /** @type {(specifier: string) => Promise<any>} */
218
+ new Function("specifier", "return import(specifier)")
219
+ );
220
+ const [{ readFile }, { fileURLToPath }] = await Promise.all([
221
+ dynamicImport("node:fs/promises"),
222
+ dynamicImport("node:url")
223
+ ]);
224
+ return readFile(fileURLToPath(binaryUrl));
225
+ }
226
+ function resolveWasmBinarySpecifier() {
227
+ if (typeof import.meta.url === "string" && import.meta.url.length > 0) {
228
+ return new URL(WASM_BINARY_SPECIFIER, import.meta.url).href;
229
+ }
230
+ return WASM_BINARY_SPECIFIER;
231
+ }
232
+ function isNodeLikeRuntime() {
233
+ const runtime = (
234
+ /** @type {{ process?: { versions?: { node?: string } } }} */
235
+ globalThis
236
+ );
237
+ return Boolean(runtime.process?.versions?.node);
238
+ }
239
+ function assertCoreAbi(mod) {
240
+ const version = mod.core_abi_version();
241
+ if (version !== EMBODY_CORE_ABI_VERSION2) {
242
+ throw new Error(`Unsupported Embody Wasm ABI version ${version}; expected ${EMBODY_CORE_ABI_VERSION2}.`);
243
+ }
244
+ const checks = [
245
+ ["packed morph frame delta", mod.packed_morph_frame_delta_stride(), PACKED_MORPH_FRAME_DELTA_STRIDE2],
246
+ ["packed bone frame delta", mod.packed_bone_frame_delta_stride(), PACKED_BONE_FRAME_DELTA_STRIDE2],
247
+ ["hair config", mod.hair_config_stride(), HAIR_CONFIG_STRIDE2],
248
+ ["hair state", mod.hair_state_stride(), HAIR_STATE_STRIDE2],
249
+ ["hair head state", mod.hair_head_state_stride(), HAIR_HEAD_STATE_STRIDE2],
250
+ ["hair morph output", mod.hair_morph_output_stride(), HAIR_MORPH_OUTPUT_STRIDE2],
251
+ ["mesh proportions", mod.mesh_proportions_stride(), MESH_PROPORTIONS_STRIDE2],
252
+ ["template skeleton fit solution", mod.template_skeleton_fit_solution_stride(), TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE2],
253
+ ["template skeleton fit transform", mod.template_skeleton_fit_transform_stride(), TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE2],
254
+ ["annotation camera framing", mod.annotation_camera_framing_stride(), ANNOTATION_CAMERA_FRAMING_STRIDE2],
255
+ ["camera flight sample", mod.camera_flight_sample_stride(), CAMERA_FLIGHT_SAMPLE_STRIDE2],
256
+ ["marker visibility factors", mod.marker_visibility_factors_stride(), MARKER_VISIBILITY_FACTORS_STRIDE2],
257
+ ["marker endpoint", mod.marker_endpoint_stride(), MARKER_ENDPOINT_STRIDE2]
258
+ ];
259
+ for (const [name, actual, expected] of checks) {
260
+ if (actual !== expected) {
261
+ throw new Error(`Unsupported Embody Wasm ${name} stride ${actual}; expected ${expected}.`);
262
+ }
263
+ }
264
+ }
265
+
266
+ export { ANNOTATION_CAMERA_FRAMING_FIELDS2 as ANNOTATION_CAMERA_FRAMING_FIELDS, ANNOTATION_CAMERA_FRAMING_STRIDE2 as ANNOTATION_CAMERA_FRAMING_STRIDE, CAMERA_FLIGHT_SAMPLE_FIELDS2 as CAMERA_FLIGHT_SAMPLE_FIELDS, CAMERA_FLIGHT_SAMPLE_STRIDE2 as CAMERA_FLIGHT_SAMPLE_STRIDE, EMBODY_CORE_ABI_VERSION2 as EMBODY_CORE_ABI_VERSION, HAIR_CONFIG_FIELDS2 as HAIR_CONFIG_FIELDS, HAIR_CONFIG_STRIDE2 as HAIR_CONFIG_STRIDE, HAIR_HEAD_STATE_FIELDS2 as HAIR_HEAD_STATE_FIELDS, HAIR_HEAD_STATE_STRIDE2 as HAIR_HEAD_STATE_STRIDE, HAIR_MORPH_OUTPUT_FIELDS2 as HAIR_MORPH_OUTPUT_FIELDS, HAIR_MORPH_OUTPUT_STRIDE2 as HAIR_MORPH_OUTPUT_STRIDE, HAIR_STATE_FIELDS2 as HAIR_STATE_FIELDS, HAIR_STATE_STRIDE2 as HAIR_STATE_STRIDE, MARKER_ENDPOINT_FIELDS2 as MARKER_ENDPOINT_FIELDS, MARKER_ENDPOINT_STRIDE2 as MARKER_ENDPOINT_STRIDE, MARKER_VISIBILITY_FACTORS_FIELDS2 as MARKER_VISIBILITY_FACTORS_FIELDS, MARKER_VISIBILITY_FACTORS_STRIDE2 as MARKER_VISIBILITY_FACTORS_STRIDE, MESH_PROPORTIONS_FIELDS2 as MESH_PROPORTIONS_FIELDS, MESH_PROPORTIONS_STRIDE2 as MESH_PROPORTIONS_STRIDE, PACKED_BONE_FRAME_DELTA_FIELDS2 as PACKED_BONE_FRAME_DELTA_FIELDS, PACKED_BONE_FRAME_DELTA_STRIDE2 as PACKED_BONE_FRAME_DELTA_STRIDE, PACKED_MORPH_FRAME_DELTA_FIELDS2 as PACKED_MORPH_FRAME_DELTA_FIELDS, PACKED_MORPH_FRAME_DELTA_STRIDE2 as PACKED_MORPH_FRAME_DELTA_STRIDE, TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS2 as TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS, TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE2 as TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE, TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS2 as TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS, TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE2 as TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE, getEmbodyCore, initEmbodyCore, requireInitializedEmbodyCore, resetEmbodyCoreForTests, setEmbodyCoreForTests };
267
+ //# sourceMappingURL=wasm.js.map
268
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/contracts/abi.ts","../src/wasm.ts"],"names":["EMBODY_CORE_ABI_VERSION","PACKED_MORPH_FRAME_DELTA_STRIDE","PACKED_MORPH_FRAME_DELTA_FIELDS","PACKED_BONE_FRAME_DELTA_STRIDE","PACKED_BONE_FRAME_DELTA_FIELDS","HAIR_CONFIG_STRIDE","HAIR_CONFIG_FIELDS","HAIR_STATE_STRIDE","HAIR_STATE_FIELDS","HAIR_HEAD_STATE_STRIDE","HAIR_HEAD_STATE_FIELDS","HAIR_MORPH_OUTPUT_STRIDE","HAIR_MORPH_OUTPUT_FIELDS","MESH_PROPORTIONS_STRIDE","MESH_PROPORTIONS_FIELDS","TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE","TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS","TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE","TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS","ANNOTATION_CAMERA_FRAMING_STRIDE","ANNOTATION_CAMERA_FRAMING_FIELDS","CAMERA_FLIGHT_SAMPLE_STRIDE","CAMERA_FLIGHT_SAMPLE_FIELDS","MARKER_VISIBILITY_FACTORS_STRIDE","MARKER_VISIBILITY_FACTORS_FIELDS","MARKER_ENDPOINT_STRIDE","MARKER_ENDPOINT_FIELDS"],"mappings":"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","file":"wasm.js","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","// @ts-nocheck\nimport {\n ANNOTATION_CAMERA_FRAMING_FIELDS as CORE_ANNOTATION_CAMERA_FRAMING_FIELDS,\n ANNOTATION_CAMERA_FRAMING_STRIDE as CORE_ANNOTATION_CAMERA_FRAMING_STRIDE,\n CAMERA_FLIGHT_SAMPLE_FIELDS as CORE_CAMERA_FLIGHT_SAMPLE_FIELDS,\n CAMERA_FLIGHT_SAMPLE_STRIDE as CORE_CAMERA_FLIGHT_SAMPLE_STRIDE,\n EMBODY_CORE_ABI_VERSION as CORE_ABI_VERSION,\n HAIR_CONFIG_FIELDS as CORE_HAIR_CONFIG_FIELDS,\n HAIR_CONFIG_STRIDE as CORE_HAIR_CONFIG_STRIDE,\n HAIR_HEAD_STATE_FIELDS as CORE_HAIR_HEAD_STATE_FIELDS,\n HAIR_HEAD_STATE_STRIDE as CORE_HAIR_HEAD_STATE_STRIDE,\n HAIR_MORPH_OUTPUT_FIELDS as CORE_HAIR_MORPH_OUTPUT_FIELDS,\n HAIR_MORPH_OUTPUT_STRIDE as CORE_HAIR_MORPH_OUTPUT_STRIDE,\n HAIR_STATE_FIELDS as CORE_HAIR_STATE_FIELDS,\n HAIR_STATE_STRIDE as CORE_HAIR_STATE_STRIDE,\n MARKER_VISIBILITY_FACTORS_FIELDS as CORE_MARKER_VISIBILITY_FACTORS_FIELDS,\n MARKER_VISIBILITY_FACTORS_STRIDE as CORE_MARKER_VISIBILITY_FACTORS_STRIDE,\n MARKER_ENDPOINT_FIELDS as CORE_MARKER_ENDPOINT_FIELDS,\n MARKER_ENDPOINT_STRIDE as CORE_MARKER_ENDPOINT_STRIDE,\n MESH_PROPORTIONS_FIELDS as CORE_MESH_PROPORTIONS_FIELDS,\n MESH_PROPORTIONS_STRIDE as CORE_MESH_PROPORTIONS_STRIDE,\n PACKED_MORPH_FRAME_DELTA_FIELDS as CORE_PACKED_MORPH_FRAME_DELTA_FIELDS,\n PACKED_MORPH_FRAME_DELTA_STRIDE as CORE_PACKED_MORPH_FRAME_DELTA_STRIDE,\n PACKED_BONE_FRAME_DELTA_FIELDS as CORE_PACKED_BONE_FRAME_DELTA_FIELDS,\n PACKED_BONE_FRAME_DELTA_STRIDE as CORE_PACKED_BONE_FRAME_DELTA_STRIDE,\n TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS as CORE_TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS,\n TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE as CORE_TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE,\n TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS as CORE_TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS,\n TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE as CORE_TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE,\n} from './core/contracts';\n\nexport const EMBODY_CORE_ABI_VERSION = CORE_ABI_VERSION;\nexport const PACKED_MORPH_FRAME_DELTA_STRIDE = CORE_PACKED_MORPH_FRAME_DELTA_STRIDE;\nexport const PACKED_MORPH_FRAME_DELTA_FIELDS = CORE_PACKED_MORPH_FRAME_DELTA_FIELDS;\nexport const PACKED_BONE_FRAME_DELTA_STRIDE = CORE_PACKED_BONE_FRAME_DELTA_STRIDE;\nexport const PACKED_BONE_FRAME_DELTA_FIELDS = CORE_PACKED_BONE_FRAME_DELTA_FIELDS;\nexport const HAIR_CONFIG_STRIDE = CORE_HAIR_CONFIG_STRIDE;\nexport const HAIR_CONFIG_FIELDS = CORE_HAIR_CONFIG_FIELDS;\nexport const HAIR_STATE_STRIDE = CORE_HAIR_STATE_STRIDE;\nexport const HAIR_STATE_FIELDS = CORE_HAIR_STATE_FIELDS;\nexport const HAIR_HEAD_STATE_STRIDE = CORE_HAIR_HEAD_STATE_STRIDE;\nexport const HAIR_HEAD_STATE_FIELDS = CORE_HAIR_HEAD_STATE_FIELDS;\nexport const HAIR_MORPH_OUTPUT_STRIDE = CORE_HAIR_MORPH_OUTPUT_STRIDE;\nexport const HAIR_MORPH_OUTPUT_FIELDS = CORE_HAIR_MORPH_OUTPUT_FIELDS;\nexport const MESH_PROPORTIONS_STRIDE = CORE_MESH_PROPORTIONS_STRIDE;\nexport const MESH_PROPORTIONS_FIELDS = CORE_MESH_PROPORTIONS_FIELDS;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE = CORE_TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE;\nexport const TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS = CORE_TEMPLATE_SKELETON_FIT_SOLUTION_FIELDS;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE = CORE_TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE;\nexport const TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS = CORE_TEMPLATE_SKELETON_FIT_TRANSFORM_FIELDS;\nexport const ANNOTATION_CAMERA_FRAMING_STRIDE = CORE_ANNOTATION_CAMERA_FRAMING_STRIDE;\nexport const ANNOTATION_CAMERA_FRAMING_FIELDS = CORE_ANNOTATION_CAMERA_FRAMING_FIELDS;\nexport const CAMERA_FLIGHT_SAMPLE_STRIDE = CORE_CAMERA_FLIGHT_SAMPLE_STRIDE;\nexport const CAMERA_FLIGHT_SAMPLE_FIELDS = CORE_CAMERA_FLIGHT_SAMPLE_FIELDS;\nexport const MARKER_VISIBILITY_FACTORS_STRIDE = CORE_MARKER_VISIBILITY_FACTORS_STRIDE;\nexport const MARKER_VISIBILITY_FACTORS_FIELDS = CORE_MARKER_VISIBILITY_FACTORS_FIELDS;\nexport const MARKER_ENDPOINT_STRIDE = CORE_MARKER_ENDPOINT_STRIDE;\nexport const MARKER_ENDPOINT_FIELDS = CORE_MARKER_ENDPOINT_FIELDS;\n\nconst WASM_MODULE_SPECIFIER = './wasm/embody_wasm.js';\nconst WASM_BINARY_SPECIFIER = './wasm/embody_wasm_bg.wasm';\n\n/** Per-entry loader state. Core consumers receive the resolved module explicitly. */\nlet corePromise: Promise<import('./wasmTypes').EmbodyCoreWasmModule> | null = null;\nlet cachedCore: import('./wasmTypes').EmbodyCoreWasmModule | null = null;\n\n/** @returns {Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */\nexport async function initEmbodyCore() {\n if (!corePromise) {\n corePromise = loadCoreModule().catch((error) => {\n // Allow a later retry after a transient load failure.\n corePromise = null;\n cachedCore = null;\n throw error;\n });\n }\n return corePromise;\n}\n\n/** @returns {Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */\nexport async function getEmbodyCore() {\n return initEmbodyCore();\n}\n\n/**\n * Return the Wasm module already loaded by this package entry.\n * Prefer passing the module returned by `initEmbodyCore()` explicitly.\n */\nexport function requireInitializedEmbodyCore() {\n if (!cachedCore) {\n throw new Error(\n 'Embody Wasm core is not initialized. Await initEmbodyCore() before calling sync engine helpers.'\n );\n }\n return cachedCore;\n}\n\nexport function resetEmbodyCoreForTests() {\n corePromise = null;\n cachedCore = null;\n}\n\n/**\n * Install a pre-loaded Wasm module into the sync cache (used by vitest setup\n * when the package dynamic import cannot resolve dist/wasm from source).\n * @param {import('./wasmTypes').EmbodyCoreWasmModule} mod\n */\nexport function setEmbodyCoreForTests(mod) {\n assertCoreAbi(mod);\n cachedCore = mod;\n corePromise = Promise.resolve(mod);\n}\n\n/** @returns {Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */\nasync function loadCoreModule() {\n const mod = await importGeneratedWasmModule();\n if (typeof mod.default === 'function') {\n await mod.default({ module_or_path: await resolveWasmInitInput() });\n }\n\n assertCoreAbi(mod);\n cachedCore = mod;\n return mod;\n}\n\n/** @returns {Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */\nasync function importGeneratedWasmModule() {\n const dynamicImport = /** @type {(specifier: string) => Promise<import('./wasmTypes').EmbodyCoreWasmModule>} */ (\n new Function('specifier', 'return import(specifier)')\n );\n\n try {\n return await dynamicImport(resolveWasmModuleSpecifier());\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Unable to load Embody Wasm core from generated package artifacts. Run \"npm run build\" before using @lovelace_lol/embody/wasm. Cause: ${message}`\n );\n }\n}\n\nfunction resolveWasmModuleSpecifier() {\n if (typeof import.meta.url === 'string' && import.meta.url.length > 0) {\n return new URL(WASM_MODULE_SPECIFIER, import.meta.url).href;\n }\n return WASM_MODULE_SPECIFIER;\n}\n\n/** @returns {Promise<unknown | undefined>} */\nasync function resolveWasmInitInput() {\n if (!isNodeLikeRuntime()) {\n return undefined;\n }\n\n const binaryUrl = resolveWasmBinarySpecifier();\n if (!binaryUrl.startsWith('file:')) {\n return undefined;\n }\n\n const dynamicImport = /** @type {(specifier: string) => Promise<any>} */ (\n new Function('specifier', 'return import(specifier)')\n );\n const [{ readFile }, { fileURLToPath }] = await Promise.all([\n dynamicImport('node:fs/promises'),\n dynamicImport('node:url'),\n ]);\n\n return readFile(fileURLToPath(binaryUrl));\n}\n\nfunction resolveWasmBinarySpecifier() {\n if (typeof import.meta.url === 'string' && import.meta.url.length > 0) {\n return new URL(WASM_BINARY_SPECIFIER, import.meta.url).href;\n }\n return WASM_BINARY_SPECIFIER;\n}\n\nfunction isNodeLikeRuntime() {\n const runtime = /** @type {{ process?: { versions?: { node?: string } } }} */ (globalThis);\n return Boolean(runtime.process?.versions?.node);\n}\n\n/** @param {import('./wasmTypes').EmbodyCoreWasmModule} mod */\nfunction assertCoreAbi(mod) {\n const version = mod.core_abi_version();\n if (version !== EMBODY_CORE_ABI_VERSION) {\n throw new Error(`Unsupported Embody Wasm ABI version ${version}; expected ${EMBODY_CORE_ABI_VERSION}.`);\n }\n\n const checks = [\n ['packed morph frame delta', mod.packed_morph_frame_delta_stride(), PACKED_MORPH_FRAME_DELTA_STRIDE],\n ['packed bone frame delta', mod.packed_bone_frame_delta_stride(), PACKED_BONE_FRAME_DELTA_STRIDE],\n ['hair config', mod.hair_config_stride(), HAIR_CONFIG_STRIDE],\n ['hair state', mod.hair_state_stride(), HAIR_STATE_STRIDE],\n ['hair head state', mod.hair_head_state_stride(), HAIR_HEAD_STATE_STRIDE],\n ['hair morph output', mod.hair_morph_output_stride(), HAIR_MORPH_OUTPUT_STRIDE],\n ['mesh proportions', mod.mesh_proportions_stride(), MESH_PROPORTIONS_STRIDE],\n ['template skeleton fit solution', mod.template_skeleton_fit_solution_stride(), TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE],\n ['template skeleton fit transform', mod.template_skeleton_fit_transform_stride(), TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE],\n ['annotation camera framing', mod.annotation_camera_framing_stride(), ANNOTATION_CAMERA_FRAMING_STRIDE],\n ['camera flight sample', mod.camera_flight_sample_stride(), CAMERA_FLIGHT_SAMPLE_STRIDE],\n ['marker visibility factors', mod.marker_visibility_factors_stride(), MARKER_VISIBILITY_FACTORS_STRIDE],\n ['marker endpoint', mod.marker_endpoint_stride(), MARKER_ENDPOINT_STRIDE],\n ];\n\n for (const [name, actual, expected] of checks) {\n if (actual !== expected) {\n throw new Error(`Unsupported Embody Wasm ${name} stride ${actual}; expected ${expected}.`);\n }\n }\n}\n"]}
@@ -0,0 +1,121 @@
1
+ export interface WasmHairPhysicsSolver {
2
+ update(dtSeconds: number, headValues: Float32Array): Float32Array;
3
+ set_config(configValues: Float32Array): void;
4
+ get_config(): Float32Array;
5
+ get_state(): Float32Array;
6
+ reset(): void;
7
+ free?: () => void;
8
+ }
9
+ export interface WasmHairPhysicsSolverConstructor {
10
+ new (configValues: Float32Array): WasmHairPhysicsSolver;
11
+ }
12
+ export interface WasmRuntimeCoreHandle {
13
+ configure(profileJson: string, modelJson: string): void;
14
+ configure_exact_profile(profileJson: string, modelJson: string): void;
15
+ configure_with_preset(presetId: string, overrideJson: string, modelJson: string): void;
16
+ viseme_slot_index(slotId: string): number;
17
+ set_au_signed(id: number, value: number, balance: number): void;
18
+ set_continuum(negAu: number, posAu: number, value: number, balance: number): void;
19
+ get_continuum(negAu: number, posAu: number): number;
20
+ transition_au(id: number, to: number, durationMs: number, balance: number): void;
21
+ transition_viseme(index: number, to: number, durationMs: number, jawScale: number): void;
22
+ update(dtSeconds: number): number;
23
+ active_transition_count(): number;
24
+ clear_transitions(): void;
25
+ load_au_morph_bindings(values: Float32Array): void;
26
+ load_viseme_morph_bindings(values: Float32Array): void;
27
+ load_bone_rest_transforms(values: Float32Array): void;
28
+ load_composite_axes(values: Float32Array): void;
29
+ load_bone_translations(values: Float32Array): void;
30
+ load_jaw_binding(values: Float32Array): void;
31
+ load_viseme_jaw_amounts(values: Float32Array): void;
32
+ set_mixed_aus(ids: Uint32Array): void;
33
+ set_au(id: number, value: number, balance: number): void;
34
+ get_au(id: number): number;
35
+ set_au_mix_weight(id: number, weight: number): void;
36
+ set_viseme(index: number, value: number): void;
37
+ set_viseme_jaw_scale(index: number, jawScale: number): void;
38
+ set_viseme_slot_count(count: number): void;
39
+ clear(): void;
40
+ evaluate_morph_frame_delta(): Float32Array;
41
+ evaluate_bone_frame_delta(): Float32Array;
42
+ free?: () => void;
43
+ }
44
+ export interface WasmRuntimeCoreConstructor {
45
+ new (visemeSlotCount: number): WasmRuntimeCoreHandle;
46
+ au_morph_binding_stride(): number;
47
+ viseme_morph_binding_stride(): number;
48
+ }
49
+ export interface WasmCameraFlightHandle {
50
+ /** Returns `[posX, posY, posZ, targetX, targetY, targetZ, done]`. */
51
+ sample(elapsedMs: number): Float32Array;
52
+ duration_ms(): number;
53
+ free?: () => void;
54
+ }
55
+ export interface WasmCameraFlightConstructor {
56
+ new (startPosition: Float32Array, startTarget: Float32Array, endPosition: Float32Array, endTarget: Float32Array, durationMs: number): WasmCameraFlightHandle;
57
+ }
58
+ export interface WasmCameraOrbitHandle {
59
+ /** Returns `[posX, posY, posZ, targetX, targetY, targetZ, done]`. */
60
+ sample(elapsedMs: number): Float32Array;
61
+ duration_ms(): number;
62
+ free?: () => void;
63
+ }
64
+ export interface WasmCameraOrbitConstructor {
65
+ new (center: Float32Array, radius: number, height: number, durationMs: number): WasmCameraOrbitHandle;
66
+ }
67
+ export interface EmbodyCoreWasmModule {
68
+ default?: (moduleOrPath?: unknown) => Promise<unknown> | unknown;
69
+ core_abi_version(): number;
70
+ packed_morph_frame_delta_stride(): number;
71
+ packed_bone_frame_delta_stride(): number;
72
+ pack_morph_frame_delta(meshIds: Uint32Array, morphTargetIds: Uint32Array, values: Float32Array, modes: Uint8Array): Float32Array;
73
+ solve_bilateral_values(base: number, balance: number): Float32Array;
74
+ solve_morph_batch(values: Float32Array, balances: Float32Array, mixWeights: Float32Array): Float32Array;
75
+ solve_axis_quaternion(axis: number, degrees: number, value: number, scale: number): Float32Array;
76
+ mesh_proportions_stride(): number;
77
+ template_skeleton_fit_solution_stride(): number;
78
+ analyze_mesh_proportions(vertices: Float32Array, verticalAxis: number): Float32Array;
79
+ solve_template_skeleton_fit(meshVertices: Float32Array, templateBounds: Float32Array, verticalAxis: number, verticalAnchor: number): Float32Array;
80
+ compose_template_fit_adjustment(fit: Float32Array, scaleMultiplier: number, offsetX: number, offsetY: number, offsetZ: number): Float32Array;
81
+ hair_config_stride(): number;
82
+ hair_state_stride(): number;
83
+ hair_head_state_stride(): number;
84
+ hair_morph_output_stride(): number;
85
+ template_skeleton_fit_transform_stride(): number;
86
+ compose_template_skeleton_fit_transform(fitScale: number, fitTranslation: Float32Array, manualScale: number, manualTranslation: Float32Array): Float32Array;
87
+ default_hair_physics_config_values(): Float32Array;
88
+ merge_preset_profile(baseJson: string, extensionJson: string): string;
89
+ list_presets(): string[];
90
+ has_preset(presetId: string): boolean;
91
+ get_preset_json(presetId: string): string;
92
+ merge_embedded_preset(presetId: string, overrideJson: string): string;
93
+ compile_clip(inputJson: string): string;
94
+ compile_clip_curves(inputJson: string): string;
95
+ build_hair_idle_curves(configJson: string, durationSec: number): string;
96
+ build_hair_impulse_curves(configJson: string, durationSec: number, horizontal: number, vertical: number): string;
97
+ build_hair_gravity_curves(configJson: string): string;
98
+ annotation_camera_framing_stride(): number;
99
+ camera_flight_sample_stride(): number;
100
+ marker_visibility_factors_stride(): number;
101
+ marker_endpoint_stride(): number;
102
+ normalize_camera_angle_degrees(angle: number): number;
103
+ world_direction_for_camera_angle(modelQuat: Float32Array, cameraAngle: number): Float32Array;
104
+ resolve_focus_camera_direction(modelQuat: Float32Array, effectiveAngle: number, hasExplicitAngle: boolean, worldAngleSpace: boolean): Float32Array;
105
+ resolve_auto_closeup_angle(horizontalOffset: number, focusSize: Float32Array, modelSize: Float32Array): number | undefined;
106
+ focus_padding_factor(size: number, closeUpPadding: number, zoomPadding: number, fullBodyPadding: number): number;
107
+ solve_focus_framing(focusBounds: Float32Array, modelBounds: Float32Array, modelQuat: Float32Array, fovDeg: number, aspect: number, minDistance: number, closeUpPadding: number, zoomPadding: number, fullBodyPadding: number, overridePadding: number | undefined, cameraAngle: number | undefined, worldAngleSpace: boolean): Float32Array;
108
+ solve_full_body_framing(boxMin: Float32Array, boxMax: Float32Array, modelQuat: Float32Array, fovDeg: number, aspect: number, minDistance: number, fullBodyPadding: number, overridePadding: number | undefined, cameraAngle: number | undefined, worldAngleSpace: boolean): Float32Array;
109
+ passes_marker_camera_angle_gate(markerAngle: number | undefined, currentCameraAngle: number | undefined, rangeDegrees: number | undefined): boolean;
110
+ should_show_marker(hiddenChild: boolean, soloed: number, markerAngle: number | undefined, currentCameraAngle: number | undefined): boolean;
111
+ resolve_viewport_constrained_line_scale(startClip: Float32Array, endClip: Float32Array, safeX: number, safeY: number, minLengthRatio: number | undefined): Float32Array;
112
+ resolve_viewport_safe_bounds(labelScaleX: number, labelScaleY: number, projectionXScale: number, projectionYScale: number, viewportWidth: number, viewportHeight: number, edgePaddingPx: number | undefined): Float32Array;
113
+ sample_marker_bezier_curve(start: Float32Array, end: Float32Array, segments: number): Float32Array;
114
+ sample_marker_arc_curve(start: Float32Array, end: Float32Array, segments: number): Float32Array;
115
+ marker_visibility_animation_factors(visible: boolean, t: number): Float32Array;
116
+ separate_overlapping_marker_endpoints(starts: Float32Array, ends: Float32Array, modelCenter: Float32Array, modelHeight: number): Float32Array;
117
+ HairPhysicsSolver: WasmHairPhysicsSolverConstructor;
118
+ RuntimeCore: WasmRuntimeCoreConstructor;
119
+ CameraFlight: WasmCameraFlightConstructor;
120
+ CameraOrbit: WasmCameraOrbitConstructor;
121
+ }
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@lovelace_lol/embody",
3
+ "version": "0.0.1",
4
+ "description": "Renderer-agnostic character animation runtime for facial AUs, visemes, and bone-driven motion",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./core": {
16
+ "types": "./dist/core/index.d.ts",
17
+ "import": "./dist/core.js",
18
+ "require": "./dist/core.cjs"
19
+ },
20
+ "./three": {
21
+ "types": "./dist/engines/three/index.d.ts",
22
+ "import": "./dist/three.js",
23
+ "require": "./dist/three.cjs"
24
+ },
25
+ "./cljs": {
26
+ "types": "./dist/cljs.d.ts",
27
+ "import": "./dist/cljs.js",
28
+ "require": "./dist/cljs.cjs"
29
+ },
30
+ "./wasm": {
31
+ "types": "./dist/wasm.d.ts",
32
+ "import": "./dist/wasm.js",
33
+ "require": "./dist/wasm.cjs"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "scripts": {
45
+ "build": "tsup --config tsup.wasm.config.ts && tsup --config tsup.config.ts && tsc -p tsconfig.declarations.json && node scripts/export-preset-json.mjs --check && npm run wasm:build",
46
+ "dev": "tsup --watch",
47
+ "typecheck": "tsc --noEmit",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "test:coverage": "vitest run --coverage",
51
+ "test:exports": "npm run build && node scripts/smoke/package-exports.mjs && node scripts/smoke/package-declarations.mjs",
52
+ "test:pack": "npm run build && npm pack --dry-run",
53
+ "preset:export": "tsup --config tsup.config.ts && node scripts/export-preset-json.mjs",
54
+ "extract:humanoid-skeleton-template": "node scripts/extract-humanoid-skeleton-template.cjs",
55
+ "bench:runtime": "npm run build && node scripts/bench/runtime.mjs",
56
+ "rust:test": "RUSTC=$(rustup which rustc) RUSTDOC=$(rustup which rustdoc) rustup run stable cargo test --manifest-path rust/embody-wasm/Cargo.toml",
57
+ "rust:wasm-build": "RUSTC=$(rustup which rustc) RUSTDOC=$(rustup which rustdoc) rustup run stable cargo build --manifest-path rust/embody-wasm/Cargo.toml --target wasm32-unknown-unknown --release",
58
+ "wasm:build": "node scripts/build-wasm.mjs",
59
+ "prepublishOnly": "npm run build"
60
+ },
61
+ "peerDependencies": {
62
+ "three": ">=0.150.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^26.1.1",
66
+ "@types/three": "^0.170.0",
67
+ "@vitest/coverage-v8": "^3.2.4",
68
+ "three": "^0.170.0",
69
+ "tsup": "^8.0.0",
70
+ "typescript": "^5.9.0",
71
+ "vitest": "^3.2.4",
72
+ "wasm-pack": "^0.15.0"
73
+ },
74
+ "keywords": [
75
+ "3d",
76
+ "animation",
77
+ "facial-animation",
78
+ "FACS",
79
+ "action-units",
80
+ "visemes",
81
+ "lip-sync",
82
+ "character-animation",
83
+ "morph-targets",
84
+ "blendshapes",
85
+ "three.js",
86
+ "babylon.js"
87
+ ],
88
+ "repository": {
89
+ "type": "git",
90
+ "url": "git+https://github.com/meekmachine/embody.git"
91
+ },
92
+ "bugs": {
93
+ "url": "https://github.com/meekmachine/embody/issues"
94
+ },
95
+ "homepage": "https://github.com/meekmachine/embody#readme",
96
+ "author": "Jonathan Sutton Fields",
97
+ "license": "MIT",
98
+ "packageManager": "npm@10.9.2"
99
+ }