@ridp/threejs 1.4.2 → 1.4.4

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 (58) hide show
  1. package/{readme.md → README.md} +228 -26
  2. package/dist/ImageLoader-CMAmH-92.js +1444 -0
  3. package/dist/ImageLoader-y6-Adf1b.cjs +24 -0
  4. package/dist/PredictiveLoader-BXCwkdSX.cjs +2 -0
  5. package/dist/PredictiveLoader-eiPgVdsJ.js +3832 -0
  6. package/dist/assets/{gltfParser.worker-Bqz8BBJx.js → gltfParser.worker-D2lwod50.js} +2 -2
  7. package/dist/assets/{gltfParserOptimized.worker-DfipxPjm.js → gltfParserOptimized.worker-FT73rIOj.js} +2 -2
  8. package/dist/hooks.cjs +1 -1
  9. package/dist/hooks.js +9 -12
  10. package/dist/{packages/threejs/src/utils/modelOptimizer.js → modelOptimizer-D6fRg-DF.js} +1 -1
  11. package/dist/threejs.cjs +3 -1
  12. package/dist/threejs.js +428 -58
  13. package/dist/useBatchGLTFLoader-D3gPYO-K.cjs +5 -0
  14. package/dist/useBatchGLTFLoader-DP_NdYhC.js +493 -0
  15. package/dist/utils.cjs +1 -1
  16. package/dist/utils.js +32 -40
  17. package/package.json +1 -1
  18. package/dist/packages/threejs/package.json.cjs +0 -1
  19. package/dist/packages/threejs/package.json.js +0 -4
  20. package/dist/packages/threejs/src/hooks/useBatchGLTFLoader.cjs +0 -1
  21. package/dist/packages/threejs/src/hooks/useBatchGLTFLoader.js +0 -83
  22. package/dist/packages/threejs/src/hooks/useGLTFLoader.cjs +0 -1
  23. package/dist/packages/threejs/src/hooks/useGLTFLoader.js +0 -292
  24. package/dist/packages/threejs/src/hooks/useObb.cjs +0 -1
  25. package/dist/packages/threejs/src/hooks/useObb.js +0 -41
  26. package/dist/packages/threejs/src/hooks/useRaycaster.cjs +0 -1
  27. package/dist/packages/threejs/src/hooks/useRaycaster.js +0 -35
  28. package/dist/packages/threejs/src/hooks/useThreeJs.cjs +0 -5
  29. package/dist/packages/threejs/src/hooks/useThreeJs.js +0 -153
  30. package/dist/packages/threejs/src/instance/IDBCache.cjs +0 -1
  31. package/dist/packages/threejs/src/instance/IDBCache.js +0 -142
  32. package/dist/packages/threejs/src/instance/threeIns.cjs +0 -3
  33. package/dist/packages/threejs/src/instance/threeIns.js +0 -369
  34. package/dist/packages/threejs/src/utils/CacheMonitor.cjs +0 -1
  35. package/dist/packages/threejs/src/utils/CacheMonitor.js +0 -125
  36. package/dist/packages/threejs/src/utils/ImageLoader.cjs +0 -1
  37. package/dist/packages/threejs/src/utils/ImageLoader.js +0 -33
  38. package/dist/packages/threejs/src/utils/PredictiveLoader.cjs +0 -1
  39. package/dist/packages/threejs/src/utils/PredictiveLoader.js +0 -155
  40. package/dist/packages/threejs/src/utils/RetryHelper.cjs +0 -1
  41. package/dist/packages/threejs/src/utils/RetryHelper.js +0 -108
  42. package/dist/packages/threejs/src/utils/common.cjs +0 -1
  43. package/dist/packages/threejs/src/utils/common.js +0 -15
  44. package/dist/packages/threejs/src/utils/css3dHelper.cjs +0 -15
  45. package/dist/packages/threejs/src/utils/css3dHelper.js +0 -42
  46. package/dist/packages/threejs/src/utils/disposeObject.cjs +0 -1
  47. package/dist/packages/threejs/src/utils/disposeObject.js +0 -13
  48. package/dist/packages/threejs/src/utils/helper.cjs +0 -1
  49. package/dist/packages/threejs/src/utils/helper.js +0 -47
  50. package/dist/packages/threejs/src/utils/modelSerialize.cjs +0 -1
  51. package/dist/packages/threejs/src/utils/modelSerialize.js +0 -225
  52. package/dist/packages/threejs/src/utils/sceneRebuilder.cjs +0 -1
  53. package/dist/packages/threejs/src/utils/sceneRebuilder.js +0 -138
  54. package/dist/packages/threejs/src/workers/gltfParser.worker.cjs +0 -1
  55. package/dist/packages/threejs/src/workers/gltfParser.worker.js +0 -11
  56. package/dist/packages/threejs/src/workers/gltfParserOptimized.worker.cjs +0 -1
  57. package/dist/packages/threejs/src/workers/gltfParserOptimized.worker.js +0 -11
  58. /package/dist/{packages/threejs/src/utils/modelOptimizer.cjs → modelOptimizer-A0Cs6f9e.cjs} +0 -0
