@lovelace_lol/embody 0.0.7 → 0.0.9

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 (134) hide show
  1. package/README.md +541 -2394
  2. package/dist/index.d.ts +2 -100
  3. package/dist/index.js +9197 -13851
  4. package/dist/index.js.map +1 -1
  5. package/dist/three/annotations/DOMControls.d.ts +73 -0
  6. package/dist/three/annotations/DPthree.d.ts +113 -0
  7. package/dist/three/annotations/DPthree3DMarkers.d.ts +319 -0
  8. package/dist/three/annotations/DPthreeCameraController.d.ts +415 -0
  9. package/dist/three/annotations/DPthreeHTMLMarkers.d.ts +131 -0
  10. package/dist/three/annotations/DPthreeMarkers.d.ts +52 -0
  11. package/dist/three/annotations/adapter.d.ts +157 -0
  12. package/dist/three/annotations/animationFrameTaskScheduler.d.ts +18 -0
  13. package/dist/three/annotations/annotationAnchorModel.d.ts +16 -0
  14. package/dist/three/annotations/annotationCameraCore.d.ts +5 -0
  15. package/dist/three/annotations/boneResolutionProfile.d.ts +7 -0
  16. package/dist/three/annotations/index.d.ts +20 -0
  17. package/dist/three/annotations/loadFrame.d.ts +2 -0
  18. package/dist/three/annotations/markerSurfaceRaycast.d.ts +11 -0
  19. package/dist/three/annotations/markerVisibilityLifecycle.d.ts +21 -0
  20. package/dist/three/annotations/modelRenderPreparation.d.ts +6 -0
  21. package/dist/three/annotations/runtimeAnnotationPreview.d.ts +15 -0
  22. package/dist/three/annotations/runtimeAnnotationPreviewSide.d.ts +10 -0
  23. package/dist/three/annotations/runtimeAnnotationSidePreview.d.ts +5 -0
  24. package/dist/three/annotations/types.d.ts +262 -0
  25. package/dist/three/authoring.d.ts +95 -0
  26. package/dist/three/authoringTypes.d.ts +576 -0
  27. package/dist/three/character.d.ts +243 -0
  28. package/dist/three/characterHost.d.ts +48 -0
  29. package/dist/three/clipBindings.d.ts +6 -0
  30. package/dist/three/index.d.ts +171 -0
  31. package/dist/three/model.d.ts +31 -0
  32. package/dist/three/modelSkinning.d.ts +3 -0
  33. package/dist/three/nativePlayback.d.ts +121 -0
  34. package/dist/three/playbackRendering.d.ts +14 -0
  35. package/dist/three/reference-pose.d.ts +73 -0
  36. package/dist/three/scene.d.ts +253 -0
  37. package/dist/three/sceneRenderingBinding.d.ts +22 -0
  38. package/dist/three.js +9252 -8844
  39. package/dist/three.js.map +1 -1
  40. package/dist/wasm/README.md +551 -62
  41. package/dist/wasm/auto.d.ts +1 -0
  42. package/dist/wasm/compatibility.d.ts +14 -0
  43. package/dist/wasm/embody_wasm.d.ts +352 -71
  44. package/dist/wasm/embody_wasm.js +1266 -37
  45. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  46. package/dist/wasm/embody_wasm_bg.wasm.d.ts +113 -54
  47. package/dist/wasm/index.d.ts +131 -0
  48. package/dist/wasm.d.ts +1 -43
  49. package/dist/wasm.js +1100 -239
  50. package/dist/wasm.js.map +1 -1
  51. package/package.json +35 -39
  52. package/service-worker/character-asset-service-worker.js +295 -0
  53. package/dist/authoring/boneAuthoring.d.ts +0 -132
  54. package/dist/camera/annotationCameraAngles.d.ts +0 -28
  55. package/dist/camera/cameraRelativeGaze.d.ts +0 -15
  56. package/dist/camera/rustAnnotationCameraCore.d.ts +0 -136
  57. package/dist/cljs.cjs +0 -362
  58. package/dist/cljs.cjs.map +0 -1
  59. package/dist/cljs.d.ts +0 -5
  60. package/dist/cljs.js +0 -359
  61. package/dist/cljs.js.map +0 -1
  62. package/dist/core/TsClipCompiler.d.ts +0 -51
  63. package/dist/core/WasmRuntimeCore.d.ts +0 -41
  64. package/dist/core/compositeAxis.d.ts +0 -4
  65. package/dist/core/contracts/abi.d.ts +0 -70
  66. package/dist/core/contracts/clip.d.ts +0 -44
  67. package/dist/core/contracts/frame.d.ts +0 -27
  68. package/dist/core/contracts/host.d.ts +0 -28
  69. package/dist/core/contracts/ids.d.ts +0 -15
  70. package/dist/core/contracts/index.d.ts +0 -10
  71. package/dist/core/contracts/model.d.ts +0 -31
  72. package/dist/core/contracts/primitives.d.ts +0 -17
  73. package/dist/core/contracts/skeletonFit.d.ts +0 -41
  74. package/dist/core/index.d.ts +0 -6
  75. package/dist/core/types.d.ts +0 -472
  76. package/dist/core.cjs +0 -343
  77. package/dist/core.cjs.map +0 -1
  78. package/dist/core.js +0 -323
  79. package/dist/core.js.map +0 -1
  80. package/dist/engines/three/Embody.d.ts +0 -372
  81. package/dist/engines/three/ThreeAnimationRuntime.d.ts +0 -203
  82. package/dist/engines/three/ThreeClipAdapter.d.ts +0 -24
  83. package/dist/engines/three/ThreeFrameApplier.d.ts +0 -68
  84. package/dist/engines/three/ThreeModelInspector.d.ts +0 -54
  85. package/dist/engines/three/bakedClipPartitioning.d.ts +0 -16
  86. package/dist/engines/three/balanceUtils.d.ts +0 -3
  87. package/dist/engines/three/characterHost.d.ts +0 -80
  88. package/dist/engines/three/characterScene.d.ts +0 -98
  89. package/dist/engines/three/hair/HairPhysicsController.d.ts +0 -124
  90. package/dist/engines/three/index.d.ts +0 -20
  91. package/dist/engines/three/modelLoader.d.ts +0 -61
  92. package/dist/engines/three/profileTestScene.d.ts +0 -52
  93. package/dist/engines/three/types.d.ts +0 -20
  94. package/dist/hair/appearance.d.ts +0 -29
  95. package/dist/index.cjs +0 -14871
  96. package/dist/index.cjs.map +0 -1
  97. package/dist/interfaces/Animation.d.ts +0 -315
  98. package/dist/interfaces/EmbodyRuntime.d.ts +0 -90
  99. package/dist/interfaces/Hair.d.ts +0 -181
  100. package/dist/interfaces/HairPhysics.d.ts +0 -90
  101. package/dist/interfaces/index.d.ts +0 -11
  102. package/dist/mappings/extendPresetWithProfile.d.ts +0 -17
  103. package/dist/mappings/types.d.ts +0 -309
  104. package/dist/mappings/visemeSystem.d.ts +0 -26
  105. package/dist/physics/HairPhysics.d.ts +0 -86
  106. package/dist/physics/RustHairPhysics.d.ts +0 -18
  107. package/dist/physics/index.d.ts +0 -6
  108. package/dist/preset.cjs +0 -2005
  109. package/dist/preset.cjs.map +0 -1
  110. package/dist/preset.js +0 -2003
  111. package/dist/preset.js.map +0 -1
  112. package/dist/presets/bettaFish.d.ts +0 -328
  113. package/dist/presets/cc4.d.ts +0 -145
  114. package/dist/presets/index.d.ts +0 -30
  115. package/dist/presets/registry.d.ts +0 -57
  116. package/dist/profiles/resolveProfileConfig.d.ts +0 -36
  117. package/dist/profiles/rustResolvedProfile.d.ts +0 -31
  118. package/dist/profiles/types.d.ts +0 -118
  119. package/dist/regions/normalizeRegionTree.d.ts +0 -6
  120. package/dist/regions/regionMapping.d.ts +0 -17
  121. package/dist/regions/types.d.ts +0 -122
  122. package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +0 -32
  123. package/dist/test/setupWasm.d.ts +0 -1
  124. package/dist/three.cjs +0 -9550
  125. package/dist/three.cjs.map +0 -1
  126. package/dist/validation/analyzeModel.d.ts +0 -68
  127. package/dist/validation/extractModelData.d.ts +0 -90
  128. package/dist/validation/generateMappingCorrections.d.ts +0 -32
  129. package/dist/validation/geometryHelpers.d.ts +0 -66
  130. package/dist/validation/types.d.ts +0 -10
  131. package/dist/validation/validateMappings.d.ts +0 -77
  132. package/dist/wasm.cjs +0 -302
  133. package/dist/wasm.cjs.map +0 -1
  134. package/dist/wasmTypes.d.ts +0 -123
