@lovelace_lol/embody 0.0.12 → 0.0.14

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 (47) hide show
  1. package/README.md +106 -23
  2. package/dist/index.js +3286 -5900
  3. package/dist/index.js.map +1 -1
  4. package/dist/three/annotations/DOMControls.d.ts +5 -1
  5. package/dist/three/annotations/HtmlAnnotationMarkers.d.ts +5 -0
  6. package/dist/three/annotations/OverlayAnnotationMarkers.d.ts +1 -0
  7. package/dist/three/annotations/ThreeAnnotationController.d.ts +145 -0
  8. package/dist/three/annotations/ThreeAnnotationControls.d.ts +42 -0
  9. package/dist/three/annotations/ThreeAnnotationMarkers.d.ts +42 -0
  10. package/dist/three/annotations/ThreeAnnotationRenderer.d.ts +35 -0
  11. package/dist/three/annotations/{DPthree.d.ts → ThreeAnnotations.d.ts} +18 -27
  12. package/dist/three/annotations/adapter.d.ts +2 -8
  13. package/dist/three/annotations/annotationAnchorModel.d.ts +0 -4
  14. package/dist/three/annotations/index.d.ts +9 -8
  15. package/dist/three/annotations/lifecycleBridge.d.ts +26 -0
  16. package/dist/three/annotations/markerVisibilityLifecycle.d.ts +8 -7
  17. package/dist/three/annotations/modelObservation.d.ts +44 -0
  18. package/dist/three/annotations/runtime.d.ts +46 -0
  19. package/dist/three/annotations/runtimeAnnotationPreview.d.ts +2 -2
  20. package/dist/three/annotations/runtimeAnnotationPreviewSide.d.ts +0 -4
  21. package/dist/three/annotations/runtimeAnnotationSidePreview.d.ts +2 -1
  22. package/dist/three/annotations/types.d.ts +7 -8
  23. package/dist/three/authoring.d.ts +1 -1
  24. package/dist/three/characterHost.d.ts +33 -5
  25. package/dist/three/characterTexturePalette.d.ts +6 -0
  26. package/dist/three/editor/SkeletonOverlay.d.ts +128 -0
  27. package/dist/three/editor/morphVertexPreview.d.ts +35 -0
  28. package/dist/three/index.d.ts +2 -0
  29. package/dist/three/modelMorphLayout.d.ts +13 -0
  30. package/dist/three/scene.d.ts +5 -0
  31. package/dist/three/sceneInkBackground.d.ts +11 -0
  32. package/dist/three/sceneInkBackgroundStyle.d.ts +5 -0
  33. package/dist/three.js +3286 -5900
  34. package/dist/three.js.map +1 -1
  35. package/dist/wasm/README.md +106 -23
  36. package/dist/wasm/embody_wasm.d.ts +191 -85
  37. package/dist/wasm/embody_wasm.js +455 -2
  38. package/dist/wasm/embody_wasm_bg.wasm +0 -0
  39. package/dist/wasm/embody_wasm_bg.wasm.d.ts +116 -83
  40. package/dist/wasm/index.d.ts +1 -1
  41. package/dist/wasm.js.map +1 -1
  42. package/package.json +2 -2
  43. package/dist/three/annotations/DPthree3DMarkers.d.ts +0 -320
  44. package/dist/three/annotations/DPthreeCameraController.d.ts +0 -415
  45. package/dist/three/annotations/DPthreeHTMLMarkers.d.ts +0 -131
  46. package/dist/three/annotations/DPthreeMarkers.d.ts +0 -52
  47. package/dist/three/annotations/animationFrameTaskScheduler.d.ts +0 -18
@@ -180,9 +180,8 @@ export interface CharacterRegistry {
180
180
  defaultCharacter?: string;
181
181
  }
182
182
  export type AUPresetType = string;
183
- export type DPthreeRegion = AnnotationAnchoredRegion;
184
- export type DPthreeCharacterConfig = AnnotationCharacterConfig;
185
- export type DPthreeRegistry = CharacterRegistry;
183
+ export type AnnotationRegion = AnnotationAnchoredRegion;
184
+ export type AnnotationRegistry = CharacterRegistry;
186
185
  /**
187
186
  * Camera state for save/restore
188
187
  */
