sa2kit 1.6.78 → 1.6.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/llm/electron/index.js +2 -2
- package/dist/ai/llm/electron/index.js.map +1 -1
- package/dist/ai/llm/electron/index.mjs +2 -2
- package/dist/ai/llm/electron/index.mjs.map +1 -1
- package/dist/ai/llm/ui/electron/index.js +2 -2
- package/dist/ai/llm/ui/electron/index.js.map +1 -1
- package/dist/ai/llm/ui/electron/index.mjs +2 -2
- package/dist/ai/llm/ui/electron/index.mjs.map +1 -1
- package/dist/ai/llm/ui/web/index.js +2 -2
- package/dist/ai/llm/ui/web/index.js.map +1 -1
- package/dist/ai/llm/ui/web/index.mjs +2 -2
- package/dist/ai/llm/ui/web/index.mjs.map +1 -1
- package/dist/ai/llm/web/index.js +2 -2
- package/dist/ai/llm/web/index.js.map +1 -1
- package/dist/ai/llm/web/index.mjs +2 -2
- package/dist/ai/llm/web/index.mjs.map +1 -1
- package/dist/ar/index.d.mts +2 -2
- package/dist/ar/index.d.ts +2 -2
- package/dist/ar/index.js +43 -4
- package/dist/ar/index.js.map +1 -1
- package/dist/ar/index.mjs +43 -4
- package/dist/ar/index.mjs.map +1 -1
- package/dist/{booking-BX_0AXU6.d.mts → booking-473Db8Bo.d.mts} +6 -0
- package/dist/{booking-BX_0AXU6.d.ts → booking-473Db8Bo.d.ts} +6 -0
- package/dist/{bookingAdminService-ChzuoCUx.d.ts → bookingAdminService-DqQ7hEGw.d.ts} +1 -1
- package/dist/{bookingAdminService-B_D_Jq1W.d.mts → bookingAdminService-SBX4JA_U.d.mts} +1 -1
- package/dist/calendar/index.js +8 -4
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +8 -4
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/web/index.js +8 -4
- package/dist/calendar/web/index.js.map +1 -1
- package/dist/calendar/web/index.mjs +8 -4
- package/dist/calendar/web/index.mjs.map +1 -1
- package/dist/{client-B6JtOkEq.d.ts → client-Bkn6mRI7.d.ts} +1 -1
- package/dist/{client-DkSveTk-.d.mts → client-exYn2Qla.d.mts} +1 -1
- package/dist/components/index.d.mts +2 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +8 -4
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +8 -4
- package/dist/components/index.mjs.map +1 -1
- package/dist/{index-B9vIHUEv.d.ts → index-BJpxvH7X.d.ts} +1 -1
- package/dist/{index-C3_UPPdv.d.ts → index-CdTIsNsy.d.ts} +2 -2
- package/dist/{index-DDuTPOHu.d.mts → index-Cum2EknK.d.mts} +1 -1
- package/dist/{index-D6ZIkvt-.d.mts → index-DyxLpkmm.d.mts} +2 -2
- package/dist/{index-BjYZSfZa.d.ts → index-XTV6IU-M.d.ts} +2 -2
- package/dist/{index-3qQN9Lh_.d.mts → index-z15F7afa.d.mts} +2 -2
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/index.d.mts +9 -3
- package/dist/mmd/index.d.ts +9 -3
- package/dist/mmd/index.js +95 -13
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +95 -13
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/portfolio/index.js +2 -2
- package/dist/portfolio/index.js.map +1 -1
- package/dist/portfolio/index.mjs +2 -2
- package/dist/portfolio/index.mjs.map +1 -1
- package/dist/showmasterpiece/core.d.mts +3 -3
- package/dist/showmasterpiece/core.d.ts +3 -3
- package/dist/showmasterpiece/db.d.mts +25 -0
- package/dist/showmasterpiece/db.d.ts +25 -0
- package/dist/showmasterpiece/db.js +35 -0
- package/dist/showmasterpiece/db.js.map +1 -1
- package/dist/showmasterpiece/db.mjs +35 -0
- package/dist/showmasterpiece/db.mjs.map +1 -1
- package/dist/showmasterpiece/index.js +279 -226
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +279 -226
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +2 -2
- package/dist/showmasterpiece/logic/index.d.ts +2 -2
- package/dist/showmasterpiece/server/index.js +35 -0
- package/dist/showmasterpiece/server/index.js.map +1 -1
- package/dist/showmasterpiece/server/index.mjs +35 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -1
- package/dist/showmasterpiece/service/api/index.d.mts +1 -1
- package/dist/showmasterpiece/service/api/index.d.ts +1 -1
- package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
- package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
- package/dist/showmasterpiece/service/index.d.mts +6 -6
- package/dist/showmasterpiece/service/index.d.ts +6 -6
- package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/service/web/index.d.mts +4 -4
- package/dist/showmasterpiece/service/web/index.d.ts +4 -4
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.js +38 -8
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.mjs +38 -8
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.js +279 -226
- package/dist/showmasterpiece/ui/web/index.js.map +1 -1
- package/dist/showmasterpiece/ui/web/index.mjs +279 -226
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
- package/dist/showmasterpiece/web/index.js +279 -226
- package/dist/showmasterpiece/web/index.js.map +1 -1
- package/dist/showmasterpiece/web/index.mjs +279 -226
- package/dist/showmasterpiece/web/index.mjs.map +1 -1
- package/dist/{types-CvKvpyN8.d.mts → types-D4vSK3AJ.d.mts} +2 -1
- package/dist/{types-CvKvpyN8.d.ts → types-D4vSK3AJ.d.ts} +2 -1
- package/package.json +1 -1
package/dist/mmd/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":["PMXEditor","data","React","useState","useEffect","clsx","THREE","mesh","Ammo","ImageIcon","useRef","StatusBadge","useCallback","THREE3","THREE4","THREE5","PMXParser","createPortal","forwardRef","THREE6","useImperativeHandle","useMemo","SkipBack","Pause","Play","SkipForward","Camera","Repeat","Repeat1","Music","X","Loader2","ARMode","THREE7","MMDAnimationHelper","MMDLoader","THREE8","THREE9","THREE10","OrbitControls"],"mappings":"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","file":"index.mjs","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' | 'unknown';\n patternUrl?: 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\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 any).THREE = options.three;\n }\n\n const existing = (window as any).THREEx as THREExNamespace | undefined;\n if (existing && !options.forceReload) {\n return existing;\n }\n\n if (!loadPromise || options.forceReload) {\n const importPromise = 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(() => {\n const THREEx = (window as any).THREEx as THREExNamespace | undefined;\n if (!THREEx) {\n throw new Error('AR.js loaded, but THREEx namespace was not found.');\n }\n return THREEx;\n });\n }\n\n return loadPromise;\n}\n","import { 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 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?: React.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 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 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 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 (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 [initialModelVisible, 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 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 }\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 }, []);\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\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\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 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 (!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 }, [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 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 && !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 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"]}
|
|
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":["PMXEditor","data","React","useState","useEffect","clsx","THREE","mesh","Ammo","ImageIcon","useRef","StatusBadge","useCallback","THREE3","THREE4","THREE5","PMXParser","createPortal","forwardRef","THREE6","useImperativeHandle","useMemo","SkipBack","Pause","Play","SkipForward","Camera","Repeat","Repeat1","Music","X","Loader2","ARMode","THREE7","MMDAnimationHelper","MMDLoader","THREE8","THREE9","THREE10","OrbitControls"],"mappings":"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","file":"index.mjs","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"]}
|