@@ -352,9 +352,13 @@ threeJsIns.setView(model, ViewType.ISO, { scale: 1.0, animate: true });
352
352
 
353
353
  ### useGLTFLoader()
354
354
 
355
- GLTF 模型加载器,支持 IndexedDB 缓存。
355
+ GLTF 模型加载器,支持 IndexedDB 缓存、内存缓存、重试机制和调试模式。
356
356
 
357
357
  ```javascript
358
+ const loader = useGLTFLoader({
359
+ debug: false // 是否开启调试日志(默认: false)
360
+ });
361
+
358
362
  const {
359
363
  // 核心加载方法
360
364
  load, // 基础加载方法
@@ -366,30 +370,61 @@ const {
366
370
  loadBatch, // 批量加载模型
367
371
  loadBatchSequential, // 顺序批量加载
368
372
 
369
- // 缓存管理
370
- clearCache, // 清空缓存
373
+ // IndexedDB 缓存管理
374
+ clearCache, // 清空 IndexedDB 缓存
371
375
  invalidateCache, // 使缓存失效
372
376
  getCacheStats, // 获取缓存统计
373
377
  logCacheReport, // 输出缓存性能报告
378
+ getCache, // 获取 IDBCache 实例
379
+ resetCacheStats, // 重置缓存统计
380
+
381
+ // 内存缓存管理 (v1.4.2+)
382
+ clearMemoryCache, // 清空内存缓存
383
+ getMemoryCacheInfo, // 获取内存缓存统计
384
+ deleteMemoryCache, // 删除指定模型的内存缓存
374
385
 
375
386
  // 性能监控
376
387
  cacheMonitor // 缓存监控器实例
377
- } = useGLTFLoader();
388
+ } = loader;
389
+ ```
390
+
391
+ **新增功能 (v1.4.2):**
392
+
393
+ 1. **内存缓存机制**: 自动缓存已解析的 3D 模型对象,避免重复解析
394
+ 2. **调试模式控制**: 通过初始化参数统一控制所有日志输出
395
+
396
+ #### 初始化配置
397
+
398
+ ```javascript
399
+ // 生产环境 - 默认静默
400
+ const loader = useGLTFLoader();
401
+
402
+ // 开发环境 - 开启调试日志
403
+ const loader = useGLTFLoader({
404
+ debug: true
405
+ });
406
+
407
+ // 所有操作都会输出详细日志
408
+ const model = await loader.asyncFetch('/models/car.glb', '1.0.0');
409
+ // 输出: [ asyncFetch ] ====> 缓存未命中
410
+ // [ fetchArrayBuffer ] 加载模型耗时: 150ms
411
+ // [ 解析模型耗时 ]: 80ms
412
+ // [ 内存缓存 ] 存储模型 /models/car.glb (version: 1.0.0)
378
413
  ```
379
414
 
380
415
  **常用方法:**
381
416
 
382
417
  ##### asyncFetch()
383
418
 
384
- 推荐的模型加载方法,集成缓存、重试、性能监控和模型优化。
419
+ 推荐的模型加载方法,集成 IndexedDB 缓存、内存缓存、重试机制、性能监控和模型优化。
385
420
 
