sa2kit 1.6.12 → 1.6.13

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mmd/utils/ammo-loader.ts","../../src/mmd/fx/HLSLToGLSLConverter.ts","../../src/mmd/fx/FXParser.ts","../../src/mmd/fx/FXToThreeAdapter.ts","../../src/mmd/fx/MultiFXAdapter.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/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/MMDVisualNovel.tsx","../../src/mmd/music-player/components/MusicControls.tsx","../../src/mmd/music-player/components/PlaylistPanel.tsx","../../src/mmd/music-player/components/TrackInfo.tsx","../../src/mmd/music-player/MMDMusicPlayer.tsx","../../src/mmd/ar/MMDARPlayer.tsx","../../src/mmd/fx/utils.ts","../../src/mmd/fx/components/FXViewer.tsx","../../src/mmd/fx/components/FXThreePreview.tsx"],"names":["THREE","THREE2","THREE3","forwardRef","useRef","useEffect","useImperativeHandle","OutlineEffect","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Camera","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal","Shuffle","ListMusic","Search","Loader2","useMusic","AlertCircle","RefreshCw","CameraOff","CloseIcon","THREE4"],"mappings":"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","file":"index.js","sourcesContent":["\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 * 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","import React, { useEffect, useRef, forwardRef, useImperativeHandle } 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';\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 for (let i = 0; i < 3; i++) {\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}\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 // 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 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 // 🕐 运行时间追踪 - 用于 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 isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\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 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 // 保存原始的 Ammo 构造函数,以便在 _createWorld 中使用\n const originalBtDefaultCollisionConfiguration = Ammo.btDefaultCollisionConfiguration;\n const originalBtCollisionDispatcher = Ammo.btCollisionDispatcher;\n const originalBtDbvtBroadphase = Ammo.btDbvtBroadphase;\n const originalBtSequentialImpulseConstraintSolver = Ammo.btSequentialImpulseConstraintSolver;\n const originalBtDiscreteDynamicsWorld = Ammo.btDiscreteDynamicsWorld;\n \n // Monkey patch Ammo 构造函数来拦截创建过程\n // ⚠️ 关键修改:使用数组来保存所有对象,而不是只保存最后一个\n const componentsRef = physicsComponentsRef.current;\n \n Ammo.btDefaultCollisionConfiguration = function(...args: any[]) {\n const obj = new originalBtDefaultCollisionConfiguration(...args);\n componentsRef.configs.push(obj); // 🎯 添加到数组而不是覆盖\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...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 // Scene\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 // 音频监听器\n const listener = new THREE.AudioListener();\n camera.add(listener);\n audioListenerRef.current = listener;\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 // 默认色调映射(FX文件可以覆盖此设置)\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n \n // 5. 关键检查点:在操作 DOM 之前再次检查\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 // Shadow\n if (stage.enableShadow !== false && !mobileOptimization.reduceShadowQuality) {\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n \n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 🎯 初始化渲染特效\n // Outline Effect\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 // 🎯 1. 先创建光源(FX配置可能需要更新它们)\n const ambientLight = new THREE.AmbientLight(0xffffff, stage.ambientLightIntensity ?? 0.5);\n scene.add(ambientLight);\n\n const dirLight = new THREE.DirectionalLight(0xffffff, stage.directionalLightIntensity ?? 0.8);\n dirLight.position.set(0, 10, 0);\n if (stage.enableShadow !== false) {\n dirLight.castShadow = true;\n dirLight.shadow.mapSize.width = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.mapSize.height = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.bias = -0.0001;\n }\n scene.add(dirLight);\n\n // 🎨 2. 加载并解析FX文件(在光源创建后,可以更新光源配置)\n if (fxConfigs && fxConfigs.length > 0) {\n // 多FX模式:支持同时加载多个.fx和.x文件\n try {\n console.log('[MMDPlayerBase] Loading multiple FX files:', fxConfigs.length);\n const multiFX = new MultiFXAdapter({\n mergeStrategy: 'override',\n autoLoadTextures: true,\n });\n \n // 批量加载所有FX文件\n await multiFX.addMultipleFX(fxConfigs);\n multiFXAdapterRef.current = multiFX;\n \n // 打印配置(调试)\n multiFX.printConfig();\n \n // 应用到场景(更新已有光照、阴影等)\n multiFX.applyToScene(scene, renderer);\n \n console.log('[MMDPlayerBase] Multiple FX files loaded successfully');\n } catch (error) {\n console.error('[MMDPlayerBase] Failed to load multiple FX files:', error);\n // FX加载失败不影响基础渲染\n }\n } else if (fxPath) {\n // 单FX模式:兼容旧API\n try {\n console.log('[MMDPlayerBase] Loading single FX file:', fxPath);\n const parser = new FXParser();\n const fxEffect = await parser.loadAndParse(fxPath);\n fxEffectRef.current = fxEffect;\n \n // 创建FX适配器\n const fxAdapter = new FXToThreeAdapter(fxEffect, fxTexturePath || '');\n fxAdapterRef.current = fxAdapter;\n \n // 加载FX纹理\n console.log('[MMDPlayerBase] Loading FX textures...');\n await fxAdapter.loadTextures();\n \n // 🎯 只应用渲染器配置,不添加新光源(因为已经创建了)\n console.log('[MMDPlayerBase] Applying FX render config (renderer only)...');\n const renderConfig = fxAdapter.extractRenderConfig();\n \n // 应用色调映射\n if (renderConfig.toneMapping !== undefined) {\n renderer.toneMapping = renderConfig.toneMapping;\n console.log('[MMDPlayerBase] Applied toneMapping from FX:', renderConfig.toneMapping === THREE.NoToneMapping ? 'NoToneMapping' : 'ACESFilmicToneMapping');\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n renderer.toneMappingExposure = renderConfig.toneMappingExposure;\n }\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 // 🎯 更新已有光源的强度(如果FX有配置)\n if (renderConfig.ambientLightIntensity !== undefined) {\n ambientLight.intensity = renderConfig.ambientLightIntensity;\n console.log('[MMDPlayerBase] Updated ambient light from FX:', renderConfig.ambientLightIntensity);\n }\n if (renderConfig.directionalLightIntensity !== undefined) {\n dirLight.intensity = renderConfig.directionalLightIntensity;\n console.log('[MMDPlayerBase] Updated directional light from FX:', renderConfig.directionalLightIntensity);\n }\n if (renderConfig.lightDirection) {\n dirLight.position.copy(renderConfig.lightDirection).multiplyScalar(10);\n }\n \n console.log('[MMDPlayerBase] FX file loaded successfully');\n } catch (error) {\n console.error('[MMDPlayerBase] Failed to load FX file:', error);\n // FX加载失败不影响基础渲染\n }\n }\n\n // Controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.minDistance = 10;\n controls.maxDistance = 100;\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);\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 // 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 \n // 关键检查点:资源加载耗时较长,再次检查是否已失效\n if (checkCancelled()) return;\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n }\n\n // 设置模型基础属性\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\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 // 计算模型边界并自动聚焦\n const box = new THREE.Box3().setFromObject(mesh);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n\n if (!stage.cameraTarget) {\n // 对于人形模型,聚焦在胸部/头部之间的位置(center.y + 30-40% 高度)\n controls.target.set(center.x, center.y + size.y * 0.35, center.z);\n \n if (!stage.cameraPosition) {\n // MMD 模型通常正面朝向 -Z 轴,相机应该在 +Z 方向\n // 距离基于模型尺寸,确保能看到全身\n const maxDim = Math.max(size.x, size.y, size.z);\n const dist = maxDim * 2.0; // 增加距离系数\n \n // 相机位置:在模型前方(+Z),稍微抬高(俯视角度)\n camera.position.set(\n center.x, // X: 水平对齐\n center.y + size.y * 0.6, // Y: 稍高于模型中心(眼睛平视或略俯视)\n center.z + dist // Z: 在模型正前方(+Z 方向)\n );\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n // 🎯 应用描边设置到模型材质\n // MMD 模型通常在材质的 userData.outlineParameters 中带有来自 PMX 的描边参数\n // 我们需要覆盖它们以使 props.outlineOptions 生效\n console.log('[MMDPlayerBase] 🎨 Traversing model mesh to apply FX and outline, multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n let materialCount = 0;\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 materialCount += materials.length;\n materials.forEach((m) => {\n if (!m.userData) m.userData = {};\n if (!m.userData.outlineParameters) {\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 } else {\n // 覆盖来自模型的默认值\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 // 🎨 应用FX材质配置(如果有)\n // 支持MeshPhongMaterial和MeshToonMaterial(MMD常用)\n if (m instanceof THREE.MeshPhongMaterial || m instanceof THREE.MeshToonMaterial) {\n console.log('[MMDPlayerBase] 🎨 Applying FX to model material (type:', m.type, '), multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n // 优先使用多FX适配器\n if (multiFXAdapterRef.current) {\n console.log('[MMDPlayerBase] Using MultiFXAdapter');\n multiFXAdapterRef.current.applyToMaterial(m, 'model');\n } else if (fxAdapterRef.current) {\n console.log('[MMDPlayerBase] Using single FXAdapter');\n // 回退到单FX适配器\n const materialConfig = fxAdapterRef.current.extractMaterialConfig();\n \n // 🔍 调试:打印提取的配置\n console.log('[MMDPlayerBase] Extracted material config:');\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:', materialConfig.color);\n } else {\n console.log('[MMDPlayerBase] Skipping black color (0,0,0) 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:', 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:', materialConfig.specular);\n }\n \n // 应用光泽度\n if (materialConfig.shininess !== undefined && (m as any).shininess !== undefined) {\n console.log('[MMDPlayerBase] Applying shininess:', materialConfig.shininess);\n (m as any).shininess = materialConfig.shininess;\n }\n }\n } else {\n console.log('[MMDPlayerBase] Material type not supported for FX:', m.type);\n }\n });\n }\n });\n console.log('[MMDPlayerBase] 🎨 Model traverse complete, processed materials:', materialCount);\n\n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\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 = true;\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 \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 // 提示浏览器可以进行垃圾回收(只在开发环境)\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 if (!audioListenerRef.current || !helperRef.current || !resources.audioPath) return;\n\n const listener = audioListenerRef.current;\n const helper = helperRef.current;\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 track loaded successfully');\n \n if (isPlayingRef.current) {\n sound.play();\n }\n },\n undefined,\n (err) => console.error('[MMDPlayerBase] Failed to load audio track:', err)\n );\n }, [resources.audioPath, volume]);\n\n // 监听 showAxes 变化,动态添加/移除坐标轴\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 && stage.directionalLightIntensity !== undefined) {\n obj.intensity = stage.directionalLightIntensity;\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 }, [stage.backgroundColor, stage.backgroundImage, stage.ambientLightIntensity, stage.directionalLightIntensity, stage.cameraPosition, stage.cameraTarget]);\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 // 使用选定的渲染方式\n if (renderEffect === 'outline' && outlineEffectRef.current) {\n outlineEffectRef.current.render(sceneRef.current, cameraRef.current);\n } else {\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', // 恢复 relative,作为 canvas 的定位容器\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';\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={`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={`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={`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';\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={`group flex items-center gap-3 rounded-lg p-3 transition-all ${\n currentId === item.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\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={`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={`relative flex flex-col items-center gap-2 rounded-lg p-2 text-center transition-all ${\n currentVal === opt.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\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={`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';\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={`h-full transition-all duration-300 ${\n (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 }`}\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={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\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 { 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={`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={`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';\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={`px-2 py-0.5 rounded text-[10px] font-bold uppercase ${\n preloadStrategy === 'all' ? 'bg-red-600 text-white' :\n preloadStrategy === 'next' ? 'bg-yellow-600 text-white' :\n 'bg-gray-700 text-gray-400'\n }`}>\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={`px-1.5 py-0.5 rounded text-[10px] ${\n idx === currentIndex\n ? 'bg-green-600 text-white font-bold'\n : 'bg-gray-700 text-gray-300'\n }`}\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={`h-full transition-all duration-300 ${\n (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 }`}\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={`px-2 py-1 rounded text-[10px] flex items-center justify-between ${\n 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 >\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={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\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 {\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={`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={`transition-opacity duration-300 ${\n isPlaying && !showPlaylist ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'\n }`}\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={`w-full flex items-center gap-3 p-3 rounded-lg mb-2 transition-all ${\n index === currentIndex\n ? 'bg-blue-600 text-white'\n : 'bg-gray-800 text-gray-300 hover:bg-gray-700'\n }`}\n >\n {/* 序号 */}\n <div\n className={`flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold ${\n index === currentIndex ? 'bg-white/20' : 'bg-gray-700'\n }`}\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","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueBoxProps, DialogueBoxTheme } from './types';\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(255, 255, 255, 0.15)',\n borderColor: 'rgba(255, 255, 255, 0.25)',\n textColor: '#ffffff',\n speakerBgColor: 'rgba(255, 255, 255, 0.25)',\n speakerTextColor: '#ffffff',\n opacity: 0.98,\n blur: '24px',\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 const dialogueContent = (\n <div\n className={`${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(255, 255, 255, 0.15) 0%, \n rgba(255, 255, 255, 0.12) 50%, \n rgba(255, 255, 255, 0.1) 100%)`,\n boxShadow: `\n 0 -8px 40px rgba(255, 255, 255, 0.1),\n 0 -4px 16px rgba(255, 255, 255, 0.05),\n inset 0 1px 0 rgba(255, 255, 255, 0.3),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1)\n `,\n }}\n >\n {/* 装饰性渐变层 - 柔和的彩虹渐变 */}\n <div \n className=\"absolute inset-0 opacity-20 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 \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.6), 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(255,255,255,0.3), transparent)',\n }}\n />\n {/* 控制按钮区域 - 放在对话框内部顶部 */}\n {showControls && (\n <div className=\"flex justify-end gap-3 px-6 pt-4 pb-2 flex-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-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\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-400/50 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.3), rgba(37, 99, 235, 0.2))',\n boxShadow: '0 4px 16px rgba(59, 130, 246, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.2)',\n }}\n title=\"恢复初始视角\"\n >\n 🎥 恢复视角\n </button>\n )}\n {showAutoButton && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleAuto?.();\n }}\n className={`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-white/50 text-white'\n : 'border-white/30 hover:border-white/50 text-white'\n }`}\n style={{\n background: isAutoMode \n ? 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))'\n : 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: isAutoMode \n ? '0 4px 20px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.4)'\n : '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\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-white font-medium hover:text-white transition-all backdrop-blur-lg border border-white/30 hover:border-white/50 hover:scale-105 active:scale-95 shadow-lg\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n }}\n title=\"快进\"\n >\n ⏩ 快进\n </button>\n )}\n </div>\n )}\n\n {/* 内容区域 - 使用 flex-1 占据剩余空间 */}\n <div className=\"px-8 pb-6 flex-1 flex flex-col justify-center 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(255, 255, 255, 0.3) 0%, \n rgba(255, 255, 255, 0.2) 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n boxShadow: '0 8px 32px rgba(255, 255, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.4)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\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 2px 8px rgba(0, 0, 0, 0.5)',\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, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.6))',\n animation: 'cursorBlink 1s ease-in-out infinite',\n boxShadow: '0 0 12px rgba(255, 255, 255, 0.8)',\n }}\n />\n )}\n </div>\n\n {/* 点击继续提示 */}\n {isComplete && theme.showContinueHint && (\n <div className=\"flex justify-end mt-4\">\n <span \n className=\"text-sm px-4 py-2 rounded-full backdrop-blur-lg font-medium\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.15))',\n color: 'rgba(255, 255, 255, 0.9)',\n animation: 'bounce 2s ease-in-out infinite',\n boxShadow: '0 4px 16px rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3)',\n border: '1px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {theme.continueHint}\n </span>\n </div>\n )}\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';\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={`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","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\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={`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","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\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\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 bg-black/40 backdrop-blur-xl z-[1000000] pointer-events-auto transition-all animate-in fade-in zoom-in-95 duration-300\"\n onClick={onClose}\n >\n <div \n className=\"w-full max-w-lg mx-4 p-8 rounded-[2.5rem] border border-white/40 shadow-[0_20px_80px_rgba(0,0,0,0.4)] relative overflow-hidden\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* 装饰性背景光晕 */}\n <div className=\"absolute -top-24 -right-24 w-64 h-64 bg-cyan-400/20 rounded-full blur-3xl pointer-events-none\" />\n <div className=\"absolute -bottom-24 -left-24 w-64 h-64 bg-pink-400/20 rounded-full blur-3xl pointer-events-none\" />\n\n {/* 标题 */}\n <div className=\"flex items-center justify-between mb-8 relative\">\n <div className=\"flex flex-col\">\n <h2 className=\"text-2xl font-bold text-white tracking-wider drop-shadow-lg\">{title}</h2>\n <div className=\"h-1.5 w-16 bg-white/60 rounded-full mt-2 shadow-[0_0_10px_rgba(255,255,255,0.5)]\" />\n </div>\n <button \n onClick={onClose}\n className=\"w-12 h-12 rounded-full flex items-center justify-center bg-white/10 hover:bg-white/30 text-white transition-all border border-white/20 shadow-inner\"\n >\n ✕\n </button>\n </div>\n \n {/* 内容 */}\n <div className=\"text-white leading-relaxed max-h-[50vh] overflow-y-auto pr-4 custom-scrollbar relative font-medium\">\n {children}\n </div>\n \n {/* 确定按钮 */}\n <div className=\"mt-10 flex justify-center relative\">\n <button\n onClick={onClose}\n className=\"px-14 py-3.5 rounded-2xl bg-white/20 hover:bg-white/40 text-white font-bold transition-all border border-white/50 shadow-[0_0_20px_rgba(255,255,255,0.2)] hover:scale-105 active:scale-95 tracking-[0.2em] uppercase text-sm\"\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}) => {\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={`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: '#050505',\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-40 pointer-events-none\"\n style={{\n background: 'radial-gradient(circle at center, rgba(57, 197, 187, 0.4) 0%, rgba(255, 182, 193, 0.2) 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-cyan-500/10 rounded-full blur-[120px] animate-blob\" />\n <div className=\"absolute bottom-[-10%] right-[-10%] w-[60%] h-[60%] bg-purple-500/10 rounded-full blur-[120px] animate-blob animation-delay-2000\" />\n <div className=\"absolute top-[20%] right-[10%] w-[40%] h-[40%] bg-pink-500/10 rounded-full blur-[100px] animate-blob animation-delay-4000\" />\n </div>\n\n {/* 密集的微粒效果 */}\n <div className=\"absolute inset-0 opacity-60\">\n {[...Array(40)].map((_, i) => (\n <div \n key={i}\n className=\"absolute bg-white/40 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(255,255,255,0.5)',\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-6 flex flex-col items-center\">\n \n {/* 标题区域 - 彻底解决重叠与间距 */}\n <div className=\"text-center mb-20 md:mb-32 group flex flex-col items-center\">\n {/* 上装饰线 */}\n <div className=\"w-40 h-px bg-gradient-to-r from-transparent via-white/60 to-transparent mb-10 shadow-[0_0_15px_rgba(255,255,255,0.5)]\" />\n \n <h1\n className=\"text-6xl md:text-8xl font-black text-white tracking-[0.15em] leading-tight select-none\"\n style={{\n filter: 'drop-shadow(0 0 20px rgba(255,255,255,0.3))',\n textShadow: '0 10px 30px rgba(0,0,0,0.5)'\n }}\n >\n {scriptName || 'VISUAL NOVEL'}\n </h1>\n \n {/* 下装饰区 - 增加明显间距 */}\n <div className=\"mt-10 flex flex-col items-center gap-4\">\n <div className=\"h-1 w-32 bg-white rounded-full opacity-80 shadow-[0_0_20px_rgba(255,255,255,0.8)]\" />\n <span className=\"text-sm md:text-base tracking-[0.8em] text-white/60 font-medium uppercase translate-x-[0.4em]\">\n Adventure System\n </span>\n </div>\n </div>\n\n {/* 交互按钮区 - 更加明亮精致 */}\n <div className=\"flex flex-col gap-10 items-center w-full max-w-sm\">\n \n {/* 核心开始按钮 */}\n <button\n onClick={onStart}\n className=\"group relative w-full h-20 flex items-center justify-center transition-all duration-500 active:scale-95\"\n >\n {/* 按钮底色 */}\n <div \n className=\"absolute inset-0 bg-white/10 backdrop-blur-2xl border-2 border-white/40 rounded-3xl transition-all duration-500 group-hover:bg-white/25 group-hover:border-white/70 group-hover:shadow-[0_0_50px_rgba(255,255,255,0.3)] group-hover:-inset-1\"\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-white/20 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-6\">\n <div className=\"w-3 h-3 rounded-full bg-cyan-400 animate-ping opacity-75\" />\n <span className=\"text-2xl font-black text-white tracking-[0.4em] drop-shadow-md\">{startText}</span>\n <div className=\"w-3 h-3 rounded-full bg-pink-400 animate-ping opacity-75\" />\n </div>\n </button>\n\n {/* 功能按钮组 */}\n <div className=\"flex gap-8 w-full justify-center\">\n {[\n { text: settingsText, onClick: () => setShowSettings(true), color: 'rgba(57, 197, 187, 0.2)' },\n { text: aboutText, onClick: () => setShowAbout(true), color: 'rgba(255, 182, 193, 0.2)' }\n ].map((btn, idx) => (\n <button\n key={idx}\n onClick={btn.onClick}\n className=\"group relative flex-1 h-14 flex items-center justify-center transition-all duration-300 active:scale-95 overflow-hidden rounded-2xl\"\n >\n <div \n className=\"absolute inset-0 bg-white/5 backdrop-blur-xl border border-white/20 transition-all duration-300 group-hover:bg-white/15 group-hover:border-white/40\"\n />\n <div \n className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity\" \n style={{ background: btn.color }}\n />\n <span className=\"relative text-sm md:text-base font-bold text-white/80 group-hover:text-white tracking-[0.25em] transition-colors uppercase\">\n {btn.text}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 固定到底部的版本信息 - 不再随内容重叠 */}\n <div className=\"fixed bottom-10 left-0 right-0 text-center pointer-events-none select-none\">\n <div className=\"inline-block px-6 py-2 rounded-full bg-white/5 backdrop-blur-md border border-white/10\">\n <span className=\"text-[10px] md:text-xs text-white/30 tracking-[0.5em] font-light uppercase\">\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 <div className=\"space-y-8 py-4\">\n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center text-sm font-bold tracking-widest text-white/60\">\n <span>MUSIC VOLUME</span>\n <span>80%</span>\n </div>\n <div className=\"h-3 bg-white/10 rounded-full p-0.5 border border-white/10\">\n <div className=\"h-full w-[80%] bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full shadow-[0_0_15px_rgba(34,211,238,0.5)]\" />\n </div>\n </div>\n \n <div className=\"space-y-4\">\n <div className=\"flex justify-between items-center text-sm font-bold tracking-widest text-white/60\">\n <span>TEXT SPEED</span>\n <span>NORMAL</span>\n </div>\n <div className=\"flex gap-3\">\n {['SLOW', 'NORMAL', 'FAST'].map((s, i) => (\n <div key={s} className={`flex-1 py-3 rounded-xl border text-center text-xs font-bold transition-all cursor-pointer ${i===1 ? 'bg-white/20 border-white/60 text-white' : 'bg-white/5 border-white/10 text-white/40 hover:bg-white/10 hover:border-white/30'}`}>\n {s}\n </div>\n ))}\n </div>\n </div>\n \n <div className=\"pt-4 flex items-center justify-between opacity-50 italic text-xs border-t border-white/10\">\n <span>Auto Save Enabled</span>\n <span>Cloud Sync Active</span>\n </div>\n </div>\n </VNModal>\n\n <VNModal title={aboutText} show={showAbout} onClose={() => setShowAbout(false)}>\n <div className=\"space-y-8 py-4\">\n <div className=\"flex items-center gap-6 p-6 rounded-3xl bg-white/5 border border-white/10\">\n <div className=\"w-20 h-20 rounded-2xl bg-gradient-to-br from-cyan-400 via-blue-500 to-purple-600 flex items-center justify-center text-3xl font-black text-white shadow-[0_10px_30px_rgba(0,0,0,0.3)]\">\n S2\n </div>\n <div>\n <h3 className=\"text-2xl font-black text-white tracking-tight\">{scriptName || 'Project SA2'}</h3>\n <p className=\"text-xs font-bold text-white/40 tracking-widest mt-1 uppercase\">Visual Novel Experience</p>\n </div>\n </div>\n \n <div className=\"space-y-4 px-2\">\n <p className=\"text-white/80 font-medium leading-relaxed\">\n 采用 sa2kit 引擎构建的新一代实时 3D 视觉小说。结合了 MMD 实时渲染技术与交互式剧情分支系统,致力于打造极致的沉浸式叙事体验。\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4 pt-6 border-t border-white/10\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-bold text-white/30 tracking-widest\">DEVELOPER</span>\n <span className=\"text-xs font-bold text-white/80\">SA2KIT TEAM</span>\n </div>\n <div className=\"flex flex-col gap-1 text-right\">\n <span className=\"text-[10px] font-bold text-white/30 tracking-widest\">ENGINE</span>\n <span className=\"text-xs font-bold text-white/80\">THREE.JS / REACT</span>\n </div>\n </div>\n </div>\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\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}) => {\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 />\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 text-white font-bold text-lg transition-all border border-white/20 shadow-xl hover:scale-105 active:scale-95 group relative overflow-hidden\"\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 {/* 悬停光效 */}\n <div className=\"absolute inset-0 bg-white/10 opacity-0 group-hover:opacity-100 transition-opacity\" />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-white/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out\" />\n \n <span className=\"relative z-10 drop-shadow-md\">{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, {\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 { DialogueBox } from './DialogueBox';\nimport { HistoryPanel } from './HistoryPanel';\nimport { LoadingOverlay } from './LoadingOverlay';\nimport { SkipConfirmDialog } from './SkipConfirmDialog';\nimport { ChoiceMenu } from './ChoiceMenu';\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 showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\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\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\n // 获取当前节点和对话\n const currentNode = nodes[currentNodeIndex];\n const currentDialogue = currentNode?.dialogues[currentDialogueIndex] || null;\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 console.log('[MMDVisualNovel] VMD not finished, showing confirmation');\n setPendingNodeIndex(nodeIndex);\n return;\n }\n\n console.log(`[MMDVisualNovel] 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 console.log(`[MMDVisualNovel] Transition to node ${nodeIndex} completed, waiting for model load`);\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 console.log(`[MMDVisualNovel] Branching: ${key}=${val} -> node ${nextNodeIndex}`);\n } else {\n nextNodeIndex = defaultIndex;\n }\n }\n\n if (nextNodeIndex < nodes.length && nextNodeIndex >= 0) {\n goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\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 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 goToNode(nextNodeIndex);\n } else if (loop) {\n goToNode(0);\n } else {\n onScriptComplete?.();\n }\n }, [currentNodeIndex, nodes.length, loop, goToNode, onScriptComplete]);\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 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={`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 console.log('[MMDVisualNovel] MMDPlayerBase onLoad called');\n setIsLoading(false);\n // 如果已经开始游戏,启动动画播放(使用 ref 获取最新值)\n if (isStartedRef.current) {\n console.log('[MMDVisualNovel] Game already started, triggering play');\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }\n }}\n onPlay={() => {\n // 动画开始播放时才设置为 true\n console.log('[MMDVisualNovel] MMDPlayerBase onPlay called');\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 console.log('[MMDVisualNovel] VMD finished/looped, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }\n }\n lastAnimationTimeRef.current = time;\n }}\n onEnded={() => {\n console.log('[MMDVisualNovel] 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={(() => {\n const shouldShowLoading = (isLoading || isTransitioning || !isAnimationPlaying) && isStarted;\n console.log('[MMDVisualNovel] LoadingOverlay conditions:', {\n isLoading,\n isTransitioning,\n isAnimationPlaying,\n isStarted,\n shouldShowLoading\n });\n return shouldShowLoading;\n })()}\n showStartScreen={!isStarted}\n scriptName={script.name}\n loadingText=\"正在准备场景中...\"\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory && !showChoices;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\n showChoices,\n shouldShow,\n dialogue: currentDialogue\n });\n \n return shouldShow ? (\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 {/* 确认跳过动画弹窗 */}\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 console.log(`[MMDVisualNovel] 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 </div>\n );\n }\n);\n\nMMDVisualNovel.displayName = 'MMDVisualNovel';\n\nexport default MMDVisualNovel;\n\n","import React from 'react';\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={`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';\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={`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={`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={`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';\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={`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","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 {\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={`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={`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 React, { \n useEffect, \n useRef, \n useState, \n useCallback, \n forwardRef, \n useImperativeHandle \n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef, MMDResources } from '../types';\nimport { MMDARPlayerProps, MMDARPlayerRef } from './types';\nimport { Camera, CameraOff, RefreshCw, AlertCircle, Settings, X as CloseIcon, Check } from 'lucide-react';\n\n/**\n * MMDARPlayer - 基于实时摄像头的 MMD 增强现实播放器\n * \n * 功能:\n * - 调用设备摄像头作为背景\n * - 叠加透明背景的 MMD 模型渲染\n * - 支持前后摄像头切换\n * - 针对 AR 场景优化模型光照与定位\n */\nexport const MMDARPlayer = forwardRef<MMDARPlayerRef, MMDARPlayerProps>((props, ref) => {\n const {\n resources,\n stage = {},\n mobileOptimization,\n cameraConfig = { facingMode: 'user' },\n mirrored,\n showSettings = true,\n autoPlay = true,\n loop = true,\n onCameraReady,\n onCameraError,\n onResourcesChange,\n onLoad,\n onError,\n className,\n style,\n } = props;\n\n // Refs\n const videoRef = useRef<HTMLVideoElement>(null);\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n // States\n const [isCameraStarted, setIsCameraStarted] = useState(false);\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [facingMode, setFacingMode] = useState<'user' | 'environment'>(cameraConfig.facingMode || 'user');\n const [isLoading, setIsLoading] = useState(true);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [currentResources, setCurrentResources] = useState<MMDResources>(resources);\n const [tempResources, setTempResources] = useState<MMDResources>(resources);\n\n // 当外部 resources 变化时,同步内部资源(如果设置面板没打开)\n useEffect(() => {\n if (!isSettingsOpen) {\n setCurrentResources(resources);\n setTempResources(resources);\n }\n }, [resources, isSettingsOpen]);\n\n // 镜像逻辑:如果是前置摄像头且未明确指定 mirrored,则默认开启镜像\n const shouldMirror = mirrored !== undefined ? mirrored : facingMode === 'user';\n\n /**\n * 开启摄像头\n */\n const startCamera = useCallback(async (mode: 'user' | 'environment' = facingMode) => {\n try {\n setCameraError(null);\n \n // 如果已有流,先停止\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n\n const constraints: MediaStreamConstraints = {\n video: {\n facingMode: mode,\n width: cameraConfig.width || { ideal: 1280 },\n height: cameraConfig.height || { ideal: 720 },\n },\n audio: false\n };\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n streamRef.current = stream;\n\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n }\n\n setIsCameraStarted(true);\n setFacingMode(mode);\n onCameraReady?.(stream);\n } catch (err: any) {\n console.error('[MMDARPlayer] Camera access error:', err);\n const errorMsg = err.name === 'NotAllowedError' ? '摄像头权限被拒绝' : `无法访问摄像头: ${err.message}`;\n setCameraError(errorMsg);\n onCameraError?.(err instanceof Error ? err : new Error(errorMsg));\n }\n }, [facingMode, cameraConfig, onCameraReady, onCameraError]);\n\n /**\n * 关闭摄像头\n */\n const stopCamera = useCallback(() => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n streamRef.current = null;\n }\n if (videoRef.current) {\n videoRef.current.srcObject = null;\n }\n setIsCameraStarted(false);\n }, []);\n\n /**\n * 切换摄像头\n */\n const switchCamera = useCallback(async () => {\n const newMode = facingMode === 'user' ? 'environment' : 'user';\n await startCamera(newMode);\n }, [facingMode, startCamera]);\n\n /**\n * 截图 (包含视频背景和模型)\n */\n const snapshot = useCallback(async (): Promise<string> => {\n if (!videoRef.current || !playerRef.current) return '';\n\n const canvas = document.createElement('canvas');\n const video = videoRef.current;\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) return '';\n\n // 1. 绘制视频背景\n if (shouldMirror) {\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n if (shouldMirror) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n\n // 2. 绘制 MMD 模型 (WebGL Canvas)\n const mmdBase64 = playerRef.current.snapshot();\n const mmdImg = new Image();\n mmdImg.src = mmdBase64;\n \n await new Promise((resolve) => {\n mmdImg.onload = () => {\n // MMD 模型通常需要拉伸到与视频一致的尺寸(或者保持比例居中)\n ctx.drawImage(mmdImg, 0, 0, canvas.width, canvas.height);\n resolve(null);\n };\n });\n\n return canvas.toDataURL('image/png');\n }, [shouldMirror]);\n\n // 暴露接口\n useImperativeHandle(ref, () => ({\n startCamera,\n stopCamera,\n switchCamera,\n snapshot\n }));\n\n // 组件挂载时自动开启摄像头 (如果 autoPlay 为 true)\n useEffect(() => {\n if (autoPlay) {\n startCamera();\n }\n return () => stopCamera();\n }, [autoPlay, startCamera, stopCamera]);\n\n return (\n <div \n className={`relative w-full h-full bg-black overflow-hidden ${className}`} \n style={style}\n >\n {/* 1. 摄像头视频背景层 */}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover transition-transform duration-500 ${shouldMirror ? 'scale-x-[-1]' : ''}`}\n style={{ zIndex: 0 }}\n />\n\n {/* 2. MMD 模型层 - 必须设置背景透明 */}\n <div \n className=\"absolute inset-0 w-full h-full\" \n style={{ zIndex: 1 }}\n >\n <MMDPlayerBase\n ref={playerRef}\n resources={currentResources}\n stage={{\n ...stage,\n backgroundColor: 'transparent', // 强制透明背景\n cameraPosition: stage.cameraPosition || { x: 0, y: 15, z: 40 }, // 针对 AR 场景稍调高相机\n }}\n mobileOptimization={mobileOptimization}\n autoPlay={autoPlay}\n loop={loop}\n onLoad={() => {\n setIsLoading(false);\n onLoad?.();\n }}\n onError={onError}\n />\n </div>\n\n {/* 3. UI 交互层 */}\n <div className=\"absolute inset-0 z-10 pointer-events-none flex flex-col justify-between p-6\">\n <div className=\"flex justify-between items-start pointer-events-auto\">\n {cameraError ? (\n <div className=\"bg-red-500/80 backdrop-blur-md text-white px-4 py-2 rounded-full flex items-center gap-2 text-sm\">\n <AlertCircle className=\"w-4 h-4\" />\n {cameraError}\n <button \n onClick={() => startCamera()}\n className=\"ml-2 underline\"\n >\n 重试\n </button>\n </div>\n ) : (\n <div className=\"bg-black/40 backdrop-blur-md text-white px-4 py-2 rounded-full flex items-center gap-2 text-sm\">\n <Camera className=\"w-4 h-4 text-green-400\" />\n {isCameraStarted ? '实景 AR 模式已开启' : '等待摄像头...'}\n </div>\n )}\n \n <div className=\"flex flex-col gap-2\">\n {showSettings && (\n <button\n onClick={() => setIsSettingsOpen(!isSettingsOpen)}\n className={`p-3 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto ${isSettingsOpen ? 'bg-blue-500' : 'bg-white/10 hover:bg-white/20'}`}\n title=\"设置模型与动作\"\n >\n <Settings className=\"w-5 h-5\" />\n </button>\n )}\n <button\n onClick={switchCamera}\n className=\"p-3 bg-white/10 hover:bg-white/20 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto\"\n title=\"切换前后摄像头\"\n >\n <RefreshCw className=\"w-5 h-5\" />\n </button>\n <button\n onClick={isCameraStarted ? stopCamera : () => startCamera()}\n className={`p-3 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto ${isCameraStarted ? 'bg-red-500/20 hover:bg-red-500/40' : 'bg-green-500/20 hover:bg-green-500/40'}`}\n title={isCameraStarted ? '关闭摄像头' : '开启摄像头'}\n >\n {isCameraStarted ? <CameraOff className=\"w-5 h-5\" /> : <Camera className=\"w-5 h-5\" />}\n </button>\n </div>\n </div>\n\n {/* 4. 设置面板 */}\n {isSettingsOpen && (\n <div className=\"absolute top-20 right-6 w-80 bg-black/80 backdrop-blur-xl border border-white/10 rounded-2xl p-6 pointer-events-auto shadow-2xl animate-in slide-in-from-right-4 duration-300\">\n <div className=\"flex items-center justify-between mb-6\">\n <h3 className=\"text-white font-bold flex items-center gap-2\">\n <Settings className=\"w-4 h-4\" />\n 资源设置\n </h3>\n <button \n onClick={() => setIsSettingsOpen(false)}\n className=\"p-1 hover:bg-white/10 rounded-full transition-colors text-white/60\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-white/50 mb-1.5 ml-1 uppercase tracking-wider\">模型路径 (.pmx)</label>\n <input\n type=\"text\"\n value={tempResources.modelPath}\n onChange={(e) => setTempResources({ ...tempResources, modelPath: e.target.value })}\n placeholder=\"请输入模型 URL...\"\n className=\"w-full bg-white/5 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-white placeholder:text-white/10 focus:outline-none focus:border-blue-500/50 transition-colors\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-white/50 mb-1.5 ml-1 uppercase tracking-wider\">动作路径 (.vmd)</label>\n <input\n type=\"text\"\n value={tempResources.motionPath || ''}\n onChange={(e) => setTempResources({ ...tempResources, motionPath: e.target.value })}\n placeholder=\"请输入动作 URL...\"\n className=\"w-full bg-white/5 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-white placeholder:text-white/10 focus:outline-none focus:border-blue-500/50 transition-colors\"\n />\n </div>\n\n <div className=\"pt-2\">\n <button\n onClick={() => {\n setCurrentResources(tempResources);\n onResourcesChange?.(tempResources);\n setIsSettingsOpen(false);\n setIsLoading(true);\n }}\n className=\"w-full bg-blue-500 hover:bg-blue-600 text-white font-bold py-3 rounded-xl flex items-center justify-center gap-2 transition-all active:scale-95 shadow-lg shadow-blue-500/20\"\n >\n <Check className=\"w-4 h-4\" />\n 应用更改\n </button>\n </div>\n </div>\n </div>\n )}\n\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-12 h-12 border-4 border-blue-500/30 border-t-blue-500 rounded-full animate-spin\" />\n <div className=\"text-white text-sm font-medium bg-black/40 px-3 py-1 rounded-full backdrop-blur-sm\">\n 正在加载 Miku 资源...\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n});\n\nMMDARPlayer.displayName = 'MMDARPlayer';\n\nexport default MMDARPlayer;\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 * 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';\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={`fx-viewer loading ${className}`}>\n <div className=\"fx-viewer-spinner\">加载中...</div>\n </div>\n );\n }\n\n if (error || !effect || !summary) {\n return (\n <div className={`fx-viewer error ${className}`}>\n <div className=\"fx-viewer-error\">\n <h3>❌ 解析错误</h3>\n <p>{error || '未知错误'}</p>\n </div>\n </div>\n );\n }\n\n const validation = validateFXEffect(effect);\n\n return (\n <div className={`fx-viewer ${className}`}>\n <div className=\"fx-viewer-header\">\n <h2>{effect.fileName}</h2>\n <p className=\"fx-viewer-config-summary\">{getConfigSummaryText(effect)}</p>\n </div>\n\n <div className=\"fx-viewer-tabs\">\n <button\n className={activeTab === 'summary' ? 'active' : ''}\n onClick={() => setActiveTab('summary')}\n >\n 摘要\n </button>\n <button\n className={activeTab === 'defines' ? 'active' : ''}\n onClick={() => setActiveTab('defines')}\n >\n 宏定义 ({summary.defineCount})\n </button>\n <button\n className={activeTab === 'textures' ? 'active' : ''}\n onClick={() => setActiveTab('textures')}\n >\n 纹理 ({summary.textureCount})\n </button>\n <button\n className={activeTab === 'parameters' ? 'active' : ''}\n onClick={() => setActiveTab('parameters')}\n >\n 参数 ({summary.parameterCount})\n </button>\n <button\n className={activeTab === 'validation' ? 'active' : ''}\n onClick={() => setActiveTab('validation')}\n >\n 验证\n </button>\n </div>\n\n <div className=\"fx-viewer-content\">\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 className=\"fx-tab-summary\">\n <div className=\"fx-stats-grid\">\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">宏定义</div>\n <div className=\"fx-stat-value\">{summary.defineCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">参数</div>\n <div className=\"fx-stat-value\">{summary.parameterCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">纹理</div>\n <div className=\"fx-stat-value\">{summary.textureCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">Technique</div>\n <div className=\"fx-stat-value\">{summary.techniqueCount}</div>\n </div>\n </div>\n\n <div className=\"fx-features\">\n <h3>功能特性</h3>\n <div className=\"fx-feature-list\">\n <div className={`fx-feature ${summary.hasLocalShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasLocalShadow ? '✓' : '✗'} LocalShadow\n </div>\n <div className={`fx-feature ${summary.hasExcellentShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasExcellentShadow ? '✓' : '✗'} ExcellentShadow\n </div>\n <div className={`fx-feature ${summary.hasHgShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasHgShadow ? '✓' : '✗'} HgShadow\n </div>\n </div>\n </div>\n\n {effect.includes.length > 0 && (\n <div className=\"fx-includes\">\n <h3>包含文件</h3>\n <ul>\n {effect.includes.map((inc, idx) => (\n <li key={idx}><code>{inc}</code></li>\n ))}\n </ul>\n </div>\n )}\n\n {effect.controllers.length > 0 && (\n <div className=\"fx-controllers\">\n <h3>控制器</h3>\n <ul>\n {effect.controllers.map((ctrl, idx) => (\n <li key={idx}>\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 className=\"fx-tab-defines\">\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>值</th>\n <th>状态</th>\n <th>行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.defines.map((define, idx) => (\n <tr key={idx} className={define.isCommented ? 'disabled' : 'enabled'}>\n <td><code>{define.name}</code></td>\n <td>{define.value || '-'}</td>\n <td>\n <span className={`status-badge ${define.isCommented ? 'disabled' : 'enabled'}`}>\n {define.isCommented ? '禁用' : '启用'}\n </span>\n </td>\n <td>{define.lineNumber}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst TexturesTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div className=\"fx-tab-textures\">\n {effect.textures.length === 0 ? (\n <p className=\"fx-empty-message\">未找到纹理定义</p>\n ) : (\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>路径</th>\n <th>尺寸</th>\n <th>用途</th>\n </tr>\n </thead>\n <tbody>\n {effect.textures.map((texture, idx) => (\n <tr key={idx}>\n <td><code>{texture.name}</code></td>\n <td>{texture.path}</td>\n <td>{texture.width && texture.height ? `${texture.width}×${texture.height}` : '-'}</td>\n <td>{texture.purpose || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n);\n\nconst ParametersTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div className=\"fx-tab-parameters\">\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>类型</th>\n <th>语义</th>\n <th>默认值</th>\n <th>行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.parameters.map((param, idx) => (\n <tr key={idx}>\n <td><code>{param.name}</code></td>\n <td><code>{param.type}</code></td>\n <td>{param.semantic || '-'}</td>\n <td>{param.defaultValue || '-'}</td>\n <td>{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 className=\"fx-tab-validation\">\n <div className={`fx-validation-status ${validation.isValid ? 'valid' : 'invalid'}`}>\n <h3>{validation.isValid ? '✓ 验证通过' : '✗ 验证失败'}</h3>\n </div>\n\n {validation.errors.length > 0 && (\n <div className=\"fx-validation-section fx-errors\">\n <h4>错误 ({validation.errors.length})</h4>\n <ul>\n {validation.errors.map((error, idx) => (\n <li key={idx} className=\"fx-error-item\">{error}</li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.warnings.length > 0 && (\n <div className=\"fx-validation-section fx-warnings\">\n <h4>警告 ({validation.warnings.length})</h4>\n <ul>\n {validation.warnings.map((warning, idx) => (\n <li key={idx} className=\"fx-warning-item\">{warning}</li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.isValid && validation.warnings.length === 0 && (\n <p className=\"fx-success-message\">FX文件结构完整,没有发现问题。</p>\n )}\n </div>\n);\n\nFXViewer.displayName = 'FXViewer';\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';\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={`fx-three-preview loading ${className}`}>\n <div className=\"preview-loading\">加载中...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`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={`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/utils/ammo-loader.ts","../../src/mmd/fx/HLSLToGLSLConverter.ts","../../src/mmd/fx/FXParser.ts","../../src/mmd/fx/FXToThreeAdapter.ts","../../src/mmd/fx/MultiFXAdapter.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/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/music-player/components/MusicControls.tsx","../../src/mmd/music-player/components/PlaylistPanel.tsx","../../src/mmd/music-player/components/TrackInfo.tsx","../../src/mmd/music-player/MMDMusicPlayer.tsx","../../src/mmd/ar/MMDARPlayer.tsx","../../src/mmd/fx/utils.ts","../../src/mmd/fx/components/FXViewer.tsx","../../src/mmd/fx/components/FXThreePreview.tsx"],"names":["THREE","THREE2","THREE3","forwardRef","useRef","useEffect","useImperativeHandle","OutlineEffect","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Camera","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal","THREE4","Shuffle","ListMusic","Search","Loader2","useMusic","AlertCircle","RefreshCw","CameraOff","CloseIcon","THREE5"],"mappings":"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","file":"index.js","sourcesContent":["\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 * 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","import React, { useEffect, useRef, forwardRef, useImperativeHandle } 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';\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 for (let i = 0; i < 3; i++) {\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}\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 // 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 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 // 🕐 运行时间追踪 - 用于 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 isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\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 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 // 保存原始的 Ammo 构造函数,以便在 _createWorld 中使用\n const originalBtDefaultCollisionConfiguration = Ammo.btDefaultCollisionConfiguration;\n const originalBtCollisionDispatcher = Ammo.btCollisionDispatcher;\n const originalBtDbvtBroadphase = Ammo.btDbvtBroadphase;\n const originalBtSequentialImpulseConstraintSolver = Ammo.btSequentialImpulseConstraintSolver;\n const originalBtDiscreteDynamicsWorld = Ammo.btDiscreteDynamicsWorld;\n \n // Monkey patch Ammo 构造函数来拦截创建过程\n // ⚠️ 关键修改:使用数组来保存所有对象,而不是只保存最后一个\n const componentsRef = physicsComponentsRef.current;\n \n Ammo.btDefaultCollisionConfiguration = function(...args: any[]) {\n const obj = new originalBtDefaultCollisionConfiguration(...args);\n componentsRef.configs.push(obj); // 🎯 添加到数组而不是覆盖\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...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 // Scene\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 // 音频监听器\n const listener = new THREE.AudioListener();\n camera.add(listener);\n audioListenerRef.current = listener;\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 // 默认色调映射(FX文件可以覆盖此设置)\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n \n // 5. 关键检查点:在操作 DOM 之前再次检查\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 // Shadow\n if (stage.enableShadow !== false && !mobileOptimization.reduceShadowQuality) {\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n \n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 🎯 初始化渲染特效\n // Outline Effect\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 // 🎯 1. 先创建光源(FX配置可能需要更新它们)\n const ambientLight = new THREE.AmbientLight(0xffffff, stage.ambientLightIntensity ?? 0.5);\n scene.add(ambientLight);\n\n const dirLight = new THREE.DirectionalLight(0xffffff, stage.directionalLightIntensity ?? 0.8);\n dirLight.position.set(0, 10, 0);\n if (stage.enableShadow !== false) {\n dirLight.castShadow = true;\n dirLight.shadow.mapSize.width = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.mapSize.height = mobileOptimization.enabled ? 1024 : 2048;\n dirLight.shadow.bias = -0.0001;\n }\n scene.add(dirLight);\n\n // 🎨 2. 加载并解析FX文件(在光源创建后,可以更新光源配置)\n if (fxConfigs && fxConfigs.length > 0) {\n // 多FX模式:支持同时加载多个.fx和.x文件\n try {\n console.log('[MMDPlayerBase] Loading multiple FX files:', fxConfigs.length);\n const multiFX = new MultiFXAdapter({\n mergeStrategy: 'override',\n autoLoadTextures: true,\n });\n \n // 批量加载所有FX文件\n await multiFX.addMultipleFX(fxConfigs);\n multiFXAdapterRef.current = multiFX;\n \n // 打印配置(调试)\n multiFX.printConfig();\n \n // 应用到场景(更新已有光照、阴影等)\n multiFX.applyToScene(scene, renderer);\n \n console.log('[MMDPlayerBase] Multiple FX files loaded successfully');\n } catch (error) {\n console.error('[MMDPlayerBase] Failed to load multiple FX files:', error);\n // FX加载失败不影响基础渲染\n }\n } else if (fxPath) {\n // 单FX模式:兼容旧API\n try {\n console.log('[MMDPlayerBase] Loading single FX file:', fxPath);\n const parser = new FXParser();\n const fxEffect = await parser.loadAndParse(fxPath);\n fxEffectRef.current = fxEffect;\n \n // 创建FX适配器\n const fxAdapter = new FXToThreeAdapter(fxEffect, fxTexturePath || '');\n fxAdapterRef.current = fxAdapter;\n \n // 加载FX纹理\n console.log('[MMDPlayerBase] Loading FX textures...');\n await fxAdapter.loadTextures();\n \n // 🎯 只应用渲染器配置,不添加新光源(因为已经创建了)\n console.log('[MMDPlayerBase] Applying FX render config (renderer only)...');\n const renderConfig = fxAdapter.extractRenderConfig();\n \n // 应用色调映射\n if (renderConfig.toneMapping !== undefined) {\n renderer.toneMapping = renderConfig.toneMapping;\n console.log('[MMDPlayerBase] Applied toneMapping from FX:', renderConfig.toneMapping === THREE.NoToneMapping ? 'NoToneMapping' : 'ACESFilmicToneMapping');\n }\n if (renderConfig.toneMappingExposure !== undefined) {\n renderer.toneMappingExposure = renderConfig.toneMappingExposure;\n }\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 // 🎯 更新已有光源的强度(如果FX有配置)\n if (renderConfig.ambientLightIntensity !== undefined) {\n ambientLight.intensity = renderConfig.ambientLightIntensity;\n console.log('[MMDPlayerBase] Updated ambient light from FX:', renderConfig.ambientLightIntensity);\n }\n if (renderConfig.directionalLightIntensity !== undefined) {\n dirLight.intensity = renderConfig.directionalLightIntensity;\n console.log('[MMDPlayerBase] Updated directional light from FX:', renderConfig.directionalLightIntensity);\n }\n if (renderConfig.lightDirection) {\n dirLight.position.copy(renderConfig.lightDirection).multiplyScalar(10);\n }\n \n console.log('[MMDPlayerBase] FX file loaded successfully');\n } catch (error) {\n console.error('[MMDPlayerBase] Failed to load FX file:', error);\n // FX加载失败不影响基础渲染\n }\n }\n\n // Controls\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.minDistance = 10;\n controls.maxDistance = 100;\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);\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 // 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 \n // 关键检查点:资源加载耗时较长,再次检查是否已失效\n if (checkCancelled()) return;\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n }\n\n // 设置模型基础属性\n mesh.castShadow = true; // 保留:模型投射阴影到地面\n mesh.receiveShadow = false; // 🎯 优化:模型不接收阴影(避免头发、腿部等自阴影)\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\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 // 计算模型边界并自动聚焦\n const box = new THREE.Box3().setFromObject(mesh);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n\n if (!stage.cameraTarget) {\n // 对于人形模型,聚焦在胸部/头部之间的位置(center.y + 30-40% 高度)\n controls.target.set(center.x, center.y + size.y * 0.35, center.z);\n \n if (!stage.cameraPosition) {\n // MMD 模型通常正面朝向 -Z 轴,相机应该在 +Z 方向\n // 距离基于模型尺寸,确保能看到全身\n const maxDim = Math.max(size.x, size.y, size.z);\n const dist = maxDim * 2.0; // 增加距离系数\n \n // 相机位置:在模型前方(+Z),稍微抬高(俯视角度)\n camera.position.set(\n center.x, // X: 水平对齐\n center.y + size.y * 0.6, // Y: 稍高于模型中心(眼睛平视或略俯视)\n center.z + dist // Z: 在模型正前方(+Z 方向)\n );\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n // 🎯 应用描边设置到模型材质\n // MMD 模型通常在材质的 userData.outlineParameters 中带有来自 PMX 的描边参数\n // 我们需要覆盖它们以使 props.outlineOptions 生效\n console.log('[MMDPlayerBase] 🎨 Traversing model mesh to apply FX and outline, multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n let materialCount = 0;\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 materialCount += materials.length;\n materials.forEach((m) => {\n if (!m.userData) m.userData = {};\n if (!m.userData.outlineParameters) {\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 } else {\n // 覆盖来自模型的默认值\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 // 🎨 应用FX材质配置(如果有)\n // 支持MeshPhongMaterial和MeshToonMaterial(MMD常用)\n if (m instanceof THREE.MeshPhongMaterial || m instanceof THREE.MeshToonMaterial) {\n console.log('[MMDPlayerBase] 🎨 Applying FX to model material (type:', m.type, '), multiFX:', !!multiFXAdapterRef.current, 'singleFX:', !!fxAdapterRef.current);\n // 优先使用多FX适配器\n if (multiFXAdapterRef.current) {\n console.log('[MMDPlayerBase] Using MultiFXAdapter');\n multiFXAdapterRef.current.applyToMaterial(m, 'model');\n } else if (fxAdapterRef.current) {\n console.log('[MMDPlayerBase] Using single FXAdapter');\n // 回退到单FX适配器\n const materialConfig = fxAdapterRef.current.extractMaterialConfig();\n \n // 🔍 调试:打印提取的配置\n console.log('[MMDPlayerBase] Extracted material config:');\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:', materialConfig.color);\n } else {\n console.log('[MMDPlayerBase] Skipping black color (0,0,0) 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:', 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:', materialConfig.specular);\n }\n \n // 应用光泽度\n if (materialConfig.shininess !== undefined && (m as any).shininess !== undefined) {\n console.log('[MMDPlayerBase] Applying shininess:', materialConfig.shininess);\n (m as any).shininess = materialConfig.shininess;\n }\n }\n } else {\n console.log('[MMDPlayerBase] Material type not supported for FX:', m.type);\n }\n });\n }\n });\n console.log('[MMDPlayerBase] 🎨 Model traverse complete, processed materials:', materialCount);\n\n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\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 \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 // 提示浏览器可以进行垃圾回收(只在开发环境)\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 if (!audioListenerRef.current || !helperRef.current || !resources.audioPath) return;\n\n const listener = audioListenerRef.current;\n const helper = helperRef.current;\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 track loaded successfully');\n \n if (isPlayingRef.current) {\n sound.play();\n }\n },\n undefined,\n (err) => console.error('[MMDPlayerBase] Failed to load audio track:', err)\n );\n }, [resources.audioPath, volume]);\n\n // 监听 showAxes 变化,动态添加/移除坐标轴\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 && stage.directionalLightIntensity !== undefined) {\n obj.intensity = stage.directionalLightIntensity;\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 }, [stage.backgroundColor, stage.backgroundImage, stage.ambientLightIntensity, stage.directionalLightIntensity, stage.cameraPosition, stage.cameraTarget]);\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 // 使用选定的渲染方式\n if (renderEffect === 'outline' && outlineEffectRef.current) {\n outlineEffectRef.current.render(sceneRef.current, cameraRef.current);\n } else {\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', // 恢复 relative,作为 canvas 的定位容器\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';\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={`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={`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={`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';\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={`group flex items-center gap-3 rounded-lg p-3 transition-all ${\n currentId === item.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\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={`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={`relative flex flex-col items-center gap-2 rounded-lg p-2 text-center transition-all ${\n currentVal === opt.id \n ? 'bg-blue-500/20 ring-1 ring-blue-500' \n : 'bg-white/5 hover:bg-white/10'\n }`}\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={`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';\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={`h-full transition-all duration-300 ${\n (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 }`}\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={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\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 { 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={`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={`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';\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={`px-2 py-0.5 rounded text-[10px] font-bold uppercase ${\n preloadStrategy === 'all' ? 'bg-red-600 text-white' :\n preloadStrategy === 'next' ? 'bg-yellow-600 text-white' :\n 'bg-gray-700 text-gray-400'\n }`}>\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={`px-1.5 py-0.5 rounded text-[10px] ${\n idx === currentIndex\n ? 'bg-green-600 text-white font-bold'\n : 'bg-gray-700 text-gray-300'\n }`}\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={`h-full transition-all duration-300 ${\n (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 }`}\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={`px-2 py-1 rounded text-[10px] flex items-center justify-between ${\n 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 >\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={`px-2 py-0.5 rounded text-[10px] font-bold ${\n active\n ? 'bg-green-600 text-white'\n : 'bg-gray-700 text-gray-400'\n }`}\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 {\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={`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={`transition-opacity duration-300 ${\n isPlaying && !showPlaylist ? 'opacity-0 group-hover:opacity-100' : 'opacity-100'\n }`}\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={`w-full flex items-center gap-3 p-3 rounded-lg mb-2 transition-all ${\n index === currentIndex\n ? 'bg-blue-600 text-white'\n : 'bg-gray-800 text-gray-300 hover:bg-gray-700'\n }`}\n >\n {/* 序号 */}\n <div\n className={`flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold ${\n index === currentIndex ? 'bg-white/20' : 'bg-gray-700'\n }`}\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","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DialogueBoxProps, DialogueBoxTheme } from './types';\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={`${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={`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 }`}\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';\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={`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","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\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={`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","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\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\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-[1000000] 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}) => {\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={`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 <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 </VNModal>\n\n <VNModal title={aboutText} show={showAbout} onClose={() => setShowAbout(false)}>\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 </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\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}) => {\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 />\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';\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={`\n fixed bottom-32 right-8\n px-6 py-3 rounded-full\n bg-gradient-to-r from-pink-500 to-purple-500\n hover:from-pink-600 hover:to-purple-600\n active:scale-95\n text-white font-bold text-lg\n shadow-lg hover:shadow-xl\n transition-all duration-200\n 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';\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={`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 { 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 {\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 showSkipButton = true,\n showAutoButton = true,\n showHistoryButton = true,\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 // 添加对话到历史记录\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 console.log('[MMDVisualNovel] VMD not finished, showing confirmation');\n setPendingNodeIndex(nodeIndex);\n return;\n }\n\n console.log(`[MMDVisualNovel] 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 console.log(`[MMDVisualNovel] Transition to node ${nodeIndex} completed, waiting for model load`);\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 console.log(`[MMDVisualNovel] Branching: ${key}=${val} -> node ${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 console.log('[MMDVisualNovel] 到达最后一个节点,显示循环确认对话框');\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 console.log('[MMDVisualNovel] 快进到最后,显示循环确认对话框');\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 console.log('[MMDVisualNovel] 回到开始页面');\n }, [initialNodeIndex, initialDialogueIndex]);\n\n // 处理应援按钮点击\n const handleCheer = useCallback(() => {\n console.log('[MMDVisualNovel] 触发应援效果');\n cheerParticlesRef.current?.trigger();\n }, []);\n\n // 重新开始(从第一个节点)\n const handleRestartLoop = useCallback(() => {\n setShowLoopConfirm(false);\n goToNode(0, true);\n console.log('[MMDVisualNovel] 重新开始循环');\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={`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 console.log('[MMDVisualNovel] MMDPlayerBase onLoad called');\n setIsLoading(false);\n // 如果已经开始游戏,启动动画播放(使用 ref 获取最新值)\n if (isStartedRef.current) {\n console.log('[MMDVisualNovel] Game already started, triggering play');\n setTimeout(() => {\n playerRef.current?.play();\n }, 100);\n }\n }}\n onPlay={() => {\n // 动画开始播放时才设置为 true\n console.log('[MMDVisualNovel] MMDPlayerBase onPlay called');\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 console.log('[MMDVisualNovel] VMD finished/looped, marking as finished');\n isVmdFinishedRef.current = true;\n setIsVmdFinished(true);\n }\n }\n lastAnimationTimeRef.current = time;\n }}\n onEnded={() => {\n console.log('[MMDVisualNovel] 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={(() => {\n const shouldShowLoading = (isLoading || isTransitioning || !isAnimationPlaying) && isStarted;\n console.log('[MMDVisualNovel] LoadingOverlay conditions:', {\n isLoading,\n isTransitioning,\n isAnimationPlaying,\n isStarted,\n shouldShowLoading\n });\n return shouldShowLoading;\n })()}\n showStartScreen={!isStarted}\n scriptName={script.name}\n loadingText=\"正在准备场景中...\"\n startText={startText}\n settingsText={settingsText}\n aboutText={aboutText}\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory && !showChoices && !showLoopConfirm;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\n showChoices,\n showLoopConfirm,\n shouldShow,\n dialogue: currentDialogue\n });\n \n return shouldShow ? (\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 {/* 确认跳过动画弹窗 */}\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 console.log(`[MMDVisualNovel] 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';\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={`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';\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={`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={`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={`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';\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={`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","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 {\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={`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={`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 React, { \n useEffect, \n useRef, \n useState, \n useCallback, \n forwardRef, \n useImperativeHandle \n} from 'react';\nimport { MMDPlayerBase } from '../components/MMDPlayerBase';\nimport { MMDPlayerBaseRef, MMDResources } from '../types';\nimport { MMDARPlayerProps, MMDARPlayerRef } from './types';\nimport { Camera, CameraOff, RefreshCw, AlertCircle, Settings, X as CloseIcon, Check } from 'lucide-react';\n\n/**\n * MMDARPlayer - 基于实时摄像头的 MMD 增强现实播放器\n * \n * 功能:\n * - 调用设备摄像头作为背景\n * - 叠加透明背景的 MMD 模型渲染\n * - 支持前后摄像头切换\n * - 针对 AR 场景优化模型光照与定位\n */\nexport const MMDARPlayer = forwardRef<MMDARPlayerRef, MMDARPlayerProps>((props, ref) => {\n const {\n resources,\n stage = {},\n mobileOptimization,\n cameraConfig = { facingMode: 'user' },\n mirrored,\n showSettings = true,\n autoPlay = true,\n loop = true,\n onCameraReady,\n onCameraError,\n onResourcesChange,\n onLoad,\n onError,\n className,\n style,\n } = props;\n\n // Refs\n const videoRef = useRef<HTMLVideoElement>(null);\n const playerRef = useRef<MMDPlayerBaseRef>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n // States\n const [isCameraStarted, setIsCameraStarted] = useState(false);\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [facingMode, setFacingMode] = useState<'user' | 'environment'>(cameraConfig.facingMode || 'user');\n const [isLoading, setIsLoading] = useState(true);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [currentResources, setCurrentResources] = useState<MMDResources>(resources);\n const [tempResources, setTempResources] = useState<MMDResources>(resources);\n\n // 当外部 resources 变化时,同步内部资源(如果设置面板没打开)\n useEffect(() => {\n if (!isSettingsOpen) {\n setCurrentResources(resources);\n setTempResources(resources);\n }\n }, [resources, isSettingsOpen]);\n\n // 镜像逻辑:如果是前置摄像头且未明确指定 mirrored,则默认开启镜像\n const shouldMirror = mirrored !== undefined ? mirrored : facingMode === 'user';\n\n /**\n * 开启摄像头\n */\n const startCamera = useCallback(async (mode: 'user' | 'environment' = facingMode) => {\n try {\n setCameraError(null);\n \n // 如果已有流,先停止\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n\n const constraints: MediaStreamConstraints = {\n video: {\n facingMode: mode,\n width: cameraConfig.width || { ideal: 1280 },\n height: cameraConfig.height || { ideal: 720 },\n },\n audio: false\n };\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n streamRef.current = stream;\n\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n await videoRef.current.play();\n }\n\n setIsCameraStarted(true);\n setFacingMode(mode);\n onCameraReady?.(stream);\n } catch (err: any) {\n console.error('[MMDARPlayer] Camera access error:', err);\n const errorMsg = err.name === 'NotAllowedError' ? '摄像头权限被拒绝' : `无法访问摄像头: ${err.message}`;\n setCameraError(errorMsg);\n onCameraError?.(err instanceof Error ? err : new Error(errorMsg));\n }\n }, [facingMode, cameraConfig, onCameraReady, onCameraError]);\n\n /**\n * 关闭摄像头\n */\n const stopCamera = useCallback(() => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n streamRef.current = null;\n }\n if (videoRef.current) {\n videoRef.current.srcObject = null;\n }\n setIsCameraStarted(false);\n }, []);\n\n /**\n * 切换摄像头\n */\n const switchCamera = useCallback(async () => {\n const newMode = facingMode === 'user' ? 'environment' : 'user';\n await startCamera(newMode);\n }, [facingMode, startCamera]);\n\n /**\n * 截图 (包含视频背景和模型)\n */\n const snapshot = useCallback(async (): Promise<string> => {\n if (!videoRef.current || !playerRef.current) return '';\n\n const canvas = document.createElement('canvas');\n const video = videoRef.current;\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) return '';\n\n // 1. 绘制视频背景\n if (shouldMirror) {\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n if (shouldMirror) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n\n // 2. 绘制 MMD 模型 (WebGL Canvas)\n const mmdBase64 = playerRef.current.snapshot();\n const mmdImg = new Image();\n mmdImg.src = mmdBase64;\n \n await new Promise((resolve) => {\n mmdImg.onload = () => {\n // MMD 模型通常需要拉伸到与视频一致的尺寸(或者保持比例居中)\n ctx.drawImage(mmdImg, 0, 0, canvas.width, canvas.height);\n resolve(null);\n };\n });\n\n return canvas.toDataURL('image/png');\n }, [shouldMirror]);\n\n // 暴露接口\n useImperativeHandle(ref, () => ({\n startCamera,\n stopCamera,\n switchCamera,\n snapshot\n }));\n\n // 组件挂载时自动开启摄像头 (如果 autoPlay 为 true)\n useEffect(() => {\n if (autoPlay) {\n startCamera();\n }\n return () => stopCamera();\n }, [autoPlay, startCamera, stopCamera]);\n\n return (\n <div \n className={`relative w-full h-full bg-black overflow-hidden ${className}`} \n style={style}\n >\n {/* 1. 摄像头视频背景层 */}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover transition-transform duration-500 ${shouldMirror ? 'scale-x-[-1]' : ''}`}\n style={{ zIndex: 0 }}\n />\n\n {/* 2. MMD 模型层 - 必须设置背景透明 */}\n <div \n className=\"absolute inset-0 w-full h-full\" \n style={{ zIndex: 1 }}\n >\n <MMDPlayerBase\n ref={playerRef}\n resources={currentResources}\n stage={{\n ...stage,\n backgroundColor: 'transparent', // 强制透明背景\n cameraPosition: stage.cameraPosition || { x: 0, y: 15, z: 40 }, // 针对 AR 场景稍调高相机\n }}\n mobileOptimization={mobileOptimization}\n autoPlay={autoPlay}\n loop={loop}\n onLoad={() => {\n setIsLoading(false);\n onLoad?.();\n }}\n onError={onError}\n />\n </div>\n\n {/* 3. UI 交互层 */}\n <div className=\"absolute inset-0 z-10 pointer-events-none flex flex-col justify-between p-6\">\n <div className=\"flex justify-between items-start pointer-events-auto\">\n {cameraError ? (\n <div className=\"bg-red-500/80 backdrop-blur-md text-white px-4 py-2 rounded-full flex items-center gap-2 text-sm\">\n <AlertCircle className=\"w-4 h-4\" />\n {cameraError}\n <button \n onClick={() => startCamera()}\n className=\"ml-2 underline\"\n >\n 重试\n </button>\n </div>\n ) : (\n <div className=\"bg-black/40 backdrop-blur-md text-white px-4 py-2 rounded-full flex items-center gap-2 text-sm\">\n <Camera className=\"w-4 h-4 text-green-400\" />\n {isCameraStarted ? '实景 AR 模式已开启' : '等待摄像头...'}\n </div>\n )}\n \n <div className=\"flex flex-col gap-2\">\n {showSettings && (\n <button\n onClick={() => setIsSettingsOpen(!isSettingsOpen)}\n className={`p-3 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto ${isSettingsOpen ? 'bg-blue-500' : 'bg-white/10 hover:bg-white/20'}`}\n title=\"设置模型与动作\"\n >\n <Settings className=\"w-5 h-5\" />\n </button>\n )}\n <button\n onClick={switchCamera}\n className=\"p-3 bg-white/10 hover:bg-white/20 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto\"\n title=\"切换前后摄像头\"\n >\n <RefreshCw className=\"w-5 h-5\" />\n </button>\n <button\n onClick={isCameraStarted ? stopCamera : () => startCamera()}\n className={`p-3 backdrop-blur-md rounded-full text-white transition-all active:scale-95 pointer-events-auto ${isCameraStarted ? 'bg-red-500/20 hover:bg-red-500/40' : 'bg-green-500/20 hover:bg-green-500/40'}`}\n title={isCameraStarted ? '关闭摄像头' : '开启摄像头'}\n >\n {isCameraStarted ? <CameraOff className=\"w-5 h-5\" /> : <Camera className=\"w-5 h-5\" />}\n </button>\n </div>\n </div>\n\n {/* 4. 设置面板 */}\n {isSettingsOpen && (\n <div className=\"absolute top-20 right-6 w-80 bg-black/80 backdrop-blur-xl border border-white/10 rounded-2xl p-6 pointer-events-auto shadow-2xl animate-in slide-in-from-right-4 duration-300\">\n <div className=\"flex items-center justify-between mb-6\">\n <h3 className=\"text-white font-bold flex items-center gap-2\">\n <Settings className=\"w-4 h-4\" />\n 资源设置\n </h3>\n <button \n onClick={() => setIsSettingsOpen(false)}\n className=\"p-1 hover:bg-white/10 rounded-full transition-colors text-white/60\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-white/50 mb-1.5 ml-1 uppercase tracking-wider\">模型路径 (.pmx)</label>\n <input\n type=\"text\"\n value={tempResources.modelPath}\n onChange={(e) => setTempResources({ ...tempResources, modelPath: e.target.value })}\n placeholder=\"请输入模型 URL...\"\n className=\"w-full bg-white/5 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-white placeholder:text-white/10 focus:outline-none focus:border-blue-500/50 transition-colors\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-white/50 mb-1.5 ml-1 uppercase tracking-wider\">动作路径 (.vmd)</label>\n <input\n type=\"text\"\n value={tempResources.motionPath || ''}\n onChange={(e) => setTempResources({ ...tempResources, motionPath: e.target.value })}\n placeholder=\"请输入动作 URL...\"\n className=\"w-full bg-white/5 border border-white/10 rounded-xl px-4 py-2.5 text-sm text-white placeholder:text-white/10 focus:outline-none focus:border-blue-500/50 transition-colors\"\n />\n </div>\n\n <div className=\"pt-2\">\n <button\n onClick={() => {\n setCurrentResources(tempResources);\n onResourcesChange?.(tempResources);\n setIsSettingsOpen(false);\n setIsLoading(true);\n }}\n className=\"w-full bg-blue-500 hover:bg-blue-600 text-white font-bold py-3 rounded-xl flex items-center justify-center gap-2 transition-all active:scale-95 shadow-lg shadow-blue-500/20\"\n >\n <Check className=\"w-4 h-4\" />\n 应用更改\n </button>\n </div>\n </div>\n </div>\n )}\n\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-12 h-12 border-4 border-blue-500/30 border-t-blue-500 rounded-full animate-spin\" />\n <div className=\"text-white text-sm font-medium bg-black/40 px-3 py-1 rounded-full backdrop-blur-sm\">\n 正在加载 Miku 资源...\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n});\n\nMMDARPlayer.displayName = 'MMDARPlayer';\n\nexport default MMDARPlayer;\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 * 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';\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={`fx-viewer loading ${className}`}>\n <div className=\"fx-viewer-spinner\">加载中...</div>\n </div>\n );\n }\n\n if (error || !effect || !summary) {\n return (\n <div className={`fx-viewer error ${className}`}>\n <div className=\"fx-viewer-error\">\n <h3>❌ 解析错误</h3>\n <p>{error || '未知错误'}</p>\n </div>\n </div>\n );\n }\n\n const validation = validateFXEffect(effect);\n\n return (\n <div className={`fx-viewer ${className}`}>\n <div className=\"fx-viewer-header\">\n <h2>{effect.fileName}</h2>\n <p className=\"fx-viewer-config-summary\">{getConfigSummaryText(effect)}</p>\n </div>\n\n <div className=\"fx-viewer-tabs\">\n <button\n className={activeTab === 'summary' ? 'active' : ''}\n onClick={() => setActiveTab('summary')}\n >\n 摘要\n </button>\n <button\n className={activeTab === 'defines' ? 'active' : ''}\n onClick={() => setActiveTab('defines')}\n >\n 宏定义 ({summary.defineCount})\n </button>\n <button\n className={activeTab === 'textures' ? 'active' : ''}\n onClick={() => setActiveTab('textures')}\n >\n 纹理 ({summary.textureCount})\n </button>\n <button\n className={activeTab === 'parameters' ? 'active' : ''}\n onClick={() => setActiveTab('parameters')}\n >\n 参数 ({summary.parameterCount})\n </button>\n <button\n className={activeTab === 'validation' ? 'active' : ''}\n onClick={() => setActiveTab('validation')}\n >\n 验证\n </button>\n </div>\n\n <div className=\"fx-viewer-content\">\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 className=\"fx-tab-summary\">\n <div className=\"fx-stats-grid\">\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">宏定义</div>\n <div className=\"fx-stat-value\">{summary.defineCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">参数</div>\n <div className=\"fx-stat-value\">{summary.parameterCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">纹理</div>\n <div className=\"fx-stat-value\">{summary.textureCount}</div>\n </div>\n <div className=\"fx-stat-card\">\n <div className=\"fx-stat-label\">Technique</div>\n <div className=\"fx-stat-value\">{summary.techniqueCount}</div>\n </div>\n </div>\n\n <div className=\"fx-features\">\n <h3>功能特性</h3>\n <div className=\"fx-feature-list\">\n <div className={`fx-feature ${summary.hasLocalShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasLocalShadow ? '✓' : '✗'} LocalShadow\n </div>\n <div className={`fx-feature ${summary.hasExcellentShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasExcellentShadow ? '✓' : '✗'} ExcellentShadow\n </div>\n <div className={`fx-feature ${summary.hasHgShadow ? 'enabled' : 'disabled'}`}>\n {summary.hasHgShadow ? '✓' : '✗'} HgShadow\n </div>\n </div>\n </div>\n\n {effect.includes.length > 0 && (\n <div className=\"fx-includes\">\n <h3>包含文件</h3>\n <ul>\n {effect.includes.map((inc, idx) => (\n <li key={idx}><code>{inc}</code></li>\n ))}\n </ul>\n </div>\n )}\n\n {effect.controllers.length > 0 && (\n <div className=\"fx-controllers\">\n <h3>控制器</h3>\n <ul>\n {effect.controllers.map((ctrl, idx) => (\n <li key={idx}>\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 className=\"fx-tab-defines\">\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>值</th>\n <th>状态</th>\n <th>行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.defines.map((define, idx) => (\n <tr key={idx} className={define.isCommented ? 'disabled' : 'enabled'}>\n <td><code>{define.name}</code></td>\n <td>{define.value || '-'}</td>\n <td>\n <span className={`status-badge ${define.isCommented ? 'disabled' : 'enabled'}`}>\n {define.isCommented ? '禁用' : '启用'}\n </span>\n </td>\n <td>{define.lineNumber}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst TexturesTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div className=\"fx-tab-textures\">\n {effect.textures.length === 0 ? (\n <p className=\"fx-empty-message\">未找到纹理定义</p>\n ) : (\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>路径</th>\n <th>尺寸</th>\n <th>用途</th>\n </tr>\n </thead>\n <tbody>\n {effect.textures.map((texture, idx) => (\n <tr key={idx}>\n <td><code>{texture.name}</code></td>\n <td>{texture.path}</td>\n <td>{texture.width && texture.height ? `${texture.width}×${texture.height}` : '-'}</td>\n <td>{texture.purpose || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n);\n\nconst ParametersTab: React.FC<{ effect: FXEffect }> = ({ effect }) => (\n <div className=\"fx-tab-parameters\">\n <table className=\"fx-table\">\n <thead>\n <tr>\n <th>名称</th>\n <th>类型</th>\n <th>语义</th>\n <th>默认值</th>\n <th>行号</th>\n </tr>\n </thead>\n <tbody>\n {effect.parameters.map((param, idx) => (\n <tr key={idx}>\n <td><code>{param.name}</code></td>\n <td><code>{param.type}</code></td>\n <td>{param.semantic || '-'}</td>\n <td>{param.defaultValue || '-'}</td>\n <td>{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 className=\"fx-tab-validation\">\n <div className={`fx-validation-status ${validation.isValid ? 'valid' : 'invalid'}`}>\n <h3>{validation.isValid ? '✓ 验证通过' : '✗ 验证失败'}</h3>\n </div>\n\n {validation.errors.length > 0 && (\n <div className=\"fx-validation-section fx-errors\">\n <h4>错误 ({validation.errors.length})</h4>\n <ul>\n {validation.errors.map((error, idx) => (\n <li key={idx} className=\"fx-error-item\">{error}</li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.warnings.length > 0 && (\n <div className=\"fx-validation-section fx-warnings\">\n <h4>警告 ({validation.warnings.length})</h4>\n <ul>\n {validation.warnings.map((warning, idx) => (\n <li key={idx} className=\"fx-warning-item\">{warning}</li>\n ))}\n </ul>\n </div>\n )}\n\n {validation.isValid && validation.warnings.length === 0 && (\n <p className=\"fx-success-message\">FX文件结构完整,没有发现问题。</p>\n )}\n </div>\n);\n\nFXViewer.displayName = 'FXViewer';\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';\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={`fx-three-preview loading ${className}`}>\n <div className=\"preview-loading\">加载中...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`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={`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"]}