sa2kit 3.0.0 → 3.2.0
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/README.md +5 -5
- package/dist/AliyunOSSProvider-7IOT5U6M.js +15 -0
- package/dist/AliyunOSSProvider-7IOT5U6M.js.map +1 -0
- package/dist/AliyunOSSProvider-ZXZM7OQA.mjs +6 -0
- package/dist/AliyunOSSProvider-ZXZM7OQA.mjs.map +1 -0
- package/dist/LocalStorageProvider-KJKRCKBS.js +15 -0
- package/dist/LocalStorageProvider-KJKRCKBS.js.map +1 -0
- package/dist/LocalStorageProvider-O22465NY.mjs +6 -0
- package/dist/LocalStorageProvider-O22465NY.mjs.map +1 -0
- package/dist/chunk-2234T4A6.js +303 -0
- package/dist/chunk-2234T4A6.js.map +1 -0
- package/dist/chunk-36KGNXKW.js +16 -0
- package/dist/chunk-36KGNXKW.js.map +1 -0
- package/dist/chunk-375C7WL7.js +2695 -0
- package/dist/chunk-375C7WL7.js.map +1 -0
- package/dist/chunk-3J24Z4MB.js +991 -0
- package/dist/chunk-3J24Z4MB.js.map +1 -0
- package/dist/chunk-3QCATFQV.js +43 -0
- package/dist/chunk-3QCATFQV.js.map +1 -0
- package/dist/chunk-3R6JHA6D.js +120 -0
- package/dist/chunk-3R6JHA6D.js.map +1 -0
- package/dist/chunk-4OXKHV7J.js +43 -0
- package/dist/chunk-4OXKHV7J.js.map +1 -0
- package/dist/chunk-4PJM4752.js +4 -0
- package/dist/chunk-4PJM4752.js.map +1 -0
- package/dist/chunk-65JRVC3F.mjs +54 -0
- package/dist/chunk-65JRVC3F.mjs.map +1 -0
- package/dist/chunk-6HL54I2B.js +336 -0
- package/dist/chunk-6HL54I2B.js.map +1 -0
- package/dist/chunk-6V2MIQPF.mjs +77 -0
- package/dist/chunk-6V2MIQPF.mjs.map +1 -0
- package/dist/chunk-6YLCRWKM.mjs +8 -0
- package/dist/chunk-6YLCRWKM.mjs.map +1 -0
- package/dist/chunk-7CRU2Y5X.mjs +152 -0
- package/dist/chunk-7CRU2Y5X.mjs.map +1 -0
- package/dist/chunk-7PMT4L4I.js +324 -0
- package/dist/chunk-7PMT4L4I.js.map +1 -0
- package/dist/chunk-7VVZHFEM.js +88 -0
- package/dist/chunk-7VVZHFEM.js.map +1 -0
- package/dist/chunk-AWHGIKTQ.js +56 -0
- package/dist/chunk-AWHGIKTQ.js.map +1 -0
- package/dist/chunk-B3GYF6TY.js +37 -0
- package/dist/chunk-B3GYF6TY.js.map +1 -0
- package/dist/chunk-BDBJFOXM.mjs +14 -0
- package/dist/chunk-BDBJFOXM.mjs.map +1 -0
- package/dist/chunk-BTW3SWQN.mjs +25 -0
- package/dist/chunk-BTW3SWQN.mjs.map +1 -0
- package/dist/chunk-CHYSSZ4E.mjs +734 -0
- package/dist/chunk-CHYSSZ4E.mjs.map +1 -0
- package/dist/chunk-DO6QYAZV.mjs +298 -0
- package/dist/chunk-DO6QYAZV.mjs.map +1 -0
- package/dist/chunk-DTR53LQO.mjs +781 -0
- package/dist/chunk-DTR53LQO.mjs.map +1 -0
- package/dist/chunk-EI2S4XDG.mjs +89 -0
- package/dist/chunk-EI2S4XDG.mjs.map +1 -0
- package/dist/chunk-EOZHUI46.js +93 -0
- package/dist/chunk-EOZHUI46.js.map +1 -0
- package/dist/chunk-F2BZIU67.js +184 -0
- package/dist/chunk-F2BZIU67.js.map +1 -0
- package/dist/chunk-F2TEJSCP.js +756 -0
- package/dist/chunk-F2TEJSCP.js.map +1 -0
- package/dist/chunk-FCLS5R24.js +148 -0
- package/dist/chunk-FCLS5R24.js.map +1 -0
- package/dist/chunk-FUA6ZGMI.mjs +376 -0
- package/dist/chunk-FUA6ZGMI.mjs.map +1 -0
- package/dist/chunk-FY2X3LYR.mjs +3 -0
- package/dist/chunk-FY2X3LYR.mjs.map +1 -0
- package/dist/chunk-GS4SAW25.mjs +116 -0
- package/dist/chunk-GS4SAW25.mjs.map +1 -0
- package/dist/chunk-H56ICWUO.js +321 -0
- package/dist/chunk-H56ICWUO.js.map +1 -0
- package/dist/chunk-HG34SGMN.mjs +546 -0
- package/dist/chunk-HG34SGMN.mjs.map +1 -0
- package/dist/chunk-HL4H2HF6.js +279 -0
- package/dist/chunk-HL4H2HF6.js.map +1 -0
- package/dist/chunk-IJIQUMAK.mjs +272 -0
- package/dist/chunk-IJIQUMAK.mjs.map +1 -0
- package/dist/chunk-KEZFTDZT.mjs +559 -0
- package/dist/chunk-KEZFTDZT.mjs.map +1 -0
- package/dist/chunk-KHOVC2KL.js +144 -0
- package/dist/chunk-KHOVC2KL.js.map +1 -0
- package/dist/chunk-KRBSTLKC.js +6154 -0
- package/dist/chunk-KRBSTLKC.js.map +1 -0
- package/dist/chunk-KVYHCGRY.js +2011 -0
- package/dist/chunk-KVYHCGRY.js.map +1 -0
- package/dist/chunk-LZ5YTMMP.mjs +41 -0
- package/dist/chunk-LZ5YTMMP.mjs.map +1 -0
- package/dist/chunk-MJ6XJGAL.js +1551 -0
- package/dist/chunk-MJ6XJGAL.js.map +1 -0
- package/dist/chunk-MKLXCV4Z.mjs +1510 -0
- package/dist/chunk-MKLXCV4Z.mjs.map +1 -0
- package/dist/chunk-MMDSZIXD.mjs +286 -0
- package/dist/chunk-MMDSZIXD.mjs.map +1 -0
- package/dist/chunk-N2O3OX5Y.mjs +243 -0
- package/dist/chunk-N2O3OX5Y.mjs.map +1 -0
- package/dist/chunk-O6NNSPWD.mjs +35 -0
- package/dist/chunk-O6NNSPWD.mjs.map +1 -0
- package/dist/chunk-OIRZXSYM.js +80 -0
- package/dist/chunk-OIRZXSYM.js.map +1 -0
- package/dist/chunk-P7JQRNBJ.mjs +76 -0
- package/dist/chunk-P7JQRNBJ.mjs.map +1 -0
- package/dist/chunk-PA4ELVGI.js +20 -0
- package/dist/chunk-PA4ELVGI.js.map +1 -0
- package/dist/chunk-PLIG5257.mjs +2613 -0
- package/dist/chunk-PLIG5257.mjs.map +1 -0
- package/dist/chunk-QIF4MG5V.mjs +283 -0
- package/dist/chunk-QIF4MG5V.mjs.map +1 -0
- package/dist/chunk-RHECN4E2.mjs +6077 -0
- package/dist/chunk-RHECN4E2.mjs.map +1 -0
- package/dist/chunk-RHHTZTIN.mjs +314 -0
- package/dist/chunk-RHHTZTIN.mjs.map +1 -0
- package/dist/chunk-RRQ2X26Z.js +106 -0
- package/dist/chunk-RRQ2X26Z.js.map +1 -0
- package/dist/chunk-RST2T54Y.js +836 -0
- package/dist/chunk-RST2T54Y.js.map +1 -0
- package/dist/chunk-RVNQI6BI.js +249 -0
- package/dist/chunk-RVNQI6BI.js.map +1 -0
- package/dist/chunk-S3K4LTRI.mjs +226 -0
- package/dist/chunk-S3K4LTRI.mjs.map +1 -0
- package/dist/chunk-SWZ5XNF6.js +158 -0
- package/dist/chunk-SWZ5XNF6.js.map +1 -0
- package/dist/chunk-TNJ6LYX7.mjs +18 -0
- package/dist/chunk-TNJ6LYX7.mjs.map +1 -0
- package/dist/chunk-U7HNBCBS.js +207 -0
- package/dist/chunk-U7HNBCBS.js.map +1 -0
- package/dist/chunk-UJS3YSD3.mjs +37 -0
- package/dist/chunk-UJS3YSD3.mjs.map +1 -0
- package/dist/chunk-UJUWDF7M.mjs +336 -0
- package/dist/chunk-UJUWDF7M.mjs.map +1 -0
- package/dist/chunk-UR5NENGE.js +78 -0
- package/dist/chunk-UR5NENGE.js.map +1 -0
- package/dist/chunk-V7HGBDCB.mjs +135 -0
- package/dist/chunk-V7HGBDCB.mjs.map +1 -0
- package/dist/chunk-V7RLIZMN.js +90 -0
- package/dist/chunk-V7RLIZMN.js.map +1 -0
- package/dist/chunk-VCKXK6V5.js +345 -0
- package/dist/chunk-VCKXK6V5.js.map +1 -0
- package/dist/chunk-VIEXDTNF.mjs +100 -0
- package/dist/chunk-VIEXDTNF.mjs.map +1 -0
- package/dist/chunk-VN2DULIA.js +579 -0
- package/dist/chunk-VN2DULIA.js.map +1 -0
- package/dist/chunk-VNWMRUY6.js +168 -0
- package/dist/chunk-VNWMRUY6.js.map +1 -0
- package/dist/chunk-VYK4M2D6.mjs +177 -0
- package/dist/chunk-VYK4M2D6.mjs.map +1 -0
- package/dist/chunk-WB4H6ZUW.mjs +86 -0
- package/dist/chunk-WB4H6ZUW.mjs.map +1 -0
- package/dist/chunk-WM3AEJ2E.mjs +981 -0
- package/dist/chunk-WM3AEJ2E.mjs.map +1 -0
- package/dist/chunk-X5GINUGI.mjs +162 -0
- package/dist/chunk-X5GINUGI.mjs.map +1 -0
- package/dist/chunk-XB7GUEHZ.mjs +82 -0
- package/dist/chunk-XB7GUEHZ.mjs.map +1 -0
- package/dist/chunk-XE5RGZ3B.js +242 -0
- package/dist/chunk-XE5RGZ3B.js.map +1 -0
- package/dist/chunk-XNTIMVSL.mjs +193 -0
- package/dist/chunk-XNTIMVSL.mjs.map +1 -0
- package/dist/chunk-Y7WHUKJF.js +387 -0
- package/dist/chunk-Y7WHUKJF.js.map +1 -0
- package/dist/chunk-YIRPPMCN.mjs +1916 -0
- package/dist/chunk-YIRPPMCN.mjs.map +1 -0
- package/dist/chunk-YTGUIRRH.js +10 -0
- package/dist/chunk-YTGUIRRH.js.map +1 -0
- package/dist/chunk-Z2SNB5LJ.js +28 -0
- package/dist/chunk-Z2SNB5LJ.js.map +1 -0
- package/dist/chunk-ZOP7YIVX.js +552 -0
- package/dist/chunk-ZOP7YIVX.js.map +1 -0
- package/dist/chunk-ZUZLWHH5.mjs +146 -0
- package/dist/chunk-ZUZLWHH5.mjs.map +1 -0
- package/dist/common/ai/llm/core/index.d.mts +70 -0
- package/dist/common/ai/llm/core/index.d.ts +70 -0
- package/dist/common/ai/llm/core/index.js +54 -0
- package/dist/common/ai/llm/core/index.mjs +5 -0
- package/dist/common/ai/llm/electron/index.d.mts +6 -0
- package/dist/common/ai/llm/electron/index.d.ts +6 -0
- package/dist/common/ai/llm/electron/index.js +67 -0
- package/dist/common/ai/llm/electron/index.mjs +10 -0
- package/dist/common/ai/llm/index.d.mts +3 -0
- package/dist/common/ai/llm/index.d.ts +3 -0
- package/dist/common/ai/llm/index.js +54 -0
- package/dist/common/ai/llm/index.mjs +5 -0
- package/dist/common/ai/llm/miniapp/index.d.mts +6 -0
- package/dist/common/ai/llm/miniapp/index.d.ts +6 -0
- package/dist/common/ai/llm/miniapp/index.js +59 -0
- package/dist/common/ai/llm/miniapp/index.mjs +6 -0
- package/dist/common/ai/llm/rn/index.d.mts +6 -0
- package/dist/common/ai/llm/rn/index.d.ts +6 -0
- package/dist/common/ai/llm/rn/index.js +59 -0
- package/dist/common/ai/llm/rn/index.mjs +6 -0
- package/dist/common/ai/llm/ui/electron/index.d.mts +5 -0
- package/dist/common/ai/llm/ui/electron/index.d.ts +5 -0
- package/dist/common/ai/llm/ui/electron/index.js +22 -0
- package/dist/common/ai/llm/ui/electron/index.mjs +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.d.mts +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.d.ts +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.js +14 -0
- package/dist/common/ai/llm/ui/miniapp/index.mjs +5 -0
- package/dist/common/ai/llm/ui/rn/index.d.mts +9 -0
- package/dist/common/ai/llm/ui/rn/index.d.ts +9 -0
- package/dist/common/ai/llm/ui/rn/index.js +14 -0
- package/dist/common/ai/llm/ui/rn/index.mjs +5 -0
- package/dist/common/ai/llm/ui/web/index.d.mts +15 -0
- package/dist/common/ai/llm/ui/web/index.d.ts +15 -0
- package/dist/common/ai/llm/ui/web/index.js +21 -0
- package/dist/common/ai/llm/ui/web/index.mjs +8 -0
- package/dist/common/ai/llm/web/index.d.mts +6 -0
- package/dist/common/ai/llm/web/index.d.ts +6 -0
- package/dist/common/ai/llm/web/index.js +66 -0
- package/dist/common/ai/llm/web/index.mjs +9 -0
- package/dist/common/analytics/index.d.mts +2 -0
- package/dist/common/analytics/index.d.ts +2 -0
- package/dist/common/analytics/index.js +314 -0
- package/dist/common/analytics/index.mjs +5 -0
- package/dist/common/analytics/server/index.js +529 -0
- package/dist/common/analytics/server/index.js.map +1 -0
- package/dist/common/analytics/server/index.mjs +525 -0
- package/dist/common/analytics/server/index.mjs.map +1 -0
- package/dist/common/api/index.d.mts +3 -0
- package/dist/common/api/index.d.ts +3 -0
- package/dist/common/api/index.js +21 -0
- package/dist/common/api/index.mjs +4 -0
- package/dist/common/auth/client/index.d.mts +1 -31
- package/dist/common/auth/client/index.d.ts +1 -31
- package/dist/common/auth/client/index.js +2 -15
- package/dist/common/auth/client/index.mjs +1 -2
- package/dist/common/auth/components/index.d.mts +5 -239
- package/dist/common/auth/components/index.d.ts +5 -239
- package/dist/common/auth/components/index.js +878 -49
- package/dist/common/auth/components/index.js.map +1 -1
- package/dist/common/auth/components/index.mjs +871 -5
- package/dist/common/auth/components/index.mjs.map +1 -1
- package/dist/common/auth/hooks/index.d.mts +2 -29
- package/dist/common/auth/hooks/index.d.ts +2 -29
- package/dist/common/auth/hooks/index.js +2 -11
- package/dist/common/auth/hooks/index.mjs +1 -2
- package/dist/common/auth/index.d.mts +5 -9
- package/dist/common/auth/index.d.ts +5 -9
- package/dist/common/auth/index.js +5 -26
- package/dist/common/auth/index.mjs +3 -4
- package/dist/common/auth/rn/index.d.mts +1 -17
- package/dist/common/auth/rn/index.d.ts +1 -17
- package/dist/common/auth/rn/index.js +2 -34
- package/dist/common/auth/rn/index.js.map +1 -1
- package/dist/common/auth/rn/index.mjs +2 -31
- package/dist/common/auth/rn/index.mjs.map +1 -1
- package/dist/common/auth/server/index.d.mts +81 -2
- package/dist/common/auth/server/index.d.ts +81 -2
- package/dist/common/auth/server/index.js +128 -37
- package/dist/common/auth/server/index.js.map +1 -1
- package/dist/common/auth/server/index.mjs +124 -1
- package/dist/common/auth/server/index.mjs.map +1 -1
- package/dist/common/auth/services/index.js +12 -9
- package/dist/common/auth/services/index.js.map +1 -1
- package/dist/common/auth/services/index.mjs +10 -1
- package/dist/common/auth/services/index.mjs.map +1 -1
- package/dist/common/components/index.d.mts +4 -0
- package/dist/common/components/index.d.ts +4 -0
- package/dist/common/components/index.js +414 -0
- package/dist/common/components/index.mjs +9 -0
- package/dist/common/config/index.d.mts +1 -0
- package/dist/common/config/index.d.ts +1 -0
- package/dist/common/config/index.js +21 -0
- package/dist/common/config/index.mjs +4 -0
- package/dist/common/config/server/index.js +1177 -0
- package/dist/common/config/server/index.js.map +1 -0
- package/dist/common/config/server/index.mjs +1138 -0
- package/dist/common/config/server/index.mjs.map +1 -0
- package/dist/common/export/index.d.mts +2 -2
- package/dist/common/export/index.d.ts +2 -2
- package/dist/common/export/index.js +67 -67
- package/dist/common/export/index.mjs +3 -3
- package/dist/common/export/server/index.d.mts +2 -2
- package/dist/common/export/server/index.d.ts +2 -2
- package/dist/common/export/server/index.js +76 -48
- package/dist/common/export/server/index.mjs +3 -3
- package/dist/common/file/index.d.mts +2 -2
- package/dist/common/file/index.d.ts +2 -2
- package/dist/common/file/index.js +27 -27
- package/dist/common/file/index.mjs +5 -5
- package/dist/common/file/server/index.d.mts +2 -2
- package/dist/common/file/server/index.d.ts +2 -2
- package/dist/common/file/server/index.js +58 -50
- package/dist/common/file/server/index.mjs +8 -8
- package/dist/common/i18n/index.d.mts +2 -0
- package/dist/common/i18n/index.d.ts +2 -0
- package/dist/common/i18n/index.js +73 -0
- package/dist/common/i18n/index.mjs +4 -0
- package/dist/common/imageCrop/index.d.mts +2 -0
- package/dist/common/imageCrop/index.d.ts +2 -0
- package/dist/common/imageCrop/index.js +61 -0
- package/dist/common/imageCrop/index.mjs +4 -0
- package/dist/common/index.d.mts +17 -20
- package/dist/common/index.d.ts +17 -20
- package/dist/common/index.js +76 -70
- package/dist/common/index.mjs +27 -29
- package/dist/common/logger/index.d.mts +1 -1
- package/dist/common/logger/index.d.ts +1 -1
- package/dist/common/logger/index.js +6 -7
- package/dist/common/logger/index.mjs +1 -2
- package/dist/common/ossFile/index.d.mts +61 -0
- package/dist/common/ossFile/index.d.ts +61 -0
- package/dist/common/ossFile/index.js +96 -0
- package/dist/common/ossFile/index.mjs +7 -0
- package/dist/common/ossFile/server/index.d.mts +94 -0
- package/dist/common/ossFile/server/index.d.ts +94 -0
- package/dist/common/ossFile/server/index.js +221 -0
- package/dist/common/ossFile/server/index.mjs +12 -0
- package/dist/common/platform/index.js +8 -8
- package/dist/common/platform/index.mjs +4 -4
- package/dist/common/request/index.d.mts +1 -1
- package/dist/common/request/index.d.ts +1 -1
- package/dist/common/request/index.js +5 -7
- package/dist/common/request/index.mjs +2 -4
- package/dist/common/storage/index.d.mts +1 -1
- package/dist/common/storage/index.d.ts +1 -1
- package/dist/common/storage/index.js +17 -17
- package/dist/common/storage/index.mjs +5 -5
- package/dist/common/universalExport/index.d.mts +232 -0
- package/dist/common/universalExport/index.d.ts +232 -0
- package/dist/common/universalExport/index.js +178 -0
- package/dist/common/universalExport/index.mjs +5 -0
- package/dist/common/universalExport/server/index.d.mts +1189 -0
- package/dist/common/universalExport/server/index.d.ts +1189 -0
- package/dist/common/universalExport/server/index.js +151 -0
- package/dist/common/universalExport/server/index.mjs +6 -0
- package/dist/common/universalFile/index.d.mts +409 -0
- package/dist/common/universalFile/index.d.ts +409 -0
- package/dist/common/universalFile/index.js +1742 -0
- package/dist/common/universalFile/index.js.map +1 -0
- package/dist/common/universalFile/index.mjs +1497 -0
- package/dist/common/universalFile/index.mjs.map +1 -0
- package/dist/common/universalFile/server/index.d.mts +1064 -0
- package/dist/common/universalFile/server/index.d.ts +1064 -0
- package/dist/common/universalFile/server/index.js +311 -0
- package/dist/common/universalFile/server/index.mjs +10 -0
- package/dist/common/utils/index.d.mts +1 -1
- package/dist/common/utils/index.d.ts +1 -1
- package/dist/common/utils/index.js +11 -12
- package/dist/common/utils/index.mjs +2 -3
- package/dist/index-BRLygK4h.d.ts +67 -0
- package/dist/index-BWNK5mH2.d.ts +76 -0
- package/dist/index-Bd7cKF1j.d.mts +50 -0
- package/dist/index-BiCK6gg6.d.mts +210 -0
- package/dist/index-BiCK6gg6.d.ts +210 -0
- package/dist/index-C-P2yBTH.d.mts +76 -0
- package/dist/index-CT4K2z-O.d.ts +81 -0
- package/dist/index-D6RJTGce.d.mts +81 -0
- package/dist/index-DA7L9JlE.d.mts +159 -0
- package/dist/index-DRQxtCDw.d.ts +50 -0
- package/dist/index-DXVph21C.d.mts +201 -0
- package/dist/index-DXVph21C.d.ts +201 -0
- package/dist/index-DzyK789B.d.mts +67 -0
- package/dist/index-FVJZCEtm.d.mts +145 -0
- package/dist/index-FVJZCEtm.d.ts +145 -0
- package/dist/index-nD9vPCZT.d.ts +159 -0
- package/dist/index-nOmIv2BG.d.mts +559 -0
- package/dist/index-nOmIv2BG.d.ts +559 -0
- package/dist/path-Bzc7hj1N.d.ts +45 -0
- package/dist/path-DN_65vhO.d.mts +45 -0
- package/dist/utils-Dm3O1rAa.d.mts +366 -0
- package/dist/utils-Dm3O1rAa.d.ts +366 -0
- package/package.json +293 -348
- package/dist/AliyunOSSProvider-4GRL2FJB.js +0 -15
- package/dist/AliyunOSSProvider-4GRL2FJB.js.map +0 -1
- package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs +0 -6
- package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs.map +0 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +0 -41
- package/dist/CollisionBalls-BpHufX3H.d.ts +0 -41
- package/dist/ConfigService-BxK06xP6.d.mts +0 -262
- package/dist/ConfigService-BxK06xP6.d.ts +0 -262
- package/dist/LocalStorageProvider-J5RHV37G.mjs +0 -6
- package/dist/LocalStorageProvider-J5RHV37G.mjs.map +0 -1
- package/dist/LocalStorageProvider-PFA2DMIJ.js +0 -15
- package/dist/LocalStorageProvider-PFA2DMIJ.js.map +0 -1
- package/dist/UniversalFileService-CC4d3wkc.d.ts +0 -139
- package/dist/UniversalFileService-CzAE_G4V.d.mts +0 -139
- package/dist/ai/llm/core/index.d.mts +0 -70
- package/dist/ai/llm/core/index.d.ts +0 -70
- package/dist/ai/llm/core/index.js +0 -54
- package/dist/ai/llm/core/index.mjs +0 -5
- package/dist/ai/llm/electron/index.d.mts +0 -6
- package/dist/ai/llm/electron/index.d.ts +0 -6
- package/dist/ai/llm/electron/index.js +0 -66
- package/dist/ai/llm/electron/index.mjs +0 -9
- package/dist/ai/llm/index.d.mts +0 -3
- package/dist/ai/llm/index.d.ts +0 -3
- package/dist/ai/llm/index.js +0 -54
- package/dist/ai/llm/index.mjs +0 -5
- package/dist/ai/llm/miniapp/index.d.mts +0 -6
- package/dist/ai/llm/miniapp/index.d.ts +0 -6
- package/dist/ai/llm/miniapp/index.js +0 -59
- package/dist/ai/llm/miniapp/index.mjs +0 -6
- package/dist/ai/llm/rn/index.d.mts +0 -6
- package/dist/ai/llm/rn/index.d.ts +0 -6
- package/dist/ai/llm/rn/index.js +0 -59
- package/dist/ai/llm/rn/index.mjs +0 -6
- package/dist/ai/llm/ui/electron/index.d.mts +0 -5
- package/dist/ai/llm/ui/electron/index.d.ts +0 -5
- package/dist/ai/llm/ui/electron/index.js +0 -21
- package/dist/ai/llm/ui/electron/index.mjs +0 -8
- package/dist/ai/llm/ui/miniapp/index.d.mts +0 -9
- package/dist/ai/llm/ui/miniapp/index.d.ts +0 -9
- package/dist/ai/llm/ui/miniapp/index.js +0 -14
- package/dist/ai/llm/ui/miniapp/index.mjs +0 -5
- package/dist/ai/llm/ui/rn/index.d.mts +0 -9
- package/dist/ai/llm/ui/rn/index.d.ts +0 -9
- package/dist/ai/llm/ui/rn/index.js +0 -14
- package/dist/ai/llm/ui/rn/index.mjs +0 -5
- package/dist/ai/llm/ui/web/index.d.mts +0 -15
- package/dist/ai/llm/ui/web/index.d.ts +0 -15
- package/dist/ai/llm/ui/web/index.js +0 -20
- package/dist/ai/llm/ui/web/index.mjs +0 -7
- package/dist/ai/llm/web/index.d.mts +0 -6
- package/dist/ai/llm/web/index.d.ts +0 -6
- package/dist/ai/llm/web/index.js +0 -65
- package/dist/ai/llm/web/index.mjs +0 -8
- package/dist/analytics/index.d.mts +0 -2
- package/dist/analytics/index.d.ts +0 -2
- package/dist/analytics/index.js +0 -314
- package/dist/analytics/index.mjs +0 -5
- package/dist/analytics/server/index.js +0 -529
- package/dist/analytics/server/index.js.map +0 -1
- package/dist/analytics/server/index.mjs +0 -525
- package/dist/analytics/server/index.mjs.map +0 -1
- package/dist/api/index.d.mts +0 -3
- package/dist/api/index.d.ts +0 -3
- package/dist/api/index.js +0 -21
- package/dist/api/index.mjs +0 -4
- package/dist/audioDetection/index.d.mts +0 -449
- package/dist/audioDetection/index.d.ts +0 -449
- package/dist/audioDetection/index.js +0 -1244
- package/dist/audioDetection/index.js.map +0 -1
- package/dist/audioDetection/index.mjs +0 -1227
- package/dist/audioDetection/index.mjs.map +0 -1
- package/dist/auth/client/index.d.mts +0 -13
- package/dist/auth/client/index.d.ts +0 -13
- package/dist/auth/client/index.js +0 -26
- package/dist/auth/client/index.mjs +0 -5
- package/dist/auth/components/index.d.mts +0 -10
- package/dist/auth/components/index.d.ts +0 -10
- package/dist/auth/components/index.js +0 -70
- package/dist/auth/components/index.mjs +0 -9
- package/dist/auth/hooks/index.d.mts +0 -13
- package/dist/auth/hooks/index.d.ts +0 -13
- package/dist/auth/hooks/index.js +0 -28
- package/dist/auth/hooks/index.mjs +0 -7
- package/dist/auth/index.d.mts +0 -21
- package/dist/auth/index.d.ts +0 -21
- package/dist/auth/index.js +0 -112
- package/dist/auth/index.mjs +0 -11
- package/dist/auth/rn/index.d.mts +0 -3133
- package/dist/auth/rn/index.d.ts +0 -3133
- package/dist/auth/rn/index.js +0 -684
- package/dist/auth/rn/index.js.map +0 -1
- package/dist/auth/rn/index.mjs +0 -663
- package/dist/auth/rn/index.mjs.map +0 -1
- package/dist/auth/schema/index.d.mts +0 -4
- package/dist/auth/schema/index.d.ts +0 -4
- package/dist/auth/schema/index.js +0 -49
- package/dist/auth/schema/index.mjs +0 -4
- package/dist/auth/services/index.d.mts +0 -1
- package/dist/auth/services/index.d.ts +0 -1
- package/dist/auth/services/index.js +0 -17
- package/dist/auth/services/index.mjs +0 -4
- package/dist/base-api-client-BpmcQt4Q.d.ts +0 -103
- package/dist/base-api-client-CFIhZK4C.d.mts +0 -277
- package/dist/base-api-client-CFIhZK4C.d.ts +0 -277
- package/dist/base-api-client-DXLsq2yz.d.mts +0 -103
- package/dist/boothVaultService-Cn4WPhjg.d.mts +0 -83
- package/dist/boothVaultService-Cn4WPhjg.d.ts +0 -83
- package/dist/business/index.d.mts +0 -2
- package/dist/business/index.d.ts +0 -2
- package/dist/business/index.js +0 -581
- package/dist/business/index.js.map +0 -1
- package/dist/business/index.mjs +0 -575
- package/dist/business/index.mjs.map +0 -1
- package/dist/calendar/index.d.mts +0 -1325
- package/dist/calendar/index.d.ts +0 -1325
- package/dist/calendar/index.js +0 -5964
- package/dist/calendar/index.js.map +0 -1
- package/dist/calendar/index.mjs +0 -5878
- package/dist/calendar/index.mjs.map +0 -1
- package/dist/calendar/routes/index.d.mts +0 -191
- package/dist/calendar/routes/index.d.ts +0 -191
- package/dist/calendar/routes/index.js +0 -844
- package/dist/calendar/routes/index.js.map +0 -1
- package/dist/calendar/routes/index.mjs +0 -826
- package/dist/calendar/routes/index.mjs.map +0 -1
- package/dist/chunk-25OFOKNF.js +0 -171
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-2Y7BKFKZ.js +0 -37
- package/dist/chunk-2Y7BKFKZ.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs +0 -165
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3FRAIS4T.mjs +0 -35
- package/dist/chunk-3FRAIS4T.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs +0 -361
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-3Z43XGA4.mjs +0 -54
- package/dist/chunk-3Z43XGA4.mjs.map +0 -1
- package/dist/chunk-4FDUURSD.js +0 -22
- package/dist/chunk-4FDUURSD.js.map +0 -1
- package/dist/chunk-4WBCWJSN.js +0 -836
- package/dist/chunk-4WBCWJSN.js.map +0 -1
- package/dist/chunk-5GBDDXYL.mjs +0 -23
- package/dist/chunk-5GBDDXYL.mjs.map +0 -1
- package/dist/chunk-5USIS3UM.js +0 -4
- package/dist/chunk-5USIS3UM.js.map +0 -1
- package/dist/chunk-7E3J7VAD.mjs +0 -3
- package/dist/chunk-7E3J7VAD.mjs.map +0 -1
- package/dist/chunk-ACUFEDVQ.js +0 -345
- package/dist/chunk-ACUFEDVQ.js.map +0 -1
- package/dist/chunk-AQPU2AXH.js +0 -756
- package/dist/chunk-AQPU2AXH.js.map +0 -1
- package/dist/chunk-ATUCZXJY.js +0 -80
- package/dist/chunk-ATUCZXJY.js.map +0 -1
- package/dist/chunk-B3CZ3HXJ.mjs +0 -126
- package/dist/chunk-B3CZ3HXJ.mjs.map +0 -1
- package/dist/chunk-BCE6RUZV.js +0 -2695
- package/dist/chunk-BCE6RUZV.js.map +0 -1
- package/dist/chunk-BIHYZA67.mjs +0 -2613
- package/dist/chunk-BIHYZA67.mjs.map +0 -1
- package/dist/chunk-C6KV7VTZ.mjs +0 -152
- package/dist/chunk-C6KV7VTZ.mjs.map +0 -1
- package/dist/chunk-CAYOQDBR.js +0 -78
- package/dist/chunk-CAYOQDBR.js.map +0 -1
- package/dist/chunk-CIVO4R6N.mjs +0 -37
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-CX2GHCAI.mjs +0 -217
- package/dist/chunk-CX2GHCAI.mjs.map +0 -1
- package/dist/chunk-DIF5VRL3.mjs +0 -73
- package/dist/chunk-DIF5VRL3.mjs.map +0 -1
- package/dist/chunk-FCEBAWN6.js +0 -18
- package/dist/chunk-FCEBAWN6.js.map +0 -1
- package/dist/chunk-FHIE5MTC.mjs +0 -541
- package/dist/chunk-FHIE5MTC.mjs.map +0 -1
- package/dist/chunk-FHLTPXAR.js +0 -56
- package/dist/chunk-FHLTPXAR.js.map +0 -1
- package/dist/chunk-FIUBFREP.mjs +0 -298
- package/dist/chunk-FIUBFREP.mjs.map +0 -1
- package/dist/chunk-FOQEQWX5.js +0 -4
- package/dist/chunk-FOQEQWX5.js.map +0 -1
- package/dist/chunk-FXQOXLDE.js +0 -120
- package/dist/chunk-FXQOXLDE.js.map +0 -1
- package/dist/chunk-G4NFB2QA.mjs +0 -212
- package/dist/chunk-G4NFB2QA.mjs.map +0 -1
- package/dist/chunk-G5HJGXGC.mjs +0 -39
- package/dist/chunk-G5HJGXGC.mjs.map +0 -1
- package/dist/chunk-G6HXNQ2U.mjs +0 -336
- package/dist/chunk-G6HXNQ2U.mjs.map +0 -1
- package/dist/chunk-G6NSKJMH.js +0 -106
- package/dist/chunk-G6NSKJMH.js.map +0 -1
- package/dist/chunk-G7UBMCUT.mjs +0 -41
- package/dist/chunk-G7UBMCUT.mjs.map +0 -1
- package/dist/chunk-GQZHGSRR.js +0 -44
- package/dist/chunk-GQZHGSRR.js.map +0 -1
- package/dist/chunk-GS7XLKET.js +0 -41
- package/dist/chunk-GS7XLKET.js.map +0 -1
- package/dist/chunk-GWNBVGDT.mjs +0 -1232
- package/dist/chunk-GWNBVGDT.mjs.map +0 -1
- package/dist/chunk-HDMIOOZY.mjs +0 -546
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js +0 -552
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-HJZHQW5R.mjs +0 -146
- package/dist/chunk-HJZHQW5R.mjs.map +0 -1
- package/dist/chunk-I5ZPEDNR.mjs +0 -734
- package/dist/chunk-I5ZPEDNR.mjs.map +0 -1
- package/dist/chunk-IBWDBBX5.mjs +0 -16
- package/dist/chunk-IBWDBBX5.mjs.map +0 -1
- package/dist/chunk-J77KR2EV.mjs +0 -193
- package/dist/chunk-J77KR2EV.mjs.map +0 -1
- package/dist/chunk-KH6RQ4J5.js +0 -28
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-KQ643L7Z.js +0 -144
- package/dist/chunk-KQ643L7Z.js.map +0 -1
- package/dist/chunk-LFB5EIIM.mjs +0 -31
- package/dist/chunk-LFB5EIIM.mjs.map +0 -1
- package/dist/chunk-LHJKLUM7.mjs +0 -18
- package/dist/chunk-LHJKLUM7.mjs.map +0 -1
- package/dist/chunk-MBANGIG3.mjs +0 -781
- package/dist/chunk-MBANGIG3.mjs.map +0 -1
- package/dist/chunk-MWSAH7ZG.mjs +0 -42
- package/dist/chunk-MWSAH7ZG.mjs.map +0 -1
- package/dist/chunk-MZOGYD4N.mjs +0 -186
- package/dist/chunk-MZOGYD4N.mjs.map +0 -1
- package/dist/chunk-NCRP2YHY.mjs +0 -1598
- package/dist/chunk-NCRP2YHY.mjs.map +0 -1
- package/dist/chunk-NDGHXVGS.js +0 -25
- package/dist/chunk-NDGHXVGS.js.map +0 -1
- package/dist/chunk-NDPO5OMC.js +0 -563
- package/dist/chunk-NDPO5OMC.js.map +0 -1
- package/dist/chunk-PBI7FKMB.js +0 -43
- package/dist/chunk-PBI7FKMB.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js +0 -336
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-Q5VFBPMG.mjs +0 -76
- package/dist/chunk-Q5VFBPMG.mjs.map +0 -1
- package/dist/chunk-QDUBO567.js +0 -1148
- package/dist/chunk-QDUBO567.js.map +0 -1
- package/dist/chunk-QP5N3ER6.js +0 -18
- package/dist/chunk-QP5N3ER6.js.map +0 -1
- package/dist/chunk-QXAOXBVB.mjs +0 -135
- package/dist/chunk-QXAOXBVB.mjs.map +0 -1
- package/dist/chunk-R2DXTE2L.js +0 -249
- package/dist/chunk-R2DXTE2L.js.map +0 -1
- package/dist/chunk-RJP2BRJD.mjs +0 -6077
- package/dist/chunk-RJP2BRJD.mjs.map +0 -1
- package/dist/chunk-RTD2WHQQ.mjs +0 -16
- package/dist/chunk-RTD2WHQQ.mjs.map +0 -1
- package/dist/chunk-RWCD2CAD.mjs +0 -1132
- package/dist/chunk-RWCD2CAD.mjs.map +0 -1
- package/dist/chunk-S37OK2QG.js +0 -216
- package/dist/chunk-S37OK2QG.js.map +0 -1
- package/dist/chunk-S3PUP7N4.js +0 -20
- package/dist/chunk-S3PUP7N4.js.map +0 -1
- package/dist/chunk-S6YSGVWD.js +0 -224
- package/dist/chunk-S6YSGVWD.js.map +0 -1
- package/dist/chunk-S732H246.js +0 -6154
- package/dist/chunk-S732H246.js.map +0 -1
- package/dist/chunk-SFDJNKWC.js +0 -22
- package/dist/chunk-SFDJNKWC.js.map +0 -1
- package/dist/chunk-SKFEJPMJ.mjs +0 -226
- package/dist/chunk-SKFEJPMJ.mjs.map +0 -1
- package/dist/chunk-SLKOEYFH.js +0 -303
- package/dist/chunk-SLKOEYFH.js.map +0 -1
- package/dist/chunk-TC5YU6A4.mjs +0 -243
- package/dist/chunk-TC5YU6A4.mjs.map +0 -1
- package/dist/chunk-TXMX6PZR.js +0 -190
- package/dist/chunk-TXMX6PZR.js.map +0 -1
- package/dist/chunk-UCOE6SET.js +0 -148
- package/dist/chunk-UCOE6SET.js.map +0 -1
- package/dist/chunk-UIYKZ73N.js +0 -36
- package/dist/chunk-UIYKZ73N.js.map +0 -1
- package/dist/chunk-V7EVKD5G.mjs +0 -116
- package/dist/chunk-V7EVKD5G.mjs.map +0 -1
- package/dist/chunk-VHN7PF5I.js +0 -20
- package/dist/chunk-VHN7PF5I.js.map +0 -1
- package/dist/chunk-VMTEDX5H.js +0 -1275
- package/dist/chunk-VMTEDX5H.js.map +0 -1
- package/dist/chunk-VRN76M56.mjs +0 -3
- package/dist/chunk-VRN76M56.mjs.map +0 -1
- package/dist/chunk-VXFUXZN5.mjs +0 -20
- package/dist/chunk-VXFUXZN5.mjs.map +0 -1
- package/dist/chunk-WEEXCPSE.mjs +0 -86
- package/dist/chunk-WEEXCPSE.mjs.map +0 -1
- package/dist/chunk-WW4GE6CZ.js +0 -1647
- package/dist/chunk-WW4GE6CZ.js.map +0 -1
- package/dist/chunk-WZDTNDYR.js +0 -207
- package/dist/chunk-WZDTNDYR.js.map +0 -1
- package/dist/chunk-XBZIS3MV.mjs +0 -13
- package/dist/chunk-XBZIS3MV.mjs.map +0 -1
- package/dist/chunk-XFOZ56FB.mjs +0 -20
- package/dist/chunk-XFOZ56FB.mjs.map +0 -1
- package/dist/chunk-XJ7ZAGC5.js +0 -88
- package/dist/chunk-XJ7ZAGC5.js.map +0 -1
- package/dist/chunk-XUS5ACKR.mjs +0 -100
- package/dist/chunk-XUS5ACKR.mjs.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs +0 -314
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-Z23HAXHL.js +0 -136
- package/dist/chunk-Z23HAXHL.js.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs +0 -25
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZLYPALF3.js +0 -242
- package/dist/chunk-ZLYPALF3.js.map +0 -1
- package/dist/chunk-ZM2SZJTZ.js +0 -158
- package/dist/chunk-ZM2SZJTZ.js.map +0 -1
- package/dist/chunk-ZRAW3HXA.js +0 -43
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js +0 -371
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
- package/dist/components/index.d.mts +0 -405
- package/dist/components/index.d.ts +0 -405
- package/dist/components/index.js +0 -2516
- package/dist/components/index.js.map +0 -1
- package/dist/components/index.mjs +0 -2396
- package/dist/components/index.mjs.map +0 -1
- package/dist/config/index.d.mts +0 -1
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.js +0 -21
- package/dist/config/index.mjs +0 -4
- package/dist/config/server/index.js +0 -1177
- package/dist/config/server/index.js.map +0 -1
- package/dist/config/server/index.mjs +0 -1138
- package/dist/config/server/index.mjs.map +0 -1
- package/dist/drizzle-schema-BNhqj2AZ.d.mts +0 -1114
- package/dist/drizzle-schema-BNhqj2AZ.d.ts +0 -1114
- package/dist/festivalCard/index.d.mts +0 -76
- package/dist/festivalCard/index.d.ts +0 -76
- package/dist/festivalCard/index.js +0 -1492
- package/dist/festivalCard/index.js.map +0 -1
- package/dist/festivalCard/index.mjs +0 -1475
- package/dist/festivalCard/index.mjs.map +0 -1
- package/dist/festivalCard/routes/index.d.mts +0 -42
- package/dist/festivalCard/routes/index.d.ts +0 -42
- package/dist/festivalCard/routes/index.js +0 -361
- package/dist/festivalCard/routes/index.js.map +0 -1
- package/dist/festivalCard/routes/index.mjs +0 -356
- package/dist/festivalCard/routes/index.mjs.map +0 -1
- package/dist/festivalCard/server/index.d.mts +0 -120
- package/dist/festivalCard/server/index.d.ts +0 -120
- package/dist/festivalCard/server/index.js +0 -272
- package/dist/festivalCard/server/index.js.map +0 -1
- package/dist/festivalCard/server/index.mjs +0 -265
- package/dist/festivalCard/server/index.mjs.map +0 -1
- package/dist/festivalCardService-B3GsnNpV.d.ts +0 -13
- package/dist/festivalCardService-CWhrLNE9.d.mts +0 -13
- package/dist/i18n/index.d.mts +0 -2
- package/dist/i18n/index.d.ts +0 -2
- package/dist/i18n/index.js +0 -73
- package/dist/i18n/index.mjs +0 -4
- package/dist/imageCrop/index.d.mts +0 -165
- package/dist/imageCrop/index.d.ts +0 -165
- package/dist/imageCrop/index.js +0 -560
- package/dist/imageCrop/index.js.map +0 -1
- package/dist/imageCrop/index.mjs +0 -541
- package/dist/imageCrop/index.mjs.map +0 -1
- package/dist/index-2G9Dxjvt.d.ts +0 -81
- package/dist/index-BcjDRcKp.d.mts +0 -40
- package/dist/index-Bjem5rWn.d.mts +0 -17
- package/dist/index-BlpXrrTy.d.ts +0 -40
- package/dist/index-C5U-2hJq.d.ts +0 -23
- package/dist/index-CYuUB8aF.d.mts +0 -67
- package/dist/index-CifSBBP2.d.ts +0 -17
- package/dist/index-D0K4ehme.d.mts +0 -20
- package/dist/index-DLnfKN-a.d.mts +0 -23
- package/dist/index-DSel44Ke.d.mts +0 -93
- package/dist/index-DSel44Ke.d.ts +0 -93
- package/dist/index-DZ5iJtNO.d.mts +0 -102
- package/dist/index-DZ5iJtNO.d.ts +0 -102
- package/dist/index-Da7qdkgW.d.ts +0 -20
- package/dist/index-DrPcMJPc.d.mts +0 -250
- package/dist/index-DrPcMJPc.d.ts +0 -250
- package/dist/index-WrR57hKT.d.ts +0 -67
- package/dist/index-oLUvfqT8.d.ts +0 -20
- package/dist/index-pe38RDgC.d.mts +0 -20
- package/dist/index-qcOvRVuN.d.mts +0 -81
- package/dist/index.d.mts +0 -11590
- package/dist/index.d.ts +0 -11590
- package/dist/index.js +0 -17679
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -17403
- package/dist/index.mjs.map +0 -1
- package/dist/logger/index.d.mts +0 -125
- package/dist/logger/index.d.ts +0 -125
- package/dist/logger/index.js +0 -29
- package/dist/logger/index.mjs +0 -4
- package/dist/mikuContest/ui/web/index.d.mts +0 -2
- package/dist/mikuContest/ui/web/index.d.ts +0 -2
- package/dist/mikuContest/ui/web/index.js +0 -353
- package/dist/mikuContest/ui/web/index.js.map +0 -1
- package/dist/mikuContest/ui/web/index.mjs +0 -343
- package/dist/mikuContest/ui/web/index.mjs.map +0 -1
- package/dist/mikuFireworks3D/index.d.mts +0 -268
- package/dist/mikuFireworks3D/index.d.ts +0 -268
- package/dist/mikuFireworks3D/index.js +0 -1267
- package/dist/mikuFireworks3D/index.js.map +0 -1
- package/dist/mikuFireworks3D/index.mjs +0 -1228
- package/dist/mikuFireworks3D/index.mjs.map +0 -1
- package/dist/mikuFusionGame/index.d.mts +0 -117
- package/dist/mikuFusionGame/index.d.ts +0 -117
- package/dist/mikuFusionGame/index.js +0 -1208
- package/dist/mikuFusionGame/index.js.map +0 -1
- package/dist/mikuFusionGame/index.mjs +0 -1195
- package/dist/mikuFusionGame/index.mjs.map +0 -1
- package/dist/mmd/admin/index.d.mts +0 -487
- package/dist/mmd/admin/index.d.ts +0 -487
- package/dist/mmd/admin/index.js +0 -1058
- package/dist/mmd/admin/index.js.map +0 -1
- package/dist/mmd/admin/index.mjs +0 -1027
- package/dist/mmd/admin/index.mjs.map +0 -1
- package/dist/mmd/index.d.mts +0 -2467
- package/dist/mmd/index.d.ts +0 -2467
- package/dist/mmd/index.js +0 -10119
- package/dist/mmd/index.js.map +0 -1
- package/dist/mmd/index.mjs +0 -10028
- package/dist/mmd/index.mjs.map +0 -1
- package/dist/mmd/server/index.d.mts +0 -139
- package/dist/mmd/server/index.d.ts +0 -139
- package/dist/mmd/server/index.js +0 -424
- package/dist/mmd/server/index.js.map +0 -1
- package/dist/mmd/server/index.mjs +0 -404
- package/dist/mmd/server/index.mjs.map +0 -1
- package/dist/music/index.d.mts +0 -74
- package/dist/music/index.d.ts +0 -74
- package/dist/music/index.js +0 -830
- package/dist/music/index.js.map +0 -1
- package/dist/music/index.mjs +0 -809
- package/dist/music/index.mjs.map +0 -1
- package/dist/music/server/index.d.mts +0 -1
- package/dist/music/server/index.d.ts +0 -1
- package/dist/music/server/index.js +0 -194
- package/dist/music/server/index.js.map +0 -1
- package/dist/music/server/index.mjs +0 -182
- package/dist/music/server/index.mjs.map +0 -1
- package/dist/navigation/index.d.mts +0 -93
- package/dist/navigation/index.d.ts +0 -93
- package/dist/navigation/index.js +0 -453
- package/dist/navigation/index.js.map +0 -1
- package/dist/navigation/index.mjs +0 -443
- package/dist/navigation/index.mjs.map +0 -1
- package/dist/ossFile/index.d.mts +0 -61
- package/dist/ossFile/index.d.ts +0 -61
- package/dist/ossFile/index.js +0 -96
- package/dist/ossFile/index.js.map +0 -1
- package/dist/ossFile/index.mjs +0 -7
- package/dist/ossFile/index.mjs.map +0 -1
- package/dist/ossFile/server/index.d.mts +0 -94
- package/dist/ossFile/server/index.d.ts +0 -94
- package/dist/ossFile/server/index.js +0 -213
- package/dist/ossFile/server/index.js.map +0 -1
- package/dist/ossFile/server/index.mjs +0 -12
- package/dist/ossFile/server/index.mjs.map +0 -1
- package/dist/path-DkaHQSyW.d.mts +0 -41
- package/dist/path-qjVnH8qU.d.ts +0 -41
- package/dist/portfolio/index.d.mts +0 -66
- package/dist/portfolio/index.d.ts +0 -66
- package/dist/portfolio/index.js +0 -736
- package/dist/portfolio/index.js.map +0 -1
- package/dist/portfolio/index.mjs +0 -724
- package/dist/portfolio/index.mjs.map +0 -1
- package/dist/qqbot/server/index.d.mts +0 -216
- package/dist/qqbot/server/index.d.ts +0 -216
- package/dist/qqbot/server/index.js +0 -394
- package/dist/qqbot/server/index.js.map +0 -1
- package/dist/qqbot/server/index.mjs +0 -385
- package/dist/qqbot/server/index.mjs.map +0 -1
- package/dist/qqbot/ui/web/index.d.mts +0 -10
- package/dist/qqbot/ui/web/index.d.ts +0 -10
- package/dist/qqbot/ui/web/index.js +0 -105
- package/dist/qqbot/ui/web/index.js.map +0 -1
- package/dist/qqbot/ui/web/index.mjs +0 -99
- package/dist/qqbot/ui/web/index.mjs.map +0 -1
- package/dist/request/index.d.mts +0 -59
- package/dist/request/index.d.ts +0 -59
- package/dist/request/index.js +0 -23
- package/dist/request/index.js.map +0 -1
- package/dist/request/index.mjs +0 -6
- package/dist/request/index.mjs.map +0 -1
- package/dist/screenReceiver/index.d.mts +0 -86
- package/dist/screenReceiver/index.d.ts +0 -86
- package/dist/screenReceiver/index.js +0 -281
- package/dist/screenReceiver/index.js.map +0 -1
- package/dist/screenReceiver/index.mjs +0 -273
- package/dist/screenReceiver/index.mjs.map +0 -1
- package/dist/session-BCXvGCnm.d.mts +0 -81
- package/dist/session-BCXvGCnm.d.ts +0 -81
- package/dist/storage/index.d.mts +0 -136
- package/dist/storage/index.d.ts +0 -136
- package/dist/storage/index.js +0 -48
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/index.mjs +0 -7
- package/dist/storage/index.mjs.map +0 -1
- package/dist/testYourself/admin/index.d.mts +0 -58
- package/dist/testYourself/admin/index.d.ts +0 -58
- package/dist/testYourself/admin/index.js +0 -1009
- package/dist/testYourself/admin/index.js.map +0 -1
- package/dist/testYourself/admin/index.mjs +0 -1002
- package/dist/testYourself/admin/index.mjs.map +0 -1
- package/dist/testYourself/index.d.mts +0 -53
- package/dist/testYourself/index.d.ts +0 -53
- package/dist/testYourself/index.js +0 -2551
- package/dist/testYourself/index.js.map +0 -1
- package/dist/testYourself/index.mjs +0 -2531
- package/dist/testYourself/index.mjs.map +0 -1
- package/dist/testYourself/server/index.d.mts +0 -1029
- package/dist/testYourself/server/index.d.ts +0 -1029
- package/dist/testYourself/server/index.js +0 -825
- package/dist/testYourself/server/index.js.map +0 -1
- package/dist/testYourself/server/index.mjs +0 -816
- package/dist/testYourself/server/index.mjs.map +0 -1
- package/dist/types-3ujSNAXb.d.mts +0 -286
- package/dist/types-3ujSNAXb.d.ts +0 -286
- package/dist/types-B6B210gX.d.mts +0 -270
- package/dist/types-B6B210gX.d.ts +0 -270
- package/dist/types-Bdnte5EN.d.mts +0 -292
- package/dist/types-C_W_CoUD.d.ts +0 -99
- package/dist/types-Cs0CLvrH.d.mts +0 -70
- package/dist/types-Cs0CLvrH.d.ts +0 -70
- package/dist/types-DCRvasyH.d.mts +0 -99
- package/dist/types-HorDyIRv.d.mts +0 -303
- package/dist/types-HorDyIRv.d.ts +0 -303
- package/dist/types-_rFX1atk.d.ts +0 -292
- package/dist/types.legacy-J-j-_ig_.d.mts +0 -25
- package/dist/types.legacy-J-j-_ig_.d.ts +0 -25
- package/dist/universalExport/index.d.mts +0 -312
- package/dist/universalExport/index.d.ts +0 -312
- package/dist/universalExport/index.js +0 -178
- package/dist/universalExport/index.js.map +0 -1
- package/dist/universalExport/index.mjs +0 -5
- package/dist/universalExport/index.mjs.map +0 -1
- package/dist/universalExport/server/index.d.mts +0 -1270
- package/dist/universalExport/server/index.d.ts +0 -1270
- package/dist/universalExport/server/index.js +0 -123
- package/dist/universalExport/server/index.js.map +0 -1
- package/dist/universalExport/server/index.mjs +0 -6
- package/dist/universalExport/server/index.mjs.map +0 -1
- package/dist/universalFile/index.d.mts +0 -409
- package/dist/universalFile/index.d.ts +0 -409
- package/dist/universalFile/index.js +0 -1742
- package/dist/universalFile/index.js.map +0 -1
- package/dist/universalFile/index.mjs +0 -1497
- package/dist/universalFile/index.mjs.map +0 -1
- package/dist/universalFile/server/index.d.mts +0 -1064
- package/dist/universalFile/server/index.d.ts +0 -1064
- package/dist/universalFile/server/index.js +0 -311
- package/dist/universalFile/server/index.js.map +0 -1
- package/dist/universalFile/server/index.mjs +0 -10
- package/dist/universalFile/server/index.mjs.map +0 -1
- package/dist/utils/index.d.mts +0 -192
- package/dist/utils/index.d.ts +0 -192
- package/dist/utils/index.js +0 -46
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/index.mjs +0 -5
- package/dist/utils/index.mjs.map +0 -1
- package/dist/vocaloidBooth/index.d.mts +0 -64
- package/dist/vocaloidBooth/index.d.ts +0 -64
- package/dist/vocaloidBooth/index.js +0 -376
- package/dist/vocaloidBooth/index.js.map +0 -1
- package/dist/vocaloidBooth/index.mjs +0 -362
- package/dist/vocaloidBooth/index.mjs.map +0 -1
- package/dist/vocaloidBooth/server/index.d.mts +0 -111
- package/dist/vocaloidBooth/server/index.d.ts +0 -111
- package/dist/vocaloidBooth/server/index.js +0 -247
- package/dist/vocaloidBooth/server/index.js.map +0 -1
- package/dist/vocaloidBooth/server/index.mjs +0 -237
- package/dist/vocaloidBooth/server/index.mjs.map +0 -1
- package/dist/vocaloidBooth/web/index.d.mts +0 -3
- package/dist/vocaloidBooth/web/index.d.ts +0 -3
- package/dist/vocaloidBooth/web/index.js +0 -376
- package/dist/vocaloidBooth/web/index.js.map +0 -1
- package/dist/vocaloidBooth/web/index.mjs +0 -362
- package/dist/vocaloidBooth/web/index.mjs.map +0 -1
- /package/dist/{ai → common/ai}/llm/core/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/core/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/electron/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/electron/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/miniapp/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/miniapp/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/rn/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/rn/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/electron/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/electron/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/miniapp/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/miniapp/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/rn/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/rn/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/web/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/web/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/web/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/web/index.mjs.map +0 -0
- /package/dist/{analytics → common/analytics}/index.js.map +0 -0
- /package/dist/{analytics → common/analytics}/index.mjs.map +0 -0
- /package/dist/{analytics → common/analytics}/server/index.d.mts +0 -0
- /package/dist/{analytics → common/analytics}/server/index.d.ts +0 -0
- /package/dist/{api → common/api}/index.js.map +0 -0
- /package/dist/{api → common/api}/index.mjs.map +0 -0
- /package/dist/{auth/client → common/components}/index.js.map +0 -0
- /package/dist/{auth/client → common/components}/index.mjs.map +0 -0
- /package/dist/{auth/components → common/config}/index.js.map +0 -0
- /package/dist/{auth/components → common/config}/index.mjs.map +0 -0
- /package/dist/{config → common/config}/server/index.d.mts +0 -0
- /package/dist/{config → common/config}/server/index.d.ts +0 -0
- /package/dist/{auth/hooks → common/i18n}/index.js.map +0 -0
- /package/dist/{auth/hooks → common/i18n}/index.mjs.map +0 -0
- /package/dist/{auth → common/imageCrop}/index.js.map +0 -0
- /package/dist/{auth → common/imageCrop}/index.mjs.map +0 -0
- /package/dist/{auth/schema → common/ossFile}/index.js.map +0 -0
- /package/dist/{auth/schema → common/ossFile}/index.mjs.map +0 -0
- /package/dist/{auth/services → common/ossFile/server}/index.js.map +0 -0
- /package/dist/{auth/services → common/ossFile/server}/index.mjs.map +0 -0
- /package/dist/{config → common/universalExport}/index.js.map +0 -0
- /package/dist/{config → common/universalExport}/index.mjs.map +0 -0
- /package/dist/{i18n → common/universalExport/server}/index.js.map +0 -0
- /package/dist/{i18n → common/universalExport/server}/index.mjs.map +0 -0
- /package/dist/{logger → common/universalFile/server}/index.js.map +0 -0
- /package/dist/{logger → common/universalFile/server}/index.mjs.map +0 -0
package/dist/mmd/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mmd/pmx/parser/PMXParser.ts","../../src/mmd/pmx/parser/index.ts","../../src/mmd/pmx/editor/PMXEditor.ts","../../src/mmd/pmx/editor/PMXExporter.ts","../../src/mmd/pmx/components/PMXEditor.tsx","../../src/mmd/pmx/components/PMXViewer.tsx","../../src/mmd/utils/ammo-loader.ts","../../src/mmd/utils/mmd-loader-config.ts","../../src/mmd/components/MMDPlayerBase.tsx","../../src/mmd/components/ControlPanel.tsx","../../src/mmd/components/SettingsPanel.tsx","../../src/mmd/components/MMDPlayerEnhancedDebugInfo.tsx","../../src/mmd/components/MMDPlayerEnhanced.tsx","../../src/mmd/components/MMDPlaylistDebugInfo.tsx","../../src/mmd/components/MMDPlaylist.tsx","../../src/mmd/components/MMDLightingDebugPanel.tsx","../../src/mmd/components/MMDUploadPanel.tsx","../../src/mmd/utils/mmd-renderer-diagnostics.ts","../../src/mmd/utils/sphere-texture-helper.ts","../../src/mmd/visual-novel/DialogueBox.tsx","../../src/mmd/visual-novel/HistoryPanel.tsx","../../src/mmd/visual-novel/LoadingScreen.tsx","../../src/mmd/visual-novel/StartScreen.tsx","../../src/mmd/visual-novel/LoadingOverlay.tsx","../../src/mmd/visual-novel/SkipConfirmDialog.tsx","../../src/mmd/visual-novel/ChoiceMenu.tsx","../../src/mmd/visual-novel/LoopConfirmDialog.tsx","../../src/mmd/visual-novel/CheerButton.tsx","../../src/mmd/visual-novel/CheerParticles.tsx","../../src/mmd/visual-novel/MMDVisualNovel.tsx","../../src/mmd/visual-novel/ModelSelectorSettings.tsx","../../src/mmd/visual-novel/MMDVisualNovelWithSelector.tsx","../../src/mmd/music-player/components/MusicControls.tsx","../../src/mmd/music-player/components/PlaylistPanel.tsx","../../src/mmd/music-player/components/TrackInfo.tsx","../../src/music/constants.ts","../../src/music/adapters/kugou.ts","../../src/music/adapters/netease.ts","../../src/music/adapters/tencent.ts","../../src/music/adapters/xiami.ts","../../src/music/hooks/useMusic.ts","../../src/mmd/music-player/MMDMusicPlayer.tsx","../../src/ar/types.ts","../../src/ar/load-arjs.ts","../../src/mmd/ar/types.ts","../../src/mmd/ar/MMDARApp.tsx","../../src/mmd/ar/MMDARPlayer.tsx","../../src/mmd/fx/HLSLToGLSLConverter.ts","../../src/mmd/fx/FXParser.ts","../../src/mmd/fx/FXToThreeAdapter.ts","../../src/mmd/fx/MultiFXAdapter.ts","../../src/mmd/fx/utils.ts","../../src/mmd/fx/components/FXViewer.tsx","../../src/mmd/fx/components/FXThreePreview.tsx"],"names":["PMXParser","PMXEditor","useState","useEffect","data","React","clsx","THREE","THREE2","forwardRef","useRef","useImperativeHandle","OutlineEffect","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Camera","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useCallback","StatusBadge","THREE3","useId","useMemo","JSZip","Upload","Loader2","CheckCircle2","THREE4","THREE5","createPortal","THREE6","Shuffle","ListMusic","Search","useSWR","ARMode","THREE7","THREE8","THREE9","THREE10"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * PMX模型文件解析器\n * 用于解析PMX格式的MMD模型文件,提取纹理映射关系\n */\n\nimport {\n PMXHeader,\n PMXModelInfo,\n PMXMaterial,\n PMXTexture,\n PMXParseResult,\n MaterialTextureMapping,\n} from '../types';\n\nexport class PMXParser {\n private view!: DataView;\n private offset: number = 0;\n private textEncoding: 'utf16le' | 'utf8' = 'utf16le';\n private textureIndexSize: number = 1;\n private additionalVec4Count: number = 0;\n private vertexIndexSize: number = 1;\n private boneIndexSize: number = 1;\n\n /**\n * 从URL加载并解析PMX文件\n */\n async loadAndParse(url: string): Promise<PMXParseResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to load PMX file: ' + (response.statusText));\n }\n\n const buffer = await response.arrayBuffer();\n return this.parse(buffer);\n }\n\n /**\n * 解析PMX文件\n */\n parse(buffer: ArrayBuffer): PMXParseResult {\n this.view = new DataView(buffer);\n this.offset = 0;\n\n console.log('[PMXParser] Starting parse, file size:', buffer.byteLength);\n\n // 1. 解析头部\n const header = this.parseHeader();\n console.log('[PMXParser] Header parsed, offset:', this.offset);\n console.log('[PMXParser] Globals:', header.globals);\n\n // 2. 解析模型信息\n const modelInfo = this.parseModelInfo();\n console.log('[PMXParser] Model info parsed, offset:', this.offset);\n console.log('[PMXParser] Model name:', modelInfo.modelName);\n\n // 3. 解析顶点(只统计数量,不解析详细数据以提高性能)\n const vertexCount = this.skipVertices();\n console.log('[PMXParser] Vertices skipped, count:', vertexCount, 'offset:', this.offset);\n\n // 4. 解析面(只统计数量)\n const faceCount = this.skipFaces();\n console.log('[PMXParser] Faces skipped, count:', faceCount, 'offset:', this.offset);\n\n // 5. 解析纹理列表\n const textures = this.parseTextures();\n console.log('[PMXParser] Textures parsed, count:', textures.length, 'offset:', this.offset);\n\n // 6. 解析材质\n const materials = this.parseMaterials();\n console.log('[PMXParser] Materials parsed, count:', materials.length, 'offset:', this.offset);\n\n // 7. 生成材质纹理映射\n const materialTextureMappings = this.generateMaterialTextureMappings(\n materials,\n textures\n );\n\n return {\n header,\n modelInfo,\n textures,\n materials,\n materialTextureMappings,\n vertexCount,\n faceCount,\n };\n }\n\n /**\n * 解析文件头\n */\n private parseHeader(): PMXHeader {\n // 签名 \"PMX \" (4 bytes)\n const signature = this.readString(4);\n if (signature !== 'PMX ') {\n throw new Error('Invalid PMX signature: ' + (signature));\n }\n\n // 版本号 (4 bytes float)\n const version = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 全局设置数量 (1 byte)\n const globalsCount = this.view.getUint8(this.offset);\n this.offset += 1;\n\n if (globalsCount !== 8) {\n throw new Error('Unexpected globals count: ' + (globalsCount));\n }\n\n // 读取全局设置\n const encoding = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textEncoding = encoding === 0 ? 'utf16le' : 'utf8';\n\n const additionalVec4Count = this.view.getUint8(this.offset);\n this.offset += 1;\n this.additionalVec4Count = additionalVec4Count;\n\n const vertexIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.vertexIndexSize = vertexIndexSize;\n\n const textureIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textureIndexSize = textureIndexSize;\n\n const materialIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const boneIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.boneIndexSize = boneIndexSize;\n\n const morphIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const rigidBodyIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n return {\n signature,\n version,\n globals: {\n encoding,\n additionalVec4Count,\n vertexIndexSize,\n textureIndexSize,\n materialIndexSize,\n boneIndexSize,\n morphIndexSize,\n rigidBodyIndexSize,\n },\n };\n }\n\n /**\n * 解析模型信息\n */\n private parseModelInfo(): PMXModelInfo {\n const modelName = this.readTextBuffer();\n const modelNameEnglish = this.readTextBuffer();\n const comment = this.readTextBuffer();\n const commentEnglish = this.readTextBuffer();\n\n return {\n modelName,\n modelNameEnglish,\n comment,\n commentEnglish,\n };\n }\n\n /**\n * 跳过顶点数据(只返回数量)\n */\n private skipVertices(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n // 跳过所有顶点数据\n // 每个顶点的大小是可变的,需要根据权重类型计算\n for (let i = 0; i < count; i++) {\n // Position (12 bytes)\n this.offset += 12;\n // Normal (12 bytes)\n this.offset += 12;\n // UV (8 bytes)\n this.offset += 8;\n\n // Additional UV (使用保存的additionalVec4Count)\n this.offset += this.additionalVec4Count * 16;\n\n // Weight type\n const weightType = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 根据权重类型跳过不同大小的数据\n this.skipVertexWeight(weightType);\n\n // Edge scale (4 bytes)\n this.offset += 4;\n }\n\n return count;\n }\n\n /**\n * 跳过顶点权重数据\n */\n private skipVertexWeight(weightType: number): void {\n switch (weightType) {\n case 0: // BDEF1\n this.offset += this.boneIndexSize;\n break;\n case 1: // BDEF2\n this.offset += this.boneIndexSize * 2 + 4;\n break;\n case 2: // BDEF4\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n case 3: // SDEF\n this.offset += this.boneIndexSize * 2 + 4 + 36;\n break;\n case 4: // QDEF\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n }\n }\n\n /**\n * 跳过面数据(只返回数量)\n */\n private skipFaces(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n this.offset += count * this.vertexIndexSize;\n\n return count / 3; // 返回面数(每个面3个顶点)\n }\n\n /**\n * 解析纹理列表\n */\n private parseTextures(): PMXTexture[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n console.log('[PMXParser] Parsing textures, count:', count);\n\n if (count < 0 || count > 10000) {\n throw new Error('Invalid texture count: ' + (count) + ' at offset ' + (this.offset - 4));\n }\n\n const textures: PMXTexture[] = [];\n\n for (let i = 0; i < count; i++) {\n const path = this.readTextBuffer();\n textures.push({\n index: i,\n path,\n });\n console.log('[PMXParser] Texture ' + (i) + ': ' + (path));\n }\n\n return textures;\n }\n\n /**\n * 解析材质列表\n */\n private parseMaterials(): PMXMaterial[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n const materials: PMXMaterial[] = [];\n\n for (let i = 0; i < count; i++) {\n // 材质名称\n const name = this.readTextBuffer();\n const nameEnglish = this.readTextBuffer();\n\n // 颜色信息\n const diffuse: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const specular: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n const specularStrength = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n const ambient: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n // 绘制标志\n const drawingFlags = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 边缘信息\n const edgeColor: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const edgeSize = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 纹理信息\n const textureIndex = this.readIndex(this.textureIndexSize);\n const sphereTextureIndex = this.readIndex(this.textureIndexSize);\n const sphereMode = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // Toon信息\n const isSharedToon = this.view.getUint8(this.offset) === 1;\n this.offset += 1;\n\n const toonTextureIndex = isSharedToon\n ? this.view.getUint8(this.offset++)\n : this.readIndex(this.textureIndexSize);\n\n // 备注\n const memo = this.readTextBuffer();\n\n // 面数\n const surfaceCount = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n materials.push({\n name,\n nameEnglish,\n diffuse,\n specular,\n specularStrength,\n ambient,\n drawingFlags,\n edgeColor,\n edgeSize,\n textureIndex,\n sphereTextureIndex,\n sphereMode,\n isSharedToon,\n toonTextureIndex,\n memo,\n surfaceCount,\n });\n }\n\n return materials;\n }\n\n /**\n * 生成材质纹理映射\n */\n private generateMaterialTextureMappings(\n materials: PMXMaterial[],\n textures: PMXTexture[]\n ): MaterialTextureMapping[] {\n const sphereModeMap = ['none', 'multiply', 'add', 'subTexture'] as const;\n\n return materials.map((material, index) => {\n const mapping: MaterialTextureMapping = {\n materialIndex: index,\n materialName: material.name,\n materialNameEnglish: material.nameEnglish,\n surfaceCount: material.surfaceCount,\n };\n\n // 主纹理\n if (material.textureIndex >= 0 && material.textureIndex < textures.length) {\n mapping.mainTexture = {\n index: material.textureIndex,\n path: textures[material.textureIndex]!.path,\n };\n }\n\n // Sphere纹理\n if (\n material.sphereTextureIndex >= 0 &&\n material.sphereTextureIndex < textures.length &&\n material.sphereMode > 0\n ) {\n mapping.sphereTexture = {\n index: material.sphereTextureIndex,\n path: textures[material.sphereTextureIndex]!.path,\n mode: sphereModeMap[material.sphereMode] as 'multiply' | 'add' | 'subTexture',\n };\n }\n\n // Toon纹理\n if (material.isSharedToon) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: 'toon' + (String(material.toonTextureIndex).padStart(2, '0')) + '.bmp',\n isShared: true,\n };\n } else if (\n material.toonTextureIndex >= 0 &&\n material.toonTextureIndex < textures.length\n ) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: textures[material.toonTextureIndex]!.path,\n isShared: false,\n };\n }\n\n return mapping;\n });\n }\n\n /**\n * 读取文本缓冲区\n */\n private readTextBuffer(): string {\n const length = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n if (length === 0) return '';\n\n // 添加边界检查\n if (length < 0 || length > 10000000) { // 10MB 限制\n throw new Error('Invalid text buffer length: ' + (length) + ' at offset ' + (this.offset - 4));\n }\n\n if (this.offset + length > this.view.buffer.byteLength) {\n throw new Error('Text buffer extends beyond file boundary: offset=' + (this.offset) + ', length=' + (length) + ', fileSize=' + (this.view.buffer.byteLength));\n }\n\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n\n if (this.textEncoding === 'utf8') {\n return new TextDecoder('utf-8').decode(bytes);\n } else {\n return new TextDecoder('utf-16le').decode(bytes);\n }\n }\n\n /**\n * 读取固定长度字符串\n */\n private readString(length: number): string {\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n return new TextDecoder('ascii').decode(bytes);\n }\n\n /**\n * 读取索引\n */\n private readIndex(size: number): number {\n let value: number;\n\n switch (size) {\n case 1:\n value = this.view.getInt8(this.offset);\n break;\n case 2:\n value = this.view.getInt16(this.offset, true);\n break;\n case 4:\n value = this.view.getInt32(this.offset, true);\n break;\n default:\n throw new Error('Invalid index size: ' + (size));\n }\n\n this.offset += size;\n return value;\n }\n}\n\n","export * from './PMXParser';\n\n\n\n\n\n","/**\n * PMX模型编辑器\n * 支持修改材质、纹理绑定等\n */\n\nimport type {\n PMXParseResult,\n PMXMaterial,\n PMXTexture,\n MaterialTextureMapping,\n} from '../types';\n\nexport interface PMXEditOperation {\n type: 'material' | 'texture' | 'binding';\n action: 'add' | 'update' | 'delete';\n target: number; // 材质或纹理索引\n data?: any;\n}\n\nexport interface PMXEditHistory {\n operation: PMXEditOperation;\n timestamp: number;\n description: string;\n}\n\nexport class PMXEditor {\n private data: PMXParseResult;\n private history: PMXEditHistory[] = [];\n private historyIndex: number = -1;\n private maxHistory: number = 50;\n\n constructor(parseResult: PMXParseResult) {\n this.data = JSON.parse(JSON.stringify(parseResult)); // 深拷贝\n }\n\n /**\n * 获取当前数据\n */\n getData(): PMXParseResult {\n return this.data;\n }\n\n /**\n * 获取编辑历史\n */\n getHistory(): PMXEditHistory[] {\n return this.history.slice(0, this.historyIndex + 1);\n }\n\n /**\n * 是否可以撤销\n */\n canUndo(): boolean {\n return this.historyIndex >= 0;\n }\n\n /**\n * 是否可以重做\n */\n canRedo(): boolean {\n return this.historyIndex < this.history.length - 1;\n }\n\n /**\n * 撤销\n */\n undo(): boolean {\n if (!this.canUndo()) return false;\n // TODO: 实现撤销逻辑\n this.historyIndex--;\n return true;\n }\n\n /**\n * 重做\n */\n redo(): boolean {\n if (!this.canRedo()) return false;\n // TODO: 实现重做逻辑\n this.historyIndex++;\n return true;\n }\n\n /**\n * 添加纹理\n */\n addTexture(path: string): number {\n const newTexture: PMXTexture = {\n index: this.data.textures.length,\n path,\n };\n\n this.data.textures.push(newTexture);\n\n this.recordHistory({\n type: 'texture',\n action: 'add',\n target: newTexture.index,\n data: { path },\n }, '添加纹理: ' + (path));\n\n return newTexture.index;\n }\n\n /**\n * 更新纹理路径\n */\n updateTexture(index: number, newPath: string): boolean {\n if (index < 0 || index >= this.data.textures.length) {\n throw new Error('Invalid texture index: ' + (index));\n }\n\n const oldPath = this.data.textures[index]!.path;\n this.data.textures[index]!.path = newPath;\n\n this.recordHistory({\n type: 'texture',\n action: 'update',\n target: index,\n data: { oldPath, newPath },\n }, '更新纹理 #' + (index) + ': ' + (oldPath) + ' → ' + (newPath));\n\n return true;\n }\n\n /**\n * 删除纹理\n */\n deleteTexture(index: number): boolean {\n if (index < 0 || index >= this.data.textures.length) {\n throw new Error('Invalid texture index: ' + (index));\n }\n\n // 检查是否有材质使用此纹理\n const usedByMaterials = this.data.materials.filter(\n m => m.textureIndex === index ||\n m.sphereTextureIndex === index ||\n (!m.isSharedToon && m.toonTextureIndex === index)\n );\n\n if (usedByMaterials.length > 0) {\n throw new Error('纹理 #' + (index) + ' 正在被 ' + (usedByMaterials.length) + ' 个材质使用,无法删除');\n }\n\n const deletedTexture = this.data.textures.splice(index, 1)[0];\n if (!deletedTexture) return false;\n\n // 更新后续纹理的索引\n this.data.textures.forEach((tex, i) => {\n tex.index = i;\n });\n\n // 更新材质中大于此索引的纹理引用\n this.data.materials.forEach(material => {\n if (material.textureIndex > index) material.textureIndex--;\n if (material.sphereTextureIndex > index) material.sphereTextureIndex--;\n if (!material.isSharedToon && material.toonTextureIndex > index) {\n material.toonTextureIndex--;\n }\n });\n\n // 重新生成映射\n this.regenerateMappings();\n\n this.recordHistory({\n type: 'texture',\n action: 'delete',\n target: index,\n data: { path: deletedTexture.path },\n }, '删除纹理 #' + (index) + ': ' + (deletedTexture.path));\n\n return true;\n }\n\n /**\n * 更新材质的主纹理绑定\n */\n setMaterialMainTexture(materialIndex: number, textureIndex: number): boolean {\n if (materialIndex < 0 || materialIndex >= this.data.materials.length) {\n throw new Error('Invalid material index: ' + (materialIndex));\n }\n\n if (textureIndex !== -1 && (textureIndex < 0 || textureIndex >= this.data.textures.length)) {\n throw new Error('Invalid texture index: ' + (textureIndex));\n }\n\n const material = this.data.materials[materialIndex]!;\n const oldIndex = material.textureIndex;\n material.textureIndex = textureIndex;\n\n // 重新生成映射\n this.regenerateMappings();\n\n this.recordHistory({\n type: 'binding',\n action: 'update',\n target: materialIndex,\n data: {\n bindingType: 'main',\n oldIndex,\n newIndex: textureIndex\n },\n }, '材质 #' + (materialIndex) + ' 主纹理: #' + (oldIndex) + ' → #' + (textureIndex));\n\n return true;\n }\n\n /**\n * 更新材质的Sphere纹理绑定\n */\n setMaterialSphereTexture(\n materialIndex: number,\n textureIndex: number,\n mode: number = 1\n ): boolean {\n if (materialIndex < 0 || materialIndex >= this.data.materials.length) {\n throw new Error('Invalid material index: ' + (materialIndex));\n }\n\n if (textureIndex !== -1 && (textureIndex < 0 || textureIndex >= this.data.textures.length)) {\n throw new Error('Invalid texture index: ' + (textureIndex));\n }\n\n const material = this.data.materials[materialIndex]!;\n const oldIndex = material.sphereTextureIndex;\n const oldMode = material.sphereMode;\n\n material.sphereTextureIndex = textureIndex;\n material.sphereMode = textureIndex === -1 ? 0 : mode;\n\n // 重新生成映射\n this.regenerateMappings();\n\n this.recordHistory({\n type: 'binding',\n action: 'update',\n target: materialIndex,\n data: {\n bindingType: 'sphere',\n oldIndex,\n newIndex: textureIndex,\n oldMode,\n newMode: mode\n },\n }, '材质 #' + (materialIndex) + ' Sphere纹理: #' + (oldIndex) + ' → #' + (textureIndex) + ' (模式: ' + (mode) + ')');\n\n return true;\n }\n\n /**\n * 更新材质的Toon纹理绑定\n */\n setMaterialToonTexture(\n materialIndex: number,\n textureIndex: number,\n isShared: boolean = false\n ): boolean {\n if (materialIndex < 0 || materialIndex >= this.data.materials.length) {\n throw new Error('Invalid material index: ' + (materialIndex));\n }\n\n if (!isShared && textureIndex !== -1 &&\n (textureIndex < 0 || textureIndex >= this.data.textures.length)) {\n throw new Error('Invalid texture index: ' + (textureIndex));\n }\n\n const material = this.data.materials[materialIndex]!;\n const oldIndex = material.toonTextureIndex;\n const oldShared = material.isSharedToon;\n\n material.toonTextureIndex = textureIndex;\n material.isSharedToon = isShared;\n\n // 重新生成映射\n this.regenerateMappings();\n\n this.recordHistory({\n type: 'binding',\n action: 'update',\n target: materialIndex,\n data: {\n bindingType: 'toon',\n oldIndex,\n newIndex: textureIndex,\n oldShared,\n isShared\n },\n }, '材质 #' + (materialIndex) + ' Toon纹理: #' + (oldIndex) + ' → #' + (textureIndex) + ' (共享: ' + (isShared) + ')');\n\n return true;\n }\n\n /**\n * 更新材质属性\n */\n updateMaterial(materialIndex: number, updates: Partial<PMXMaterial>): boolean {\n if (materialIndex < 0 || materialIndex >= this.data.materials.length) {\n throw new Error('Invalid material index: ' + (materialIndex));\n }\n\n const material = this.data.materials[materialIndex]!;\n const oldData = { ...material };\n\n // 手动合并属性,避免 TS 类型问题\n if (updates.name !== undefined) material.name = updates.name;\n if (updates.nameEnglish !== undefined) material.nameEnglish = updates.nameEnglish;\n if (updates.diffuse !== undefined) material.diffuse = updates.diffuse;\n if (updates.specular !== undefined) material.specular = updates.specular;\n if (updates.specularStrength !== undefined) material.specularStrength = updates.specularStrength;\n if (updates.ambient !== undefined) material.ambient = updates.ambient;\n if (updates.drawingFlags !== undefined) material.drawingFlags = updates.drawingFlags;\n if (updates.edgeColor !== undefined) material.edgeColor = updates.edgeColor;\n if (updates.edgeSize !== undefined) material.edgeSize = updates.edgeSize;\n if (updates.textureIndex !== undefined) material.textureIndex = updates.textureIndex;\n if (updates.sphereTextureIndex !== undefined) material.sphereTextureIndex = updates.sphereTextureIndex;\n if (updates.sphereMode !== undefined) material.sphereMode = updates.sphereMode;\n if (updates.isSharedToon !== undefined) material.isSharedToon = updates.isSharedToon;\n if (updates.toonTextureIndex !== undefined) material.toonTextureIndex = updates.toonTextureIndex;\n if (updates.memo !== undefined) material.memo = updates.memo;\n if (updates.surfaceCount !== undefined) material.surfaceCount = updates.surfaceCount;\n\n // 重新生成映射\n this.regenerateMappings();\n\n this.recordHistory({\n type: 'material',\n action: 'update',\n target: materialIndex,\n data: { oldData, updates },\n }, '更新材质 #' + (materialIndex) + ': ' + (material.name));\n\n return true;\n }\n\n /**\n * 重新生成材质纹理映射\n */\n private regenerateMappings(): void {\n const sphereModeMap = ['none', 'multiply', 'add', 'subTexture'] as const;\n\n this.data.materialTextureMappings = this.data.materials.map((material, index) => {\n const mapping: MaterialTextureMapping = {\n materialIndex: index,\n materialName: material.name,\n materialNameEnglish: material.nameEnglish,\n surfaceCount: material.surfaceCount,\n };\n\n // 主纹理\n if (material.textureIndex >= 0 && material.textureIndex < this.data.textures.length) {\n mapping.mainTexture = {\n index: material.textureIndex,\n path: this.data.textures[material.textureIndex]!.path,\n };\n }\n\n // Sphere纹理\n if (\n material.sphereTextureIndex >= 0 &&\n material.sphereTextureIndex < this.data.textures.length &&\n material.sphereMode > 0\n ) {\n mapping.sphereTexture = {\n index: material.sphereTextureIndex,\n path: this.data.textures[material.sphereTextureIndex]!.path,\n mode: sphereModeMap[material.sphereMode] as 'multiply' | 'add' | 'subTexture',\n };\n }\n\n // Toon纹理\n if (material.isSharedToon) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: 'toon' + (String(material.toonTextureIndex).padStart(2, '0')) + '.bmp',\n isShared: true,\n };\n } else if (\n material.toonTextureIndex >= 0 &&\n material.toonTextureIndex < this.data.textures.length\n ) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: this.data.textures[material.toonTextureIndex]!.path,\n isShared: false,\n };\n }\n\n return mapping;\n });\n }\n\n /**\n * 记录历史\n */\n private recordHistory(operation: PMXEditOperation, description: string): void {\n // 如果当前不在历史末尾,删除后面的历史\n if (this.historyIndex < this.history.length - 1) {\n this.history = this.history.slice(0, this.historyIndex + 1);\n }\n\n // 添加新历史\n this.history.push({\n operation,\n timestamp: Date.now(),\n description,\n });\n\n // 限制历史长度\n if (this.history.length > this.maxHistory) {\n this.history.shift();\n } else {\n this.historyIndex++;\n }\n }\n\n /**\n * 获取统计信息\n */\n getStats() {\n return {\n textures: this.data.textures.length,\n materials: this.data.materials.length,\n vertices: this.data.vertexCount,\n faces: this.data.faceCount,\n unusedTextures: this.getUnusedTextures().length,\n editHistory: this.history.length,\n };\n }\n\n /**\n * 获取未使用的纹理\n */\n getUnusedTextures(): PMXTexture[] {\n const usedIndices = new Set<number>();\n\n this.data.materials.forEach(material => {\n if (material.textureIndex >= 0) usedIndices.add(material.textureIndex);\n if (material.sphereTextureIndex >= 0) usedIndices.add(material.sphereTextureIndex);\n if (!material.isSharedToon && material.toonTextureIndex >= 0) {\n usedIndices.add(material.toonTextureIndex);\n }\n });\n\n return this.data.textures.filter(tex => !usedIndices.has(tex.index));\n }\n}\n\n","/**\n * PMX模型导出器\n * 将编辑后的PMX数据导出为二进制文件\n */\n\nimport type { PMXParseResult } from '../types';\n\nexport class PMXExporter {\n private data: PMXParseResult;\n private buffer: ArrayBuffer;\n private view: DataView;\n private offset: number = 0;\n\n constructor(data: PMXParseResult) {\n this.data = data;\n // 预分配缓冲区(估算大小)\n const estimatedSize = this.estimateSize();\n this.buffer = new ArrayBuffer(estimatedSize);\n this.view = new DataView(this.buffer);\n }\n\n /**\n * 导出为ArrayBuffer\n */\n export(): ArrayBuffer {\n this.offset = 0;\n \n // 1. 写入头部\n this.writeHeader();\n \n // 2. 写入模型信息\n this.writeModelInfo();\n \n // 3. 写入顶点(注:我们没有完整的顶点数据,这里写入占位符)\n this.writeVertexPlaceholder();\n \n // 4. 写入面(注:我们没有完整的面数据,这里写入占位符)\n this.writeFacePlaceholder();\n \n // 5. 写入纹理列表\n this.writeTextures();\n \n // 6. 写入材质\n this.writeMaterials();\n \n // 返回实际使用的缓冲区\n return this.buffer.slice(0, this.offset);\n }\n\n /**\n * 导出为Blob\n */\n exportAsBlob(): Blob {\n const arrayBuffer = this.export();\n return new Blob([arrayBuffer], { type: 'application/octet-stream' });\n }\n\n /**\n * 导出并下载\n */\n exportAndDownload(filename: string = 'model.pmx'): void {\n const blob = this.exportAsBlob();\n const url = URL.createObjectURL(blob);\n \n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n \n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n /**\n * 估算文件大小\n */\n private estimateSize(): number {\n let size = 0;\n \n // Header\n size += 100;\n \n // Model Info\n size += 1000;\n \n // Vertices (placeholder)\n size += 100;\n \n // Faces (placeholder)\n size += 100;\n \n // Textures\n this.data.textures.forEach(tex => {\n size += 4 + tex.path.length * 2; // UTF-16\n });\n \n // Materials\n size += this.data.materials.length * 200;\n \n // 额外空间\n size += 10000;\n \n return size;\n }\n\n /**\n * 写入头部\n */\n private writeHeader(): void {\n const { header } = this.data;\n \n // 签名 \"PMX \"\n this.writeString('PMX ', 4);\n \n // 版本号\n this.view.setFloat32(this.offset, header.version, true);\n this.offset += 4;\n \n // 全局设置数量\n this.view.setUint8(this.offset, 8);\n this.offset += 1;\n \n // 全局设置\n this.view.setUint8(this.offset, header.globals.encoding);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.additionalVec4Count);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.vertexIndexSize);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.textureIndexSize);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.materialIndexSize);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.boneIndexSize);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.morphIndexSize);\n this.offset += 1;\n \n this.view.setUint8(this.offset, header.globals.rigidBodyIndexSize);\n this.offset += 1;\n }\n\n /**\n * 写入模型信息\n */\n private writeModelInfo(): void {\n const { modelInfo } = this.data;\n const encoding = this.data.header.globals.encoding === 0 ? 'utf16le' : 'utf8';\n \n this.writeTextBuffer(modelInfo.modelName, encoding);\n this.writeTextBuffer(modelInfo.modelNameEnglish, encoding);\n this.writeTextBuffer(modelInfo.comment, encoding);\n this.writeTextBuffer(modelInfo.commentEnglish, encoding);\n }\n\n /**\n * 写入顶点占位符\n */\n private writeVertexPlaceholder(): void {\n // 警告:这里只写入数量,实际顶点数据被忽略\n // 完整实现需要保存原始顶点数据\n this.view.setInt32(this.offset, 0, true); // 0个顶点\n this.offset += 4;\n \n console.warn('[PMXExporter] 顶点数据未导出(解析器未保存完整顶点数据)');\n }\n\n /**\n * 写入面占位符\n */\n private writeFacePlaceholder(): void {\n // 警告:这里只写入数量,实际面数据被忽略\n this.view.setInt32(this.offset, 0, true); // 0个面索引\n this.offset += 4;\n \n console.warn('[PMXExporter] 面数据未导出(解析器未保存完整面数据)');\n }\n\n /**\n * 写入纹理列表\n */\n private writeTextures(): void {\n const encoding = this.data.header.globals.encoding === 0 ? 'utf16le' : 'utf8';\n \n this.view.setInt32(this.offset, this.data.textures.length, true);\n this.offset += 4;\n \n this.data.textures.forEach(texture => {\n this.writeTextBuffer(texture.path, encoding);\n });\n }\n\n /**\n * 写入材质\n */\n private writeMaterials(): void {\n const encoding = this.data.header.globals.encoding === 0 ? 'utf16le' : 'utf8';\n const textureIndexSize = this.data.header.globals.textureIndexSize;\n \n this.view.setInt32(this.offset, this.data.materials.length, true);\n this.offset += 4;\n \n this.data.materials.forEach(material => {\n // 材质名称\n this.writeTextBuffer(material.name, encoding);\n this.writeTextBuffer(material.nameEnglish, encoding);\n \n // 颜色信息\n this.view.setFloat32(this.offset, material.diffuse[0], true);\n this.view.setFloat32(this.offset + 4, material.diffuse[1], true);\n this.view.setFloat32(this.offset + 8, material.diffuse[2], true);\n this.view.setFloat32(this.offset + 12, material.diffuse[3], true);\n this.offset += 16;\n \n this.view.setFloat32(this.offset, material.specular[0], true);\n this.view.setFloat32(this.offset + 4, material.specular[1], true);\n this.view.setFloat32(this.offset + 8, material.specular[2], true);\n this.offset += 12;\n \n this.view.setFloat32(this.offset, material.specularStrength, true);\n this.offset += 4;\n \n this.view.setFloat32(this.offset, material.ambient[0], true);\n this.view.setFloat32(this.offset + 4, material.ambient[1], true);\n this.view.setFloat32(this.offset + 8, material.ambient[2], true);\n this.offset += 12;\n \n // 绘制标志\n this.view.setUint8(this.offset, material.drawingFlags);\n this.offset += 1;\n \n // 边缘信息\n this.view.setFloat32(this.offset, material.edgeColor[0], true);\n this.view.setFloat32(this.offset + 4, material.edgeColor[1], true);\n this.view.setFloat32(this.offset + 8, material.edgeColor[2], true);\n this.view.setFloat32(this.offset + 12, material.edgeColor[3], true);\n this.offset += 16;\n \n this.view.setFloat32(this.offset, material.edgeSize, true);\n this.offset += 4;\n \n // 纹理信息\n this.writeIndex(material.textureIndex, textureIndexSize);\n this.writeIndex(material.sphereTextureIndex, textureIndexSize);\n \n this.view.setUint8(this.offset, material.sphereMode);\n this.offset += 1;\n \n // Toon信息\n this.view.setUint8(this.offset, material.isSharedToon ? 1 : 0);\n this.offset += 1;\n \n if (material.isSharedToon) {\n this.view.setUint8(this.offset, material.toonTextureIndex);\n this.offset += 1;\n } else {\n this.writeIndex(material.toonTextureIndex, textureIndexSize);\n }\n \n // 备注\n this.writeTextBuffer(material.memo, encoding);\n \n // 面数\n this.view.setInt32(this.offset, material.surfaceCount, true);\n this.offset += 4;\n });\n }\n\n /**\n * 写入文本缓冲区\n */\n private writeTextBuffer(text: string, encoding: 'utf16le' | 'utf8'): void {\n if (!text) {\n this.view.setInt32(this.offset, 0, true);\n this.offset += 4;\n return;\n }\n \n const encoder = new TextEncoder();\n let bytes: Uint8Array;\n \n if (encoding === 'utf8') {\n bytes = encoder.encode(text);\n } else {\n // UTF-16LE encoding\n bytes = new Uint8Array(text.length * 2);\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n bytes[i * 2] = code & 0xFF;\n bytes[i * 2 + 1] = (code >> 8) & 0xFF;\n }\n }\n \n this.view.setInt32(this.offset, bytes.length, true);\n this.offset += 4;\n \n new Uint8Array(this.buffer, this.offset, bytes.length).set(bytes);\n this.offset += bytes.length;\n }\n\n /**\n * 写入固定长度字符串\n */\n private writeString(str: string, length: number): void {\n const bytes = new TextEncoder().encode(str);\n new Uint8Array(this.buffer, this.offset, Math.min(bytes.length, length)).set(bytes);\n this.offset += length;\n }\n\n /**\n * 写入索引\n */\n private writeIndex(value: number, size: number): void {\n switch (size) {\n case 1:\n this.view.setInt8(this.offset, value);\n break;\n case 2:\n this.view.setInt16(this.offset, value, true);\n break;\n case 4:\n this.view.setInt32(this.offset, value, true);\n break;\n default:\n throw new Error('Invalid index size: ' + (size));\n }\n this.offset += size;\n }\n}\n\n\n\n\n\n","/**\n * PMX模型编辑器组件\n * 提供可视化的材质纹理绑定编辑功能\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { PMXParser } from '../parser/PMXParser';\nimport { PMXEditor as PMXEditorCore } from '../editor/PMXEditor';\nimport { PMXExporter } from '../editor/PMXExporter';\nimport type { PMXParseResult, PMXMaterial, PMXTexture, MaterialTextureMapping } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface PMXEditorProps {\n /** PMX模型文件URL */\n modelUrl: string;\n /** 基础路径(用于拼接纹理URL) */\n basePath?: string;\n /** 自定义样式类名 */\n className?: string;\n /** 解析完成回调 */\n onParsed?: (result: PMXParseResult) => void;\n /** 错误回调 */\n onError?: (error: Error) => void;\n}\n\nexport const PMXEditor: React.FC<PMXEditorProps> = ({\n modelUrl,\n basePath,\n className = '',\n onParsed,\n onError,\n}) => {\n const [editor, setEditor] = useState<PMXEditorCore | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<'materials' | 'textures' | 'history'>('materials');\n const [selectedMaterial, setSelectedMaterial] = useState<number | null>(null);\n const [selectedTexture, setSelectedTexture] = useState<number | null>(null);\n const [refresh, setRefresh] = useState(0);\n\n useEffect(() => {\n const init = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const parser = new PMXParser();\n const parseResult = await parser.loadAndParse(modelUrl);\n\n const editorInstance = new PMXEditorCore(parseResult);\n setEditor(editorInstance);\n onParsed?.(parseResult);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '初始化失败';\n setError(errorMsg);\n onError?.(err instanceof Error ? err : new Error(errorMsg));\n } finally {\n setLoading(false);\n }\n };\n\n init();\n }, [modelUrl, onParsed, onError]);\n\n const handleExport = () => {\n if (!editor) return;\n\n const data = editor.getData();\n const exporter = new PMXExporter(data);\n exporter.exportAndDownload((data.modelInfo.modelName || 'model') + '_edited.pmx');\n };\n\n const handleMaterialTextureChange = (\n materialIndex: number,\n textureType: 'main' | 'sphere' | 'toon',\n textureIndex: number\n ) => {\n if (!editor) return;\n\n try {\n switch (textureType) {\n case 'main':\n editor.setMaterialMainTexture(materialIndex, textureIndex);\n break;\n case 'sphere':\n editor.setMaterialSphereTexture(materialIndex, textureIndex);\n break;\n case 'toon':\n editor.setMaterialToonTexture(materialIndex, textureIndex, false);\n break;\n }\n setRefresh(r => r + 1);\n } catch (err) {\n alert(err instanceof Error ? err.message : '操作失败');\n }\n };\n\n const handleAddTexture = () => {\n if (!editor) return;\n\n const path = prompt('请输入纹理路径:');\n if (!path) return;\n\n try {\n const index = editor.addTexture(path);\n setRefresh(r => r + 1);\n alert('成功添加纹理 #' + (index) + ': ' + (path));\n } catch (err) {\n alert(err instanceof Error ? err.message : '添加失败');\n }\n };\n\n const handleDeleteTexture = (index: number) => {\n if (!editor) return;\n\n if (!confirm('确定要删除纹理 #' + (index) + ' 吗?')) return;\n\n try {\n editor.deleteTexture(index);\n setRefresh(r => r + 1);\n alert('删除成功');\n } catch (err) {\n alert(err instanceof Error ? err.message : '删除失败');\n }\n };\n\n if (loading) {\n return (\n <div className={clsx('pmx-editor loading', className)}>\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-blue-500 border-r-transparent\"></div>\n <p className=\"mt-4 text-gray-600\">正在加载模型...</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !editor) {\n return (\n <div className={clsx('pmx-editor error', className)}>\n <div className=\"rounded-lg bg-red-50 p-6 border border-red-200\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">❌ 加载错误</h3>\n <p className=\"text-red-600\">{error || '未知错误'}</p>\n </div>\n </div>\n );\n }\n\n const data = editor.getData();\n const stats = editor.getStats();\n const history = editor.getHistory();\n const unusedTextures = editor.getUnusedTextures();\n\n return (\n <div className={clsx('pmx-editor', className)}>\n {/* 顶部工具栏 */}\n <div className=\"bg-white border-b border-gray-200 p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold text-gray-900\">{data.modelInfo.modelName}</h2>\n <p className=\"text-sm text-gray-600\">\n {stats.materials} 材质 | {stats.textures} 纹理 | {stats.editHistory} 次编辑\n </p>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={handleExport}\n className=\"px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors\"\n >\n 💾 导出PMX\n </button>\n {stats.unusedTextures > 0 && (\n <span className=\"px-3 py-2 bg-yellow-100 text-yellow-800 rounded-lg text-sm\">\n ⚠️ {stats.unusedTextures} 个未使用纹理\n </span>\n )}\n </div>\n </div>\n </div>\n\n {/* 标签页导航 */}\n <div className=\"border-b border-gray-200\">\n <nav className=\"flex space-x-4 px-4\">\n {[\n { id: 'materials', label: '🎨 材质编辑' },\n { id: 'textures', label: '🖼️ 纹理管理' },\n { id: 'history', label: '📜 编辑历史' },\n ].map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id as any)}\n className={clsx('py-3 px-4 font-medium transition-colors', activeTab === tab.id\n ? 'border-b-2 border-blue-500 text-blue-600'\n : 'text-gray-600 hover:text-gray-900')}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n </div>\n\n <div className=\"p-6\">\n {/* 材质编辑标签 */}\n {activeTab === 'materials' && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* 材质列表 */}\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">材质列表 ({data.materials.length})</h3>\n </div>\n <div className=\"divide-y divide-gray-200 max-h-[600px] overflow-y-auto\">\n {data.materialTextureMappings.map((mapping) => (\n <div\n key={mapping.materialIndex}\n onClick={() => setSelectedMaterial(mapping.materialIndex)}\n className={clsx('p-4 cursor-pointer hover:bg-gray-50', selectedMaterial === mapping.materialIndex ? 'bg-blue-50' : '')}\n >\n <div className=\"flex items-center gap-3\">\n <div\n className=\"w-10 h-10 rounded border\"\n style={{\n backgroundColor: 'rgba(' + (data.materials[mapping.materialIndex]?.diffuse[0]! * 255) + ', ' + (data.materials[mapping.materialIndex]?.diffuse[1]! * 255) + ', ' + (data.materials[mapping.materialIndex]?.diffuse[2]! * 255) + ', 1)',\n }}\n />\n <div className=\"flex-1\">\n <p className=\"font-medium\">#{mapping.materialIndex}: {mapping.materialName}</p>\n <p className=\"text-xs text-gray-500\">\n {mapping.mainTexture && '🖼️ '}\n {mapping.sphereTexture && '✨ '}\n {mapping.toonTexture && '🎨 '}\n {!mapping.mainTexture && !mapping.sphereTexture && !mapping.toonTexture && '⚪ 无纹理'}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* 材质详情/编辑器 */}\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">\n {selectedMaterial !== null ? '编辑材质 #' + (selectedMaterial) : '请选择材质'}\n </h3>\n </div>\n {selectedMaterial !== null && (\n <div className=\"p-4 space-y-4\">\n {/* 主纹理 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 🖼️ 主纹理\n </label>\n <select\n value={data.materials[selectedMaterial]!.textureIndex}\n onChange={(e) => handleMaterialTextureChange(selectedMaterial, 'main', parseInt(e.target.value))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n >\n <option value={-1}>(无)</option>\n {data.textures.map((tex) => (\n <option key={tex.index} value={tex.index}>\n #{tex.index}: {tex.path}\n </option>\n ))}\n </select>\n {data.materialTextureMappings[selectedMaterial]?.mainTexture && (\n <p className=\"mt-1 text-xs text-gray-500\">\n 当前: {data.materialTextureMappings[selectedMaterial]!.mainTexture!.path}\n </p>\n )}\n </div>\n\n {/* Sphere纹理 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n ✨ Sphere纹理\n </label>\n <select\n value={data.materials[selectedMaterial]!.sphereTextureIndex}\n onChange={(e) => handleMaterialTextureChange(selectedMaterial, 'sphere', parseInt(e.target.value))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n >\n <option value={-1}>(无)</option>\n {data.textures.map((tex) => (\n <option key={tex.index} value={tex.index}>\n #{tex.index}: {tex.path}\n </option>\n ))}\n </select>\n </div>\n\n {/* Toon纹理 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 🎨 Toon纹理\n </label>\n <select\n value={data.materials[selectedMaterial]!.toonTextureIndex}\n onChange={(e) => handleMaterialTextureChange(selectedMaterial, 'toon', parseInt(e.target.value))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n disabled={data.materials[selectedMaterial]!.isSharedToon}\n >\n <option value={-1}>(无)</option>\n {data.textures.map((tex) => (\n <option key={tex.index} value={tex.index}>\n #{tex.index}: {tex.path}\n </option>\n ))}\n </select>\n {data.materials[selectedMaterial]!.isSharedToon && (\n <p className=\"mt-1 text-xs text-yellow-600\">\n 此材质使用共享Toon纹理\n </p>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* 纹理管理标签 */}\n {activeTab === 'textures' && (\n <div>\n <div className=\"mb-4 flex justify-between items-center\">\n <h3 className=\"text-lg font-semibold\">纹理管理</h3>\n <button\n onClick={handleAddTexture}\n className=\"px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600\"\n >\n ➕ 添加纹理\n </button>\n </div>\n\n {unusedTextures.length > 0 && (\n <div className=\"mb-4 p-4 bg-yellow-50 border border-yellow-200 rounded-lg\">\n <p className=\"text-sm font-medium text-yellow-800\">\n ⚠️ 发现 {unusedTextures.length} 个未使用的纹理\n </p>\n </div>\n )}\n\n <div className=\"bg-white rounded-lg shadow divide-y\">\n {data.textures.map((texture) => {\n const isUnused = unusedTextures.some(t => t.index === texture.index);\n return (\n <div key={texture.index} className=\"p-4 hover:bg-gray-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1\">\n <p className=\"font-medium\">\n #{texture.index}: {texture.path}\n {isUnused && (\n <span className=\"ml-2 text-xs bg-yellow-100 text-yellow-700 px-2 py-1 rounded\">\n 未使用\n </span>\n )}\n </p>\n </div>\n <div className=\"flex gap-2\">\n {isUnused && (\n <button\n onClick={() => handleDeleteTexture(texture.index)}\n className=\"px-3 py-1 bg-red-500 text-white rounded hover:bg-red-600 text-sm\"\n >\n 删除\n </button>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* 编辑历史标签 */}\n {activeTab === 'history' && (\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">编辑历史 ({history.length})</h3>\n </div>\n <div className=\"divide-y max-h-[600px] overflow-y-auto\">\n {history.length === 0 ? (\n <div className=\"p-8 text-center text-gray-500\">\n 暂无编辑记录\n </div>\n ) : (\n history.map((item, index) => (\n <div key={index} className=\"p-4\">\n <div className=\"flex justify-between items-start\">\n <div>\n <p className=\"font-medium\">{item.description}</p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {new Date(item.timestamp).toLocaleString()}\n </p>\n </div>\n <span className=\"text-xs bg-gray-100 px-2 py-1 rounded\">\n {item.operation.type} · {item.operation.action}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n","/**\n * PMX模型信息查看器组件\n * 用于可视化展示PMX模型的纹理映射关系\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { PMXParser } from '../parser/PMXParser';\nimport type { PMXParseResult, MaterialTextureMapping } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface PMXViewerProps {\n /** PMX模型文件URL */\n modelUrl: string;\n /** 基础路径(用于拼接纹理URL) */\n basePath?: string;\n /** 自定义样式类名 */\n className?: string;\n /** 解析完成回调 */\n onParsed?: (result: PMXParseResult) => void;\n /** 错误回调 */\n onError?: (error: Error) => void;\n}\n\nexport const PMXViewer: React.FC<PMXViewerProps> = ({\n modelUrl,\n basePath,\n className = '',\n onParsed,\n onError,\n}) => {\n const [result, setResult] = useState<PMXParseResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<'overview' | 'textures' | 'materials' | 'mappings'>('overview');\n\n useEffect(() => {\n const parse = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const parser = new PMXParser();\n const parseResult = await parser.loadAndParse(modelUrl);\n \n setResult(parseResult);\n onParsed?.(parseResult);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '解析失败';\n setError(errorMsg);\n onError?.(err instanceof Error ? err : new Error(errorMsg));\n } finally {\n setLoading(false);\n }\n };\n\n parse();\n }, [modelUrl, onParsed, onError]);\n\n const getTextureUrl = (path: string): string => {\n if (!basePath) return path;\n // 处理路径分隔符\n const normalizedPath = path.replace(/\\\\/g, '/');\n return (basePath) + '/' + (normalizedPath);\n };\n\n if (loading) {\n return (\n <div className={clsx('pmx-viewer loading', className)}>\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-blue-500 border-r-transparent\"></div>\n <p className=\"mt-4 text-gray-600\">正在解析PMX模型...</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !result) {\n return (\n <div className={clsx('pmx-viewer error', className)}>\n <div className=\"rounded-lg bg-red-50 p-6 border border-red-200\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">❌ 解析错误</h3>\n <p className=\"text-red-600\">{error || '未知错误'}</p>\n </div>\n </div>\n );\n }\n\n const { header, modelInfo, textures, materials, materialTextureMappings, vertexCount, faceCount } = result;\n\n return (\n <div className={clsx('pmx-viewer', className)}>\n {/* 标签页导航 */}\n <div className=\"border-b border-gray-200 mb-6\">\n <nav className=\"flex space-x-4\">\n {[\n { id: 'overview', label: '📊 概览' },\n { id: 'textures', label: '🖼️ 纹理列表' },\n { id: 'materials', label: '🎨 材质列表' },\n { id: 'mappings', label: '🔗 映射关系' },\n ].map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id as any)}\n className={clsx('py-2 px-4 font-medium transition-colors', activeTab === tab.id\n ? 'border-b-2 border-blue-500 text-blue-600'\n : 'text-gray-600 hover:text-gray-900')}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n </div>\n\n {/* 概览标签 */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n <div className=\"bg-white rounded-lg shadow p-6\">\n <h3 className=\"text-xl font-bold mb-4\">模型信息</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-gray-600\">模型名称</p>\n <p className=\"font-medium\">{modelInfo.modelName || '未命名'}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-600\">英文名称</p>\n <p className=\"font-medium\">{modelInfo.modelNameEnglish || '-'}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-600\">PMX版本</p>\n <p className=\"font-medium\">{header.version}</p>\n </div>\n <div>\n <p className=\"text-sm text-gray-600\">编码格式</p>\n <p className=\"font-medium\">\n {header.globals.encoding === 0 ? 'UTF-16LE' : 'UTF-8'}\n </p>\n </div>\n </div>\n {modelInfo.comment && (\n <div className=\"mt-4\">\n <p className=\"text-sm text-gray-600\">注释</p>\n <p className=\"text-sm mt-1 whitespace-pre-wrap\">{modelInfo.comment}</p>\n </div>\n )}\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <p className=\"text-sm text-blue-600 mb-1\">顶点数</p>\n <p className=\"text-2xl font-bold text-blue-900\">{vertexCount.toLocaleString()}</p>\n </div>\n <div className=\"bg-green-50 rounded-lg p-4\">\n <p className=\"text-sm text-green-600 mb-1\">面数</p>\n <p className=\"text-2xl font-bold text-green-900\">{faceCount.toLocaleString()}</p>\n </div>\n <div className=\"bg-purple-50 rounded-lg p-4\">\n <p className=\"text-sm text-purple-600 mb-1\">纹理数</p>\n <p className=\"text-2xl font-bold text-purple-900\">{textures.length}</p>\n </div>\n <div className=\"bg-orange-50 rounded-lg p-4\">\n <p className=\"text-sm text-orange-600 mb-1\">材质数</p>\n <p className=\"text-2xl font-bold text-orange-900\">{materials.length}</p>\n </div>\n </div>\n </div>\n )}\n\n {/* 纹理列表标签 */}\n {activeTab === 'textures' && (\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">纹理列表 ({textures.length})</h3>\n </div>\n <div className=\"divide-y divide-gray-200\">\n {textures.map((texture) => (\n <div key={texture.index} className=\"p-4 hover:bg-gray-50\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex-shrink-0 w-12 h-12 bg-gray-200 rounded flex items-center justify-center text-gray-500 text-xs\">\n #{texture.index}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-900 truncate\">{texture.path}</p>\n <p className=\"text-sm text-gray-500 mt-1\">完整URL:</p>\n <code className=\"text-xs bg-gray-100 px-2 py-1 rounded block mt-1 overflow-x-auto\">\n {getTextureUrl(texture.path)}\n </code>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 材质列表标签 */}\n {activeTab === 'materials' && (\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">材质列表 ({materials.length})</h3>\n </div>\n <div className=\"divide-y divide-gray-200\">\n {materials.map((material, index) => (\n <div key={index} className=\"p-4 hover:bg-gray-50\">\n <div className=\"flex items-start gap-4\">\n <div\n className=\"flex-shrink-0 w-12 h-12 rounded border border-gray-300\"\n style={{\n backgroundColor: 'rgba(' + (material.diffuse[0] * 255) + ', ' + (material.diffuse[1] * 255) + ', ' + (material.diffuse[2] * 255) + ', ' + (material.diffuse[3]) + ')',\n }}\n />\n <div className=\"flex-1\">\n <p className=\"font-medium text-gray-900\">{material.name || '材质 #' + (index)}</p>\n {material.nameEnglish && (\n <p className=\"text-sm text-gray-600\">{material.nameEnglish}</p>\n )}\n <div className=\"mt-2 flex flex-wrap gap-2 text-xs\">\n <span className=\"bg-blue-100 text-blue-700 px-2 py-1 rounded\">\n 面数: {material.surfaceCount / 3}\n </span>\n {material.textureIndex >= 0 && (\n <span className=\"bg-green-100 text-green-700 px-2 py-1 rounded\">\n 纹理: #{material.textureIndex}\n </span>\n )}\n {material.sphereTextureIndex >= 0 && (\n <span className=\"bg-purple-100 text-purple-700 px-2 py-1 rounded\">\n Sphere: #{material.sphereTextureIndex}\n </span>\n )}\n {material.toonTextureIndex >= 0 && (\n <span className=\"bg-orange-100 text-orange-700 px-2 py-1 rounded\">\n Toon: {material.isSharedToon ? '共享#' + (material.toonTextureIndex) : '#' + (material.toonTextureIndex)}\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 映射关系标签 */}\n {activeTab === 'mappings' && (\n <div className=\"bg-white rounded-lg shadow\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold\">材质-纹理映射关系 ({materialTextureMappings.length})</h3>\n </div>\n <div className=\"divide-y divide-gray-200\">\n {materialTextureMappings.map((mapping) => (\n <div key={mapping.materialIndex} className=\"p-4 hover:bg-gray-50\">\n <div className=\"mb-3\">\n <h4 className=\"font-semibold text-gray-900\">\n 材质 #{mapping.materialIndex}: {mapping.materialName}\n </h4>\n {mapping.materialNameEnglish && (\n <p className=\"text-sm text-gray-600\">{mapping.materialNameEnglish}</p>\n )}\n </div>\n \n <div className=\"space-y-3 pl-4 border-l-2 border-gray-200\">\n {mapping.mainTexture && (\n <div>\n <p className=\"text-xs font-medium text-gray-700 mb-1\">🖼️ 主纹理</p>\n <p className=\"text-sm text-gray-900\">{mapping.mainTexture.path}</p>\n <code className=\"text-xs bg-blue-50 text-blue-700 px-2 py-1 rounded block mt-1\">\n {getTextureUrl(mapping.mainTexture.path)}\n </code>\n </div>\n )}\n \n {mapping.sphereTexture && (\n <div>\n <p className=\"text-xs font-medium text-gray-700 mb-1\">\n ✨ Sphere纹理 ({mapping.sphereTexture.mode})\n </p>\n <p className=\"text-sm text-gray-900\">{mapping.sphereTexture.path}</p>\n <code className=\"text-xs bg-purple-50 text-purple-700 px-2 py-1 rounded block mt-1\">\n {getTextureUrl(mapping.sphereTexture.path)}\n </code>\n </div>\n )}\n \n {mapping.toonTexture && (\n <div>\n <p className=\"text-xs font-medium text-gray-700 mb-1\">\n 🎨 Toon纹理 {mapping.toonTexture.isShared && '(共享)'}\n </p>\n <p className=\"text-sm text-gray-900\">{mapping.toonTexture.path}</p>\n {!mapping.toonTexture.isShared && (\n <code className=\"text-xs bg-orange-50 text-orange-700 px-2 py-1 rounded block mt-1\">\n {getTextureUrl(mapping.toonTexture.path)}\n </code>\n )}\n </div>\n )}\n \n {!mapping.mainTexture && !mapping.sphereTexture && !mapping.toonTexture && (\n <p className=\"text-sm text-gray-500 italic\">无纹理绑定</p>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\n","\n/**\n * Ammo.js 加载器\n * 用于异步加载 Ammo.js 物理引擎 (WASM 版本)\n */\n\n// 声明全局 Ammo 对象\ndeclare global {\n interface Window {\n Ammo: any;\n }\n}\n\nlet ammoPromise: Promise<any> | null = null;\n\n/**\n * 加载 Ammo.js\n * @param path Ammo.js (WASM wrapper) 的路径,默认为 '/libs/ammo.wasm.js'\n */\nexport const loadAmmo = (path: string = '/libs/ammo.wasm.js'): Promise<any> => {\n if (ammoPromise) {\n return ammoPromise;\n }\n\n ammoPromise = new Promise((resolve, reject) => {\n // 如果已经加载过\n if (typeof window.Ammo === 'function') {\n // Ammo 已经是一个函数(初始化器),直接调用\n window.Ammo().then((lib: any) => {\n resolve(lib);\n });\n return;\n }\n\n if (typeof window.Ammo === 'object') {\n // 已经初始化完毕\n resolve(window.Ammo);\n return;\n }\n\n const script = document.createElement('script');\n script.src = path;\n script.async = true;\n\n script.onload = () => {\n if (typeof window.Ammo === 'function') {\n // 初始化 Ammo\n window.Ammo().then((lib: any) => {\n // 某些版本的 ammo.js 初始化后会返回 lib 实例\n // 但也可能需要直接使用全局对象,这里做一个兼容\n resolve(lib || window.Ammo);\n }).catch((err: any) => {\n console.error('Ammo initialization failed:', err);\n reject(err);\n });\n } else {\n reject(new Error('Ammo.js loaded but window.Ammo is not a function'));\n }\n };\n\n script.onerror = (err) => {\n console.error('Failed to load Ammo.js script:', err);\n reject(new Error('Failed to load Ammo.js from ' + (path)));\n };\n\n document.body.appendChild(script);\n });\n\n return ammoPromise;\n};\n\n","/**\n * MMD加载器优化配置\n * 用于获得接近MMD软件的渲染效果\n */\n\nimport * as THREE from 'three';\n\nexport interface MMDLoaderConfig {\n /** Toon纹理路径 */\n toonPath?: string;\n /** 资源基础路径 */\n resourcePath?: string;\n /** 启用渐变贴图(用于Toon材质) */\n enableGradientMap?: boolean;\n /** 高光强度 */\n shininess?: number;\n /** 高光颜色 */\n specularColor?: THREE.ColorRepresentation;\n}\n\n/**\n * 配置MMD材质以获得最佳渲染效果\n * \n * 主要优化点:\n * 1. 为MeshToonMaterial添加渐变贴图(实现阶梯式明暗过渡)\n * 2. 调整高光参数(shininess, specular)\n * 3. 确保纹理使用正确的颜色空间\n * 4. 优化环境贴图(sphere texture)设置\n * \n * @param mesh - MMD模型网格\n * @param config - 配置选项\n */\nexport function configureMaterialsForMMD(\n mesh: THREE.SkinnedMesh,\n config: MMDLoaderConfig = {}\n) {\n const {\n enableGradientMap = true,\n shininess = 30,\n specularColor = 0x888888,\n } = config;\n\n let materialCount = 0;\n let toonMaterialCount = 0;\n let phongMaterialCount = 0;\n\n mesh.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((material) => {\n materialCount++;\n\n // 1. MeshToonMaterial 配置(MMD常用)\n if (material instanceof THREE.MeshToonMaterial) {\n toonMaterialCount++;\n\n // 设置高光强度\n (material as any).shininess = shininess;\n\n // 添加渐变贴图(5级阶梯)实现卡通风格的明暗过渡\n if (enableGradientMap && !material.gradientMap) {\n material.gradientMap = createGradientMap();\n material.needsUpdate = true;\n }\n }\n\n // 2. MeshPhongMaterial 配置\n if (material instanceof THREE.MeshPhongMaterial) {\n phongMaterialCount++;\n\n // 设置高光参数\n material.shininess = shininess;\n material.specular = new THREE.Color(specularColor);\n }\n\n // 3. 通用材质配置\n\n // 主纹理:确保使用sRGB颜色空间\n if (material.map) {\n material.map.colorSpace = THREE.SRGBColorSpace;\n }\n\n // 环境贴图(Sphere texture):设置正确的映射方式\n if (material.envMap) {\n // MMD的sphere map使用球形映射\n material.envMap.mapping = THREE.EquirectangularReflectionMapping;\n }\n\n // Toon贴图(如果存在)\n if ((material as any).gradientMap) {\n const toonMap = (material as any).gradientMap;\n toonMap.minFilter = THREE.NearestFilter;\n toonMap.magFilter = THREE.NearestFilter;\n }\n });\n }\n });\n\n console.log('[MMD Material Config] Processed ' + (materialCount) + ' materials (Toon: ' + (toonMaterialCount) + ', Phong: ' + (phongMaterialCount) + ')');\n}\n\n/**\n * 创建5级渐变贴图(用于Toon渲染)\n * \n * MMD使用阶梯式的明暗过渡(cel shading),而不是平滑的渐变。\n * 这个函数创建一个5级的灰度渐变纹理,用于MeshToonMaterial的gradientMap。\n * \n * @returns 渐变纹理\n */\nfunction createGradientMap(): THREE.DataTexture {\n // 创建5个灰度级别(0-255)\n const colors = new Uint8Array(5);\n for (let c = 0; c < colors.length; c++) {\n colors[c] = (c / (colors.length - 1)) * 255;\n }\n\n // 创建1D纹理\n const gradientMap = new THREE.DataTexture(\n colors,\n colors.length,\n 1,\n THREE.RedFormat\n );\n\n // 使用最近邻过滤,确保阶梯效果清晰\n gradientMap.minFilter = THREE.NearestFilter;\n gradientMap.magFilter = THREE.NearestFilter;\n gradientMap.needsUpdate = true;\n\n return gradientMap;\n}\n\n/**\n * 创建MMD风格的光照设置\n * \n * MMD默认使用3点光照:\n * 1. 主光源(Key Light):从左前上方照射,强度最高\n * 2. 补光(Fill Light):从右侧照射,减少阴影过暗\n * 3. 环境光(Ambient Light):提供基础亮度\n * \n * @param scene - Three.js场景\n * @param options - 光照选项\n * @returns 光源对象\n */\nexport function createMMDLights(\n scene: THREE.Scene,\n options: {\n ambientIntensity?: number;\n mainIntensity?: number;\n fillIntensity?: number;\n enableShadow?: boolean;\n } = {}\n) {\n const {\n ambientIntensity = 0.6,\n mainIntensity = 1.0,\n fillIntensity = 0.3,\n enableShadow = true,\n } = options;\n\n // 1. 环境光:提供基础亮度,避免完全黑暗\n const ambientLight = new THREE.AmbientLight(0xffffff, ambientIntensity);\n scene.add(ambientLight);\n\n // 2. 主光源:从左前上方照射(MMD默认方向)\n const mainLight = new THREE.DirectionalLight(0xffffff, mainIntensity);\n mainLight.position.set(-1, 1, 1);\n mainLight.position.normalize().multiplyScalar(10);\n\n // 配置阴影\n if (enableShadow) {\n mainLight.castShadow = true;\n mainLight.shadow.mapSize.width = 2048;\n mainLight.shadow.mapSize.height = 2048;\n mainLight.shadow.bias = -0.0001;\n\n // 配置阴影相机(正交投影)\n mainLight.shadow.camera.left = -20;\n mainLight.shadow.camera.right = 20;\n mainLight.shadow.camera.top = 20;\n mainLight.shadow.camera.bottom = -20;\n mainLight.shadow.camera.near = 0.1;\n mainLight.shadow.camera.far = 50;\n }\n\n scene.add(mainLight);\n\n // 3. 补光:从右侧照射,柔化阴影\n const fillLight = new THREE.DirectionalLight(0xffffff, fillIntensity);\n fillLight.position.set(1, 0.5, 0.5);\n fillLight.position.normalize().multiplyScalar(10);\n scene.add(fillLight);\n\n console.log('[MMD Lights] Created 3-point lighting setup (ambient, main, fill)');\n\n return {\n ambientLight,\n mainLight,\n fillLight,\n };\n}\n\n/**\n * 配置渲染器以获得MMD风格的渲染效果\n * \n * 主要配置:\n * 1. 色调映射:使用线性或无色调映射(避免过度曝光)\n * 2. 颜色空间:sRGB(与MMD一致)\n * 3. 阴影:PCF软阴影\n * \n * @param renderer - Three.js渲染器\n * @param options - 渲染器选项\n * @returns 配置后的渲染器\n */\nexport function configureRendererForMMD(\n renderer: THREE.WebGLRenderer,\n options: {\n toneMapping?: THREE.ToneMapping;\n toneMappingExposure?: number;\n enableShadow?: boolean;\n } = {}\n) {\n const {\n toneMapping = THREE.LinearToneMapping,\n toneMappingExposure = 1.0,\n enableShadow = true,\n } = options;\n\n // 色调映射:使用线性映射,避免颜色过饱和\n renderer.toneMapping = toneMapping;\n renderer.toneMappingExposure = toneMappingExposure;\n\n // 颜色空间:sRGB(标准)\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n\n // 阴影配置\n if (enableShadow) {\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 软阴影\n }\n\n console.log('[MMD Renderer] Configured for MMD-style rendering');\n console.log(' - Tone Mapping: ' + (toneMapping === THREE.LinearToneMapping ? 'Linear' : 'Custom'));\n console.log(` - Color Space: sRGB`);\n console.log(' - Shadow: ' + (enableShadow ? 'Enabled (PCF Soft)' : 'Disabled'));\n\n return renderer;\n}\n\n/**\n * 生成Toon纹理(用于测试,如果没有原版toon01-10.bmp)\n * \n * @param index - Toon纹理索引 (1-10)\n * @returns Canvas元素\n */\nexport function generateToonTexture(index: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 1;\n\n const ctx = canvas.getContext('2d')!;\n const gradient = ctx.createLinearGradient(0, 0, 256, 0);\n\n // index=1最亮, index=10最暗\n const brightness = 1 - (index - 1) / 9;\n\n gradient.addColorStop(0, 'rgb(' + (255 * brightness) + ', ' + (255 * brightness) + ', ' + (255 * brightness) + ')');\n gradient.addColorStop(1, 'rgb(' + (128 * brightness) + ', ' + (128 * brightness) + ', ' + (128 * brightness) + ')');\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 256, 1);\n\n return canvas;\n}\n\n/**\n * 批量生成所有Toon纹理(1-10)\n * \n * @returns Toon纹理数组\n */\nexport function generateAllToonTextures(): THREE.CanvasTexture[] {\n const textures: THREE.CanvasTexture[] = [];\n\n for (let i = 1; i <= 10; i++) {\n const canvas = generateToonTexture(i);\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n textures.push(texture);\n }\n\n console.log('[MMD Toon] Generated 10 toon textures');\n\n return textures;\n}\n\n\n\n\n\n\n\n","import React, { useEffect, useRef, forwardRef, useImperativeHandle, useState } from 'react';\nimport * as THREE from 'three';\nimport {\n OrbitControls,\n MMDLoader,\n MMDAnimationHelper,\n OutlineEffect,\n} from 'three-stdlib';\n\n// 🚀 开启 Three.js 全局缓存,确保 CDN 资源在被浏览器缓存后,能直接从内存读取\nif (typeof window !== 'undefined') {\n THREE.Cache.enabled = true;\n}\n\nimport { loadAmmo } from '../utils/ammo-loader';\nimport { MMDPlayerBaseProps, MMDPlayerBaseRef } from '../types';\nimport { FXParser } from '../fx/FXParser';\nimport { FXToThreeAdapter } from '../fx/FXToThreeAdapter';\nimport { MultiFXAdapter } from '../fx/MultiFXAdapter';\nimport type { FXEffect } from '../fx/types';\nimport { configureMaterialsForMMD } from '../utils/mmd-loader-config';\n\n/**\n * 等待模型的所有材质和纹理加载完成\n * 确保渲染时不会有逐个子模型显示的效果\n */\nasync function waitForMaterialsReady(\n object: THREE.Object3D,\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n camera: THREE.Camera\n): Promise<void> {\n const textures: THREE.Texture[] = [];\n let meshCount = 0;\n\n // 遍历对象及其所有子对象,收集所有纹理和网格\n object.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n meshCount++;\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((material) => {\n if (material instanceof THREE.Material) {\n // 收集所有可能的纹理属性\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap',\n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n\n textureProps.forEach((prop) => {\n const texture = (material as any)[prop];\n if (texture instanceof THREE.Texture && !textures.includes(texture)) {\n textures.push(texture);\n }\n });\n }\n });\n }\n });\n\n // 等待所有纹理的图像数据加载完成\n const texturePromises = textures.map((texture, index) => {\n return new Promise<void>((resolve) => {\n const image = texture.image;\n\n // 检查是否已经加载完成\n if (!image) {\n resolve();\n return;\n }\n\n if (image instanceof HTMLImageElement) {\n if (image.complete && image.naturalWidth > 0) {\n resolve();\n } else {\n // 等待图像加载\n const onLoad = () => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n\n const onError = (e: any) => {\n console.warn('[MMDPlayerBase] Texture ' + (index + 1) + '/' + (textures.length) + ': Failed to load', e);\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n resolve();\n };\n\n image.addEventListener('load', onLoad);\n image.addEventListener('error', onError);\n\n // 超时保护\n setTimeout(() => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n console.warn('[MMDPlayerBase] Texture ' + (index + 1) + '/' + (textures.length) + ': Timeout');\n resolve();\n }, 5000);\n }\n } else {\n resolve();\n }\n });\n });\n\n await Promise.all(texturePromises);\n\n // 强制更新所有材质的纹理需要更新标志\n textures.forEach((texture) => {\n texture.needsUpdate = true;\n });\n\n // 执行一次渲染循环,确保所有纹理都上传到 GPU\n // 优化:从 3 次减少到 1 次,大部分情况下这就足够了\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n try {\n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误 (MORPHTARGETS_COUNT undeclared)\n object.traverse((obj) => {\n if ((obj as any).isMesh) {\n const mesh = obj as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n\n // 检查几何体是否真的有变形数据\n const hasMorphAttributes = mesh.geometry.morphAttributes &&\n Object.keys(mesh.geometry.morphAttributes).length > 0;\n\n materials.forEach(m => {\n // 针对特定的没有实际变形数据的材质\n if (!hasMorphAttributes) {\n // 1. 强制材质关闭变形\n (m as any).morphTargets = false;\n\n // 2. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n\n // 3. 重置 Mesh 的变形影响状态\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n if ((mesh as any).morphTargetDictionary) {\n (mesh as any).morphTargetDictionary = {};\n }\n m.needsUpdate = true;\n }\n });\n\n if ((mesh as any).updateMorphTargets) {\n (mesh as any).updateMorphTargets();\n }\n }\n });\n\n renderer.render(scene, camera);\n } catch (renderError) {\n console.warn('[MMDPlayerBase] Warmup render failed (shader error?), skipping...', renderError);\n }\n resolve();\n });\n });\n}\n\nexport const MMDPlayerBase = forwardRef<MMDPlayerBaseRef, MMDPlayerBaseProps>((props, ref) => {\n const {\n resources,\n stage = {},\n mobileOptimization = { enabled: true },\n autoPlay = false,\n loop = true,\n volume = 1.0,\n muted = false,\n showAxes = false,\n onLoad,\n onLoadProgress,\n onError,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onCameraChange,\n className,\n style,\n } = props;\n\n // 合并渲染配置(优先使用 props,其次使用 stage)\n const renderEffect = props.renderEffect || stage.renderEffect || 'default';\n const outlineOptions = { ...stage.outlineOptions, ...props.outlineOptions };\n const fxPath = props.fxPath || stage.fxPath;\n const fxTexturePath = props.fxTexturePath || stage.fxTexturePath;\n const fxConfigs = props.fxConfigs || stage.fxConfigs;\n\n // 容器 Ref\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Three.js 对象 Refs\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const outlineEffectRef = useRef<OutlineEffect | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<any>(null); // MMDAnimationHelper\n const axesHelperRef = useRef<THREE.AxesHelper | null>(null); // 坐标轴\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const animationIdRef = useRef<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n\n // 🎨 光源 Refs(用于调试面板)\n const ambientLightRef = useRef<THREE.AmbientLight | null>(null);\n const directionalLightRef = useRef<THREE.DirectionalLight | null>(null);\n const sideLightRef = useRef<THREE.DirectionalLight | null>(null);\n const hemisphereLightRef = useRef<THREE.HemisphereLight | null>(null);\n const mmdMeshRef = useRef<THREE.SkinnedMesh | null>(null);\n\n // FX 相关 Refs\n const fxEffectRef = useRef<FXEffect | null>(null);\n const fxAdapterRef = useRef<FXToThreeAdapter | null>(null);\n const multiFXAdapterRef = useRef<MultiFXAdapter | null>(null); // 多FX适配器\n\n // 状态 Refs\n const isReadyRef = useRef(false);\n const isPlayingRef = useRef(false);\n const initIdRef = useRef(0); // 初始化 ID 锁\n const durationRef = useRef(0); // 动画时长(秒)\n const animationClipRef = useRef<THREE.AnimationClip | null>(null); // 保存动画剪辑\n const loopRef = useRef(loop); // 循环状态 ref\n const audioRef = useRef<THREE.Audio | null>(null); // 音频对象引用\n const audioListenerRef = useRef<THREE.AudioListener | null>(null); // 音频监听器引用\n const audioLoaderRef = useRef<THREE.AudioLoader>(new THREE.AudioLoader());\n \n // 🎵 音频系统就绪状态 - 用于解决音频加载与模型加载的竞态条件\n const [isAudioSystemReady, setIsAudioSystemReady] = useState(false);\n\n // 🚀 解决回调函数在渲染循环中的闭包过时问题\n const latestCallbacks = useRef({ onPlay, onPause, onEnded, onTimeUpdate });\n useEffect(() => {\n latestCallbacks.current = { onPlay, onPause, onEnded, onTimeUpdate };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n\n // 🎯 新增:物理引擎组件引用 - 用于正确清理 Ammo 对象\n // 改用数组来追踪所有创建的对象(每个模型会创建多个物理世界和刚体)\n const physicsComponentsRef = useRef<{\n configs: any[];\n dispatchers: any[];\n caches: any[];\n solvers: any[];\n worlds: any[];\n }>({\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n });\n\n // 🎯 新增:存储原始 Ammo 构造函数,以便在清理时恢复\n // 防止无限递归 Monkey-patch\n const originalAmmoMethodsRef = useRef<{\n btDefaultCollisionConfiguration?: any;\n btCollisionDispatcher?: any;\n btDbvtBroadphase?: any;\n btSequentialImpulseConstraintSolver?: any;\n btDiscreteDynamicsWorld?: any;\n }>({});\n\n // 🕐 运行时间追踪 - 用于 OOM 错误报告\n const startTimeRef = useRef<number>(Date.now());\n const modelSwitchCountRef = useRef<number>(0);\n\n // 暴露给父组件的方法\n useImperativeHandle(ref, () => ({\n play: () => {\n if (!isReadyRef.current) return;\n // 🔧 防止重复调用:如果已经在播放状态,直接返回\n if (isPlayingRef.current) {\n console.log('[MMDPlayerBase] play() called but already playing, skipping');\n return;\n }\n console.log('[MMDPlayerBase] play() called, audioRef:', !!audioRef.current, 'isPlaying:', audioRef.current?.isPlaying);\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n\n // 🎵 如果音频已加载但未播放,触发播放\n if (audioRef.current && !audioRef.current.isPlaying) {\n console.log('[MMDPlayerBase] Starting audio playback from play()');\n audioRef.current.play();\n }\n\n latestCallbacks.current.onPlay?.();\n },\n pause: () => {\n if (!isPlayingRef.current) return;\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n stop: () => {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onPause?.();\n },\n seek: (time: number) => {\n console.warn('Seek not fully implemented in MMDPlayerBase yet');\n },\n getCurrentTime: () => {\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n // 如果是循环播放,返回模除后的时间\n if (duration > 0 && loopRef.current) {\n return elapsed % duration;\n }\n return elapsed;\n },\n getDuration: () => durationRef.current,\n isPlaying: () => isPlayingRef.current,\n snapshot: () => {\n if (!rendererRef.current) return '';\n if (sceneRef.current && cameraRef.current) {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n return rendererRef.current.domElement.toDataURL('image/png');\n },\n resetCamera: () => {\n if (!cameraRef.current || !controlsRef.current) return;\n\n const { cameraPosition, cameraTarget } = stage;\n\n if (cameraPosition) {\n const pos = cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n } else {\n cameraRef.current.position.set(0, 20, 30);\n }\n\n if (cameraTarget) {\n const target = cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n } else {\n controlsRef.current.target.set(0, 10, 0);\n }\n\n controlsRef.current.update();\n onCameraChange?.(false); // 重置后标记为非手动\n }\n }));\n\n // 初始化 Effect\n useEffect(() => {\n\n if (!containerRef.current) return;\n\n const init = async () => {\n // 1. 生成当前初始化的唯一 ID\n const myId = ++initIdRef.current;\n\n // 辅助函数:检查当前初始化是否已过时或组件已卸载\n const checkCancelled = () => {\n return myId !== initIdRef.current || !containerRef.current;\n };\n\n // 2. 清空容器 (Double Check)\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n\n // 3. 重置物理引擎组件引用\n physicsComponentsRef.current = {\n configs: [],\n dispatchers: [],\n caches: [],\n solvers: [],\n worlds: []\n };\n\n // 🕐 记录开始时间和切换计数\n if (modelSwitchCountRef.current === 0) {\n // 首次加载,记录开始时间\n startTimeRef.current = Date.now();\n modelSwitchCountRef.current = 1;\n } else {\n // 模型切换\n modelSwitchCountRef.current++;\n }\n\n try {\n // 4. 物理引擎加载\n if (stage.enablePhysics !== false && !mobileOptimization.disablePhysics) {\n await loadAmmo(stage.physicsPath);\n if (checkCancelled()) return;\n\n // 🎯 关键修复:Hook MMDPhysics._createWorld 以捕获物理引擎组件\n // 这样我们可以在清理时正确销毁它们,防止 WASM 内存泄漏\n const Ammo = (window as any).Ammo;\n if (Ammo) {\n // 🔒 1. 备份原始构造函数 (如果还没有备份)\n // 注意:我们必须检查 current 是否为空,以防多次 init 覆盖了原始备份\n if (!originalAmmoMethodsRef.current.btDefaultCollisionConfiguration) {\n originalAmmoMethodsRef.current = {\n btDefaultCollisionConfiguration: Ammo.btDefaultCollisionConfiguration,\n btCollisionDispatcher: Ammo.btCollisionDispatcher,\n btDbvtBroadphase: Ammo.btDbvtBroadphase,\n btSequentialImpulseConstraintSolver: Ammo.btSequentialImpulseConstraintSolver,\n btDiscreteDynamicsWorld: Ammo.btDiscreteDynamicsWorld\n };\n }\n\n // 获取原始引用 (优先从备份中获取,确保我们使用的是\"干净\"的版本)\n const originals = originalAmmoMethodsRef.current;\n\n // ⚠️ 关键修改:使用数组来保存所有对象\n const componentsRef = physicsComponentsRef.current;\n\n // 🔒 2. 应用 Monkey Patch\n // 每次创建对象时,将其添加到我们的追踪数组中\n\n Ammo.btDefaultCollisionConfiguration = function (...args: any[]) {\n // @ts-ignore\n const obj = new originals.btDefaultCollisionConfiguration(...args);\n componentsRef.configs.push(obj);\n return obj;\n };\n\n Ammo.btCollisionDispatcher = function (...args: any[]) {\n // @ts-ignore\n const obj = new originals.btCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n return obj;\n };\n\n Ammo.btDbvtBroadphase = function (...args: any[]) {\n // @ts-ignore\n const obj = new originals.btDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n return obj;\n };\n\n Ammo.btSequentialImpulseConstraintSolver = function (...args: any[]) {\n // @ts-ignore\n const obj = new originals.btSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n return obj;\n };\n\n Ammo.btDiscreteDynamicsWorld = function (...args: any[]) {\n // @ts-ignore\n const obj = new originals.btDiscreteDynamicsWorld(...args);\n componentsRef.worlds.push(obj);\n return obj;\n };\n }\n }\n\n // 5. 场景初始化\n const container = containerRef.current!;\n const width = container.clientWidth || 300;\n const height = container.clientHeight || 150;\n\n // 创建场景\n const scene = new THREE.Scene();\n if (stage.backgroundColor && stage.backgroundColor !== 'transparent') {\n scene.background = new THREE.Color(stage.backgroundColor);\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n scene.background = texture;\n });\n }\n sceneRef.current = scene;\n\n // Camera\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\n if (stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n camera.position.set(pos.x, pos.y, pos.z);\n } else {\n camera.position.set(0, 20, 30);\n }\n cameraRef.current = camera;\n\n // Renderer\n const renderer = new THREE.WebGLRenderer({\n antialias: !mobileOptimization.enabled,\n alpha: true,\n preserveDrawingBuffer: true\n });\n renderer.setSize(width, height);\n // 使用更高的像素比例以获得更清晰的渲染效果\n const pixelRatio = mobileOptimization.enabled\n ? (mobileOptimization.pixelRatio || Math.min(window.devicePixelRatio, 2))\n : window.devicePixelRatio;\n renderer.setPixelRatio(pixelRatio);\n\n // 🎨 渲染器色调映射和颜色空间设置(使用 NoToneMapping 保持原始颜色)\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n renderer.toneMapping = THREE.NoToneMapping; // 使用 NoToneMapping 保持原始颜色\n renderer.toneMappingExposure = 1.4;\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n\n if (checkCancelled()) {\n renderer.dispose();\n return;\n }\n\n // 再次确保容器为空,防止并行执行导致的残留\n container.innerHTML = '';\n\n // 强制 Canvas 样式 - 确保 canvas 在最底层\n renderer.domElement.style.display = 'block';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n renderer.domElement.style.outline = 'none';\n renderer.domElement.style.position = 'relative';\n\n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 音频监听器\n const listener = new THREE.AudioListener();\n camera.add(listener);\n audioListenerRef.current = listener;\n // 🎯 注释掉 OutlineEffect(简化渲染,与 demo 保持一致)\n const effect = new OutlineEffect(renderer, {\n defaultThickness: outlineOptions.thickness ?? 0.003,\n defaultColor: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n defaultAlpha: 1,\n defaultKeepAlive: true\n });\n outlineEffectRef.current = effect;\n\n // 环境光\n const ambientLight = new THREE.AmbientLight(0xffffff, 1.0);\n scene.add(ambientLight);\n\n // 主方向光\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(5, 10, 5);\n directionalLight.castShadow = true;\n directionalLight.shadow.mapSize.width = 2048;\n directionalLight.shadow.mapSize.height = 2048;\n directionalLight.shadow.camera.left = -15;\n directionalLight.shadow.camera.right = 15;\n directionalLight.shadow.camera.top = 15;\n directionalLight.shadow.camera.bottom = -15;\n directionalLight.shadow.camera.near = 0.5;\n directionalLight.shadow.camera.far = 50;\n directionalLight.shadow.bias = -0.0001;\n scene.add(directionalLight);\n\n // 侧面补光\n const sideLight = new THREE.DirectionalLight(0xffffff, 0.5);\n sideLight.position.set(-3, 8, 8);\n scene.add(sideLight);\n\n // 半球光\n const hemisphereLight = new THREE.HemisphereLight(0xffffff, 0xaaaaaa, 0.6);\n scene.add(hemisphereLight);\n\n // Controls(与 demo 保持一致的配置)\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.dampingFactor = 0.05;\n controls.minDistance = 5; // 与 demo 一致\n controls.maxDistance = 50; // 与 demo 一致\n if (stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controls.target.set(target.x, target.y, target.z);\n } else {\n controls.target.set(0, 10, 0); // 与 demo 一致\n }\n controls.update();\n\n // 🎯 监听手动相机操作\n controls.addEventListener('start', () => {\n onCameraChange?.(true);\n });\n\n controlsRef.current = controls;\n\n // Axes Helper (坐标轴辅助)\n if (showAxes) {\n const axesHelper = new THREE.AxesHelper(20);\n scene.add(axesHelper);\n axesHelperRef.current = axesHelper;\n }\n\n // Resize Observer\n const onResize = () => {\n if (!containerRef.current || !cameraRef.current || !rendererRef.current) return;\n const w = containerRef.current.clientWidth;\n const h = containerRef.current.clientHeight;\n\n if (w === 0 || h === 0) return;\n\n cameraRef.current.aspect = w / h;\n cameraRef.current.updateProjectionMatrix();\n\n rendererRef.current.setSize(w, h);\n };\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n resizeObserverRef.current = resizeObserver;\n\n // 立即执行一次 Resize\n onResize();\n\n // 🎯 提前启动渲染循环(但不播放动画)\n // 这样可以在加载过程中显示场景,但动画要等完全准备好才开始\n animate();\n\n // 6. 资源加载\n const loader = new MMDLoader();\n const helper = new MMDAnimationHelper({\n afterglow: 2.0\n });\n helperRef.current = helper;\n \n // 🎵 标记音频系统已准备好(audioListenerRef 和 helperRef 都已设置)\n setIsAudioSystemReady(true);\n\n // 6.1 加载模型和动作\n const loadModelPromise = new Promise<{ mesh: THREE.SkinnedMesh, animation?: THREE.AnimationClip }>((resolve, reject) => {\n if (resources.motionPath) {\n loader.loadWithAnimation(\n resources.modelPath,\n resources.motionPath,\n (mmd) => {\n resolve({ mesh: mmd.mesh, animation: mmd.animation });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model+motion');\n }\n },\n (err) => reject(err)\n );\n } else {\n loader.load(\n resources.modelPath,\n (mesh) => {\n resolve({ mesh: mesh as THREE.SkinnedMesh });\n },\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n onLoadProgress?.(percent, 'model');\n }\n },\n (err) => reject(err)\n );\n }\n });\n\n const { mesh, animation } = await loadModelPromise;\n //关键修改:加载好mmd mesh 后直接设置属性并优化材质,可以解决光照过强的问题\n // 设置模型基础属性(与 demo 一致)\n mesh.castShadow = true; // 模型投射阴影\n mesh.receiveShadow = stage.modelReceiveShadow ?? true; // 模型接收阴影(默认 true,与 demo 一致)\n\n // 🎨 应用MMD材质优化(添加渐变贴图等)\n configureMaterialsForMMD(mesh, {\n enableGradientMap: true,\n shininess: 50,\n specularColor: 0x888888,\n });\n\n // 关键检查点:资源加载耗时较长,再次检查是否已失效\n if (checkCancelled()) return;\n\n // 保存模型引用供调试面板使用\n mmdMeshRef.current = mesh;\n\n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n }\n\n // 创建一个临时场景来等待纹理加载(不影响主场景)\n const tempScene = new THREE.Scene();\n tempScene.add(mesh);\n await waitForMaterialsReady(mesh, renderer, tempScene, camera);\n\n if (checkCancelled()) return;\n\n // 从临时场景移除\n tempScene.remove(mesh);\n\n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n scene.add(mesh);\n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n\n // 🎯 自动降级系统 - 针对移动设备优化\n const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||\n (window.innerWidth <= 768);\n\n if (isMobileDevice) {\n console.log('[MMDPlayerBase] 📱 Mobile device detected, applying optimizations...');\n\n // 方案 A: 使用骨骼纹理(如果支持)\n if (!renderer.capabilities.vertexTextures) {\n console.log('[MMDPlayerBase] ⚠️ Vertex textures NOT supported');\n }\n\n // 方案 B: 简化材质\n let simplifiedMaterialCount = 0;\n mesh.traverse((child) => {\n if (child instanceof THREE.Mesh || child instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((material, idx) => {\n if (material instanceof THREE.MeshPhongMaterial ||\n material instanceof THREE.MeshStandardMaterial) {\n // 保存原始材质的颜色\n const originalColor = material.color?.clone();\n const originalMap = material.map;\n\n // 创建简化的 MeshBasicMaterial\n const basicMaterial = new THREE.MeshBasicMaterial({\n color: originalColor || 0xffffff,\n map: originalMap,\n transparent: material.transparent,\n opacity: material.opacity,\n side: material.side,\n alphaTest: material.alphaTest\n });\n\n // 替换材质\n if (Array.isArray(child.material)) {\n child.material[idx] = basicMaterial;\n } else {\n child.material = basicMaterial;\n }\n\n // 清理旧材质\n material.dispose();\n simplifiedMaterialCount++;\n }\n });\n }\n });\n\n // 方案 C: 限制骨骼数量(检查并警告)\n const MAX_BONES = 64;\n if (mesh.skeleton) {\n const boneCount = mesh.skeleton.bones.length;\n if (boneCount > MAX_BONES) {\n console.warn('[MMDPlayerBase] ⚠️ Model has ' + (boneCount) + ' bones (max recommended: ' + (MAX_BONES) + ')');\n console.warn(`[MMDPlayerBase] This may cause performance issues on mobile devices`);\n }\n }\n }\n\n // 6.3 加载相机动画\n if (resources.cameraPath) {\n loader.loadAnimation(\n resources.cameraPath,\n camera,\n (cameraAnimation) => {\n if (checkCancelled()) return; // Callback check\n helper.add(camera, {\n animation: cameraAnimation as THREE.AnimationClip\n });\n },\n undefined,\n (err) => console.error('Failed to load camera motion:', err)\n );\n }\n\n // 6.5 加载舞台\n const stagePaths = Array.isArray(resources.stageModelPath)\n ? resources.stageModelPath\n : (resources.stageModelPath ? [resources.stageModelPath] : []);\n\n for (const stagePath of stagePaths) {\n try {\n const stageMesh = await new Promise<THREE.Object3D>((resolve, reject) => {\n loader.load(\n stagePath,\n (mesh) => resolve(mesh),\n (xhr) => {\n if (xhr.lengthComputable) {\n const percent = (xhr.loaded / xhr.total) * 100;\n if (Math.round(percent) % 20 === 0) console.log('[MMDPlayerBase] Stage loading: ' + (percent.toFixed(1)) + '%');\n }\n },\n (err) => reject(err)\n );\n });\n\n if (checkCancelled()) return;\n\n console.log('[MMDPlayerBase] Stage model loaded: ' + (stagePath), stageMesh);\n\n // 🎯 核心修复:深度清理无效的变形目标数据,防止 Shader 编译错误\n console.log('[MMDPlayerBase] 🎨 Traversing stage mesh to apply FX, multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n let stageMaterialCount = 0;\n stageMesh.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = false; // 🎯 舞台不投射阴影\n child.receiveShadow = true; // 舞台接收阴影(模型投射到地面的阴影)\n\n const mesh = child as THREE.Mesh;\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n stageMaterialCount += materials.length;\n\n materials.forEach((m, idx) => {\n // 对于普通舞台材质,也确保关闭没用的 morphTargets\n if ((m as any).morphTargets) {\n (m as any).morphTargets = false;\n m.needsUpdate = true;\n }\n });\n\n // 3. 彻底移除几何体中的变形属性引用\n if (mesh.geometry.morphAttributes) {\n mesh.geometry.morphAttributes = {};\n }\n if ((mesh as any).morphTargetInfluences) {\n (mesh as any).morphTargetInfluences = [];\n }\n\n // 4. 🎯 应用描边设置到舞台材质\n materials.forEach((m) => {\n if (!m.userData) m.userData = {};\n // 舞台通常没有预设描边,我们手动为其添加\n m.userData.outlineParameters = {\n thickness: outlineOptions.thickness ?? 0.003,\n color: new THREE.Color(outlineOptions.color ?? '#000000').toArray(),\n alpha: 1,\n visible: true,\n keepAlive: true\n };\n\n // 🎨 应用FX材质配置到舞台(如果有)\n // 支持MeshPhongMaterial和MeshToonMaterial(MMD常用)\n if (m instanceof THREE.MeshPhongMaterial || m instanceof THREE.MeshToonMaterial) {\n console.log('[MMDPlayerBase] 🎨 Applying FX to stage material (type:', m.type, '), multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n // // 优先使用多FX适配器\n // if (multiFXAdapterRef.current) {\n // console.log('[MMDPlayerBase] Using MultiFXAdapter for stage');\n // multiFXAdapterRef.current.applyToMaterial(m, 'stage');\n // } else if (fxAdapterRef.current) {\n // console.log('[MMDPlayerBase] Using single FXAdapter for stage');\n // // 回退到单FX适配器\n // const materialConfig = fxAdapterRef.current.extractMaterialConfig();\n\n // // 🔍 调试:打印提取的配置\n // console.log('[MMDPlayerBase] Extracted material config for stage:');\n // console.log(' - color:', materialConfig.color);\n // console.log(' - emissive:', materialConfig.emissive);\n // console.log(' - specular:', materialConfig.specular);\n // console.log(' - shininess:', materialConfig.shininess);\n\n // // 🎯 应用颜色(跳过纯黑色,避免覆盖原有材质)\n // if (materialConfig.color) {\n // const isBlack = materialConfig.color.r === 0 && materialConfig.color.g === 0 && materialConfig.color.b === 0;\n // if (!isBlack) {\n // m.color.copy(materialConfig.color);\n // console.log('[MMDPlayerBase] Applied color to stage:', materialConfig.color);\n // } else {\n // console.log('[MMDPlayerBase] Skipping black color (0,0,0) for stage to preserve original material');\n // }\n // }\n\n // // // 🎯 应用发光颜色(跳过纯黑色)\n // // if (materialConfig.emissive) {\n // // const isBlack = materialConfig.emissive.r === 0 && materialConfig.emissive.g === 0 && materialConfig.emissive.b === 0;\n // // if (!isBlack) {\n // // m.emissive.copy(materialConfig.emissive);\n // // console.log('[MMDPlayerBase] Applied emissive to stage:', materialConfig.emissive);\n // // }\n // // }\n\n // // // 应用高光\n // // if (materialConfig.specular && (m as any).specular) {\n // // (m as any).specular.copy(materialConfig.specular);\n // // console.log('[MMDPlayerBase] Applied specular to stage:', materialConfig.specular);\n // // }\n\n // // // 应用光泽度\n // // if (materialConfig.shininess !== undefined && (m as any).shininess !== undefined) {\n // // console.log('[MMDPlayerBase] Applying shininess to stage:', materialConfig.shininess);\n // // (m as any).shininess = materialConfig.shininess;\n // // }\n // }\n } else {\n console.log('[MMDPlayerBase] Stage material type not supported for FX:', m.type);\n }\n });\n }\n });\n console.log('[MMDPlayerBase] 🎨 Stage traverse complete, processed materials:', stageMaterialCount);\n\n // 🎯 材质预热\n try {\n await waitForMaterialsReady(stageMesh, renderer, scene, camera);\n } catch (e) {\n console.warn('[MMDPlayerBase] Warmup error for stage ' + (stagePath) + ':', e);\n }\n\n if (checkCancelled()) return;\n\n // 添加到场景\n scene.add(stageMesh);\n\n // 🎯 自动调整比例和位置\n const stageBox = new THREE.Box3().setFromObject(stageMesh);\n const stageSize = stageBox.getSize(new THREE.Vector3());\n\n if (stageSize.length() < 1) {\n stageMesh.scale.multiplyScalar(100);\n } else if (stageSize.y < 5) {\n stageMesh.scale.multiplyScalar(10);\n }\n\n // 确保底部对齐 Y=0 (可选)\n // stageMesh.position.set(0, 0, 0);\n\n // 绑定动作\n if (resources.stageMotionPath) {\n (loader as any).loadAnimation(resources.stageMotionPath, stageMesh, (anim: any) => {\n if (!checkCancelled()) helper.add(stageMesh as any, { animation: anim });\n });\n }\n } catch (err) {\n console.error('Failed to load stage ' + (stagePath) + ':', err);\n }\n }\n\n if (checkCancelled()) return;\n\n // 🎯 所有资源完全加载完成,模型已完全显示,现在可以触发回调并开始播放动画\n isReadyRef.current = true;\n onLoad?.();\n\n if (autoPlay) {\n // 给一点时间让渲染系统稳定,然后开始播放动画\n setTimeout(() => {\n if (checkCancelled()) return;\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n onPlay?.();\n }, 100);\n }\n\n } catch (error) {\n if (checkCancelled()) return; // 如果是因为取消导致的 error,忽略\n console.error('MMDPlayerBase initialization failed:', error);\n\n // 检测 OOM 错误并弹出警告\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('OOM') || errorMessage.includes('out of memory')) {\n // 计算运行时间\n const runningTime = Date.now() - startTimeRef.current;\n const hours = Math.floor(runningTime / 3600000);\n const minutes = Math.floor((runningTime % 3600000) / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n\n const timeString = hours > 0\n ? (hours) + '小时' + (minutes) + '分' + (seconds) + '秒'\n : minutes > 0\n ? (minutes) + '分' + (seconds) + '秒'\n : (seconds) + '秒';\n\n alert(`⚠️ 内存溢出错误 (OOM)\n\n📊 系统运行统计:\n• 运行时间: ${timeString}\n• 模型切换次数: ${modelSwitchCountRef.current}\n• 启动时间: ${new Date(startTimeRef.current).toLocaleString()}\n• 错误时间: ${new Date().toLocaleString()}\n\n❌ 问题:物理引擎内存不足!\n这通常意味着之前的物理世界没有正确清理。\n\n🔍 错误详情:\n${errorMessage}\n\n💡 建议:请刷新页面或联系开发者`);\n }\n\n onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n init();\n\n return () => {\n // 清理逻辑 - 彻底清理所有 Three.js 资源以防止内存泄漏\n console.log('[MMDPlayerBase] Cleanup started');\n\n // 增加 ID,立即使当前的 init 失效(如果还在跑)\n initIdRef.current++;\n\n // 停止动画循环\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n animationIdRef.current = null;\n }\n\n isPlayingRef.current = false;\n isReadyRef.current = false;\n\n // 清理 ResizeObserver\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n\n // 清理音频资源\n if (audioRef.current) {\n try {\n if (audioRef.current.isPlaying) {\n audioRef.current.stop();\n }\n if (audioRef.current.source) {\n audioRef.current.disconnect();\n }\n // 清理音频缓冲区引用\n if (audioRef.current.buffer) {\n audioRef.current.buffer = null as any;\n }\n audioRef.current = null;\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up audio:', e);\n }\n }\n\n // 清理 AnimationHelper - 包含物理引擎清理 \n if (helperRef.current) {\n try {\n console.log('[MMDPlayerBase] Cleaning up AnimationHelper');\n\n const helperObjects = (helperRef.current as any).objects;\n const meshes = (helperRef.current as any).meshes || [];\n\n console.log('[MMDPlayerBase] Found meshes count:', meshes.length);\n\n if (meshes && Array.isArray(meshes) && meshes.length > 0) {\n meshes.forEach((mesh: any, idx: number) => {\n // 🎯 关键修复:从 WeakMap 中获取真正的 meshData\n let meshData: any = null;\n\n if (helperObjects instanceof WeakMap) {\n meshData = helperObjects.get(mesh);\n }\n\n // 如果没有从 WeakMap 获取到,使用 mesh 本身作为 fallback\n if (!meshData) {\n meshData = mesh;\n }\n\n // 清理物理系统 - 从 meshData 中获取\n const physics = meshData?.physics;\n\n if (physics) {\n try {\n // 优先使用 MMDPhysics.dispose() 方法(three-stdlib 提供的标准清理方法)\n if (typeof physics.dispose === 'function') {\n physics.dispose();\n } else {\n // 手动清理物理组件\n const Ammo = (window as any).Ammo;\n if (!Ammo || !Ammo.destroy) {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available');\n } else {\n // 清理刚体\n if (physics.world && Array.isArray(physics.bodies) && physics.bodies.length > 0) {\n for (let i = physics.bodies.length - 1; i >= 0; i--) {\n try {\n const body = physics.bodies[i];\n if (body && body.body) {\n physics.world.removeRigidBody(body.body);\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error removing body ' + (i) + ':', e);\n }\n }\n physics.bodies.length = 0;\n }\n\n // 清理约束\n if (physics.world && Array.isArray(physics.constraints) && physics.constraints.length > 0) {\n for (let i = physics.constraints.length - 1; i >= 0; i--) {\n try {\n const constraint = physics.constraints[i];\n if (constraint) {\n physics.world.removeConstraint(constraint);\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error removing constraint ' + (i) + ':', e);\n }\n }\n physics.constraints.length = 0;\n }\n\n // 注意:不在这里销毁 world,因为它会在后面统一清理\n }\n }\n\n // 清除引用\n meshData.physics = null;\n } catch (physicsError) {\n console.error('[MMDPlayerBase] ❌ Error cleaning up physics:', physicsError);\n console.error('[MMDPlayerBase] Physics error stack:', (physicsError as Error).stack);\n }\n }\n\n // 清理 AnimationMixer (从 meshData 中获取)\n if (meshData?.mixer) {\n meshData.mixer.stopAllAction();\n meshData.mixer.uncacheRoot(meshData.mesh || mesh);\n // 清理所有 clips 的引用\n const clips = meshData.mixer._actions || [];\n clips.forEach((action: any) => {\n if (action._clip) {\n action._clip = null;\n }\n });\n meshData.mixer = null;\n }\n\n // 清理 audio 引用 (从 meshData 中获取)\n if (meshData?.audio) {\n if (meshData.audio.isPlaying) {\n meshData.audio.stop();\n }\n if (meshData.audio.source) {\n meshData.audio.disconnect();\n }\n if (meshData.audio.buffer) {\n meshData.audio.buffer = null;\n }\n meshData.audio = null;\n }\n });\n // 清空数组\n meshes.length = 0;\n }\n\n // 🎯 核心修复:使用捕获的物理引擎组件引用进行清理\n const Ammo = (window as any).Ammo;\n if (Ammo && Ammo.destroy) {\n const components = physicsComponentsRef.current;\n\n // 按照正确的顺序销毁 Ammo 对象(与创建顺序相反)\n // 创建顺序:config -> dispatcher -> cache -> solver -> world\n // 销毁顺序:world -> solver -> cache -> dispatcher -> config\n\n // 销毁所有 worlds\n if (components.worlds.length > 0) {\n for (let i = components.worlds.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.worlds[i]);\n } catch (e) {\n console.error('[MMDPlayerBase] ❌ Error destroying world #' + (i) + ':', e);\n }\n }\n components.worlds.length = 0;\n }\n\n // 销毁所有 solvers\n if (components.solvers.length > 0) {\n for (let i = components.solvers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.solvers[i]);\n } catch (e) {\n console.error('[MMDPlayerBase] ❌ Error destroying solver #' + (i) + ':', e);\n }\n }\n components.solvers.length = 0;\n }\n\n // 销毁所有 caches\n if (components.caches.length > 0) {\n for (let i = components.caches.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.caches[i]);\n } catch (e) {\n console.error('[MMDPlayerBase] ❌ Error destroying cache #' + (i) + ':', e);\n }\n }\n components.caches.length = 0;\n }\n\n // 销毁所有 dispatchers\n if (components.dispatchers.length > 0) {\n for (let i = components.dispatchers.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.dispatchers[i]);\n } catch (e) {\n console.error('[MMDPlayerBase] ❌ Error destroying dispatcher #' + (i) + ':', e);\n }\n }\n components.dispatchers.length = 0;\n }\n\n // 销毁所有 configs\n if (components.configs.length > 0) {\n for (let i = components.configs.length - 1; i >= 0; i--) {\n try {\n Ammo.destroy(components.configs[i]);\n } catch (e) {\n console.error('[MMDPlayerBase] ❌ Error destroying config #' + (i) + ':', e);\n }\n }\n components.configs.length = 0;\n }\n } else {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available, skipping physics cleanup');\n }\n\n // 清理 sharedPhysics 和 masterPhysics(如果存在)\n if ((helperRef.current as any).sharedPhysics) {\n (helperRef.current as any).sharedPhysics = null;\n }\n if ((helperRef.current as any).masterPhysics) {\n (helperRef.current as any).masterPhysics = null;\n }\n\n // 清理 helper 自身\n if (helperRef.current.dispose) {\n helperRef.current.dispose();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up AnimationHelper:', e);\n }\n helperRef.current = null;\n // 🎵 重置音频系统就绪状态\n setIsAudioSystemReady(false);\n }\n\n // 清理 AnimationClip\n animationClipRef.current = null;\n\n // 清理坐标轴\n if (axesHelperRef.current) {\n if (sceneRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n }\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n\n // 清理场景中的所有对象 - 增强版\n if (sceneRef.current) {\n sceneRef.current.traverse((object) => {\n // 清理几何体和材质\n if (object instanceof THREE.Mesh || object instanceof THREE.SkinnedMesh) {\n // 清理骨骼相关(SkinnedMesh)\n if (object instanceof THREE.SkinnedMesh) {\n if (object.skeleton) {\n object.skeleton.dispose();\n }\n // 清理绑定矩阵\n if (object.bindMatrix) {\n object.bindMatrix = null as any;\n }\n if (object.bindMatrixInverse) {\n object.bindMatrixInverse = null as any;\n }\n }\n\n // 清理几何体\n if (object.geometry) {\n object.geometry.dispose();\n object.geometry = null as any;\n }\n\n // 清理材质和纹理\n if (object.material) {\n const disposeMaterial = (m: THREE.Material) => {\n // 清理所有可能的纹理类型(包括 MMD 特有的)\n const textureProps = [\n 'map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap',\n 'envMap', 'alphaMap', 'emissiveMap', 'displacementMap',\n 'roughnessMap', 'metalnessMap', 'aoMap',\n // MMD 特有纹理\n 'gradientMap', 'toonMap', 'sphereMap', 'matcap'\n ];\n\n textureProps.forEach(prop => {\n // @ts-ignore\n if (m[prop] && m[prop].dispose) {\n // @ts-ignore\n m[prop].dispose();\n // @ts-ignore\n m[prop] = null;\n }\n });\n\n // 清理材质本身\n m.dispose();\n };\n\n if (Array.isArray(object.material)) {\n object.material.forEach(disposeMaterial);\n } else {\n disposeMaterial(object.material);\n }\n object.material = null as any;\n }\n }\n\n // 清理 AudioListener\n if (object instanceof THREE.AudioListener) {\n try {\n // @ts-ignore\n if (object.context && object.context.state !== 'closed') {\n // @ts-ignore\n object.context.close?.();\n }\n } catch (e) {\n console.warn('[MMDPlayerBase] Error closing AudioContext:', e);\n }\n }\n\n // 清理灯光的阴影贴图\n if (object instanceof THREE.Light) {\n if (object.shadow && object.shadow.map) {\n object.shadow.map.dispose();\n object.shadow.map = null as any;\n }\n }\n });\n\n // 清空场景\n sceneRef.current.clear();\n sceneRef.current = null;\n }\n\n // 清理 Controls\n if (controlsRef.current) {\n controlsRef.current.dispose();\n controlsRef.current = null;\n }\n\n // 清理 Renderer - 增强版\n if (rendererRef.current) {\n try {\n // 清理 OutlineEffect\n outlineEffectRef.current = null;\n\n // 清理 FX 资源\n if (multiFXAdapterRef.current) {\n multiFXAdapterRef.current.clear();\n multiFXAdapterRef.current = null;\n }\n fxEffectRef.current = null;\n fxAdapterRef.current = null;\n\n // 清理所有渲染目标\n const renderer = rendererRef.current;\n\n // 清理渲染列表\n if (renderer.renderLists) {\n renderer.renderLists.dispose();\n }\n\n // 清理渲染器信息\n if (renderer.info && renderer.info.programs) {\n renderer.info.programs.forEach((program: any) => {\n if (program && program.destroy) {\n program.destroy();\n }\n });\n }\n\n // 清理 WebGL 程序\n if (renderer.getContext) {\n const gl = renderer.getContext();\n const numTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n for (let unit = 0; unit < numTextureUnits; ++unit) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n }\n }\n\n // Dispose 渲染器\n renderer.dispose();\n\n // 强制失去 WebGL 上下文\n renderer.forceContextLoss();\n\n // 从 DOM 中移除 canvas\n if (containerRef.current && renderer.domElement) {\n if (containerRef.current.contains(renderer.domElement)) {\n containerRef.current.removeChild(renderer.domElement);\n }\n }\n\n // 清空 canvas 引用\n if (renderer.domElement) {\n renderer.domElement.width = 1;\n renderer.domElement.height = 1;\n }\n\n } catch (e) {\n console.warn('[MMDPlayerBase] Error cleaning up renderer:', e);\n }\n rendererRef.current = null;\n }\n\n // 重置 Camera\n cameraRef.current = null;\n\n // 重置 Clock\n clockRef.current = new THREE.Clock();\n\n // 重置时长\n durationRef.current = 0;\n\n console.log('[MMDPlayerBase] Cleanup completed');\n\n // 🎯 关键修复:还原全局 Ammo 对象,防止内存泄漏和性能下降\n const Ammo = (window as any).Ammo;\n if (Ammo && originalAmmoMethodsRef.current.btDefaultCollisionConfiguration) {\n console.log('[MMDPlayerBase] Restoring original Ammo methods');\n const originals = originalAmmoMethodsRef.current;\n\n if (originals.btDefaultCollisionConfiguration) Ammo.btDefaultCollisionConfiguration = originals.btDefaultCollisionConfiguration;\n if (originals.btCollisionDispatcher) Ammo.btCollisionDispatcher = originals.btCollisionDispatcher;\n if (originals.btDbvtBroadphase) Ammo.btDbvtBroadphase = originals.btDbvtBroadphase;\n if (originals.btSequentialImpulseConstraintSolver) Ammo.btSequentialImpulseConstraintSolver = originals.btSequentialImpulseConstraintSolver;\n if (originals.btDiscreteDynamicsWorld) Ammo.btDiscreteDynamicsWorld = originals.btDiscreteDynamicsWorld;\n\n // 清空备份引用\n originalAmmoMethodsRef.current = {};\n }\n\n // 提示浏览器可以进行垃圾回收(只在开发环境)\n if (typeof window !== 'undefined' && 'gc' in window) {\n try {\n // @ts-ignore\n window.gc();\n } catch (e) {\n // gc 不可用时忽略\n }\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resources.modelPath, resources.motionPath, resources.stageModelPath, stage.enablePhysics, stage.physicsPath]); // 🎯 优化:音频路径变化不再触发完整重载\n\n // 🎯 独立处理音频加载,支持在不重载模型的情况下切换歌曲\n useEffect(() => {\n // 🎵 等待音频系统就绪(audioListenerRef 和 helperRef 都已设置)\n if (!isAudioSystemReady || !audioListenerRef.current || !helperRef.current || !resources.audioPath) {\n console.log('[MMDPlayerBase] 🎵 Audio loading skipped:', {\n isAudioSystemReady,\n hasListener: !!audioListenerRef.current,\n hasHelper: !!helperRef.current,\n audioPath: resources.audioPath\n });\n return;\n }\n\n const listener = audioListenerRef.current;\n const helper = helperRef.current;\n let retryTimer: NodeJS.Timeout | null = null;\n\n console.log('[MMDPlayerBase] 🎵 Starting audio load for:', resources.audioPath);\n\n // 1. 如果已有音频,先清理\n if (audioRef.current) {\n const oldSound = audioRef.current;\n if (oldSound.isPlaying) oldSound.stop();\n if (oldSound.parent) oldSound.parent.remove(oldSound);\n audioRef.current = null;\n }\n\n // 2. 加载新音频\n audioLoaderRef.current.load(\n resources.audioPath,\n (buffer) => {\n if (!audioListenerRef.current) return;\n\n const sound = new THREE.Audio(listener);\n sound.setBuffer(buffer);\n sound.setLoop(loopRef.current);\n sound.setVolume(volume);\n audioRef.current = sound;\n\n helper.add(sound, {\n delay: 0.0,\n duration: buffer.duration\n } as any);\n\n console.log('[MMDPlayerBase] 🎵 Audio loaded, isPlayingRef:', isPlayingRef.current, 'autoPlay:', autoPlay, 'isReadyRef:', isReadyRef.current);\n\n // 🎯 核心修复:解决音频加载竞态条件\n // 如果当前正在播放,立即播放音频\n if (isPlayingRef.current) {\n console.log('[MMDPlayerBase] 🎵 Playing audio immediately (isPlayingRef=true)');\n sound.play();\n } \n // 如果设置了autoPlay,延迟一小段时间后检查并播放\n // 这样可以处理音频加载完成早于 autoPlay 触发的情况\n else if (autoPlay) {\n console.log('[MMDPlayerBase] 🎵 Audio loaded before autoPlay triggered, waiting for play state...');\n // 延迟150ms再次检查,给autoPlay的setTimeout(100ms)足够时间\n retryTimer = setTimeout(() => {\n if (isPlayingRef.current && audioRef.current && !audioRef.current.isPlaying) {\n console.log('[MMDPlayerBase] 🎵 Playing audio after delay (autoPlay=true)');\n audioRef.current.play();\n }\n }, 150);\n }\n },\n undefined,\n (err) => console.error('[MMDPlayerBase] Failed to load audio track:', err)\n );\n\n // 清理函数\n return () => {\n if (retryTimer) {\n clearTimeout(retryTimer);\n }\n };\n }, [resources.audioPath, volume, autoPlay, isAudioSystemReady]); // 🎵 添加 isAudioSystemReady 依赖\n\n // 监听 showAxes 变化,动态添加/移除坐标轴\n // 坐标轴动态切换\n useEffect(() => {\n if (!sceneRef.current) return;\n\n if (showAxes && !axesHelperRef.current) {\n const axesHelper = new THREE.AxesHelper(20);\n sceneRef.current.add(axesHelper);\n axesHelperRef.current = axesHelper;\n } else if (!showAxes && axesHelperRef.current) {\n sceneRef.current.remove(axesHelperRef.current);\n axesHelperRef.current.dispose();\n axesHelperRef.current = null;\n }\n }, [showAxes]);\n\n // 监听 loop 变化,更新循环状态\n useEffect(() => {\n loopRef.current = loop;\n\n // 同步更新音频的循环状态\n if (audioRef.current && audioRef.current.buffer) {\n audioRef.current.setLoop(loop);\n }\n }, [loop]);\n\n // 监听渲染特效配置变化\n useEffect(() => {\n if (outlineEffectRef.current) {\n // @ts-ignore\n outlineEffectRef.current.defaultThickness = outlineOptions.thickness ?? 0.003;\n // @ts-ignore\n outlineEffectRef.current.defaultColor = new THREE.Color(outlineOptions.color ?? '#000000').toArray();\n\n // 同步更新场景中所有现有材质的描边参数\n if (sceneRef.current) {\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n materials.forEach((m) => {\n if (m.userData && m.userData.outlineParameters) {\n if (outlineOptions.thickness !== undefined) {\n m.userData.outlineParameters.thickness = outlineOptions.thickness;\n }\n if (outlineOptions.color !== undefined) {\n m.userData.outlineParameters.color = new THREE.Color(outlineOptions.color).toArray();\n }\n }\n });\n }\n });\n }\n }\n }, [outlineOptions.thickness, outlineOptions.color]);\n\n // 监听 stage 变化,动态更新场景属性(不触发完整重载)\n useEffect(() => {\n if (!isReadyRef.current) return;\n\n // 更新背景\n if (sceneRef.current) {\n if (stage.backgroundColor) {\n if (stage.backgroundColor === 'transparent') {\n sceneRef.current.background = null;\n } else {\n sceneRef.current.background = new THREE.Color(stage.backgroundColor);\n }\n } else if (stage.backgroundImage) {\n const textureLoader = new THREE.TextureLoader();\n textureLoader.load(stage.backgroundImage, (texture) => {\n if (sceneRef.current) sceneRef.current.background = texture;\n });\n }\n }\n\n // 更新灯光强度\n if (sceneRef.current) {\n // sceneRef.current.traverse((obj) => {\n // if (obj instanceof THREE.AmbientLight && stage.ambientLightIntensity !== undefined) {\n // obj.intensity = stage.ambientLightIntensity;\n // }\n // if (obj instanceof THREE.DirectionalLight) {\n // if (stage.directionalLightIntensity !== undefined) {\n // obj.intensity = stage.directionalLightIntensity;\n // }\n // // 更新方向光位置\n // if (stage.directionalLightPosition) {\n // const pos = stage.directionalLightPosition as any;\n // obj.position.set(pos.x, pos.y, pos.z);\n // }\n // }\n // if (obj instanceof THREE.HemisphereLight && stage.hemisphereLightIntensity !== undefined) {\n // obj.intensity = stage.hemisphereLightIntensity;\n // // 更新半球光颜色\n // if (stage.hemisphereLightSkyColor !== undefined) {\n // obj.color.set(stage.hemisphereLightSkyColor as any);\n // }\n // if (stage.hemisphereLightGroundColor !== undefined) {\n // obj.groundColor.set(stage.hemisphereLightGroundColor as any);\n // }\n // }\n // });\n }\n\n // 更新相机和目标\n if (cameraRef.current && stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n cameraRef.current.position.set(pos.x, pos.y, pos.z);\n }\n if (controlsRef.current && stage.cameraTarget) {\n const target = stage.cameraTarget as any;\n controlsRef.current.target.set(target.x, target.y, target.z);\n controlsRef.current.update();\n }\n }, [\n stage.backgroundColor,\n stage.backgroundImage,\n stage.ambientLightIntensity,\n stage.directionalLightIntensity,\n stage.directionalLightPosition,\n stage.hemisphereLightIntensity,\n stage.hemisphereLightSkyColor,\n stage.hemisphereLightGroundColor,\n stage.cameraPosition,\n stage.cameraTarget\n ]);\n\n // 渲染循环\n const animate = () => {\n animationIdRef.current = requestAnimationFrame(animate);\n\n if (rendererRef.current && sceneRef.current && cameraRef.current) {\n if (isReadyRef.current && isPlayingRef.current && helperRef.current) {\n const delta = clockRef.current.getDelta();\n helperRef.current.update(delta);\n\n // 触发时间更新回调(使用模除后的时间)\n const elapsed = clockRef.current.elapsedTime;\n const duration = durationRef.current;\n const currentTime = duration > 0 && loopRef.current ? (elapsed % duration) : elapsed;\n latestCallbacks.current.onTimeUpdate?.(currentTime);\n\n // 简单的结束检测(非循环模式)\n if (!loopRef.current && duration > 0 && elapsed >= duration) {\n isPlayingRef.current = false;\n clockRef.current.stop();\n latestCallbacks.current.onEnded?.();\n }\n }\n\n // 简化渲染(与 demo 一致,不使用 OutlineEffect)\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n };\n\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n position: 'relative',\n backgroundColor: stage.backgroundColor === 'transparent' ? 'transparent' : (stage.backgroundColor || '#000'),\n ...style\n }}\n />\n );\n});\n\nMMDPlayerBase.displayName = 'MMDPlayerBase';\n","import React from 'react';\nimport { Play, Pause, Maximize, Minimize, Settings, Grid3x3, Repeat, Repeat1, SkipBack, SkipForward, Camera } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface ControlPanelProps {\n isPlaying: boolean;\n isFullscreen: boolean;\n isLooping: boolean; // 是否单节点循环播放\n isListLooping?: boolean; // 是否列表循环(播放列表专用)\n isCameraManual?: boolean;\n showSettings?: boolean;\n showAxes?: boolean; // 坐标轴是否显示\n showPrevNext?: boolean; // 是否显示上一个/下一个按钮\n title?: string;\n subtitle?: string; // 副标题 (如 \"1 / 3\")\n \n onPlayPause: () => void;\n onToggleFullscreen: () => void;\n onToggleLoop: () => void; // 切换单节点循环播放\n onToggleListLoop?: () => void; // 切换列表循环\n onToggleAxes?: () => void; // 切换坐标轴显示\n onOpenSettings?: () => void;\n onPrevious?: () => void; // 上一个\n onNext?: () => void; // 下一个\n onResetCamera?: () => void; // 重置相机\n}\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n isFullscreen,\n isLooping,\n isListLooping,\n isCameraManual = false,\n showSettings,\n showAxes = false,\n showPrevNext = false,\n title,\n subtitle,\n onPlayPause,\n onToggleFullscreen,\n onToggleLoop,\n onToggleListLoop,\n onToggleAxes,\n onOpenSettings,\n onPrevious,\n onNext,\n onResetCamera,\n}) => {\n return (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent p-4 transition-opacity duration-300 hover:opacity-100\">\n <div className=\"flex items-center justify-between text-white\">\n <div className=\"flex items-center gap-2\">\n {/* 上一个按钮 */}\n {showPrevNext && onPrevious && (\n <button \n onClick={onPrevious}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"上一个\"\n >\n <SkipBack size={20} />\n </button>\n )}\n\n {/* 播放/暂停按钮 */}\n <button \n onClick={onPlayPause}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isPlaying ? '暂停' : '播放'}\n >\n {isPlaying ? <Pause size={24} /> : <Play size={24} />}\n </button>\n\n {/* 下一个按钮 */}\n {showPrevNext && onNext && (\n <button \n onClick={onNext}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"下一个\"\n >\n <SkipForward size={20} />\n </button>\n )}\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* 标题和副标题 */}\n {(title || subtitle) && (\n <div className=\"hidden text-sm font-medium opacity-80 md:block\">\n {title}\n {subtitle && <span className=\"ml-2 text-xs opacity-60\">{subtitle}</span>}\n </div>\n )}\n\n {/* 列表循环切换(仅播放列表模式) */}\n {onToggleListLoop && (\n <button \n onClick={onToggleListLoop}\n className={clsx('rounded-full p-2 transition-colors', isListLooping ? 'bg-green-500/30 hover:bg-green-500/50' : 'hover:bg-white/20')}\n title={isListLooping ? '列表循环:开启' : '列表循环:关闭'}\n >\n <Repeat size={20} />\n </button>\n )}\n\n {/* 单节点循环切换 */}\n <button \n onClick={onToggleLoop}\n className={clsx('rounded-full p-2 transition-colors', isLooping ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20')}\n title={isLooping ? '单曲循环:开启' : '单曲循环:关闭'}\n >\n <Repeat1 size={20} />\n </button>\n\n {/* 相机重置按钮 */}\n {isCameraManual && onResetCamera && (\n <button \n onClick={onResetCamera}\n className=\"rounded-full p-2 bg-blue-500/30 text-blue-400 hover:bg-blue-500/50 hover:text-blue-300 transition-all animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera size={20} />\n </button>\n )}\n\n {/* 坐标轴切换 */}\n {onToggleAxes && (\n <button \n onClick={onToggleAxes}\n className={clsx('rounded-full p-2 transition-colors', showAxes ? 'bg-blue-500/30 hover:bg-blue-500/50' : 'hover:bg-white/20')}\n title=\"显示/隐藏坐标轴\"\n >\n <Grid3x3 size={20} />\n </button>\n )}\n\n {/* 设置 */}\n {showSettings && (\n <button \n onClick={onOpenSettings}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title=\"资源设置\"\n >\n <Settings size={20} />\n </button>\n )}\n\n {/* 全屏 */}\n <button \n onClick={onToggleFullscreen}\n className=\"rounded-full p-2 hover:bg-white/20 transition-colors\"\n title={isFullscreen ? '退出全屏' : '全屏'}\n >\n {isFullscreen ? <Minimize size={20} /> : <Maximize size={20} />}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Check, Image as ImageIcon, Music, Video, User } from 'lucide-react';\nimport { MMDResourceItem, MMDResourceOptions, ResourceOption } from '../types';\nimport { clsx } from 'clsx';\n\ninterface SettingsPanelProps {\n mode: 'list' | 'options';\n \n // List Mode Props\n items?: MMDResourceItem[];\n currentId?: string;\n onSelectId?: (id: string) => void;\n \n // Options Mode Props\n options?: MMDResourceOptions;\n currentSelection?: {\n modelId?: string;\n motionId?: string;\n cameraId?: string;\n audioId?: string;\n stageId?: string;\n };\n onSelectOption?: (type: 'models'|'motions'|'cameras'|'audios'|'stages', id: string) => void;\n \n onClose: () => void;\n}\n\nexport const SettingsPanel: React.FC<SettingsPanelProps> = ({\n mode,\n items,\n currentId,\n onSelectId,\n options,\n currentSelection,\n onSelectOption,\n onClose,\n}) => {\n \n const renderListMode = () => {\n if (!items) return null;\n return (\n <div className=\"grid grid-cols-1 gap-2 p-4 sm:grid-cols-2\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => onSelectId?.(item.id)}\n className={clsx('group flex items-center gap-3 rounded-lg p-3 transition-all', currentId === item.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10')}\n >\n <div className=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded bg-black/20 overflow-hidden\">\n {item.thumbnail ? (\n <img src={item.thumbnail} alt={item.name} className=\"h-full w-full object-cover\" />\n ) : (\n <Video size={20} className=\"opacity-50\" />\n )}\n </div>\n <div className=\"flex-1 text-left\">\n <div className={clsx('font-medium', currentId === item.id ? 'text-blue-400' : 'text-white')}>\n {item.name}\n </div>\n {item.description && (\n <div className=\"text-xs text-white/50 truncate\">{item.description}</div>\n )}\n </div>\n {currentId === item.id && <Check size={16} className=\"text-blue-400\" />}\n </button>\n ))}\n </div>\n );\n };\n\n const renderOptionGroup = (\n title: string, \n icon: React.ReactNode, \n type: 'models'|'motions'|'cameras'|'audios'|'stages',\n list: ResourceOption[] = [],\n currentVal?: string\n ) => {\n if (!list || list.length === 0) return null;\n \n return (\n <div className=\"mb-6\">\n <div className=\"mb-3 flex items-center gap-2 text-sm font-medium text-white/70\">\n {icon}\n <span>{title}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {list.map(opt => (\n <button\n key={opt.id}\n onClick={() => onSelectOption?.(type, opt.id)}\n className={clsx('relative flex flex-col items-center gap-2 rounded-lg p-2 text-center transition-all', currentVal === opt.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10')}\n >\n {opt.thumbnail ? (\n <img src={opt.thumbnail} alt={opt.name} className=\"h-16 w-full rounded object-cover bg-black/20\" />\n ) : (\n <div className=\"flex h-16 w-full items-center justify-center rounded bg-black/20\">\n <div className=\"text-xs opacity-30\">{opt.name.slice(0, 2)}</div>\n </div>\n )}\n <div className={clsx('w-full truncate text-xs', currentVal === opt.id ? 'text-blue-400' : 'text-white/80')}>\n {opt.name}\n </div>\n {currentVal === opt.id && (\n <div className=\"absolute top-1 right-1 rounded-full bg-blue-500 p-0.5\">\n <Check size={10} className=\"text-white\" />\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n };\n\n const renderOptionsMode = () => {\n if (!options) return null;\n return (\n <div className=\"p-4\">\n {renderOptionGroup('模型', <User size={16} />, 'models', options.models, currentSelection?.modelId)}\n {renderOptionGroup('动作', <Video size={16} />, 'motions', options.motions, currentSelection?.motionId)}\n {renderOptionGroup('镜头', <ImageIcon size={16} />, 'cameras', options.cameras, currentSelection?.cameraId)}\n {renderOptionGroup('音频', <Music size={16} />, 'audios', options.audios, currentSelection?.audioId)}\n {renderOptionGroup('舞台', <ImageIcon size={16} />, 'stages', options.stages, currentSelection?.stageId)}\n </div>\n );\n };\n\n return (\n <div className=\"absolute right-0 top-0 h-full w-full max-w-sm transform bg-[#1a1a1e]/95 backdrop-blur-md shadow-2xl transition-transform duration-300 ease-in-out overflow-y-auto z-20 border-l border-white/10\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between border-b border-white/10 bg-[#1a1a1e]/95 p-4 backdrop-blur-md\">\n <h2 className=\"text-lg font-semibold text-white\">\n {mode === 'list' ? '播放列表' : '自定义场景'}\n </h2>\n <button \n onClick={onClose}\n className=\"rounded-full p-2 text-white/50 hover:bg-white/10 hover:text-white\"\n >\n <X size={20} />\n </button>\n </div>\n \n <div className=\"pb-20\">\n {mode === 'list' ? renderListMode() : renderOptionsMode()}\n </div>\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\n\ninterface MMDPlayerEnhancedDebugInfoProps {\n isPlaying: boolean;\n isLooping: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n isLoading: boolean;\n currentResourceId?: string;\n currentResourceName?: string;\n mode: 'single' | 'list' | 'options';\n totalResources: number;\n}\n\nexport const MMDPlayerEnhancedDebugInfo: React.FC<MMDPlayerEnhancedDebugInfoProps> = ({\n isPlaying,\n isLooping,\n isFullscreen,\n showAxes,\n isLoading,\n currentResourceId,\n currentResourceName,\n mode,\n totalResources,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎮 MMDPlayerEnhanced Debug\n </h3>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">循环:</span>\n <StatusBadge active={isLooping} label={isLooping ? 'On' : 'Off'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 资源信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">资源信息</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">模式:</span>\n <span className=\"text-blue-400 uppercase\">{mode}</span>\n </div>\n {mode === 'list' && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">总数:</span>\n <span className=\"text-green-400\">{totalResources}</span>\n </div>\n {currentResourceId && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px]\">当前资源</div>\n <div className=\"text-white truncate\">{currentResourceName || currentResourceId}</div>\n <div className=\"text-gray-500 text-[10px] mt-1 truncate\">ID: {currentResourceId}</div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={clsx('h-full transition-all duration-300', (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500')}\n style={{\n width: (Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)) + '%',\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={clsx('px-2 py-0.5 rounded text-[10px] font-bold', active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400')}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { SettingsPanel } from './SettingsPanel';\nimport { MMDPlayerEnhancedDebugInfo } from './MMDPlayerEnhancedDebugInfo';\nimport { \n MMDPlayerEnhancedProps,\n MMDResources, \n MMDResourceItem, \n MMDResourceOptions, \n MMDPlayerBaseRef \n} from '../types';\n\nexport const MMDPlayerEnhanced: React.FC<MMDPlayerEnhancedProps> = ({\n resources: propResources,\n resourcesList,\n resourceOptions,\n defaultResourceId,\n defaultSelection,\n stage,\n autoPlay = false,\n loop = true,\n volume: initialVolume = 1.0,\n muted: initialMuted = false,\n mobileOptimization,\n showDebugInfo = false,\n className,\n style,\n onLoad,\n onPlay,\n onPause,\n onEnded,\n ...rest\n}) => {\n // 模式判断\n const mode = resourcesList ? 'list' : (resourceOptions ? 'options' : 'single');\n \n // 内部状态\n const [currentResources, setCurrentResources] = useState<MMDResources | undefined>(propResources);\n const [currentId, setCurrentId] = useState<string | undefined>(defaultResourceId);\n const [selection, setSelection] = useState(defaultSelection || {});\n \n // 播放器状态\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [volume, setVolume] = useState(initialVolume);\n const [isMuted, setIsMuted] = useState(initialMuted);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showAxes, setShowAxes] = useState(false); // 坐标轴显示状态\n const [isLooping, setIsLooping] = useState(loop); // 循环状态\n \n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 初始化资源逻辑\n useEffect(() => {\n if (mode === 'list' && resourcesList) {\n const targetId = currentId || resourcesList[0]?.id;\n const item = resourcesList.find(i => i.id === targetId);\n if (item) {\n setCurrentResources(item.resources);\n setCurrentId(item.id);\n }\n } else if (mode === 'options' && resourceOptions) {\n // 构建 Resources 对象\n const res: MMDResources = { modelPath: '' };\n \n if (selection.modelId) {\n const m = resourceOptions.models.find(o => o.id === selection.modelId);\n if (m) res.modelPath = m.path;\n } else if (resourceOptions.models.length > 0) {\n // 默认选第一个模型\n const firstModel = resourceOptions.models[0];\n if (firstModel) {\n res.modelPath = firstModel.path;\n setSelection(s => ({ ...s, modelId: firstModel.id }));\n }\n }\n \n if (selection.motionId) {\n const m = resourceOptions.motions.find(o => o.id === selection.motionId);\n if (m) res.motionPath = m.path;\n }\n \n // ... 其他选项映射\n if (selection.cameraId) {\n const c = resourceOptions.cameras?.find(o => o.id === selection.cameraId);\n if (c) res.cameraPath = c.path;\n }\n\n if (selection.audioId) {\n const a = resourceOptions.audios?.find(o => o.id === selection.audioId);\n if (a) res.audioPath = a.path;\n }\n \n if (selection.stageId) {\n const s = resourceOptions.stages?.find(o => o.id === selection.stageId);\n if (s) res.stageModelPath = s.path;\n }\n\n setCurrentResources(res);\n } else {\n setCurrentResources(propResources);\n }\n }, [mode, resourcesList, resourceOptions, currentId, selection, propResources]);\n\n // 处理全屏\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n \n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch(err => {\n console.error('Error attempting to enable fullscreen: ' + (err.message));\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化 (Esc 退出)\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 回调处理\n const handlePlayPause = () => {\n if (isPlaying) {\n playerRef.current?.pause();\n } else {\n playerRef.current?.play();\n }\n setIsPlaying(!isPlaying);\n };\n \n const handleListSelect = (id: string) => {\n setCurrentId(id);\n setIsPlaying(true); // 切换后自动播放\n setShowSettings(false); // 手机端可能需要关闭\n };\n \n const handleOptionSelect = (type: string, id: string) => {\n setSelection(prev => {\n const next = { ...prev };\n if (type === 'models') next.modelId = id;\n if (type === 'motions') next.motionId = id;\n if (type === 'cameras') next.cameraId = id;\n if (type === 'audios') next.audioId = id;\n if (type === 'stages') next.stageId = id;\n return next;\n });\n };\n\n if (!currentResources) {\n return <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">No Resources Configured</div>;\n }\n\n return (\n <div \n ref={containerRef}\n className={clsx('relative overflow-hidden bg-black group flex', className)}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 */}\n {/* Key 很重要:当资源变化时,通过改变 key 强制重置 BasePlayer,实现最彻底的清理和重新加载 */}\n <MMDPlayerBase\n key={mode === 'list' ? currentId : JSON.stringify(currentResources)}\n ref={playerRef}\n resources={currentResources}\n stage={stage}\n autoPlay={autoPlay} // 注意:这里 autoPlay 只在 mount 时生效\n loop={isLooping}\n volume={volume}\n muted={isMuted}\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n onLoad?.();\n if (isPlaying) playerRef.current?.play();\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlay?.();\n }}\n onPause={() => {\n setIsPlaying(false);\n onPause?.();\n }}\n onEnded={() => {\n setIsPlaying(false);\n onEnded?.();\n }}\n {...rest}\n />\n\n {/* 加载遮罩 */}\n {isLoading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n </div>\n )}\n\n {/* 控制栏 - 鼠标悬停或暂停时显示 */}\n <div className={clsx('transition-opacity duration-300', isPlaying && !showSettings ? 'opacity-0 group-hover:opacity-100' : 'opacity-100')}>\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n showSettings={mode !== 'single'}\n showAxes={showAxes}\n title={mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined}\n onPlayPause={handlePlayPause}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowSettings(true)}\n />\n </div>\n\n {/* 设置面板 */}\n {showSettings && (mode === 'list' || mode === 'options') && (\n <SettingsPanel\n mode={mode}\n items={resourcesList}\n currentId={currentId}\n onSelectId={handleListSelect}\n options={resourceOptions}\n currentSelection={selection}\n onSelectOption={handleOptionSelect}\n onClose={() => setShowSettings(false)}\n />\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto\">\n <MMDPlayerEnhancedDebugInfo\n isPlaying={isPlaying}\n isLooping={isLooping}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n isLoading={isLoading}\n currentResourceId={currentId}\n currentResourceName={\n mode === 'list' ? resourcesList?.find(i => i.id === currentId)?.name : undefined\n }\n mode={mode}\n totalResources={resourcesList?.length || 1}\n />\n </div>\n )}\n </div>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { MMDPlaylistNode } from '../types';\nimport { clsx } from 'clsx';\n\ninterface MMDPlaylistDebugInfoProps {\n playlistName: string;\n currentIndex: number;\n currentNode: MMDPlaylistNode;\n totalNodes: number;\n isPlaying: boolean;\n isListLooping: boolean;\n isNodeLooping: boolean;\n preloadStrategy: 'none' | 'next' | 'all';\n isLoading: boolean;\n isFullscreen: boolean;\n showAxes: boolean;\n preloadedNodes: number[];\n}\n\nexport const MMDPlaylistDebugInfo: React.FC<MMDPlaylistDebugInfoProps> = ({\n playlistName,\n currentIndex,\n currentNode,\n totalNodes,\n isPlaying,\n isListLooping,\n isNodeLooping,\n preloadStrategy,\n isLoading,\n isFullscreen,\n showAxes,\n preloadedNodes,\n}) => {\n const [memoryInfo, setMemoryInfo] = useState<any>(null);\n\n useEffect(() => {\n const timer = setInterval(() => {\n // 获取内存信息(仅在Chrome中可用)\n // @ts-ignore\n if (performance.memory) {\n // @ts-ignore\n const used = (performance.memory.usedJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const total = (performance.memory.totalJSHeapSize / 1048576).toFixed(1);\n // @ts-ignore\n const limit = (performance.memory.jsHeapSizeLimit / 1048576).toFixed(1);\n setMemoryInfo({ used, total, limit });\n }\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n return (\n <div className=\"text-white text-xs font-mono\">\n <h3 className=\"text-sm font-bold mb-3 pb-2 border-b border-gray-700\">\n 🎭 MMDPlaylist Debug\n </h3>\n\n {/* 播放列表信息 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放列表</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"text-white truncate\">\n {playlistName}\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">进度:</span>\n <span className=\"text-blue-400\">\n {currentIndex + 1} / {totalNodes}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">列表循环:</span>\n <StatusBadge active={isListLooping} label={isListLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 当前节点 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">当前节点</h4>\n <div className=\"p-2 bg-gray-800 rounded space-y-1\">\n <div className=\"text-white font-semibold truncate\">\n {currentNode.name}\n </div>\n <div className=\"text-gray-500 text-[10px] truncate\">\n ID: {currentNode.id}\n </div>\n {currentNode.duration && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">时长:</span>\n <span className=\"text-green-400\">{currentNode.duration}s</span>\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">节点循环:</span>\n <StatusBadge active={isNodeLooping} label={isNodeLooping ? 'On' : 'Off'} />\n </div>\n </div>\n </div>\n\n {/* 播放状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">播放状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">播放中:</span>\n <StatusBadge active={isPlaying} label={isPlaying ? 'Playing' : 'Paused'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">加载中:</span>\n <StatusBadge active={isLoading} label={isLoading ? 'Loading' : 'Ready'} />\n </div>\n </div>\n </div>\n\n {/* 预加载策略 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">预加载策略</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">策略:</span>\n <span className={clsx('px-2 py-0.5 rounded text-[10px] font-bold uppercase', preloadStrategy === 'all' ? 'bg-red-600 text-white' :\n preloadStrategy === 'next' ? 'bg-yellow-600 text-white' :\n 'bg-gray-700 text-gray-400')}>\n {preloadStrategy}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">已预加载:</span>\n <span className=\"text-purple-400\">{preloadedNodes.length}</span>\n </div>\n {preloadedNodes.length > 0 && (\n <div className=\"mt-2 p-2 bg-gray-800 rounded\">\n <div className=\"text-gray-400 text-[10px] mb-1\">预加载节点索引</div>\n <div className=\"flex flex-wrap gap-1\">\n {preloadedNodes.map((idx) => (\n <span\n key={idx}\n className={clsx('px-1.5 py-0.5 rounded text-[10px]', idx === currentIndex\n ? 'bg-green-600 text-white font-bold'\n : 'bg-gray-700 text-gray-300')}\n >\n {idx}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 视图状态 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">视图状态</h4>\n <div className=\"space-y-1 pl-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">全屏:</span>\n <StatusBadge active={isFullscreen} label={isFullscreen ? 'Yes' : 'No'} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-400\">坐标轴:</span>\n <StatusBadge active={showAxes} label={showAxes ? 'Show' : 'Hide'} />\n </div>\n </div>\n </div>\n\n {/* 内存监控 */}\n {memoryInfo && (\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">内存监控 (Chrome only)</h4>\n <div className=\"space-y-2 p-2 bg-gray-800 rounded\">\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">已用:</span>\n <span className=\"text-yellow-400 font-bold\">{memoryInfo.used} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">总计:</span>\n <span className=\"text-blue-400\">{memoryInfo.total} MB</span>\n </div>\n <div className=\"flex items-center justify-between text-[10px]\">\n <span className=\"text-gray-400\">限制:</span>\n <span className=\"text-gray-400\">{memoryInfo.limit} MB</span>\n </div>\n {/* 内存使用进度条 */}\n <div className=\"mt-2\">\n <div className=\"bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div\n className={clsx('h-full transition-all duration-300', (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 80\n ? 'bg-red-500'\n : (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100 > 60\n ? 'bg-yellow-500'\n : 'bg-green-500')}\n style={{\n width: (Math.min(100, (parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100)) + '%',\n }}\n />\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center\">\n {((parseFloat(memoryInfo.used) / parseFloat(memoryInfo.limit)) * 100).toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 节点列表 */}\n <div className=\"mb-4\">\n <h4 className=\"text-gray-400 mb-2\">节点列表</h4>\n <div className=\"space-y-1 max-h-40 overflow-y-auto\">\n {Array.from({ length: totalNodes }).map((_, idx) => (\n <div\n key={idx}\n className={clsx('px-2 py-1 rounded text-[10px] flex items-center justify-between', idx === currentIndex\n ? 'bg-blue-600 text-white font-bold'\n : preloadedNodes.includes(idx)\n ? 'bg-yellow-900/50 text-yellow-300'\n : 'bg-gray-800 text-gray-400')}\n >\n <span>节点 {idx}</span>\n {idx === currentIndex && <span>▶</span>}\n {preloadedNodes.includes(idx) && idx !== currentIndex && <span>⏳</span>}\n </div>\n ))}\n </div>\n </div>\n\n {/* 时间戳 */}\n <div className=\"mt-auto pt-4 border-t border-gray-700\">\n <div className=\"text-gray-500 text-[10px]\">\n Last Update: {new Date().toLocaleTimeString()}\n </div>\n </div>\n </div>\n );\n};\n\n// 辅助组件:状态徽章\nconst StatusBadge: React.FC<{ active: boolean; label: string }> = ({ active, label }) => (\n <span\n className={clsx('px-2 py-0.5 rounded text-[10px] font-bold', active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400')}\n >\n {label}\n </span>\n);\n\n\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { MMDPlayerBase } from './MMDPlayerBase';\nimport { ControlPanel } from './ControlPanel';\nimport { MMDPlaylistDebugInfo } from './MMDPlaylistDebugInfo';\nimport { clsx } from 'clsx';\nimport {\n MMDPlaylistProps,\n MMDPlaylistNode,\n MMDPlayerBaseRef,\n} from '../types';\n\n/**\n * MMDPlaylist - 播放列表管理器\n * \n * 核心功能:\n * - 管理多个播放节点\n * - 实现无缝切换(通过 key 变化触发组件重新挂载)\n * - 预加载策略 (none / next / all)\n * - 智能内存回收\n * - 播放列表 UI\n */\nexport const MMDPlaylist: React.FC<MMDPlaylistProps> = ({\n playlist,\n stage,\n mobileOptimization,\n onNodeChange,\n onPlaylistComplete,\n onError,\n showDebugInfo = false,\n className,\n style,\n}) => {\n const { nodes, loop = false, preload = 'none', autoPlay = false } = playlist;\n\n // 状态管理\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showAxes, setShowAxes] = useState(false);\n const [isLooping, setIsLooping] = useState(false); // 单节点循环\n const [isListLooping, setIsListLooping] = useState(loop); // 列表循环\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false); // 切换过渡状态\n const [isCameraManual, setIsCameraManual] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const preloadedRef = useRef<Set<number>>(new Set()); // 记录已预加载的节点索引\n\n // 获取当前节点\n const currentNode = nodes[currentIndex];\n\n // 节点切换 - 两阶段切换,特别关注物理引擎清理\n const goToNode = useCallback(\n (index: number) => {\n if (index < 0 || index >= nodes.length) return;\n if (isTransitioning) return; // 防止在过渡期间重复切换\n \n const node = nodes[index];\n if (!node) return;\n \n console.log('[MMDPlaylist] Starting transition to node ' + (index));\n \n // 先暂停播放\n const wasPlaying = isPlaying;\n setIsPlaying(false);\n \n // 第一阶段:卸载旧播放器(包括物理引擎)\n setIsTransitioning(true);\n \n // 给物理引擎足够的时间完全清理\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n // 第二阶段:挂载新播放器\n console.log('[MMDPlaylist] Loading new node ' + (index));\n setCurrentIndex(index);\n setIsLoading(true);\n onNodeChange?.(node, index);\n \n // 给新组件足够时间初始化\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n setIsTransitioning(false);\n \n // 切换后如果之前在播放,则自动播放新节点\n if (wasPlaying) {\n setIsPlaying(true);\n }\n \n console.log('[MMDPlaylist] Transition to node ' + (index) + ' completed');\n }, 100);\n });\n });\n }, 300); // 给物理引擎更多清理时间(300ms)\n });\n });\n },\n [nodes, isPlaying, isTransitioning, onNodeChange]\n );\n\n // 上一个节点\n const handlePrevious = useCallback(() => {\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n goToNode(prevIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳到最后一个\n goToNode(nodes.length - 1);\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode]);\n\n // 下一个节点\n const handleNext = useCallback(() => {\n const nextIndex = currentIndex + 1;\n if (nextIndex < nodes.length) {\n goToNode(nextIndex);\n } else if (isListLooping) {\n // 如果列表循环,跳回第一个\n goToNode(0);\n } else {\n // 播放列表完成\n setIsPlaying(false);\n onPlaylistComplete?.();\n }\n }, [currentIndex, isListLooping, nodes.length, goToNode, onPlaylistComplete]);\n\n // 播放控制\n const handlePlayPause = useCallback(() => {\n if (isPlaying) {\n playerRef.current?.pause();\n setIsPlaying(false);\n } else {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }, [isPlaying]);\n\n // 全屏控制\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n\n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch((err) => {\n console.error('Error attempting to enable fullscreen: ' + (err.message));\n });\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n }, []);\n\n // 监听全屏变化\n useEffect(() => {\n const handleFsChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFsChange);\n return () => document.removeEventListener('fullscreenchange', handleFsChange);\n }, []);\n\n // 当前节点播放结束时的处理\n const handleEnded = useCallback(() => {\n if (isLooping) {\n // 如果单节点循环,重新播放当前节点\n playerRef.current?.play();\n } else {\n // 否则播放下一个节点\n handleNext();\n }\n }, [isLooping, handleNext]);\n\n // 预加载策略实现\n // 注意:当前架构下通过 key 变化实现资源切换,真正的预加载需要创建隐藏组件实例\n // 这里实现基础的预加载标记和日志,作为未来扩展的基础\n useEffect(() => {\n if (preload === 'none') return;\n\n if (preload === 'all') {\n // 标记所有节点为\"应该预加载\"(实际预加载需要后台资源加载器支持)\n nodes.forEach((node, idx) => {\n if (!preloadedRef.current.has(idx)) {\n preloadedRef.current.add(idx);\n console.log('[MMDPlaylist] Preload strategy: all - marked node ' + (idx) + ' (' + (node.name) + ')');\n }\n });\n } else if (preload === 'next') {\n // 预加载下一个节点\n const nextIndex = (currentIndex + 1) % nodes.length;\n const nextNode = nodes[nextIndex];\n if (nextNode && !preloadedRef.current.has(nextIndex)) {\n preloadedRef.current.add(nextIndex);\n console.log('[MMDPlaylist] Preload strategy: next - marked node ' + (nextIndex) + ' (' + (nextNode.name) + ')');\n }\n }\n }, [currentIndex, nodes, preload]);\n\n // 智能内存回收:清理已预加载但距离当前节点较远的资源标记\n useEffect(() => {\n if (preload === 'none' || preload === 'all') return;\n if (nodes.length === 0) return; // 防御性检查\n\n // 对于 'next' 策略,清理除当前和下一个之外的预加载标记\n const nextIndex = (currentIndex + 1) % nodes.length;\n const keepIndices = new Set([currentIndex, nextIndex]);\n \n const toRemove: number[] = [];\n preloadedRef.current.forEach((idx) => {\n // 确保索引在有效范围内\n if (idx >= nodes.length || !keepIndices.has(idx)) {\n toRemove.push(idx);\n }\n });\n\n if (toRemove.length > 0) {\n toRemove.forEach((idx) => {\n preloadedRef.current.delete(idx);\n console.log('[MMDPlaylist] Memory cleanup: removed preload mark for node ' + (idx));\n });\n }\n }, [currentIndex, nodes.length, preload]);\n\n // 组件卸载时清理所有预加载标记\n useEffect(() => {\n return () => {\n console.log('[MMDPlaylist] Component unmounted, clearing all preload marks');\n preloadedRef.current.clear();\n };\n }, []);\n\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n // 是否显示上一个/下一个按钮\n const showPrevNext = nodes.length > 1;\n\n return (\n <div\n ref={containerRef}\n className={clsx('relative overflow-hidden bg-black group flex h-full', className)}\n style={style}\n >\n {/* 主播放器区域 */}\n <div className=\"flex-1 relative\">\n {/* 核心播放器 - 通过 key 变化实现资源切换和自动清理 */}\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={autoPlay && currentIndex === 0} // 只有第一个节点自动播放\n loop={isLooping} // 单节点循环\n showAxes={showAxes}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n setIsLoading(false);\n if (isPlaying && currentIndex > 0) {\n // 切换节点后继续播放\n playerRef.current?.play();\n }\n }}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onCameraChange={(isManual) => setIsCameraManual(isManual)}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n\n {/* 加载/过渡遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-sm text-white/80\">\n {isTransitioning ? '切换中...' : '正在加载 ' + (currentIndex + 1) + ' / ' + (nodes.length)}\n </div>\n </div>\n </div>\n )}\n\n {/* 控制栏 */}\n <div\n className={clsx('transition-opacity duration-300', isPlaying && !showPlaylist ? 'opacity-0 group-hover:opacity-100' : 'opacity-100')}\n >\n <ControlPanel\n isPlaying={isPlaying}\n isFullscreen={isFullscreen}\n isLooping={isLooping}\n isListLooping={isListLooping}\n isCameraManual={isCameraManual}\n showSettings={true} // 显示播放列表按钮\n showAxes={showAxes}\n showPrevNext={showPrevNext}\n title={currentNode.name}\n subtitle={(currentIndex + 1) + ' / ' + (nodes.length)}\n onPlayPause={handlePlayPause}\n onPrevious={handlePrevious}\n onNext={handleNext}\n onToggleFullscreen={toggleFullscreen}\n onToggleLoop={() => setIsLooping(!isLooping)}\n onToggleListLoop={() => setIsListLooping(!isListLooping)}\n onToggleAxes={() => setShowAxes(!showAxes)}\n onOpenSettings={() => setShowPlaylist(!showPlaylist)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n />\n </div>\n\n {/* 播放列表面板 */}\n {showPlaylist && (\n <div className=\"absolute inset-0 z-20 flex items-end bg-black/80 backdrop-blur-sm\">\n <div className=\"w-full max-h-[60vh] overflow-y-auto bg-gray-900/95 rounded-t-xl\">\n {/* 标题栏 */}\n <div className=\"sticky top-0 flex items-center justify-between bg-gray-800 px-4 py-3 border-b border-gray-700\">\n <div>\n <h3 className=\"text-white font-semibold\">{playlist.name}</h3>\n <p className=\"text-xs text-gray-400 mt-0.5\">\n 共 {nodes.length} 个节点\n </p>\n </div>\n <button\n onClick={() => setShowPlaylist(false)}\n className=\"p-2 hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"关闭播放列表\"\n >\n <svg className=\"w-5 h-5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 节点列表 */}\n <div className=\"p-2\">\n {nodes.map((node, index) => (\n <button\n key={node.id}\n onClick={() => {\n goToNode(index);\n setShowPlaylist(false);\n }}\n className={clsx('w-full flex items-center gap-3 p-3 rounded-lg mb-2 transition-all', index === currentIndex\n ? 'bg-blue-600 text-white'\n : 'bg-gray-800 text-gray-300 hover:bg-gray-700')}\n >\n {/* 序号 */}\n <div\n className={clsx('flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold', index === currentIndex ? 'bg-white/20' : 'bg-gray-700')}\n >\n {index + 1}\n </div>\n\n {/* 节点信息 */}\n <div className=\"flex-1 text-left\">\n <div className=\"font-medium\">{node.name}</div>\n {node.duration && (\n <div className=\"text-xs opacity-75 mt-0.5\">\n {Math.floor(node.duration / 60)}:{String(Math.floor(node.duration % 60)).padStart(2, '0')}\n </div>\n )}\n </div>\n\n {/* 当前播放指示器 */}\n {index === currentIndex && (\n <div className=\"flex-shrink-0\">\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* 调试信息面板 */}\n {showDebugInfo && (\n <div className=\"w-96 flex-shrink-0 bg-gray-900/95 border-l border-gray-700 p-4 overflow-y-auto h-full\">\n <MMDPlaylistDebugInfo\n playlistName={playlist.name}\n currentIndex={currentIndex}\n currentNode={currentNode}\n totalNodes={nodes.length}\n isPlaying={isPlaying}\n isListLooping={isListLooping}\n isNodeLooping={isLooping}\n preloadStrategy={preload}\n isLoading={isLoading || isTransitioning}\n isFullscreen={isFullscreen}\n showAxes={showAxes}\n preloadedNodes={Array.from(preloadedRef.current)}\n />\n </div>\n )}\n </div>\n );\n};\n\n","'use client';\n\n/**\n * MMD光照调试面板\n * 实时调整渲染器、光源、材质参数\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport * as THREE from 'three';\nimport { clsx } from 'clsx';\n\n/**\n * 光照参数接口\n */\nexport interface MMDLightingParams {\n /** 色调映射类型 (0=None, 1=Linear, 2=Reinhard, 3=Cineon, 4=ACESFilmic) */\n toneMapping: number;\n /** 色调映射曝光值 */\n toneMappingExposure: number;\n /** 环境光强度 */\n ambientIntensity: number;\n /** 主方向光强度 */\n directionalIntensity: number;\n /** 主方向光X轴位置 */\n directionalX: number;\n /** 主方向光Y轴位置 */\n directionalY: number;\n /** 主方向光Z轴位置 */\n directionalZ: number;\n /** 侧面补光强度 */\n sideIntensity: number;\n /** 半球光强度 */\n hemisphereIntensity: number;\n /** 材质自发光强度 */\n emissiveIntensity: number;\n /** 颜色亮度系数 */\n colorBrightness: number;\n /** 颜色饱和度系数 */\n colorSaturation: number;\n /** 是否启用阴影 */\n enableShadows: boolean;\n /** 模型是否接收阴影 */\n receiveShadow: boolean;\n /** 阴影偏移 */\n shadowBias: number;\n /** 高光强度(Shininess) */\n shininess: number;\n /** 高光颜色亮度 */\n specularIntensity: number;\n /** 反射率 */\n reflectivity: number;\n /** 金属度 */\n metalness: number;\n /** 粗糙度 */\n roughness: number;\n /** 环境光遮蔽强度 */\n aoMapIntensity: number;\n /** 边缘光强度 */\n rimLightIntensity: number;\n /** 边缘光颜色 */\n rimLightColor: string;\n}\n\n/**\n * 场景引用接口\n */\nexport interface MMDSceneRefs {\n /** 渲染器 */\n renderer: THREE.WebGLRenderer | null;\n /** 环境光 */\n ambientLight: THREE.AmbientLight | null;\n /** 主方向光 */\n directionalLight: THREE.DirectionalLight | null;\n /** 侧面补光 */\n sideLight: THREE.DirectionalLight | null;\n /** 半球光 */\n hemisphereLight: THREE.HemisphereLight | null;\n /** MMD模型网格 */\n mmdMesh: THREE.SkinnedMesh | null;\n}\n\n/**\n * 组件Props\n */\nexport interface MMDLightingDebugPanelProps {\n /** 场景引用(包含渲染器、光源、模型等) */\n sceneRefs: React.MutableRefObject<MMDSceneRefs>;\n /** 初始参数(可选) */\n initialParams?: Partial<MMDLightingParams>;\n /** 参数变化回调(可选) */\n onParamsChange?: (params: MMDLightingParams) => void;\n /** 是否默认显示(默认true) */\n defaultVisible?: boolean;\n /** 面板位置(默认'right') */\n position?: 'left' | 'right';\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * 默认参数\n */\nconst DEFAULT_PARAMS: MMDLightingParams = {\n toneMapping: 4, // ACESFilmic\n toneMappingExposure: 1.4,\n ambientIntensity: 1.5,\n directionalIntensity: 0.8,\n directionalX: 5,\n directionalY: 10,\n directionalZ: 5,\n sideIntensity: 0.5,\n hemisphereIntensity: 0.6,\n emissiveIntensity: 0.35,\n colorBrightness: 1.35,\n colorSaturation: 1.15,\n enableShadows: true,\n receiveShadow: true,\n shadowBias: -0.0001,\n shininess: 30,\n specularIntensity: 0.5,\n reflectivity: 0.5,\n metalness: 0.0,\n roughness: 0.8,\n aoMapIntensity: 1.0,\n rimLightIntensity: 0.0,\n rimLightColor: '#ffffff',\n};\n\n/**\n * MMD光照调试面板组件\n */\nexport const MMDLightingDebugPanel: React.FC<MMDLightingDebugPanelProps> = ({\n sceneRefs,\n initialParams,\n onParamsChange,\n defaultVisible = true,\n position = 'right',\n className = '',\n}) => {\n const [showPanel, setShowPanel] = useState(defaultVisible);\n const [params, setParams] = useState<MMDLightingParams>({\n ...DEFAULT_PARAMS,\n ...initialParams,\n });\n\n // 更新单个参数\n const updateParam = useCallback((key: keyof MMDLightingParams, value: number | boolean | string) => {\n setParams(prev => {\n const newParams = { ...prev, [key]: value };\n onParamsChange?.(newParams);\n return newParams;\n });\n }, [onParamsChange]);\n\n // 应用批量参数\n const applyPreset = useCallback((preset: Partial<MMDLightingParams>) => {\n setParams(prev => {\n const newParams = { ...prev, ...preset };\n onParamsChange?.(newParams);\n return newParams;\n });\n }, [onParamsChange]);\n\n // 实时应用参数到场景\n useEffect(() => {\n const refs = sceneRefs.current;\n \n // 更新渲染器\n if (refs.renderer) {\n refs.renderer.toneMapping = params.toneMapping as THREE.ToneMapping;\n refs.renderer.toneMappingExposure = params.toneMappingExposure;\n refs.renderer.shadowMap.enabled = params.enableShadows;\n }\n \n // 更新环境光\n if (refs.ambientLight) {\n refs.ambientLight.intensity = params.ambientIntensity;\n }\n \n // 更新主方向光\n if (refs.directionalLight) {\n refs.directionalLight.intensity = params.directionalIntensity;\n refs.directionalLight.position.set(\n params.directionalX,\n params.directionalY,\n params.directionalZ\n );\n refs.directionalLight.shadow.bias = params.shadowBias;\n }\n \n // 更新侧面补光\n if (refs.sideLight) {\n refs.sideLight.intensity = params.sideIntensity;\n }\n \n // 更新半球光\n if (refs.hemisphereLight) {\n refs.hemisphereLight.intensity = params.hemisphereIntensity;\n }\n \n // 更新模型材质\n if (refs.mmdMesh) {\n refs.mmdMesh.receiveShadow = params.receiveShadow;\n \n refs.mmdMesh.traverse((child) => {\n if ((child as THREE.Mesh).isMesh) {\n const meshChild = child as THREE.Mesh;\n if (meshChild.material) {\n const materials = Array.isArray(meshChild.material) \n ? meshChild.material \n : [meshChild.material];\n \n materials.forEach((mat) => {\n if (mat instanceof THREE.MeshStandardMaterial || \n mat instanceof THREE.MeshPhongMaterial ||\n mat instanceof THREE.MeshToonMaterial) {\n if (mat.color) {\n // 保存原始颜色(如果还没有)\n const originalColor = mat.userData.originalColor || mat.color.clone();\n if (!mat.userData.originalColor) {\n mat.userData.originalColor = originalColor;\n }\n \n // 保存原始自发光颜色\n if ('emissive' in mat && !mat.userData.originalEmissive) {\n mat.userData.originalEmissive = (mat as any).emissive.clone();\n }\n \n // 应用亮度和饱和度调整\n const hsl = { h: 0, s: 0, l: 0 };\n originalColor.getHSL(hsl);\n \n mat.color.setHSL(\n hsl.h, \n Math.min(hsl.s * params.colorSaturation, 1), \n Math.min(hsl.l * params.colorBrightness, 1)\n );\n \n // 设置自发光\n if ('emissive' in mat) {\n const emissiveHsl = { h: 0, s: 0, l: 0 };\n mat.userData.originalEmissive.getHSL(emissiveHsl);\n \n (mat as any).emissive.setHSL(\n emissiveHsl.h,\n Math.min(emissiveHsl.s * params.colorSaturation, 1),\n Math.min(emissiveHsl.l * params.colorBrightness, 1)\n );\n (mat as any).emissiveIntensity = params.emissiveIntensity;\n }\n \n // 🎨 应用高光和反射属性(MeshPhongMaterial)\n if (mat instanceof THREE.MeshPhongMaterial) {\n // 高光强度\n mat.shininess = params.shininess;\n \n // 高光颜色\n const specularColor = new THREE.Color(0x888888);\n specularColor.multiplyScalar(params.specularIntensity);\n mat.specular = specularColor;\n \n // 反射率\n if ('reflectivity' in mat) {\n (mat as any).reflectivity = params.reflectivity;\n }\n }\n \n // 🎨 MeshToonMaterial的特殊处理\n if (mat instanceof THREE.MeshToonMaterial) {\n // Toon材质使用gradientMap控制阶梯数\n // 高光颜色\n if ('specular' in mat) {\n const specularColor = new THREE.Color(0x888888);\n specularColor.multiplyScalar(params.specularIntensity);\n (mat as any).specular = specularColor;\n }\n }\n \n // 🎨 应用PBR材质属性(MeshStandardMaterial)\n if (mat instanceof THREE.MeshStandardMaterial) {\n mat.metalness = params.metalness;\n mat.roughness = params.roughness;\n \n // 环境光遮蔽强度\n if (mat.aoMap) {\n mat.aoMapIntensity = params.aoMapIntensity;\n }\n }\n \n // 🌟 边缘光效果(通过自定义shader或emissive模拟)\n if (params.rimLightIntensity > 0) {\n // 简单的边缘光效果:增强自发光\n if ('emissive' in mat) {\n const rimColor = new THREE.Color(params.rimLightColor);\n (mat as any).emissive.lerp(rimColor, params.rimLightIntensity * 0.5);\n }\n }\n \n // 标记材质需要更新\n mat.needsUpdate = true;\n }\n }\n });\n }\n }\n });\n }\n }, [params, sceneRefs]);\n\n const toneMappingNames = ['None', 'Linear', 'Reinhard', 'Cineon', 'ACESFilmic'];\n const positionClass = position === 'right' ? 'right-0' : 'left-0';\n const translateClass = position === 'right' \n ? (showPanel ? 'translate-x-0' : 'translate-x-full')\n : (showPanel ? 'translate-x-0' : '-translate-x-full');\n\n return (\n <>\n {/* 调试面板 */}\n <div \n className={clsx('fixed top-0', positionClass, 'z-[9999] w-80 h-screen bg-white/95 backdrop-blur-md shadow-2xl overflow-y-auto transition-transform duration-300', translateClass, className)}\n >\n <div className=\"p-4\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-bold text-gray-900\">🎨 光照调试</h2>\n <button\n onClick={() => setShowPanel(false)}\n className=\"p-2 hover:bg-gray-200 rounded text-gray-600 transition-colors\"\n aria-label=\"关闭面板\"\n >\n ✕\n </button>\n </div>\n\n {/* 渲染器设置 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">🖼️ 渲染器</h3>\n \n <label className=\"block mb-2\">\n <span className=\"text-xs text-gray-700\">色调映射</span>\n <select\n value={params.toneMapping}\n onChange={(e) => updateParam('toneMapping', Number(e.target.value))}\n className=\"w-full mt-1 p-1.5 border rounded text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n >\n {toneMappingNames.map((name, i) => (\n <option key={i} value={i}>{name}</option>\n ))}\n </select>\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">曝光值</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.toneMappingExposure.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0.5\"\n max=\"3\"\n step=\"0.1\"\n value={params.toneMappingExposure}\n onChange={(e) => updateParam('toneMappingExposure', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 光源强度 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">💡 光源强度</h3>\n \n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">环境光</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.ambientIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"3\"\n step=\"0.1\"\n value={params.ambientIntensity}\n onChange={(e) => updateParam('ambientIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">主方向光</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.directionalIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step=\"0.1\"\n value={params.directionalIntensity}\n onChange={(e) => updateParam('directionalIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">侧面补光</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.sideIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step=\"0.1\"\n value={params.sideIntensity}\n onChange={(e) => updateParam('sideIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">半球光</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.hemisphereIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step=\"0.1\"\n value={params.hemisphereIntensity}\n onChange={(e) => updateParam('hemisphereIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 光源位置 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">📍 主光源位置</h3>\n \n <label className=\"block mb-1.5\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">X 轴</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.directionalX.toFixed(1)}</span>\n </div>\n <input\n type=\"range\"\n min=\"-10\"\n max=\"10\"\n step=\"0.5\"\n value={params.directionalX}\n onChange={(e) => updateParam('directionalX', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-1.5\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">Y 轴</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.directionalY.toFixed(1)}</span>\n </div>\n <input\n type=\"range\"\n min=\"1\"\n max=\"20\"\n step=\"0.5\"\n value={params.directionalY}\n onChange={(e) => updateParam('directionalY', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-1.5\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">Z 轴</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.directionalZ.toFixed(1)}</span>\n </div>\n <input\n type=\"range\"\n min=\"-10\"\n max=\"10\"\n step=\"0.5\"\n value={params.directionalZ}\n onChange={(e) => updateParam('directionalZ', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 材质设置 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">🎨 材质属性</h3>\n \n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">自发光强度 ⭐</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.emissiveIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={params.emissiveIntensity}\n onChange={(e) => updateParam('emissiveIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">颜色亮度</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.colorBrightness.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0.5\"\n max=\"2\"\n step=\"0.05\"\n value={params.colorBrightness}\n onChange={(e) => updateParam('colorBrightness', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">颜色饱和度</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.colorSaturation.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0.5\"\n max=\"2\"\n step=\"0.05\"\n value={params.colorSaturation}\n onChange={(e) => updateParam('colorSaturation', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 高光和反射 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">✨ 高光与反射</h3>\n \n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">高光强度 (Shininess)</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.shininess.toFixed(0)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"5\"\n value={params.shininess}\n onChange={(e) => updateParam('shininess', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">高光颜色强度</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.specularIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step=\"0.1\"\n value={params.specularIntensity}\n onChange={(e) => updateParam('specularIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">反射率</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.reflectivity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={params.reflectivity}\n onChange={(e) => updateParam('reflectivity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">金属度 (PBR)</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.metalness.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={params.metalness}\n onChange={(e) => updateParam('metalness', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">粗糙度 (PBR)</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.roughness.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={params.roughness}\n onChange={(e) => updateParam('roughness', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 高级效果 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">🌟 高级效果</h3>\n \n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">环境光遮蔽 (AO)</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.aoMapIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step=\"0.1\"\n value={params.aoMapIntensity}\n onChange={(e) => updateParam('aoMapIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">边缘光强度</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.rimLightIntensity.toFixed(2)}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={params.rimLightIntensity}\n onChange={(e) => updateParam('rimLightIntensity', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n\n <label className=\"block mb-2\">\n <span className=\"text-xs text-gray-700\">边缘光颜色</span>\n <input\n type=\"color\"\n value={params.rimLightColor}\n onChange={(e) => updateParam('rimLightColor', e.target.value)}\n className=\"w-full mt-1 h-8 cursor-pointer\"\n />\n </label>\n </div>\n\n {/* 阴影设置 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">🌑 阴影</h3>\n \n <label className=\"flex items-center mb-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={params.enableShadows}\n onChange={(e) => updateParam('enableShadows', e.target.checked)}\n className=\"mr-2\"\n />\n <span className=\"text-xs text-gray-700\">启用阴影</span>\n </label>\n\n <label className=\"flex items-center mb-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={params.receiveShadow}\n onChange={(e) => updateParam('receiveShadow', e.target.checked)}\n className=\"mr-2\"\n />\n <span className=\"text-xs text-gray-700\">模型接收阴影</span>\n </label>\n\n <label className=\"block mb-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-gray-700\">阴影偏移</span>\n <span className=\"text-xs font-mono text-blue-600\">{params.shadowBias.toFixed(4)}</span>\n </div>\n <input\n type=\"range\"\n min=\"-0.001\"\n max=\"0.001\"\n step=\"0.0001\"\n value={params.shadowBias}\n onChange={(e) => updateParam('shadowBias', Number(e.target.value))}\n className=\"w-full mt-1\"\n />\n </label>\n </div>\n\n {/* 快速预设 */}\n <div className=\"mb-4\">\n <h3 className=\"font-bold text-sm text-gray-800 mb-2 pb-1 border-b\">⚡ 快速预设</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n onClick={() => applyPreset({\n toneMappingExposure: 1.4,\n ambientIntensity: 1.5,\n emissiveIntensity: 0.35,\n })}\n className=\"p-2 bg-blue-500 text-white rounded text-xs hover:bg-blue-600 transition-colors\"\n >\n 默认\n </button>\n <button\n onClick={() => applyPreset({\n toneMappingExposure: 1.8,\n ambientIntensity: 2.0,\n emissiveIntensity: 0.5,\n })}\n className=\"p-2 bg-yellow-500 text-white rounded text-xs hover:bg-yellow-600 transition-colors\"\n >\n 超亮\n </button>\n <button\n onClick={() => applyPreset({\n toneMappingExposure: 1.0,\n ambientIntensity: 0.8,\n emissiveIntensity: 0.1,\n })}\n className=\"p-2 bg-gray-500 text-white rounded text-xs hover:bg-gray-600 transition-colors\"\n >\n 暗调\n </button>\n <button\n onClick={() => applyPreset({\n colorSaturation: 1.5,\n colorBrightness: 1.4,\n specularIntensity: 1.0,\n shininess: 40,\n })}\n className=\"p-2 bg-pink-500 text-white rounded text-xs hover:bg-pink-600 transition-colors\"\n >\n 鲜艳\n </button>\n <button\n onClick={() => applyPreset({\n toneMapping: 1, // Linear\n toneMappingExposure: 1.2,\n ambientIntensity: 0.8,\n directionalIntensity: 1.2,\n sideIntensity: 0.4,\n emissiveIntensity: 0.1,\n colorBrightness: 1.2,\n colorSaturation: 1.3,\n shininess: 50,\n specularIntensity: 1.2,\n reflectivity: 0.6,\n rimLightIntensity: 0.15,\n rimLightColor: '#88ccff',\n })}\n className=\"p-2 bg-cyan-500 text-white rounded text-xs hover:bg-cyan-600 transition-colors\"\n >\n 卡通增强\n </button>\n <button\n onClick={() => applyPreset({\n toneMapping: 1, // Linear\n toneMappingExposure: 1.0,\n ambientIntensity: 0.6,\n directionalIntensity: 1.0,\n sideIntensity: 0.3,\n emissiveIntensity: 0,\n colorBrightness: 1.0,\n colorSaturation: 1.0,\n shininess: 30,\n specularIntensity: 0.8,\n reflectivity: 0.5,\n metalness: 0.0,\n roughness: 0.8,\n rimLightIntensity: 0,\n })}\n className=\"p-2 bg-indigo-500 text-white rounded text-xs hover:bg-indigo-600 transition-colors\"\n >\n MMD标准\n </button>\n <button\n onClick={() => applyPreset(DEFAULT_PARAMS)}\n className=\"p-2 bg-purple-500 text-white rounded text-xs hover:bg-purple-600 transition-colors\"\n >\n 重置全部\n </button>\n </div>\n </div>\n\n {/* 导出配置 */}\n <button\n onClick={() => {\n console.log('💡 当前光照配置:', params);\n const json = JSON.stringify(params, null, 2);\n console.log('📋 JSON格式:', json);\n alert('配置已输出到控制台!按 F12 查看');\n }}\n className=\"w-full p-2 bg-green-500 text-white rounded text-sm font-bold hover:bg-green-600 transition-colors\"\n >\n 📋 导出配置到控制台\n </button>\n\n {/* 使用说明 */}\n <div className=\"mt-4 p-3 bg-blue-50 rounded-lg\">\n <h4 className=\"text-xs font-bold text-blue-900 mb-1\">💡 使用提示</h4>\n <ul className=\"text-xs text-blue-800 space-y-0.5\">\n <li>• 实时调整参数,立即生效</li>\n <li>• 尝试\"卡通增强\"预设获得接近MMD的效果</li>\n <li>• 调整\"高光强度\"和\"高光颜色\"增强光泽感</li>\n <li>• 导出配置保存到代码</li>\n </ul>\n </div>\n </div>\n </div>\n\n {/* 切换按钮(面板关闭时显示) */}\n {!showPanel && (\n <button\n onClick={() => setShowPanel(true)}\n className={clsx('fixed top-4', position === 'right' ? 'right-4' : 'left-4', 'z-[9999] px-4 py-2 bg-blue-500 text-white rounded-lg shadow-lg hover:bg-blue-600 text-sm transition-colors')}\n aria-label=\"打开调试面板\"\n >\n 🎨 光照调试\n </button>\n )}\n </>\n );\n};\n\nMMDLightingDebugPanel.displayName = 'MMDLightingDebugPanel';\n\nexport default MMDLightingDebugPanel;\n\n","import React, { useId, useMemo, useState } from 'react';\nimport JSZip from 'jszip';\nimport { clsx } from 'clsx';\nimport { CheckCircle2, Loader2, Upload } from 'lucide-react';\nimport type {\n AccessPermission,\n FileMetadata,\n UploadFileInfo,\n UploadProgress\n} from '../../universalFile/types';\n\nexport type MMDUploadResourceType =\n | 'model'\n | 'motion'\n | 'camera'\n | 'audio'\n | 'stage'\n | 'thumbnail';\n\nexport interface MMDUploadConfig {\n moduleId: string;\n acceptedTypes: string[];\n maxFileSize: number;\n description: string;\n hint?: string;\n}\n\nexport const MMD_UPLOAD_CONFIGS: Record<MMDUploadResourceType, MMDUploadConfig> = {\n model: {\n moduleId: 'mmd-models',\n acceptedTypes: ['.zip'],\n maxFileSize: 150,\n description: 'MMD model package (ZIP)',\n hint: 'Include PMX/PMD and textures in the ZIP with original folder structure.'\n },\n motion: {\n moduleId: 'mmd-motions',\n acceptedTypes: ['.vmd'],\n maxFileSize: 20,\n description: 'MMD motion file'\n },\n camera: {\n moduleId: 'mmd-cameras',\n acceptedTypes: ['.vmd'],\n maxFileSize: 10,\n description: 'MMD camera motion'\n },\n audio: {\n moduleId: 'mmd-audios',\n acceptedTypes: ['.mp3', '.wav', '.ogg', '.m4a'],\n maxFileSize: 20,\n description: 'Audio track'\n },\n stage: {\n moduleId: 'mmd-stages',\n acceptedTypes: ['.zip'],\n maxFileSize: 200,\n description: 'Stage package (ZIP)',\n hint: 'Include stage model and textures in the ZIP with original folder structure.'\n },\n thumbnail: {\n moduleId: 'mmd-thumbnails',\n acceptedTypes: ['.jpg', '.jpeg', '.png', '.webp'],\n maxFileSize: 5,\n description: 'Thumbnail image'\n }\n};\n\nexport interface MMDUploadPanelProps {\n resourceType: MMDUploadResourceType;\n fileService: {\n uploadFile: (\n fileInfo: UploadFileInfo,\n onProgress?: (progress: UploadProgress) => void\n ) => Promise<FileMetadata>;\n getFileUrl?: (fileId: string, expiresIn?: number) => Promise<string>;\n };\n userId?: string;\n permission?: AccessPermission;\n label?: string;\n description?: string;\n hint?: string;\n acceptedTypes?: string[];\n maxFileSizeMB?: number;\n validateZip?: boolean;\n disabled?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onUploaded?: (payload: { file: FileMetadata; url?: string }) => void;\n onError?: (error: Error) => void;\n onProgress?: (progress: UploadProgress) => void;\n}\n\nconst formatMegabytes = (size: number) => `${(size / 1024 / 1024).toFixed(2)} MB`;\n\nexport const MMDUploadPanel: React.FC<MMDUploadPanelProps> = ({\n resourceType,\n fileService,\n userId,\n permission = 'public',\n label,\n description,\n hint,\n acceptedTypes,\n maxFileSizeMB,\n validateZip = true,\n disabled = false,\n className,\n style,\n onUploaded,\n onError,\n onProgress\n}) => {\n const inputId = useId();\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState<UploadProgress | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [uploadedFile, setUploadedFile] = useState<FileMetadata | null>(null);\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n\n const config = MMD_UPLOAD_CONFIGS[resourceType];\n const mergedAcceptedTypes = acceptedTypes ?? config.acceptedTypes;\n const maxSize = maxFileSizeMB ?? config.maxFileSize;\n\n const hintText = hint ?? config.hint;\n const titleText = label ?? config.description;\n const descriptionText = description ?? `Max ${maxSize} MB`;\n\n const acceptAttr = useMemo(() => mergedAcceptedTypes.join(','), [mergedAcceptedTypes]);\n\n const validateZipContents = async (file: File) => {\n if (!validateZip || !(resourceType === 'model' || resourceType === 'stage')) return;\n const buffer = await file.arrayBuffer();\n const zip = await JSZip.loadAsync(buffer);\n const entries = Object.keys(zip.files);\n\n if (!entries.length) {\n throw new Error('ZIP is empty.');\n }\n\n const hasModel =\n entries.some((name) => /\\.[pP][mM][xX]$/.test(name)) ||\n (resourceType === 'stage' && entries.some((name) => /\\.[pP][mM][dD]$/.test(name)));\n\n const hasAssets = entries.some((name) =>\n /\\.(png|jpg|jpeg|bmp|tga|dds|spa|sph)$/i.test(name)\n );\n\n if (!hasModel) {\n throw new Error('ZIP does not contain a PMX/PMD model file.');\n }\n\n if (!hasAssets) {\n throw new Error('ZIP does not include texture assets.');\n }\n };\n\n const handleUpload = async (file: File) => {\n if (disabled || uploading) return;\n\n setError(null);\n setProgress(null);\n\n if (file.size > maxSize * 1024 * 1024) {\n setError(`File size exceeds ${maxSize} MB.`);\n return;\n }\n\n try {\n setUploading(true);\n await validateZipContents(file);\n\n const fileInfo: UploadFileInfo = {\n file,\n moduleId: config.moduleId,\n businessId: userId,\n permission\n };\n\n const metadata = await fileService.uploadFile(fileInfo, (progressEvent) => {\n setProgress(progressEvent);\n onProgress?.(progressEvent);\n });\n\n let url: string | undefined;\n if (fileService.getFileUrl) {\n url = await fileService.getFileUrl(metadata.id);\n setUploadedUrl(url ?? null);\n } else {\n setUploadedUrl(null);\n }\n\n setUploadedFile(metadata);\n setUploading(false);\n onUploaded?.({ file: metadata, url });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed.';\n setError(message);\n setUploading(false);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n const handleFileInput = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n handleUpload(file);\n }\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragOver(false);\n const file = event.dataTransfer.files?.[0];\n if (file) {\n handleUpload(file);\n }\n };\n\n return (\n <div className={clsx('space-y-4', className)} style={style}>\n <div>\n <div className=\"text-sm font-semibold text-gray-900\">{titleText}</div>\n <div className=\"text-xs text-gray-500\">{descriptionText}</div>\n {hintText && <div className=\"text-xs text-amber-600 mt-1\">{hintText}</div>}\n </div>\n\n <div\n className={clsx(\n 'rounded-lg border-2 border-dashed px-4 py-6 text-center transition-colors',\n dragOver ? 'border-blue-500 bg-blue-50' : 'border-gray-300',\n disabled ? 'opacity-50 pointer-events-none' : 'cursor-pointer'\n )}\n onDragOver={(event) => {\n event.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={acceptAttr}\n className=\"hidden\"\n onChange={handleFileInput}\n disabled={disabled || uploading}\n />\n <label htmlFor={inputId} className=\"flex flex-col items-center gap-2\">\n <Upload className=\"h-6 w-6 text-gray-500\" />\n <span className=\"text-sm text-gray-600\">\n Click to select or drag file here\n </span>\n <span className=\"text-xs text-gray-400\">\n {mergedAcceptedTypes.join(', ')}\n </span>\n </label>\n </div>\n\n {uploading && (\n <div className=\"flex items-center gap-2 text-sm text-blue-600\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Uploading{progress ? ` ${progress.progress}%` : '...'}\n </div>\n )}\n\n {progress && (\n <div className=\"text-xs text-gray-500\">\n {formatMegabytes(progress.uploadedBytes)} / {formatMegabytes(progress.totalBytes)}\n </div>\n )}\n\n {error && <div className=\"text-sm text-red-600\">{error}</div>}\n\n {uploadedFile && (\n <div className=\"flex items-center justify-between rounded-lg border border-green-200 bg-green-50 px-3 py-2 text-sm text-green-700\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span className=\"truncate\">{uploadedFile.originalName}</span>\n </div>\n {uploadedUrl && (\n <a\n href={uploadedUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-green-700 underline\"\n >\n Open\n </a>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default MMDUploadPanel;\n","/**\n * MMD渲染诊断工具\n * 用于检测模型渲染问题\n */\n\nimport * as THREE from 'three';\n\nexport interface MMDDiagnosticReport {\n /** 材质总数 */\n totalMaterials: number;\n /** 有Toon纹理的材质数 */\n materialsWithToon: number;\n /** 有Sphere纹理的材质数 */\n materialsWithSphere: number;\n /** 有主纹理的材质数 */\n materialsWithMainTexture: number;\n /** MeshToonMaterial数量 */\n toonMaterialCount: number;\n /** MeshPhongMaterial数量 */\n phongMaterialCount: number;\n /** MeshStandardMaterial数量 */\n standardMaterialCount: number;\n /** 问题列表 */\n issues: string[];\n /** 建议列表 */\n suggestions: string[];\n}\n\n/**\n * 诊断MMD场景渲染问题\n * \n * @param scene - Three.js场景\n * @param renderer - 渲染器(可选)\n * @returns 诊断报告\n */\nexport function diagnoseMaterialsMMD(\n scene: THREE.Scene,\n renderer?: THREE.WebGLRenderer\n): MMDDiagnosticReport {\n const report: MMDDiagnosticReport = {\n totalMaterials: 0,\n materialsWithToon: 0,\n materialsWithSphere: 0,\n materialsWithMainTexture: 0,\n toonMaterialCount: 0,\n phongMaterialCount: 0,\n standardMaterialCount: 0,\n issues: [],\n suggestions: [],\n };\n\n // 遍历场景检查材质\n scene.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((material) => {\n report.totalMaterials++;\n\n // 统计材质类型\n if (material instanceof THREE.MeshToonMaterial) {\n report.toonMaterialCount++;\n }\n if (material instanceof THREE.MeshPhongMaterial) {\n report.phongMaterialCount++;\n }\n if (material instanceof THREE.MeshStandardMaterial) {\n report.standardMaterialCount++;\n }\n\n // 检查纹理\n if ((material as any).gradientMap || (material as any).toonMap) {\n report.materialsWithToon++;\n }\n\n if (material.envMap) {\n report.materialsWithSphere++;\n }\n\n if (material.map) {\n report.materialsWithMainTexture++;\n }\n });\n }\n });\n\n // 分析问题\n if (report.totalMaterials === 0) {\n report.issues.push('场景中没有找到任何材质');\n }\n\n if (report.materialsWithToon === 0 && report.toonMaterialCount > 0) {\n report.issues.push('检测到Toon材质但没有gradientMap/toonMap纹理');\n report.suggestions.push('调用 configureMaterialsForMMD(mesh, { enableGradientMap: true })');\n report.suggestions.push('或配置 loader.setToonPath(\"/mmd/toon/\")');\n }\n\n if (report.materialsWithSphere === 0) {\n report.issues.push('❌ 没有检测到Sphere纹理(envMap)- 这是缺少金属光泽的主要原因!');\n report.suggestions.push('🔍 步骤1: 检查模型定义 - 运行 printModelSphereInfo(\"模型URL\")');\n report.suggestions.push('🔍 步骤2: 查看Network面板,检查.spa/.sph文件是否加载失败');\n report.suggestions.push('💡 临时方案: 调用 addDefaultSphereTextures(mesh) 添加默认sphere纹理');\n report.suggestions.push('⚡ 或提高\"高光强度\"(50-60)和\"反射率\"(0.6-0.8)来弥补');\n }\n\n if (report.phongMaterialCount === 0 && report.toonMaterialCount === 0) {\n report.issues.push('没有检测到MMD常用的材质类型(MeshPhongMaterial或MeshToonMaterial)');\n }\n\n // 检查渲染器配置\n if (renderer) {\n if (renderer.toneMapping === THREE.ACESFilmicToneMapping) {\n report.suggestions.push('当前使用ACESFilmic色调映射,建议尝试Linear映射以获得更接近MMD的效果');\n }\n\n if (!renderer.shadowMap.enabled) {\n report.issues.push('阴影未启用');\n report.suggestions.push('启用阴影: renderer.shadowMap.enabled = true');\n }\n }\n\n return report;\n}\n\n/**\n * 打印诊断报告到控制台\n * \n * @param report - 诊断报告\n */\nexport function printDiagnosticReport(report: MMDDiagnosticReport): void {\n console.log('🔍 MMD渲染诊断报告');\n console.log('='.repeat(60));\n\n // 材质统计\n console.log('\\n📊 材质统计:');\n console.log(' 总材质数: ' + (report.totalMaterials));\n console.log(' MeshToonMaterial: ' + (report.toonMaterialCount));\n console.log(' MeshPhongMaterial: ' + (report.phongMaterialCount));\n console.log(' MeshStandardMaterial: ' + (report.standardMaterialCount));\n\n // 纹理统计\n console.log('\\n🎨 纹理统计:');\n console.log(' 有Toon纹理: ' + (report.materialsWithToon) + ' / ' + (report.totalMaterials) + ' ' + (report.materialsWithToon > 0 ? '✅' : '❌'));\n console.log(' 有Sphere纹理: ' + (report.materialsWithSphere) + ' / ' + (report.totalMaterials) + ' ' + (report.materialsWithSphere > 0 ? '✅' : '❌'));\n console.log(' 有主纹理: ' + (report.materialsWithMainTexture) + ' / ' + (report.totalMaterials));\n\n // 问题列表\n if (report.issues.length > 0) {\n console.log('\\n⚠️ 发现的问题:');\n report.issues.forEach((issue, i) => {\n console.log(' ' + (i + 1) + '. ' + (issue));\n });\n } else {\n console.log('\\n✅ 未发现明显问题');\n }\n\n // 建议列表\n if (report.suggestions.length > 0) {\n console.log('\\n💡 改进建议:');\n report.suggestions.forEach((suggestion, i) => {\n console.log(' ' + (i + 1) + '. ' + (suggestion));\n });\n }\n\n console.log('\\n' + '='.repeat(60));\n\n // 返回可复制的修复代码\n if (report.materialsWithToon === 0) {\n console.log('\\n📋 修复代码(复制到你的代码中):');\n console.log(`\n// 在加载模型前配置\nconst loader = new MMDLoader();\nloader.setToonPath('/mmd/toon/');\nloader.setResourcePath('/path/to/model/');\n\n// 加载模型后应用\nimport { configureMaterialsForMMD } from 'sa2kit/mmd';\nconfigureMaterialsForMMD(mesh, {\n enableGradientMap: true,\n shininess: 50,\n});\n `);\n }\n}\n\n/**\n * 快速诊断(浏览器控制台友好版本)\n * \n * 使用方法:\n * 1. 在浏览器控制台运行\n * 2. 将scene对象传入\n * \n * @param scene - Three.js场景\n * @param renderer - 渲染器(可选)\n */\nexport function quickDiagnose(scene: THREE.Scene, renderer?: THREE.WebGLRenderer): void {\n const report = diagnoseMaterialsMMD(scene, renderer);\n printDiagnosticReport(report);\n}\n\n/**\n * 检查特定材质的详细信息\n * \n * @param material - Three.js材质\n * @returns 材质信息字符串\n */\nexport function inspectMaterial(material: THREE.Material): Record<string, any> {\n const info: Record<string, any> = {\n type: material.type,\n name: material.name,\n hasMap: !!(material as any).map,\n hasEnvMap: !!(material as any).envMap,\n };\n\n // Toon/Phong/Standard 特有属性\n if ('gradientMap' in material) {\n info.hasGradientMap = !!(material as any).gradientMap;\n }\n if ('toonMap' in material) {\n info.hasToonMap = !!(material as any).toonMap;\n }\n if ('specular' in material) {\n info.specular = (material as any).specular;\n }\n if ('shininess' in material) {\n info.shininess = (material as any).shininess;\n }\n if ('metalness' in material) {\n info.metalness = (material as any).metalness;\n }\n if ('roughness' in material) {\n info.roughness = (material as any).roughness;\n }\n\n return info;\n}\n\n/**\n * 列出所有材质的详细信息\n * \n * @param scene - Three.js场景\n */\nexport function listAllMaterials(scene: THREE.Scene): void {\n console.log('📋 材质列表');\n console.log('='.repeat(60));\n\n let index = 0;\n scene.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((mat) => {\n console.log('\\n材质 #' + (index) + ':', obj.name || 'unnamed');\n console.log(inspectMaterial(mat));\n index++;\n });\n }\n });\n\n console.log('\\n' + '='.repeat(60));\n}\n\n// 将诊断工具添加到window对象(方便在控制台使用)\nif (typeof window !== 'undefined') {\n (window as any).mmdDiagnose = quickDiagnose;\n (window as any).mmdInspect = inspectMaterial;\n (window as any).mmdListMaterials = listAllMaterials;\n}\n\n","/**\n * Sphere纹理辅助工具\n * 用于检查、诊断和修复MMD模型的sphere纹理问题\n */\n\nimport * as THREE from 'three';\n\n/**\n * Sphere纹理诊断结果\n */\nexport interface SphereTextureDiagnostic {\n /** 检查的材质总数 */\n totalMaterials: number;\n /** 应该有sphere纹理的材质数(根据命名推测) */\n expectedSphere: number;\n /** 实际有sphere纹理的材质数 */\n actualSphere: number;\n /** 缺少sphere纹理的材质列表 */\n missingSphere: Array<{\n index: number;\n name: string;\n objectName: string;\n }>;\n /** 可能的sphere纹理文件列表 */\n possibleSphereFiles: string[];\n}\n\n/**\n * 检查模型是否缺少sphere纹理\n * \n * @param mesh - MMD模型网格\n * @returns 诊断结果\n */\nexport function checkSphereTextures(mesh: THREE.SkinnedMesh): SphereTextureDiagnostic {\n const diagnostic: SphereTextureDiagnostic = {\n totalMaterials: 0,\n expectedSphere: 0,\n actualSphere: 0,\n missingSphere: [],\n possibleSphereFiles: [],\n };\n\n let materialIndex = 0;\n\n mesh.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((mat) => {\n diagnostic.totalMaterials++;\n\n // 检查是否有envMap(sphere纹理)\n if (mat.envMap) {\n diagnostic.actualSphere++;\n }\n\n // 根据材质名称推测是否应该有sphere纹理\n const materialName = mat.name || '';\n const shouldHaveSphere =\n materialName.includes('hair') ||\n materialName.includes('Hair') ||\n materialName.includes('髪') ||\n materialName.includes('kami') ||\n materialName.includes('eye') ||\n materialName.includes('Eye') ||\n materialName.includes('瞳') ||\n materialName.includes('metal') ||\n materialName.includes('Metal') ||\n materialName.includes('金属');\n\n if (shouldHaveSphere) {\n diagnostic.expectedSphere++;\n\n if (!mat.envMap) {\n diagnostic.missingSphere.push({\n index: materialIndex,\n name: materialName,\n objectName: obj.name || 'unnamed',\n });\n }\n }\n\n materialIndex++;\n });\n }\n });\n\n return diagnostic;\n}\n\n/**\n * 打印sphere纹理诊断报告\n * \n * @param diagnostic - 诊断结果\n */\nexport function printSphereDiagnostic(diagnostic: SphereTextureDiagnostic): void {\n console.log('\\n🔮 Sphere纹理诊断');\n console.log('='.repeat(60));\n\n console.log(`\\n📊 统计:`);\n console.log(' 总材质数: ' + (diagnostic.totalMaterials));\n console.log(' 预期有sphere纹理: ' + (diagnostic.expectedSphere));\n console.log(' 实际有sphere纹理: ' + (diagnostic.actualSphere) + ' ' + (diagnostic.actualSphere > 0 ? '✅' : '❌'));\n\n if (diagnostic.missingSphere.length > 0) {\n console.log('\\n⚠️ 缺少sphere纹理的材质 (' + (diagnostic.missingSphere.length) + '个):');\n diagnostic.missingSphere.forEach((item, i) => {\n console.log(' ' + (i + 1) + '. [' + (item.index) + '] ' + (item.name) + ' (对象: ' + (item.objectName) + ')');\n });\n } else {\n console.log('\\n✅ 所有预期的材质都有sphere纹理');\n }\n\n console.log('\\n' + '='.repeat(60));\n}\n\n/**\n * 为材质添加默认的sphere纹理(临时方案)\n * \n * 注意:这只是临时方案,最好的方法是使用模型自带的sphere纹理文件\n * \n * @param mesh - MMD模型网格\n * @param sphereTextureUrl - Sphere纹理URL(可选)\n */\nexport function addDefaultSphereTextures(\n mesh: THREE.SkinnedMesh,\n sphereTextureUrl?: string\n): void {\n const loader = new THREE.TextureLoader();\n\n // 如果没有提供URL,创建一个简单的渐变sphere纹理\n const getSphereTexture = (): THREE.Texture => {\n if (sphereTextureUrl) {\n return loader.load(sphereTextureUrl);\n }\n\n // 创建一个简单的径向渐变纹理\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n const ctx = canvas.getContext('2d')!;\n\n // 创建径向渐变(模拟sphere map)\n const gradient = ctx.createRadialGradient(128, 128, 0, 128, 128, 128);\n gradient.addColorStop(0, '#ffffff'); // 中心白色(高光)\n gradient.addColorStop(0.5, '#cccccc'); // 中间灰色\n gradient.addColorStop(1, '#888888'); // 边缘暗灰色\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 256, 256);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.mapping = THREE.EquirectangularReflectionMapping;\n texture.needsUpdate = true;\n\n return texture;\n };\n\n const sphereTexture = getSphereTexture();\n let appliedCount = 0;\n\n mesh.traverse((obj) => {\n if (obj instanceof THREE.Mesh || obj instanceof THREE.SkinnedMesh) {\n const materials = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n materials.forEach((mat) => {\n // 只为没有envMap的材质添加\n if (!mat.envMap) {\n const materialName = mat.name || '';\n\n // 只为可能需要sphere的材质添加(头发、眼睛等)\n const needsSphere =\n materialName.includes('hair') ||\n materialName.includes('Hair') ||\n materialName.includes('髪') ||\n materialName.includes('kami') ||\n materialName.includes('eye') ||\n materialName.includes('Eye') ||\n materialName.includes('瞳');\n\n if (needsSphere) {\n mat.envMap = sphereTexture;\n\n // 设置合适的混合强度\n if ('envMapIntensity' in mat) {\n (mat as any).envMapIntensity = 0.3; // 适度的反射强度\n }\n\n mat.needsUpdate = true;\n appliedCount++;\n }\n }\n });\n }\n });\n\n console.log('🔮 添加默认Sphere纹理到 ' + (appliedCount) + ' 个材质');\n}\n\n/**\n * 使用PMXParser检查模型定义的sphere纹理\n * \n * @param modelUrl - 模型URL\n * @returns Sphere纹理信息\n */\nexport async function checkModelSphereDefinition(modelUrl: string): Promise<{\n hasSphere: boolean;\n sphereTextures: Array<{\n materialName: string;\n texturePath: string;\n mode: string;\n }>;\n}> {\n try {\n // 动态导入PMXParser\n const { PMXParser } = await import('../pmx/parser/PMXParser');\n\n const parser = new PMXParser();\n const result = await parser.loadAndParse(modelUrl);\n\n const sphereTextures: Array<{\n materialName: string;\n texturePath: string;\n mode: string;\n }> = [];\n\n result.materialTextureMappings.forEach((mapping) => {\n if (mapping.sphereTexture) {\n sphereTextures.push({\n materialName: mapping.materialName,\n texturePath: mapping.sphereTexture.path,\n mode: mapping.sphereTexture.mode,\n });\n }\n });\n\n return {\n hasSphere: sphereTextures.length > 0,\n sphereTextures,\n };\n } catch (error) {\n console.error('检查模型sphere定义失败:', error);\n return {\n hasSphere: false,\n sphereTextures: [],\n };\n }\n}\n\n/**\n * 打印模型的sphere纹理定义\n * \n * @param modelUrl - 模型URL\n */\nexport async function printModelSphereInfo(modelUrl: string): Promise<void> {\n console.log('\\n🔍 检查模型的Sphere纹理定义...');\n console.log('模型: ' + (modelUrl));\n console.log('='.repeat(60));\n\n const info = await checkModelSphereDefinition(modelUrl);\n\n if (info.hasSphere) {\n console.log('\\n✅ 模型定义了 ' + (info.sphereTextures.length) + ' 个Sphere纹理:');\n info.sphereTextures.forEach((item, i) => {\n console.log('\\n' + (i + 1) + '. ' + (item.materialName));\n console.log(' 纹理: ' + (item.texturePath));\n console.log(' 模式: ' + (item.mode));\n });\n\n console.log('\\n💡 建议:');\n console.log(' 1. 检查以下文件是否存在于模型目录:');\n info.sphereTextures.forEach((item) => {\n console.log(' - ' + (item.texturePath));\n });\n console.log(' 2. 确保这些文件可以被访问(无CORS错误)');\n console.log(' 3. MMDLoader应该会自动加载这些纹理');\n } else {\n console.log('\\n❌ 模型没有定义任何Sphere纹理');\n console.log('\\n💡 可能的原因:');\n console.log(' 1. 这个模型本身不使用sphere纹理');\n console.log(' 2. 模型作者没有添加sphere纹理');\n console.log('\\n💡 临时解决方案:');\n console.log(' 使用 addDefaultSphereTextures(mesh) 添加默认sphere纹理');\n }\n\n console.log('\\n' + '='.repeat(60));\n}\n\n/**\n * 全面诊断sphere纹理问题\n * \n * @param mesh - 已加载的模型网格\n * @param modelUrl - 模型URL\n */\nexport async function fullSphereDiagnostic(\n mesh: THREE.SkinnedMesh,\n modelUrl: string\n): Promise<void> {\n console.log('\\n🔮 Sphere纹理完整诊断');\n console.log('='.repeat(60));\n\n // 1. 检查运行时材质状态\n const runtimeDiag = checkSphereTextures(mesh);\n printSphereDiagnostic(runtimeDiag);\n\n // 2. 检查PMX文件定义\n await printModelSphereInfo(modelUrl);\n\n // 3. 综合建议\n console.log('\\n📋 综合建议:');\n\n if (runtimeDiag.actualSphere === 0) {\n console.log('\\n⚠️ 运行时没有检测到任何sphere纹理!');\n\n // 检查PMX定义\n const pmxInfo = await checkModelSphereDefinition(modelUrl);\n\n if (pmxInfo.hasSphere) {\n console.log('\\n❌ 模型定义了sphere纹理,但加载失败!');\n console.log('可能的原因:');\n console.log(' 1. 纹理文件不存在');\n console.log(' 2. CORS错误(跨域)');\n console.log(' 3. 文件路径错误');\n console.log('\\n解决方案:');\n console.log(' 打开浏览器Network面板,查看哪些.spa/.sph文件加载失败');\n } else {\n console.log('\\n⚠️ 模型本身没有定义sphere纹理');\n console.log('解决方案:');\n console.log(' 1. 使用 addDefaultSphereTextures(mesh) 添加默认纹理');\n console.log(' 2. 或使用调试面板提高\"高光强度\"和\"反射率\"来弥补');\n }\n } else {\n console.log('\\n✅ 检测到sphere纹理!');\n console.log('当前有 ' + (runtimeDiag.actualSphere) + ' 个材质使用sphere纹理');\n }\n\n console.log('\\n' + '='.repeat(60));\n}\n\n// 将工具添加到window对象(方便在控制台使用)\nif (typeof window !== 'undefined') {\n (window as any).checkSphereTextures = checkSphereTextures;\n (window as any).addDefaultSphereTextures = addDefaultSphereTextures;\n (window as any).printModelSphereInfo = printModelSphereInfo;\n (window as any).fullSphereDiagnostic = fullSphereDiagnostic;\n}\n\n\n\n\n\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueBoxProps, DialogueBoxTheme } from './types';\nimport { clsx } from 'clsx';\n\n// 注入全局样式\nif (typeof document !== 'undefined' && !document.getElementById('dialogue-box-animations')) {\n const style = document.createElement('style');\n style.id = 'dialogue-box-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 1; transform: scaleY(1); }\n 50% { opacity: 0.3; transform: scaleY(0.8); }\n }\n \n @keyframes textFadeIn {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n }\n \n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-4px); }\n }\n `;\n document.head.appendChild(style);\n}\n\n/** 默认主题配置 - 灰白色主色调 + 亮绿色文字 */\nconst defaultTheme: DialogueBoxTheme = {\n backgroundColor: 'rgba(248, 250, 252, 0.95)',\n borderColor: 'rgba(203, 213, 225, 0.8)',\n textColor: '#22c55e',\n speakerBgColor: 'rgba(148, 163, 184, 0.9)',\n speakerTextColor: '#22c55e',\n opacity: 1.0,\n blur: '16px',\n continueHint: '点击继续 ▼',\n showContinueHint: true,\n};\n\n/**\n * DialogueBox - Galgame 风格对话框组件\n * \n * 功能:\n * - 打字机效果显示文本\n * - 说话者名称栏\n * - 点击继续提示\n * - 控制按钮(自动、快进、历史)\n */\nexport const DialogueBox: React.FC<DialogueBoxProps> = ({\n dialogue,\n theme: userTheme,\n isTyping = false,\n isAutoMode = false,\n onClick,\n onSkipTyping,\n onToggleAuto,\n onOpenHistory,\n onSkip,\n onResetCamera,\n isCameraManual = false,\n showControls = true,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n className,\n}) => {\n const theme = { ...defaultTheme, ...userTheme };\n const [displayedText, setDisplayedText] = useState('');\n const [isComplete, setIsComplete] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const typingRef = useRef<NodeJS.Timeout | null>(null);\n const currentTextRef = useRef<string>('');\n\n // 避免 SSR hydration 错误\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 打字机效果\n useEffect(() => {\n if (!dialogue) {\n setDisplayedText('');\n setIsComplete(false);\n return;\n }\n\n const text = dialogue.text;\n const speed = dialogue.typeSpeed ?? 50;\n\n // 清除之前的定时器\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n\n // 重置状态\n setDisplayedText('');\n setIsComplete(false);\n currentTextRef.current = text;\n\n let index = 0;\n\n const typeNext = () => {\n if (index < text.length && currentTextRef.current === text) {\n setDisplayedText(text.slice(0, index + 1));\n index++;\n typingRef.current = setTimeout(typeNext, speed);\n } else if (currentTextRef.current === text) {\n setIsComplete(true);\n }\n };\n\n // 开始打字\n typingRef.current = setTimeout(typeNext, speed);\n\n return () => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n };\n }, [dialogue]);\n\n // 跳过打字动画\n const handleSkipTyping = useCallback(() => {\n if (typingRef.current) {\n clearTimeout(typingRef.current);\n }\n if (dialogue) {\n setDisplayedText(dialogue.text);\n setIsComplete(true);\n }\n onSkipTyping?.();\n }, [dialogue, onSkipTyping]);\n\n // 处理点击\n const handleClick = useCallback(() => {\n if (!isComplete) {\n handleSkipTyping();\n } else {\n onClick?.();\n }\n }, [isComplete, handleSkipTyping, onClick]);\n\n if (!dialogue) {\n return null;\n }\n\n const speakerColor = dialogue.speakerColor || theme.speakerBgColor;\n\n console.log('[DialogueBox] Rendering:', { \n speaker: dialogue.speaker, \n text: dialogue.text,\n displayedText,\n isComplete \n });\n\n console.log('[DialogueBox] Theme colors:', {\n textColor: theme.textColor,\n backgroundColor: theme.backgroundColor,\n speakerBgColor: theme.speakerBgColor,\n speakerTextColor: theme.speakerTextColor,\n fullTheme: theme\n });\n\n const dialogueContent = (\n <div\n className={clsx(className || '')}\n style={{ \n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n height: '30vh',\n minHeight: '200px',\n maxHeight: '30vh',\n zIndex: 1,\n pointerEvents: 'auto',\n }}\n >\n {/* 对话框主体 - 占满容器宽度和高度 */}\n <div\n className=\"w-full h-full rounded-t-3xl border cursor-pointer select-none transition-all hover:border-white/50 hover:shadow-2xl flex flex-col relative overflow-hidden\"\n onClick={handleClick}\n style={{\n borderColor: theme.borderColor,\n backdropFilter: 'blur(' + (theme.blur) + ') saturate(200%)',\n WebkitBackdropFilter: 'blur(' + (theme.blur) + ') saturate(200%)',\n opacity: theme.opacity,\n pointerEvents: 'auto',\n position: 'relative',\n display: 'flex',\n background: `linear-gradient(135deg, \n rgba(248, 250, 252, 0.98) 0%, \n rgba(241, 245, 249, 0.95) 50%, \n rgba(226, 232, 240, 0.92) 100%)`,\n boxShadow: `\n 0 -8px 40px rgba(148, 163, 184, 0.2),\n 0 -4px 16px rgba(100, 116, 139, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.8),\n inset 0 -1px 0 rgba(203, 213, 225, 0.5)\n `,\n }}\n >\n {/* 装饰性渐变层 - 柔和的灰色渐变 */}\n <div \n className=\"absolute inset-0 opacity-8 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(226, 232, 240, 0.3) 0%, \n rgba(203, 213, 225, 0.3) 25%,\n rgba(241, 245, 249, 0.3) 50%,\n rgba(226, 232, 240, 0.3) 75%,\n rgba(203, 213, 225, 0.3) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n \n {/* 顶部高光 - 灰白色光泽 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-1\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.9), transparent)',\n }}\n />\n \n {/* 底部柔和边框 */}\n <div \n className=\"absolute bottom-0 left-0 right-0 h-px\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(203, 213, 225, 0.6), transparent)',\n }}\n />\n {/* 控制按钮区域 - 放在对话框内部顶部 */}\n {showControls && (\n <div className=\"flex justify-end gap-3 px-6 pt-4 pb-2 shrink-0 relative z-10\">\n {showHistoryButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onOpenHistory?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-slate-700 font-medium hover:text-slate-900 transition-all backdrop-blur-lg border border-slate-300 hover:border-slate-400 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(241, 245, 249, 0.95), rgba(226, 232, 240, 0.9))',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8)',\n }}\n title=\"历史记录\"\n >\n 📜 历史\n </button>\n )}\n {isCameraManual && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onResetCamera?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-white font-medium hover:text-white transition-all backdrop-blur-lg border border-blue-300 hover:border-blue-400 hover:scale-105 active:scale-95 shadow-lg animate-in zoom-in duration-300\"\n style={{\n background: 'linear-gradient(135deg, rgba(59, 130, 246, 0.85), rgba(37, 99, 235, 0.75))',\n boxShadow: '0 4px 16px rgba(59, 130, 246, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.4)',\n }}\n title=\"恢复初始视角\"\n >\n 🎥 恢复视角\n </button>\n )}\n {showAutoButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleAuto?.();\n }}\n className={clsx('px-4 py-2 text-xs rounded-xl font-medium transition-all backdrop-blur-lg border hover:scale-105 active:scale-95 shadow-lg', isAutoMode\n ? 'border-slate-400 text-slate-900'\n : 'border-slate-300 hover:border-slate-400 text-slate-700')}\n style={{\n background: isAutoMode \n ? 'linear-gradient(135deg, rgba(203, 213, 225, 0.95), rgba(148, 163, 184, 0.85))'\n : 'linear-gradient(135deg, rgba(241, 245, 249, 0.95), rgba(226, 232, 240, 0.9))',\n boxShadow: isAutoMode \n ? '0 4px 20px rgba(100, 116, 139, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.8)'\n : '0 4px 16px rgba(100, 116, 139, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8)',\n }}\n title=\"自动播放\"\n >\n ▶ 自动\n </button>\n )}\n {showSkipButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onSkip?.();\n }}\n className=\"px-4 py-2 text-xs rounded-xl text-slate-700 font-medium hover:text-slate-900 transition-all backdrop-blur-lg border border-slate-300 hover:border-slate-400 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(241, 245, 249, 0.95), rgba(226, 232, 240, 0.9))',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8)',\n }}\n title=\"快进\"\n >\n ⏩ 快进\n </button>\n )}\n </div>\n )}\n\n {/* 内容区域 - 使用 flex-1 占据剩余空间,固定对齐到顶部避免跳动 */}\n <div className=\"px-8 pb-6 pt-4 flex-1 flex flex-col justify-start overflow-y-auto relative z-10\">\n {/* 说话者名称 */}\n {dialogue.speaker && (\n <div\n className=\"inline-block px-6 py-2.5 rounded-2xl mb-4 text-sm font-bold shadow-2xl self-start relative overflow-hidden transition-all hover:scale-105\"\n style={{\n color: '#ffffff',\n background: `linear-gradient(135deg, \n rgba(100, 116, 139, 0.95) 0%, \n rgba(71, 85, 105, 0.9) 100%)`,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(148, 163, 184, 0.5)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.5) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{dialogue.speaker}</span>\n </div>\n )}\n\n {/* 对话文本 */}\n <div\n className=\"text-lg leading-relaxed relative\"\n style={{ \n color: theme.textColor,\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.1)',\n }}\n >\n <span className=\"inline-block\" style={{\n animation: !isComplete ? 'textFadeIn 0.3s ease-out' : 'none'\n }}>\n {displayedText}\n </span>\n {/* 打字光标 - 亮绿色主题 */}\n {!isComplete && (\n <span \n className=\"inline-block w-1 h-6 ml-1 align-middle\"\n style={{\n background: 'linear-gradient(to bottom, #22c55e, #4ade80)',\n animation: 'cursorBlink 1s ease-in-out infinite',\n boxShadow: '0 0 8px rgba(34, 197, 94, 0.6)',\n }}\n />\n )}\n </div>\n\n {/* 点击继续提示 - 使用绝对定位避免影响布局 */}\n <div className=\"flex justify-end mt-4 h-10 relative\">\n {isComplete && theme.showContinueHint && (\n <span \n className=\"text-sm px-4 py-2 rounded-full backdrop-blur-lg font-medium absolute right-0\"\n style={{\n background: 'linear-gradient(135deg, rgba(203, 213, 225, 0.9), rgba(226, 232, 240, 0.85))',\n color: 'rgba(71, 85, 105, 0.9)',\n animation: 'bounce 2s ease-in-out infinite',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.6)',\n border: '1px solid rgba(148, 163, 184, 0.4)',\n }}\n >\n {theme.continueHint}\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将对话框渲染到 body,避免父容器的 overflow:hidden 影响\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(dialogueContent, portalContainer);\n};\n\nexport default DialogueBox;\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueHistoryItem, DialogueBoxTheme } from './types';\nimport { clsx } from 'clsx';\n\ninterface HistoryPanelProps {\n /** 历史记录列表 */\n history: DialogueHistoryItem[];\n /** 主题配置 */\n theme?: DialogueBoxTheme;\n /** 关闭面板 */\n onClose: () => void;\n /** 样式 */\n className?: string;\n}\n\n/**\n * HistoryPanel - 对话历史记录面板\n * \n * 显示玩家已经阅读过的所有对话\n */\nexport const HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n theme,\n onClose,\n className,\n}) => {\n // 避免 SSR hydration 错误\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 历史面板内容\n const historyContent = (\n <div\n className={clsx('fixed inset-0 flex flex-col', className)}\n style={{\n zIndex: 1,\n pointerEvents: 'auto',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.05))',\n }}\n onClick={onClose}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-25 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.15) 0%, \n rgba(173, 216, 230, 0.15) 25%,\n rgba(221, 160, 221, 0.15) 50%,\n rgba(255, 218, 185, 0.15) 75%,\n rgba(255, 182, 193, 0.15) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n />\n\n {/* 毛玻璃效果 */}\n <div \n className=\"absolute inset-0 pointer-events-none\"\n style={{\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n />\n\n {/* 内容容器 */}\n <div className=\"relative z-10 flex flex-col h-full\" onClick={(e) => e.stopPropagation()}>\n {/* 标题栏 */}\n <div \n className=\"flex items-center justify-between px-8 py-6 border-b relative\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.25)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 4px 24px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n >\n <h2 className=\"text-2xl font-bold text-white flex items-center gap-3\">\n <span className=\"text-3xl\">📜</span>\n <span style={{ textShadow: '0 2px 12px rgba(255, 255, 255, 0.3)' }}>对话历史</span>\n </h2>\n <button\n onClick={onClose}\n className=\"p-3 hover:bg-white/20 rounded-2xl transition-all text-white hover:text-white hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n aria-label=\"关闭\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* 历史记录列表 */}\n <div className=\"flex-1 overflow-y-auto p-6 space-y-4\">\n {history.length === 0 ? (\n <div className=\"text-center text-white/70 py-20 text-lg font-medium\" style={{ textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)' }}>\n 暂无对话历史\n </div>\n ) : (\n history.map((item, index) => (\n <div\n key={(item.nodeIndex) + '-' + (item.dialogueIndex) + '-' + (index)}\n className=\"p-6 rounded-2xl transition-all hover:scale-[1.01] relative overflow-hidden cursor-pointer\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n boxShadow: '0 8px 24px rgba(255, 255, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute top-0 left-0 right-0 h-0.5\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n \n {/* 说话者 */}\n {item.speaker && (\n <div\n className=\"inline-block px-5 py-2 rounded-xl mb-3 text-sm font-bold shadow-lg relative overflow-hidden\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n color: '#ffffff',\n boxShadow: '0 4px 12px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n }}\n >\n {/* 装饰光效 */}\n <div \n className=\"absolute inset-0 opacity-30\"\n style={{\n background: 'linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.4) 50%, transparent 70%)',\n backgroundSize: '200% 200%',\n animation: 'shimmer 3s infinite',\n }}\n />\n <span className=\"relative z-10 drop-shadow-lg\">{item.speaker}</span>\n </div>\n )}\n \n {/* 对话内容 */}\n <p\n className=\"text-base leading-relaxed\"\n style={{ \n color: '#ffffff',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n {item.text}\n </p>\n </div>\n ))\n )}\n </div>\n\n {/* 底部提示 */}\n <div \n className=\"px-8 py-4 border-t text-center\"\n style={{\n borderColor: 'rgba(255, 255, 255, 0.2)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: 'inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n >\n <span \n className=\"text-sm px-5 py-2.5 rounded-full inline-block font-medium\"\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n 点击背景关闭\n </span>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 将历史面板渲染到 body,确保显示在最上层\n // 仅在客户端挂载后使用 Portal,避免 SSR hydration 错误\n if (!isMounted) {\n return null;\n }\n\n // 确保有一个专门的容器用于 Portal 内容\n let portalContainer = document.getElementById('history-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'history-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n return createPortal(historyContent, portalContainer);\n};\n\nexport default HistoryPanel;\n\n\n\n\n\n\n\n\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clsx } from 'clsx';\n\nexport interface LoadingScreenProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 加载文本 */\n loadingText?: string;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * LoadingScreen - 加载界面组件\n * \n * 用于 MMD Visual Novel 的加载状态显示\n */\nexport const LoadingScreen: React.FC<LoadingScreenProps> = ({\n isLoading = true,\n loadingText = '正在准备场景中...',\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[LoadingScreen] Render state:', {\n isLoading,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!isLoading) {\n console.log('[LoadingScreen] Not showing, returning null');\n return null;\n }\n\n const content = (\n <div\n className={clsx('fixed inset-0 w-screen h-screen flex items-center justify-center', className)}\n style={{\n zIndex: 999998,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n margin: 0,\n padding: 0,\n }}\n >\n {/* 白色毛玻璃层 */}\n <div\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.1))',\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div\n className=\"flex items-center justify-center flex-col inset-0 w-full h-full pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.2) 0%, \n rgba(173, 216, 230, 0.2) 25%,\n rgba(221, 160, 221, 0.2) 50%,\n rgba(255, 218, 185, 0.2) 75%,\n rgba(255, 182, 193, 0.2) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n <div\n className=\"text-lg font-medium text-white text-center px-6 py-3 rounded-2xl\">\n {loadingText}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('loading-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'loading-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n // 更新容器样式\n portalContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100vw;\n height: 100vh;\n margin: 0;\n padding: 0;\n overflow: hidden;\n z-index: 999998;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nLoadingScreen.displayName = 'LoadingScreen';\n\nexport default LoadingScreen;\n\n\n\n\n\n\n\n\n\n\n\n\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clsx } from 'clsx';\n\nexport interface StartScreenProps {\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称 */\n scriptName?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 设置按钮文本 */\n settingsText?: string;\n /** 关于按钮文本 */\n aboutText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义设置面板内容 */\n customSettingsContent?: React.ReactNode;\n /** 自定义关于面板内容 */\n customAboutContent?: React.ReactNode;\n}\n\n/**\n * VNModal - 简单的弹窗组件,用于设置和关于\n */\nconst VNModal: React.FC<{\n title: string;\n show: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}> = ({ title, show, onClose, children }) => {\n if (!show) return null;\n\n return (\n <div \n className=\"fixed inset-0 flex items-center justify-center backdrop-blur-xl z-[1000] pointer-events-auto transition-all animate-in fade-in zoom-in-95 duration-300 px-4\"\n style={{ background: 'rgba(100, 116, 139, 0.3)' }}\n onClick={onClose}\n >\n <div \n className=\"w-full max-w-lg p-4 sm:p-6 md:p-8 rounded-3xl sm:rounded-[2.5rem] border relative overflow-hidden max-h-[90vh] overflow-y-auto\"\n style={{\n background: 'linear-gradient(135deg, rgba(248, 250, 252, 0.98), rgba(241, 245, 249, 0.95))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n borderColor: 'rgba(203, 213, 225, 0.8)',\n boxShadow: '0 20px 80px rgba(100, 116, 139, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.8)'\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* 装饰性背景光晕 */}\n <div className=\"absolute -top-24 -right-24 w-64 h-64 bg-slate-300/15 rounded-full blur-3xl pointer-events-none\" />\n <div className=\"absolute -bottom-24 -left-24 w-64 h-64 bg-slate-400/15 rounded-full blur-3xl pointer-events-none\" />\n\n {/* 标题 - 移动端优化 */}\n <div className=\"flex items-center justify-between mb-6 sm:mb-8 relative\">\n <div className=\"flex flex-col\">\n <h2 className=\"text-xl sm:text-2xl font-bold tracking-wider drop-shadow-sm\" style={{ color: '#22c55e' }}>{title}</h2>\n <div className=\"h-1 sm:h-1.5 w-12 sm:w-16 bg-green-500/80 rounded-full mt-2 shadow-[0_0_10px_rgba(34,197,94,0.4)]\" />\n </div>\n <button \n onClick={onClose}\n className=\"w-10 h-10 sm:w-12 sm:h-12 rounded-full flex items-center justify-center transition-all border shadow-inner touch-manipulation shrink-0\"\n style={{\n background: 'rgba(241, 245, 249, 0.8)',\n borderColor: 'rgba(203, 213, 225, 0.6)',\n color: '#64748b'\n }}\n >\n ✕\n </button>\n </div>\n \n {/* 内容 - 移动端优化 */}\n <div className=\"leading-relaxed max-h-[40vh] sm:max-h-[50vh] overflow-y-auto pr-2 sm:pr-4 custom-scrollbar relative font-medium text-sm sm:text-base\" style={{ color: '#475569' }}>\n {children}\n </div>\n \n {/* 确定按钮 - 移动端优化 */}\n <div className=\"mt-6 sm:mt-10 flex justify-center relative\">\n <button\n onClick={onClose}\n className=\"px-10 sm:px-14 py-3 sm:py-3.5 rounded-xl sm:rounded-2xl font-bold transition-all border hover:scale-105 active:scale-95 tracking-[0.15em] sm:tracking-[0.2em] uppercase text-xs sm:text-sm touch-manipulation\"\n style={{\n background: 'linear-gradient(135deg, rgba(248, 250, 252, 0.98), rgba(226, 232, 240, 0.95))',\n borderColor: 'rgba(203, 213, 225, 0.8)',\n color: '#22c55e',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.8)'\n }}\n >\n Confirm\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * StartScreen - 开始界面组件\n * \n * 用于 MMD Visual Novel 的开始界面显示\n */\nexport const StartScreen: React.FC<StartScreenProps> = ({\n showStartScreen = false,\n scriptName = '',\n startText = '开始游戏',\n settingsText = '游戏设置',\n aboutText = '关于作品',\n onStart,\n className = '',\n customSettingsContent,\n customAboutContent,\n}) => {\n const [isMounted, setIsMounted] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showAbout, setShowAbout] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n if (!showStartScreen) return null;\n\n const content = (\n <div\n className={clsx('fixed inset-0 w-screen h-screen flex items-center justify-center overflow-hidden', className)}\n style={{\n zIndex: 999999,\n pointerEvents: 'auto',\n backgroundColor: '#f1f5f9',\n margin: 0,\n padding: 0,\n }}\n >\n {/* 动态明亮背景层 */}\n <div className=\"absolute inset-0 w-full h-full overflow-hidden\">\n {/* 中心扩散光辉 */}\n <div \n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[150vw] h-[150vw] opacity-20 pointer-events-none\"\n style={{\n background: 'radial-gradient(circle at center, rgba(226, 232, 240, 0.6) 0%, rgba(203, 213, 225, 0.3) 30%, transparent 70%)',\n filter: 'blur(60px)',\n animation: 'pulse 10s ease-in-out infinite'\n }}\n />\n \n {/* 漂浮的灰色星云 */}\n <div className=\"absolute inset-0 transition-opacity duration-1000\">\n <div className=\"absolute top-[-10%] left-[-10%] w-[60%] h-[60%] bg-slate-300/20 rounded-full blur-[120px] animate-blob\" />\n <div className=\"absolute bottom-[-10%] right-[-10%] w-[60%] h-[60%] bg-slate-400/15 rounded-full blur-[120px] animate-blob animation-delay-2000\" />\n <div className=\"absolute top-[20%] right-[10%] w-[40%] h-[40%] bg-slate-300/15 rounded-full blur-[100px] animate-blob animation-delay-4000\" />\n </div>\n\n {/* 密集的微粒效果 - 移动端减少数量 */}\n <div className=\"absolute inset-0 opacity-30\">\n {[...Array(typeof window !== 'undefined' && window.innerWidth < 768 ? 20 : 40)].map((_, i) => (\n <div \n key={i}\n className=\"absolute bg-slate-400/60 rounded-full\"\n style={{\n width: Math.random() * 3 + 1 + 'px',\n height: Math.random() * 3 + 1 + 'px',\n top: Math.random() * 100 + '%',\n left: Math.random() * 100 + '%',\n boxShadow: '0 0 10px rgba(148, 163, 184, 0.3)',\n animation: 'floatParticle ' + (Math.random() * 10 + 10) + 's linear infinite',\n animationDelay: '-' + (Math.random() * 20) + 's'\n }}\n />\n ))}\n </div>\n </div>\n\n {/* 主内容区域 - 移动端优化 */}\n <div className=\"relative z-10 w-full max-w-5xl mx-auto px-4 sm:px-6 flex flex-col items-center\">\n \n {/* 标题区域 - 响应式间距 */}\n <div className=\"text-center mb-12 sm:mb-20 md:mb-32 group flex flex-col items-center\">\n {/* 上装饰线 - 移动端缩小 */}\n <div className=\"w-24 sm:w-40 h-px bg-gradient-to-r from-transparent via-slate-400/60 to-transparent mb-6 sm:mb-10 shadow-[0_0_15px_rgba(148,163,184,0.3)]\" />\n \n {/* 标题 - 响应式字体 */}\n <h1\n className=\"text-4xl sm:text-5xl md:text-6xl lg:text-8xl font-black tracking-[0.1em] sm:tracking-[0.15em] leading-tight select-none px-4\"\n style={{\n color: '#22c55e',\n filter: 'drop-shadow(0 0 20px rgba(34, 197, 94, 0.4))',\n textShadow: '0 4px 12px rgba(100, 116, 139, 0.3)'\n }}\n >\n {scriptName || 'VISUAL NOVEL'}\n </h1>\n \n {/* 下装饰区 - 响应式 */}\n <div className=\"mt-6 sm:mt-10 flex flex-col items-center gap-3 sm:gap-4\">\n <div className=\"h-0.5 sm:h-1 w-20 sm:w-32 bg-green-500 rounded-full opacity-80 shadow-[0_0_20px_rgba(34,197,94,0.5)]\" />\n <span className=\"text-xs sm:text-sm md:text-base tracking-[0.5em] sm:tracking-[0.8em] font-medium uppercase translate-x-[0.25em] sm:translate-x-[0.4em]\" style={{ color: '#64748b' }}>\n Adventure System\n </span>\n </div>\n </div>\n\n {/* 交互按钮区 - 移动端优化 */}\n <div className=\"flex flex-col gap-6 sm:gap-10 items-center w-full max-w-sm px-4 sm:px-0\">\n \n {/* 核心开始按钮 - 响应式高度 */}\n <button\n onClick={onStart}\n className=\"group relative w-full h-16 sm:h-20 flex items-center justify-center transition-all duration-500 active:scale-95 touch-manipulation\"\n >\n {/* 按钮底色 */}\n <div \n className=\"absolute inset-0 backdrop-blur-2xl border-2 rounded-3xl transition-all duration-500 group-hover:-inset-1\"\n style={{\n background: 'linear-gradient(135deg, rgba(248, 250, 252, 0.98), rgba(226, 232, 240, 0.95))',\n borderColor: 'rgba(203, 213, 225, 0.8)',\n boxShadow: '0 8px 40px rgba(148, 163, 184, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.8)'\n }}\n />\n \n {/* 流光特效 */}\n <div className=\"absolute inset-0 overflow-hidden rounded-3xl pointer-events-none\">\n <div className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700 bg-gradient-to-r from-transparent via-slate-300/30 to-transparent -skew-x-[25deg] -translate-x-[200%] group-hover:translate-x-[200%] transition-transform duration-1000 ease-in-out\" />\n </div>\n \n <div className=\"relative flex items-center gap-3 sm:gap-6\">\n <div className=\"w-2 h-2 sm:w-3 sm:h-3 rounded-full bg-green-500 animate-ping opacity-75\" />\n <span className=\"text-lg sm:text-2xl font-black tracking-[0.3em] sm:tracking-[0.4em] drop-shadow-sm\" style={{ color: '#22c55e' }}>{startText}</span>\n <div className=\"w-2 h-2 sm:w-3 sm:h-3 rounded-full bg-green-600 animate-ping opacity-75\" />\n </div>\n </button>\n\n {/* 功能按钮组 - 移动端优化 */}\n <div className=\"flex gap-4 sm:gap-8 w-full justify-center\">\n {[\n { text: settingsText, onClick: () => setShowSettings(true) },\n { text: aboutText, onClick: () => setShowAbout(true) }\n ].map((btn, idx) => (\n <button\n key={idx}\n onClick={btn.onClick}\n className=\"group relative flex-1 h-12 sm:h-14 flex items-center justify-center transition-all duration-300 active:scale-95 overflow-hidden rounded-xl sm:rounded-2xl touch-manipulation\"\n >\n <div \n className=\"absolute inset-0 backdrop-blur-xl border transition-all duration-300\"\n style={{\n background: 'linear-gradient(135deg, rgba(241, 245, 249, 0.95), rgba(226, 232, 240, 0.9))',\n borderColor: 'rgba(203, 213, 225, 0.6)',\n boxShadow: '0 4px 16px rgba(100, 116, 139, 0.15)'\n }}\n />\n <span className=\"relative text-xs sm:text-sm md:text-base font-bold tracking-[0.15em] sm:tracking-[0.25em] transition-colors uppercase\" style={{ color: '#64748b' }}>\n {btn.text}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 固定到底部的版本信息 - 移动端优化 */}\n <div className=\"fixed bottom-4 sm:bottom-10 left-0 right-0 text-center pointer-events-none select-none px-4\">\n <div className=\"inline-block px-3 sm:px-6 py-1.5 sm:py-2 rounded-full backdrop-blur-md border\" style={{\n background: 'rgba(248, 250, 252, 0.8)',\n borderColor: 'rgba(203, 213, 225, 0.3)'\n }}>\n <span className=\"text-[8px] sm:text-[10px] md:text-xs tracking-[0.3em] sm:tracking-[0.5em] font-light uppercase\" style={{ color: 'rgba(100, 116, 139, 0.5)' }}>\n Ver 1.6.2 — ENGINE POWERED BY SA2KIT\n </span>\n </div>\n </div>\n\n {/* 弹窗内容 */}\n <VNModal title={settingsText} show={showSettings} onClose={() => setShowSettings(false)}>\n {customSettingsContent ? (\n <div className=\"py-2 sm:py-4\">\n {customSettingsContent}\n </div>\n ) : (\n <div className=\"space-y-6 sm:space-y-8 py-2 sm:py-4\">\n <div className=\"space-y-3 sm:space-y-4\">\n <div className=\"flex justify-between items-center text-xs sm:text-sm font-bold tracking-wider sm:tracking-widest\" style={{ color: '#64748b' }}>\n <span>MUSIC VOLUME</span>\n <span>80%</span>\n </div>\n <div className=\"h-2.5 sm:h-3 rounded-full p-0.5 border\" style={{ background: 'rgba(241, 245, 249, 0.5)', borderColor: 'rgba(203, 213, 225, 0.4)' }}>\n <div className=\"h-full w-[80%] rounded-full\" style={{ background: 'linear-gradient(to right, #22c55e, #4ade80)', boxShadow: '0 0 15px rgba(34, 197, 94, 0.5)' }} />\n </div>\n </div>\n \n <div className=\"space-y-3 sm:space-y-4\">\n <div className=\"flex justify-between items-center text-xs sm:text-sm font-bold tracking-wider sm:tracking-widest\" style={{ color: '#64748b' }}>\n <span>TEXT SPEED</span>\n <span>NORMAL</span>\n </div>\n <div className=\"flex gap-2 sm:gap-3\">\n {['SLOW', 'NORMAL', 'FAST'].map((s, i) => (\n <div \n key={s} \n className=\"flex-1 py-2.5 sm:py-3 rounded-lg sm:rounded-xl border text-center text-[10px] sm:text-xs font-bold transition-all cursor-pointer touch-manipulation\"\n style={i===1 ? {\n background: 'rgba(34, 197, 94, 0.15)',\n borderColor: '#22c55e',\n color: '#22c55e'\n } : {\n background: 'rgba(241, 245, 249, 0.5)',\n borderColor: 'rgba(203, 213, 225, 0.4)',\n color: 'rgba(100, 116, 139, 0.6)'\n }}\n >\n {s}\n </div>\n ))}\n </div>\n </div>\n \n <div className=\"pt-3 sm:pt-4 flex flex-col sm:flex-row items-center justify-between gap-2 sm:gap-0 opacity-50 italic text-[10px] sm:text-xs border-t\" style={{ borderColor: 'rgba(203, 213, 225, 0.3)' }}>\n <span>Auto Save Enabled</span>\n <span>Cloud Sync Active</span>\n </div>\n </div>\n )}\n </VNModal>\n\n <VNModal title={aboutText} show={showAbout} onClose={() => setShowAbout(false)}>\n {customAboutContent ? (\n <div className=\"py-2 sm:py-4\">\n {customAboutContent}\n </div>\n ) : (\n <div className=\"space-y-6 sm:space-y-8 py-2 sm:py-4\">\n <div className=\"flex items-center gap-3 sm:gap-6 p-4 sm:p-6 rounded-2xl sm:rounded-3xl border\" style={{ background: 'rgba(241, 245, 249, 0.6)', borderColor: 'rgba(203, 213, 225, 0.4)' }}>\n <div className=\"w-14 h-14 sm:w-20 sm:h-20 rounded-xl sm:rounded-2xl flex items-center justify-center text-2xl sm:text-3xl font-black text-white shadow-lg shrink-0\" style={{ background: 'linear-gradient(to bottom right, #22c55e, #4ade80)' }}>\n S2\n </div>\n <div>\n <h3 className=\"text-lg sm:text-2xl font-black tracking-tight\" style={{ color: '#22c55e' }}>{scriptName || 'Project SA2'}</h3>\n <p className=\"text-[10px] sm:text-xs font-bold tracking-wider sm:tracking-widest mt-1 uppercase\" style={{ color: 'rgba(100, 116, 139, 0.6)' }}>Visual Novel Experience</p>\n </div>\n </div>\n \n <div className=\"space-y-3 sm:space-y-4 px-1 sm:px-2\">\n <p className=\"font-medium leading-relaxed text-sm sm:text-base\" style={{ color: '#475569' }}>\n 采用 sa2kit 引擎构建的新一代实时 3D 视觉小说。结合了 MMD 实时渲染技术与交互式剧情分支系统,致力于打造极致的沉浸式叙事体验。\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3 sm:gap-4 pt-4 sm:pt-6 border-t\" style={{ borderColor: 'rgba(203, 213, 225, 0.3)' }}>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[9px] sm:text-[10px] font-bold tracking-wider sm:tracking-widest\" style={{ color: 'rgba(100, 116, 139, 0.5)' }}>DEVELOPER</span>\n <span className=\"text-xs font-bold\" style={{ color: '#64748b' }}>SA2KIT TEAM</span>\n </div>\n <div className=\"flex flex-col gap-1 text-right\">\n <span className=\"text-[9px] sm:text-[10px] font-bold tracking-wider sm:tracking-widest\" style={{ color: 'rgba(100, 116, 139, 0.5)' }}>ENGINE</span>\n <span className=\"text-xs font-bold\" style={{ color: '#64748b' }}>THREE.JS / REACT</span>\n </div>\n </div>\n </div>\n )}\n </VNModal>\n\n {/* 注入所需的关键帧动画 */}\n <style>{`\n @keyframes floatParticle {\n from { transform: translateY(0) translateX(0); opacity: 0; }\n 20% { opacity: 1; }\n 80% { opacity: 1; }\n to { transform: translateY(-100vh) translateX(50px); opacity: 0; }\n }\n @keyframes blob {\n 0%, 100% { transform: scale(1); opacity: 0.1; }\n 50% { transform: scale(1.2); opacity: 0.2; }\n }\n .animate-blob {\n animation: blob 10s infinite;\n }\n .animation-delay-2000 {\n animation-delay: 2s;\n }\n .animation-delay-4000 {\n animation-delay: 4s;\n }\n .custom-scrollbar::-webkit-scrollbar {\n width: 6px;\n }\n .custom-scrollbar::-webkit-scrollbar-track {\n background: rgba(255, 255, 255, 0.05);\n border-radius: 10px;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.3);\n border-radius: 10px;\n border: 2px solid transparent;\n background-clip: content-box;\n }\n `}</style>\n </div>\n );\n\n // Portal 逻辑保持不变\n let portalContainer = typeof document !== 'undefined' ? document.getElementById('start-screen-portal-root') : null;\n if (typeof document !== 'undefined' && !portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'start-screen-portal-root';\n document.body.appendChild(portalContainer);\n }\n\n if (portalContainer) {\n portalContainer.style.cssText = `\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n width: 100vw; height: 100vh;\n margin: 0; padding: 0;\n overflow: hidden;\n z-index: 999999;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n }\n\n if (!portalContainer) return content;\n return createPortal(content, portalContainer);\n};\n\nStartScreen.displayName = 'StartScreen';\nexport default StartScreen;\n","import React from 'react';\nimport { LoadingScreen } from './LoadingScreen';\nimport { StartScreen } from './StartScreen';\n\n// 注入全局样式(如果还没有)\nif (typeof document !== 'undefined' && !document.getElementById('loading-overlay-animations')) {\n const style = document.createElement('style');\n style.id = 'loading-overlay-animations';\n style.textContent = `\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.9; transform: scale(1.05); }\n }\n `;\n document.head.appendChild(style);\n}\n\nexport interface LoadingOverlayProps {\n /** 是否显示加载状态 */\n isLoading?: boolean;\n /** 是否显示开始界面 */\n showStartScreen?: boolean;\n /** 脚本名称(用于开始界面) */\n scriptName?: string;\n /** 加载文本 */\n loadingText?: string;\n /** 开始按钮文本 */\n startText?: string;\n /** 设置按钮文本 */\n settingsText?: string;\n /** 关于按钮文本 */\n aboutText?: string;\n /** 点击开始回调 */\n onStart?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义设置面板内容 */\n customSettingsContent?: React.ReactNode;\n /** 自定义关于面板内容 */\n customAboutContent?: React.ReactNode;\n}\n\n/**\n * LoadingOverlay - 加载遮罩和开始界面组件容器\n * \n * 用于 MMD Visual Novel 的加载状态和开始界面显示\n * 组合了 LoadingScreen 和 StartScreen 两个独立组件\n */\nexport const LoadingOverlay: React.FC<LoadingOverlayProps> = ({\n isLoading = true,\n showStartScreen = false,\n scriptName = '',\n loadingText = '正在准备场景中...',\n startText = '开始游戏',\n settingsText = '游戏设置',\n aboutText = '关于作品',\n onStart,\n className = '',\n customSettingsContent,\n customAboutContent,\n}) => {\n return (\n <>\n <LoadingScreen\n isLoading={isLoading}\n loadingText={loadingText}\n className={className}\n />\n <StartScreen\n showStartScreen={showStartScreen}\n scriptName={scriptName}\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={onStart}\n className={className}\n customSettingsContent={customSettingsContent}\n customAboutContent={customAboutContent}\n />\n </>\n );\n};\n\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport default LoadingOverlay;\n\n\n\n\n\n\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface SkipConfirmDialogProps {\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const SkipConfirmDialog: React.FC<SkipConfirmDialogProps> = ({\n onConfirm,\n onCancel,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm pointer-events-auto\"\n style={{ zIndex: 999999 }}\n >\n <div \n className=\"p-8 rounded-3xl border border-white/30 shadow-2xl max-w-sm w-full mx-4 overflow-hidden relative\"\n style={{\n background: `linear-gradient(135deg, \n rgba(255, 255, 255, 0.2) 0%, \n rgba(255, 255, 255, 0.1) 100%)`,\n backdropFilter: 'blur(32px) saturate(200%)',\n WebkitBackdropFilter: 'blur(32px) saturate(200%)',\n }}\n >\n <h3 className=\"text-xl font-bold text-white mb-4 drop-shadow-md\">动画尚未播放完成</h3>\n <p className=\"text-white/90 mb-8 leading-relaxed drop-shadow-sm\">\n 当前场景的动画还没有完整播放一遍,是否直接跳转到下一个场景?\n </p>\n <div className=\"flex justify-end gap-4\">\n <button\n onClick={onCancel}\n className=\"px-6 py-2.5 rounded-2xl text-white/80 font-medium hover:text-white hover:bg-white/10 transition-all border border-white/10 hover:border-white/30\"\n >\n 取消\n </button>\n <button\n onClick={onConfirm}\n className=\"px-6 py-2.5 rounded-2xl bg-white/20 hover:bg-white/30 text-white font-bold transition-all border border-white/40 shadow-lg hover:scale-105 active:scale-95\"\n >\n 直接跳转\n </button>\n </div>\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default SkipConfirmDialog;\n\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueChoice, DialogueBoxTheme } from './types';\n\nexport interface ChoiceMenuProps {\n choices: DialogueChoice[];\n onSelect: (choice: DialogueChoice) => void;\n theme?: DialogueBoxTheme;\n}\n\nexport const ChoiceMenu: React.FC<ChoiceMenuProps> = ({\n choices,\n onSelect,\n theme,\n}) => {\n const [isMounted, setIsMounted] = React.useState(false);\n\n React.useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!isMounted) return null;\n\n const content = (\n <div \n className=\"fixed inset-0 flex flex-col items-center justify-center bg-black/20 backdrop-blur-sm pointer-events-auto transition-all animate-in fade-in duration-500\"\n style={{ zIndex: 1000000 }}\n >\n <div className=\"flex flex-col gap-4 w-full max-w-md px-6\">\n {choices.map((choice, index) => (\n <button\n key={index}\n onClick={() => onSelect(choice)}\n className=\"w-full py-4 px-8 rounded-2xl font-bold text-lg transition-all border shadow-xl hover:scale-105 active:scale-95 group relative overflow-hidden\"\n style={{\n background: `linear-gradient(135deg, \n rgba(248, 250, 252, 0.98) 0%, \n rgba(241, 245, 249, 0.95) 50%, \n rgba(226, 232, 240, 0.92) 100%)`,\n backdropFilter: 'blur(16px) saturate(200%)',\n WebkitBackdropFilter: 'blur(16px) saturate(200%)',\n borderColor: 'rgba(203, 213, 225, 0.8)',\n color: '#22c55e',\n boxShadow: `\n 0 8px 40px rgba(148, 163, 184, 0.2),\n 0 4px 16px rgba(100, 116, 139, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.8),\n inset 0 -1px 0 rgba(203, 213, 225, 0.5)\n `,\n }}\n >\n {/* 悬停光效 - 灰白色调 */}\n <div className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n background: 'linear-gradient(135deg, rgba(226, 232, 240, 0.5), rgba(203, 213, 225, 0.3))'\n }}\n />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-white/30 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out\" />\n \n <span className=\"relative z-10 \">{choice.text}</span>\n </button>\n ))}\n </div>\n </div>\n );\n\n let portalContainer = document.getElementById('dialogue-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'dialogue-portal-root';\n portalContainer.style.cssText = 'position: fixed; inset: 0; pointer-events: none; z-index: 999999;';\n document.body.appendChild(portalContainer);\n }\n\n return createPortal(content, portalContainer);\n};\n\nexport default ChoiceMenu;\n\n","import React from 'react';\n\ninterface LoopConfirmDialogProps {\n onRestart: () => void;\n onBackToStart: () => void;\n onCancel?: () => void;\n}\n\n/**\n * 循环确认对话框\n * 在剧本播放到最后一个节点时,询问用户是否继续循环\n */\nexport const LoopConfirmDialog: React.FC<LoopConfirmDialogProps> = ({\n onRestart,\n onBackToStart,\n onCancel,\n}) => {\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm\">\n <div className=\"mx-4 w-full max-w-md rounded-lg bg-gradient-to-br from-slate-800 to-slate-900 p-6 shadow-2xl border border-slate-700\">\n {/* 标题 */}\n <div className=\"mb-6 text-center\">\n <h3 className=\"text-2xl font-bold text-white mb-2\">\n 🎬 剧本已播放完毕\n </h3>\n <p className=\"text-slate-300 text-sm\">\n 你想要做什么呢?\n </p>\n </div>\n\n {/* 选项按钮 */}\n <div className=\"space-y-3\">\n {/* 重新开始 */}\n <button\n onClick={onRestart}\n className=\"w-full rounded-lg bg-gradient-to-r from-blue-500 to-blue-600 px-6 py-4 text-white font-medium shadow-lg hover:from-blue-600 hover:to-blue-700 transition-all duration-200 hover:shadow-xl hover:scale-105 active:scale-95\"\n >\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-xl\">🔄</span>\n <div className=\"text-left\">\n <div className=\"font-bold\">重新开始</div>\n <div className=\"text-xs text-blue-100 opacity-90\">从第一个节点继续播放</div>\n </div>\n </div>\n </button>\n\n {/* 回到开始页面 */}\n <button\n onClick={onBackToStart}\n className=\"w-full rounded-lg bg-gradient-to-r from-purple-500 to-purple-600 px-6 py-4 text-white font-medium shadow-lg hover:from-purple-600 hover:to-purple-700 transition-all duration-200 hover:shadow-xl hover:scale-105 active:scale-95\"\n >\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-xl\">🏠</span>\n <div className=\"text-left\">\n <div className=\"font-bold\">回到开始页面</div>\n <div className=\"text-xs text-purple-100 opacity-90\">返回标题界面</div>\n </div>\n </div>\n </button>\n\n {/* 取消按钮(可选) */}\n {onCancel && (\n <button\n onClick={onCancel}\n className=\"w-full rounded-lg bg-slate-700 px-6 py-3 text-slate-300 font-medium hover:bg-slate-600 transition-all duration-200\"\n >\n 取消\n </button>\n )}\n </div>\n\n {/* 提示信息 */}\n <div className=\"mt-4 text-center text-xs text-slate-400\">\n 💡 提示:你也可以使用快进按钮跳过已看过的内容\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { clsx } from 'clsx';\n\n/**\n * 应援按钮组件\n */\nexport interface CheerButtonProps {\n /** 点击回调 */\n onClick: () => void;\n /** 按钮文字 */\n text?: string;\n /** 是否显示 */\n show: boolean;\n /** 样式类名 */\n className?: string;\n}\n\nexport const CheerButton: React.FC<CheerButtonProps> = ({\n onClick,\n text = '应援',\n show,\n className = '',\n}) => {\n if (!show) return null;\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'fixed bottom-32 right-8 px-6 py-3 rounded-full bg-gradient-to-r from-pink-500 to-purple-500 hover:from-pink-600 hover:to-purple-600 active:scale-95 text-white font-bold text-lg shadow-lg hover:shadow-xl transition-all duration-200 flex items-center gap-2',\n className\n )}\n style={{\n animation: 'cheer-pulse 2s ease-in-out infinite',\n zIndex: 1000000, // 高于对话框的 z-index (999999)\n }}\n >\n <span className=\"text-2xl\">🎉</span>\n <span>{text}</span>\n <style>{`\n @keyframes cheer-pulse {\n 0%, 100% { \n transform: scale(1);\n box-shadow: 0 0 0 0 rgba(236, 72, 153, 0.7);\n }\n 50% { \n transform: scale(1.05);\n box-shadow: 0 0 20px 10px rgba(236, 72, 153, 0);\n }\n }\n `}</style>\n </button>\n );\n};\n\nexport default CheerButton;\n\n","import React, { useRef, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport * as THREE from 'three';\nimport { clsx } from 'clsx';\n\n/**\n * 3D粒子彩花效果组件\n * \n * 功能:\n * - 点击应援按钮触发粒子爆炸效果\n * - 彩色粒子从中心向外扩散\n * - 粒子受重力影响下落\n * - 自动清理完成的粒子\n */\n\nexport interface CheerParticlesRef {\n /** 触发一次粒子效果 */\n trigger: () => void;\n /** 清理所有粒子 */\n clear: () => void;\n}\n\nexport interface CheerParticlesProps {\n /** 容器样式类名 */\n className?: string;\n}\n\ninterface Particle {\n mesh: THREE.Mesh;\n velocity: THREE.Vector3;\n acceleration: THREE.Vector3;\n lifetime: number;\n maxLifetime: number;\n initialScale: number;\n}\n\nexport const CheerParticles = forwardRef<CheerParticlesRef, CheerParticlesProps>(\n ({ className = '' }, ref) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.OrthographicCamera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const particlesRef = useRef<Particle[]>([]);\n const animationFrameRef = useRef<number | null>(null);\n\n // 初始化Three.js场景\n useEffect(() => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // 创建场景\n const scene = new THREE.Scene();\n sceneRef.current = scene;\n\n // 创建正交相机(2D视角)\n const camera = new THREE.OrthographicCamera(\n -width / 2,\n width / 2,\n height / 2,\n -height / 2,\n 1,\n 1000\n );\n camera.position.z = 100;\n cameraRef.current = camera;\n\n // 创建渲染器\n const renderer = new THREE.WebGLRenderer({\n alpha: true,\n antialias: true,\n });\n renderer.setSize(width, height);\n renderer.setPixelRatio(window.devicePixelRatio);\n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 动画循环\n const animate = () => {\n animationFrameRef.current = requestAnimationFrame(animate);\n updateParticles();\n if (rendererRef.current && sceneRef.current && cameraRef.current) {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n };\n animate();\n\n // 窗口大小调整\n const handleResize = () => {\n if (!containerRef.current || !cameraRef.current || !rendererRef.current) return;\n \n const newWidth = containerRef.current.clientWidth;\n const newHeight = containerRef.current.clientHeight;\n\n cameraRef.current.left = -newWidth / 2;\n cameraRef.current.right = newWidth / 2;\n cameraRef.current.top = newHeight / 2;\n cameraRef.current.bottom = -newHeight / 2;\n cameraRef.current.updateProjectionMatrix();\n\n rendererRef.current.setSize(newWidth, newHeight);\n };\n window.addEventListener('resize', handleResize);\n\n // 清理\n return () => {\n window.removeEventListener('resize', handleResize);\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n if (rendererRef.current) {\n container.removeChild(rendererRef.current.domElement);\n rendererRef.current.dispose();\n }\n clearParticles();\n };\n }, []);\n\n // 创建单个粒子\n const createParticle = (\n position: THREE.Vector3,\n velocity: THREE.Vector3,\n color: number\n ): Particle => {\n // 创建粒子几何体 - 使用多种形状\n const shapes = [\n new THREE.SphereGeometry(8, 8, 8),\n new THREE.BoxGeometry(10, 10, 10),\n new THREE.ConeGeometry(5, 15, 6),\n ];\n const geometry = shapes[Math.floor(Math.random() * shapes.length)];\n \n const material = new THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: 1,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.position.copy(position);\n\n const initialScale = 1 + Math.random() * 0.5;\n mesh.scale.set(initialScale, initialScale, initialScale);\n\n return {\n mesh,\n velocity: velocity.clone(),\n acceleration: new THREE.Vector3(0, -500, 0), // 重力\n lifetime: 0,\n maxLifetime: 2 + Math.random() * 1, // 2-3秒\n initialScale,\n };\n };\n\n // 触发粒子爆炸\n const triggerParticles = () => {\n if (!sceneRef.current || !containerRef.current) return;\n\n const scene = sceneRef.current;\n const width = containerRef.current.clientWidth;\n const height = containerRef.current.clientHeight;\n\n // 彩色方案\n const colors = [\n 0xff69b4, // 粉红\n 0xffd700, // 金黄\n 0x00ffff, // 青色\n 0xff1493, // 深粉\n 0x9370db, // 紫色\n 0xff6347, // 番茄红\n 0x7fffd4, // 青绿色\n 0xffa500, // 橙色\n ];\n\n // 创建100个粒子\n const particleCount = 100;\n for (let i = 0; i < particleCount; i++) {\n const angle = (Math.PI * 2 * i) / particleCount;\n const speed = 200 + Math.random() * 300;\n const spreadZ = (Math.random() - 0.5) * 200;\n\n const velocity = new THREE.Vector3(\n Math.cos(angle) * speed,\n Math.sin(angle) * speed + Math.random() * 200,\n spreadZ\n );\n\n const color = colors[Math.floor(Math.random() * colors.length)] ?? 0xff69b4;\n const position = new THREE.Vector3(0, -height / 4, 0);\n\n const particle = createParticle(position, velocity, color);\n scene.add(particle.mesh);\n particlesRef.current.push(particle);\n }\n };\n\n // 更新粒子\n const updateParticles = () => {\n const deltaTime = 1 / 60; // 假设60fps\n const particles = particlesRef.current;\n\n for (let i = particles.length - 1; i >= 0; i--) {\n const particle = particles[i];\n if (!particle) continue;\n \n // 更新生命周期\n particle.lifetime += deltaTime;\n \n // 移除过期粒子\n if (particle.lifetime >= particle.maxLifetime) {\n if (sceneRef.current) {\n sceneRef.current.remove(particle.mesh);\n }\n particle.mesh.geometry.dispose();\n (particle.mesh.material as THREE.Material).dispose();\n particles.splice(i, 1);\n continue;\n }\n\n // 更新速度和位置\n particle.velocity.add(\n particle.acceleration.clone().multiplyScalar(deltaTime)\n );\n particle.mesh.position.add(\n particle.velocity.clone().multiplyScalar(deltaTime)\n );\n\n // 添加旋转\n particle.mesh.rotation.x += deltaTime * 2;\n particle.mesh.rotation.y += deltaTime * 3;\n\n // 渐隐效果\n const progress = particle.lifetime / particle.maxLifetime;\n const opacity = Math.max(0, 1 - progress);\n (particle.mesh.material as THREE.MeshBasicMaterial).opacity = opacity;\n\n // 缩放效果\n const scale = particle.initialScale * (1 - progress * 0.5);\n particle.mesh.scale.set(scale, scale, scale);\n }\n };\n\n // 清理所有粒子\n const clearParticles = () => {\n const particles = particlesRef.current;\n particles.forEach((particle) => {\n if (sceneRef.current) {\n sceneRef.current.remove(particle.mesh);\n }\n particle.mesh.geometry.dispose();\n (particle.mesh.material as THREE.Material).dispose();\n });\n particlesRef.current = [];\n };\n\n // 暴露方法\n useImperativeHandle(ref, () => ({\n trigger: triggerParticles,\n clear: clearParticles,\n }));\n\n return (\n <div\n ref={containerRef}\n className={clsx('pointer-events-none absolute inset-0', className)}\n style={{ zIndex: 999998 }}\n />\n );\n }\n);\n\nCheerParticles.displayName = 'CheerParticles';\n\nexport default CheerParticles;\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport { MMDLightingDebugPanel, type MMDSceneRefs } from '../components/MMDLightingDebugPanel';\nimport { DialogueBox } from './DialogueBox';\nimport { HistoryPanel } from './HistoryPanel';\nimport { LoadingOverlay } from './LoadingOverlay';\nimport { SkipConfirmDialog } from './SkipConfirmDialog';\nimport { ChoiceMenu } from './ChoiceMenu';\nimport { LoopConfirmDialog } from './LoopConfirmDialog';\nimport { CheerButton } from './CheerButton';\nimport { CheerParticles, CheerParticlesRef } from './CheerParticles';\nimport { clsx } from 'clsx';\nimport {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelNode,\n DialogueLine,\n DialogueHistoryItem,\n VisualEffect,\n} from './types';\n\n/**\n * MMDVisualNovel - Galgame 风格视觉小说组件\n * \n * 核心功能:\n * - 将 MMDPlaylist 封装为 Galgame 风格\n * - 每个节点包含:模型、动作、对话数组\n * - 用户阅读完对话后自动切换节点\n * - 打字机效果显示文本\n * - 支持自动播放、快进、历史记录\n */\nexport const MMDVisualNovel = forwardRef<MMDVisualNovelRef, MMDVisualNovelProps>(\n (\n {\n script,\n stage,\n mobileOptimization,\n dialogueTheme,\n autoStart = false,\n startText,\n settingsText,\n aboutText,\n initialNodeIndex = 0,\n initialDialogueIndex = 0,\n onNodeChange,\n onDialogueChange,\n onScriptComplete,\n onError,\n showDebugInfo = false,\n debug = false,\n onTransitionStateChange,\n showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\n showLightingDebugPanel = false,\n lightingDebugInitialParams,\n customSettingsContent,\n customAboutContent,\n className,\n style,\n },\n ref\n ) => {\n const { nodes, loop = false } = script;\n\n // 状态管理\n const [currentNodeIndex, setCurrentNodeIndex] = useState(initialNodeIndex);\n const [currentDialogueIndex, setCurrentDialogueIndex] = useState(initialDialogueIndex);\n const [isLoading, setIsLoading] = useState(true);\n const [isAnimationPlaying, setIsAnimationPlaying] = useState(false); // 新增:追踪动画是否已开始播放\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [isAutoMode, setIsAutoMode] = useState(false);\n const [isTyping, setIsTyping] = useState(false);\n const [showHistory, setShowHistory] = useState(false);\n const [history, setHistory] = useState<DialogueHistoryItem[]>([]);\n const [isStarted, setIsStarted] = useState(autoStart);\n const [isVmdFinished, setIsVmdFinished] = useState(false);\n const [pendingNodeIndex, setPendingNodeIndex] = useState<number | null>(null);\n const [showChoices, setShowChoices] = useState(false);\n const [isCameraManual, setIsCameraManual] = useState(false);\n const [variables, setVariables] = useState<Record<string, string | number | boolean>>({});\n const [activeEffect, setActiveEffect] = useState<VisualEffect | null>(null);\n const [showLoopConfirm, setShowLoopConfirm] = useState(false);\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoTimerRef = useRef<NodeJS.Timeout | null>(null);\n const typingCompleteRef = useRef(false);\n const isStartedRef = useRef(autoStart); // 用 ref 跟踪 isStarted 的当前值\n const lastAnimationTimeRef = useRef(0);\n const isVmdFinishedRef = useRef(false);\n const effectTimerRef = useRef<NodeJS.Timeout | null>(null);\n const cheerParticlesRef = useRef<CheerParticlesRef>(null);\n\n // 获取当前节点和对话\n const currentNode = nodes[currentNodeIndex];\n const currentDialogue = currentNode?.dialogues[currentDialogueIndex] || null;\n\n const log = useCallback((...args: unknown[]) => {\n if (!debug) return;\n console.log('[MMDVisualNovel]', ...args);\n }, [debug]);\n\n useEffect(() => {\n if (!onTransitionStateChange) return;\n if (!isStarted) {\n onTransitionStateChange('idle');\n return;\n }\n if (isTransitioning) {\n onTransitionStateChange('transitioning');\n return;\n }\n if (isLoading || !isAnimationPlaying) {\n onTransitionStateChange('loading');\n return;\n }\n onTransitionStateChange('ready');\n }, [isStarted, isTransitioning, isLoading, isAnimationPlaying, onTransitionStateChange]);\n\n // 添加对话到历史记录\n const addToHistory = useCallback((dialogue: DialogueLine, nodeIndex: number, dialogueIndex: number) => {\n setHistory((prev) => [\n ...prev,\n {\n nodeIndex,\n dialogueIndex,\n speaker: dialogue.speaker,\n text: dialogue.text,\n timestamp: Date.now(),\n },\n ]);\n }, []);\n\n // 触发特效\n const triggerEffect = useCallback((effect?: VisualEffect) => {\n if (!effect) return;\n\n // 清除旧的特效定时器\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n\n setActiveEffect(effect);\n\n // 自动清理\n effectTimerRef.current = setTimeout(() => {\n setActiveEffect(null);\n effectTimerRef.current = null;\n }, effect.duration || 1000);\n }, []);\n\n // 跳转到指定节点\n const goToNode = useCallback(\n (nodeIndex: number, force: boolean = false) => {\n if (nodeIndex < 0 || nodeIndex >= nodes.length) return;\n if (isTransitioning) return;\n\n const node = nodes[nodeIndex];\n if (!node) return;\n\n // 如果当前节点有 VMD 动画且未播放完成,且不是强制跳转,则弹出确认框\n const currentResources = nodes[currentNodeIndex]?.resources;\n if (!force && currentResources?.motionPath && !isVmdFinishedRef.current) {\n log('VMD not finished, showing confirmation');\n setPendingNodeIndex(nodeIndex);\n return;\n }\n\n log('Transitioning to node', nodeIndex);\n\n // 🔧 立即设置加载状态,确保遮罩覆盖整个切换过程\n setIsTransitioning(true);\n setIsLoading(true);\n setIsAnimationPlaying(false); // 重置动画播放状态\n setIsVmdFinished(false); // 重置 VMD 完成状态\n isVmdFinishedRef.current = false; // 同步重置 ref\n setPendingNodeIndex(null); // 清除挂起的跳转\n setShowChoices(false); // 隐藏选项菜单\n lastAnimationTimeRef.current = 0; // 重置动画时间记录\n\n // 给物理引擎清理时间后再更新节点\n setTimeout(() => {\n // 更新节点\n setCurrentNodeIndex(nodeIndex);\n setCurrentDialogueIndex(0);\n typingCompleteRef.current = false;\n\n // 添加第一条对话到历史\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n addToHistory(node.dialogues[0], nodeIndex, 0);\n }\n\n onNodeChange?.(node, nodeIndex);\n if (node.dialogues.length > 0 && node?.dialogues[0] !== undefined) {\n onDialogueChange?.(node.dialogues[0], 0, nodeIndex);\n }\n\n // 🔧 结束过渡状态,但保持加载状态直到新模型完全加载\n // 注意:isLoading 和 isAnimationPlaying 会在 MMDPlayerBase 的回调中更新\n setTimeout(() => {\n setIsTransitioning(false);\n log('Transition to node completed, waiting for model load', nodeIndex);\n }, 100);\n }, 300);\n },\n [nodes, isTransitioning, addToHistory, onNodeChange, onDialogueChange, currentNodeIndex]\n );\n\n // 判定并跳转到下一个节点\n const triggerNodeTransition = useCallback(() => {\n if (!currentNode) return;\n\n let nextNodeIndex = currentNodeIndex + 1;\n\n // 如果存在分支判定逻辑\n if (currentNode.nextCondition) {\n const { key, map, defaultIndex } = currentNode.nextCondition;\n const val = variables[key];\n if (val !== undefined && map[val as string | number] !== undefined) {\n nextNodeIndex = map[val as string | number]!;\n log('Branching', { key, val, nextNodeIndex });\n } else {\n nextNodeIndex = defaultIndex;\n }\n }\n\n if (nextNodeIndex < nodes.length && nextNodeIndex >= 0) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n // 到达最后一个节点,显示循环确认对话框\n log('Reached final node, showing loop confirmation');\n setShowLoopConfirm(true);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }, [currentNode, currentNodeIndex, nodes.length, loop, variables, goToNode, onScriptComplete]);\n\n // 切换到下一条对话\n const goToNextDialogue = useCallback(() => {\n if (!currentNode) return;\n\n // 如果当前对话行自带分支,且还未显示分支,则先显示分支\n if (currentDialogue?.choices && currentDialogue.choices.length > 0 && !showChoices) {\n setShowChoices(true);\n return;\n }\n\n // 清除自动播放定时器\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n autoTimerRef.current = null;\n }\n\n const nextDialogueIndex = currentDialogueIndex + 1;\n\n if (nextDialogueIndex < currentNode.dialogues.length && currentNode?.dialogues[nextDialogueIndex] !== undefined) {\n // 还有更多对话\n const nextDialogue = currentNode.dialogues[nextDialogueIndex];\n setCurrentDialogueIndex(nextDialogueIndex);\n addToHistory(nextDialogue, currentNodeIndex, nextDialogueIndex);\n onDialogueChange?.(nextDialogue, nextDialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n } else if (currentNode.choices && currentNode.choices.length > 0) {\n // 当前节点末尾有分支选项(兼容旧版)\n setShowChoices(true);\n } else {\n // 无分支,自动切换到下一个节点\n triggerNodeTransition();\n }\n }, [currentNode, currentDialogue, currentDialogueIndex, currentNodeIndex, nodes.length, loop, addToHistory, onDialogueChange, onScriptComplete, showChoices, variables, goToNode, triggerNodeTransition]);\n\n // 跳转到指定对话\n const goToDialogue = useCallback(\n (dialogueIndex: number) => {\n if (!currentNode) return;\n const dialogue = currentNode.dialogues[dialogueIndex];\n\n if (dialogueIndex < 0 || dialogueIndex >= currentNode.dialogues.length || dialogue === undefined) return;\n setCurrentDialogueIndex(dialogueIndex);\n addToHistory(dialogue, currentNodeIndex, dialogueIndex);\n onDialogueChange?.(dialogue, dialogueIndex, currentNodeIndex);\n typingCompleteRef.current = false;\n },\n [currentNode, currentNodeIndex, addToHistory, onDialogueChange]\n );\n\n // 处理点击对话框\n const handleDialogueClick = useCallback(() => {\n if (!typingCompleteRef.current) {\n // 还在打字中,跳过打字动画\n typingCompleteRef.current = true;\n return;\n }\n\n // 打字完成,切换到下一条对话\n goToNextDialogue();\n }, [goToNextDialogue]);\n\n // 处理打字完成\n const handleTypingComplete = useCallback(() => {\n typingCompleteRef.current = true;\n setIsTyping(false);\n\n // 如果是自动模式或不需要等待点击\n if (isAutoMode || currentDialogue?.waitForClick === false) {\n const delay = currentDialogue?.autoDelay ?? 2000;\n autoTimerRef.current = setTimeout(() => {\n goToNextDialogue();\n }, delay);\n }\n }, [isAutoMode, currentDialogue, goToNextDialogue]);\n\n // 监听打字状态\n useEffect(() => {\n if (currentDialogue) {\n setIsTyping(true);\n typingCompleteRef.current = false;\n\n // 计算打字完成时间\n const text = currentDialogue.text;\n const speed = currentDialogue.typeSpeed ?? 50;\n const typingDuration = text.length * speed;\n\n const timer = setTimeout(() => {\n handleTypingComplete();\n }, typingDuration);\n\n return () => clearTimeout(timer);\n }\n // 如果没有对话,返回空的清理函数\n return undefined;\n }, [currentDialogue, handleTypingComplete]);\n\n useEffect(() => {\n if (currentDialogue?.effect) {\n triggerEffect(currentDialogue.effect);\n }\n }, [currentNodeIndex, currentDialogueIndex, triggerEffect]);\n\n // 切换自动模式\n const toggleAutoMode = useCallback(() => {\n setIsAutoMode((prev) => !prev);\n }, []);\n\n // 快进 - 跳到下一个节点\n const handleSkip = useCallback(() => {\n // 如果循环确认对话框已显示,忽略快进操作\n if (showLoopConfirm) {\n return;\n }\n\n // 如果当前节点有选项,先显示选项\n if (currentNode?.choices && currentNode.choices.length > 0) {\n setShowChoices(true);\n return;\n }\n\n const nextNodeIndex = currentNodeIndex + 1;\n if (nextNodeIndex < nodes.length) {\n // 还有下一个节点,直接跳转\n goToNode(nextNodeIndex);\n } else if (loop) {\n // 🔧 修复:到达最后一个节点且开启循环时,显示确认对话框\n log('Skip reached final node, showing loop confirmation');\n setShowLoopConfirm(true);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }, [currentNode, currentNodeIndex, nodes.length, loop, goToNode, onScriptComplete, showLoopConfirm]);\n\n // 开始游戏\n const handleStart = useCallback(() => {\n setIsStarted(true);\n isStartedRef.current = true; // 同步更新 ref\n if (currentNode && currentNode.dialogues.length > 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n // 启动动画播放\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }, [currentNode, currentNodeIndex, addToHistory]);\n\n // 回到开始页面\n const handleBackToStart = useCallback(() => {\n setShowLoopConfirm(false);\n setIsStarted(false);\n isStartedRef.current = false;\n setCurrentNodeIndex(initialNodeIndex);\n setCurrentDialogueIndex(initialDialogueIndex);\n setHistory([]);\n setVariables({});\n setIsLoading(true);\n setIsAnimationPlaying(false);\n typingCompleteRef.current = false;\n log('Back to start screen');\n }, [initialNodeIndex, initialDialogueIndex]);\n\n // 处理应援按钮点击\n const handleCheer = useCallback(() => {\n log('Trigger cheer effect');\n cheerParticlesRef.current?.trigger();\n }, []);\n\n // 重新开始(从第一个节点)\n const handleRestartLoop = useCallback(() => {\n setShowLoopConfirm(false);\n goToNode(0, true);\n log('Restart loop');\n }, [goToNode]);\n\n // 暴露给父组件的方法\n useImperativeHandle(\n ref,\n () => ({\n goToNode,\n goToDialogue,\n getCurrentNodeIndex: () => currentNodeIndex,\n getCurrentDialogueIndex: () => currentDialogueIndex,\n getHistory: () => history,\n getVariables: () => variables,\n setVariable: (key: string, value: string | number | boolean) => {\n setVariables(prev => ({ ...prev, [key]: value }));\n },\n setAutoMode: setIsAutoMode,\n skipTyping: () => {\n typingCompleteRef.current = true;\n },\n triggerEffect,\n }),\n [goToNode, goToDialogue, currentNodeIndex, currentDialogueIndex, history, triggerEffect]\n );\n\n // 自动开始时添加第一条对话到历史\n useEffect(() => {\n if (autoStart && currentNode && currentNode.dialogues.length > 0 && history.length === 0 && currentNode?.dialogues[0] !== undefined) {\n addToHistory(currentNode?.dialogues[0], currentNodeIndex, 0);\n }\n }, [autoStart, currentNode, currentNodeIndex, history.length, addToHistory]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (autoTimerRef.current) {\n clearTimeout(autoTimerRef.current);\n }\n if (effectTimerRef.current) {\n clearTimeout(effectTimerRef.current);\n }\n };\n }, []);\n\n // 空剧本检查\n if (!currentNode) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 剧本为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={clsx('relative bg-black', className)}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n >\n {/* MMD 播放器层 - 覆盖整个屏幕,明确在最底层 */}\n <div\n className=\"absolute inset-0 w-full h-full\"\n style={{\n zIndex: 0,\n // 在加载期间隐藏,避免看到模型加载过程\n opacity: (isLoading || isTransitioning || !isAnimationPlaying) ? 0 : 1,\n transition: 'opacity 0.3s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n key={currentNode.id}\n ref={playerRef}\n resources={currentNode.resources}\n stage={{ ...stage, ...currentNode.stage }}\n autoPlay={isStarted}\n loop={currentNode.loopAnimation === true}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n log('MMDPlayerBase onLoad');\n setIsLoading(false);\n // 如果已经开始游戏,启动动画播放(使用 ref 获取最新值)\n if (isStartedRef.current) {\n log('Game already started, triggering play');\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }\n }}\n onPlay={() => {\n // 动画开始播放时才设置为 true\n log('MMDPlayerBase onPlay');\n setIsAnimationPlaying(true);\n }}\n onTimeUpdate={(time) => {\n const duration = playerRef.current?.getDuration() || 0;\n\n // 判定动画完成的条件:\n // 1. 播放进度超过 98%\n // 2. 或者检测到时间回跳(循环发生)\n const isNearEnd = duration > 0 && time > duration * 0.98;\n const isLooped = time < lastAnimationTimeRef.current && lastAnimationTimeRef.current > 0;\n\n if (isNearEnd || isLooped) {\n if (!isVmdFinishedRef.current) {\n log('VMD finished/looped, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }\n }\n lastAnimationTimeRef.current = time;\n }}\n onEnded={() => {\n log('VMD ended, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onError={onError}\n />\n )}\n </div>\n\n {/* 特效渲染层 */}\n {activeEffect && (\n <div\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n style={{ zIndex: 999 }}\n >\n {activeEffect.type === 'flash' && (\n <div\n className=\"h-full w-full\"\n style={{\n backgroundColor: activeEffect.color || 'white',\n animation: 'flash-anim ' + (activeEffect.duration || 500) + 'ms ease-out forwards'\n }}\n />\n )}\n\n {activeEffect.type === 'gif' && activeEffect.url && (\n <img\n src={activeEffect.url}\n alt=\"effect\"\n className={activeEffect.position === 'full' ? 'h-full w-full object-cover' : 'max-h-full max-w-full'}\n />\n )}\n\n <style>{`\n @keyframes flash-anim {\n 0% { opacity: 0; }\n 25% { opacity: 1; }\n 100% { opacity: 0; }\n }\n `}</style>\n </div>\n )}\n\n {/* 加载遮罩和开始界面 */}\n <LoadingOverlay\n isLoading={(isLoading || isTransitioning || !isAnimationPlaying) && isStarted}\n showStartScreen={!isStarted}\n scriptName={script.name}\n loadingText=\"正在准备场景中...\"\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={handleStart}\n customSettingsContent={customSettingsContent}\n customAboutContent={customAboutContent}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {isStarted && isAnimationPlaying && currentDialogue && !showHistory && !showChoices && !showLoopConfirm ? (\n <DialogueBox\n dialogue={currentDialogue}\n theme={dialogueTheme}\n isTyping={isTyping}\n isAutoMode={isAutoMode}\n onClick={handleDialogueClick}\n onSkipTyping={() => {\n typingCompleteRef.current = true;\n }}\n onToggleAuto={toggleAutoMode}\n onOpenHistory={() => setShowHistory(true)}\n onSkip={handleSkip}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n isCameraManual={isCameraManual}\n showControls={true}\n showSkipButton={showSkipButton}\n showAutoButton={showAutoButton}\n showHistoryButton={showHistoryButton}\n />\n ) : null}\n\n {/* 确认跳过动画弹窗 */}\n {pendingNodeIndex !== null && (\n <SkipConfirmDialog\n onConfirm={() => {\n if (pendingNodeIndex !== null) {\n goToNode(pendingNodeIndex, true);\n }\n }}\n onCancel={() => {\n setPendingNodeIndex(null);\n }}\n />\n )}\n\n {/* 分支选项菜单 */}\n {showChoices && (currentDialogue?.choices || currentNode.choices) && (\n <ChoiceMenu\n choices={(currentDialogue?.choices || currentNode.choices)!}\n theme={dialogueTheme}\n onSelect={(choice) => {\n // 1. 处理变量设置\n if (choice.setVariable) {\n const { key, value } = choice.setVariable;\n setVariables(prev => ({ ...prev, [key]: value }));\n log('Variable set', { key, value });\n }\n\n // 2. 执行回调\n choice.onSelect?.();\n\n // 3. 触发特效\n if (choice.effect) {\n triggerEffect(choice.effect);\n }\n\n // 4. 处理跳转逻辑\n setShowChoices(false);\n\n if (choice.nextNodeIndex !== undefined) {\n if (choice.nextNodeIndex === currentNodeIndex) {\n // 跳转到当前节点的特定对话\n goToDialogue(choice.nextDialogueIndex || 0);\n } else {\n // 跳转到其他节点\n goToNode(choice.nextNodeIndex, true);\n }\n } else if (currentDialogue?.choices) {\n // 没有指定跳转目标且是在对话行中触发的,逻辑上应该进入下一行\n const nextIdx = currentDialogueIndex + 1;\n if (currentNode && nextIdx < currentNode.dialogues.length) {\n const nextDialogue = currentNode.dialogues[nextIdx];\n if (nextDialogue) {\n setCurrentDialogueIndex(nextIdx);\n addToHistory(nextDialogue, currentNodeIndex, nextIdx);\n onDialogueChange?.(nextDialogue, nextIdx, currentNodeIndex);\n typingCompleteRef.current = false;\n }\n } else {\n // 如果是最后一行了,执行正常的节点切换逻辑\n triggerNodeTransition();\n }\n }\n }}\n />\n )}\n\n {/* 历史记录面板 */}\n {showHistory && (\n <HistoryPanel\n history={history}\n theme={dialogueTheme}\n onClose={() => setShowHistory(false)}\n />\n )}\n\n {/* 循环确认对话框 */}\n {showLoopConfirm && (\n <LoopConfirmDialog\n onRestart={handleRestartLoop}\n onBackToStart={handleBackToStart}\n />\n )}\n\n {/* 应援粒子效果 */}\n <CheerParticles ref={cheerParticlesRef} />\n\n {/* 应援按钮 - 仅在支持应援的节点显示 */}\n <CheerButton\n show={isStarted && isAnimationPlaying && !showHistory && !showChoices && !showLoopConfirm && (currentNode?.supportCheer === true)}\n onClick={handleCheer}\n text=\"应援\"\n />\n\n </div>\n );\n }\n);\n\nMMDVisualNovel.displayName = 'MMDVisualNovel';\n\nexport default MMDVisualNovel;\n\n","import React from 'react';\n\n/** 模型选项 */\nexport interface ModelOption {\n /** 唯一标识 */\n id: string;\n /** 显示名称 */\n name: string;\n /** 模型路径 */\n path: string | string[];\n /** 缩略图(可选) */\n thumbnail?: string;\n}\n\n/** 模型选择器设置属性 */\nexport interface ModelSelectorSettingsProps {\n /** 人物模型选项列表 */\n characterModels: ModelOption[];\n /** 场景模型选项列表 */\n stageModels: ModelOption[];\n /** 当前选中的人物模型 ID */\n selectedCharacterId: string;\n /** 当前选中的场景模型 ID */\n selectedStageId: string;\n /** 人物模型选择变化回调 */\n onCharacterChange: (id: string) => void;\n /** 场景模型选择变化回调 */\n onStageChange: (id: string) => void;\n /** 人物模型标签文字 */\n characterLabel?: string;\n /** 场景模型标签文字 */\n stageLabel?: string;\n}\n\n/**\n * ModelSelectorSettings - 模型选择器设置组件\n * \n * 用于在设置界面中选择人物模型和场景模型\n */\nexport const ModelSelectorSettings: React.FC<ModelSelectorSettingsProps> = ({\n characterModels,\n stageModels,\n selectedCharacterId,\n selectedStageId,\n onCharacterChange,\n onStageChange,\n characterLabel = 'CHARACTER MODEL',\n stageLabel = 'STAGE MODEL',\n}) => {\n return (\n <div className=\"space-y-6 sm:space-y-8\">\n {/* 人物模型选择 */}\n <div className=\"space-y-3 sm:space-y-4\">\n <div className=\"flex justify-between items-center text-xs sm:text-sm font-bold tracking-wider sm:tracking-widest\" style={{ color: '#64748b' }}>\n <span>{characterLabel}</span>\n <span className=\"text-[10px] sm:text-xs opacity-60\">\n {characterModels.find(m => m.id === selectedCharacterId)?.name || '未选择'}\n </span>\n </div>\n <div className=\"relative\">\n <select\n value={selectedCharacterId}\n onChange={(e) => onCharacterChange(e.target.value)}\n className=\"w-full h-12 sm:h-14 px-4 sm:px-6 rounded-xl sm:rounded-2xl border appearance-none cursor-pointer font-medium text-sm sm:text-base transition-all focus:outline-none focus:ring-2 focus:ring-green-500/30 touch-manipulation\"\n style={{\n background: 'linear-gradient(135deg, rgba(248, 250, 252, 0.98), rgba(226, 232, 240, 0.95))',\n borderColor: 'rgba(203, 213, 225, 0.6)',\n color: '#475569',\n boxShadow: '0 2px 8px rgba(100, 116, 139, 0.1)'\n }}\n >\n {characterModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.name}\n </option>\n ))}\n </select>\n {/* 下拉箭头 */}\n <div className=\"absolute right-4 sm:right-6 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg \n className=\"w-4 h-4 sm:w-5 sm:h-5\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n style={{ color: '#64748b' }}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n {/* 缩略图预览(如果有) */}\n {characterModels.find(m => m.id === selectedCharacterId)?.thumbnail && (\n <div className=\"mt-2 flex justify-center\">\n <img \n src={characterModels.find(m => m.id === selectedCharacterId)?.thumbnail}\n alt=\"Character preview\"\n className=\"h-20 sm:h-24 rounded-lg border object-cover\"\n style={{ borderColor: 'rgba(203, 213, 225, 0.4)' }}\n />\n </div>\n )}\n </div>\n\n {/* 场景模型选择 */}\n <div className=\"space-y-3 sm:space-y-4\">\n <div className=\"flex justify-between items-center text-xs sm:text-sm font-bold tracking-wider sm:tracking-widest\" style={{ color: '#64748b' }}>\n <span>{stageLabel}</span>\n <span className=\"text-[10px] sm:text-xs opacity-60\">\n {stageModels.find(m => m.id === selectedStageId)?.name || '未选择'}\n </span>\n </div>\n <div className=\"relative\">\n <select\n value={selectedStageId}\n onChange={(e) => onStageChange(e.target.value)}\n className=\"w-full h-12 sm:h-14 px-4 sm:px-6 rounded-xl sm:rounded-2xl border appearance-none cursor-pointer font-medium text-sm sm:text-base transition-all focus:outline-none focus:ring-2 focus:ring-green-500/30 touch-manipulation\"\n style={{\n background: 'linear-gradient(135deg, rgba(248, 250, 252, 0.98), rgba(226, 232, 240, 0.95))',\n borderColor: 'rgba(203, 213, 225, 0.6)',\n color: '#475569',\n boxShadow: '0 2px 8px rgba(100, 116, 139, 0.1)'\n }}\n >\n {stageModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.name}\n </option>\n ))}\n </select>\n {/* 下拉箭头 */}\n <div className=\"absolute right-4 sm:right-6 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg \n className=\"w-4 h-4 sm:w-5 sm:h-5\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n style={{ color: '#64748b' }}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n {/* 缩略图预览(如果有) */}\n {stageModels.find(m => m.id === selectedStageId)?.thumbnail && (\n <div className=\"mt-2 flex justify-center\">\n <img \n src={stageModels.find(m => m.id === selectedStageId)?.thumbnail}\n alt=\"Stage preview\"\n className=\"h-20 sm:h-24 rounded-lg border object-cover\"\n style={{ borderColor: 'rgba(203, 213, 225, 0.4)' }}\n />\n </div>\n )}\n </div>\n\n {/* 提示信息 */}\n <div className=\"pt-3 sm:pt-4 flex items-center justify-center gap-2 opacity-50 italic text-[10px] sm:text-xs border-t\" style={{ borderColor: 'rgba(203, 213, 225, 0.3)' }}>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>选择的模型将应用到所有场景</span>\n </div>\n </div>\n );\n};\n\nModelSelectorSettings.displayName = 'ModelSelectorSettings';\n\nexport default ModelSelectorSettings;\n\n","import React, {\n useState,\n useMemo,\n forwardRef,\n useImperativeHandle,\n useRef,\n useCallback,\n} from 'react';\nimport { MMDVisualNovel } from './MMDVisualNovel';\nimport { ModelSelectorSettings, ModelOption } from './ModelSelectorSettings';\nimport {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelScript,\n} from './types';\n\n/** 模型选择器配置 */\nexport interface ModelSelectorConfig {\n /** 人物模型选项列表 */\n characterModels: ModelOption[];\n /** 场景模型选项列表 */\n stageModels: ModelOption[];\n /** 默认选中的人物模型 ID(不提供则使用第一个) */\n defaultCharacterId?: string;\n /** 默认选中的场景模型 ID(不提供则使用第一个) */\n defaultStageId?: string;\n /** 人物模型标签文字 */\n characterLabel?: string;\n /** 场景模型标签文字 */\n stageLabel?: string;\n}\n\nexport type ResourceMappingMode = 'full-clone' | 'resource-map';\n\n/** 带模型选择器的视觉小说组件属性 */\nexport interface MMDVisualNovelWithSelectorProps extends Omit<MMDVisualNovelProps, 'script'> {\n /** 基础剧本配置(模型路径会被选择器覆盖) */\n script: VisualNovelScript;\n /** 模型选择器配置 */\n modelSelector: ModelSelectorConfig;\n /** 模型选择变化回调 */\n onModelSelectionChange?: (characterId: string, stageId: string) => void;\n /** 资源映射模式,默认 resource-map(轻量) */\n resourceMappingMode?: ResourceMappingMode;\n}\n\n/** 带模型选择器的视觉小说组件 Ref 接口 */\nexport interface MMDVisualNovelWithSelectorRef extends MMDVisualNovelRef {\n /** 获取当前选中的人物模型 ID */\n getSelectedCharacterId: () => string;\n /** 获取当前选中的场景模型 ID */\n getSelectedStageId: () => string;\n /** 设置人物模型 */\n setCharacterModel: (id: string) => void;\n /** 设置场景模型 */\n setStageModel: (id: string) => void;\n}\n\n/**\n * MMDVisualNovelWithSelector - 带模型选择器的视觉小说组件\n * \n * 功能特性:\n * - 在设置界面中提供人物模型和场景模型的下拉选择器\n * - 选择的模型会应用到剧本中的所有节点\n * - 完全兼容 MMDVisualNovel 的所有功能\n * \n * 使用示例:\n * ```tsx\n * <MMDVisualNovelWithSelector\n * script={myScript}\n * modelSelector={{\n * characterModels: [\n * { id: 'miku', name: '初音未来', path: '/models/miku.pmx' },\n * { id: 'luka', name: '巡音流歌', path: '/models/luka.pmx' },\n * ],\n * stageModels: [\n * { id: 'stage1', name: '教室', path: '/stages/classroom.pmx' },\n * { id: 'stage2', name: '公园', path: '/stages/park.pmx' },\n * ],\n * }}\n * />\n * ```\n */\nexport const MMDVisualNovelWithSelector = forwardRef<\n MMDVisualNovelWithSelectorRef,\n MMDVisualNovelWithSelectorProps\n>((props, ref) => {\n const {\n script,\n modelSelector,\n onModelSelectionChange,\n resourceMappingMode = 'resource-map',\n ...restProps\n } = props;\n\n const {\n characterModels,\n stageModels,\n defaultCharacterId,\n defaultStageId,\n characterLabel,\n stageLabel,\n } = modelSelector;\n\n // 内部 ref\n const visualNovelRef = useRef<MMDVisualNovelRef>(null);\n\n // 选中的模型 ID 状态\n const [selectedCharacterId, setSelectedCharacterId] = useState<string>(\n defaultCharacterId || characterModels[0]?.id || ''\n );\n const [selectedStageId, setSelectedStageId] = useState<string>(\n defaultStageId || stageModels[0]?.id || ''\n );\n\n // 获取选中的模型路径\n const selectedCharacterPath = useMemo(() => {\n const model = characterModels.find(m => m.id === selectedCharacterId);\n return model?.path || characterModels[0]?.path || '';\n }, [characterModels, selectedCharacterId]);\n\n const selectedStagePath = useMemo(() => {\n const model = stageModels.find(m => m.id === selectedStageId);\n return model?.path || stageModels[0]?.path || '';\n }, [stageModels, selectedStageId]);\n\n // 修改后的剧本(所有节点使用选中的模型)\n const modifiedScript = useMemo<VisualNovelScript>(() => {\n if (resourceMappingMode === 'full-clone') {\n return {\n ...script,\n nodes: script.nodes.map((node) => ({\n ...node,\n resources: {\n ...node.resources,\n modelPath: selectedCharacterPath as string,\n stageModelPath: selectedStagePath,\n },\n })),\n };\n }\n\n return {\n ...script,\n nodes: script.nodes.map((node) => {\n const nextModelPath = selectedCharacterPath as string;\n const nextStagePath = selectedStagePath;\n const resources = node.resources;\n\n if (resources.modelPath === nextModelPath && resources.stageModelPath === nextStagePath) {\n return node;\n }\n\n return {\n ...node,\n resources: {\n ...resources,\n modelPath: nextModelPath,\n stageModelPath: nextStagePath,\n },\n };\n }),\n };\n }, [script, selectedCharacterPath, selectedStagePath, resourceMappingMode]);\n\n // 处理人物模型选择变化\n const handleCharacterChange = useCallback((id: string) => {\n setSelectedCharacterId(id);\n onModelSelectionChange?.(id, selectedStageId);\n }, [selectedStageId, onModelSelectionChange]);\n\n // 处理场景模型选择变化\n const handleStageChange = useCallback((id: string) => {\n setSelectedStageId(id);\n onModelSelectionChange?.(selectedCharacterId, id);\n }, [selectedCharacterId, onModelSelectionChange]);\n\n // 自定义设置面板内容\n const customSettingsContent = useMemo(() => (\n <ModelSelectorSettings\n characterModels={characterModels}\n stageModels={stageModels}\n selectedCharacterId={selectedCharacterId}\n selectedStageId={selectedStageId}\n onCharacterChange={handleCharacterChange}\n onStageChange={handleStageChange}\n characterLabel={characterLabel}\n stageLabel={stageLabel}\n />\n ), [\n characterModels,\n stageModels,\n selectedCharacterId,\n selectedStageId,\n handleCharacterChange,\n handleStageChange,\n characterLabel,\n stageLabel,\n ]);\n\n // 暴露给父组件的方法\n useImperativeHandle(ref, () => ({\n // 继承 MMDVisualNovelRef 的所有方法\n goToNode: (nodeIndex: number, force?: boolean) => {\n visualNovelRef.current?.goToNode(nodeIndex, force);\n },\n goToDialogue: (dialogueIndex: number) => {\n visualNovelRef.current?.goToDialogue(dialogueIndex);\n },\n getCurrentNodeIndex: () => {\n return visualNovelRef.current?.getCurrentNodeIndex() ?? 0;\n },\n getCurrentDialogueIndex: () => {\n return visualNovelRef.current?.getCurrentDialogueIndex() ?? 0;\n },\n getHistory: () => {\n return visualNovelRef.current?.getHistory() ?? [];\n },\n getVariables: () => {\n return visualNovelRef.current?.getVariables() ?? {};\n },\n setVariable: (key: string, value: string | number | boolean) => {\n visualNovelRef.current?.setVariable(key, value);\n },\n setAutoMode: (enabled: boolean) => {\n visualNovelRef.current?.setAutoMode(enabled);\n },\n skipTyping: () => {\n visualNovelRef.current?.skipTyping();\n },\n triggerEffect: (effect) => {\n visualNovelRef.current?.triggerEffect?.(effect);\n },\n // 新增的模型选择方法\n getSelectedCharacterId: () => selectedCharacterId,\n getSelectedStageId: () => selectedStageId,\n setCharacterModel: (id: string) => {\n if (characterModels.some(m => m.id === id)) {\n handleCharacterChange(id);\n }\n },\n setStageModel: (id: string) => {\n if (stageModels.some(m => m.id === id)) {\n handleStageChange(id);\n }\n },\n }), [\n selectedCharacterId,\n selectedStageId,\n characterModels,\n stageModels,\n handleCharacterChange,\n handleStageChange,\n ]);\n\n return (\n <MMDVisualNovel\n ref={visualNovelRef}\n script={modifiedScript}\n customSettingsContent={customSettingsContent}\n {...restProps}\n />\n );\n});\n\nMMDVisualNovelWithSelector.displayName = 'MMDVisualNovelWithSelector';\n\nexport default MMDVisualNovelWithSelector;\n\n","import React from 'react';\nimport { clsx } from 'clsx';\nimport { \n Play, \n Pause, \n SkipBack, \n SkipForward, \n Repeat, \n Repeat1, \n Shuffle,\n Volume2,\n VolumeX,\n ListMusic,\n Camera\n} from 'lucide-react';\n\nexport interface MusicControlsProps {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n loopMode: 'list' | 'single' | 'shuffle';\n isCameraManual?: boolean;\n onPlayPause: () => void;\n onNext: () => void;\n onPrevious: () => void;\n onSeek: (time: number) => void;\n onToggleLoop: () => void;\n onTogglePlaylist: () => void;\n onResetCamera?: () => void;\n className?: string;\n}\n\nexport const MusicControls: React.FC<MusicControlsProps> = ({\n isPlaying,\n currentTime,\n duration,\n loopMode,\n isCameraManual = false,\n onPlayPause,\n onNext,\n onPrevious,\n onSeek,\n onToggleLoop,\n onTogglePlaylist,\n onResetCamera,\n className = '',\n}) => {\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return (mins) + ':' + (secs.toString().padStart(2, '0'));\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div \n className={clsx('w-full max-w-4xl mx-auto px-6 py-4 bg-white/10 backdrop-blur-xl border border-white/20 rounded-2xl shadow-2xl pointer-events-auto transition-all group', className)}\n >\n {/* 进度条 */}\n <div className=\"relative w-full h-1.5 bg-white/20 rounded-full mb-4 cursor-pointer group/progress overflow-hidden\">\n <div \n className=\"absolute h-full bg-blue-500 rounded-full transition-all duration-300\"\n style={{ width: (progress) + '%' }}\n />\n <input\n type=\"range\"\n min={0}\n max={duration || 100}\n value={currentTime}\n onChange={(e) => onSeek(Number(e.target.value))}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\n />\n </div>\n\n <div className=\"flex items-center justify-between\">\n {/* 时间显示 */}\n <div className=\"flex items-center gap-2 text-xs font-mono text-white/60 w-32\">\n <span>{formatTime(currentTime)}</span>\n <span>/</span>\n <span>{formatTime(duration)}</span>\n </div>\n\n {/* 主控制按钮 */}\n <div className=\"flex items-center gap-6\">\n <button \n onClick={onPrevious}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipBack className=\"w-6 h-6 fill-current\" />\n </button>\n\n <button \n onClick={onPlayPause}\n className=\"w-12 h-12 flex items-center justify-center bg-blue-500 hover:bg-blue-400 text-white rounded-full shadow-lg shadow-blue-500/20 transition-all hover:scale-105 active:scale-95\"\n >\n {isPlaying ? (\n <Pause className=\"w-6 h-6 fill-current\" />\n ) : (\n <Play className=\"w-6 h-6 fill-current ml-1\" />\n )}\n </button>\n\n <button \n onClick={onNext}\n className=\"text-white/80 hover:text-white transition-colors\"\n >\n <SkipForward className=\"w-6 h-6 fill-current\" />\n </button>\n </div>\n\n {/* 附加功能按钮 */}\n <div className=\"flex items-center gap-4 w-32 justify-end\">\n {isCameraManual && (\n <button \n onClick={onResetCamera}\n className=\"text-blue-400 hover:text-blue-300 transition-colors animate-in zoom-in duration-300\"\n title=\"恢复初始视角\"\n >\n <Camera className=\"w-5 h-5\" />\n </button>\n )}\n\n <button \n onClick={onToggleLoop}\n className=\"text-white/60 hover:text-white transition-colors\"\n title={loopMode}\n >\n {loopMode === 'list' && <Repeat className=\"w-5 h-5\" />}\n {loopMode === 'single' && <Repeat1 className=\"w-5 h-5 text-blue-400\" />}\n {loopMode === 'shuffle' && <Shuffle className=\"w-5 h-5 text-orange-400\" />}\n </button>\n\n <button \n onClick={onTogglePlaylist}\n className=\"text-white/60 hover:text-white transition-colors\"\n >\n <ListMusic className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n","import React from 'react';\nimport { X, Play, Music, Search, Loader2 } from 'lucide-react';\nimport { MusicTrack } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface PlaylistPanelProps {\n tracks: MusicTrack[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onSelectTrack: (index: number) => void;\n className?: string;\n // 新增搜索相关 props\n mikuMode?: boolean;\n onSearch?: (keyword: string) => void;\n isSearching?: boolean;\n}\n\nexport const PlaylistPanel: React.FC<PlaylistPanelProps> = ({\n tracks,\n currentIndex,\n isOpen,\n onClose,\n onSelectTrack,\n className = '',\n mikuMode,\n onSearch,\n isSearching,\n}) => {\n const [searchValue, setSearchValue] = React.useState('');\n\n if (!isOpen) return null;\n\n const handleSearchSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSearch?.(searchValue);\n };\n\n return (\n <div \n className={clsx('fixed inset-y-0 right-0 w-80 bg-gray-900/90 backdrop-blur-2xl border-l border-white/10 shadow-2xl z-50 flex flex-col pointer-events-auto transform transition-transform duration-500 ease-out', isOpen ? 'translate-x-0' : 'translate-x-full', className)}\n >\n <div className=\"flex flex-col p-6 border-b border-white/10 gap-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Music className=\"w-5 h-5 text-blue-400\" />\n <h3 className=\"text-lg font-bold text-white\">\n {mikuMode ? 'Miku 歌曲库' : '播放列表'}\n </h3>\n </div>\n <button \n onClick={onClose}\n className=\"p-2 text-white/60 hover:text-white transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {mikuMode && (\n <form onSubmit={handleSearchSubmit} className=\"relative\">\n <input\n type=\"text\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder=\"搜索 Miku 歌曲...\"\n className=\"w-full bg-white/5 border border-white/10 rounded-lg py-2 pl-10 pr-4 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-blue-500/50 transition-colors\"\n />\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-white/20\" />\n {isSearching && (\n <Loader2 className=\"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-blue-400 animate-spin\" />\n )}\n </form>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 space-y-2 custom-scrollbar\">\n {tracks.map((track, index) => {\n const isActive = index === currentIndex;\n return (\n <button\n key={track.id}\n onClick={() => onSelectTrack(index)}\n className={clsx('w-full flex items-center gap-4 p-3 rounded-xl transition-all group', isActive ? 'bg-blue-500/20 border border-blue-500/30' : 'hover:bg-white/5 border border-transparent')}\n >\n <div className=\"relative w-12 h-12 flex-shrink-0 rounded-lg overflow-hidden bg-gray-800\">\n {track.coverUrl ? (\n <img src={track.coverUrl} alt={track.title} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-white/20\">\n <Music className=\"w-6 h-6\" />\n </div>\n )}\n {isActive && (\n <div className=\"absolute inset-0 bg-blue-500/40 flex items-center justify-center\">\n <div className=\"flex gap-1 items-end h-4\">\n <div className=\"w-1 bg-white animate-music-bar-1\" />\n <div className=\"w-1 bg-white animate-music-bar-2\" />\n <div className=\"w-1 bg-white animate-music-bar-3\" />\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex-1 text-left min-w-0\">\n <h4 className={clsx('text-sm font-bold truncate', isActive ? 'text-blue-400' : 'text-white/90')}>\n {track.title}\n </h4>\n <p className=\"text-xs text-white/40 truncate mt-0.5\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n\n {!isActive && (\n <div className=\"opacity-0 group-hover:opacity-100 transition-opacity\">\n <Play className=\"w-4 h-4 text-white/40 fill-current\" />\n </div>\n )}\n </button>\n );\n })}\n </div>\n\n <div className=\"p-6 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n 共 {tracks.length} 首曲目\n </p>\n </div>\n\n <style dangerouslySetInnerHTML={{ __html: `\n .custom-scrollbar::-webkit-scrollbar {\n width: 4px;\n }\n .custom-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 10px;\n }\n .custom-scrollbar::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n @keyframes music-bar-1 {\n 0%, 100% { height: 4px; }\n 50% { height: 12px; }\n }\n @keyframes music-bar-2 {\n 0%, 100% { height: 8px; }\n 50% { height: 16px; }\n }\n @keyframes music-bar-3 {\n 0%, 100% { height: 6px; }\n 50% { height: 14px; }\n }\n .animate-music-bar-1 { animation: music-bar-1 0.6s infinite; }\n .animate-music-bar-2 { animation: music-bar-2 0.8s infinite; }\n .animate-music-bar-3 { animation: music-bar-3 0.7s infinite; }\n `}} />\n </div>\n );\n};\n\n","import React from 'react';\nimport { MusicTrack } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface TrackInfoProps {\n track: MusicTrack;\n className?: string;\n}\n\nexport const TrackInfo: React.FC<TrackInfoProps> = ({ track, className = '' }) => {\n return (\n <div className={clsx('flex flex-col items-center text-center gap-2', className)}>\n <div className=\"px-4 py-1.5 bg-black/40 backdrop-blur-md rounded-full border border-white/10 shadow-lg\">\n <h2 className=\"text-lg font-bold text-white tracking-wider truncate max-w-md\">\n {track.title}\n </h2>\n </div>\n <p className=\"text-sm font-medium text-white/60 drop-shadow-md\">\n {track.artist || '未知艺术家'}\n </p>\n </div>\n );\n};\n\n","/**\n * 音乐模块常量定义\n */\n\nexport const DEFAULT_MUSIC_SOURCE = 'kugou';\n\nexport const MUSIC_SOURCES = [\n // 'netease', \n // 'tencent',\n 'kugou',\n // 'xiami',\n] as const;\n\nexport type MusicSource = (typeof MUSIC_SOURCES)[number];\n\nexport const MUSIC_SOURCE_NAMES: Record<MusicSource, string> = {\n // netease: '网易云',\n // tencent: '腾讯音乐',\n kugou: '酷狗音乐',\n // xiami: '虾米音乐',\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = 'https://y.gtimg.cn/music/photo_new/T002R300x300M000' + (item.album.mid) + '.jpg';\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : 'http://' + (finalUrl);\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? '/api/music/search?keyword=' + (encodeURIComponent(searchOptions.keyword)) + '&source=' + (searchOptions.source || DEFAULT_MUSIC_SOURCE) + '&limit=' + (searchOptions.limit || 20) + '&offset=' + (searchOptions.offset || 0) + (searchOptions.miku ? '&miku=true' : '') : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/url?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/lyric?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef } from '../types';\nimport { clsx } from 'clsx';\nimport {\n MMDMusicPlayerProps,\n MMDMusicPlayerRef,\n MusicTrack,\n} from './types';\nimport { MusicControls } from './components/MusicControls';\nimport { PlaylistPanel } from './components/PlaylistPanel';\nimport { TrackInfo } from './components/TrackInfo';\nimport { useMusic } from '../../music';\nimport { Search } from 'lucide-react';\n\n/**\n * MMDMusicPlayer - MMD 音乐播放器组件 (Study with Miku 风格)\n * \n * 核心功能:\n * - 多曲目无缝切换\n * - 完整的媒体控制 (播放/暂停/进度/音量)\n * - 沉浸式 3D 舞台\n * - 自动清理内存与物理引擎\n */\nexport const MMDMusicPlayer = forwardRef<MMDMusicPlayerRef, MMDMusicPlayerProps>(\n (\n {\n config,\n stage,\n mobileOptimization,\n initialTrackIndex = 0,\n fixedResources,\n mikuMode,\n onTrackChange,\n onPlayPause,\n onProgress,\n onError,\n className,\n style,\n },\n ref\n ) => {\n const { tracks: initialTracks, autoPlay = false, defaultLoopMode = 'list' } = config;\n\n // 状态管理\n const [tracks, setTracks] = useState<MusicTrack[]>(initialTracks);\n const [currentIndex, setCurrentIndex] = useState(initialTrackIndex);\n const [isPlaying, setIsPlaying] = useState(autoPlay);\n const [isLoading, setIsLoading] = useState(true);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [loopMode, setLoopMode] = useState<'list' | 'single' | 'shuffle'>(defaultLoopMode);\n const [showPlaylist, setShowPlaylist] = useState(false);\n const [isUIVisible, setIsUIVisible] = useState(true);\n const [isCameraManual, setIsCameraManual] = useState(false);\n const [searchKeyword, setSearchKeyword] = useState('');\n\n // Miku 搜索集成\n const { search, searchResult, isSearching, getSongUrl } = useMusic();\n\n // 初始加载 Miku 歌曲\n useEffect(() => {\n if (mikuMode && tracks.length === 0) {\n search({ keyword: '', miku: true });\n }\n }, [mikuMode]);\n\n // 当搜索结果返回时,更新播放列表\n useEffect(() => {\n if (searchResult && searchResult.tracks.length > 0) {\n const newTracks: MusicTrack[] = searchResult.tracks.map(t => ({\n id: t.id,\n title: t.name,\n artist: t.artist,\n coverUrl: t.pic,\n resources: {\n modelPath: fixedResources?.modelPath || '', // 将在切换曲目时进一步处理\n motionPath: fixedResources?.motionPath || '',\n audioPath: t.url || '', // 初始可能为空,需要 getSongUrl\n stageModelPath: fixedResources?.stageModelPath,\n cameraPath: fixedResources?.cameraPath\n }\n }));\n setTracks(newTracks);\n setCurrentIndex(0);\n // 如果是 Miku 模式,第一个通常需要去获取播放链接\n fetchAndGoToTrack(0, newTracks);\n }\n }, [searchResult]);\n\n // 获取播放链接并跳转\n const fetchAndGoToTrack = async (index: number, currentTracksList: MusicTrack[] = tracks) => {\n const track = currentTracksList[index];\n if (!track) return;\n\n // 如果没有播放链接,先去获取\n if (!track.resources.audioPath) {\n setIsLoading(true);\n const url = await getSongUrl(track.id, (track as any).source || 'kugou');\n if (url) {\n const updatedTracks = [...currentTracksList];\n updatedTracks[index] = {\n ...track,\n resources: { ...track.resources, audioPath: url }\n };\n setTracks(updatedTracks);\n goToTrack(index, updatedTracks);\n } else {\n console.error('[MMDMusicPlayer] Failed to get song URL');\n setIsLoading(false);\n }\n } else {\n goToTrack(index, currentTracksList);\n }\n };\n\n // Refs\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const isStartedRef = useRef(autoPlay);\n const uiTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // 获取当前曲目\n const currentTrack = tracks[currentIndex];\n\n // 切换到指定曲目\n const goToTrack = useCallback(\n (index: number, tracksList: MusicTrack[] = tracks) => {\n if (index < 0 || index >= tracksList.length) return;\n \n const track = tracksList[index];\n if (!track) return;\n\n // 如果开启了 fixedResources 模式,且模型/动作路径相同,则跳过重载遮罩\n const isSmoothUpdate = fixedResources && \n track.resources.modelPath === currentTrack?.resources.modelPath &&\n track.resources.motionPath === currentTrack?.resources.motionPath;\n\n if (!isSmoothUpdate) {\n if (isTransitioning) return;\n setIsTransitioning(true);\n setIsLoading(true);\n }\n \n const wasPlaying = isPlaying;\n setIsPlaying(false);\n\n const applyChange = () => {\n setCurrentIndex(index);\n setCurrentTime(0);\n setDuration(0);\n onTrackChange?.(track, index);\n\n if (!isSmoothUpdate) {\n setTimeout(() => {\n setIsTransitioning(false);\n if (wasPlaying) isStartedRef.current = true;\n }, 100);\n } else {\n // 平滑切换:直接恢复播放状态\n if (wasPlaying) {\n setTimeout(() => {\n playerRef.current?.play();\n setIsPlaying(true);\n }, 300); // 给音频加载留一点点时间\n }\n }\n };\n\n if (!isSmoothUpdate) {\n setTimeout(applyChange, 300);\n } else {\n applyChange();\n }\n },\n [tracks, currentTrack, isTransitioning, isPlaying, onTrackChange, fixedResources]\n );\n\n // 下一曲逻辑\n const next = useCallback(() => {\n let nextIndex = currentIndex + 1;\n if (loopMode === 'shuffle') {\n nextIndex = Math.floor(Math.random() * tracks.length);\n } else if (nextIndex >= tracks.length) {\n nextIndex = 0;\n }\n fetchAndGoToTrack(nextIndex);\n }, [currentIndex, tracks.length, loopMode, fetchAndGoToTrack]);\n\n // 上一曲逻辑\n const previous = useCallback(() => {\n let prevIndex = currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = tracks.length - 1;\n }\n fetchAndGoToTrack(prevIndex);\n }, [currentIndex, tracks.length, fetchAndGoToTrack]);\n\n // 暴露方法给外部\n useImperativeHandle(\n ref,\n () => ({\n play: () => {\n setIsPlaying(true);\n isStartedRef.current = true;\n playerRef.current?.play();\n },\n pause: () => {\n setIsPlaying(false);\n isStartedRef.current = false;\n playerRef.current?.pause();\n },\n next,\n previous,\n goToTrack,\n setLoopMode,\n getState: () => ({\n currentIndex,\n isPlaying,\n currentTime,\n duration,\n loopMode,\n }),\n }),\n [next, previous, goToTrack, currentIndex, isPlaying, currentTime, duration, loopMode]\n );\n\n // 处理播放结束\n const handleEnded = useCallback(() => {\n if (loopMode === 'single') {\n playerRef.current?.seek(0);\n playerRef.current?.play();\n } else {\n next();\n }\n }, [loopMode, next]);\n\n // 处理时间更新\n const handleTimeUpdate = useCallback((time: number) => {\n setCurrentTime(time);\n if (playerRef.current) {\n const total = playerRef.current.getDuration();\n setDuration(total);\n onProgress?.(time, total);\n }\n }, [onProgress]);\n\n // UI 自动隐藏逻辑\n const resetUITimeout = useCallback(() => {\n setIsUIVisible(true);\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n if (isPlaying) {\n uiTimeoutRef.current = setTimeout(() => {\n if (!showPlaylist) setIsUIVisible(false);\n }, 5000);\n }\n }, [isPlaying, showPlaylist]);\n\n useEffect(() => {\n resetUITimeout();\n return () => {\n if (uiTimeoutRef.current) clearTimeout(uiTimeoutRef.current);\n };\n }, [resetUITimeout]);\n\n if (!currentTrack) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n 播放列表为空\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={clsx('relative bg-black group', className)}\n style={{ width: '100%', height: '100%', overflow: 'hidden', ...style }}\n onMouseMove={resetUITimeout}\n onClick={resetUITimeout}\n >\n {/* 3D 舞台层 */}\n <div \n className=\"absolute inset-0 w-full h-full\"\n style={{ \n zIndex: 0,\n opacity: (isLoading || isTransitioning) ? 0 : 1,\n transition: 'opacity 0.5s ease-in-out'\n }}\n >\n {!isTransitioning && (\n <MMDPlayerBase\n ref={playerRef}\n resources={currentTrack.resources}\n stage={{ ...stage, ...currentTrack.stage }}\n autoPlay={isStartedRef.current}\n loop={loopMode === 'single'}\n mobileOptimization={mobileOptimization}\n onLoad={() => {\n console.log('[MMDMusicPlayer] Track loaded');\n setIsLoading(false);\n if (isStartedRef.current) {\n playerRef.current?.play();\n setIsPlaying(true);\n }\n }}\n onPlay={() => {\n setIsPlaying(true);\n onPlayPause?.(true);\n }}\n onPause={() => {\n setIsPlaying(false);\n onPlayPause?.(false);\n }}\n onCameraChange={(isManual) => {\n setIsCameraManual(isManual);\n }}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onError={onError}\n />\n )}\n </div>\n\n {/* 加载遮罩 */}\n {(isLoading || isTransitioning) && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-12 w-12 animate-spin rounded-full border-4 border-white/20 border-t-blue-500\" />\n <div className=\"text-white font-medium\">\n {isTransitioning ? '准备下一首...' : '正在加载舞台...'}\n </div>\n </div>\n </div>\n )}\n\n {/* UI 交互层 */}\n <div \n className={clsx('absolute inset-0 z-10 flex flex-col justify-between transition-opacity duration-700 pointer-events-none', isUIVisible ? 'opacity-100' : 'opacity-0')}\n >\n {/* 顶部信息 */}\n <div className=\"pt-12 px-8 flex justify-center\">\n <TrackInfo track={currentTrack} />\n </div>\n\n {/* 底部控制 */}\n <div className=\"pb-12 px-8\">\n <MusicControls \n isPlaying={isPlaying}\n currentTime={currentTime}\n duration={duration}\n loopMode={loopMode}\n isCameraManual={isCameraManual}\n onPlayPause={() => isPlaying ? playerRef.current?.pause() : playerRef.current?.play()}\n onNext={next}\n onPrevious={previous}\n onSeek={(time) => playerRef.current?.seek(time)}\n onResetCamera={() => {\n playerRef.current?.resetCamera();\n setIsCameraManual(false);\n }}\n onToggleLoop={() => {\n const modes: ('list' | 'single' | 'shuffle')[] = ['list', 'single', 'shuffle'];\n const nextMode = modes[(modes.indexOf(loopMode) + 1) % modes.length]!;\n setLoopMode(nextMode);\n }}\n onTogglePlaylist={() => setShowPlaylist(!showPlaylist)}\n />\n </div>\n </div>\n\n {/* 侧边播放列表 */}\n <PlaylistPanel \n tracks={tracks}\n currentIndex={currentIndex}\n isOpen={showPlaylist}\n mikuMode={mikuMode}\n isSearching={isSearching}\n onSearch={(keyword) => search({ keyword, miku: true })}\n onClose={() => setShowPlaylist(false)}\n onSelectTrack={(index) => {\n fetchAndGoToTrack(index);\n setShowPlaylist(false);\n }}\n />\n </div>\n );\n }\n);\n\nMMDMusicPlayer.displayName = 'MMDMusicPlayer';\n\nexport default MMDMusicPlayer;\n\n","import type * as THREE from 'three';\n\nexport interface ARToolkitSource {\n ready: boolean;\n domElement: HTMLVideoElement;\n init: (onReady?: () => void, onError?: (error: unknown) => void) => void;\n onResizeElement?: () => void;\n copyElementSizeTo?: (element: HTMLElement) => void;\n dispose?: () => void;\n}\n\nexport interface ARToolkitContext {\n init: (onReady?: () => void) => void;\n update: (element: HTMLVideoElement) => void;\n getProjectionMatrix: () => THREE.Matrix4;\n arController?: { canvas?: HTMLCanvasElement } | null;\n}\n\nexport interface ARMarkerControls {\n dispose?: () => void;\n}\n\nexport interface THREExNamespace {\n ArToolkitSource: new (config: Record<string, any>) => ARToolkitSource;\n ArToolkitContext: new (config: Record<string, any>) => ARToolkitContext;\n ArMarkerControls: new (\n context: ARToolkitContext,\n markerRoot: THREE.Object3D,\n config: Record<string, any>\n ) => ARMarkerControls;\n}\n\nexport interface ARJSLoadOptions {\n three?: typeof THREE;\n forceReload?: boolean;\n locationOnly?: boolean;\n}\n\nexport interface ARMarkerConfig {\n type?: 'pattern' | 'barcode' | 'nft' | 'unknown';\n patternUrl?: string;\n descriptorsUrl?: string;\n barcodeValue?: number;\n changeMatrixMode?: 'modelViewMatrix' | 'cameraTransformMatrix';\n}\n\nexport interface ARToolkitContextConfig {\n cameraParametersUrl?: string;\n detectionMode?: 'mono' | 'mono_and_matrix' | 'color';\n maxDetectionRate?: number;\n}\n\nexport const DEFAULT_AR_ASSETS = {\n cameraParametersUrl:\n 'https://raw.githack.com/AR-js-org/AR.js/master/three.js/data/camera_para.dat',\n patternUrl: 'https://raw.githack.com/AR-js-org/AR.js/master/three.js/data/patt.hiro',\n};\n","import type { ARJSLoadOptions, THREExNamespace } from './types';\n\nlet loadPromise: Promise<THREExNamespace> | null = null;\n\ntype ARWindow = Window & {\n THREE?: unknown;\n THREEx?: unknown;\n ARjs?: unknown;\n};\n\nfunction isTHREExNamespace(value: unknown): value is THREExNamespace {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.ArToolkitSource === 'function' &&\n typeof candidate.ArToolkitContext === 'function' &&\n typeof candidate.ArMarkerControls === 'function'\n );\n}\n\nfunction resolveTHREExNamespace(moduleExports: unknown): THREExNamespace | undefined {\n const arWindow = window as ARWindow;\n const globalTHREEx = arWindow.THREEx;\n if (isTHREExNamespace(globalTHREEx)) {\n return globalTHREEx;\n }\n\n if (isTHREExNamespace(moduleExports)) {\n return moduleExports;\n }\n\n const record = moduleExports as Record<string, unknown> | undefined;\n const defaultExport = record?.default;\n\n if (isTHREExNamespace(defaultExport)) {\n return defaultExport;\n }\n\n if (isTHREExNamespace(record?.THREEx)) {\n return record?.THREEx as THREExNamespace;\n }\n\n const arjsCandidate = record?.ARjs ?? defaultExport ?? record ?? arWindow.ARjs;\n const arjsRecord = arjsCandidate as Record<string, unknown> | undefined;\n const source = arjsRecord?.Source;\n const context = arjsRecord?.Context;\n const markerControls = arjsRecord?.MarkerControls;\n if (\n typeof source === 'function' &&\n typeof context === 'function' &&\n typeof markerControls === 'function'\n ) {\n return {\n ArToolkitSource: source as THREExNamespace['ArToolkitSource'],\n ArToolkitContext: context as THREExNamespace['ArToolkitContext'],\n ArMarkerControls: markerControls as THREExNamespace['ArMarkerControls']\n };\n }\n\n return undefined;\n}\n\nexport async function loadARJS(options: ARJSLoadOptions = {}): Promise<THREExNamespace> {\n if (typeof window === 'undefined') {\n throw new Error('AR.js can only be loaded in a browser environment.');\n }\n\n if (options.three) {\n (window as ARWindow).THREE = options.three;\n }\n\n const existing = (window as ARWindow).THREEx;\n if (existing && !options.forceReload) {\n if (isTHREExNamespace(existing)) {\n return existing;\n }\n }\n\n if (!loadPromise || options.forceReload) {\n const importPromise: Promise<unknown> = options.locationOnly\n ? import('@ar-js-org/ar.js/three.js/build/ar-threex-location-only.js')\n : import('@ar-js-org/ar.js/three.js/build/ar-threex.js');\n\n loadPromise = importPromise.then((loadedModule) => {\n const THREEx = resolveTHREExNamespace(loadedModule);\n if (!THREEx) {\n throw new Error('AR.js loaded, but THREEx namespace was not found in module exports or window.');\n }\n (window as ARWindow).THREEx = THREEx;\n return THREEx;\n });\n }\n\n return loadPromise;\n}\n","import type { CSSProperties } from 'react';\nimport type { MMDResources, MMDStage, MobileOptimization } from '../types';\nimport type { ARMarkerConfig } from '../../ar';\n\n/**\n * AR 模式枚举\n */\nexport enum ARMode {\n /** \n * 叠加模式 - 模型固定在屏幕上,跟随屏幕移动\n * 特点:简单易用,不需要陀螺仪权限\n */\n Overlay = 'overlay',\n \n /**\n * 世界固定模式 - 真正的 AR 体验\n * 特点:模型固定在世界空间,移动设备时模型保持原位\n * 需要:设备陀螺仪/加速度计权限\n */\n WorldFixed = 'world-fixed',\n}\n\n/** 预设模型配置 */\nexport interface ModelPreset {\n /** 预设ID */\n id: string;\n /** 显示名称 */\n name: string;\n /** 缩略图URL */\n thumbnail?: string;\n /** 模型路径 (.pmx) */\n modelPath: string;\n}\n\n/** 预设动作配置 */\nexport interface MotionPreset {\n /** 预设ID */\n id: string;\n /** 显示名称 */\n name: string;\n /** 动作路径 (.vmd) */\n motionPath: string;\n}\n\n/** 预设音乐配置 */\nexport interface AudioPreset {\n /** 预设ID */\n id: string;\n /** 显示名称 */\n name: string;\n /** 音乐路径 */\n audioPath: string;\n}\n\nexport interface MMDARPlayerProps {\n /** 舞台配置 */\n stage?: MMDStage;\n /** 移动端优化配置 */\n mobileOptimization?: MobileOptimization;\n \n /** 摄像头配置 */\n cameraConfig?: {\n /** 偏好使用的摄像头 ('user' 为前置, 'environment' 为后置) */\n facingMode?: 'user' | 'environment';\n /** 视频分辨率 */\n width?: number | { min?: number; ideal?: number; max?: number };\n height?: number | { min?: number; ideal?: number; max?: number };\n };\n\n /** AR.js 相机参数文件 URL */\n cameraParametersUrl?: string;\n\n /** Marker 配置 */\n markerConfig?: ARMarkerConfig;\n\n /**\n * Marker 放置模式\n * - manual: 识别到 marker 后仍需点击按钮手动放置(默认)\n * - follow-marker: 识别到 marker 自动显示并跟随 marker\n */\n markerPlacementMode?: 'manual' | 'follow-marker';\n\n /** 是否开启镜像显示 (通常前置摄像头需要开启) */\n mirrored?: boolean;\n\n /** 是否显示设置按钮 */\n showSettings?: boolean;\n \n /** 预设模型列表 */\n modelPresets: ModelPreset[];\n \n /** 预设动作列表 */\n motionPresets: MotionPreset[];\n \n /** 预设音乐列表 (可选) */\n audioPresets?: AudioPreset[];\n \n /** 默认模型ID */\n defaultModelId?: string;\n \n /** 默认动作ID */\n defaultMotionId?: string;\n \n /** 默认音乐ID (可选) */\n defaultAudioId?: string;\n\n /** 模型缩放 */\n modelScale?: number | { x: number; y: number; z: number };\n\n /** 模型偏移 */\n modelOffset?: { x: number; y: number; z: number };\n \n /** 初始时是否显示模型 (false 则需要点击放置) */\n initialModelVisible?: boolean;\n \n /** 放置按钮文案 */\n placementText?: string;\n \n /** AR 模式 (默认 Overlay) */\n arMode?: ARMode;\n \n /** 默认 AR 模式 */\n defaultARMode?: ARMode;\n \n /** 播放控制 */\n autoPlay?: boolean;\n loop?: boolean;\n \n /** 事件回调 */\n onCameraReady?: (stream: MediaStream) => void;\n onCameraError?: (error: Error) => void;\n onResourcesChange?: (resources: MMDResources) => void;\n onModelPlaced?: () => void;\n onARModeChange?: (mode: ARMode) => void;\n onLoad?: () => void;\n onError?: (error: Error) => void;\n \n /** 样式 */\n className?: string;\n style?: CSSProperties;\n}\n\nexport interface MMDARPlayerRef {\n /** 开启摄像头 */\n startCamera: () => Promise<void>;\n /** 关闭摄像头 */\n stopCamera: () => void;\n /** 切换摄像头 */\n switchCamera: () => Promise<void>;\n /** 截图 (包含视频背景和模型) */\n snapshot: () => Promise<string>;\n /** 放置模型 */\n placeModel: () => void;\n /** 移除模型(重置位置) */\n removeModel: () => void;\n /** 切换模型 */\n switchModel: (resources: MMDResources) => void;\n /** 切换 AR 模式 */\n setARMode: (mode: ARMode) => void;\n /** 获取当前 AR 模式 */\n getARMode: () => ARMode;\n}\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport * as THREE from 'three';\nimport { clsx } from 'clsx';\nimport { MMDAnimationHelper, MMDLoader } from 'three-stdlib';\nimport { DEFAULT_AR_ASSETS, loadARJS } from '../../ar';\nimport type { MMDResources } from '../types';\nimport { configureMaterialsForMMD } from '../utils/mmd-loader-config';\nimport { ARMode, MMDARPlayerProps, MMDARPlayerRef } from './types';\n\nconst DEFAULT_MODEL_SCALE = 0.1;\n\nfunction disposeMesh(object: THREE.Object3D) {\n object.traverse((child) => {\n if (child instanceof THREE.Mesh || child instanceof THREE.SkinnedMesh) {\n if (child.geometry) {\n child.geometry.dispose();\n }\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((material) => {\n if (material instanceof THREE.Material) {\n Object.values(material).forEach((value) => {\n if (value instanceof THREE.Texture) {\n value.dispose();\n }\n });\n material.dispose();\n }\n });\n }\n });\n}\n\nexport const MMDARApp = forwardRef<MMDARPlayerRef, MMDARPlayerProps>((props, ref) => {\n const {\n stage,\n mobileOptimization,\n cameraConfig,\n cameraParametersUrl,\n markerConfig,\n markerPlacementMode = 'manual',\n mirrored = false,\n showSettings,\n modelPresets,\n motionPresets,\n audioPresets,\n defaultModelId,\n defaultMotionId,\n defaultAudioId,\n modelScale,\n modelOffset,\n initialModelVisible = false,\n placementText = 'Place Model',\n arMode,\n defaultARMode,\n autoPlay = true,\n loop = true,\n onCameraReady,\n onCameraError,\n onResourcesChange,\n onModelPlaced,\n onARModeChange,\n onLoad,\n onError,\n className,\n style\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const videoContainerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.Camera | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const arToolkitSourceRef = useRef<any>(null);\n const arToolkitContextRef = useRef<any>(null);\n const markerRootRef = useRef<THREE.Group | null>(null);\n const markerControlsRef = useRef<any>(null);\n const modelRootRef = useRef<THREE.Group | null>(null);\n const mmdHelperRef = useRef<MMDAnimationHelper | null>(null);\n const mmdMeshRef = useRef<THREE.SkinnedMesh | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const markerDetectedRef = useRef(false);\n const markerPlacedOnceRef = useRef(false);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const autoPlayRef = useRef(autoPlay);\n\n const [isLoading, setIsLoading] = useState(true);\n const [cameraReady, setCameraReady] = useState(false);\n const [arReady, setArReady] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [markerDetected, setMarkerDetected] = useState(false);\n const [modelPlaced, setModelPlaced] = useState(initialModelVisible);\n const [settingsVisible, setSettingsVisible] = useState(showSettings ?? false);\n const [internalARMode, setInternalARMode] = useState(\n defaultARMode ?? arMode ?? ARMode.Overlay\n );\n const [cameraFacing, setCameraFacing] = useState<'user' | 'environment'>(\n cameraConfig?.facingMode ?? 'environment'\n );\n\n const [selectedModelId, setSelectedModelId] = useState(\n defaultModelId ?? modelPresets[0]?.id ?? ''\n );\n const [selectedMotionId, setSelectedMotionId] = useState(\n defaultMotionId ?? motionPresets[0]?.id ?? ''\n );\n const [selectedAudioId, setSelectedAudioId] = useState(\n defaultAudioId ?? audioPresets?.[0]?.id ?? ''\n );\n const [overrideResources, setOverrideResources] = useState<MMDResources | null>(null);\n\n const resolvedARMode = arMode ?? internalARMode;\n\n const resolvedMarkerConfig = useMemo(() => {\n return {\n type: markerConfig?.type ?? 'pattern',\n patternUrl: markerConfig?.patternUrl ?? DEFAULT_AR_ASSETS.patternUrl,\n descriptorsUrl: markerConfig?.descriptorsUrl,\n barcodeValue: markerConfig?.barcodeValue ?? 0,\n changeMatrixMode: markerConfig?.changeMatrixMode ?? 'modelViewMatrix'\n };\n }, [markerConfig]);\n\n const resolvedResources = useMemo<MMDResources | null>(() => {\n if (overrideResources) {\n return overrideResources;\n }\n\n const modelPreset = modelPresets.find((preset) => preset.id === selectedModelId);\n if (!modelPreset) {\n return null;\n }\n\n const motionPreset = motionPresets.find((preset) => preset.id === selectedMotionId);\n const audioPreset = audioPresets?.find((preset) => preset.id === selectedAudioId);\n\n return {\n modelPath: modelPreset.modelPath,\n motionPath: motionPreset?.motionPath,\n audioPath: audioPreset?.audioPath\n };\n }, [\n overrideResources,\n modelPresets,\n motionPresets,\n audioPresets,\n selectedModelId,\n selectedMotionId,\n selectedAudioId\n ]);\n\n const resolveModelScale = useCallback(() => {\n if (!modelScale) {\n return new THREE.Vector3(DEFAULT_MODEL_SCALE, DEFAULT_MODEL_SCALE, DEFAULT_MODEL_SCALE);\n }\n if (typeof modelScale === 'number') {\n return new THREE.Vector3(modelScale, modelScale, modelScale);\n }\n return new THREE.Vector3(modelScale.x, modelScale.y, modelScale.z);\n }, [modelScale]);\n\n const applyModelTransform = useCallback(\n (mesh: THREE.Object3D) => {\n const scale = resolveModelScale();\n mesh.scale.copy(scale);\n\n if (modelOffset) {\n mesh.position.set(modelOffset.x, modelOffset.y, modelOffset.z);\n return;\n }\n\n const box = new THREE.Box3().setFromObject(mesh);\n if (Number.isFinite(box.min.y)) {\n mesh.position.y += -box.min.y;\n }\n },\n [modelOffset, resolveModelScale]\n );\n\n const updateModelPlacement = useCallback(\n (visible: boolean) => {\n if (!modelRootRef.current) return;\n modelRootRef.current.visible = visible;\n setModelPlaced(visible);\n },\n []\n );\n\n const attachModelRoot = useCallback(\n (mode: ARMode) => {\n if (!modelRootRef.current || !sceneRef.current || !cameraRef.current) return;\n\n if (mode === ARMode.Overlay) {\n if (modelRootRef.current.parent !== cameraRef.current) {\n modelRootRef.current.parent?.remove(modelRootRef.current);\n cameraRef.current.add(modelRootRef.current);\n }\n modelRootRef.current.position.set(0, -1, -3);\n modelRootRef.current.quaternion.identity();\n updateModelPlacement(true);\n } else {\n if (markerPlacementMode === 'follow-marker' && markerRootRef.current) {\n if (modelRootRef.current.parent !== markerRootRef.current) {\n modelRootRef.current.parent?.remove(modelRootRef.current);\n markerRootRef.current.add(modelRootRef.current);\n }\n modelRootRef.current.position.set(0, 0, 0);\n modelRootRef.current.quaternion.identity();\n updateModelPlacement(markerDetectedRef.current);\n } else {\n if (modelRootRef.current.parent !== sceneRef.current) {\n modelRootRef.current.parent?.remove(modelRootRef.current);\n sceneRef.current.add(modelRootRef.current);\n }\n updateModelPlacement(initialModelVisible);\n }\n }\n },\n [initialModelVisible, markerPlacementMode, updateModelPlacement]\n );\n\n const stopCameraStream = useCallback(() => {\n const source = arToolkitSourceRef.current;\n if (!source?.domElement) return;\n const stream = source.domElement.srcObject as MediaStream | null;\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n }\n }, []);\n\n const cleanupAR = useCallback(() => {\n stopCameraStream();\n\n if (markerRootRef.current && sceneRef.current) {\n sceneRef.current.remove(markerRootRef.current);\n markerRootRef.current.clear();\n }\n markerRootRef.current = null;\n markerControlsRef.current = null;\n\n const videoContainer = videoContainerRef.current;\n const videoElement = arToolkitSourceRef.current?.domElement;\n if (videoContainer && videoElement && videoElement.parentElement === videoContainer) {\n videoContainer.removeChild(videoElement);\n }\n\n arToolkitSourceRef.current?.dispose?.();\n arToolkitSourceRef.current = null;\n arToolkitContextRef.current = null;\n markerDetectedRef.current = false;\n markerPlacedOnceRef.current = false;\n setMarkerDetected(false);\n setCameraReady(false);\n setArReady(false);\n }, [stopCameraStream]);\n\n const setupRenderer = useCallback(() => {\n if (rendererRef.current) return;\n if (!canvasRef.current) return;\n\n const renderer = new THREE.WebGLRenderer({\n canvas: canvasRef.current,\n antialias: true,\n alpha: true\n });\n renderer.setClearColor(0x000000, 0);\n renderer.setPixelRatio(mobileOptimization?.pixelRatio ?? window.devicePixelRatio ?? 1);\n rendererRef.current = renderer;\n\n const scene = new THREE.Scene();\n sceneRef.current = scene;\n\n const camera = new THREE.Camera();\n cameraRef.current = camera;\n scene.add(camera);\n\n const modelRoot = new THREE.Group();\n modelRoot.visible = initialModelVisible;\n modelRootRef.current = modelRoot;\n scene.add(modelRoot);\n\n const ambientLight = new THREE.AmbientLight(\n 0xffffff,\n stage?.ambientLightIntensity ?? 0.8\n );\n scene.add(ambientLight);\n\n const directionalLight = new THREE.DirectionalLight(\n 0xffffff,\n stage?.directionalLightIntensity ?? 0.6\n );\n directionalLight.position.set(1, 1, 1);\n scene.add(directionalLight);\n\n attachModelRoot(resolvedARMode);\n }, [\n attachModelRoot,\n initialModelVisible,\n mobileOptimization?.pixelRatio,\n resolvedARMode,\n stage?.ambientLightIntensity,\n stage?.directionalLightIntensity\n ]);\n\n const resize = useCallback(() => {\n if (!containerRef.current || !rendererRef.current) return;\n const width = containerRef.current.clientWidth;\n const height = containerRef.current.clientHeight;\n if (width === 0 || height === 0) return;\n\n rendererRef.current.setSize(width, height);\n\n const source = arToolkitSourceRef.current;\n if (source?.onResizeElement && source?.copyElementSizeTo) {\n source.onResizeElement();\n source.copyElementSizeTo(rendererRef.current.domElement);\n if (arToolkitContextRef.current?.arController?.canvas) {\n source.copyElementSizeTo(arToolkitContextRef.current.arController.canvas);\n }\n }\n }, []);\n\n const startRenderLoop = useCallback(() => {\n if (animationFrameRef.current) return;\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current) return;\n const renderer = rendererRef.current;\n const scene = sceneRef.current;\n const camera = cameraRef.current;\n\n const clock = new THREE.Clock();\n\n const render = () => {\n animationFrameRef.current = requestAnimationFrame(render);\n\n if (arToolkitSourceRef.current?.ready) {\n arToolkitContextRef.current?.update(arToolkitSourceRef.current.domElement);\n if (markerRootRef.current) {\n const isVisible = markerRootRef.current.visible;\n if (isVisible !== markerDetectedRef.current) {\n markerDetectedRef.current = isVisible;\n setMarkerDetected(isVisible);\n if (\n resolvedARMode !== ARMode.Overlay &&\n markerPlacementMode === 'follow-marker'\n ) {\n updateModelPlacement(isVisible);\n if (isVisible && !markerPlacedOnceRef.current) {\n markerPlacedOnceRef.current = true;\n onModelPlaced?.();\n }\n }\n }\n }\n }\n\n if (mmdHelperRef.current && autoPlayRef.current) {\n const delta = clock.getDelta();\n mmdHelperRef.current.update(delta);\n }\n\n renderer.render(scene, camera);\n };\n\n render();\n }, [markerPlacementMode, onModelPlaced, resolvedARMode, updateModelPlacement]);\n\n const setupAR = useCallback(async (facingOverride?: 'user' | 'environment') => {\n if (!sceneRef.current || !cameraRef.current) return;\n\n const THREEx = await loadARJS({ three: THREE });\n if (resolvedMarkerConfig.type === 'nft' && !resolvedMarkerConfig.descriptorsUrl) {\n throw new Error(\n 'markerConfig.descriptorsUrl is required when markerConfig.type is \"nft\".'\n );\n }\n\n const facingMode = facingOverride ?? cameraFacing;\n const sourceWidth =\n typeof cameraConfig?.width === 'number' ? cameraConfig.width : cameraConfig?.width?.ideal;\n const sourceHeight =\n typeof cameraConfig?.height === 'number' ? cameraConfig.height : cameraConfig?.height?.ideal;\n\n const arToolkitSource = new THREEx.ArToolkitSource({\n sourceType: 'webcam',\n sourceWidth: sourceWidth ?? 1280,\n sourceHeight: sourceHeight ?? 720,\n facingMode\n });\n arToolkitSourceRef.current = arToolkitSource;\n\n const arToolkitContext = new THREEx.ArToolkitContext({\n cameraParametersUrl: cameraParametersUrl ?? DEFAULT_AR_ASSETS.cameraParametersUrl,\n detectionMode: 'mono',\n maxDetectionRate: 30\n });\n arToolkitContextRef.current = arToolkitContext;\n\n const markerRoot = new THREE.Group();\n markerRootRef.current = markerRoot;\n sceneRef.current.add(markerRoot);\n attachModelRoot(resolvedARMode);\n\n markerControlsRef.current = new THREEx.ArMarkerControls(\n arToolkitContext,\n markerRoot,\n resolvedMarkerConfig\n );\n\n arToolkitContext.init(() => {\n if (!cameraRef.current) return;\n cameraRef.current.projectionMatrix.copy(arToolkitContext.getProjectionMatrix());\n setArReady(true);\n });\n\n arToolkitSource.init(() => {\n const videoElement = arToolkitSource.domElement;\n if (videoContainerRef.current && videoElement.parentElement !== videoContainerRef.current) {\n videoContainerRef.current.appendChild(videoElement);\n }\n videoElement.setAttribute('playsinline', 'true');\n videoElement.style.position = 'absolute';\n videoElement.style.inset = '0';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n videoElement.style.zIndex = '0';\n if (mirrored) {\n videoElement.style.transform = 'scaleX(-1)';\n }\n setCameraReady(true);\n\n const stream = videoElement.srcObject as MediaStream | null;\n if (stream) {\n onCameraReady?.(stream);\n }\n\n resize();\n });\n }, [\n cameraConfig?.height,\n cameraConfig?.width,\n cameraFacing,\n cameraParametersUrl,\n mirrored,\n onCameraReady,\n resize,\n attachModelRoot,\n resolvedARMode,\n resolvedMarkerConfig\n ]);\n\n const loadMMDResources = useCallback(async () => {\n if (!resolvedResources || !sceneRef.current || !modelRootRef.current) {\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n if (mmdMeshRef.current) {\n if (mmdHelperRef.current) {\n mmdHelperRef.current.remove(mmdMeshRef.current);\n }\n modelRootRef.current.remove(mmdMeshRef.current);\n disposeMesh(mmdMeshRef.current);\n mmdMeshRef.current = null;\n }\n\n if (!mmdHelperRef.current) {\n mmdHelperRef.current = new MMDAnimationHelper({ afterglow: 2.0 });\n }\n\n const loader = new MMDLoader();\n\n const loadModel = () =>\n new Promise<{ mesh: THREE.SkinnedMesh; animation?: THREE.AnimationClip }>((resolve, reject) => {\n if (resolvedResources.motionPath) {\n loader.loadWithAnimation(\n resolvedResources.modelPath,\n resolvedResources.motionPath,\n (mmd) => resolve({ mesh: mmd.mesh, animation: mmd.animation }),\n undefined,\n (err) => reject(err)\n );\n } else {\n loader.load(\n resolvedResources.modelPath,\n (mesh) => resolve({ mesh: mesh as THREE.SkinnedMesh }),\n undefined,\n (err) => reject(err)\n );\n }\n });\n\n try {\n const { mesh, animation } = await loadModel();\n\n configureMaterialsForMMD(mesh, {\n enableGradientMap: true,\n shininess: 30,\n specularColor: 0x888888\n });\n\n applyModelTransform(mesh);\n mesh.castShadow = true;\n mesh.receiveShadow = stage?.modelReceiveShadow ?? true;\n\n mmdMeshRef.current = mesh;\n modelRootRef.current.add(mesh);\n\n if (animation) {\n mmdHelperRef.current.add(mesh, {\n animation,\n physics: false\n });\n }\n\n setIsLoading(false);\n onResourcesChange?.(resolvedResources);\n onLoad?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load MMD resources';\n setError(message);\n setIsLoading(false);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [applyModelTransform, onError, onLoad, onResourcesChange, resolvedResources, stage?.modelReceiveShadow]);\n\n const updateAudio = useCallback(() => {\n if (!resolvedResources?.audioPath) {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n audioRef.current = null;\n }\n return;\n }\n\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n }\n\n const audio = new Audio(resolvedResources.audioPath);\n audio.loop = loop;\n audioRef.current = audio;\n\n if (autoPlay || modelPlaced) {\n audio.play().catch(() => undefined);\n }\n }, [autoPlay, loop, modelPlaced, resolvedResources?.audioPath]);\n\n const placeModel = useCallback(() => {\n if (!modelRootRef.current) return;\n if (resolvedARMode === ARMode.Overlay) {\n updateModelPlacement(true);\n onModelPlaced?.();\n return;\n }\n if (markerPlacementMode === 'follow-marker') {\n updateModelPlacement(markerDetectedRef.current);\n if (markerDetectedRef.current) {\n onModelPlaced?.();\n }\n return;\n }\n if (!markerRootRef.current) return;\n\n modelRootRef.current.position.copy(markerRootRef.current.position);\n modelRootRef.current.quaternion.copy(markerRootRef.current.quaternion);\n updateModelPlacement(true);\n onModelPlaced?.();\n }, [markerPlacementMode, onModelPlaced, resolvedARMode, updateModelPlacement]);\n\n const removeModel = useCallback(() => {\n updateModelPlacement(false);\n }, [updateModelPlacement]);\n\n useImperativeHandle(ref, () => ({\n startCamera: async () => {\n cleanupAR();\n await setupAR();\n },\n stopCamera: () => {\n cleanupAR();\n },\n switchCamera: async () => {\n const next = cameraFacing === 'environment' ? 'user' : 'environment';\n setCameraFacing(next);\n cleanupAR();\n await setupAR(next);\n },\n snapshot: async () => {\n if (!rendererRef.current) return '';\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return '';\n\n const width = rendererRef.current.domElement.width;\n const height = rendererRef.current.domElement.height;\n canvas.width = width;\n canvas.height = height;\n\n const videoElement = arToolkitSourceRef.current?.domElement as HTMLVideoElement | undefined;\n if (videoElement) {\n context.drawImage(videoElement, 0, 0, width, height);\n }\n context.drawImage(rendererRef.current.domElement, 0, 0, width, height);\n return canvas.toDataURL('image/png');\n },\n placeModel,\n removeModel,\n switchModel: (resources: MMDResources) => {\n setOverrideResources(resources);\n },\n setARMode: (mode: ARMode) => {\n if (!arMode) {\n setInternalARMode(mode);\n }\n attachModelRoot(mode);\n onARModeChange?.(mode);\n },\n getARMode: () => resolvedARMode\n }));\n\n useEffect(() => {\n autoPlayRef.current = autoPlay || modelPlaced;\n }, [autoPlay, modelPlaced]);\n\n useEffect(() => {\n if (showSettings !== undefined) {\n setSettingsVisible(showSettings);\n }\n }, [showSettings]);\n\n useEffect(() => {\n if (cameraConfig?.facingMode) {\n if (cameraConfig.facingMode !== cameraFacing) {\n setCameraFacing(cameraConfig.facingMode);\n cleanupAR();\n setupAR(cameraConfig.facingMode).catch(() => undefined);\n }\n }\n }, [cameraConfig?.facingMode, cameraFacing, cleanupAR, setupAR]);\n\n useEffect(() => {\n if (!modelPresets.find((preset) => preset.id === selectedModelId)) {\n setSelectedModelId(modelPresets[0]?.id ?? '');\n }\n }, [modelPresets, selectedModelId]);\n\n useEffect(() => {\n if (!motionPresets.find((preset) => preset.id === selectedMotionId)) {\n setSelectedMotionId(motionPresets[0]?.id ?? '');\n }\n }, [motionPresets, selectedMotionId]);\n\n useEffect(() => {\n if (audioPresets && !audioPresets.find((preset) => preset.id === selectedAudioId)) {\n setSelectedAudioId(audioPresets[0]?.id ?? '');\n }\n }, [audioPresets, selectedAudioId]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n if (!rendererRef.current) {\n setupRenderer();\n }\n if (!arToolkitSourceRef.current) {\n setupAR()\n .then(() => {\n startRenderLoop();\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : 'Failed to initialize AR';\n setError(message);\n setIsLoading(false);\n onCameraError?.(err instanceof Error ? err : new Error(message));\n });\n } else {\n startRenderLoop();\n }\n\n const resizeObserver = new ResizeObserver(resize);\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n cleanupAR();\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n if (rendererRef.current) {\n rendererRef.current.dispose();\n rendererRef.current = null;\n }\n if (sceneRef.current && modelRootRef.current) {\n sceneRef.current.remove(modelRootRef.current);\n }\n if (mmdMeshRef.current) {\n if (mmdHelperRef.current) {\n mmdHelperRef.current.remove(mmdMeshRef.current);\n }\n disposeMesh(mmdMeshRef.current);\n mmdMeshRef.current = null;\n }\n mmdHelperRef.current = null;\n audioRef.current?.pause();\n audioRef.current = null;\n };\n }, [cleanupAR, onCameraError, resize, setupAR, setupRenderer, startRenderLoop]);\n\n useEffect(() => {\n attachModelRoot(resolvedARMode);\n }, [attachModelRoot, resolvedARMode]);\n\n useEffect(() => {\n if (resolvedResources) {\n loadMMDResources();\n updateAudio();\n } else if (modelPresets.length === 0) {\n const message = 'No model presets configured.';\n setError(message);\n setIsLoading(false);\n onError?.(new Error(message));\n }\n }, [loadMMDResources, modelPresets.length, onError, resolvedResources, updateAudio]);\n\n const mirroredStyle = mirrored ? { transform: 'scaleX(-1)' } : undefined;\n\n return (\n <div\n ref={containerRef}\n className={clsx('relative w-full h-full overflow-hidden bg-black', className)}\n style={style}\n >\n <div ref={videoContainerRef} className=\"absolute inset-0\" style={mirroredStyle} />\n <canvas ref={canvasRef} className=\"absolute inset-0 w-full h-full\" style={mirroredStyle} />\n\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/70 text-white z-20\">\n <div className=\"text-center\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-b-2 border-white mx-auto mb-3\" />\n <div>Initializing AR...</div>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-red-950/80 text-white z-20\">\n <div className=\"text-center max-w-sm px-4\">\n <div className=\"text-lg font-semibold mb-2\">AR Error</div>\n <div className=\"text-sm text-red-200\">{error}</div>\n </div>\n </div>\n )}\n\n {arReady && !error && (\n <>\n {resolvedARMode !== ARMode.Overlay && !modelPlaced && (\n <div className=\"absolute top-4 left-4 right-4 bg-black/70 text-white p-3 rounded-lg text-sm z-10\">\n <div className=\"font-semibold mb-1\">Marker Placement</div>\n <div className=\"text-gray-200\">\n {markerPlacementMode === 'follow-marker'\n ? 'Align the marker in view, model will be placed automatically.'\n : `Align the marker in view, then tap \"${placementText}\" to place the model.`}\n </div>\n <div className=\"mt-2\">\n {markerDetected ? (\n <span className=\"text-green-400\">Marker detected</span>\n ) : (\n <span className=\"text-yellow-400\">Waiting for marker...</span>\n )}\n </div>\n </div>\n )}\n\n <div className=\"absolute top-4 right-4 flex items-center space-x-2 z-10\">\n <span\n className={clsx('h-2.5 w-2.5 rounded-full', cameraReady ? 'bg-green-400' : 'bg-red-400')}\n title=\"Camera\"\n />\n <span\n className={clsx('h-2.5 w-2.5 rounded-full', arReady ? 'bg-green-400' : 'bg-red-400')}\n title=\"AR\"\n />\n <span\n className={clsx('h-2.5 w-2.5 rounded-full', markerDetected ? 'bg-blue-400' : 'bg-gray-400')}\n title=\"Marker\"\n />\n </div>\n\n <div className=\"absolute bottom-4 left-4 right-4 flex justify-center gap-3 z-10\">\n <button\n onClick={() => setSettingsVisible((prev) => !prev)}\n className=\"px-4 py-2 rounded-lg bg-gray-700 text-white hover:bg-gray-600\"\n >\n Settings\n </button>\n {resolvedARMode !== ARMode.Overlay && markerPlacementMode === 'manual' && !modelPlaced && (\n <button\n onClick={placeModel}\n disabled={!markerDetected}\n className={clsx(\n 'px-5 py-2 rounded-lg text-white',\n markerDetected ? 'bg-emerald-600 hover:bg-emerald-500' : 'bg-gray-500'\n )}\n >\n {placementText}\n </button>\n )}\n {modelPlaced && (\n <button\n onClick={removeModel}\n className=\"px-5 py-2 rounded-lg text-white bg-orange-600 hover:bg-orange-500\"\n >\n Reset\n </button>\n )}\n </div>\n\n {settingsVisible && (\n <div className=\"absolute top-16 right-4 bg-black/80 text-white p-4 rounded-lg w-64 space-y-3 z-10\">\n <div className=\"text-sm font-semibold\">AR Settings</div>\n <label className=\"block text-xs text-gray-300\">\n Model\n <select\n value={selectedModelId}\n onChange={(event) => {\n setOverrideResources(null);\n setSelectedModelId(event.target.value);\n }}\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1\"\n >\n {modelPresets.map((preset) => (\n <option key={preset.id} value={preset.id}>\n {preset.name}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block text-xs text-gray-300\">\n Motion\n <select\n value={selectedMotionId}\n onChange={(event) => {\n setOverrideResources(null);\n setSelectedMotionId(event.target.value);\n }}\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1\"\n >\n {motionPresets.map((preset) => (\n <option key={preset.id} value={preset.id}>\n {preset.name}\n </option>\n ))}\n </select>\n </label>\n\n {audioPresets && audioPresets.length > 0 && (\n <label className=\"block text-xs text-gray-300\">\n Audio\n <select\n value={selectedAudioId}\n onChange={(event) => {\n setOverrideResources(null);\n setSelectedAudioId(event.target.value);\n }}\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1\"\n >\n {audioPresets.map((preset) => (\n <option key={preset.id} value={preset.id}>\n {preset.name}\n </option>\n ))}\n </select>\n </label>\n )}\n\n <label className=\"block text-xs text-gray-300\">\n AR Mode\n <select\n value={resolvedARMode}\n onChange={(event) => {\n const next = event.target.value as ARMode;\n if (!arMode) {\n setInternalARMode(next);\n }\n attachModelRoot(next);\n onARModeChange?.(next);\n }}\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1\"\n >\n <option value={ARMode.Overlay}>Overlay</option>\n <option value={ARMode.WorldFixed}>World Fixed</option>\n </select>\n </label>\n\n <label className=\"block text-xs text-gray-300\">\n Marker Placement\n <input\n value={markerPlacementMode === 'follow-marker' ? 'Auto Follow' : 'Manual Place'}\n readOnly\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1 opacity-70\"\n />\n </label>\n\n <label className=\"block text-xs text-gray-300\">\n Camera\n <select\n value={cameraFacing}\n onChange={(event) => {\n const next = event.target.value as 'user' | 'environment';\n setCameraFacing(next);\n cleanupAR();\n setupAR(next).catch(() => undefined);\n }}\n className=\"mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1\"\n >\n <option value=\"environment\">Back</option>\n <option value=\"user\">Front</option>\n </select>\n </label>\n </div>\n )}\n </>\n )}\n </div>\n );\n});\n\nMMDARApp.displayName = 'MMDARApp';\n\nexport default MMDARApp;\n","import { MMDARApp } from './MMDARApp';\n\nexport const MMDARPlayer = MMDARApp;\n\nMMDARPlayer.displayName = 'MMDARPlayer';\n\nexport default MMDARPlayer;\n","/**\n * HLSL到GLSL转换器\n * 将MME的HLSL shader代码转换为Three.js可用的GLSL代码\n */\n\nexport interface ConversionResult {\n /** 转换后的GLSL代码 */\n glslCode: string;\n /** 检测到的uniforms */\n uniforms: Map<string, UniformInfo>;\n /** 检测到的attributes */\n attributes: Map<string, AttributeInfo>;\n /** 检测到的varyings */\n varyings: Map<string, VaryingInfo>;\n /** 转换警告 */\n warnings: string[];\n}\n\nexport interface UniformInfo {\n type: string;\n glslType: string;\n semantic?: string;\n}\n\nexport interface AttributeInfo {\n type: string;\n glslType: string;\n semantic: string;\n}\n\nexport interface VaryingInfo {\n type: string;\n glslType: string;\n}\n\nexport class HLSLToGLSLConverter {\n private warnings: string[] = [];\n private uniforms: Map<string, UniformInfo> = new Map();\n private attributes: Map<string, AttributeInfo> = new Map();\n private varyings: Map<string, VaryingInfo> = new Map();\n\n /**\n * HLSL类型到GLSL类型的映射\n */\n private typeMap: Record<string, string> = {\n // 标量类型\n 'float': 'float',\n 'int': 'int',\n 'bool': 'bool',\n 'half': 'float', // GLSL没有half,使用float\n \n // 向量类型\n 'float2': 'vec2',\n 'float3': 'vec3',\n 'float4': 'vec4',\n 'int2': 'ivec2',\n 'int3': 'ivec3',\n 'int4': 'ivec4',\n 'bool2': 'bvec2',\n 'bool3': 'bvec3',\n 'bool4': 'bvec4',\n 'half2': 'vec2',\n 'half3': 'vec3',\n 'half4': 'vec4',\n \n // 矩阵类型\n 'float2x2': 'mat2',\n 'float3x3': 'mat3',\n 'float4x4': 'mat4',\n 'matrix': 'mat4',\n \n // 纹理类型\n 'texture': 'sampler2D',\n 'texture2D': 'sampler2D',\n 'sampler': 'sampler2D',\n 'sampler2D': 'sampler2D',\n 'samplerCUBE': 'samplerCube',\n };\n\n /**\n * HLSL函数到GLSL函数的映射\n */\n private functionMap: Record<string, string> = {\n // 纹理采样\n 'tex2D': 'texture2D',\n 'tex2Dlod': 'texture2DLod',\n 'texCUBE': 'textureCube',\n \n // 数学函数\n 'mul': 'matrixCompMult', // 注意:mul可能需要特殊处理\n 'lerp': 'mix',\n 'frac': 'fract',\n 'saturate': 'clamp01', // 需要自定义函数\n 'ddx': 'dFdx',\n 'ddy': 'dFdy',\n \n // 向量函数\n 'length': 'length',\n 'normalize': 'normalize',\n 'dot': 'dot',\n 'cross': 'cross',\n 'reflect': 'reflect',\n 'refract': 'refract',\n \n // 数学运算\n 'pow': 'pow',\n 'exp': 'exp',\n 'log': 'log',\n 'sqrt': 'sqrt',\n 'abs': 'abs',\n 'sin': 'sin',\n 'cos': 'cos',\n 'tan': 'tan',\n 'asin': 'asin',\n 'acos': 'acos',\n 'atan': 'atan',\n 'atan2': 'atan',\n 'floor': 'floor',\n 'ceil': 'ceil',\n 'min': 'min',\n 'max': 'max',\n 'clamp': 'clamp',\n 'step': 'step',\n 'smoothstep': 'smoothstep',\n };\n\n /**\n * HLSL语义到GLSL的映射\n */\n private semanticMap: Record<string, string> = {\n // 顶点着色器输入\n 'POSITION': 'position',\n 'POSITION0': 'position',\n 'NORMAL': 'normal',\n 'NORMAL0': 'normal',\n 'TEXCOORD': 'uv',\n 'TEXCOORD0': 'uv',\n 'TEXCOORD1': 'uv2',\n 'COLOR': 'color',\n 'COLOR0': 'color',\n 'TANGENT': 'tangent',\n 'BINORMAL': 'binormal',\n \n // 顶点着色器输出 / 像素着色器输入\n 'SV_POSITION': 'gl_Position',\n \n // 像素着色器输出\n 'SV_TARGET': 'gl_FragColor',\n 'SV_TARGET0': 'gl_FragColor',\n };\n\n /**\n * 转换HLSL shader代码为GLSL\n */\n convert(hlslCode: string, shaderType: 'vertex' | 'fragment'): ConversionResult {\n this.warnings = [];\n this.uniforms.clear();\n this.attributes.clear();\n this.varyings.clear();\n\n let glslCode = hlslCode;\n\n // 1. 预处理:移除HLSL特有的预处理指令\n glslCode = this.preprocessCode(glslCode);\n\n // 2. 转换类型声明\n glslCode = this.convertTypes(glslCode);\n\n // 3. 转换函数调用\n glslCode = this.convertFunctions(glslCode);\n\n // 4. 转换语义\n glslCode = this.convertSemantics(glslCode, shaderType);\n\n // 5. 处理输入/输出结构\n glslCode = this.convertIOStructs(glslCode, shaderType);\n\n // 6. 添加GLSL版本声明和必要的辅助函数\n glslCode = this.addGLSLHeader(glslCode);\n\n // 7. 修复语法差异\n glslCode = this.fixSyntaxDifferences(glslCode);\n\n return {\n glslCode,\n uniforms: this.uniforms,\n attributes: this.attributes,\n varyings: this.varyings,\n warnings: this.warnings,\n };\n }\n\n /**\n * 预处理代码\n */\n private preprocessCode(code: string): string {\n // 移除register()声明(HLSL特有)\n code = code.replace(/:\\s*register\\([^)]+\\)/g, '');\n \n // 移除packoffset()声明\n code = code.replace(/:\\s*packoffset\\([^)]+\\)/g, '');\n \n return code;\n }\n\n /**\n * 转换类型声明\n */\n private convertTypes(code: string): string {\n // 替换类型声明\n for (const [hlslType, glslType] of Object.entries(this.typeMap)) {\n // 使用单词边界确保完整匹配\n const regex = new RegExp('\\\\b' + (hlslType) + '\\\\b', 'g');\n code = code.replace(regex, glslType);\n }\n\n return code;\n }\n\n /**\n * 转换函数调用\n */\n private convertFunctions(code: string): string {\n for (const [hlslFunc, glslFunc] of Object.entries(this.functionMap)) {\n const regex = new RegExp('\\\\b' + (hlslFunc) + '\\\\b', 'g');\n code = code.replace(regex, glslFunc);\n }\n\n // 特殊处理mul()函数 - 矩阵乘法\n code = this.convertMulFunction(code);\n\n // 特殊处理saturate()函数\n code = code.replace(/\\bclamp01\\s*\\(/g, 'clamp(');\n code = code.replace(/saturate\\s*\\(([^)]+)\\)/g, 'clamp($1, 0.0, 1.0)');\n\n return code;\n }\n\n /**\n * 转换mul()函数\n * HLSL: mul(matrix, vector) 或 mul(vector, matrix)\n * GLSL: matrix * vector 或 vector * matrix\n */\n private convertMulFunction(code: string): string {\n // 简化版:将mul(a, b)替换为(a * b)\n // 注意:实际使用中可能需要根据参数类型调整顺序\n code = code.replace(/mul\\s*\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/g, '($1 * $2)');\n \n this.warnings.push('mul() function converted to (*) operator - may need manual adjustment for matrix multiplication order');\n \n return code;\n }\n\n /**\n * 转换语义\n */\n private convertSemantics(code: string, shaderType: 'vertex' | 'fragment'): string {\n // 转换输入/输出语义\n for (const [hlslSemantic, glslSemantic] of Object.entries(this.semanticMap)) {\n const regex = new RegExp('\\\\b' + (hlslSemantic) + '\\\\b', 'g');\n code = code.replace(regex, glslSemantic);\n }\n\n return code;\n }\n\n /**\n * 转换输入/输出结构\n */\n private convertIOStructs(code: string, shaderType: 'vertex' | 'fragment'): string {\n // 检测输入结构\n const inputStructRegex = /struct\\s+(\\w+)\\s*{([^}]+)}/g;\n let match;\n\n while ((match = inputStructRegex.exec(code)) !== null) {\n if (!match[1] || !match[2]) continue;\n \n const structName = match[1];\n const structBody = match[2];\n\n // 解析结构体成员\n const members = this.parseStructMembers(structBody);\n\n if (shaderType === 'vertex') {\n // 顶点着色器:将输入结构转换为attributes\n members.forEach(member => {\n this.attributes.set(member.name, {\n type: member.type,\n glslType: this.typeMap[member.type] || member.type,\n semantic: member.semantic || '',\n });\n });\n }\n }\n\n return code;\n }\n\n /**\n * 解析结构体成员\n */\n private parseStructMembers(structBody: string): Array<{ type: string; name: string; semantic?: string }> {\n const members: Array<{ type: string; name: string; semantic?: string }> = [];\n const lines = structBody.split(';');\n\n lines.forEach(line => {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n // 匹配: type name : semantic\n const match = trimmed.match(/(\\w+)\\s+(\\w+)\\s*(?::\\s*(\\w+))?/);\n if (match && match[1] && match[2]) {\n members.push({\n type: match[1],\n name: match[2],\n semantic: match[3],\n });\n }\n });\n\n return members;\n }\n\n /**\n * 添加GLSL头部和辅助函数\n */\n private addGLSLHeader(code: string): string {\n const header = `\n// Auto-converted from HLSL to GLSL\n#ifdef GL_ES\nprecision highp float;\n#endif\n\n// Helper functions for HLSL compatibility\nvec3 mul(mat3 m, vec3 v) { return m * v; }\nvec4 mul(mat4 m, vec4 v) { return m * v; }\nfloat saturate(float x) { return clamp(x, 0.0, 1.0); }\nvec2 saturate(vec2 x) { return clamp(x, 0.0, 1.0); }\nvec3 saturate(vec3 x) { return clamp(x, 0.0, 1.0); }\nvec4 saturate(vec4 x) { return clamp(x, 0.0, 1.0); }\n\n`;\n\n return header + code;\n }\n\n /**\n * 修复语法差异\n */\n private fixSyntaxDifferences(code: string): string {\n // HLSL使用float4构造函数,GLSL使用vec4\n // 这个已经在类型转换中处理了\n\n // 修复分号问题(HLSL在某些地方允许省略分号,GLSL不允许)\n // 这里只做基本检查\n \n return code;\n }\n\n /**\n * 从FX效果中提取并转换shader\n */\n convertFromFXEffect(\n effect: any,\n vertexShaderName: string,\n fragmentShaderName: string\n ): { vertexShader: ConversionResult; fragmentShader: ConversionResult } | null {\n const vsFunc = effect.shaderFunctions?.find((f: any) => f.name === vertexShaderName);\n const fsFunc = effect.shaderFunctions?.find((f: any) => f.name === fragmentShaderName);\n\n if (!vsFunc || !fsFunc) {\n this.warnings.push('Shader functions not found: ' + (vertexShaderName) + ' or ' + (fragmentShaderName));\n return null;\n }\n\n const vertexShader = this.convert(vsFunc.body, 'vertex');\n const fragmentShader = this.convert(fsFunc.body, 'fragment');\n\n return {\n vertexShader,\n fragmentShader,\n };\n }\n}\n\n","/**\n * FX文件解析器\n * 用于解析MME (MikuMikuEffect) 的.fx效果文件\n */\n\nimport type {\n FXEffect,\n FXDefine,\n FXParameter,\n FXStaticVariable,\n FXTexture,\n FXController,\n FXTechnique,\n FXPass,\n FXShaderFunction,\n FXComment,\n FXParserOptions,\n FXSummary,\n GLSLShaders,\n} from './types';\nimport { HLSLToGLSLConverter } from './HLSLToGLSLConverter';\n\nexport class FXParser {\n private options: Required<Omit<FXParserOptions, 'vertexShaderFunction' | 'fragmentShaderFunction'>> & {\n vertexShaderFunction?: string;\n fragmentShaderFunction?: string;\n };\n private hlslConverter: HLSLToGLSLConverter;\n\n constructor(options: FXParserOptions = {}) {\n this.options = {\n keepComments: options.keepComments ?? true,\n parseTechniques: options.parseTechniques ?? true,\n parseShaderFunctions: options.parseShaderFunctions ?? true,\n parseTextures: options.parseTextures ?? true,\n parseControllers: options.parseControllers ?? true,\n convertToGLSL: options.convertToGLSL ?? false,\n vertexShaderFunction: options.vertexShaderFunction,\n fragmentShaderFunction: options.fragmentShaderFunction,\n };\n this.hlslConverter = new HLSLToGLSLConverter();\n }\n\n /**\n * 从URL加载并解析FX文件\n */\n async loadAndParse(url: string): Promise<FXEffect> {\n const response = await fetch(url);\n const content = await response.text();\n const fileName = url.split('/').pop() || 'unknown.fx';\n return this.parse(content, fileName);\n }\n\n /**\n * 解析FX文件内容\n */\n parse(content: string, fileName: string = 'unknown.fx'): FXEffect {\n const lines = content.split('\\n');\n\n const effect: FXEffect = {\n fileName,\n rawContent: content,\n defines: [],\n parameters: [],\n staticVariables: [],\n textures: [],\n controllers: [],\n includes: [],\n techniques: [],\n shaderFunctions: [],\n comments: [],\n };\n\n // 解析各个部分\n effect.defines = this.parseDefines(lines);\n effect.parameters = this.parseParameters(lines);\n effect.staticVariables = this.parseStaticVariables(lines);\n effect.includes = this.parseIncludes(lines);\n\n if (this.options.parseTextures) {\n effect.textures = this.parseTextures(effect.defines);\n }\n\n if (this.options.parseControllers) {\n effect.controllers = this.parseControllers(lines);\n }\n\n if (this.options.parseTechniques) {\n effect.techniques = this.parseTechniques(content);\n }\n\n if (this.options.parseShaderFunctions) {\n effect.shaderFunctions = this.parseShaderFunctions(content);\n }\n\n if (this.options.keepComments) {\n effect.comments = this.parseComments(lines);\n }\n\n // 🎨 转换HLSL到GLSL(如果启用)\n if (this.options.convertToGLSL) {\n effect.glslShaders = this.convertShadersToGLSL(effect);\n }\n\n return effect;\n }\n\n /**\n * 转换shader到GLSL\n */\n private convertShadersToGLSL(effect: FXEffect): GLSLShaders | undefined {\n const warnings: string[] = [];\n\n // 尝试从第一个technique的第一个pass中获取shader函数名\n let vertexShaderName = this.options.vertexShaderFunction;\n let fragmentShaderName = this.options.fragmentShaderFunction;\n\n if (!vertexShaderName || !fragmentShaderName) {\n // 尝试从technique中自动检测\n const firstTechnique = effect.techniques[0];\n if (firstTechnique?.passes && firstTechnique.passes.length > 0) {\n const firstPass = firstTechnique.passes[0];\n if (firstPass) {\n vertexShaderName = vertexShaderName || firstPass.vertexShader?.function || undefined;\n fragmentShaderName = fragmentShaderName || firstPass.pixelShader?.function || undefined;\n }\n }\n }\n\n if (!vertexShaderName || !fragmentShaderName) {\n warnings.push('Could not determine shader function names. Skipping GLSL conversion.');\n return {\n warnings,\n };\n }\n\n // 查找shader函数\n const vsFunc = effect.shaderFunctions.find(f => f.name === vertexShaderName);\n const fsFunc = effect.shaderFunctions.find(f => f.name === fragmentShaderName);\n\n if (!vsFunc || !fsFunc) {\n warnings.push('Shader functions not found: ' + (vertexShaderName) + ' or ' + (fragmentShaderName));\n return {\n warnings,\n };\n }\n\n // 转换顶点着色器\n const vertexResult = this.hlslConverter.convert(vsFunc.body, 'vertex');\n warnings.push(...vertexResult.warnings);\n\n // 转换片段着色器\n const fragmentResult = this.hlslConverter.convert(fsFunc.body, 'fragment');\n warnings.push(...fragmentResult.warnings);\n\n return {\n vertexShader: {\n code: vertexResult.glslCode,\n uniforms: vertexResult.uniforms,\n attributes: vertexResult.attributes,\n varyings: vertexResult.varyings,\n },\n fragmentShader: {\n code: fragmentResult.glslCode,\n uniforms: fragmentResult.uniforms,\n attributes: new Map(),\n varyings: fragmentResult.varyings,\n },\n warnings,\n };\n }\n\n /**\n * 解析宏定义 (#define)\n */\n private parseDefines(lines: string[]): FXDefine[] {\n const defines: FXDefine[] = [];\n const defineRegex = /^\\s*(\\/\\/)?\\s*#define\\s+(\\w+)(?:\\s+(.+))?\\s*$/;\n\n lines.forEach((line, index) => {\n const match = line.match(defineRegex);\n if (match && match[2]) {\n const isCommented = !!match[1];\n const name = match[2];\n const value = match[3]?.trim();\n\n // 提取行尾注释\n let comment: string | undefined;\n if (value) {\n const commentMatch = value.match(/\\/\\/(.+)$/);\n if (commentMatch && commentMatch[1]) {\n comment = commentMatch[1].trim();\n }\n }\n\n const cleanValue = value?.replace(/\\/\\/.*$/, '').trim();\n defines.push({\n name,\n value: cleanValue || undefined,\n isCommented,\n lineNumber: index + 1,\n comment,\n });\n }\n });\n\n return defines;\n }\n\n /**\n * 解析参数声明\n */\n private parseParameters(lines: string[]): FXParameter[] {\n const parameters: FXParameter[] = [];\n \n // 匹配类型、名称、语义和默认值\n const paramRegex = /^\\s*(float|float2|float3|float4|float4x4|texture|sampler|sampler2D|bool|int)\\s+(\\w+)\\s*(?::\\s*(\\w+))?\\s*(?:<([^>]+)>)?\\s*(?:=\\s*([^;]+))?\\s*;/;\n\n lines.forEach((line, index) => {\n const match = line.match(paramRegex);\n if (match && match[1] && match[2]) {\n const type = match[1];\n const name = match[2];\n const semantic = match[3];\n const annotationsStr = match[4];\n const defaultValue = match[5]?.trim();\n\n // 解析注解 (annotations)\n let annotations: Record<string, any> | undefined;\n if (annotationsStr) {\n annotations = this.parseAnnotations(annotationsStr);\n }\n\n parameters.push({\n type,\n name,\n semantic,\n defaultValue,\n annotations,\n lineNumber: index + 1,\n });\n }\n });\n\n return parameters;\n }\n\n /**\n * 解析注解 (annotations)\n */\n private parseAnnotations(annotationsStr: string): Record<string, any> {\n const annotations: Record<string, any> = {};\n const annotationRegex = /(string|float|int|bool)\\s+(\\w+)\\s*=\\s*\"?([^;\"]+)\"?/g;\n \n let match;\n while ((match = annotationRegex.exec(annotationsStr)) !== null) {\n if (!match[1] || !match[2] || !match[3]) continue;\n \n const type = match[1];\n const name = match[2];\n const value = match[3].trim();\n\n // 类型转换\n if (type === 'float') {\n annotations[name] = parseFloat(value);\n } else if (type === 'int') {\n annotations[name] = parseInt(value, 10);\n } else if (type === 'bool') {\n annotations[name] = value === 'true';\n } else {\n annotations[name] = value;\n }\n }\n\n return annotations;\n }\n\n /**\n * 解析静态变量\n */\n private parseStaticVariables(lines: string[]): FXStaticVariable[] {\n const variables: FXStaticVariable[] = [];\n const staticRegex = /^\\s*static\\s+(float|float2|float3|float4|bool|int)\\s+(\\w+)\\s*=\\s*(.+?);/;\n\n lines.forEach((line, index) => {\n const match = line.match(staticRegex);\n if (match && match[1] && match[2] && match[3]) {\n variables.push({\n type: match[1],\n name: match[2],\n expression: match[3].trim(),\n lineNumber: index + 1,\n });\n }\n });\n\n return variables;\n }\n\n /**\n * 解析纹理引用\n */\n private parseTextures(defines: FXDefine[]): FXTexture[] {\n const textures: FXTexture[] = [];\n const textureDefineRegex = /^BLEND(\\w+)TEXTURE$/;\n\n defines.forEach((define) => {\n const match = define.name.match(textureDefineRegex);\n if (match && match[1] && define.value && !define.isCommented) {\n const purpose = match[1].toLowerCase();\n const path = define.value.replace(/\"/g, '');\n\n // 查找对应的宽度和高度定义\n const widthDefine = defines.find(d => d.name === (define.name) + '_X');\n const heightDefine = defines.find(d => d.name === (define.name) + '_Y');\n\n textures.push({\n name: define.name,\n path,\n width: widthDefine?.value ? parseInt(widthDefine.value, 10) : undefined,\n height: heightDefine?.value ? parseInt(heightDefine.value, 10) : undefined,\n purpose,\n });\n }\n });\n\n return textures;\n }\n\n /**\n * 解析控制器引用 (CONTROLOBJECT)\n */\n private parseControllers(lines: string[]): FXController[] {\n const controllers: FXController[] = [];\n const controllerRegex = /(\\w+)\\s*:\\s*CONTROLOBJECT\\s*<\\s*string\\s+name\\s*=\\s*\"([^\"]+)\"\\s*;\\s*string\\s+item\\s*=\\s*\"([^\"]+)\"\\s*>/;\n\n lines.forEach((line) => {\n const match = line.match(controllerRegex);\n if (match && match[1] && match[2] && match[3]) {\n controllers.push({\n name: match[1],\n objectName: match[2],\n itemName: match[3],\n boundParameter: match[1],\n });\n }\n });\n\n return controllers;\n }\n\n /**\n * 解析include指令\n */\n private parseIncludes(lines: string[]): string[] {\n const includes: string[] = [];\n const includeRegex = /^\\s*#include\\s+\"([^\"]+)\"/;\n\n lines.forEach((line) => {\n const match = line.match(includeRegex);\n if (match && match[1]) {\n includes.push(match[1]);\n }\n });\n\n return includes;\n }\n\n /**\n * 解析Technique定义\n */\n private parseTechniques(content: string): FXTechnique[] {\n const techniques: FXTechnique[] = [];\n const techniqueRegex = /technique\\s+(\\w+)\\s*\\{([^}]+(?:\\{[^}]*\\}[^}]*)*)\\}/g;\n\n let match;\n while ((match = techniqueRegex.exec(content)) !== null) {\n if (!match[1] || !match[2]) continue;\n \n const name = match[1];\n const body = match[2];\n const lineNumber = content.substring(0, match.index).split('\\n').length;\n\n techniques.push({\n name,\n passes: this.parsePasses(body),\n lineNumber,\n });\n }\n\n return techniques;\n }\n\n /**\n * 解析Pass定义\n */\n private parsePasses(techniqueBody: string): FXPass[] {\n const passes: FXPass[] = [];\n const passRegex = /pass\\s+(\\w+)?\\s*\\{([^}]+)\\}/g;\n\n let match;\n while ((match = passRegex.exec(techniqueBody)) !== null) {\n if (!match[2]) continue;\n \n const name = match[1] || undefined;\n const body = match[2];\n\n const pass: FXPass = {\n name,\n renderStates: {},\n };\n\n // 解析VertexShader\n const vsMatch = /VertexShader\\s*=\\s*compile\\s+(\\w+)\\s+(\\w+)/i.exec(body);\n if (vsMatch && vsMatch[1] && vsMatch[2]) {\n pass.vertexShader = {\n profile: vsMatch[1],\n function: vsMatch[2],\n };\n }\n\n // 解析PixelShader\n const psMatch = /PixelShader\\s*=\\s*compile\\s+(\\w+)\\s+(\\w+)/i.exec(body);\n if (psMatch && psMatch[1] && psMatch[2]) {\n pass.pixelShader = {\n profile: psMatch[1],\n function: psMatch[2],\n };\n }\n\n // 解析渲染状态\n const stateRegex = /(\\w+)\\s*=\\s*([^;]+);/g;\n let stateMatch;\n while ((stateMatch = stateRegex.exec(body)) !== null) {\n if (!stateMatch[1] || !stateMatch[2]) continue;\n \n const stateName = stateMatch[1];\n const stateValue = stateMatch[2].trim();\n \n if (stateName !== 'VertexShader' && stateName !== 'PixelShader') {\n pass.renderStates[stateName] = stateValue;\n }\n }\n\n passes.push(pass);\n }\n\n return passes;\n }\n\n /**\n * 解析着色器函数\n */\n private parseShaderFunctions(content: string): FXShaderFunction[] {\n const functions: FXShaderFunction[] = [];\n \n // 匹配函数定义: returnType functionName(params) : semantic { body }\n const functionRegex = /(struct|void|float|float2|float3|float4)\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(?::\\s*(\\w+))?\\s*\\{/g;\n\n let match;\n while ((match = functionRegex.exec(content)) !== null) {\n if (!match[1] || !match[2] || !match[3]) continue;\n \n const returnType = match[1];\n const name = match[2];\n const parameters = match[3];\n const outputSemantic = match[4] || undefined;\n const lineNumber = content.substring(0, match.index).split('\\n').length;\n\n // 提取函数体(简化版,不处理嵌套花括号)\n const bodyStart = match.index + match[0].length;\n let braceCount = 1;\n let bodyEnd = bodyStart;\n \n for (let i = bodyStart; i < content.length && braceCount > 0; i++) {\n if (content[i] === '{') braceCount++;\n if (content[i] === '}') braceCount--;\n bodyEnd = i;\n }\n\n const body = content.substring(bodyStart, bodyEnd);\n\n functions.push({\n name,\n returnType,\n parameters,\n body,\n outputSemantic,\n lineNumber,\n });\n }\n\n return functions;\n }\n\n /**\n * 解析注释\n */\n private parseComments(lines: string[]): FXComment[] {\n const comments: FXComment[] = [];\n\n lines.forEach((line, index) => {\n // 单行注释\n const lineCommentMatch = line.match(/^\\s*\\/\\/(.*)$/);\n if (lineCommentMatch && lineCommentMatch[1]) {\n comments.push({\n content: lineCommentMatch[1].trim(),\n type: 'line',\n lineNumber: index + 1,\n });\n }\n\n // 块注释(简化版,仅处理单行的块注释)\n const blockCommentMatch = line.match(/\\/\\*(.+?)\\*\\//);\n if (blockCommentMatch && blockCommentMatch[1]) {\n comments.push({\n content: blockCommentMatch[1].trim(),\n type: 'block',\n lineNumber: index + 1,\n });\n }\n });\n\n return comments;\n }\n\n /**\n * 生成FX文件摘要\n */\n generateSummary(effect: FXEffect): FXSummary {\n const enabledDefines = effect.defines\n .filter(d => !d.isCommented)\n .map(d => d.name);\n\n const disabledDefines = effect.defines\n .filter(d => d.isCommented)\n .map(d => d.name);\n\n return {\n fileName: effect.fileName,\n defineCount: effect.defines.length,\n parameterCount: effect.parameters.length,\n textureCount: effect.textures.length,\n techniqueCount: effect.techniques.length,\n hasLocalShadow: enabledDefines.includes('USE_LOCALSHADOW'),\n hasExcellentShadow: enabledDefines.includes('USE_EXCELLENTSHADOW'),\n hasHgShadow: enabledDefines.includes('USE_HGSHADOW'),\n enabledDefines,\n disabledDefines,\n };\n }\n\n /**\n * 提取特定着色器函数的代码\n */\n extractShaderFunction(effect: FXEffect, functionName: string): string | null {\n const func = effect.shaderFunctions.find(f => f.name === functionName);\n if (!func) return null;\n\n return (func.returnType) + ' ' + (func.name) + '(' + (func.parameters) + ')' + (func.outputSemantic ? ' : ' + func.outputSemantic : '') + '\\n{\\n' + (func.body) + '\\n}';\n }\n\n /**\n * 获取所有启用的功能标志\n */\n getEnabledFeatures(effect: FXEffect): string[] {\n return effect.defines\n .filter(d => !d.isCommented && !d.value) // 只有标志,没有值的define\n .map(d => d.name);\n }\n\n /**\n * 获取配置参数\n */\n getConfigParameters(effect: FXEffect): FXParameter[] {\n return effect.parameters.filter(p => \n p.annotations?.UIName || p.annotations?.UIWidget\n );\n }\n}\n\n","/**\n * FX到Three.js适配器\n * 将解析的FX文件参数应用到Three.js渲染中\n */\n\nimport * as THREE from 'three';\nimport type { FXEffect, FXParameter, FXTexture } from './types';\n\n/**\n * Three.js材质配置\n */\nexport interface ThreeMaterialConfig {\n /** 基础颜色 */\n color?: THREE.Color;\n /** 发光颜色 */\n emissive?: THREE.Color;\n /** 高光颜色 */\n specular?: THREE.Color;\n /** 光泽度 */\n shininess?: number;\n /** 透明度 */\n opacity?: number;\n /** 是否透明 */\n transparent?: boolean;\n /** 纹理贴图 */\n map?: THREE.Texture | null;\n /** 法线贴图 */\n normalMap?: THREE.Texture | null;\n /** 环境贴图 */\n envMap?: THREE.Texture | null;\n /** 自定义uniforms */\n uniforms?: Record<string, { value: any }>;\n}\n\n/**\n * Three.js渲染配置\n */\nexport interface ThreeRenderConfig {\n /** 是否启用阴影 */\n enableShadow?: boolean;\n /** 阴影贴图尺寸 */\n shadowMapSize?: number;\n /** 环境光强度 */\n ambientLightIntensity?: number;\n /** 方向光强度 */\n directionalLightIntensity?: number;\n /** 方向光方向 */\n lightDirection?: THREE.Vector3;\n /** 色调映射 */\n toneMapping?: THREE.ToneMapping;\n /** 曝光度 */\n toneMappingExposure?: number;\n}\n\n/**\n * FX到Three.js适配器\n */\nexport class FXToThreeAdapter {\n private effect: FXEffect;\n private textureLoader: THREE.TextureLoader;\n private loadedTextures: Map<string, THREE.Texture>;\n private basePath: string;\n\n constructor(effect: FXEffect, basePath: string = '') {\n this.effect = effect;\n this.basePath = basePath;\n this.textureLoader = new THREE.TextureLoader();\n this.loadedTextures = new Map();\n }\n\n /**\n * 创建ShaderMaterial(如果有GLSL shader)\n */\n createShaderMaterial(): THREE.ShaderMaterial | null {\n if (!this.effect.glslShaders?.vertexShader || !this.effect.glslShaders?.fragmentShader) {\n console.warn('[FXToThreeAdapter] No GLSL shaders available. Use convertToGLSL option in FXParser.');\n return null;\n }\n\n const vs = this.effect.glslShaders.vertexShader;\n const fs = this.effect.glslShaders.fragmentShader;\n\n // 收集所有uniforms\n const uniforms: Record<string, THREE.IUniform> = {};\n\n // 从顶点着色器添加uniforms\n vs.uniforms.forEach((info, name) => {\n uniforms[name] = { value: this.getDefaultUniformValue(info.glslType) };\n });\n\n // 从片段着色器添加uniforms\n fs.uniforms.forEach((info, name) => {\n if (!uniforms[name]) {\n uniforms[name] = { value: this.getDefaultUniformValue(info.glslType) };\n }\n });\n\n // 添加常用的Three.js uniforms\n uniforms.modelMatrix = { value: new THREE.Matrix4() };\n uniforms.viewMatrix = { value: new THREE.Matrix4() };\n uniforms.projectionMatrix = { value: new THREE.Matrix4() };\n uniforms.normalMatrix = { value: new THREE.Matrix3() };\n uniforms.cameraPosition = { value: new THREE.Vector3() };\n\n const material = new THREE.ShaderMaterial({\n vertexShader: vs.code,\n fragmentShader: fs.code,\n uniforms,\n });\n\n console.log('[FXToThreeAdapter] Created ShaderMaterial with', Object.keys(uniforms).length, 'uniforms');\n console.log('[FXToThreeAdapter] Conversion warnings:', this.effect.glslShaders.warnings);\n\n return material;\n }\n\n /**\n * 获取uniform的默认值\n */\n private getDefaultUniformValue(glslType: string): any {\n switch (glslType) {\n case 'float':\n return 0.0;\n case 'vec2':\n return new THREE.Vector2(0, 0);\n case 'vec3':\n return new THREE.Vector3(0, 0, 0);\n case 'vec4':\n return new THREE.Vector4(0, 0, 0, 0);\n case 'mat3':\n return new THREE.Matrix3();\n case 'mat4':\n return new THREE.Matrix4();\n case 'sampler2D':\n return null;\n case 'samplerCube':\n return null;\n default:\n return null;\n }\n }\n\n /**\n * 提取材质配置\n */\n extractMaterialConfig(): ThreeMaterialConfig {\n const config: ThreeMaterialConfig = {\n uniforms: {},\n };\n\n console.log('[FXToThreeAdapter] Extracting material config from FX:', this.effect.fileName);\n console.log('[FXToThreeAdapter] Total parameters:', this.effect.parameters.length);\n\n // 提取颜色参数\n this.effect.parameters.forEach(param => {\n const name = param.name.toLowerCase();\n \n // 🎯 跳过增量参数(Add开头的参数是增量值,不是绝对值)\n if (name.startsWith('add')) {\n console.log('[FXToThreeAdapter] Skipping additive param \"' + (param.name) + '\" (not an absolute value)');\n return;\n }\n \n // 材质颜色\n if (name.includes('materialrgb') || name.includes('material')) {\n const colorValue = this.parseFloat3(param.defaultValue);\n if (colorValue) {\n config.color = new THREE.Color(\n colorValue[0],\n colorValue[1],\n colorValue[2]\n );\n console.log('[FXToThreeAdapter] Found color param \"' + (param.name) + '\":', colorValue);\n }\n }\n\n // 发光颜色\n if (name.includes('emissive')) {\n const emissiveValue = this.parseFloat3(param.defaultValue);\n if (emissiveValue) {\n config.emissive = new THREE.Color(\n emissiveValue[0],\n emissiveValue[1],\n emissiveValue[2]\n );\n console.log('[FXToThreeAdapter] Found emissive param \"' + (param.name) + '\":', emissiveValue);\n }\n }\n\n // 高光颜色\n if (name.includes('specular')) {\n const specularValue = this.parseFloat3(param.defaultValue);\n if (specularValue) {\n config.specular = new THREE.Color(\n specularValue[0],\n specularValue[1],\n specularValue[2]\n );\n console.log('[FXToThreeAdapter] Found specular param \"' + (param.name) + '\":', specularValue);\n }\n }\n\n // 光泽度\n if (name.includes('shininess') || name.includes('specularpower')) {\n const shininessValue = this.parseFloat(param.defaultValue);\n if (shininessValue !== null) {\n config.shininess = shininessValue;\n console.log('[FXToThreeAdapter] Found shininess param \"' + (param.name) + '\":', shininessValue);\n }\n }\n\n // 添加到uniforms\n if (config.uniforms && param.defaultValue) {\n config.uniforms[param.name] = {\n value: this.parseParameterValue(param),\n };\n }\n });\n\n console.log('[FXToThreeAdapter] Final material config:', {\n color: config.color,\n emissive: config.emissive,\n specular: config.specular,\n shininess: config.shininess,\n });\n\n return config;\n }\n\n /**\n * 提取渲染配置\n */\n extractRenderConfig(): ThreeRenderConfig {\n const config: ThreeRenderConfig = {};\n\n // 检查阴影功能\n const hasLocalShadow = this.effect.defines.some(\n d => d.name === 'USE_LOCALSHADOW' && !d.isCommented\n );\n const hasExcellentShadow = this.effect.defines.some(\n d => d.name === 'USE_EXCELLENTSHADOW' && !d.isCommented\n );\n const hasHgShadow = this.effect.defines.some(\n d => d.name === 'USE_HGSHADOW' && !d.isCommented\n );\n\n config.enableShadow = hasLocalShadow || hasExcellentShadow || hasHgShadow;\n\n // 阴影贴图尺寸\n const shadowMapSizeDefine = this.effect.defines.find(\n d => d.name === 'LS_ShadowMapBuffSize'\n );\n if (shadowMapSizeDefine?.value) {\n config.shadowMapSize = parseInt(shadowMapSizeDefine.value, 10);\n }\n\n // 光源方向\n const lightDirDefine = this.effect.defines.find(\n d => d.name === 'LS_InitDirection'\n );\n if (lightDirDefine?.value) {\n const dir = this.parseFloat3(lightDirDefine.value);\n if (dir) {\n config.lightDirection = new THREE.Vector3(dir[0], dir[1], dir[2]).normalize();\n }\n }\n\n // 🎯 不设置默认光照强度,让stage配置生效\n // 只有FX文件明确定义了光照参数时才设置\n // config.ambientLightIntensity = 0.5;\n // config.directionalLightIntensity = 0.8;\n\n // 色调映射(卡通渲染通常不使用)\n const hasToon = this.effect.defines.some(\n d => d.name === 'MODEL_TOON' && !d.isCommented\n );\n config.toneMapping = hasToon ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping;\n config.toneMappingExposure = 1.0;\n\n console.log('[FXToThreeAdapter] Extracted render config:', config);\n\n return config;\n }\n\n /**\n * 加载纹理\n */\n async loadTextures(): Promise<Map<string, THREE.Texture>> {\n const promises = this.effect.textures.map(async (fxTexture) => {\n const path = this.basePath ? (this.basePath) + '/' + (fxTexture.path) : fxTexture.path;\n \n try {\n const texture = await this.loadTexture(path);\n this.loadedTextures.set(fxTexture.name, texture);\n return { name: fxTexture.name, texture };\n } catch (error) {\n console.warn('Failed to load texture ' + (fxTexture.name) + ':', error);\n return null;\n }\n });\n\n await Promise.all(promises);\n return this.loadedTextures;\n }\n\n /**\n * 加载单个纹理\n */\n private loadTexture(path: string): Promise<THREE.Texture> {\n return new Promise((resolve, reject) => {\n this.textureLoader.load(\n path,\n (texture) => {\n // 设置纹理参数\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n texture.needsUpdate = true;\n resolve(texture);\n },\n undefined,\n (error) => reject(error)\n );\n });\n }\n\n /**\n * 创建Three.js材质\n */\n createMaterial(): THREE.MeshPhongMaterial {\n const config = this.extractMaterialConfig();\n\n const material = new THREE.MeshPhongMaterial({\n color: config.color || 0xffffff,\n emissive: config.emissive || 0x000000,\n specular: config.specular || 0x111111,\n shininess: config.shininess ?? 30,\n transparent: config.transparent ?? false,\n opacity: config.opacity ?? 1.0,\n });\n\n // 应用纹理\n const diffuseTexture = this.getTextureByPurpose('diffuse');\n if (diffuseTexture) {\n material.map = diffuseTexture;\n }\n\n const normalTexture = this.getTextureByPurpose('normal');\n if (normalTexture) {\n material.normalMap = normalTexture;\n }\n\n return material;\n }\n\n /**\n * 配置Three.js场景\n * 仅应用渲染器配置,不添加光源\n */\n configureScene(scene: THREE.Scene, renderer: THREE.WebGLRenderer): void {\n const renderConfig = this.extractRenderConfig();\n\n // 配置阴影\n if (renderConfig.enableShadow !== undefined) {\n renderer.shadowMap.enabled = renderConfig.enableShadow;\n if (renderConfig.enableShadow) {\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n }\n\n // 配置色调映射\n if (renderConfig.toneMapping !== undefined) {\n renderer.toneMapping = renderConfig.toneMapping;\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n renderer.toneMappingExposure = renderConfig.toneMappingExposure;\n }\n }\n\n /**\n * 获取指定用途的纹理\n */\n private getTextureByPurpose(purpose: string): THREE.Texture | null {\n const fxTexture = this.effect.textures.find(t => \n t.purpose?.toLowerCase().includes(purpose.toLowerCase())\n );\n \n if (!fxTexture) return null;\n return this.loadedTextures.get(fxTexture.name) || null;\n }\n\n /**\n * 解析float3值\n */\n private parseFloat3(value?: string): [number, number, number] | null {\n if (!value) return null;\n \n const match = value.match(/float3\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\)/);\n if (!match || !match[1] || !match[2] || !match[3]) return null;\n \n return [\n parseFloat(match[1]),\n parseFloat(match[2]),\n parseFloat(match[3]),\n ];\n }\n\n /**\n * 解析float值\n */\n private parseFloat(value?: string): number | null {\n if (!value) return null;\n const num = parseFloat(value);\n return isNaN(num) ? null : num;\n }\n\n /**\n * 解析参数值\n */\n private parseParameterValue(param: FXParameter): any {\n if (!param.defaultValue) return null;\n\n switch (param.type) {\n case 'float':\n return this.parseFloat(param.defaultValue);\n \n case 'float2': {\n const match = param.defaultValue.match(/float2\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\)/);\n return (match && match[1] && match[2]) ? new THREE.Vector2(parseFloat(match[1]), parseFloat(match[2])) : null;\n }\n \n case 'float3': {\n const values = this.parseFloat3(param.defaultValue);\n return values ? new THREE.Vector3(values[0], values[1], values[2]) : null;\n }\n \n case 'float4': {\n const match = param.defaultValue.match(/float4\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\)/);\n if (match && match[1] && match[2] && match[3] && match[4]) {\n return new THREE.Vector4(\n parseFloat(match[1]),\n parseFloat(match[2]),\n parseFloat(match[3]),\n parseFloat(match[4])\n );\n }\n return null;\n }\n \n default:\n return param.defaultValue;\n }\n }\n\n /**\n * 获取所有自定义uniforms\n */\n getUniforms(): Record<string, { value: any }> {\n const uniforms: Record<string, { value: any }> = {};\n\n this.effect.parameters.forEach(param => {\n const value = this.parseParameterValue(param);\n if (value !== null) {\n uniforms[param.name] = { value };\n }\n });\n\n // 添加纹理uniforms\n this.loadedTextures.forEach((texture, name) => {\n uniforms[name] = { value: texture };\n });\n\n return uniforms;\n }\n\n /**\n * 生成配置摘要\n */\n getSummary(): {\n materialParams: string[];\n textures: string[];\n renderFeatures: string[];\n } {\n return {\n materialParams: this.effect.parameters.map(p => (p.type) + ' ' + (p.name)),\n textures: this.effect.textures.map(t => t.path),\n renderFeatures: this.effect.defines\n .filter(d => !d.isCommented && (d.name.startsWith('USE_') || d.name.includes('SHADOW')))\n .map(d => d.name),\n };\n }\n}\n\n","/**\n * 多FX文件适配器\n * 支持同时应用多个FX效果文件\n */\n\nimport * as THREE from 'three';\nimport { FXParser } from './FXParser';\nimport { FXToThreeAdapter } from './FXToThreeAdapter';\nimport type { FXEffect } from './types';\nimport type { ThreeMaterialConfig, ThreeRenderConfig } from './FXToThreeAdapter';\n\n/**\n * 效果文件类型\n */\nexport type EffectFileType = 'fx' | 'x' | 'auto';\n\n/**\n * FX文件配置\n */\nexport interface FXFileConfig {\n /** FX/X文件路径 */\n path: string;\n /** 纹理基础路径 */\n texturePath?: string;\n /** 文件类型 */\n type?: EffectFileType;\n /** \n * 优先级 (数字越大优先级越高,默认0)\n * - .x文件建议设置为低优先级(如-10),作为基础效果\n * - .fx文件建议设置为高优先级(如10),作为细节效果\n */\n priority?: number;\n /** \n * 应用目标 \n * - 'all': 应用到所有对象\n * - 'model': 仅应用到模型\n * - 'stage': 仅应用到舞台\n * - 'scene': 仅应用场景配置(光照、阴影等)\n * - string[]: 应用到指定名称的对象\n */\n target?: 'all' | 'model' | 'stage' | 'scene' | string[];\n /** 是否启用 */\n enabled?: boolean;\n /** 描述(用于调试) */\n description?: string;\n /** 是否转换为GLSL并使用ShaderMaterial */\n useShaderMaterial?: boolean;\n /** 顶点着色器函数名(用于GLSL转换) */\n vertexShaderFunction?: string;\n /** 片段着色器函数名(用于GLSL转换) */\n fragmentShaderFunction?: string;\n}\n\n/**\n * 多FX合并策略\n */\nexport type FXMergeStrategy = \n | 'override' // 覆盖模式:高优先级完全覆盖低优先级\n | 'merge' // 合并模式:智能合并参数\n | 'additive'; // 叠加模式:数值参数叠加\n\n/**\n * 多FX适配器配置\n */\nexport interface MultiFXAdapterOptions {\n /** 合并策略 */\n mergeStrategy?: FXMergeStrategy;\n /** 是否自动加载纹理 */\n autoLoadTextures?: boolean;\n}\n\n/**\n * 多FX文件适配器\n * 支持同时加载和应用多个FX效果文件\n */\nexport class MultiFXAdapter {\n private effects: Map<string, FXEffect> = new Map();\n private adapters: Map<string, FXToThreeAdapter> = new Map();\n private configs: FXFileConfig[] = [];\n private options: Required<MultiFXAdapterOptions>;\n private parser: FXParser;\n\n constructor(options: MultiFXAdapterOptions = {}) {\n this.options = {\n mergeStrategy: options.mergeStrategy || 'override',\n autoLoadTextures: options.autoLoadTextures ?? true,\n };\n this.parser = new FXParser();\n }\n\n /**\n * 识别文件类型\n */\n private detectFileType(path: string, configType?: EffectFileType): EffectFileType {\n if (configType && configType !== 'auto') {\n return configType;\n }\n \n const ext = path.toLowerCase().split('.').pop();\n if (ext === 'x') return 'x';\n if (ext === 'fx') return 'fx';\n \n return 'fx'; // 默认为fx\n }\n\n /**\n * 添加效果文件(支持.fx和.x)\n */\n async addFX(config: FXFileConfig): Promise<void> {\n if (!config.enabled && config.enabled !== undefined) {\n console.log('[MultiFXAdapter] Effect disabled:', config.path);\n return;\n }\n\n try {\n const fileType = this.detectFileType(config.path, config.type);\n const desc = config.description || config.path;\n \n console.log('[MultiFXAdapter] Loading ' + (fileType.toUpperCase()) + ' file:', desc);\n \n // 解析效果文件(.fx和.x都可以用FXParser解析)\n const effect = await this.parser.loadAndParse(config.path);\n this.effects.set(config.path, effect);\n \n // 创建适配器\n const adapter = new FXToThreeAdapter(effect, config.texturePath || '');\n this.adapters.set(config.path, adapter);\n \n // 加载纹理\n if (this.options.autoLoadTextures) {\n console.log('[MultiFXAdapter] Loading textures for ' + (fileType) + ':', desc);\n await adapter.loadTextures();\n }\n \n // 保存配置,设置默认值\n const defaultPriority = fileType === 'x' ? -10 : 0; // .x文件默认低优先级(基础效果)\n const defaultTarget = fileType === 'x' ? 'all' : 'model'; // .x应用到全部,.fx应用到模型\n \n this.configs.push({\n ...config,\n type: fileType,\n priority: config.priority ?? defaultPriority,\n target: config.target ?? defaultTarget,\n enabled: true,\n });\n \n // 按优先级排序(.x先应用,.fx后应用)\n this.configs.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n \n const lastConfig = this.configs[this.configs.length - 1];\n console.log('[MultiFXAdapter] ' + (fileType.toUpperCase()) + ' loaded successfully:', desc);\n console.log('[MultiFXAdapter] - Priority: ' + (lastConfig?.priority ?? 0));\n console.log('[MultiFXAdapter] - Target: ' + (lastConfig?.target ?? 'all'));\n } catch (error) {\n console.error('[MultiFXAdapter] Failed to load effect file:', config.path, error);\n throw error;\n }\n }\n\n /**\n * 批量添加FX文件\n */\n async addMultipleFX(configs: FXFileConfig[]): Promise<void> {\n await Promise.all(configs.map(config => this.addFX(config)));\n }\n\n /**\n * 移除FX文件\n */\n removeFX(path: string): void {\n this.effects.delete(path);\n this.adapters.delete(path);\n this.configs = this.configs.filter(c => c.path !== path);\n }\n\n /**\n * 清空所有FX\n */\n clear(): void {\n this.effects.clear();\n this.adapters.clear();\n this.configs = [];\n }\n\n /**\n * 合并材质配置\n */\n extractMergedMaterialConfig(target?: string): ThreeMaterialConfig {\n const merged: ThreeMaterialConfig = {\n uniforms: {},\n };\n\n console.log('[MultiFXAdapter] Extracting material config for target:', target);\n console.log('[MultiFXAdapter] Total configs:', this.configs.length);\n\n // 按优先级顺序应用\n this.configs.forEach(config => {\n // 检查目标匹配\n let shouldApply = false;\n if (!target || config.target === 'all') {\n shouldApply = true;\n } else if (Array.isArray(config.target)) {\n shouldApply = config.target.includes(target);\n } else {\n shouldApply = config.target === target;\n }\n \n if (!shouldApply) {\n console.log('[MultiFXAdapter] - Skipping ' + (config.description || config.path) + ' (target mismatch: ' + (config.target) + ' !== ' + (target) + ')');\n return;\n }\n\n const adapter = this.adapters.get(config.path);\n if (!adapter) {\n console.log('[MultiFXAdapter] - Skipping ' + (config.description || config.path) + ' (adapter not found)');\n return;\n }\n\n console.log('[MultiFXAdapter] ✅ Applying ' + (config.description || config.path) + ' (priority: ' + (config.priority) + ')');\n const materialConfig = adapter.extractMaterialConfig();\n\n // 根据合并策略应用\n switch (this.options.mergeStrategy) {\n case 'override':\n // 覆盖模式:直接覆盖\n if (materialConfig.color) merged.color = materialConfig.color;\n if (materialConfig.emissive) merged.emissive = materialConfig.emissive;\n if (materialConfig.specular) merged.specular = materialConfig.specular;\n if (materialConfig.shininess !== undefined) merged.shininess = materialConfig.shininess;\n if (materialConfig.opacity !== undefined) merged.opacity = materialConfig.opacity;\n if (materialConfig.transparent !== undefined) merged.transparent = materialConfig.transparent;\n if (materialConfig.uniforms && merged.uniforms) {\n Object.assign(merged.uniforms, materialConfig.uniforms);\n }\n break;\n\n case 'merge':\n // 合并模式:智能合并\n merged.color = materialConfig.color || merged.color;\n merged.emissive = materialConfig.emissive || merged.emissive;\n merged.specular = materialConfig.specular || merged.specular;\n merged.shininess = materialConfig.shininess ?? merged.shininess;\n merged.opacity = materialConfig.opacity ?? merged.opacity;\n merged.transparent = materialConfig.transparent ?? merged.transparent;\n if (materialConfig.uniforms && merged.uniforms) {\n Object.assign(merged.uniforms, materialConfig.uniforms);\n }\n break;\n\n case 'additive':\n // 叠加模式:数值参数叠加\n if (materialConfig.color && merged.color) {\n merged.color.add(materialConfig.color);\n } else {\n merged.color = materialConfig.color;\n }\n if (materialConfig.emissive && merged.emissive) {\n merged.emissive.add(materialConfig.emissive);\n } else {\n merged.emissive = materialConfig.emissive;\n }\n // shininess等数值叠加\n if (materialConfig.shininess !== undefined) {\n merged.shininess = (merged.shininess ?? 0) + materialConfig.shininess;\n }\n if (materialConfig.uniforms && merged.uniforms) {\n Object.assign(merged.uniforms, materialConfig.uniforms);\n }\n break;\n }\n });\n\n return merged;\n }\n\n /**\n * 合并渲染配置\n */\n extractMergedRenderConfig(): ThreeRenderConfig {\n const merged: ThreeRenderConfig = {};\n\n console.log('[MultiFXAdapter] Extracting merged render config from', this.configs.length, 'configs');\n\n // 按优先级顺序应用\n this.configs.forEach(config => {\n const adapter = this.adapters.get(config.path);\n if (!adapter) return;\n\n const renderConfig = adapter.extractRenderConfig();\n \n console.log('[MultiFXAdapter] Processing ' + (config.description || config.path) + ':');\n console.log(' - enableShadow:', renderConfig.enableShadow);\n console.log(' - shadowMapSize:', renderConfig.shadowMapSize);\n console.log(' - toneMapping:', renderConfig.toneMapping);\n\n // 合并配置(高优先级覆盖)\n if (renderConfig.enableShadow !== undefined) {\n merged.enableShadow = renderConfig.enableShadow;\n }\n if (renderConfig.shadowMapSize !== undefined) {\n merged.shadowMapSize = renderConfig.shadowMapSize;\n }\n if (renderConfig.ambientLightIntensity !== undefined) {\n merged.ambientLightIntensity = renderConfig.ambientLightIntensity;\n }\n if (renderConfig.directionalLightIntensity !== undefined) {\n merged.directionalLightIntensity = renderConfig.directionalLightIntensity;\n }\n if (renderConfig.lightDirection) {\n merged.lightDirection = renderConfig.lightDirection;\n }\n if (renderConfig.toneMapping !== undefined) {\n merged.toneMapping = renderConfig.toneMapping;\n console.log(`[MultiFXAdapter] ✅ ToneMapping set to:`, renderConfig.toneMapping === THREE.NoToneMapping ? 'NoToneMapping (Toon)' : 'ACESFilmicToneMapping');\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n merged.toneMappingExposure = renderConfig.toneMappingExposure;\n }\n });\n\n console.log('[MultiFXAdapter] Final merged render config:', merged);\n return merged;\n }\n\n /**\n * 应用到Three.js材质\n * 支持MeshPhongMaterial和MeshToonMaterial(MMD常用)\n */\n applyToMaterial(material: THREE.Material, target?: string): void {\n if (!(material instanceof THREE.MeshPhongMaterial || material instanceof THREE.MeshToonMaterial)) {\n console.warn('[MultiFXAdapter] Material type not supported:', material.type);\n return;\n }\n \n console.log('[MultiFXAdapter] Applying to material type:', material.type);\n\n const config = this.extractMergedMaterialConfig(target);\n \n // 🔍 调试:打印提取的配置\n console.log('[MultiFXAdapter] Extracted material config for target:', target);\n console.log(' - color:', config.color);\n console.log(' - emissive:', config.emissive);\n console.log(' - specular:', config.specular);\n console.log(' - shininess:', config.shininess);\n\n let applied = false;\n \n // 🎯 应用颜色(跳过纯黑色,避免覆盖原有材质)\n if (config.color) {\n const isBlack = config.color.r === 0 && config.color.g === 0 && config.color.b === 0;\n if (!isBlack) {\n material.color.copy(config.color);\n applied = true;\n } else {\n console.log('[MultiFXAdapter] Skipping black color (0,0,0) to preserve original material');\n }\n }\n \n // 🎯 应用发光颜色(跳过纯黑色)\n if (config.emissive && (material as any).emissive) {\n const isBlack = config.emissive.r === 0 && config.emissive.g === 0 && config.emissive.b === 0;\n if (!isBlack) {\n (material as any).emissive.copy(config.emissive);\n applied = true;\n }\n }\n \n // 应用高光(仅MeshPhongMaterial有specular)\n if (config.specular && (material as any).specular) {\n (material as any).specular.copy(config.specular);\n applied = true;\n console.log('[MultiFXAdapter] Applied specular');\n }\n \n // 应用光泽度(仅MeshPhongMaterial有shininess)\n if (config.shininess !== undefined && (material as any).shininess !== undefined) {\n (material as any).shininess = config.shininess;\n applied = true;\n console.log('[MultiFXAdapter] Applied shininess:', config.shininess);\n }\n \n if (config.opacity !== undefined) {\n material.opacity = config.opacity;\n applied = true;\n }\n \n if (config.transparent !== undefined) {\n material.transparent = config.transparent;\n applied = true;\n }\n\n if (applied) {\n console.log('[MultiFXAdapter] ✅ Material config applied to:', target || 'default');\n } else {\n console.warn('[MultiFXAdapter] ⚠️ No material config to apply (all values are undefined)');\n }\n }\n\n /**\n * 创建ShaderMaterial(如果配置了useShaderMaterial)\n * 返回第一个匹配target的ShaderMaterial,如果没有则返回null\n */\n createShaderMaterial(target?: string): THREE.ShaderMaterial | null {\n // 找到第一个启用了ShaderMaterial且匹配target的配置\n const shaderConfig = this.configs.find(config => {\n if (!config.useShaderMaterial) return false;\n \n // 检查target匹配\n if (!target || config.target === 'all') return true;\n if (Array.isArray(config.target)) return config.target.includes(target);\n return config.target === target;\n });\n\n if (!shaderConfig) {\n console.log('[MultiFXAdapter] No shader material config found for target: ' + (target));\n return null;\n }\n\n const adapter = this.adapters.get(shaderConfig.path);\n if (!adapter) {\n console.warn('[MultiFXAdapter] Adapter not found for: ' + (shaderConfig.path));\n return null;\n }\n\n const material = adapter.createShaderMaterial();\n if (material) {\n console.log('[MultiFXAdapter] ✅ Created ShaderMaterial for target: ' + (target) + ' from ' + (shaderConfig.description || shaderConfig.path));\n }\n\n return material;\n }\n\n /**\n * 应用到Three.js场景\n */\n applyToScene(scene: THREE.Scene, renderer: THREE.WebGLRenderer): void {\n const renderConfig = this.extractMergedRenderConfig();\n \n // 🔍 调试:打印渲染配置\n console.log('[MultiFXAdapter] Applying render config:');\n console.log(' - enableShadow:', renderConfig.enableShadow);\n console.log(' - shadowMapSize:', renderConfig.shadowMapSize);\n console.log(' - toneMapping:', renderConfig.toneMapping);\n console.log(' - ambientLightIntensity:', renderConfig.ambientLightIntensity);\n console.log(' - directionalLightIntensity:', renderConfig.directionalLightIntensity);\n\n // 配置阴影\n if (renderConfig.enableShadow !== undefined) {\n renderer.shadowMap.enabled = renderConfig.enableShadow;\n if (renderConfig.enableShadow) {\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n console.log('[MultiFXAdapter] ✅ Shadow config applied:', renderConfig.enableShadow);\n }\n\n // 配置色调映射\n if (renderConfig.toneMapping !== undefined) {\n renderer.toneMapping = renderConfig.toneMapping;\n const toneMappingName = renderConfig.toneMapping === THREE.NoToneMapping ? 'NoToneMapping' : 'ACESFilmicToneMapping';\n console.log('[MultiFXAdapter] ✅ ToneMapping applied:', toneMappingName);\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n renderer.toneMappingExposure = renderConfig.toneMappingExposure;\n }\n\n // 🎯 更新现有光源(不添加新光源)\n let ambientLight = scene.children.find(obj => obj instanceof THREE.AmbientLight) as THREE.AmbientLight;\n let directionalLight = scene.children.find(obj => obj instanceof THREE.DirectionalLight) as THREE.DirectionalLight;\n\n console.log('[MultiFXAdapter] Found lights in scene:', {\n ambientLight: !!ambientLight,\n directionalLight: !!directionalLight,\n });\n\n if (renderConfig.ambientLightIntensity !== undefined && ambientLight) {\n console.log('[MultiFXAdapter] Updating ambient light intensity:', renderConfig.ambientLightIntensity);\n ambientLight.intensity = renderConfig.ambientLightIntensity;\n }\n\n if (renderConfig.directionalLightIntensity !== undefined && directionalLight) {\n console.log('[MultiFXAdapter] Updating directional light intensity:', renderConfig.directionalLightIntensity);\n directionalLight.intensity = renderConfig.directionalLightIntensity;\n }\n\n if (renderConfig.lightDirection && directionalLight) {\n directionalLight.position.copy(renderConfig.lightDirection).multiplyScalar(10);\n console.log('[MultiFXAdapter] Updated light direction');\n }\n\n if (renderConfig.shadowMapSize && directionalLight?.shadow) {\n directionalLight.shadow.mapSize.width = renderConfig.shadowMapSize;\n directionalLight.shadow.mapSize.height = renderConfig.shadowMapSize;\n console.log('[MultiFXAdapter] Updated shadow map size:', renderConfig.shadowMapSize);\n }\n\n console.log('[MultiFXAdapter] ✅ Scene config applied');\n }\n\n /**\n * 获取所有已加载的FX效果\n */\n getLoadedEffects(): FXEffect[] {\n return Array.from(this.effects.values());\n }\n\n /**\n * 获取配置摘要\n */\n getSummary(): {\n totalFX: number;\n enabledFX: number;\n xFiles: number; // .x文件数量(场景级)\n fxFiles: number; // .fx文件数量(模型级)\n configs: Array<{\n path: string;\n type: EffectFileType;\n priority: number;\n target: string | string[];\n features: string[];\n description?: string;\n }>;\n } {\n const xCount = this.configs.filter(c => c.type === 'x').length;\n const fxCount = this.configs.filter(c => c.type === 'fx').length;\n \n return {\n totalFX: this.effects.size,\n enabledFX: this.configs.length,\n xFiles: xCount,\n fxFiles: fxCount,\n configs: this.configs.map(config => {\n const adapter = this.adapters.get(config.path);\n const summary = adapter?.getSummary();\n \n return {\n path: config.path,\n type: config.type ?? 'fx',\n priority: config.priority ?? 0,\n target: config.target ?? 'all',\n features: summary?.renderFeatures || [],\n description: config.description,\n };\n }),\n };\n }\n\n /**\n * 获取指定类型的配置\n */\n getConfigsByType(type: EffectFileType): FXFileConfig[] {\n return this.configs.filter(c => c.type === type);\n }\n\n /**\n * 获取场景级效果(.x文件)\n */\n getSceneEffects(): FXFileConfig[] {\n return this.getConfigsByType('x');\n }\n\n /**\n * 获取模型级效果(.fx文件)\n */\n getModelEffects(): FXFileConfig[] {\n return this.getConfigsByType('fx');\n }\n\n /**\n * 获取合并后的Uniforms\n */\n getMergedUniforms(target?: string): Record<string, { value: any }> {\n const merged: Record<string, { value: any }> = {};\n\n this.configs.forEach(config => {\n // 检查目标匹配\n if (target && config.target !== 'all') {\n if (Array.isArray(config.target)) {\n if (!config.target.includes(target)) return;\n } else if (config.target !== target) {\n return;\n }\n }\n\n const adapter = this.adapters.get(config.path);\n if (!adapter) return;\n\n const uniforms = adapter.getUniforms();\n Object.assign(merged, uniforms);\n });\n\n return merged;\n }\n\n /**\n * 分层应用到场景对象\n * @param scene Three.js场景\n * @param renderer Three.js渲染器\n * @param modelMeshes 模型网格数组(可选,用于精确控制)\n * @param stageMeshes 舞台网格数组(可选,用于精确控制)\n */\n applyLayered(\n scene: THREE.Scene, \n renderer: THREE.WebGLRenderer,\n modelMeshes?: THREE.Object3D[],\n stageMeshes?: THREE.Object3D[]\n ): void {\n console.log('[MultiFXAdapter] Applying layered effects...');\n \n // 第一层:应用.x文件到整个场景\n const sceneEffects = this.getSceneEffects();\n console.log('[MultiFXAdapter] Applying ' + (sceneEffects.length) + ' scene-level effects (.x files)');\n \n sceneEffects.forEach(config => {\n const adapter = this.adapters.get(config.path);\n if (adapter) {\n console.log('[MultiFXAdapter] - Applying: ' + (config.description || config.path));\n \n // 应用渲染器配置(不添加光源)\n const renderConfig = adapter.extractRenderConfig();\n if (renderConfig.toneMapping !== undefined) {\n renderer.toneMapping = renderConfig.toneMapping;\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n renderer.toneMappingExposure = renderConfig.toneMappingExposure;\n }\n if (renderConfig.enableShadow !== undefined) {\n renderer.shadowMap.enabled = renderConfig.enableShadow;\n }\n \n // .x文件应用到所有对象\n scene.traverse(obj => {\n if (obj instanceof THREE.Mesh && obj.material instanceof THREE.MeshPhongMaterial) {\n this.applyToMaterial(obj.material, 'scene');\n }\n });\n }\n });\n \n // 第二层:应用.fx文件到模型\n const modelEffects = this.getModelEffects();\n console.log('[MultiFXAdapter] Applying ' + (modelEffects.length) + ' model-level effects (.fx files)');\n \n modelEffects.forEach(config => {\n console.log('[MultiFXAdapter] - Applying: ' + (config.description || config.path));\n \n // 如果提供了具体的模型网格列表\n if (modelMeshes) {\n modelMeshes.forEach(mesh => {\n if (mesh instanceof THREE.Mesh && mesh.material instanceof THREE.MeshPhongMaterial) {\n this.applyToMaterial(mesh.material, 'model');\n }\n mesh.traverse(obj => {\n if (obj instanceof THREE.Mesh && obj.material instanceof THREE.MeshPhongMaterial) {\n this.applyToMaterial(obj.material, 'model');\n }\n });\n });\n } else {\n // 否则根据target配置应用\n const targetStr = typeof config.target === 'string' ? config.target : 'model';\n scene.traverse(obj => {\n if (obj instanceof THREE.Mesh && obj.material instanceof THREE.MeshPhongMaterial) {\n // 简单的启发式判断:有骨骼的是模型\n const isModel = (obj as any).isSkinnedMesh || (obj as any).skeleton;\n if ((targetStr === 'model' && isModel) || targetStr === 'all') {\n this.applyToMaterial(obj.material, targetStr);\n }\n }\n });\n }\n });\n \n console.log('[MultiFXAdapter] Layered effects applied successfully');\n }\n\n /**\n * 打印当前配置(调试用)\n */\n printConfig(): void {\n console.log('\\n[MultiFXAdapter] Current Configuration:');\n console.log('═'.repeat(60));\n \n const summary = this.getSummary();\n console.log('Total Effects: ' + (summary.totalFX));\n console.log(' - Scene-level (.x): ' + (summary.xFiles));\n console.log(' - Model-level (.fx): ' + (summary.fxFiles));\n console.log('\\nLoad Order (by priority):');\n \n summary.configs.forEach((config, index) => {\n const icon = config.type === 'x' ? '🌍' : '🎨';\n console.log((index + 1) + '. ' + (icon) + ' [' + (config.type.toUpperCase()) + '] ' + (config.description || config.path));\n console.log(' Priority: ' + (config.priority) + ', Target: ' + (config.target));\n if (config.features.length > 0) {\n console.log(' Features: ' + (config.features.join(', ')));\n }\n });\n \n console.log('═'.repeat(60) + '\\n');\n }\n}\n\n","/**\n * FX解析器工具函数\n */\n\nimport type { FXEffect, FXDefine, FXParameter, FXTexture } from './types';\n\n/**\n * 将FX效果导出为JSON\n */\nexport function exportFXToJSON(effect: FXEffect): string {\n return JSON.stringify(effect, null, 2);\n}\n\n/**\n * 将FX效果导出为Markdown文档\n */\nexport function exportFXToMarkdown(effect: FXEffect): string {\n const lines: string[] = [];\n\n lines.push('# ' + (effect.fileName));\n lines.push('');\n\n // 宏定义\n if (effect.defines.length > 0) {\n lines.push('## 宏定义 (Defines)');\n lines.push('');\n lines.push('| 名称 | 值 | 状态 | 说明 |');\n lines.push('|------|-----|------|------|');\n effect.defines.forEach(d => {\n const status = d.isCommented ? '禁用' : '启用';\n lines.push('| ' + (d.name) + ' | ' + (d.value || '-') + ' | ' + (status) + ' | ' + (d.comment || '-') + ' |');\n });\n lines.push('');\n }\n\n // 纹理\n if (effect.textures.length > 0) {\n lines.push('## 纹理 (Textures)');\n lines.push('');\n lines.push('| 名称 | 路径 | 尺寸 | 用途 |');\n lines.push('|------|------|------|------|');\n effect.textures.forEach(t => {\n const size = t.width && t.height ? (t.width) + 'x' + (t.height) : '-';\n lines.push('| ' + (t.name) + ' | ' + (t.path) + ' | ' + (size) + ' | ' + (t.purpose || '-') + ' |');\n });\n lines.push('');\n }\n\n // 参数\n if (effect.parameters.length > 0) {\n lines.push('## 参数 (Parameters)');\n lines.push('');\n lines.push('| 名称 | 类型 | 语义 | 默认值 |');\n lines.push('|------|------|------|--------|');\n effect.parameters.forEach(p => {\n lines.push('| ' + (p.name) + ' | ' + (p.type) + ' | ' + (p.semantic || '-') + ' | ' + (p.defaultValue || '-') + ' |');\n });\n lines.push('');\n }\n\n // 控制器\n if (effect.controllers.length > 0) {\n lines.push('## 控制器 (Controllers)');\n lines.push('');\n lines.push('| 参数 | 对象名 | 控制项 |');\n lines.push('|------|--------|--------|');\n effect.controllers.forEach(c => {\n lines.push('| ' + (c.name) + ' | ' + (c.objectName) + ' | ' + (c.itemName) + ' |');\n });\n lines.push('');\n }\n\n // 包含文件\n if (effect.includes.length > 0) {\n lines.push('## 包含文件 (Includes)');\n lines.push('');\n effect.includes.forEach(inc => {\n lines.push('- ' + (inc));\n });\n lines.push('');\n }\n\n // Techniques\n if (effect.techniques.length > 0) {\n lines.push('## 技术 (Techniques)');\n lines.push('');\n effect.techniques.forEach(t => {\n lines.push('### ' + (t.name));\n lines.push('');\n t.passes.forEach((p, idx) => {\n lines.push('#### Pass ' + (p.name || idx + 1));\n if (p.vertexShader) {\n lines.push('- **顶点着色器**: ' + (p.vertexShader.function) + ' (' + (p.vertexShader.profile) + ')');\n }\n if (p.pixelShader) {\n lines.push('- **像素着色器**: ' + (p.pixelShader.function) + ' (' + (p.pixelShader.profile) + ')');\n }\n lines.push('');\n });\n });\n }\n\n return lines.join('\\n');\n}\n\n/**\n * 比较两个FX文件的差异\n */\nexport function compareFXEffects(effect1: FXEffect, effect2: FXEffect) {\n const diff = {\n addedDefines: [] as string[],\n removedDefines: [] as string[],\n changedDefines: [] as { name: string; oldValue?: string; newValue?: string }[],\n addedTextures: [] as string[],\n removedTextures: [] as string[],\n addedParameters: [] as string[],\n removedParameters: [] as string[],\n };\n\n // 比较宏定义\n const defines1Map = new Map(effect1.defines.map(d => [d.name, d]));\n const defines2Map = new Map(effect2.defines.map(d => [d.name, d]));\n\n defines2Map.forEach((define, name) => {\n if (!defines1Map.has(name)) {\n diff.addedDefines.push(name);\n } else {\n const oldDefine = defines1Map.get(name)!;\n if (oldDefine.value !== define.value || oldDefine.isCommented !== define.isCommented) {\n diff.changedDefines.push({\n name,\n oldValue: oldDefine.value,\n newValue: define.value,\n });\n }\n }\n });\n\n defines1Map.forEach((define, name) => {\n if (!defines2Map.has(name)) {\n diff.removedDefines.push(name);\n }\n });\n\n // 比较纹理\n const textures1Set = new Set(effect1.textures.map(t => t.name));\n const textures2Set = new Set(effect2.textures.map(t => t.name));\n\n textures2Set.forEach(name => {\n if (!textures1Set.has(name)) {\n diff.addedTextures.push(name);\n }\n });\n\n textures1Set.forEach(name => {\n if (!textures2Set.has(name)) {\n diff.removedTextures.push(name);\n }\n });\n\n // 比较参数\n const params1Set = new Set(effect1.parameters.map(p => p.name));\n const params2Set = new Set(effect2.parameters.map(p => p.name));\n\n params2Set.forEach(name => {\n if (!params1Set.has(name)) {\n diff.addedParameters.push(name);\n }\n });\n\n params1Set.forEach(name => {\n if (!params2Set.has(name)) {\n diff.removedParameters.push(name);\n }\n });\n\n return diff;\n}\n\n/**\n * 过滤特定类型的宏定义\n */\nexport function filterDefinesByPrefix(defines: FXDefine[], prefix: string): FXDefine[] {\n return defines.filter(d => d.name.startsWith(prefix));\n}\n\n/**\n * 获取所有纹理宏定义\n */\nexport function getTextureDefines(defines: FXDefine[]): FXDefine[] {\n return filterDefinesByPrefix(defines, 'BLEND');\n}\n\n/**\n * 获取所有功能标志\n */\nexport function getFeatureFlags(defines: FXDefine[]): FXDefine[] {\n return defines.filter(d => \n d.name.startsWith('USE_') || \n d.name.includes('FLAG') ||\n d.name === 'HANDLE_EDGE' ||\n d.name === 'MODEL_TOON'\n );\n}\n\n/**\n * 获取所有颜色相关的参数\n */\nexport function getColorParameters(parameters: FXParameter[]): FXParameter[] {\n return parameters.filter(p => \n p.name.toLowerCase().includes('color') ||\n p.name.toLowerCase().includes('rgb') ||\n p.name.toLowerCase().includes('hsv') ||\n p.type === 'float3' || \n p.type === 'float4'\n );\n}\n\n/**\n * 检查是否包含特定功能\n */\nexport function hasFeature(effect: FXEffect, featureName: string): boolean {\n return effect.defines.some(d => \n d.name === featureName && !d.isCommented\n );\n}\n\n/**\n * 获取配置摘要文本\n */\nexport function getConfigSummaryText(effect: FXEffect): string {\n const features: string[] = [];\n\n if (hasFeature(effect, 'USE_LOCALSHADOW')) {\n features.push('LocalShadow');\n }\n if (hasFeature(effect, 'USE_EXCELLENTSHADOW')) {\n features.push('ExcellentShadow');\n }\n if (hasFeature(effect, 'USE_HGSHADOW')) {\n features.push('HgShadow');\n }\n if (hasFeature(effect, 'HANDLE_EDGE')) {\n features.push('HandleEdge');\n }\n if (hasFeature(effect, 'MODEL_TOON')) {\n features.push('ModelToon');\n }\n if (hasFeature(effect, 'USE_ROUNDNORMAL')) {\n features.push('RoundNormal');\n }\n\n return features.length > 0 \n ? '启用功能: ' + (features.join(', ')) \n : '无特殊功能启用';\n}\n\n/**\n * 提取纹理文件路径列表(用于预加载)\n */\nexport function extractTexturePaths(effect: FXEffect): string[] {\n return effect.textures.map(t => t.path);\n}\n\n/**\n * 验证FX文件的完整性\n */\nexport function validateFXEffect(effect: FXEffect): {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // 检查必需的includes\n if (effect.includes.length === 0) {\n warnings.push('没有找到include指令');\n }\n\n // 检查纹理路径是否存在\n effect.textures.forEach(texture => {\n if (!texture.path || texture.path === '') {\n errors.push('纹理 ' + (texture.name) + ' 缺少路径');\n }\n });\n\n // 检查参数的默认值\n effect.parameters.forEach(param => {\n if (param.type.includes('float') && param.defaultValue) {\n const floatRegex = /^float[234]?\\s*\\(/;\n if (!floatRegex.test(param.defaultValue) && isNaN(parseFloat(param.defaultValue))) {\n warnings.push('参数 ' + (param.name) + ' 的默认值可能不合法: ' + (param.defaultValue));\n }\n }\n });\n\n // 检查techniques\n if (effect.techniques.length === 0 && effect.includes.length === 0) {\n warnings.push('没有找到Technique定义,也没有include文件');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n\n\n\n\n\n","/**\n * FX文件查看器组件\n * 用于可视化展示FX文件的解析结果\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { FXParser } from '../FXParser';\nimport type { FXEffect, FXSummary } from '../types';\nimport { getConfigSummaryText, validateFXEffect } from '../utils';\nimport { clsx } from 'clsx';\n\nexport interface FXViewerProps {\n /** FX文件URL或内容 */\n source: string;\n /** 是否是文件内容(true)还是URL(false) */\n isContent?: boolean;\n /** 文件名 */\n fileName?: string;\n /** 解析完成回调 */\n onParsed?: (effect: FXEffect) => void;\n /** 错误回调 */\n onError?: (error: Error) => void;\n /** 自定义样式 */\n className?: string;\n}\n\nexport const FXViewer: React.FC<FXViewerProps> = ({\n source,\n isContent = false,\n fileName = 'effect.fx',\n onParsed,\n onError,\n className = '',\n}) => {\n const [effect, setEffect] = useState<FXEffect | null>(null);\n const [summary, setSummary] = useState<FXSummary | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<'summary' | 'defines' | 'textures' | 'parameters' | 'validation'>('summary');\n\n useEffect(() => {\n const parse = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const parser = new FXParser();\n let parsedEffect: FXEffect;\n\n if (isContent) {\n parsedEffect = parser.parse(source, fileName);\n } else {\n parsedEffect = await parser.loadAndParse(source);\n }\n\n setEffect(parsedEffect);\n setSummary(parser.generateSummary(parsedEffect));\n onParsed?.(parsedEffect);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '解析失败';\n setError(errorMsg);\n onError?.(err instanceof Error ? err : new Error(errorMsg));\n } finally {\n setLoading(false);\n }\n };\n\n parse();\n }, [source, isContent, fileName, onParsed, onError]);\n\n if (loading) {\n return (\n <div className={clsx('font-sans bg-white border border-gray-300 rounded-lg overflow-hidden p-8 text-center', className)}>\n <div className=\"text-xl text-gray-600\">加载中...</div>\n </div>\n );\n }\n\n if (error || !effect || !summary) {\n return (\n <div className={clsx('font-sans bg-white border border-gray-300 rounded-lg overflow-hidden p-8 text-center', className)}>\n <div className=\"text-red-700\">\n <h3 className=\"m-0 mb-4 text-2xl\">❌ 解析错误</h3>\n <p>{error || '未知错误'}</p>\n </div>\n </div>\n );\n }\n\n const validation = validateFXEffect(effect);\n\n return (\n <div className={clsx('font-sans bg-white border border-gray-300 rounded-lg overflow-hidden', className)}>\n <div className=\"p-4 md:p-6 bg-gradient-to-br from-indigo-500 to-purple-600 text-white\">\n <h2 className=\"m-0 mb-2 text-xl md:text-2xl font-semibold\">{effect.fileName}</h2>\n <p className=\"m-0 text-sm opacity-90\">{getConfigSummaryText(effect)}</p>\n </div>\n\n <div className=\"flex bg-gray-100 border-b border-gray-300 overflow-x-auto\">\n <button\n className={clsx('flex-1 min-w-[80px] md:min-w-[100px] px-3 md:px-4 py-2 md:py-3 border-none bg-transparent text-gray-600 text-xs md:text-sm cursor-pointer transition-all border-b-2', activeTab === 'summary'\n ? 'bg-white text-indigo-500 border-b-indigo-500 font-semibold'\n : 'border-b-transparent hover:bg-gray-200 hover:text-gray-800')}\n onClick={() => setActiveTab('summary')}\n >\n 摘要\n </button>\n <button\n className={clsx('flex-1 min-w-[80px] md:min-w-[100px] px-3 md:px-4 py-2 md:py-3 border-none bg-transparent text-gray-600 text-xs md:text-sm cursor-pointer transition-all border-b-2', activeTab === 'defines'\n ? 'bg-white text-indigo-500 border-b-indigo-500 font-semibold'\n : 'border-b-transparent hover:bg-gray-200 hover:text-gray-800')}\n onClick={() => setActiveTab('defines')}\n >\n 宏定义 ({summary.defineCount})\n </button>\n <button\n className={clsx('flex-1 min-w-[80px] md:min-w-[100px] px-3 md:px-4 py-2 md:py-3 border-none bg-transparent text-gray-600 text-xs md:text-sm cursor-pointer transition-all border-b-2', activeTab === 'textures'\n ? 'bg-white text-indigo-500 border-b-indigo-500 font-semibold'\n : 'border-b-transparent hover:bg-gray-200 hover:text-gray-800')}\n onClick={() => setActiveTab('textures')}\n >\n 纹理 ({summary.textureCount})\n </button>\n <button\n className={clsx('flex-1 min-w-[80px] md:min-w-[100px] px-3 md:px-4 py-2 md:py-3 border-none bg-transparent text-gray-600 text-xs md:text-sm cursor-pointer transition-all border-b-2', activeTab === 'parameters'\n ? 'bg-white text-indigo-500 border-b-indigo-500 font-semibold'\n : 'border-b-transparent hover:bg-gray-200 hover:text-gray-800')}\n onClick={() => setActiveTab('parameters')}\n >\n 参数 ({summary.parameterCount})\n </button>\n <button\n className={clsx('flex-1 min-w-[80px] md:min-w-[100px] px-3 md:px-4 py-2 md:py-3 border-none bg-transparent text-gray-600 text-xs md:text-sm cursor-pointer transition-all border-b-2', activeTab === 'validation'\n ? 'bg-white text-indigo-500 border-b-indigo-500 font-semibold'\n : 'border-b-transparent hover:bg-gray-200 hover:text-gray-800')}\n onClick={() => setActiveTab('validation')}\n >\n 验证\n </button>\n </div>\n\n <div className=\"p-4 md:p-6 max-h-[500px] md:max-h-[600px] overflow-y-auto\">\n {activeTab === 'summary' && (\n <SummaryTab summary={summary} effect={effect} />\n )}\n {activeTab === 'defines' && (\n <DefinesTab effect={effect} />\n )}\n {activeTab === 'textures' && (\n <TexturesTab effect={effect} />\n )}\n {activeTab === 'parameters' && (\n <ParametersTab effect={effect} />\n )}\n {activeTab === 'validation' && (\n <ValidationTab validation={validation} />\n )}\n </div>\n </div>\n );\n};\n\nconst SummaryTab: React.FC<{ summary: FXSummary; effect: FXEffect }> = ({ summary, effect }) => (\n <div>\n <div className=\"grid grid-cols-2 md:grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-4 mb-8\">\n <div className=\"p-6 bg-gradient-to-br from-gray-100 to-blue-100 rounded-lg text-center\">\n <div className=\"text-xs text-gray-600 mb-2 uppercase tracking-wide\">宏定义</div>\n <div className=\"text-3xl font-bold text-gray-800\">{summary.defineCount}</div>\n </div>\n <div className=\"p-6 bg-gradient-to-br from-gray-100 to-blue-100 rounded-lg text-center\">\n <div className=\"text-xs text-gray-600 mb-2 uppercase tracking-wide\">参数</div>\n <div className=\"text-3xl font-bold text-gray-800\">{summary.parameterCount}</div>\n </div>\n <div className=\"p-6 bg-gradient-to-br from-gray-100 to-blue-100 rounded-lg text-center\">\n <div className=\"text-xs text-gray-600 mb-2 uppercase tracking-wide\">纹理</div>\n <div className=\"text-3xl font-bold text-gray-800\">{summary.textureCount}</div>\n </div>\n <div className=\"p-6 bg-gradient-to-br from-gray-100 to-blue-100 rounded-lg text-center\">\n <div className=\"text-xs text-gray-600 mb-2 uppercase tracking-wide\">Technique</div>\n <div className=\"text-3xl font-bold text-gray-800\">{summary.techniqueCount}</div>\n </div>\n </div>\n\n <div className=\"mt-8\">\n <h3 className=\"text-lg m-0 mb-4 text-gray-800 border-b-2 border-indigo-500 pb-2\">功能特性</h3>\n <div className=\"flex flex-wrap gap-3\">\n <div className={clsx('px-4 py-2 rounded-full text-sm font-medium', summary.hasLocalShadow ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800')}>\n {summary.hasLocalShadow ? '✓' : '✗'} LocalShadow\n </div>\n <div className={clsx('px-4 py-2 rounded-full text-sm font-medium', summary.hasExcellentShadow ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800')}>\n {summary.hasExcellentShadow ? '✓' : '✗'} ExcellentShadow\n </div>\n <div className={clsx('px-4 py-2 rounded-full text-sm font-medium', summary.hasHgShadow ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800')}>\n {summary.hasHgShadow ? '✓' : '✗'} HgShadow\n </div>\n </div>\n </div>\n\n {effect.includes.length > 0 && (\n <div className=\"mt-8\">\n <h3 className=\"text-lg m-0 mb-4 text-gray-800 border-b-2 border-indigo-500 pb-2\">包含文件</h3>\n <ul className=\"list-none p-0 m-0\">\n {effect.includes.map((inc, idx) => (\n <li key={idx} className=\"py-2 border-b border-gray-200 last:border-b-0\">\n <code className=\"bg-gray-100 px-2 py-1 rounded text-xs font-mono\">{inc}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {effect.controllers.length > 0 && (\n <div className=\"mt-8\">\n <h3 className=\"text-lg m-0 mb-4 text-gray-800 border-b-2 border-indigo-500 pb-2\">控制器</h3>\n <ul className=\"list-none p-0 m-0\">\n {effect.controllers.map((ctrl, idx) => (\n <li key={idx} className=\"py-2 border-b border-gray-200 last:border-b-0\">\n <strong>{ctrl.name}</strong>: {ctrl.objectName} / {ctrl.itemName}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n);\n\nconst DefinesTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div>\n <table className=\"w-full border-collapse text-xs md:text-sm\">\n <thead className=\"bg-gray-100 border-b-2 border-gray-300\">\n <tr>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">名称</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">值</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">状态</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.defines.map((define, idx) => (\n <tr key={idx} className={clsx('hover:bg-gray-50', define.isCommented ? 'opacity-50' : '')}>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n <code className=\"bg-gray-100 px-2 py-1 rounded text-xs font-mono\">{define.name}</code>\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{define.value || '-'}</td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n <span className={clsx('inline-block px-3 py-1 rounded-xl text-xs font-medium', define.isCommented ? 'bg-red-100 text-red-800' : 'bg-green-100 text-green-800')}>\n {define.isCommented ? '禁用' : '启用'}\n </span>\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{define.lineNumber}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst TexturesTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div>\n {effect.textures.length === 0 ? (\n <p className=\"text-center text-gray-500 py-8 italic\">未找到纹理定义</p>\n ) : (\n <table className=\"w-full border-collapse text-xs md:text-sm\">\n <thead className=\"bg-gray-100 border-b-2 border-gray-300\">\n <tr>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">名称</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">路径</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">尺寸</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">用途</th>\n </tr>\n </thead>\n <tbody>\n {effect.textures.map((texture, idx) => (\n <tr key={idx} className=\"hover:bg-gray-50\">\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n <code className=\"bg-gray-100 px-2 py-1 rounded text-xs font-mono\">{texture.name}</code>\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{texture.path}</td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n {texture.width && texture.height ? (texture.width) + '×' + (texture.height) : '-'}\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{texture.purpose || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n);\n\nconst ParametersTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div>\n <table className=\"w-full border-collapse text-xs md:text-sm\">\n <thead className=\"bg-gray-100 border-b-2 border-gray-300\">\n <tr>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">名称</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">类型</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">语义</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">默认值</th>\n <th className=\"px-2 md:px-3 py-2 md:py-3 text-left font-semibold text-gray-800\">行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.parameters.map((param, idx) => (\n <tr key={idx} className=\"hover:bg-gray-50\">\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n <code className=\"bg-gray-100 px-2 py-1 rounded text-xs font-mono\">{param.name}</code>\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">\n <code className=\"bg-gray-100 px-2 py-1 rounded text-xs font-mono\">{param.type}</code>\n </td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{param.semantic || '-'}</td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{param.defaultValue || '-'}</td>\n <td className=\"px-2 md:px-3 py-2 md:py-3 border-b border-gray-200\">{param.lineNumber}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst ValidationTab: React.FC<{ validation: ReturnType<typeof validateFXEffect> }> = ({ validation }) => (\n <div>\n <div className={clsx('p-6 rounded-lg mb-6 text-center', validation.isValid ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800')}>\n <h3 className=\"m-0 text-xl\">{validation.isValid ? '✓ 验证通过' : '✗ 验证失败'}</h3>\n </div>\n\n {validation.errors.length > 0 && (\n <div className=\"mb-6\">\n <h4 className=\"m-0 mb-3 text-base text-gray-800\">错误 ({validation.errors.length})</h4>\n <ul className=\"list-none p-0 m-0\">\n {validation.errors.map((error, idx) => (\n <li key={idx} className=\"p-3 mb-2 bg-red-100 text-red-800 rounded border-l-4 border-red-800\">\n {error}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.warnings.length > 0 && (\n <div className=\"mb-6\">\n <h4 className=\"m-0 mb-3 text-base text-gray-800\">警告 ({validation.warnings.length})</h4>\n <ul className=\"list-none p-0 m-0\">\n {validation.warnings.map((warning, idx) => (\n <li key={idx} className=\"p-3 mb-2 bg-orange-100 text-orange-700 rounded border-l-4 border-orange-700\">\n {warning}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.isValid && validation.warnings.length === 0 && (\n <p className=\"text-center text-green-800 py-8 text-lg\">FX文件结构完整,没有发现问题。</p>\n )}\n </div>\n);\n\nFXViewer.displayName = 'FXViewer';\n\n\n","/**\n * FX效果Three.js预览组件\n * 展示如何将FX解析结果应用到Three.js渲染中\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three-stdlib';\nimport { FXToThreeAdapter } from '../FXToThreeAdapter';\nimport type { FXEffect } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface FXThreePreviewProps {\n /** FX效果 */\n effect: FXEffect;\n /** 纹理基础路径 */\n texturePath?: string;\n /** 预览对象类型 */\n objectType?: 'sphere' | 'box' | 'torus' | 'plane';\n /** 自定义样式 */\n className?: string;\n /** 是否显示信息面板 */\n showInfo?: boolean;\n}\n\nexport const FXThreePreview: React.FC<FXThreePreviewProps> = ({\n effect,\n texturePath = '',\n objectType = 'sphere',\n className = '',\n showInfo = true,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<THREE.Scene | null>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const animationIdRef = useRef<number | null>(null);\n const meshRef = useRef<THREE.Mesh | null>(null);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [adapterInfo, setAdapterInfo] = useState<{\n materialParams: string[];\n textures: string[];\n renderFeatures: string[];\n } | null>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n const init = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const container = containerRef.current!;\n const width = container.clientWidth || 600;\n const height = container.clientHeight || 400;\n\n // 创建场景\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0x1a1a2e);\n sceneRef.current = scene;\n\n // 创建相机\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000);\n camera.position.set(0, 2, 5);\n cameraRef.current = camera;\n\n // 创建渲染器\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setSize(width, height);\n renderer.setPixelRatio(window.devicePixelRatio);\n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 创建控制器\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.dampingFactor = 0.05;\n controlsRef.current = controls;\n\n // 创建适配器\n const adapter = new FXToThreeAdapter(effect, texturePath);\n\n // 加载纹理\n console.log('Loading textures...');\n await adapter.loadTextures();\n\n // 配置场景(添加光源等)\n adapter.configureScene(scene, renderer);\n\n // 创建几何体\n let geometry: THREE.BufferGeometry;\n switch (objectType) {\n case 'box':\n geometry = new THREE.BoxGeometry(2, 2, 2);\n break;\n case 'torus':\n geometry = new THREE.TorusGeometry(1, 0.4, 16, 100);\n break;\n case 'plane':\n geometry = new THREE.PlaneGeometry(3, 3);\n break;\n default:\n geometry = new THREE.SphereGeometry(1.5, 32, 32);\n }\n\n // 创建材质\n const material = adapter.createMaterial();\n \n // 创建网格\n const mesh = new THREE.Mesh(geometry, material);\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n scene.add(mesh);\n meshRef.current = mesh;\n\n // 添加地面(用于阴影)\n const renderConfig = adapter.extractRenderConfig();\n if (renderConfig.enableShadow) {\n const groundGeometry = new THREE.PlaneGeometry(10, 10);\n const groundMaterial = new THREE.MeshStandardMaterial({ color: 0x2a2a3e });\n const ground = new THREE.Mesh(groundGeometry, groundMaterial);\n ground.rotation.x = -Math.PI / 2;\n ground.position.y = -2;\n ground.receiveShadow = true;\n scene.add(ground);\n }\n\n // 获取适配器信息\n setAdapterInfo(adapter.getSummary());\n\n // 渲染循环\n const animate = () => {\n animationIdRef.current = requestAnimationFrame(animate);\n\n if (meshRef.current) {\n meshRef.current.rotation.y += 0.005;\n }\n\n if (controlsRef.current) {\n controlsRef.current.update();\n }\n\n if (rendererRef.current && sceneRef.current && cameraRef.current) {\n rendererRef.current.render(sceneRef.current, cameraRef.current);\n }\n };\n\n animate();\n setLoading(false);\n\n } catch (err) {\n console.error('FX Preview initialization error:', err);\n setError(err instanceof Error ? err.message : '初始化失败');\n setLoading(false);\n }\n };\n\n init();\n\n // 清理\n return () => {\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n }\n\n if (rendererRef.current) {\n rendererRef.current.dispose();\n if (containerRef.current && rendererRef.current.domElement) {\n containerRef.current.removeChild(rendererRef.current.domElement);\n }\n }\n\n if (sceneRef.current) {\n sceneRef.current.traverse((obj) => {\n if (obj instanceof THREE.Mesh) {\n obj.geometry?.dispose();\n if (obj.material) {\n if (Array.isArray(obj.material)) {\n obj.material.forEach(m => m.dispose());\n } else {\n obj.material.dispose();\n }\n }\n }\n });\n }\n };\n }, [effect, texturePath, objectType]);\n\n if (loading) {\n return (\n <div className={clsx('fx-three-preview loading', className)}>\n <div className=\"preview-loading\">加载中...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={clsx('fx-three-preview error', className)}>\n <div className=\"preview-error\">\n <h3>❌ 渲染失败</h3>\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={clsx('fx-three-preview', className)}>\n <div \n ref={containerRef} \n className=\"preview-container\"\n style={{\n width: '100%',\n height: '100%',\n minHeight: '400px',\n position: 'relative',\n }}\n />\n \n {showInfo && adapterInfo && (\n <div className=\"preview-info\">\n <div className=\"info-section\">\n <h4>🎨 应用的FX参数</h4>\n <div className=\"info-badges\">\n <span className=\"badge\">{adapterInfo.materialParams.length} 个材质参数</span>\n <span className=\"badge\">{adapterInfo.textures.length} 个纹理</span>\n <span className=\"badge\">{adapterInfo.renderFeatures.length} 个渲染特性</span>\n </div>\n </div>\n\n {adapterInfo.renderFeatures.length > 0 && (\n <div className=\"info-section\">\n <h5>启用的特性:</h5>\n <div className=\"feature-list\">\n {adapterInfo.renderFeatures.map((feature, idx) => (\n <span key={idx} className=\"feature-tag\">{feature}</span>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n <style>{`\n .fx-three-preview {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .fx-three-preview.loading,\n .fx-three-preview.error {\n min-height: 400px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f5f5f5;\n border-radius: 8px;\n }\n\n .preview-loading {\n font-size: 1.1rem;\n color: #666;\n }\n\n .preview-error {\n text-align: center;\n color: #d32f2f;\n padding: 2rem;\n }\n\n .preview-error h3 {\n margin: 0 0 1rem;\n }\n\n .preview-container {\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n\n .preview-info {\n background: white;\n border-radius: 8px;\n padding: 1.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .info-section {\n margin-bottom: 1rem;\n }\n\n .info-section:last-child {\n margin-bottom: 0;\n }\n\n .info-section h4 {\n margin: 0 0 0.75rem;\n font-size: 1rem;\n color: #333;\n }\n\n .info-section h5 {\n margin: 0 0 0.5rem;\n font-size: 0.9rem;\n color: #666;\n }\n\n .info-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .badge {\n display: inline-block;\n padding: 0.4rem 0.8rem;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-radius: 16px;\n font-size: 0.85rem;\n font-weight: 500;\n }\n\n .feature-list {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .feature-tag {\n display: inline-block;\n padding: 0.3rem 0.7rem;\n background: #e8f5e9;\n color: #2e7d32;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 500;\n }\n `}</style>\n </div>\n );\n};\n\nFXThreePreview.displayName = 'FXThreePreview';\n\n"]}
|