386
421
  ```javascript
387
- const [err, model] = await asyncFetch(
422
+ const model = await asyncFetch(
388
423
  url: string, // 模型 URL
389
424
  version?: string, // 模型版本(用于缓存失效)
425
+ onProgress?: (percent: number) => void, // 进度回调
390
426
  options?: {
391
- // 进度和重试
392
- onProgress?: (progress: ProgressEvent) => void,
427
+ // 重试配置
393
428
  maxRetries?: number, // 最大重试次数(默认: 3)
394
429
 
395
430
  // 模型优化选项
@@ -399,35 +434,40 @@ const [err, model] = await asyncFetch(
399
434
  simplifyOptions?: {
400
435
  minFaceCount?: number, // 最小面数阈值,低于此值不简化(默认: 100)
401
436
  preserveUVs?: boolean // 是否保留UV坐标(默认: true)
402
- }
437
+ },
438
+
439
+ // 缓存控制
440
+ useMemoryCache?: boolean // 是否使用内存缓存(默认: true, v1.4.2+)
403
441
  }
404
- ): Promise<[Error | null, THREE.Object3D | null]>
442
+ ): Promise<THREE.Object3D | null>
405
443
  ```
406
444
 
445
+ **缓存层级 (v1.4.2+):**
446
+
447
+ 1. **内存缓存** (最快) - 已解析的 3D 对象,仅需克隆(~2ms)
448
+ 2. **IndexedDB 缓存** (快) - ArrayBuffer 数据,需要解析(~200ms)
449
+ 3. **网络加载** (慢) - 完整下载 + 解析(~2s)
450
+
407
451
  **示例:**
408
452
  ```javascript
409
453
  // 基础用法
410
- const [err, model] = await asyncFetch('/models/car.glb', '1.0.0');
454
+ const model = await asyncFetch('/models/car.glb', '1.0.0');
411
455
  if (model) {
412
456
  scene.add(model);
413
457
  }
414
458
 
415
459
  // 带进度回调
416
- const [err, model] = await asyncFetch('/models/car.glb', '1.0.0', {
417
- onProgress: (progress) => {
418
- const percent = (progress.loaded / progress.total * 100).toFixed(2);
419
- console.log(`加载进度: ${percent}%`);
420
- },
421
- maxRetries: 5
460
+ const model = await asyncFetch('/models/car.glb', '1.0.0', (percent) => {
461
+ console.log(`加载进度: ${percent}%`);
422
462
  });
423
463
 
424
464
  // 启用材质优化
425
- const [err, model] = await asyncFetch('/models/car.glb', '1.0.0', {
465
+ const model = await asyncFetch('/models/car.glb', '1.0.0', null, {
426
466
  optimizeMaterials: true // 自动合并相同材质
427
467
  });
428
468
 
429
469
  // 启用几何体简化(适合大型模型)
430
- const [err, model] = await asyncFetch('/models/large-scene.glb', '1.0.0', {
470
+ const model = await asyncFetch('/models/large-scene.glb', '1.0.0', null, {
431
471
  simplifyGeometry: true, // 启用简化
432
472
  simplifyRatio: 0.5, // 保留 50% 的面
433
473
  simplifyOptions: {
@@ -436,18 +476,43 @@ const [err, model] = await asyncFetch('/models/large-scene.glb', '1.0.0', {
436
476
  }
437
477
  });
438
478
 
479
+ // 禁用内存缓存
480
+ const model = await asyncFetch('/models/car.glb', '1.0.0', null, {
481
+ useMemoryCache: false // 跳过内存缓存
482
+ });
483
+
439
484
  // 综合优化
440
- const [err, model] = await asyncFetch('/models/complex.glb', '1.0.0', {
441
- optimizeMaterials: true, // 优化材质
442
- simplifyGeometry: true, // 简化几何体
443
- simplifyRatio: 0.7, // 保留 70% 的面
444
- onProgress: (p) => console.log(`加载: ${(p.loaded/p.total*100).toFixed(1)}%`)
485
+ const model = await asyncFetch('/models/complex.glb', '1.0.0', (p) => {
486
+ console.log(`加载: ${p.toFixed(1)}%`);
487
+ }, {
488
+ maxRetries: 5, // 增加重试次数
489
+ optimizeMaterials: true, // 优化材质
490
+ simplifyGeometry: true, // 简化几何体
491
+ simplifyRatio: 0.7, // 保留 70% 的面
492
+ useMemoryCache: true // 使用内存缓存(默认)
445
493
  });
446
494
  ```
