@spatialwalk/avatarkit 1.0.0-beta.67 → 1.0.0-beta.69

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 (49) hide show
  1. package/CHANGELOG.md +33 -11
  2. package/README.md +102 -18
  3. package/dist/{StreamingAudioPlayer-CD9jBs6B.js → StreamingAudioPlayer-DiIRp5nx.js} +109 -1
  4. package/dist/animation/AnimationWebSocketClient.d.ts +26 -0
  5. package/dist/animation/utils/eventEmitter.d.ts +3 -0
  6. package/dist/animation/utils/flameConverter.d.ts +10 -3
  7. package/dist/audio/AnimationPlayer.d.ts +46 -0
  8. package/dist/audio/StreamingAudioPlayer.d.ts +93 -0
  9. package/dist/config/app-config.d.ts +5 -1
  10. package/dist/config/constants.d.ts +7 -1
  11. package/dist/config/sdk-config-loader.d.ts +11 -3
  12. package/dist/core/Avatar.d.ts +10 -0
  13. package/dist/core/AvatarController.d.ts +164 -2
  14. package/dist/core/AvatarDownloader.d.ts +10 -0
  15. package/dist/core/AvatarManager.d.ts +27 -1
  16. package/dist/core/AvatarSDK.d.ts +27 -0
  17. package/dist/core/AvatarView.d.ts +148 -3
  18. package/dist/core/NetworkLayer.d.ts +6 -0
  19. package/dist/generated/common/v1/models.d.ts +8 -1
  20. package/dist/generated/driveningress/v1/driveningress.d.ts +11 -1
  21. package/dist/generated/driveningress/v2/driveningress.d.ts +5 -2
  22. package/dist/generated/google/protobuf/struct.d.ts +38 -5
  23. package/dist/generated/google/protobuf/timestamp.d.ts +102 -1
  24. package/dist/{index-GRm00rtd.js → index-BT9yxWW8.js} +1468 -30
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.js +1 -1
  27. package/dist/renderer/RenderSystem.d.ts +8 -0
  28. package/dist/renderer/covariance.d.ts +11 -0
  29. package/dist/renderer/sortSplats.d.ts +10 -0
  30. package/dist/renderer/webgl/reorderData.d.ts +12 -0
  31. package/dist/renderer/webgl/webglRenderer.d.ts +53 -0
  32. package/dist/renderer/webgpu/webgpuRenderer.d.ts +38 -0
  33. package/dist/types/character-settings.d.ts +4 -0
  34. package/dist/types/character.d.ts +9 -3
  35. package/dist/types/index.d.ts +56 -23
  36. package/dist/utils/animation-interpolation.d.ts +30 -5
  37. package/dist/utils/client-id.d.ts +5 -0
  38. package/dist/utils/conversationId.d.ts +18 -0
  39. package/dist/utils/error-utils.d.ts +24 -1
  40. package/dist/utils/id-manager.d.ts +26 -0
  41. package/dist/utils/logger.d.ts +4 -1
  42. package/dist/utils/posthog-tracker.d.ts +27 -5
  43. package/dist/utils/pwa-cache-manager.d.ts +36 -0
  44. package/dist/utils/usage-tracker.d.ts +17 -2
  45. package/dist/vite.d.ts +16 -1
  46. package/dist/wasm/avatarCoreAdapter.d.ts +145 -0
  47. package/dist/wasm/avatarCoreMemory.d.ts +52 -0
  48. package/package.json +3 -3
  49. package/vite.js +45 -29
package/dist/vite.d.ts CHANGED
@@ -1,4 +1,19 @@
1
1
  import { Plugin } from 'vite';
2
-
2
+ /**
3
+ * Vite plugin for @spatialwalk/avatarkit
4
+ * Automatically handles WASM file configuration for development and production builds
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { defineConfig } from 'vite'
9
+ * import { avatarkitVitePlugin } from '@spatialwalk/avatarkit/vite'
10
+ *
11
+ * export default defineConfig({
12
+ * plugins: [
13
+ * avatarkitVitePlugin()
14
+ * ]
15
+ * })
16
+ * ```
17
+ */
3
18
  export declare function avatarkitVitePlugin(): Plugin;
