@lovelace_lol/embody 0.0.7 → 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.
Files changed (127) hide show
  1. package/README.md +541 -2394
  2. package/dist/index.d.ts +2 -100
  3. package/dist/index.js +7714 -12951
  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 +414 -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/gaze.d.ts +122 -0
  26. package/dist/three/index.d.ts +147 -0
  27. package/dist/three/model.d.ts +31 -0
  28. package/dist/three/modelSkinning.d.ts +3 -0
  29. package/dist/three/reference-pose.d.ts +73 -0
  30. package/dist/three/scene.d.ts +253 -0
  31. package/dist/three/sceneRenderingBinding.d.ts +22 -0
  32. package/dist/three.js +7696 -8936
  33. package/dist/three.js.map +1 -1
  34. package/dist/wasm/README.md +551 -62
  35. package/dist/wasm/auto.d.ts +1 -0
  36. package/dist/wasm/embody_wasm.d.ts +388 -52
  37. package/dist/wasm/embody_wasm.js +1514 -119
  38. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  39. package/dist/wasm/embody_wasm_bg.wasm.d.ts +115 -40
  40. package/dist/wasm/index.d.ts +126 -0
  41. package/dist/wasm.d.ts +1 -43
  42. package/dist/wasm.js +1043 -239
  43. package/dist/wasm.js.map +1 -1
  44. package/package.json +34 -39
  45. package/service-worker/character-asset-service-worker.js +295 -0
  46. package/dist/authoring/boneAuthoring.d.ts +0 -132
  47. package/dist/camera/annotationCameraAngles.d.ts +0 -28
  48. package/dist/camera/cameraRelativeGaze.d.ts +0 -15
  49. package/dist/camera/rustAnnotationCameraCore.d.ts +0 -136
  50. package/dist/cljs.cjs +0 -362
  51. package/dist/cljs.cjs.map +0 -1
  52. package/dist/cljs.d.ts +0 -5
  53. package/dist/cljs.js +0 -359
  54. package/dist/cljs.js.map +0 -1
  55. package/dist/core/TsClipCompiler.d.ts +0 -51
  56. package/dist/core/WasmRuntimeCore.d.ts +0 -41
  57. package/dist/core/compositeAxis.d.ts +0 -4
  58. package/dist/core/contracts/abi.d.ts +0 -70
  59. package/dist/core/contracts/clip.d.ts +0 -44
  60. package/dist/core/contracts/frame.d.ts +0 -27
  61. package/dist/core/contracts/host.d.ts +0 -28
  62. package/dist/core/contracts/ids.d.ts +0 -15
  63. package/dist/core/contracts/index.d.ts +0 -10
  64. package/dist/core/contracts/model.d.ts +0 -31
  65. package/dist/core/contracts/primitives.d.ts +0 -17
  66. package/dist/core/contracts/skeletonFit.d.ts +0 -41
  67. package/dist/core/index.d.ts +0 -6
  68. package/dist/core/types.d.ts +0 -472
  69. package/dist/core.cjs +0 -343
  70. package/dist/core.cjs.map +0 -1
  71. package/dist/core.js +0 -323
  72. package/dist/core.js.map +0 -1
  73. package/dist/engines/three/Embody.d.ts +0 -372
  74. package/dist/engines/three/ThreeAnimationRuntime.d.ts +0 -203
  75. package/dist/engines/three/ThreeClipAdapter.d.ts +0 -24
  76. package/dist/engines/three/ThreeFrameApplier.d.ts +0 -68
  77. package/dist/engines/three/ThreeModelInspector.d.ts +0 -54
  78. package/dist/engines/three/bakedClipPartitioning.d.ts +0 -16
  79. package/dist/engines/three/balanceUtils.d.ts +0 -3
  80. package/dist/engines/three/characterHost.d.ts +0 -80
  81. package/dist/engines/three/characterScene.d.ts +0 -98
  82. package/dist/engines/three/hair/HairPhysicsController.d.ts +0 -124
  83. package/dist/engines/three/index.d.ts +0 -20
  84. package/dist/engines/three/modelLoader.d.ts +0 -61
  85. package/dist/engines/three/profileTestScene.d.ts +0 -52
  86. package/dist/engines/three/types.d.ts +0 -20
  87. package/dist/hair/appearance.d.ts +0 -29
  88. package/dist/index.cjs +0 -14871
  89. package/dist/index.cjs.map +0 -1
  90. package/dist/interfaces/Animation.d.ts +0 -315
  91. package/dist/interfaces/EmbodyRuntime.d.ts +0 -90
  92. package/dist/interfaces/Hair.d.ts +0 -181
  93. package/dist/interfaces/HairPhysics.d.ts +0 -90
  94. package/dist/interfaces/index.d.ts +0 -11
  95. package/dist/mappings/extendPresetWithProfile.d.ts +0 -17
  96. package/dist/mappings/types.d.ts +0 -309
  97. package/dist/mappings/visemeSystem.d.ts +0 -26
  98. package/dist/physics/HairPhysics.d.ts +0 -86
  99. package/dist/physics/RustHairPhysics.d.ts +0 -18
  100. package/dist/physics/index.d.ts +0 -6
  101. package/dist/preset.cjs +0 -2005
  102. package/dist/preset.cjs.map +0 -1
  103. package/dist/preset.js +0 -2003
  104. package/dist/preset.js.map +0 -1
  105. package/dist/presets/bettaFish.d.ts +0 -328
  106. package/dist/presets/cc4.d.ts +0 -145
  107. package/dist/presets/index.d.ts +0 -30
  108. package/dist/presets/registry.d.ts +0 -57
  109. package/dist/profiles/resolveProfileConfig.d.ts +0 -36
  110. package/dist/profiles/rustResolvedProfile.d.ts +0 -31
  111. package/dist/profiles/types.d.ts +0 -118
  112. package/dist/regions/normalizeRegionTree.d.ts +0 -6
  113. package/dist/regions/regionMapping.d.ts +0 -17
  114. package/dist/regions/types.d.ts +0 -122
  115. package/dist/skeletonTemplates/humanoidSkeletonTemplates.d.ts +0 -32
  116. package/dist/test/setupWasm.d.ts +0 -1
  117. package/dist/three.cjs +0 -9550
  118. package/dist/three.cjs.map +0 -1
  119. package/dist/validation/analyzeModel.d.ts +0 -68
  120. package/dist/validation/extractModelData.d.ts +0 -90
  121. package/dist/validation/generateMappingCorrections.d.ts +0 -32
  122. package/dist/validation/geometryHelpers.d.ts +0 -66
  123. package/dist/validation/types.d.ts +0 -10
  124. package/dist/validation/validateMappings.d.ts +0 -77
  125. package/dist/wasm.cjs +0 -302
  126. package/dist/wasm.cjs.map +0 -1
  127. package/dist/wasmTypes.d.ts +0 -123