447
495
 
496
+ **性能对比:**
497
+
498
+ ```javascript
499
+ // 首次加载
500
+ await asyncFetch('/models/car.glb', '1.0.0');
501
+ // 耗时: ~2s (网络 + 解析 + 优化)
502
+
503
+ // 二次加载 (内存缓存命中)
504
+ await asyncFetch('/models/car.glb', '1.0.0');
505
+ // 耗时: ~2ms (仅克隆对象)
506
+
507
+ // 二次加载 (仅 IndexedDB 命中,内存缓存被清空)
508
+ loader.clearMemoryCache();
509
+ await asyncFetch('/models/car.glb', '1.0.0');
510
+ // 耗时: ~200ms (从 IndexedDB 读取 + 解析)
511
+ ```
512
+
448
513
  ##### logCacheReport()
449
514
 
450
- 输出缓存性能报告到控制台。
515
+ 输出 IndexedDB 缓存性能报告到控制台。
451
516
 
452
517
  ```javascript
453
518
  logCacheReport(): void
@@ -465,6 +530,89 @@ logCacheReport(): void
465
530
  - 缓存节省时间: ~1.5s
466
531
  ```
467
532
 
533
+ ##### 内存缓存管理 API (v1.4.2+)
534
+
535
+ **getMemoryCacheInfo()**
536
+
537
+ 获取内存缓存统计信息。
538
+
539
+ ```javascript
540
+ const info = loader.getMemoryCacheInfo();
541
+
542
+ // 返回值:
543
+ {
544
+ totalPaths: 2, // 缓存的不同模型路径数量
545
+ totalModels: 3, // 缓存的总模型数量
546
+ details: [
547
+ {
548
+ path: '/models/car.glb',
549
+ versions: ['1.0.0', '1.1.0'],
550
+ count: 2
551
+ },
552
+ {
553
+ path: '/models/truck.glb',
554
+ versions: ['1.0.0'],
555
+ count: 1
556
+ }
557
+ ]
558
+ }
559
+ ```
560
+
561
+ **clearMemoryCache()**
562
+
563
+ 清空所有内存缓存,释放已缓存的 3D 模型对象内存。
564
+
565
+ ```javascript
566
+ const count = loader.clearMemoryCache();
567
+ console.log(`释放了 ${count} 个模型`);
568
+
569
+ // 使用场景: 内存不足时主动释放
570
+ if (info.totalModels > 100) {
571
+ loader.clearMemoryCache();
572
+ }
573
+ ```
574
+
575
+ **deleteMemoryCache(path, version?)**
576
+
577
+ 删除指定模型的内存缓存。
578
+
579
+ ```javascript
580
+ // 删除特定版本
581
+ loader.deleteMemoryCache('/models/car.glb', '1.0.0');
582
+
583
+ // 删除所有版本
584
+ loader.deleteMemoryCache('/models/car.glb');
585
+ ```
586
+
587
+ **使用示例:**
588
+
589
+ ```javascript
590
+ import { useGLTFLoader } from '@ridp/threejs/hooks';
591
+
592
+ const loader = useGLTFLoader({ debug: true });
593
+
594
+ // 首次加载 - 从网络加载并缓存
595
+ const model1 = await loader.asyncFetch('/models/car.glb', '1.0.0');
596
+ // [ asyncFetch ] ====> 缓存未命中
597
+ // [ 内存缓存 ] 存储模型 /models/car.glb (version: 1.0.0)
598
+
599
+ // 二次加载 - 从内存缓存获取(极快)
600
+ const model2 = await loader.asyncFetch('/models/car.glb', '1.0.0');
601
+ // [ 内存缓存命中 ] /models/car.glb (version: 1.0.0)
602
+ // [ 内存缓存克隆耗时 ]: 2ms
603
+
604
+ // 查看内存缓存信息
605
+ const info = loader.getMemoryCacheInfo();
606
+ console.log(`缓存了 ${info.totalModels} 个模型`);
607
+
608
+ // 清空内存缓存
609
+ loader.clearMemoryCache();
610
+
611
+ // 再次加载 - 从 IndexedDB 缓存获取
612
+ const model3 = await loader.asyncFetch('/models/car.glb', '1.0.0');
613
+ // [ asyncFetch ] ====> IndexedDB 缓存命中
614
+ ```
615
+
468
616
  ### useRaycaster()