4
19
  export default avatarkitVitePlugin;
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Avatar Core WASM 适配器
3
+ *
4
+ * 完全替换 FlameComplete3DGSManager,提供 avatar_core_wasm 的完整功能
5
+ * 包括牙齿细分、眼部追踪等高级特性
6
+ */
1
7
  export interface WasmModuleConfig {
2
8
  baseUrl?: string;
3
9
  [key: string]: unknown;
@@ -59,45 +65,184 @@ export declare class AvatarCoreAdapter {
59
65
  private flameInfo?;
60
66
  private characterInfo?;
61
67
  constructor(options?: AvatarCoreOptions);
68
+ /**
69
+ * 加载 WASM 模块并设置 API
70
+ * 每次都创建全新的 WASM 实例,确保 C++ 内存是干净的
71
+ *
72
+ * 注意:这里使用动态 import() 导入 WASM 模块。
73
+ * Vite 在构建时会自动为 WASM 文件和 JS glue 代码添加 hash(如 avatar_core_wasm-CxWuw7eS.wasm),
74
+ * 确保浏览器缓存与版本一致,不会有缓存问题。
75
+ *
76
+ * Hash 的作用机制:
77
+ * - WASM 文件内容变化 → hash 自动变化 → URL 变化 → 浏览器拉取新版本
78
+ * - WASM 文件内容不变 → hash 保持不变 → URL 不变 → 浏览器使用缓存
79
+ * - Emscripten 生成的 JS 内部会使用 hard-coded 的 hash 路径加载 .wasm 文件
80
+ */
62
81
  loadWASMModule(): Promise<void>;
82
+ /**
83
+ * 验证 WASM 模块功能
84
+ */
63
85
  private validateWASMModule;
86
+ /**
87
+ * 初始化内存视图
88
+ */
64
89
  private initializeMemoryViews;
90
+ /**
91
+ * 设置 C API 函数包装
92
+ */
65
93
  private setupCAPIFunctions;
94
+ /**
95
+ * 读取当前动画帧的 FlameParams(用于过渡或调试)
96
+ */
97
+ /**
98
+ * Get current frame parameters
99
+ * @param frameIndex Frame index
100
+ * @param characterId Optional character ID for multi-character support
101
+ */
66
102
  getCurrentFrameParams(frameIndex?: number, characterId?: string): Promise<FlameParams>;
103
+ /**
104
+ * 初始化 Avatar Core 核心
105
+ */
67
106
  private initializeAvatarCore;
107
+ /**
108
+ * 加载模板资源(从预加载的 ArrayBuffers)
109
+ */
68
110
  loadTemplateResourcesFromBuffers(templateResources: Record<string, ArrayBuffer>): Promise<boolean>;
111
+ /**
112
+ * 加载角色数据(从预加载的 ArrayBuffers)
113
+ */
114
+ /**
115
+ * Load character from buffers and return handle
116
+ * @param shapeBuffer Shape data buffer
117
+ * @param pointCloudBuffer Point cloud data buffer
118
+ * @param characterId Optional character ID for multi-character support
119
+ * @returns Character handle
120
+ */
69
121
  loadCharacterFromBuffers(shapeBuffer: ArrayBuffer, pointCloudBuffer: ArrayBuffer, characterId?: string): Promise<number>;
70
122
  private loadAnimationFromData;
123
+ /**
124
+ * Load animation from ArrayBuffer (for CDN-based dynamic loading)
125
+ * @param animData Animation data buffer
126
+ * @param characterId Optional character ID for multi-character support
127
+ * @returns Animation handle
128
+ */
71
129
  loadAnimationFromBuffer(animData: ArrayBuffer, characterId?: string): Promise<number>;
72
130
  switchAnimationFile(animationFile: string): Promise<number>;
131
+ /**
132
+ * 获取动画总帧数
133
+ * @param animationHandle Optional animation handle (for multi-character support)
134
+ */
73
135
  getAnimationTotalFrames(animationHandle?: number): Promise<number>;
136
+ /**
137
+ * 从动画中获取指定帧的参数
138
+ * @param frameIndex Frame index
139
+ * @param characterId Optional character ID for multi-character support
140
+ */
74
141
  getAnimationFrameParams(frameIndex?: number, characterId?: string): Promise<number>;
142
+ /**
143
+ * 设置眼部追踪配置(对齐 app 实现)
144
+ * @param config Eye tracking configuration
145
+ * @param characterId Optional character ID for multi-character support
146
+ */
75
147
  setEyeTrackingConfig(config: {
76
148
  enabled: boolean;
77
149
  auto_eyelid_adjustment?: boolean;
78
150
  eyelid_threshold?: number;
79
151
  }, characterId?: string): Promise<boolean>;
152
+ /**
153
+ * 设置眼部追踪目标(高级功能)
154
+ * @param x Target X coordinate
155
+ * @param y Target Y coordinate
156
+ * @param z Target Z coordinate
157
+ * @param characterId Optional character ID for multi-character support
158
+ */
80
159
  setGazeTarget(x: number, y: number, z: number, characterId?: string): Promise<boolean>;
160
+ /**
161
+ * 重置眼部追踪
162
+ */
81
163
  resetEyeTracking(): Promise<boolean>;
164
+ /**
165
+ * 查询 FLAME 模型信息
166
+ */
82
167
  private queryFlameInfo;
168
+ /**
169
+ * 查询角色信息
170
+ */
83
171
  private queryCharacterInfo;
172
+ /**
173
+ * 检查错误码并抛出异常
174
+ */
84
175
  private checkError;
176
+ /**
177
+ * 更新进度回调
178
+ */
85
179
  private updateProgress;
180
+ /**
181
+ * 获取性能指标
182
+ */
86
183
  getPerformanceMetrics(): PerformanceMetrics & {
87
184
  flameInfo?: FlameInfo;
88
185
  characterInfo?: CharacterInfo;
89
186
  version?: string;
90
187
  };
188
+ /**
189
+ * 获取角色的点云数量
190
+ * @param characterHandle 角色 handle(可选,默认使用当前角色)
191
+ * @returns 点云数量,如果角色未加载则返回 null
192
+ */
91
193
  getPointCount(characterHandle?: number): number | null;
194
+ /**
195
+ * 释放当前角色和动画资源(但保留 core)
196
+ */
197
+ /**
198
+ * Remove a specific character by handle
199
+ * @param characterHandle Character handle to remove
200
+ * @param characterId Optional character ID for cleanup
201
+ */
92
202
  removeCharacter(characterHandle: number, characterId?: string): void;
203
+ /**
204
+ * Release current character (legacy method, kept for backward compatibility)
205
+ * @deprecated Use removeCharacter() instead for multi-character support
206
+ */
93
207
  releaseCurrentCharacter(): void;
208
+ /**
209
+ * 释放所有资源(包括 core)
210
+ */
94
211
  release(): void;
212
+ /**
213
+ * 兼容性接口:提供与 FlameComplete3DGSManager 相同的接口
214
+ */
95
215
  loadFlameModel(_modelData: any): Promise<boolean>;
96
216
  load3DGSData(_original3DGSPoints: any, _binding: any, _flameFaces: any): Promise<boolean>;
217
+ /**
218
+ * 计算帧并返回 GPU 友好的 flat 格式(零拷贝,协方差预计算)
219
+ * 🚀 性能优化版本:
220
+ * - C++ 预计算协方差矩阵
221
+ * - 零拷贝直接访问 WASM 内存http://localhost:3000/us/
222
+ * - 直接输出 GPU 格式 [pos3, color4, cov6]
223
+ */
224
+ /**
225
+ * Compute complete frame from animation
226
+ * @param params Frame parameters
227
+ * @param characterHandle Optional character handle (for multi-character support)
228
+ */
97
229
  computeCompleteFrameFlat(params?: {
98
230
  frameIndex?: number;
99
231
  }, characterHandle?: number): Promise<Float32Array | null>;
232
+ /**
233
+ * 计算帧并返回 GPU 友好的 flat 格式(从 FLAME 参数)
234
+ * 🔑 用于 Realtime: 接受自定义 FLAME 参数并计算 Splat
235
+ */
236
+ /**
237
+ * Compute frame from Flame parameters
238
+ * @param flameParams Flame parameters
239
+ * @param characterHandle Optional character handle (for multi-character support)
240
+ */
100
241
  computeFrameFlatFromParams(flameParams: FlameParams, characterHandle?: number): Promise<Float32Array | null>;
242
+ /**
243
+ * 获取 WASM 内存使用情况(MB)
244
+ * @returns WASM 内存使用量(MB),如果模块未加载则返回 null
245
+ */
101
246
  getWASMMemoryMB(): number | null;
102
247
  }
103
248
  export {};
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Avatar Core WASM 内存管理工具
3
+ *
4
+ * 提供高效的内存分配、数据传递和零拷贝访问功能
5
+ * 专门为 avatar_core_wasm 优化
6
+ */
1
7
  interface WASMModule {
2
8
  _malloc: (size: number) => number;
3
9
  _free: (ptr: number) => void;
@@ -41,13 +47,26 @@ export declare class AvatarCoreMemoryManager {
41
47
  private allocatedPointers;
42
48
  private structPointers;
43
49
  constructor(wasmModule: WASMModule);
50
+ /**
51
+ * 分配 WASM 内存并复制数据 - 纯 API 方式
52
+ */
44
53
  allocateAndCopy(arrayBuffer: ArrayBuffer): MemoryAllocation;
54
+ /**
55
+ * 创建 AvatarTemplateConfig 结构体
56
+ */
45
57
  createTemplateConfig(resources: TemplateResources): number;
58
+ /**
59
+ * 创建 AvatarCharacterData 结构体 - 新版 Emscripten 方式
60
+ */
46
61
  createCharacterData(shapeBuffer: ArrayBuffer, plyBuffer: ArrayBuffer, characterId?: string): {
47
62
  dataPtr: number;
48
63
  shapePtr: number;
49
64
  plyPtr: number;
50
65
  };
66
+ /**
67
+ * 读取 AvatarFlameParams 结构体数据
68
+ * Used to extract current animation frame parameters from WASM memory
69
+ */
51
70
  readFlameParams(paramsPtr: number): {
52
71
  shape_params: number[];
53
72
  expr_params: number[];
@@ -59,6 +78,9 @@ export declare class AvatarCoreMemoryManager {
59
78
  eyelid: number[];
60
79
  has_eyelid: boolean;
61
80
  };
81
+ /**
82
+ * 创建 AvatarFlameParams 结构体 - 新版 Emscripten 方式
83
+ */
62
84
  createFlameParams(params: {
63
85
  shape_params?: number[];
64
86
  expr_params?: number[];
@@ -70,7 +92,25 @@ export declare class AvatarCoreMemoryManager {
70
92
  eyelid?: number[];
71
93
  has_eyelid?: boolean;
72
94
  }): number;
95
+ /**
96
+ * 读取 AvatarSplatPointFlatArray 结构体数据(预计算协方差)
97
+ *
98
+ * 结构体布局:
99
+ * - AvatarSplatPointFlat* points (0-3, 32位指针)
100
+ * - uint32_t point_count (4-7)
101
+ * - float compute_time_ms (8-11)
102
+ *
103
+ * 每个点布局 (52 bytes):
104
+ * - position[3] (12 bytes)
105
+ * - color[4] (16 bytes, RGBA)
106
+ * - covariance[6] (24 bytes, 预计算好的协方差矩阵上三角)
107
+ *
108
+ * ⚠️ 使用 getValue 逐个读取,避免动态内存的 HEAPF32 detachment 问题
109
+ */
73
110
  readSplatPointFlatArray(arrayPtr: number): Float32Array | null;
111
+ /**
112
+ * 读取AvatarMeshData结构体数据
113
+ */
74
114
  readMeshData(outputPtr: number): {
75
115
  vertices: Float32Array;
76
116
  vertexCount: number;
@@ -80,9 +120,21 @@ export declare class AvatarCoreMemoryManager {
80
120
  landmarkCount: number;
81
121
  computeTime: number;
82
122
  };
123
+ /**
124
+ * 释放指定指针的内存
125
+ */
83
126
  free(ptr: number): void;
127
+ /**
128
+ * 释放结构体内存
129
+ */
84
130
  freeStruct(name: string): void;
131
+ /**
132
+ * 清理所有分配的内存
133
+ */
85
134
  cleanup(): void;
135
+ /**
136
+ * 获取内存使用统计
137
+ */
86
138
  getMemoryStats(): {
87
139
  allocatedPointers: number;
88
140
  structPointers: number;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@spatialwalk/avatarkit",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.67",
4
+ "version": "1.0.0-beta.69",
5
5
  "packageManager": "pnpm@10.18.2",
6
- "description": "SPAvatar SDK - 3D Gaussian Splatting Avatar Rendering SDK",
7
- "author": "SPAvatar Team",
6
+ "description": "AvatarKit SDK - 3D Gaussian Splatting Avatar Rendering SDK",
7
+ "author": "AvatarKit Team",
8
8
  "license": "MIT",
9
9
  "keywords": [
10
10
  "avatar",
package/vite.js CHANGED
@@ -1,4 +1,4 @@
1
- import { copyFileSync, existsSync, writeFileSync, readdirSync } from 'node:fs';
1
+ import { copyFileSync, existsSync, writeFileSync, readdirSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  /**
4
4
  * Vite plugin for @spatialwalk/avatarkit
@@ -37,43 +37,59 @@ export function avatarkitVitePlugin() {
37
37
  closeBundle() {
38
38
  if (!rootDir)
39
39
  return;
40
- // 查找 node_modules 中的 WASM 文件
41
- const wasmSource = join(rootDir, 'node_modules/@spatialwalk/avatarkit/dist/avatar_core_wasm.wasm');
42
- // 查找 node_modules 中的 WASM JS glue 文件
43
- // 注意:Vite 可能会给 JS 文件加 hash,所以我们需要查找所有可能的文件
44
- const wasmJsSourcePattern = join(rootDir, 'node_modules/@spatialwalk/avatarkit/dist');
45
- // 目标路径 - 根据实际使用情况,WASM 文件应该在 assets 目录
46
- // 因为 Vite 通常会把资源放在 assets 目录,而 SDK 代码使用相对路径导入
47
- const wasmDest = join(rootDir, 'dist/assets/avatar_core_wasm.wasm');
40
+ const wasmSourceDir = join(rootDir, 'node_modules/@spatialwalk/avatarkit/dist');
41
+ // 先查找并读取 JS glue 文件,提取它引用的 WASM 文件名
42
+ let wasmFileName = null;
43
+ if (existsSync(wasmSourceDir)) {
44
+ const files = readdirSync(wasmSourceDir);
45
+ const wasmJsFile = files.find((f) => f.startsWith('avatar_core_wasm') && f.endsWith('.js'));
46
+ if (wasmJsFile) {
47
+ const wasmJsSource = join(wasmSourceDir, wasmJsFile);
48
+ try {
49
+ const jsContent = readFileSync(wasmJsSource, 'utf-8');
50
+ // 从 JS 文件中提取 WASM 文件名
51
+ // 匹配 avatar_core_wasm-{hash}.wasm 或 avatar_core_wasm.wasm
52
+ // 使用更精确的正则,匹配带引号或不带引号的情况
53
+ const wasmMatch = jsContent.match(/["'`]?avatar_core_wasm[-\w]*\.wasm["'`]?/g);
54
+ if (wasmMatch && wasmMatch.length > 0) {
55
+ // 取第一个匹配,去掉引号
56
+ wasmFileName = wasmMatch[0].replace(/["'`]/g, '');
57
+ }
58
+ }
59
+ catch (error) {
60
+ console.warn('⚠️ [avatarkit] Could not read JS glue file:', error);
61
+ }
62
+ }
63
+ }
64
+ // 如果从 JS 文件中找到了 WASM 文件名,使用它;否则回退到默认名称
65
+ const targetWasmName = wasmFileName || 'avatar_core_wasm.wasm';
66
+ const wasmSource = join(wasmSourceDir, targetWasmName);
67
+ const wasmDest = join(rootDir, `dist/assets/${targetWasmName}`);
48
68
  const wasmJsDest = join(rootDir, 'dist/assets/avatar_core_wasm.js');
49
69
  const headersDest = join(rootDir, 'dist/_headers');
50
70
  // 复制 WASM 文件
51
71
  if (existsSync(wasmSource)) {
52
72
  copyFileSync(wasmSource, wasmDest);
53
- console.log('✅ [avatarkit] Copied WASM file to dist/assets/avatar_core_wasm.wasm');
73
+ console.log(`✅ [avatarkit] Copied WASM file to dist/assets/${targetWasmName}`);
54
74
  }
55
75
  else {
56
- console.warn('⚠️ [avatarkit] WASM file not found at:', wasmSource);
57
- }
58
- // 尝试查找并复制 WASM JS glue 文件
59
- // 由于 Vite 可能会给文件加 hash,我们尝试查找匹配的文件
60
- try {
61
- if (existsSync(wasmJsSourcePattern)) {
62
- const files = readdirSync(wasmJsSourcePattern);
63
- const wasmJsFile = files.find((f) => f.startsWith('avatar_core_wasm') && f.endsWith('.js'));
64
- if (wasmJsFile) {
65
- const wasmJsSource = join(wasmJsSourcePattern, wasmJsFile);
66
- copyFileSync(wasmJsSource, wasmJsDest);
67
- console.log(`✅ [avatarkit] Copied WASM JS file to dist/assets/avatar_core_wasm.js (from ${wasmJsFile})`);
68
- }
69
- else {
70
- console.log('ℹ️ [avatarkit] WASM JS file not found (may be handled by Vite):', wasmJsSourcePattern);
71
- }
76
+ console.warn(`⚠️ [avatarkit] WASM file not found: ${wasmSource}`);
77
+ if (wasmFileName) {
78
+ console.warn(` Expected file: ${targetWasmName} (extracted from JS glue file)`);
72
79
  }
73
80
  }
74
- catch (error) {
75
- // 如果读取目录失败,不报错,因为 Vite 可能已经处理了 JS 文件
76
- console.log('ℹ️ [avatarkit] Could not find WASM JS file (may be handled by Vite)');
81
+ // 复制 WASM JS glue 文件
82
+ if (existsSync(wasmSourceDir)) {
83
+ const files = readdirSync(wasmSourceDir);
84
+ const wasmJsFile = files.find((f) => f.startsWith('avatar_core_wasm') && f.endsWith('.js'));
85
+ if (wasmJsFile) {
86
+ const wasmJsSource = join(wasmSourceDir, wasmJsFile);
87
+ copyFileSync(wasmJsSource, wasmJsDest);
88
+ console.log(`✅ [avatarkit] Copied WASM JS file to dist/assets/avatar_core_wasm.js (from ${wasmJsFile})`);
89
+ }
90
+ else {
91
+ console.log('ℹ️ [avatarkit] WASM JS file not found (may be handled by Vite):', wasmSourceDir);
92
+ }
77
93
  }
78
94
  // 生成 _headers 文件(用于 Cloudflare Pages 等平台)
79
95
  const headersContent = '/*.wasm\n Content-Type: application/wasm\n';