sa2kit 1.0.4 → 1.0.5

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.
package/dist/mmd/index.js CHANGED
@@ -516,7 +516,7 @@ var MMDPlayerEnhanced = ({
516
516
  };
517
517
  }, [stage]);
518
518
  const clearOldResources = () => {
519
- console.log("\u{1F9F9} [MMDPlayerEnhanced] \u5F00\u59CB\u6E05\u9664\u65E7\u8D44\u6E90");
519
+ console.log("\u{1F9F9} [MMDPlayerEnhanced] \u5F00\u59CB\u6E05\u9664\u65E7\u8D44\u6E90\uFF08\u589E\u5F3A\u6E05\u7406\uFF09");
520
520
  if (!sceneRef.current) return;
521
521
  if (isPlayingRef.current) {
522
522
  isPlayingRef.current = false;
@@ -525,11 +525,31 @@ var MMDPlayerEnhanced = ({
525
525
  if (audioRef.current) {
526
526
  audioRef.current.pause();
527
527
  audioRef.current.currentTime = 0;
528
+ audioRef.current.onended = null;
528
529
  audioRef.current = null;
529
530
  }
530
531
  if (helperRef.current) {
532
+ try {
533
+ const helperObjects = helperRef.current.objects;
534
+ if (helperObjects && Array.isArray(helperObjects)) {
535
+ console.log(`\u{1F9F9} \u6E05\u9664 helper \u4E2D\u7684 ${helperObjects.length} \u4E2A\u5BF9\u8C61`);
536
+ helperObjects.length = 0;
537
+ }
538
+ } catch (error2) {
539
+ console.warn("\u26A0\uFE0F \u65E0\u6CD5\u8BBF\u95EE helper.objects\uFF0C\u521B\u5EFA\u65B0\u7684 helper:", error2);
540
+ }
531
541
  helperRef.current = null;
532
542
  }
543
+ if (sceneRef.current.background && sceneRef.current.background.isTexture) {
544
+ console.log("\u{1F9F9} \u6E05\u9664\u573A\u666F\u80CC\u666F\u8D34\u56FE");
545
+ sceneRef.current.background.dispose();
546
+ sceneRef.current.background = null;
547
+ }
548
+ if (sceneRef.current.environment && sceneRef.current.environment.isTexture) {
549
+ console.log("\u{1F9F9} \u6E05\u9664\u573A\u666F\u73AF\u5883\u8D34\u56FE");
550
+ sceneRef.current.environment.dispose();
551
+ sceneRef.current.environment = null;
552
+ }
533
553
  const objectsToRemove = [];
534
554
  sceneRef.current.traverse((child) => {
535
555
  if (child.type === "SkinnedMesh" || child.isSkinnedMesh) {
@@ -547,16 +567,34 @@ var MMDPlayerEnhanced = ({
547
567
  obj.geometry.dispose();
548
568
  }
549
569
  if (obj.material) {
550
- if (Array.isArray(obj.material)) {
551
- obj.material.forEach((mat) => mat.dispose());
570
+ const material = obj.material;
571
+ const disposeMaterial = (m) => {
572
+ if (m.map) m.map.dispose();
573
+ if (m.emissiveMap) m.emissiveMap.dispose();
574
+ if (m.normalMap) m.normalMap.dispose();
575
+ if (m.bumpMap) m.bumpMap.dispose();
576
+ if (m.specularMap) m.specularMap.dispose();
577
+ if (m.envMap) m.envMap.dispose();
578
+ if (m.lightMap) m.lightMap.dispose();
579
+ if (m.aoMap) m.aoMap.dispose();
580
+ if (m.alphaMap) m.alphaMap.dispose();
581
+ m.dispose();
582
+ };
583
+ if (Array.isArray(material)) {
584
+ material.forEach(disposeMaterial);
552
585
  } else {
553
- obj.material.dispose();
586
+ disposeMaterial(material);
554
587
  }
555
588
  }
589
+ if (obj.skeleton) {
590
+ console.log("\u{1F9F9} \u6E05\u7406\u9AA8\u9ABC\u6570\u636E");
591
+ obj.skeleton = null;
592
+ }
556
593
  });
557
594
  clockRef.current = new THREE2__namespace.Clock();
558
595
  vmdDataRef.current = null;
559
- console.log(`\u2705 [MMDPlayerEnhanced] \u5DF2\u6E05\u9664 ${objectsToRemove.length} \u4E2A\u65E7\u5BF9\u8C61`);
596
+ setNeedReset(false);
597
+ console.log(`\u2705 [MMDPlayerEnhanced] \u5DF2\u6E05\u9664 ${objectsToRemove.length} \u4E2A\u5BF9\u8C61\uFF08\u589E\u5F3A\u6E05\u7406\u5B8C\u6210\uFF09`);
560
598
  };
561
599
  React2.useEffect(() => {
562
600
  console.log("\u{1F4E6} [MMDPlayerEnhanced] \u8D44\u6E90\u52A0\u8F7D useEffect \u89E6\u53D1");
@@ -617,22 +655,30 @@ var MMDPlayerEnhanced = ({
617
655
  const helper = new threeStdlib.MMDAnimationHelper();
618
656
  helperRef.current = helper;
619
657
  setLoadingProgress(20);
658
+ const modelStartTime = performance.now();
620
659
  console.log("\u{1F3AD} \u5F00\u59CB\u52A0\u8F7D\u6A21\u578B:", currentResources.modelPath);
660
+ console.log("\u{1F4CA} [\u6027\u80FD] \u6A21\u578B\u52A0\u8F7D\u5F00\u59CB\u65F6\u95F4:", (/* @__PURE__ */ new Date()).toISOString());
621
661
  const mesh = await new Promise((resolve, reject) => {
622
662
  loader.load(
623
663
  currentResources.modelPath,
624
664
  (object) => {
625
- console.log("\u2705 \u6A21\u578B\u52A0\u8F7D\u6210\u529F");
665
+ const modelEndTime = performance.now();
666
+ const modelLoadTime = ((modelEndTime - modelStartTime) / 1e3).toFixed(2);
667
+ console.log(`\u2705 \u6A21\u578B\u52A0\u8F7D\u6210\u529F (\u8017\u65F6: ${modelLoadTime}\u79D2)`);
668
+ console.log(`\u{1F4CA} [\u6027\u80FD] \u6A21\u578B\u5927\u5C0F: ${object.geometry ? (object.geometry.attributes.position.count * 3 * 4 / 1024 / 1024).toFixed(2) : "N/A"} MB`);
626
669
  resolve(object);
627
670
  },
628
671
  (progress) => {
629
672
  if (progress.total > 0) {
630
673
  const percent = progress.loaded / progress.total * 30 + 20;
631
674
  setLoadingProgress(Math.min(percent, 50));
675
+ console.log(`\u{1F4E5} \u6A21\u578B\u52A0\u8F7D\u8FDB\u5EA6: ${(progress.loaded / progress.total * 100).toFixed(1)}% (${(progress.loaded / 1024 / 1024).toFixed(2)}MB / ${(progress.total / 1024 / 1024).toFixed(2)}MB)`);
632
676
  }
633
677
  },
634
678
  (error2) => {
635
- console.error("\u274C \u6A21\u578B\u52A0\u8F7D\u5931\u8D25:", error2);
679
+ const modelEndTime = performance.now();
680
+ const modelLoadTime = ((modelEndTime - modelStartTime) / 1e3).toFixed(2);
681
+ console.error(`\u274C \u6A21\u578B\u52A0\u8F7D\u5931\u8D25 (\u8017\u65F6: ${modelLoadTime}\u79D2):`, error2);
636
682
  reject(error2);
637
683
  }
638
684
  );
@@ -660,14 +706,25 @@ var MMDPlayerEnhanced = ({
660
706
  sceneRef.current.add(stageMesh);
661
707
  }
662
708
  if (currentResources.backgroundPath && sceneRef.current) {
709
+ const bgStartTime = performance.now();
663
710
  console.log("\u{1F5BC}\uFE0F \u5F00\u59CB\u52A0\u8F7D\u80CC\u666F\u56FE\u7247:", currentResources.backgroundPath);
664
711
  const textureLoader = new THREE2__namespace.TextureLoader();
665
712
  const backgroundTexture = await new Promise((resolve, reject) => {
666
713
  textureLoader.load(
667
714
  currentResources.backgroundPath,
668
- (texture) => resolve(texture),
715
+ (texture) => {
716
+ const bgEndTime = performance.now();
717
+ const bgLoadTime = ((bgEndTime - bgStartTime) / 1e3).toFixed(2);
718
+ console.log(`\u2705 \u80CC\u666F\u56FE\u7247\u52A0\u8F7D\u6210\u529F (\u8017\u65F6: ${bgLoadTime}\u79D2, \u5C3A\u5BF8: ${texture.image.width}x${texture.image.height})`);
719
+ resolve(texture);
720
+ },
669
721
  void 0,
670
- (err) => reject(err)
722
+ (err) => {
723
+ const bgEndTime = performance.now();
724
+ const bgLoadTime = ((bgEndTime - bgStartTime) / 1e3).toFixed(2);
725
+ console.error(`\u274C \u80CC\u666F\u56FE\u7247\u52A0\u8F7D\u5931\u8D25 (\u8017\u65F6: ${bgLoadTime}\u79D2):`, err);
726
+ reject(err);
727
+ }
671
728
  );
672
729
  });
673
730
  backgroundTexture.colorSpace = THREE2__namespace.SRGBColorSpace;
@@ -680,29 +737,34 @@ var MMDPlayerEnhanced = ({
680
737
  } else {
681
738
  sceneRef.current.background = backgroundTexture;
682
739
  }
683
- console.log("\u2705 \u80CC\u666F\u56FE\u7247\u52A0\u8F7D\u6210\u529F");
684
740
  }
685
741
  let vmd = null;
686
742
  let cameraVmd = null;
687
743
  if (currentResources.motionPath) {
688
744
  setLoadingProgress(60);
745
+ const motionStartTime = performance.now();
689
746
  console.log("\u{1F483} \u5F00\u59CB\u52A0\u8F7D\u52A8\u4F5C:", currentResources.motionPath);
690
747
  vmd = await new Promise((resolve, reject) => {
691
748
  loader.loadAnimation(
692
749
  currentResources.motionPath,
693
750
  mesh,
694
751
  (vmdObject) => {
695
- console.log("\u2705 \u52A8\u4F5C\u52A0\u8F7D\u6210\u529F");
752
+ const motionEndTime = performance.now();
753
+ const motionLoadTime = ((motionEndTime - motionStartTime) / 1e3).toFixed(2);
754
+ console.log(`\u2705 \u52A8\u4F5C\u52A0\u8F7D\u6210\u529F (\u8017\u65F6: ${motionLoadTime}\u79D2)`);
696
755
  resolve(vmdObject);
697
756
  },
698
757
  (progress) => {
699
758
  if (progress.total > 0) {
700
759
  const percent = progress.loaded / progress.total * 20 + 60;
701
760
  setLoadingProgress(Math.min(percent, 80));
761
+ console.log(`\u{1F4E5} \u52A8\u4F5C\u52A0\u8F7D\u8FDB\u5EA6: ${(progress.loaded / progress.total * 100).toFixed(1)}%`);
702
762
  }
703
763
  },
704
764
  (error2) => {
705
- console.error("\u274C \u52A8\u4F5C\u52A0\u8F7D\u5931\u8D25:", error2);
765
+ const motionEndTime = performance.now();
766
+ const motionLoadTime = ((motionEndTime - motionStartTime) / 1e3).toFixed(2);
767
+ console.error(`\u274C \u52A8\u4F5C\u52A0\u8F7D\u5931\u8D25 (\u8017\u65F6: ${motionLoadTime}\u79D2):`, error2);
706
768
  reject(error2);
707
769
  }
708
770
  );
@@ -753,12 +815,18 @@ var MMDPlayerEnhanced = ({
753
815
  }
754
816
  if (currentResources.audioPath) {
755
817
  setLoadingProgress(90);
818
+ const audioStartTime = performance.now();
756
819
  console.log("\u{1F3B5} \u5F00\u59CB\u52A0\u8F7D\u97F3\u9891:", currentResources.audioPath);
757
820
  const audio = new Audio(currentResources.audioPath);
758
821
  audio.volume = 0.5;
759
822
  audio.loop = loop;
760
823
  audioRef.current = audio;
761
824
  hasAudioRef.current = true;
825
+ audio.onloadedmetadata = () => {
826
+ const audioEndTime = performance.now();
827
+ const audioLoadTime = ((audioEndTime - audioStartTime) / 1e3).toFixed(2);
828
+ console.log(`\u2705 \u97F3\u9891\u52A0\u8F7D\u6210\u529F (\u8017\u65F6: ${audioLoadTime}\u79D2, \u65F6\u957F: ${audio.duration.toFixed(2)}\u79D2)`);
829
+ };
762
830
  audio.onended = () => {
763
831
  if (!loop) {
764
832
  setIsPlaying(false);
@@ -773,7 +841,6 @@ var MMDPlayerEnhanced = ({
773
841
  }
774
842
  onAudioEnded?.();
775
843
  };
776
- console.log("\u2705 \u97F3\u9891\u52A0\u8F7D\u6210\u529F");
777
844
  }
778
845
  setLoadingProgress(100);
779
846
  setLoading(false);
@@ -802,32 +869,54 @@ var MMDPlayerEnhanced = ({
802
869
  }, [currentResources, stage?.enablePhysics, autoPlay, loop, onLoad, onError, reloadTrigger]);
803
870
  const play = () => {
804
871
  console.log("\u{1F3AC} [play] \u51FD\u6570\u88AB\u8C03\u7528\uFF0CneedReset =", needReset);
805
- if (!helperRef.current) return;
872
+ if (!helperRef.current && !needReset) return;
806
873
  if (needReset && vmdDataRef.current && sceneRef.current && cameraRef.current) {
807
874
  console.log("\u{1F504} \u68C0\u6D4B\u5230\u9700\u8981\u91CD\u7F6E\uFF0C\u91CD\u65B0\u521D\u59CB\u5316 helper\uFF08\u4FDD\u7559\u6A21\u578B\uFF09");
808
875
  const { mesh, vmd, cameraVmd } = vmdDataRef.current;
876
+ if (helperRef.current) {
877
+ try {
878
+ const helperObjects = helperRef.current.objects;
879
+ if (helperObjects && Array.isArray(helperObjects)) {
880
+ helperObjects.length = 0;
881
+ console.log("\u{1F9F9} \u6E05\u7A7A\u4E86\u65E7 helper \u7684 objects \u6570\u7EC4");
882
+ }
883
+ } catch (error2) {
884
+ console.warn("\u26A0\uFE0F \u65E0\u6CD5\u6E05\u7A7A\u65E7 helper.objects:", error2);
885
+ }
886
+ }
809
887
  const newHelper = new threeStdlib.MMDAnimationHelper();
810
888
  helperRef.current = newHelper;
811
889
  clockRef.current = new THREE2__namespace.Clock();
812
890
  if (vmd && typeof vmd === "object") {
813
- console.log("\u{1F4E6} \u91CD\u65B0\u6DFB\u52A0\u6A21\u578B\u52A8\u753B\uFF0Cvmd:", vmd);
891
+ console.log("\u{1F4E6} \u91CD\u65B0\u6DFB\u52A0\u6A21\u578B\u52A8\u753B");
814
892
  try {
815
893
  newHelper.add(mesh, {
816
894
  animation: vmd,
817
895
  physics: stage?.enablePhysics !== false
818
896
  });
897
+ console.log("\u2705 \u6A21\u578B\u52A8\u753B\u6DFB\u52A0\u6210\u529F");
819
898
  } catch (error2) {
820
899
  console.error("\u274C \u91CD\u65B0\u6DFB\u52A0\u6A21\u578B\u52A8\u753B\u5931\u8D25:", error2);
821
- console.log("\u{1F4CB} vmd \u6570\u636E:", vmd);
822
- newHelper.add(mesh, { physics: stage?.enablePhysics !== false });
900
+ try {
901
+ newHelper.add(mesh, { physics: stage?.enablePhysics !== false });
902
+ console.log("\u2705 \u4EC5\u6DFB\u52A0\u6A21\u578B\u548C\u7269\u7406\uFF08\u65E0\u52A8\u753B\uFF09");
903
+ } catch (innerError) {
904
+ console.error("\u274C \u6DFB\u52A0\u6A21\u578B\u4E5F\u5931\u8D25\u4E86:", innerError);
905
+ }
823
906
  }
824
907
  } else {
825
- newHelper.add(mesh, { physics: stage?.enablePhysics !== false });
908
+ try {
909
+ newHelper.add(mesh, { physics: stage?.enablePhysics !== false });
910
+ console.log("\u2705 \u4EC5\u6DFB\u52A0\u6A21\u578B\u548C\u7269\u7406\uFF08\u65E0\u52A8\u753B\u6570\u636E\uFF09");
911
+ } catch (error2) {
912
+ console.error("\u274C \u6DFB\u52A0\u6A21\u578B\u5931\u8D25:", error2);
913
+ }
826
914
  }
827
915
  if (cameraVmd && typeof cameraVmd === "object") {
828
916
  console.log("\u{1F4F7} \u91CD\u65B0\u6DFB\u52A0\u76F8\u673A\u52A8\u753B");
829
917
  try {
830
918
  newHelper.add(cameraRef.current, { animation: cameraVmd });
919
+ console.log("\u2705 \u76F8\u673A\u52A8\u753B\u6DFB\u52A0\u6210\u529F");
831
920
  } catch (error2) {
832
921
  console.error("\u274C \u91CD\u65B0\u6DFB\u52A0\u76F8\u673A\u52A8\u753B\u5931\u8D25:", error2);
833
922
  }
@@ -838,6 +927,10 @@ var MMDPlayerEnhanced = ({
838
927
  setNeedReset(false);
839
928
  console.log("\u2705 Helper \u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u51C6\u5907\u4ECE\u7B2C\u4E00\u5E27\u64AD\u653E");
840
929
  }
930
+ if (!helperRef.current) {
931
+ console.error("\u274C [play] helper \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u64AD\u653E");
932
+ return;
933
+ }
841
934
  if (audioRef.current) {
842
935
  audioRef.current.play();
843
936
  }