@@ -41,6 +41,41 @@ export class HairPhysicsSolver {
41
41
  update(dt: number, head_values: Float32Array): Float32Array;
42
42
  }
43
43
 
44
+ /**
45
+ * A command protocol for one bound model/profile, not an animation evaluator.
46
+ * Dispatch each returned batch in order, then feed native events to `notify`.
47
+ * Before `free`, dispatch `dispose` to release engine-owned resources.
48
+ */
49
+ export class NativePlaybackSession {
50
+ free(): void;
51
+ [Symbol.dispose](): void;
52
+ control(handle: string, control_json: string): string;
53
+ dispose(): string;
54
+ constructor();
55
+ /**
56
+ * Late/duplicate/foreign well-formed notifications return an empty batch.
57
+ * A native error after held completion releases resources without emitting
58
+ * a second terminal event.
59
+ */
60
+ notify(native_event_json: string): string;
61
+ /**
62
+ * Takes concrete ClipIR from RuntimeCore compilation or baked-clip intake.
63
+ * Semantic strength must already be compiled into the clip; weight is the
64
+ * native action's contribution and never changes compiled samples.
65
+ */
66
+ play(clip_json: string, options_json: string): string;
67
+ /**
68
+ * Always starts a new generation, even if the identity labels are reused.
69
+ * Hosts must call this on every model/profile replacement before new play.
70
+ */
71
+ rebind(model_key: string, profile_key: string): string;
72
+ /**
73
+ * Replace authored samples without resetting native time, loop progress or
74
+ * the request identity. A held request remains terminal after a pose edit.
75
+ */
76
+ replace_clip(handle: string, clip_json: string): string;
77
+ }
78
+
44
79
  /**
45
80
  * Host-neutral live morph runtime. Owns AU/viseme/mix state and emits packed
46
81
  * morph frame deltas. Engine objects never enter this struct.
@@ -48,10 +83,44 @@ export class HairPhysicsSolver {
48
83
  export class RuntimeCore {
49
84
  free(): void;
50
85
  [Symbol.dispose](): void;
51
- active_transition_count(): number;
86
+ /**
87
+ * Validate every channel before replacing Body state. Other FACS state remains.
88
+ */
89
+ apply_semantic_pose_json(json: string): void;
52
90
  static au_morph_binding_stride(): number;