@@ -0,0 +1,122 @@
1
+ import type { Object3D } from 'three';
2
+ import type { ThreeModelReferencePose } from './reference-pose';
3
+ type Point = {
4
+ x: number;
5
+ y: number;
6
+ z: number;
7
+ };
8
+ type Rotation = Point & {
9
+ w: number;
10
+ };
11
+ type Target = {
12
+ x: number;
13
+ y: number;
14
+ z?: number;
15
+ };
16
+ type Flags = {
17
+ eyesEnabled?: boolean;
18
+ headEnabled?: boolean;
19
+ };
20
+ export type ThreeGazeFocusOptions = {
21
+ /** Reuse the import reference when constructing the constraint during playback. */
22
+ referencePose?: ThreeModelReferencePose;
23
+ };
24
+ export type ThreeGazeFocusRequest = Flags & {
25
+ worldTarget: Point;
26
+ /** Aggregate FACS bearing normalized against full head + eye capacities. */
27
+ target: Target;
28
+ headTarget?: Target;
29
+ eyeIntensity?: number;
30
+ headIntensity?: number;
31
+ };
32
+ export type ThreeGazeFocusControls = {
33
+ eyeYaw?: number;
34
+ eyePitch?: number;
35
+ headYaw?: number;
36
+ headPitch?: number;
37
+ headRoll?: number;
38
+ /** Animation-sampled contributions in [0, 1], overriding request values. */
39
+ eyeIntensity?: number;
40
+ headIntensity?: number;
41
+ };
42
+ export type ThreeGazeFocusDiagnostic = {
43
+ target: Point;
44
+ eyes: Array<{
45
+ name: string;
46
+ origin: Point;
47
+ direction: Point;
48
+ errorDegrees: number;
49
+ limited: boolean;
50
+ }>;
51
+ headLimited: boolean;
52
+ missingHead: boolean;
53
+ missingEyes: boolean;
54
+ };
55
+ /**
56
+ * A renderer constraint, driven by Animation's existing motor controls. It owns
57
+ * no clock, camera, target-selection policy, or event loop. Call restore before
58
+ * evaluating the mixer (and before changing bindings), then apply afterwards.
59
+ * Keeping the evaluated base pose separate prevents corrections feeding back
60
+ * through Three's unchanged-property optimization on paused/constant clips.
61
+ *
62
+ * Optional profile.gazeCalibration.{head,leftEye,rightEye}.opticalAxis supplies
63
+ * a bone-local optical direction. Otherwise signed yaw/pitch bindings determine
64
+ * it: CC4's eye rz/negative-rx axes yield -Y; head ry/negative-rx yield +Z.
65
+ */
66
+ export declare class ThreeGazeFocus {
67
+ private model;
68
+ private profile;
69
+ private head?;
70
+ private eyes;
71
+ private saved;
72
+ private references;
73
+ private limits;
74
+ constructor(model: Object3D, profile: any, options?: ThreeGazeFocusOptions);
75
+ private name;
76
+ private binding;
77
+ private capacity;
78
+ private joint;
79
+ restore(): void;
80
+ private controlLimits;
81
+ private angles;
82
+ private ratio;
83
+ private degrees;
84
+ private direction;
85
+ private ray;
86
+ /** Seed motor clips from the rendered bearing when enabling pose constraints. */
87
+ readControlState(options?: Flags & {
88
+ worldTarget?: Point;
89
+ headIntensity?: number;
90
+ eyeIntensity?: number;
91
+ headBaseQuaternion?: Rotation;
92
+ eyeBaseQuaternions?: Record<string, Rotation>;
93
+ }): {
94
+ target: {
95
+ x: number;
96
+ y: number;
97
+ z: number;
98
+ } | undefined;
99
+ eyeTarget: {
100
+ x: number;
101
+ y: number;
102
+ z: number;
103
+ };
104
+ headTarget: {
105
+ x: number;
106
+ y: number;
107
+ z: number;
108
+ };
109
+ headRoll: number;
110
+ headSeedLimited: boolean;
111
+ eyeSeedLimited: boolean;
112
+ };
113
+ private origin;
114
+ private rotation;
115
+ private referenceParent;
116
+ private jointPose;
117
+ private solveJoint;
118
+ private contributedPose;
119
+ private solve;
120
+ apply(request: ThreeGazeFocusRequest, controls: ThreeGazeFocusControls): ThreeGazeFocusDiagnostic;
121
+ }
122
+ export {};
@@ -0,0 +1,147 @@
1
+ import { AnimationClip } from 'three';
2
+ export * from './annotations/index';
3
+ import type { ThreeModelReferencePose } from './reference-pose';
4
+ export { captureModelReferencePose, bindModelReferencePose, extendModelReferencePose } from './reference-pose';
5
+ export type { ThreeModelReferencePose, ThreeReferencePoseNode } from './reference-pose';
6
+ import type { Material, Mesh, Object3D } from 'three';
7
+ export { ThreeGazeFocus } from './gaze';
8
+ export type { ThreeGazeFocusOptions, ThreeGazeFocusRequest, ThreeGazeFocusControls, ThreeGazeFocusDiagnostic } from './gaze';
9
+ export declare const THREE_BLENDING_MODES: {
10
+ readonly Normal: 1;
11
+ readonly Additive: 2;
12
+ readonly Subtractive: 3;
13
+ readonly Multiply: 4;
14
+ readonly None: 0;
15
+ };
16
+ type BoneEntry = {
17
+ obj: Object3D;
18
+ basePos: {
19
+ x: number;
20
+ y: number;
21
+ z: number;
22
+ };
23
+ baseQuat: ReturnType<Object3D['quaternion']['clone']>;
24
+ baseEuler: {
25
+ x: number;
26
+ y: number;
27
+ z: number;
28
+ order: string;
29
+ };
30
+ };
31
+ type MorphTargetInput = {
32
+ meshName: string;
33
+ name: string;
34
+ relative?: boolean;
35
+ position: ArrayLike<number>;
36
+ normal?: ArrayLike<number>;
37
+ tangent?: ArrayLike<number>;
38
+ color?: ArrayLike<number>;
39
+ };
40
+ type AddMorphTargetOptions = {
41
+ forceGeometryReplacement?: boolean;
42
+ replace?: boolean;
43
+ resetInfluence?: boolean;
44
+ };
45
+ export type ThreeModelInspection = {
46
+ descriptor: Record<string, unknown>;
47
+ meshByName: Map<string, Mesh>;
48
+ allMeshes: Mesh[];
49
+ morphMeshes: Mesh[];
50
+ bones: Record<string, BoneEntry>;
51
+ meshBindings: Map<number, Mesh>;
52
+ morphBindings: Map<number, {
53
+ mesh: Mesh;
54
+ index: number;
55
+ }>;
56
+ boneBindings: Map<number, Object3D>;
57
+ objectBindings: Map<number, Object3D>;
58
+ };
59
+ export declare class ThreeModelInspector {
60
+ inspectModel(model: Object3D, options?: {
61
+ meshes?: Mesh[];
62
+ profile?: any;
63
+ /** Explicit reference captured before playback; omitted keeps legacy current-pose inspection. */
64
+ referencePose?: ThreeModelReferencePose;
65
+ }): ThreeModelInspection;
66
+ }
67
+ export type ClipIRTrack = {
68
+ id?: number;
69
+ channelId?: number;
70
+ target: {
71
+ kind?: string;
72
+ meshId?: number;
73
+ morphTargetId?: number;
74
+ boneId?: number;
75
+ objectId?: number;
76
+ property?: string;
77
+ };
78
+ valueType: string;
79
+ times: number[];
80
+ values: number[];
81
+ interpolation?: string;
82
+ /** Replace the first sample with the bound property's current value. */
83
+ inheritStart?: boolean;
84
+ sourceName?: string;
85
+ };
86
+ export type ClipIR = {
87
+ name: string;
88
+ durationSeconds?: number;
89
+ tracks: ClipIRTrack[];
90
+ };
91
+ /**
92
+ * Convert host-neutral ClipIR (concrete morph/bone tracks) into a Three.js
93
+ * AnimationClip. The host AnimationMixer owns playback and lerping.
94
+ *
95
+ * Inherited starts are captured from the current scene during this call. Cache
96
+ * the ClipIR and call this again immediately before each play/replay, including
97
+ * utterance replacement. Reusing a returned AnimationClip retains its old start.
98
+ * The source ClipIR is never modified. A delayed inherited first key holds the
99
+ * captured pose until that timestamp, matching ordinary Three track sampling.
100
+ */
101
+ export declare function createAnimationClipFromClipIR(clip: ClipIR, inspection: ThreeModelInspection): AnimationClip;
102
+ export declare function serializeAnimationClips(model: Object3D, clips: readonly AnimationClip[], inspection: ThreeModelInspection): {
103
+ name: string;
104
+ durationSeconds: number;
105
+ channels: {
106
+ id: number;
107
+ kind: string;
108
+ name: string;
109
+ }[];
110
+ tracks: Record<string, unknown>[];
111
+ }[];
112
+ type MaterialConfig = {
113
+ renderOrder?: number;
114
+ transparent?: boolean;
115
+ opacity?: number;
116
+ depthWrite?: boolean;
117
+ depthTest?: boolean;
118
+ blending?: keyof typeof THREE_BLENDING_MODES;
119
+ };
120
+ export declare class ThreeFrameApplier {
121
+ private meshes;
122
+ private morphs;
123
+ private bones;
124
+ private objects;
125
+ private originalEmissive;
126
+ setBindings(inspection: ThreeModelInspection): void;
127
+ applyPackedMorphFrameDelta(values: ArrayLike<number>, stride?: number): void;
128
+ applyPackedBoneFrameDelta(values: ArrayLike<number>, stride?: number): void;
129
+ applySceneFrame(frame: string | Record<string, any>): void;
130
+ applyMeshMaterialConfigs(root: Object3D, configs: Record<string, {
131
+ visible?: boolean;
132
+ material?: MaterialConfig;
133
+ }>): void;
134
+ getMeshMaterialConfig(root: Object3D, name: string): null;
135
+ setMeshMaterialConfig(root: Object3D, name: string, config: MaterialConfig): void;
136
+ setMeshVisible(root: Object3D, name: string, visible: boolean): void;
137
+ highlightMesh(root: Object3D, name: string | null, color?: number, intensity?: number): void;
138
+ applyHairAppearance(meshes: readonly Mesh[], appearance: any): void;
139
+ addMorphTarget(root: Object3D, target: MorphTargetInput, options?: AddMorphTargetOptions): number;
140
+ addMorphTargets(root: Object3D, targets: readonly MorphTargetInput[], options?: AddMorphTargetOptions): Record<string, number>;
141
+ private applyMorphTargetToStage;
142
+ private applyMaterial;
143
+ private visitMesh;
144
+ }
145
+ export declare const collectMorphMeshes: (root: Object3D) => Mesh<import("three").BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>, Material<import("three").MaterialEventMap> | Material<import("three").MaterialEventMap>[], import("three").Object3DEventMap>[];
146
+ export * from './model';
147
+ export * from './scene';
@@ -0,0 +1,31 @@
1
+ import type { AnimationClip, Mesh, Object3D, Scene } from 'three';
2
+ import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';
3
+ export type CharacterModelLoadResult = {
4
+ model: Object3D;
5
+ meshes: Mesh[];
6
+ animations: AnimationClip[];
7
+ gltf: GLTF | null;
8
+ };
9
+ export type CharacterModelLoadOptions = {
10
+ onProgress?: (progress: number) => void;
11
+ castShadows?: boolean;
12
+ dracoDecoderPath?: string;
13
+ };
14
+ export type CharacterModelTransform = {
15
+ modelOffset?: {
16
+ x?: number;
17
+ y?: number;
18
+ z?: number;
19
+ };
20
+ modelRotation?: {
21
+ x?: number;
22
+ y?: number;
23
+ z?: number;
24
+ };
25
+ modelScale?: number;
26
+ modelGroundClearance?: number;
27
+ };
28
+ export declare function applyCharacterModelTransform(model: Object3D, value?: CharacterModelTransform): void;
29
+ export declare function disposeCharacterModel(scene: Scene | null, model: Object3D): void;
30
+ export declare function loadCharacterModel(url: string, options?: CharacterModelLoadOptions): Promise<CharacterModelLoadResult>;
31
+ export declare function parseCharacterModel(data: ArrayBuffer, resourcePath?: string, options?: CharacterModelLoadOptions): Promise<CharacterModelLoadResult>;
@@ -0,0 +1,3 @@
1
+ import type { Object3D } from 'three';
2
+ /** Keep joint indices compatible with both native WebGPU and WebGL skinning. */
3
+ export declare function prepareModelSkinning(model: Object3D): () => void;
@@ -0,0 +1,73 @@
1
+ import type { Object3D } from 'three';
2
+ type ReferenceVector3 = Readonly<{
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ }>;
7
+ type ReferenceQuaternion = Readonly<{
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ w: number;
12
+ }>;
13
+ export type ThreeReferencePoseNode = Readonly<{
14
+ /** Child-index path relative to the captured model. The model itself has path ''. */
15
+ path: string;
16
+ parentPath: string | null;
17
+ name: string;
18
+ type: string;
19
+ isBone: boolean;
20
+ rotationOrder: Object3D['rotation']['order'];
21
+ /** Authored Euler values for automatic TRS, including rotations beyond one turn. */
22
+ rotationEuler?: ReferenceVector3;
23
+ childCount: number;
24
+ /** For manual matrices, this is a decomposition; matrices remain authoritative for shear. */
25
+ transform: Readonly<{
26
+ position: ReferenceVector3;
27
+ rotation: ReferenceQuaternion;
28
+ scale: ReferenceVector3;
29
+ }>;
30
+ /** Column-major local and world matrices, including shear and non-bone ancestors. */
31
+ localMatrix: readonly number[];
32
+ worldMatrix: readonly number[];
33
+ worldPosition: ReferenceVector3;
34
+ /** Optional morph baseline captured independently from later live influences. */
35
+ morphInfluences?: readonly number[];
36
+ }>;
37
+ export type ThreeModelReferencePose = Readonly<{
38
+ version: 1;
39
+ /** Captured transform above the model root; identity for an unparented model. */
40
+ parentWorldMatrix: readonly number[];
41
+ nodes: readonly ThreeReferencePoseNode[];
42
+ }>;
43
+ /**
44
+ * Explicitly capture the authored reference pose before starting animation.
45
+ * This does not infer a skin bind pose or animation frame zero: it snapshots the
46
+ * transforms supplied by the caller, without updating or otherwise mutating the scene.
47
+ * World matrices are calculated from the full ancestor chain's local transforms,
48
+ * not potentially stale matrixWorld values. All returned data is deeply frozen and
49
+ * JSON-serializable; no object, UUID, or live transform references are retained.
50
+ * Existing morph influences are copied as an optional baseline. Non-finite data
51
+ * or manual matrices with a zero-length basis axis/non-finite TRS decomposition throw.
52
+ */
53
+ export declare function captureModelReferencePose(model: Object3D): ThreeModelReferencePose;
54
+ /**
55
+ * Explicitly extend a reference after appending children, such as a generated
56
+ * skeleton. Existing structural paths, names, kinds and child order must match;
57
+ * removing or inserting before an existing child is incompatible. Existing
58
+ * captured data remains unchanged except child counts. Newly appended subtrees
59
+ * use their current local transforms beneath the CAPTURED parent world matrix,
60
+ * so playback and later scene placement never become the old rig's reference.
61
+ * Returns a new deeply frozen snapshot without mutating the model or previous
62
+ * data. Identical sibling swaps cannot be distinguished by structural identity.
63
+ */
64
+ export declare function extendModelReferencePose(model: Object3D, previous: ThreeModelReferencePose): ThreeModelReferencePose;
65
+ /**
66
+ * Resolve captured data against an identically structured model, including a fresh
67
+ * clone/load with new UUIDs. Names, types, bone flags, and child ordering must match;
68
+ * duplicate names are distinguished by structural path, never name lookup.
69
+ * Current transforms and the model's external scene parent are deliberately ignored.
70
+ * An incompatible hierarchy throws before a binding map is returned.
71
+ */
72
+ export declare function bindModelReferencePose(model: Object3D, referencePose: ThreeModelReferencePose): ReadonlyMap<Object3D, ThreeReferencePoseNode>;
73
+ export {};
@@ -0,0 +1,253 @@
1
+ import { Mesh, PerspectiveCamera, PlaneGeometry, Scene, ShadowMaterial, WebGLRenderer } from 'three';
2
+ import type { ColorRepresentation, Texture } from 'three';
3
+ import type { WebGPURenderer } from 'three/webgpu';
4
+ export type DefaultCharacterLightingSettings = {
5
+ envMapEnabled: boolean;
6
+ environmentIntensity: number;
7
+ environmentBlur: number;
8
+ exposure: number;
9
+ ambientIntensity: number;
10
+ keyIntensity: number;
11
+ fillIntensity: number;
12
+ rimIntensity: number;
13
+ shadowOpacity: number;
14
+ };
15
+ export declare const DEFAULT_CHARACTER_LIGHTING_PRESETS: {
16
+ readonly cleanStudio: {
17
+ readonly id: "cleanStudio";
18
+ readonly label: "Soft Studio";
19
+ readonly settings: {
20
+ readonly envMapEnabled: true;
21
+ readonly environmentIntensity: 0.24;
22
+ readonly environmentBlur: 0.04;
23
+ readonly exposure: 1.08;
24
+ readonly ambientIntensity: 0.32;
25
+ readonly keyIntensity: 0.52;
26
+ readonly fillIntensity: 0.18;
27
+ readonly rimIntensity: 0.08;
28
+ readonly shadowOpacity: 0.22;
29
+ };
30
+ };
31
+ readonly softFill: {
32
+ readonly id: "softFill";
33
+ readonly label: "Soft Fill";
34
+ readonly settings: {
35
+ readonly envMapEnabled: true;
36
+ readonly environmentIntensity: 0.3;
37
+ readonly environmentBlur: 0.04;
38
+ readonly exposure: 1.1;
39
+ readonly ambientIntensity: 0.38;
40
+ readonly keyIntensity: 0.44;
41
+ readonly fillIntensity: 0.24;
42
+ readonly rimIntensity: 0.1;
43
+ readonly shadowOpacity: 0.18;
44
+ };
45
+ };
46
+ readonly inspection: {
47
+ readonly id: "inspection";
48
+ readonly label: "Inspection";
49
+ readonly settings: {
50
+ readonly envMapEnabled: true;
51
+ readonly environmentIntensity: 0.45;
52
+ readonly environmentBlur: 0.035;
53
+ readonly exposure: 1.18;
54
+ readonly ambientIntensity: 0.48;
55
+ readonly keyIntensity: 0.58;
56
+ readonly fillIntensity: 0.32;
57
+ readonly rimIntensity: 0.14;
58
+ readonly shadowOpacity: 0.12;
59
+ };
60
+ };
61
+ readonly contrast: {
62
+ readonly id: "contrast";
63
+ readonly label: "Contrast";
64
+ readonly settings: {
65
+ readonly envMapEnabled: true;
66
+ readonly environmentIntensity: 0.2;
67
+ readonly environmentBlur: 0.035;
68
+ readonly exposure: 1.08;
69
+ readonly ambientIntensity: 0.25;
70
+ readonly keyIntensity: 0.7;
71
+ readonly fillIntensity: 0.12;
72
+ readonly rimIntensity: 0.22;
73
+ readonly shadowOpacity: 0.28;
74
+ };
75
+ };
76
+ };
77
+ export type DefaultCharacterLightingPresetId = keyof typeof DEFAULT_CHARACTER_LIGHTING_PRESETS;
78
+ export declare const DEFAULT_CHARACTER_LIGHTING_PRESET_ID: DefaultCharacterLightingPresetId;
79
+ export declare const DEFAULT_CHARACTER_LIGHTING_PRESET_IDS: DefaultCharacterLightingPresetId[];
80
+ export declare const DEFAULT_CHARACTER_LIGHTING_SETTINGS: DefaultCharacterLightingSettings;
81
+ export declare const CHARACTER_SCENE_TYPES: {
82
+ readonly studio: {
83
+ readonly id: "studio";
84
+ readonly label: "Studio";
85
+ readonly description: "Transparent background, soft studio lighting, ground shadow.";
86
+ readonly background: null;
87
+ readonly lightingPreset: "cleanStudio";
88
+ readonly shadowPlane: true;
89
+ };
90
+ readonly showcase: {
91
+ readonly id: "showcase";
92
+ readonly label: "Showcase";
93
+ readonly description: "Dark backdrop with contrasty key/rim lighting for presentation shots.";
94
+ readonly background: 1053206;
95
+ readonly lightingPreset: "contrast";
96
+ readonly shadowPlane: true;
97
+ };
98
+ readonly inspection: {
99
+ readonly id: "inspection";
100
+ readonly label: "Inspection";
101
+ readonly description: "Bright, even lighting on a light backdrop for close-up review.";
102
+ readonly background: 15264493;
103
+ readonly lightingPreset: "inspection";
104
+ readonly shadowPlane: true;
105
+ };
106
+ readonly void: {
107
+ readonly id: "void";
108
+ readonly label: "Void";
109
+ readonly description: "Transparent background, soft fill lighting, no ground shadow.";
110
+ readonly background: null;
111
+ readonly lightingPreset: "softFill";
112
+ readonly shadowPlane: false;
113
+ };
114
+ };
115
+ export type CharacterSceneTypeId = keyof typeof CHARACTER_SCENE_TYPES;
116
+ export declare const CHARACTER_SCENE_TYPE_IDS: CharacterSceneTypeId[];
117
+ export declare const DEFAULT_CHARACTER_SCENE_TYPE_ID: CharacterSceneTypeId;
118
+ export type DefaultCharacterSceneOptions = {
119
+ type?: CharacterSceneTypeId;
120
+ background?: ColorRepresentation | null;
121
+ cameraFov?: number;
122
+ pixelRatioCap?: number;
123
+ shadows?: boolean;
124
+ lightingPreset?: DefaultCharacterLightingPresetId;
125
+ lighting?: Partial<DefaultCharacterLightingSettings>;
126
+ shadowPlane?: boolean;
127
+ manageResize?: boolean;
128
+ };
129
+ export type DefaultCharacterSceneAsyncOptions = DefaultCharacterSceneOptions & {
130
+ /** Auto (default) tries native WebGPU initialization, then falls back to WebGL. */
131
+ renderer?: CharacterSceneRendererPreference;
132
+ /** Persistent settings take precedence over the legacy renderer option. */
133
+ rendering?: Partial<CharacterSceneRenderingSettings>;
134
+ /** Cancels construction, not ownership of a successfully returned scene. */
135
+ signal?: AbortSignal;
136
+ /** Compatibility notification; rendering snapshots also expose device loss. */
137
+ onDeviceLost?: (error: Error) => void;
138
+ };
139
+ export type CharacterSceneRenderer = WebGLRenderer | WebGPURenderer;
140
+ export type CharacterSceneBackend = 'webgl' | 'webgpu';
141
+ export type CharacterSceneRendererPreference = 'auto' | CharacterSceneBackend;
142
+ type CharacterScene<R extends CharacterSceneRenderer> = {
143
+ container: HTMLElement;
144
+ scene: Scene;
145
+ renderer: R;
146
+ camera: PerspectiveCamera;
147
+ lighting: ReturnType<typeof createDefaultCharacterLighting>;
148
+ shadowPlane: ReturnType<typeof createShadowPlane> | null;
149
+ sceneType: CharacterSceneTypeId;
150
+ ownsScene: true;
151
+ resize: () => void;
152
+ dispose: () => void;
153
+ };
154
+ export type DefaultCharacterScene = CharacterScene<WebGLRenderer>;
155
+ export type CharacterSceneRenderingSettings = {
156
+ preference: CharacterSceneRendererPreference;
157
+ };
158
+ export type CharacterSceneRenderingStatus = 'initializing' | 'switching' | 'ready' | 'error' | 'lost' | 'disposed';
159
+ export type CharacterSceneRenderingSnapshot = {
160
+ readonly settings: CharacterSceneRenderingSettings;
161
+ readonly status: CharacterSceneRenderingStatus;
162
+ readonly error: Error | null;
163
+ } & ({
164
+ readonly backend: 'webgl';
165
+ readonly renderer: WebGLRenderer;
166
+ } | {
167
+ readonly backend: 'webgpu';
168
+ readonly renderer: WebGPURenderer;
169
+ } | {
170
+ readonly backend: null;
171
+ readonly renderer: null;
172
+ });
173
+ export type CharacterSceneRendererLease = {
174
+ readonly renderer: CharacterSceneRenderer;
175
+ release(): void;
176
+ };
177
+ export interface CharacterSceneRenderingController {
178
+ getSettings(): CharacterSceneRenderingSettings;
179
+ getSnapshot(): CharacterSceneRenderingSnapshot;
180
+ setSettings(patch: Partial<CharacterSceneRenderingSettings>): Promise<CharacterSceneRenderingSnapshot>;
181
+ subscribe(listener: (snapshot: CharacterSceneRenderingSnapshot) => void): () => void;
182
+ /** Borrow for capture/readback; release in finally. Unavailable during switching/loss. */
183
+ acquireRenderer(): CharacterSceneRendererLease;
184
+ /** Drain borrowed work, then synchronously detach/free caller-owned resources, even after loss/disposal. */
185
+ releaseSceneResources(release: () => void): Promise<void>;
186
+ }
187
+ export type DefaultCharacterSceneRuntimeOptions = DefaultCharacterSceneAsyncOptions;
188
+ export type DefaultCharacterSceneRuntime = Omit<CharacterScene<CharacterSceneRenderer>, 'renderer' | 'dispose'> & {
189
+ readonly renderer: CharacterSceneRenderer | null;
190
+ readonly backend: CharacterSceneBackend | null;
191
+ dispose(): Promise<void>;
192
+ readonly rendering: CharacterSceneRenderingController;
193
+ readonly ready: Promise<CharacterSceneRenderingSnapshot>;
194
+ };
195
+ export type ReadyDefaultCharacterScene = ((Omit<DefaultCharacterScene, 'dispose'> & {
196
+ readonly backend: 'webgl';
197
+ }) | (Omit<CharacterScene<WebGPURenderer>, 'dispose'> & {
198
+ readonly backend: 'webgpu';
199
+ })) & {
200
+ readonly rendering: CharacterSceneRenderingController;
201
+ dispose(): Promise<void>;
202
+ };
203
+ export declare const normalizeDefaultCharacterLightingSettings: (value: unknown) => DefaultCharacterLightingSettings | null;
204
+ export declare function createShadowPlane(scene: Scene, options?: {
205
+ size?: number;
206
+ opacity?: number;
207
+ yPosition?: number;
208
+ }): Mesh<PlaneGeometry, ShadowMaterial, import("three").Object3DEventMap>;
209
+ export declare function createDefaultCharacterLighting(scene: Scene, renderer: WebGLRenderer, initial?: Partial<DefaultCharacterLightingSettings>): {
210
+ getSettings: () => {
211
+ envMapEnabled: boolean;
212
+ environmentIntensity: number;
213
+ environmentBlur: number;
214
+ exposure: number;
215
+ ambientIntensity: number;
216
+ keyIntensity: number;
217
+ fillIntensity: number;
218
+ rimIntensity: number;
219
+ shadowOpacity: number;
220
+ };
221
+ getEnvironmentTexture: () => Texture | null;
222
+ setSettings: (patch: Partial<DefaultCharacterLightingSettings>) => {
223
+ envMapEnabled: boolean;
224
+ environmentIntensity: number;
225
+ environmentBlur: number;
226
+ exposure: number;
227
+ ambientIntensity: number;
228
+ keyIntensity: number;
229
+ fillIntensity: number;
230
+ rimIntensity: number;
231
+ shadowOpacity: number;
232
+ };
233
+ setPreset: (id: DefaultCharacterLightingPresetId) => {
234
+ envMapEnabled: boolean;
235
+ environmentIntensity: number;
236
+ environmentBlur: number;
237
+ exposure: number;
238
+ ambientIntensity: number;
239
+ keyIntensity: number;
240
+ fillIntensity: number;
241
+ rimIntensity: number;
242
+ shadowOpacity: number;
243
+ };
244
+ subscribe: (listener: (value: DefaultCharacterLightingSettings) => void) => () => void;
245
+ dispose: () => void;
246
+ };
247
+ /** The existing synchronous WebGL path; it does not wait for shader compilation. */
248
+ export declare function createDefaultCharacterScene(container: HTMLElement, options?: DefaultCharacterSceneOptions): DefaultCharacterScene;
249
+ /** Stable scene ownership, including a recoverable initial renderer failure. */
250
+ export declare function createDefaultCharacterSceneRuntime(container: HTMLElement, options?: DefaultCharacterSceneRuntimeOptions): DefaultCharacterSceneRuntime;
251
+ /** Compatibility factory: failure releases all owned resources. Use the runtime factory for initial retry. */
252
+ export declare function createDefaultCharacterSceneAsync(container: HTMLElement, options?: DefaultCharacterSceneAsyncOptions): Promise<ReadyDefaultCharacterScene>;
253
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { PerspectiveCamera, Scene } from 'three';
2
+ import type { CharacterSceneRenderer, CharacterSceneRenderingController } from './scene';
3
+ /** Adapter-private binding. Applications pass config.rendering to the camera controller. */
4
+ export type SceneRenderingBinding = {
5
+ suspend(): Promise<void>;
6
+ prepare(renderer: CharacterSceneRenderer): Promise<void>;
7
+ commit(renderer: CharacterSceneRenderer): Promise<void>;
8
+ onError(error: unknown): void;
9
+ };
10
+ type Owner = {
11
+ scene: Scene;
12
+ camera: PerspectiveCamera;
13
+ binding: SceneRenderingBinding | null;
14
+ disposed: boolean;
15
+ drain: Promise<void> | null;
16
+ settled: () => Promise<unknown> | null;
17
+ reportFailure: (error: unknown, renderer?: CharacterSceneRenderer | null) => void;
18
+ };
19
+ export declare function registerSceneRendering(controller: CharacterSceneRenderingController, scene: Scene, camera: PerspectiveCamera, settled: () => Promise<unknown> | null, reportFailure: (error: unknown, renderer?: CharacterSceneRenderer | null) => void): Owner;
20
+ export declare function bindSceneRendering(controller: CharacterSceneRenderingController, scene: Scene, camera: PerspectiveCamera, binding: SceneRenderingBinding): () => Promise<undefined> | null;
21
+ export declare function reportSceneRenderingFailure(controller: CharacterSceneRenderingController, error: unknown, renderer?: CharacterSceneRenderer | null): void;
22
+ export {};