469
617
 
470
618
  射线拾取工具,用于鼠标交互和物体选择。
@@ -1152,7 +1300,61 @@ function captureScreenshot() {
1152
1300
 
1153
1301
  ## 更新日志
1154
1302
 
1155
- ### v1.3.3 (2025-01-06)
1303
+ ### v1.4.2 (2026-01-07)
1304
+
1305
+ **🎉 重大更新:**
1306
+
1307
+ - ✨ **新增内存缓存机制**: 自动缓存已解析的 3D 模型对象,避免重复解析
1308
+ - 首次加载后,二次加载仅需 ~2ms(对象克隆)
1309
+ - 相比完整加载流程,速度提升可达 **100倍以上**
1310
+ - 新增 `clearMemoryCache()` - 清空内存缓存
1311
+ - 新增 `getMemoryCacheInfo()` - 获取内存缓存统计
1312
+ - 新增 `deleteMemoryCache(path, version?)` - 删除指定缓存
1313
+ - 支持 `useMemoryCache` 选项控制是否使用内存缓存
1314
+
1315
+ - ✨ **新增调试模式控制**:
1316
+ - `useGLTFLoader` 现在支持初始化配置 `{ debug: boolean }`
1317
+ - 统一控制所有内部函数的日志输出
1318
+ - 生产环境默认静默,开发环境可开启详细日志
1319
+ - 错误日志始终输出,不受 debug 配置影响
1320
+
1321
+ - 🐛 **修复 Web Worker 在 npm 包中无法加载的问题**:
1322
+ - 使用 `?worker` 语法正确导入 Worker
1323
+ - 配置 `base: './'` 使用相对路径解析
1324
+ - Worker 文件正确打包到 `dist/assets/` 目录
1325
+ - 修复了之前 404 错误和 MIME 类型错误的问题
1326
+
1327
+ **API 变更:**
1328
+
1329
+ ```javascript
1330
+ // 旧 API (v1.4.1 及之前)
1331
+ const loader = useGLTFLoader();
1332
+ const model = await loader.asyncFetch(url, version, null, { debug: true });
1333
+
1334
+ // 新 API (v1.4.2+)
1335
+ const loader = useGLTFLoader({ debug: true });
1336
+ const model = await loader.asyncFetch(url, version);
1337
+
1338
+ // 新增内存缓存管理
1339
+ const info = loader.getMemoryCacheInfo();
1340
+ loader.clearMemoryCache();
1341
+ loader.deleteMemoryCache(url, version);
1342
+ ```
1343
+
1344
+ **性能提升:**
1345
+
1346
+ ```
1347
+ 加载场景 (v1.4.1):
1348
+ - 首次: ~2s (网络 + 解析)
1349
+ - 二次: ~200ms (IndexedDB 读取 + 解析)
1350
+
1351
+ 加载场景 (v1.4.2+):
1352
+ - 首次: ~2s (网络 + 解析)
1353
+ - 二次: ~2ms (内存缓存克隆)
1354
+ - 提升: 100倍
1355
+ ```
1356
+
1357
+ ### v1.4.1 (2025-XX-XX)
1156
1358
 
1157
1359
  - 🎯 优化 `setView` 方法的 scale 参数计算逻辑
1158
1360
  - 🔧 修复水平 FOV 超过 180° 导致的负数距离问题