91
+ /**
92
+ * Begin one host command; its concrete destinations determine which native
93
+ * actions are replaced. Unrelated targets keep their existing playback.
94
+ */
95
+ begin_live_command(): void;
96
+ build_clip(clip_name: string, curves_json: string, options_json: string): string;
97
+ /**
98
+ * Compile the configured gravity response directly to concrete morph
99
+ * tracks. Three owns interpolation from the captured initial scene pose.
100
+ */
101
+ build_hair_gravity_clip(name: string, pitch: number, duration_seconds: number, options_json: string): string;
102
+ /**
103
+ * Compile the current live semantic controls into ordinary native tracks.
104
+ * The connector captures inherited starts at play time; Rust never ticks
105
+ * or interpolates these samples. Empty output relinquishes all live tracks.
106
+ */
107
+ build_live_clip(name: string, duration_seconds: number): string;
108
+ /**
109
+ * Compile relinquished live targets back to their reference values. Run
110
+ * this clip with finalPose=release so native ownership ends at completion.
111
+ */
112
+ build_live_release_clip(name: string, previous_clip_json: string, duration_seconds: number): string;
113
+ /**
114
+ * Compile semantic motions and optional facial curves together without changing live state.
115
+ */
116
+ build_semantic_clip(name: string, json: string, options_json: string): string;
117
+ build_typed_clip(clip_name: string, channels_json: string, options_json: string): string;
118
+ /**
119
+ * Captures manual semantic state; does not infer actions from a mixer pose.
120
+ */
121
+ capture_semantic_pose_json(): string;
122
+ cleanup_snippet(clip_name: string): boolean;
53
123
  clear(): void;
54
- clear_transitions(): void;
55
124
  /**
56
125
  * Configure the core from the profile and model descriptor JSON hosts
57
126
  * already have. All binding compilation (mesh/morph/bone name resolution,
@@ -68,11 +137,31 @@ export class RuntimeCore {
68
137
  /**
69
138
  * Configure from a resolved profile without applying an embedded preset.
70
139
  *
71
- * This path is intentionally strict so a host cannot accidentally select
72
- * a profile that has no usable runtime bindings. Preset fallback remains
73
- * an explicit host decision.
140
+ * Empty profiles and mappings that do not match the current model are
141
+ * non-fatal. Static imports can render before authoring any bindings,
142
+ * without silently substituting an embedded preset.
74
143
  */
75
144
  configure_with_profile(profile_json: string, model_json: string): void;
145
+ /**
146
+ * Carry canonical controls across a renderer rebind. Model-local IDs and
147
+ * reference values belong to the new binding and are never copied.
148
+ */
149
+ copy_live_state_from(previous: RuntimeCore): void;
150
+ /**
151
+ * Same rows as `evaluate_bone_frame_delta`, but only bones an active AU,
152
+ * translation, or viseme jaw value is currently rotating or moving.
153
+ * Neutral bones are omitted (no rest reset), so hosts can re-apply this
154
+ * after mixer playback without freezing clip-driven bones (Loom3 parity).
155
+ */
156
+ evaluate_active_bone_frame(): Float32Array;
157
+ /**
158
+ * Same rows as `evaluate_morph_frame_delta`, but only channels with a
159
+ * non-zero live value or an explicit direct override (including zero).
160
+ * Hosts re-apply this after mixer playback so live
161
+ * AU/viseme state wins over clip tracks (Loom3 parity) without resetting
162
+ * channels the mixer owns.
163
+ */
164
+ evaluate_active_morph_frame(): Float32Array;
76
165
  /**
77
166
  * Packed bone FrameDelta rows: `[bone_id, px, py, pz, qx, qy, qz, qw, flags] * N`
78
167
  * flags: bit0 = has_position, bit1 = has_rotation. Composite rotations are
@@ -82,18 +171,73 @@ export class RuntimeCore {
82
171
  evaluate_bone_frame_delta(): Float32Array;
83
172
  /**
84
173
  * Packed morph FrameDelta rows: `[mesh_id, morph_target_id, value, mode] * N`
174
+ * Live AU/viseme/direct morph state only — clip playback is host-owned.
85
175
  */
86
176
  evaluate_morph_frame_delta(): Float32Array;
177
+ /**
178
+ * Emit only currently/previously owned bone properties. Position and
179
+ * rotation ownership are separate; inactive properties release once.
180
+ */
181
+ evaluate_procedural_bone_frame(): Float32Array;
182
+ /**
183
+ * Emit active morphs plus one neutral release for previously owned
184
+ * targets. Direct overrides, including explicit zero, retain ownership.
185
+ * Untouched targets are omitted so constant mixer tracks keep their pose.
186
+ */
187
+ evaluate_procedural_morph_frame(): Float32Array;
188
+ /**
189
+ * Scene extras for live state. Clip-driven scale/visibility/object writes
190
+ * are owned by the host mixer, so this returns an empty frame.
191
+ */
192
+ evaluate_scene_frame(): string;
193
+ /**
194
+ * Full Body property writes, including neutral reference values. Hosts use
195
+ * this once when an explicit pose replaces direct legacy bone edits.
196
+ */
197
+ evaluate_semantic_body_bone_frame(): Float32Array;
198
+ get_animation_clips(): string;
87
199
  get_au(id: number): number;
200
+ /**
201
+ * Stored live AU balance in [-1, 1], or neutral zero when unset or cleared.
202
+ */
203
+ get_au_balance(id: number): number;
204
+ /**
205
+ * Current runtime tissue strength, independent of persisted profile defaults.
206
+ */
207
+ get_au_mix_weight(id: number): number;
208
+ /**
209
+ * Resolved Body descriptors for the configured profile/model. Model
210
+ * inspection and descriptor resolution are cached until reconfiguration.
211
+ */
212
+ get_body_controls_json(): string;
88
213
  get_continuum(neg_au: number, pos_au: number): number;