@@ -191,16 +190,16 @@ export interface CameraState {
191
190
  target: [number, number, number];
192
191
  }
193
192
  /**
194
- * Configuration for DPthreeCameraController
193
+ * Configuration for ThreeAnnotationController
195
194
  */
196
- export interface DPthreeCameraControllerConfig {
195
+ export interface ThreeAnnotationControllerConfig {
197
196
  /** Optional selection override; otherwise selecting a region focuses the camera. */
198
197
  onRegionSelect?: (name: string) => void;
199
198
  /** Optional host profile intake; defaults to Embody preset resolution. */
200
199
  resolveCharacterConfig?: (config: AnnotationCharacterConfig) => AnnotationCharacterConfig | Promise<AnnotationCharacterConfig>;
201
200
  /** The Three.js camera to control */
202
201
  camera: THREE.PerspectiveCamera;
203
- /** DOM element for OrbitControls (usually the canvas or its container) */
202
+ /** DOM element for Rust camera gestures (usually the canvas or its container) */
204
203
  domElement: HTMLElement;
205
204
  /** The Three.js scene */
206
205
  scene: THREE.Scene;
@@ -258,5 +257,5 @@ export type RegionChangeCallback = (regionName: string) => void;
258
257
  * Callback for character change events
259
258
  */
260
259
  export type CharacterChangeCallback = (config: CharacterConfig) => void;
261
- export type DPthreeRegionChangeCallback = RegionChangeCallback;
262
- export type DPthreeCharacterChangeCallback = CharacterChangeCallback;
260
+ export type AnnotationRegionChangeCallback = RegionChangeCallback;
261
+ export type AnnotationCharacterChangeCallback = CharacterChangeCallback;
@@ -75,7 +75,7 @@ export declare function analyzeModel(options: {
75
75
  preset?: Types.Profile;
76
76
  suggestCorrections?: boolean;
77
77
  }): Promise<Types.ModelAnalysisReport>;
78
- export declare function validateMappings(meshes: unknown[], skeleton: unknown, profile: Types.Profile, options?: Record<string, unknown>): Types.ValidationResult;
78
+ export declare function validateMappings(meshes: unknown[], skeleton: unknown, profile: Partial<Types.Profile>, options?: Record<string, unknown>): Types.ValidationResult;
79
79
  export declare function validateHumanoidCharacterization(model: Object3D, profile: Types.Profile): Types.HumanoidCharacterizationResolution;
80
80
  export declare function normalizeHairColorAppearance(value: Types.HairColorAppearance | string, fallback?: Types.HairColorAppearance): Types.HairColorAppearance;
81
81
  export declare const getHumanoidSkeletonTemplate: (id: string) => Types.HumanoidSkeletonTemplate | null;
@@ -2,12 +2,16 @@ import type { Camera, Scene } from 'three';
2
2
  import { Embody } from './character';
3
3
  import type { RustEmbodyHostConfig } from './character';
4
4
  import type { CharacterModelLoadOptions, CharacterModelLoadResult, CharacterModelTransform } from './model';
5
- import type { CharacterSceneBackend, CharacterSceneRenderer, CharacterSceneRenderingController, DefaultCharacterSceneAsyncOptions, ReadyDefaultCharacterScene } from './scene';
5
+ import type { CharacterSceneBackend, CharacterSceneConfiguration, CharacterSceneRenderer, CharacterSceneRenderingController, DefaultCharacterSceneAsyncOptions, ReadyDefaultCharacterScene } from './scene';
6
+ import { ThreeAnnotationController } from './annotations/ThreeAnnotationController';
7
+ import type { AnnotationCharacterConfig, ThreeAnnotationControllerConfig } from './annotations/types';
6
8
  import type { Profile } from './authoringTypes';
7
9
  export interface CharacterHostCharacterOptions extends CharacterModelTransform {
8
10
  modelUrl: string;
9
11
  presetType?: string;
10
- profile?: Profile;
12
+ profile?: Partial<Profile>;
13
+ annotationConfig?: AnnotationCharacterConfig;
14
+ scene?: CharacterSceneConfiguration;
11
15
  }
12
16
  export interface CharacterHostExternalScene {
13
17
  scene: Scene;
@@ -17,7 +21,22 @@ export interface CharacterHostExternalScene {
17
21
  camera: Camera;
18
22
  mountCanvas?: boolean;
19
23
  manageResize?: boolean;
24
+ setSceneSettings?: (settings: CharacterSceneConfiguration) => void;
20
25
  }
26
+ export type CharacterHostModelLoader = (modelUrl: string, options: CharacterModelLoadOptions & {
27
+ signal: AbortSignal;
28
+ }) => Promise<CharacterModelLoadResult>;
29
+ export type CharacterHostPreparation = CharacterModelLoadResult & {
30
+ engine: Embody;
31
+ character: CharacterHostCharacterOptions;
32
+ signal: AbortSignal;
33
+ };
34
+ export type CharacterHostReady = CharacterHostPreparation & {
35
+ scene: Scene;
36
+ camera: Camera;
37
+ cameraController: ThreeAnnotationController | null;
38
+ rendering: CharacterSceneRenderingController | null;
39
+ };
21
40
  export interface CharacterHostOptions {
22
41
  signal?: AbortSignal;
23
42
  container: HTMLElement;
@@ -26,23 +45,32 @@ export interface CharacterHostOptions {
26
45
  scene?: Omit<DefaultCharacterSceneAsyncOptions, 'signal'>;
27
46
  external?: CharacterHostExternalScene;
28
47
  loader?: CharacterModelLoadOptions;
48
+ /** Storage authorization and byte caching remain with the application. */
49
+ loadModel?: CharacterHostModelLoader;
50
+ /** Replays authored mesh edits through the bound engine before GPU preparation. */
51
+ prepareCharacter?: (context: CharacterHostPreparation) => void | Promise<void>;
52
+ onCharacterReady?: (context: CharacterHostReady) => void | Promise<void>;
53
+ /** Default true for compatibility. Editors can retain clips in a lazy catalog. */
54
+ registerEmbeddedAnimations?: boolean;
55
+ camera?: Omit<Partial<ThreeAnnotationControllerConfig>, 'scene' | 'camera' | 'renderer' | 'rendering' | 'domElement'>;
29
56
  autoStart?: boolean;
30
57
  renderLoop?: boolean;
31
58
  autoFrame?: boolean;
32
59
  }
33
- export interface CharacterHost extends Omit<CharacterModelLoadResult, 'gltf'> {
60
+ export interface CharacterHost extends CharacterModelLoadResult {
34
61
  engine: Embody;
35
62
  scene: Scene;
36
63
  readonly renderer: CharacterSceneRenderer | null;
37
64
  readonly backend: CharacterSceneBackend | null;
38
65
  readonly rendering: CharacterSceneRenderingController | null;
39
66
  camera: Camera;
67
+ cameraController: ThreeAnnotationController | null;
40
68
  lighting: ReadyDefaultCharacterScene['lighting'] | null;
41
69
  ownsScene: boolean;
42
70
  container: HTMLElement;
43
- setCharacter(character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions): Promise<void>;
71
+ setCharacter(character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions, signal?: AbortSignal): Promise<void>;
44
72
  resize(): void;
45
73
  dispose(): Promise<void>;
46
74
  }
47
- /** Acquire a character and bind it to the existing Three rendering integration. */
75
+ /** Acquire, prepare and reveal a character using the existing native render owner. */
48
76
  export declare function createCharacterHost(options: CharacterHostOptions): Promise<CharacterHost>;
@@ -0,0 +1,6 @@
1
+ import * as THREE from 'three';
2
+ import type { SceneInkBackgroundPalette } from './sceneInkBackground';
3
+ /** Reuse the finished palette on character switches without resampling textures. */
4
+ export declare function readCachedCharacterPalette(cacheKey: string): SceneInkBackgroundPalette | null;
5
+ export declare function resolveCharacterMaterialPalette(model: THREE.Object3D, cacheKey: string): SceneInkBackgroundPalette | null;
6
+ export declare function resolveCharacterTexturePalette(model: THREE.Object3D, cacheKey: string): Promise<SceneInkBackgroundPalette | null>;
@@ -0,0 +1,128 @@
1
+ import * as THREE from 'three';
2
+ export interface BoneTreeNode {
3
+ name: string;
4
+ depth: number;
5
+ parent: string | null;
6
+ children: string[];
7
+ isMapped: boolean;
8
+ /** Semantic key if this bone is mapped (e.g., 'HEAD', 'JAW') */
9
+ semanticKey: string | null;
10
+ /** Full semantic-key set for tree badge rendering when a row resolves multiple mappings */
11
+ semanticKeys?: string[];
12
+ /** Live reference to the Three.js bone object */
13
+ boneObject: THREE.Bone;
14
+ }
15
+ export interface SkeletonOverlayOptions {
16
+ opacityScale?: number;
17
+ focusSelectedBone?: boolean;
18
+ }
19
+ type OverlayAxisKey = 'pitch' | 'yaw' | 'roll';
20
+ export type SkeletonOverlayAxisKey = OverlayAxisKey;
21
+ type SkeletonOverlayRotationChannel = 'rx' | 'ry' | 'rz';
22
+ export interface AxisGizmoPointerData {
23
+ axis: SkeletonOverlayAxisKey;
24
+ channel: SkeletonOverlayRotationChannel;
25
+ boneName: string;
26
+ point: THREE.Vector3;
27
+ origin: THREE.Vector3;
28
+ quaternion: THREE.Quaternion;
29
+ }
30
+ export declare function resolveSkeletonOverlayStartBoneName(root: THREE.Object3D): string | null;
31
+ export declare class SkeletonOverlay {
32
+ private scene;
33
+ private group;
34
+ private visualizations;
35
+ private boneTree;
36
+ private mappedBoneNames;
37
+ private semanticKeyMap;
38
+ private boneLookup;
39
+ private sharedGeometry;
40
+ private mappedMaterial;
41
+ private unmappedMaterial;
42
+ private highlightMaterial;
43
+ private selectedMaterial;
44
+ private contextMaterial;
45
+ private mutedMaterial;
46
+ private axisRingGeometry;
47
+ private axisRingHitGeometry;
48
+ private axisCenterGeometry;
49
+ private pitchRingMaterial;
50
+ private yawRingMaterial;
51
+ private rollRingMaterial;
52
+ private axisHitMaterial;
53
+ private axisCenterMaterial;
54
+ private axisGizmoGroup;
55
+ private axisGizmoMeshes;
56
+ private axisGizmoHitMeshes;
57
+ private sentinelMesh;
58
+ private highlightedBone;
59
+ private selectedBone;
60
+ private activeAxis;
61
+ private opacityScale;
62
+ private focusSelectedBone;
63
+ private visibilityAlpha;
64
+ private visibilityTarget;
65
+ private visibilityLastFrameAt;
66
+ constructor(scene: THREE.Scene, mappedBoneNames: Set<string>, semanticKeyMap: Map<string, string>, options?: SkeletonOverlayOptions);
67
+ /**
68
+ * Build the skeleton visualization from a scene root.
69
+ * Traverses to find all THREE.Bone instances and creates octahedral meshes.
70
+ */
71
+ loadSkeleton(root: THREE.Object3D): void;
72
+ private createBoneMesh;
73
+ /** Called each frame via onBeforeRender. Updates all bone mesh transforms. */
74
+ private update;
75
+ private syncVisibilityOpacity;
76
+ private syncGroupVisibility;
77
+ private advanceVisibility;
78
+ private resolveSelectedBoneObject;
79
+ private resolveBoneRelativeAxisGizmoRadius;
80
+ private resolveScreenSpaceAxisGizmoRadius;
81
+ private resolveAxisGizmoRadius;
82
+ private updateAxisGizmoAppearance;
83
+ private updateAxisGizmo;
84
+ private applyAxisRingChannel;
85
+ private syncAxisGizmoChannels;
86
+ private getSelectedBonePointerData;
87
+ private getAxisPlaneNormal;
88
+ getBoneTree(): BoneTreeNode[];
89
+ setVisible(visible: boolean): void;
90
+ isVisible(): boolean;
91
+ setHighlighted(boneName: string | null): void;
92
+ setSelected(boneName: string | null): void;
93
+ setActiveAxis(axis: OverlayAxisKey | null): void;
94
+ /** Get world position and rotation for a bone by name */
95
+ getBoneTransform(boneName: string): {
96
+ position: [number, number, number];
97
+ rotation: [number, number, number];
98
+ } | null;
99
+ pickBone(clientX: number, clientY: number, camera: THREE.Camera, domElement: HTMLElement): string | null;
100
+ pickAxisGizmo(clientX: number, clientY: number, camera: THREE.Camera, domElement: HTMLElement): AxisGizmoPointerData | null;
101
+ projectPointerToAxisPlane(clientX: number, clientY: number, camera: THREE.Camera, domElement: HTMLElement, axis: SkeletonOverlayAxisKey): AxisGizmoPointerData | null;
102
+ private isSelectedContextBone;
103
+ private resolveBoneMaterial;
104
+ private refreshBoneMaterials;
105
+ private clear;
106
+ dispose(): void;
107
+ }
108
+ export declare function collectSkeletonBones(root: THREE.Object3D): THREE.Bone[];
109
+ /**
110
+ * Find the model root from a scene by locating the first bone
111
+ * and walking up to the top-level scene child.
112
+ */
113
+ export declare function findModelRoot(scene: THREE.Scene): THREE.Object3D | null;
114
+ /**
115
+ * Build a set of mapped bone names and a semantic key lookup
116
+ * from an engine's profile configuration.
117
+ */
118
+ export declare function buildMappedBoneInfo(profile: {
119
+ boneNodes?: Record<string, string>;
120
+ bonePrefix?: string;
121
+ boneSuffix?: string;
122
+ suffixPattern?: string;
123
+ }, actualBoneNames?: Iterable<string>): {
124
+ mappedNames: Set<string>;
125
+ semanticKeyMap: Map<string, string>;
126
+ semanticKeysMap: Map<string, string[]>;
127
+ };
128
+ export {};
@@ -0,0 +1,35 @@
1
+ import * as THREE from 'three';
2
+ export interface MorphVertexPreviewOptions {
3
+ threshold?: number;
4
+ maxPoints?: number;
5
+ }
6
+ export interface MorphVertexPreviewSample {
7
+ indices: Uint32Array;
8
+ intensities: Float32Array;
9
+ }
10
+ export interface MorphVertexPreviewRenderData {
11
+ positions: Float32Array;
12
+ colors: Float32Array;
13
+ pointCount: number;
14
+ meshCount: number;
15
+ }
16
+ export declare function resolveMorphPreviewMeshes(root: THREE.Object3D, morphName: string, meshNames?: string[]): THREE.Mesh[];
17
+ export declare function buildMorphVertexPreviewSample(mesh: THREE.Mesh, morphName: string, options?: MorphVertexPreviewOptions): MorphVertexPreviewSample | null;
18
+ export declare function buildMorphVertexPreviewRenderData(meshes: THREE.Mesh[], morphName: string, cache: Map<string, MorphVertexPreviewSample>, options?: MorphVertexPreviewOptions): MorphVertexPreviewRenderData | null;
19
+ /** Editor overlay sampled by the existing Three render loop, without a separate frame timer. */
20
+ export declare class MorphVertexPreview {
21
+ private readonly scene;
22
+ private readonly options;
23
+ private readonly cache;
24
+ private points;
25
+ private active;
26
+ private disposed;
27
+ private unbindRender;
28
+ constructor(scene: THREE.Scene, options?: MorphVertexPreviewOptions);
29
+ show(morphName: string, meshNames?: string[]): void;
30
+ hide(): void;
31
+ dispose(): void;
32
+ private createPoints;
33
+ private update;
34
+ private updateAttribute;
35
+ }
@@ -169,3 +169,5 @@ export declare class ThreeFrameApplier {
169
169
  export declare const collectMorphMeshes: (root: Object3D) => Mesh<import("three").BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>, Material<import("three").MaterialEventMap> | Material<import("three").MaterialEventMap>[], import("three").Object3DEventMap>[];
170
170
  export * from './model';
171
171
  export * from './scene';
172
+ export * from './editor/SkeletonOverlay';
173
+ export * from './editor/morphVertexPreview';
@@ -0,0 +1,13 @@
1
+ import * as THREE from 'three';
2
+ declare const THREE_RENDERED_MORPH_SEMANTICS: readonly ["position", "normal", "color"];
3
+ type ThreeRenderedMorphSemantic = typeof THREE_RENDERED_MORPH_SEMANTICS[number];
4
+ export interface CharacterMorphLayoutRepair {
5
+ meshName: string;
6
+ paddedChannels: Partial<Record<ThreeRenderedMorphSemantic, number>>;
7
+ removedEmptyChannels: ThreeRenderedMorphSemantic[];
8
+ paddedInfluences: number;
9
+ }
10
+ /** Repair recoverable channel holes before Three.js builds its morph texture. */
11
+ export declare function normalizeRenderableCharacterMorphAttributes(model: THREE.Object3D): CharacterMorphLayoutRepair[];
12
+ export declare function assertRenderableCharacterMorphAttributes(model: THREE.Object3D): void;
13
+ export {};
@@ -126,6 +126,10 @@ export type DefaultCharacterSceneOptions = {
126
126
  shadowPlane?: boolean;
127
127
  manageResize?: boolean;
128
128
  };
129
+ /** Saved per-character appearance; renderer preference and DOM ownership stay separate. */
130
+ export type CharacterSceneConfiguration = Pick<DefaultCharacterSceneOptions, 'type' | 'cameraFov' | 'shadows' | 'lightingPreset' | 'lighting' | 'shadowPlane'> & {
131
+ background?: string | number | null;
132
+ };
129
133
  export type DefaultCharacterSceneAsyncOptions = DefaultCharacterSceneOptions & {
130
134
  /** Auto (default) tries native WebGPU initialization, then falls back to WebGL. */
131
135
  renderer?: CharacterSceneRendererPreference;
@@ -149,6 +153,7 @@ type CharacterScene<R extends CharacterSceneRenderer> = {
149
153
  sceneType: CharacterSceneTypeId;
150
154
  ownsScene: true;
151
155
  resize: () => void;
156
+ setSceneSettings: (settings: CharacterSceneConfiguration) => void;
152
157
  dispose: () => void;
153
158
  };
154
159
  export type DefaultCharacterScene = CharacterScene<WebGLRenderer>;
@@ -0,0 +1,11 @@
1
+ import * as THREE from 'three';
2
+ export type SceneInkBackgroundPalette = readonly [
3
+ THREE.ColorRepresentation,
4
+ THREE.ColorRepresentation,
5
+ THREE.ColorRepresentation
6
+ ];
7
+ export type SceneInkBackground = {
8
+ setPalette: (palette?: SceneInkBackgroundPalette | null) => void;
9
+ dispose: () => void;
10
+ };
11
+ export declare function createSceneInkBackground(onBackgroundChange?: (background: string) => void): SceneInkBackground;
@@ -0,0 +1,5 @@
1
+ export declare const SCENE_INK_BASE_COLOR = "#29333b";
2
+ export declare const SCENE_INK_BASE_GRADIENT = "radial-gradient(ellipse at 50% 42%, #46535c 0%, #35414a 42%, #29333b 76%, #252e35 100%)";
3
+ export type SceneInkCssPalette = readonly [string, string, string];
4
+ export declare function createSceneInkBackgroundCss(palette?: SceneInkCssPalette): string;
5
+ export declare const DEFAULT_SCENE_INK_BACKGROUND: string;