214
+ /**
215
+ * Normalized hair configuration belongs to the selected profile, never an
216
+ * adapter fallback. Explicit empty/null mappings remain empty.
217
+ */
218
+ get_hair_config_json(): string;
219
+ get_missing_hair_morph_targets_json(available_json: string): string;
220
+ /**
221
+ * Profile-derived motions and resolved model support for prompt/pose editors.
222
+ */
223
+ get_semantic_pose_catalog_json(): string;
224
+ /**
225
+ * Stored direct viseme value, or zero for an unset or out-of-range slot.
226
+ * Host mixer output is not part of this live control state.
227
+ */
228
+ get_viseme(index: number): number;
229
+ /**
230
+ * Stored direct viseme jaw scale, or one for an unset or out-of-range slot.
231
+ */
232
+ get_viseme_jaw_scale(index: number): number;
233
+ has_left_right_bones(au_id: number): boolean;
234
+ live_command_targets_json(): string;
235
+ load_animation_clips(clips_json: string): void;
89
236
  /**
90
237
  * Packed rows: `[au_id, side, mesh_id, morph_target_id, weight] * N`
91
238
  * side: 0=left, 1=right, 2=center
92
239
  */
93
240
  load_au_morph_bindings(values: Float32Array): void;
94
- /**
95
- * Packed rows: `[bone_id, px, py, pz, qx, qy, qz, qw] * N`
96
- */
97
241
  load_bone_rest_transforms(values: Float32Array): void;
98
242
  /**
99
243
  * Packed rows: `[au_id, bone_id, axis(0=x,1=y,2=z), scale, max_units] * N`
@@ -117,29 +261,64 @@ export class RuntimeCore {
117
261
  */
118
262
  load_viseme_morph_bindings(values: Float32Array): void;
119
263
  constructor(viseme_slot_count: number);
264
+ register_animation_clip(clip_json: string, source: string): void;
265
+ /**
266
+ * Release a direct morph override so AU/viseme/mixer ownership can resume.
267
+ * A deliberate `set_morph(..., 0, ...)` still owns and masks the target;
268
+ * preview cleanup must release instead of installing a permanent zero.
269
+ * Target selection matches `set_morph`; returns overrides actually removed.
270
+ */
271
+ release_morph(morph_name: string, mesh_names_json: string): number;
272
+ /**
273
+ * Index counterpart to `release_morph`, with `set_morph_index` selection.
274
+ */
275
+ release_morph_index(morph_index: number, mesh_names_json: string): number;
276
+ /**
277
+ * Release owned morphs through the old renderer binding IDs before rebind.
278
+ */
279
+ release_procedural_morph_frame(): Float32Array;
280
+ remove_animation_clip(clip_name: string): boolean;
281
+ /**
282
+ * Clear each unique configured Body action and bilateral balance together.
283
+ * Shared facial aliases are Body actions too. Preserve other actions,
284
+ * visemes, direct morph overrides, and authored/current morph mix weights.
285
+ */
286
+ reset_body_controls(): void;
287
+ /**
288
+ * Forget ownership when renderer bindings are discarded. Before replacing
289
+ * bindings, apply release_procedural_morph_frame through the old IDs.
290
+ * Normal clear/reset deliberately retain tracking for the next frame.
291
+ */
292
+ reset_procedural_frame_tracking(): void;
293
+ /**
294
+ * The adapter supplies native quaternion samples and scene/reference
295
+ * transforms; the profile resolves which tracks represent head motion.
296
+ */
297
+ resolve_hair_motion_json(tracks_json: string, additive: boolean): string;
120
298
  set_au(id: number, value: number, balance: number): void;
121
299
  set_au_mix_weight(id: number, weight: number): void;
122
300
  /**
123
- * Continuum-aware AU set. Negative values route through the configured
124
- * continuum pair (e.g. eyes left/right) exactly like the legacy runtime.
301
+ * Manual directional command: a nonzero value owns its configured pair.
302
+ * Negative values select the opposite direction. Zero clears only the
303
+ * named AU, so releasing an inactive slider does not stop its partner.
125
304
  */
126
305
  set_au_signed(id: number, value: number, balance: number): void;
127
306
  set_continuum(neg_au: number, pos_au: number, value: number, balance: number): void;
307
+ set_hair_config_json(update_json: string): string;
128
308
  set_mixed_aus(ids: Uint32Array): void;
309
+ set_morph(morph_name: string, value: number, mesh_names_json: string): number;
310
+ set_morph_index(morph_index: number, value: number, mesh_names_json: string): number;
129
311
  set_viseme(index: number, value: number): void;
130
312
  set_viseme_jaw_scale(index: number, jaw_scale: number): void;
131
313
  set_viseme_slot_count(count: number): void;
132
314
  /**
133
- * Start (or replace) an eased AU transition. Advanced by `update`.
315
+ * Compile and validate without registering a clip or changing live controls.
134
316
  */
135
- transition_au(id: number, to: number, duration_ms: number, balance: number): void;
136
- transition_viseme(index: number, to: number, duration_ms: number, jaw_scale: number): void;
317
+ validate_semantic_animation_json(json: string, options_json: string): void;
137
318
  /**
138
- * Advance all running transitions by `dt` seconds and write the eased
139
- * values into the core state. Returns the number of still-active
140
- * transitions so hosts know whether a frame delta re-evaluation is due.
319
+ * Validate and fill optional settings without changing runtime or renderer state.
141
320
  */
142
- update(dt_seconds: number): number;
321
+ validate_semantic_pose_json(json: string): string;
143
322
  static viseme_morph_binding_stride(): number;
144
323
  viseme_slot_index(slot_id: string): number;
145
324
  }
@@ -159,6 +338,8 @@ export class RuntimeCore {
159
338
  */
160
339
  export function analyze_mesh_proportions(vertices: Float32Array, vertical_axis: number): Float32Array;
161
340
 
341
+ export function analyze_model_descriptor(model_json: string, clips_json: string, profile_json: string, options_json: string): string;
342
+
162
343
  export function annotation_camera_framing_stride(): number;
163
344
 
164
345
  /**
@@ -198,20 +379,41 @@ export function compose_template_fit_adjustment(fit: Float32Array, scale_multipl
198
379
 
199
380
  export function compose_template_skeleton_fit_transform(fit_scale: number, fit_translation: Float32Array, manual_scale: number, manual_translation: Float32Array): Float32Array;
200
381
 
382
+ export function compute_humanoid_skeleton_template_rest_bounds(template_json: string): Float64Array;
383
+
201
384
  export function core_abi_version(): number;
202
385
 
386
+ export function create_validation_skeleton_json(template_json: string): string;
387
+
388
+ export function default_hair_color_appearance_json(): string;
389
+
203
390
  export function default_hair_physics_config_values(): Float32Array;
204
391
 
392
+ /**
393
+ * Execute a host-neutral Embody operation using JSON in and JSON out.
394
+ * This keeps CLJS and other browser hosts off the Rust data structures while
395
+ * ensuring all profile semantics execute inside Wasm.
396
+ */
397
+ export function embody_request(request_json: string): string;
398
+
399
+ export function extract_humanoid_skeleton_template_json(model_json: string, options_json: string): string;
400
+
401
+ export function extract_model_data_json(model_json: string, clips_json: string): string;
402
+
205
403
  /**
206
404
  * Padding factor for a focus target of the given max dimension.
207
405
  */
208
406
  export function focus_padding_factor(size: number, close_up_padding: number, zoom_padding: number, full_body_padding: number): number;
209
407
 
408
+ export function get_humanoid_skeleton_template_json(id: string): string;
409
+
210
410
  /**
211
411
  * Return the embedded preset JSON for a preset id (intake source of truth).
212
412
  */
213
413
  export function get_preset_json(preset_id: string): string;
214
414
 
415
+ export function hair_color_presets_json(): string;
416
+
215
417
  export function hair_config_stride(): number;
216
418
 
217
419
  export function hair_head_state_stride(): number;
@@ -225,6 +427,10 @@ export function hair_state_stride(): number;
225
427
  */
226
428
  export function has_preset(preset_id: string): boolean;
227
429
 
430
+ export function humanoid_skeleton_template_bone_names(template_json: string): string;
431
+
432
+ export function list_humanoid_skeleton_templates_json(): string;
433
+
228
434
  /**
229
435
  * Canonical embedded preset ids available inside the Wasm core.
230
436
  */
@@ -257,6 +463,8 @@ export function mesh_proportions_stride(): number;
257
463
 
258
464
  export function normalize_camera_angle_degrees(angle: number): number;
259
465
 
466
+ export function normalize_hair_color_appearance_json(value_json: string, fallback_json: string): string;
467
+
260
468
  export function pack_morph_frame_delta(mesh_ids: Uint32Array, morph_target_ids: Uint32Array, values: Float32Array, modes: Uint8Array): Float32Array;
261
469
 
262
470
  export function packed_bone_frame_delta_stride(): number;
@@ -403,6 +611,20 @@ export function template_skeleton_fit_transform_stride(): number;
403
611
  */
404
612
  export function validate_generated_template_fit_metadata(template_id: string, source_character_id: string, metadata: Float32Array): number;
405
613
 
614
+ /**
615
+ * Resolve and validate VRM humanoid roles through profile node keys against a
616
+ * renderer-neutral model descriptor. This is characterization metadata only;
617
+ * it does not create or apply pose frame writes.
618
+ */
619
+ export function validate_humanoid_characterization(profile_json: string, model_json: string): string;
620
+
621
+ /**
622
+ * Validate an authored profile against a renderer-neutral model descriptor.
623
+ * Three.js objects are reduced to this descriptor by the thin host adapter;
624
+ * all mapping analysis and correction generation stays in Rust.
625
+ */
626
+ export function validate_profile_model(profile_json: string, model_json: string, options_json: string): string;
627
+
406
628
  /**
407
629
  * World-space camera direction for a model-relative camera angle.
408
630
  * `model_quat` is the model's world quaternion `[x, y, z, w]`
@@ -414,30 +636,65 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
414
636
 
415
637
  export interface InitOutput {
416
638
  readonly memory: WebAssembly.Memory;
417
- readonly build_hair_gravity_curves: (a: number, b: number) => [number, number, number, number];
418
- readonly build_hair_idle_curves: (a: number, b: number, c: number) => [number, number, number, number];
419
- readonly build_hair_impulse_curves: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
420
- readonly compile_clip: (a: number, b: number) => [number, number, number, number];
421
- readonly compile_clip_curves: (a: number, b: number) => [number, number, number, number];
422
- readonly get_preset_json: (a: number, b: number) => [number, number, number, number];
423
- readonly has_preset: (a: number, b: number) => number;
424
- readonly list_presets: () => [number, number];
425
- readonly merge_embedded_preset: (a: number, b: number, c: number, d: number) => [number, number, number, number];
426
- readonly merge_preset_profile: (a: number, b: number, c: number, d: number) => [number, number, number, number];
427
- readonly resolve_embedded_profile_view: (a: number, b: number, c: number, d: number) => [number, number, number, number];
428
- readonly resolve_profile_view: (a: number, b: number) => [number, number, number, number];
639
+ readonly default_hair_color_appearance_json: () => [number, number, number, number];
640
+ readonly hair_color_presets_json: () => [number, number, number, number];
641
+ readonly normalize_hair_color_appearance_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
642
+ readonly solve_axis_quaternion: (a: number, b: number, c: number, d: number) => [number, number];
643
+ readonly solve_bilateral_values: (a: number, b: number) => [number, number];
644
+ readonly solve_morph_batch: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
645
+ readonly __wbg_hairphysicssolver_free: (a: number, b: number) => void;
429
646
  readonly __wbg_runtimecore_free: (a: number, b: number) => void;
430
- readonly runtimecore_active_transition_count: (a: number) => number;
431
- readonly runtimecore_au_morph_binding_stride: () => number;
647
+ readonly core_abi_version: () => number;
648
+ readonly default_hair_physics_config_values: () => [number, number];
649
+ readonly hair_config_stride: () => number;
650
+ readonly hair_head_state_stride: () => number;
651
+ readonly hair_morph_output_stride: () => number;
652
+ readonly hair_state_stride: () => number;
653
+ readonly hairphysicssolver_get_config: (a: number) => [number, number];
654
+ readonly hairphysicssolver_get_state: (a: number) => [number, number];
655
+ readonly hairphysicssolver_new: (a: number, b: number) => number;
656
+ readonly hairphysicssolver_reset: (a: number) => void;
657
+ readonly hairphysicssolver_set_config: (a: number, b: number, c: number) => void;
658
+ readonly hairphysicssolver_update: (a: number, b: number, c: number, d: number) => [number, number];
659
+ readonly pack_morph_frame_delta: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
660
+ readonly packed_bone_frame_delta_stride: () => number;
661
+ readonly runtimecore_apply_semantic_pose_json: (a: number, b: number, c: number) => [number, number];
662
+ readonly runtimecore_begin_live_command: (a: number) => void;
663
+ readonly runtimecore_build_clip: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
664
+ readonly runtimecore_build_hair_gravity_clip: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
665
+ readonly runtimecore_build_live_clip: (a: number, b: number, c: number, d: number) => [number, number, number, number];
666
+ readonly runtimecore_build_live_release_clip: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
667
+ readonly runtimecore_build_semantic_clip: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
668
+ readonly runtimecore_build_typed_clip: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
669
+ readonly runtimecore_capture_semantic_pose_json: (a: number) => [number, number];
670
+ readonly runtimecore_cleanup_snippet: (a: number, b: number, c: number) => number;
432
671
  readonly runtimecore_clear: (a: number) => void;
433
- readonly runtimecore_clear_transitions: (a: number) => void;
434
672
  readonly runtimecore_configure: (a: number, b: number, c: number, d: number, e: number) => [number, number];
435
673
  readonly runtimecore_configure_with_preset: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
436
674
  readonly runtimecore_configure_with_profile: (a: number, b: number, c: number, d: number, e: number) => [number, number];
675
+ readonly runtimecore_copy_live_state_from: (a: number, b: number) => void;
676
+ readonly runtimecore_evaluate_active_bone_frame: (a: number) => [number, number];
677
+ readonly runtimecore_evaluate_active_morph_frame: (a: number) => [number, number];
437
678
  readonly runtimecore_evaluate_bone_frame_delta: (a: number) => [number, number];
438
679
  readonly runtimecore_evaluate_morph_frame_delta: (a: number) => [number, number];
680
+ readonly runtimecore_evaluate_procedural_bone_frame: (a: number) => [number, number];
681
+ readonly runtimecore_evaluate_procedural_morph_frame: (a: number) => [number, number];
682
+ readonly runtimecore_evaluate_scene_frame: (a: number) => [number, number, number, number];
683
+ readonly runtimecore_evaluate_semantic_body_bone_frame: (a: number) => [number, number];
684
+ readonly runtimecore_get_animation_clips: (a: number) => [number, number, number, number];
439
685
  readonly runtimecore_get_au: (a: number, b: number) => number;
686
+ readonly runtimecore_get_au_balance: (a: number, b: number) => number;
687
+ readonly runtimecore_get_au_mix_weight: (a: number, b: number) => number;
688
+ readonly runtimecore_get_body_controls_json: (a: number) => [number, number];
440
689
  readonly runtimecore_get_continuum: (a: number, b: number, c: number) => number;
690
+ readonly runtimecore_get_hair_config_json: (a: number) => [number, number, number, number];
691
+ readonly runtimecore_get_missing_hair_morph_targets_json: (a: number, b: number, c: number) => [number, number, number, number];
692
+ readonly runtimecore_get_semantic_pose_catalog_json: (a: number) => [number, number];
693
+ readonly runtimecore_get_viseme: (a: number, b: number) => number;
694
+ readonly runtimecore_get_viseme_jaw_scale: (a: number, b: number) => number;
695
+ readonly runtimecore_has_left_right_bones: (a: number, b: number) => number;
696
+ readonly runtimecore_live_command_targets_json: (a: number) => [number, number];
697
+ readonly runtimecore_load_animation_clips: (a: number, b: number, c: number) => [number, number];
441
698
  readonly runtimecore_load_au_morph_bindings: (a: number, b: number, c: number) => void;
442
699
  readonly runtimecore_load_bone_rest_transforms: (a: number, b: number, c: number) => void;
443
700
  readonly runtimecore_load_bone_translations: (a: number, b: number, c: number) => void;
@@ -446,22 +703,54 @@ export interface InitOutput {
446
703
  readonly runtimecore_load_viseme_jaw_amounts: (a: number, b: number, c: number) => void;
447
704
  readonly runtimecore_load_viseme_morph_bindings: (a: number, b: number, c: number) => void;
448
705
  readonly runtimecore_new: (a: number) => number;
706
+ readonly runtimecore_register_animation_clip: (a: number, b: number, c: number, d: number, e: number) => [number, number];
707
+ readonly runtimecore_release_morph: (a: number, b: number, c: number, d: number, e: number) => number;
708
+ readonly runtimecore_release_morph_index: (a: number, b: number, c: number, d: number) => number;
709
+ readonly runtimecore_release_procedural_morph_frame: (a: number) => [number, number];
710
+ readonly runtimecore_reset_body_controls: (a: number) => void;
711
+ readonly runtimecore_reset_procedural_frame_tracking: (a: number) => void;
712
+ readonly runtimecore_resolve_hair_motion_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
449
713
  readonly runtimecore_set_au: (a: number, b: number, c: number, d: number) => void;
450
714
  readonly runtimecore_set_au_mix_weight: (a: number, b: number, c: number) => void;
451
715
  readonly runtimecore_set_au_signed: (a: number, b: number, c: number, d: number) => void;
452
716
  readonly runtimecore_set_continuum: (a: number, b: number, c: number, d: number, e: number) => void;
717
+ readonly runtimecore_set_hair_config_json: (a: number, b: number, c: number) => [number, number, number, number];
453
718
  readonly runtimecore_set_mixed_aus: (a: number, b: number, c: number) => void;
719
+ readonly runtimecore_set_morph: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
720
+ readonly runtimecore_set_morph_index: (a: number, b: number, c: number, d: number, e: number) => number;
454
721
  readonly runtimecore_set_viseme: (a: number, b: number, c: number) => void;
455
722
  readonly runtimecore_set_viseme_jaw_scale: (a: number, b: number, c: number) => void;
456
723
  readonly runtimecore_set_viseme_slot_count: (a: number, b: number) => void;
457
- readonly runtimecore_transition_au: (a: number, b: number, c: number, d: number, e: number) => void;
458
- readonly runtimecore_transition_viseme: (a: number, b: number, c: number, d: number, e: number) => void;
459
- readonly runtimecore_update: (a: number, b: number) => number;
460
- readonly runtimecore_viseme_morph_binding_stride: () => number;
724
+ readonly runtimecore_validate_semantic_animation_json: (a: number, b: number, c: number, d: number, e: number) => [number, number];
725
+ readonly runtimecore_validate_semantic_pose_json: (a: number, b: number, c: number) => [number, number, number, number];
461
726
  readonly runtimecore_viseme_slot_index: (a: number, b: number, c: number) => number;
727
+ readonly packed_morph_frame_delta_stride: () => number;
728
+ readonly runtimecore_au_morph_binding_stride: () => number;
729
+ readonly runtimecore_viseme_morph_binding_stride: () => number;
730
+ readonly runtimecore_remove_animation_clip: (a: number, b: number, c: number) => number;
731
+ readonly __wbg_nativeplaybacksession_free: (a: number, b: number) => void;
732
+ readonly marker_endpoint_stride: () => number;
733
+ readonly marker_visibility_animation_factors: (a: number, b: number) => [number, number];
734
+ readonly nativeplaybacksession_control: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
735
+ readonly nativeplaybacksession_dispose: (a: number) => [number, number, number, number];
736
+ readonly nativeplaybacksession_new: () => [number, number, number];
737
+ readonly nativeplaybacksession_notify: (a: number, b: number, c: number) => [number, number, number, number];
738
+ readonly nativeplaybacksession_play: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
739
+ readonly nativeplaybacksession_rebind: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
740
+ readonly nativeplaybacksession_replace_clip: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
741
+ readonly passes_marker_camera_angle_gate: (a: number, b: number, c: number) => number;
742
+ readonly resolve_viewport_constrained_line_scale: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
743
+ readonly resolve_viewport_safe_bounds: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
744
+ readonly sample_marker_arc_curve: (a: number, b: number, c: number, d: number, e: number) => [number, number];
745
+ readonly sample_marker_bezier_curve: (a: number, b: number, c: number, d: number, e: number) => [number, number];
746
+ readonly separate_overlapping_marker_endpoints: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
747
+ readonly should_show_marker: (a: number, b: number, c: number, d: number) => number;
748
+ readonly marker_visibility_factors_stride: () => number;
749
+ readonly analyze_model_descriptor: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number, number, number];
750
+ readonly extract_model_data_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
462
751
  readonly __wbg_cameraflight_free: (a: number, b: number) => void;
463
752
  readonly __wbg_cameraorbit_free: (a: number, b: number) => void;
464
- readonly __wbg_hairphysicssolver_free: (a: number, b: number) => void;
753
+ readonly analyze_mesh_proportions: (a: number, b: number, c: number) => [number, number];
465
754
  readonly annotation_camera_framing_stride: () => number;
466
755
  readonly cameraflight_duration_ms: (a: number) => number;
467
756
  readonly cameraflight_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => number;
@@ -469,50 +758,42 @@ export interface InitOutput {
469
758
  readonly cameraorbit_duration_ms: (a: number) => number;
470
759
  readonly cameraorbit_new: (a: number, b: number, c: number, d: number, e: number) => number;
471
760
  readonly cameraorbit_sample: (a: number, b: number) => [number, number];
472
- readonly compose_template_skeleton_fit_transform: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
473
- readonly core_abi_version: () => number;
474
- readonly default_hair_physics_config_values: () => [number, number];
761
+ readonly compose_template_fit_adjustment: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
762
+ readonly compute_humanoid_skeleton_template_rest_bounds: (a: number, b: number) => [number, number, number, number];
763
+ readonly create_validation_skeleton_json: (a: number, b: number) => [number, number, number, number];
764
+ readonly extract_humanoid_skeleton_template_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
475
765
  readonly focus_padding_factor: (a: number, b: number, c: number, d: number) => number;
476
- readonly hair_config_stride: () => number;
477
- readonly hair_head_state_stride: () => number;
478
- readonly hair_morph_output_stride: () => number;
479
- readonly hair_state_stride: () => number;
480
- readonly hairphysicssolver_get_config: (a: number) => [number, number];
481
- readonly hairphysicssolver_get_state: (a: number) => [number, number];
482
- readonly hairphysicssolver_new: (a: number, b: number) => number;
483
- readonly hairphysicssolver_reset: (a: number) => void;
484
- readonly hairphysicssolver_set_config: (a: number, b: number, c: number) => void;
485
- readonly hairphysicssolver_update: (a: number, b: number, c: number, d: number) => [number, number];
766
+ readonly get_humanoid_skeleton_template_json: (a: number, b: number) => [number, number, number, number];
767
+ readonly humanoid_skeleton_template_bone_names: (a: number, b: number) => [number, number, number, number];
768
+ readonly list_humanoid_skeleton_templates_json: () => [number, number, number, number];
769
+ readonly mesh_proportions_stride: () => number;
486
770
  readonly normalize_camera_angle_degrees: (a: number) => number;
487
- readonly pack_morph_frame_delta: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
488
- readonly packed_bone_frame_delta_stride: () => number;
489
771
  readonly resolve_auto_closeup_angle: (a: number, b: number, c: number, d: number, e: number) => number;
490
772
  readonly resolve_focus_camera_direction: (a: number, b: number, c: number, d: number, e: number) => [number, number];
491
773
  readonly solve_focus_framing: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number) => [number, number];
492
774
  readonly solve_full_body_framing: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => [number, number];
775
+ readonly solve_template_skeleton_fit: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
776
+ readonly template_skeleton_fit_solution_stride: () => number;
493
777
  readonly world_direction_for_camera_angle: (a: number, b: number, c: number) => [number, number];
494
778
  readonly camera_flight_sample_stride: () => number;
495
- readonly packed_morph_frame_delta_stride: () => number;
779
+ readonly build_hair_gravity_curves: (a: number, b: number) => [number, number, number, number];
780
+ readonly build_hair_idle_curves: (a: number, b: number, c: number) => [number, number, number, number];
781
+ readonly build_hair_impulse_curves: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
782
+ readonly compile_clip: (a: number, b: number) => [number, number, number, number];
783
+ readonly compile_clip_curves: (a: number, b: number) => [number, number, number, number];
784
+ readonly compose_template_skeleton_fit_transform: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
785
+ readonly get_preset_json: (a: number, b: number) => [number, number, number, number];
786
+ readonly has_preset: (a: number, b: number) => number;
787
+ readonly list_presets: () => [number, number];
788
+ readonly merge_embedded_preset: (a: number, b: number, c: number, d: number) => [number, number, number, number];
789
+ readonly merge_preset_profile: (a: number, b: number, c: number, d: number) => [number, number, number, number];
790
+ readonly resolve_embedded_profile_view: (a: number, b: number, c: number, d: number) => [number, number, number, number];
791
+ readonly resolve_profile_view: (a: number, b: number) => [number, number, number, number];
496
792
  readonly template_skeleton_fit_transform_stride: () => number;
497
- readonly analyze_mesh_proportions: (a: number, b: number, c: number) => [number, number];
498
- readonly compose_template_fit_adjustment: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
499
- readonly marker_endpoint_stride: () => number;
500
- readonly marker_visibility_animation_factors: (a: number, b: number) => [number, number];
501
- readonly mesh_proportions_stride: () => number;
502
- readonly passes_marker_camera_angle_gate: (a: number, b: number, c: number) => number;
503
- readonly resolve_viewport_constrained_line_scale: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
504
- readonly resolve_viewport_safe_bounds: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
505
- readonly sample_marker_arc_curve: (a: number, b: number, c: number, d: number, e: number) => [number, number];
506
- readonly sample_marker_bezier_curve: (a: number, b: number, c: number, d: number, e: number) => [number, number];
507
- readonly separate_overlapping_marker_endpoints: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
508
- readonly should_show_marker: (a: number, b: number, c: number, d: number) => number;
509
- readonly solve_axis_quaternion: (a: number, b: number, c: number, d: number) => [number, number];
510
- readonly solve_bilateral_values: (a: number, b: number) => [number, number];
511
- readonly solve_morph_batch: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
512
- readonly solve_template_skeleton_fit: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
513
- readonly template_skeleton_fit_solution_stride: () => number;
514
793
  readonly validate_generated_template_fit_metadata: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
515
- readonly marker_visibility_factors_stride: () => number;
794
+ readonly validate_humanoid_characterization: (a: number, b: number, c: number, d: number) => [number, number, number, number];
795
+ readonly validate_profile_model: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
796
+ readonly embody_request: (a: number, b: number) => [number, number, number, number];
516
797
  readonly __wbindgen_externrefs: WebAssembly.Table;
517
798
  readonly __wbindgen_malloc: (a: number, b: number) => number;
518
799
  readonly __wbindgen_free: (a: number, b: number, c: number) => void;