sa2kit 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mmd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mmd/utils/ammo-loader.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/MMDVisualNovel.tsx"],"names":["THREE","forwardRef","useRef","useImperativeHandle","useEffect","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal"],"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","import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls, MMDLoader, MMDAnimationHelper } from 'three-stdlib';\nimport { loadAmmo } from '../utils/ammo-loader';\nimport { MMDPlayerBaseProps, MMDPlayerBaseRef } from '../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 console.log(`[MMDPlayerBase] Found ${meshCount} meshes and ${textures.length} unique textures`);\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 console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: No image`);\n resolve();\n return;\n }\n \n if (image instanceof HTMLImageElement) {\n if (image.complete && image.naturalWidth > 0) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Already loaded`);\n resolve();\n } else {\n // 等待图像加载\n const onLoad = () => {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Loaded`);\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 console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Non-image type`);\n resolve();\n }\n });\n });\n \n await Promise.all(texturePromises);\n console.log('[MMDPlayerBase] All texture images loaded');\n \n // 强制更新所有材质的纹理需要更新标志\n textures.forEach((texture) => {\n texture.needsUpdate = true;\n });\n \n // 执行几次渲染循环,确保所有纹理都上传到 GPU\n console.log('[MMDPlayerBase] Warming up renderer...');\n for (let i = 0; i < 3; i++) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n renderer.render(scene, camera);\n console.log(`[MMDPlayerBase] Warmup render ${i + 1}/3`);\n resolve();\n });\n });\n }\n \n console.log('[MMDPlayerBase] All materials and textures fully ready');\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 className,\n style,\n } = props;\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 controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<any>(null); // MMDAnimationHelper\n const axesHelperRef = useRef<THREE.AxesHelper | null>(null); // 坐标轴\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const animationIdRef = useRef<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n \n // 状态 Refs\n const 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 \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 onPlay?.();\n },\n pause: () => {\n if (!isPlayingRef.current) return;\n isPlayingRef.current = false;\n clockRef.current.stop();\n onPause?.();\n },\n stop: () => {\n isPlayingRef.current = false;\n clockRef.current.stop();\n 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 }));\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 console.log('[MMDPlayerBase] 🕐 系统启动时间:', new Date(startTimeRef.current).toLocaleString());\n } else {\n // 模型切换\n modelSwitchCountRef.current++;\n const runningTime = Date.now() - startTimeRef.current;\n const minutes = Math.floor(runningTime / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n console.log(`[MMDPlayerBase] 🔄 模型切换 #${modelSwitchCountRef.current} (运行时间: ${minutes}分${seconds}秒)`);\n }\n\n try {\n // 4. 物理引擎加载\n if (stage.enablePhysics !== false && !mobileOptimization.disablePhysics) {\n console.log('[MMDPlayerBase] Loading Ammo.js physics engine...');\n await loadAmmo(stage.physicsPath);\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] Ammo.js loaded successfully');\n \n // 🎯 关键修复:Hook MMDPhysics._createWorld 以捕获物理引擎组件\n // 这样我们可以在清理时正确销毁它们,防止 WASM 内存泄漏\n const Ammo = (window as any).Ammo;\n if (Ammo) {\n console.log('[MMDPlayerBase] Setting up physics component tracking...');\n \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 console.log(`[MMDPlayerBase] 🔍 Captured btDefaultCollisionConfiguration #${componentsRef.configs.length}`);\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btCollisionDispatcher #${componentsRef.dispatchers.length}`);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDbvtBroadphase #${componentsRef.caches.length}`);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btSequentialImpulseConstraintSolver #${componentsRef.solvers.length}`);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...args);\n componentsRef.worlds.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDiscreteDynamicsWorld #${componentsRef.worlds.length}`);\n return obj;\n };\n \n console.log('[MMDPlayerBase] ✅ Physics component tracking setup complete');\n }\n } else {\n console.log('[MMDPlayerBase] Physics disabled');\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) {\n scene.background = new THREE.Color(stage.backgroundColor);\n }\n sceneRef.current = scene;\n\n // Camera\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\n if (stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n camera.position.set(pos.x, pos.y, pos.z);\n } else {\n camera.position.set(0, 20, 30);\n }\n cameraRef.current = camera;\n\n // Renderer\n const renderer = new THREE.WebGLRenderer({ \n antialias: !mobileOptimization.enabled, \n alpha: true, \n preserveDrawingBuffer: true \n });\n renderer.setSize(width, height);\n // 使用更高的像素比例以获得更清晰的渲染效果\n const pixelRatio = mobileOptimization.enabled \n ? (mobileOptimization.pixelRatio || Math.min(window.devicePixelRatio, 2))\n : window.devicePixelRatio;\n renderer.setPixelRatio(pixelRatio);\n console.log('[MMDPlayerBase] Pixel ratio set to:', pixelRatio);\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 // Lights\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(10, 20, 10);\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 // 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 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 console.log('[MMDPlayerBase] Starting render loop (animation paused)');\n animate();\n\n // 6. 资源加载\n console.log('[MMDPlayerBase] Start loading resources...', resources);\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 console.log('[MMDPlayerBase] Loading model with motion:', 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 console.log('[MMDPlayerBase] Loading model only');\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 console.log('[MMDPlayerBase] Model loaded:', mesh);\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n console.log('[MMDPlayerBase] Animation duration:', animation.duration);\n }\n\n // 设置模型基础属性\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\n // 这样可以避免用户看到\"逐个子模型显示\"的过程\n console.log('[MMDPlayerBase] Waiting for all materials and textures to load...');\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 console.log('[MMDPlayerBase] ✅ All materials and textures loaded');\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 console.log('[MMDPlayerBase] Model bounds:', { center, size });\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 console.log('[MMDPlayerBase] Auto camera position:', camera.position);\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\n console.log('[MMDPlayerBase] ✅ Model added to scene (fully loaded)');\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.4 加载音频\n if (resources.audioPath) {\n const listener = new THREE.AudioListener();\n camera.add(listener);\n \n const sound = new THREE.Audio(listener);\n const audioLoader = new THREE.AudioLoader();\n \n audioLoader.load(\n resources.audioPath,\n (buffer) => {\n if (checkCancelled()) return; // Callback check\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 undefined,\n (err) => console.error('Failed to load audio:', err)\n );\n }\n\n // 6.5 加载舞台\n let stageMesh: THREE.Object3D | null = null;\n if (resources.stageModelPath) {\n try {\n stageMesh = await new Promise<THREE.Object3D>((resolve, reject) => {\n loader.load(\n resources.stageModelPath!,\n (mesh) => resolve(mesh),\n undefined,\n (err) => reject(err)\n );\n });\n \n if (checkCancelled()) return;\n \n console.log('[MMDPlayerBase] Stage model loaded:', stageMesh);\n stageMesh.castShadow = true;\n stageMesh.receiveShadow = true;\n \n // 🎯 同样,先等待舞台的材质和纹理加载完成,再添加到场景\n console.log('[MMDPlayerBase] Waiting for stage materials and textures...');\n const tempStageScene = new THREE.Scene();\n tempStageScene.add(stageMesh);\n await waitForMaterialsReady(stageMesh, renderer, tempStageScene, camera);\n tempStageScene.remove(stageMesh);\n \n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] ✅ Stage materials and textures loaded');\n \n // 现在添加到主场景\n scene.add(stageMesh);\n console.log('[MMDPlayerBase] ✅ Stage added to scene (fully loaded)');\n } catch (err) {\n console.error('Failed to load stage:', err);\n }\n }\n\n if (checkCancelled()) return;\n \n // 🎯 所有资源完全加载完成,模型已完全显示,现在可以触发回调并开始播放动画\n isReadyRef.current = true;\n console.log('[MMDPlayerBase] 🎉 All resources fully loaded and ready!');\n console.log('[MMDPlayerBase] 📊 Summary:');\n console.log(`[MMDPlayerBase] - Model: ✅ Fully loaded with all textures`);\n if (resources.stageModelPath) {\n console.log(`[MMDPlayerBase] - Stage: ✅ Fully loaded with all textures`);\n }\n if (animation) {\n console.log(`[MMDPlayerBase] - Animation: ✅ Ready (${animation.duration.toFixed(2)}s)`);\n }\n console.log('[MMDPlayerBase] 🔔 Triggering onLoad callback');\n onLoad?.();\n \n if (autoPlay) {\n // 给一点时间让渲染系统稳定,然后开始播放动画\n setTimeout(() => {\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] 🎬 Starting animation playback (after materials fully loaded)');\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 console.log(`[MMDPlayerBase] Cleaning mesh ${idx}:`, mesh.uuid);\n \n // 🎯 关键修复:从 WeakMap 中获取真正的 meshData\n let meshData: any = null;\n \n if (helperObjects instanceof WeakMap) {\n console.log('[MMDPlayerBase] Accessing WeakMap with mesh as key...');\n meshData = helperObjects.get(mesh);\n \n if (meshData) {\n const meshDataKeys = Object.keys(meshData);\n console.log(`[MMDPlayerBase] ✅ Got meshData from WeakMap, keys (${meshDataKeys.length}):`, meshDataKeys);\n \n // 打印物理相关的属性\n const physicsRelatedKeys = meshDataKeys.filter(k => k.toLowerCase().includes('phys'));\n if (physicsRelatedKeys.length > 0) {\n console.log(`[MMDPlayerBase] Physics-related keys:`, physicsRelatedKeys);\n physicsRelatedKeys.forEach(key => {\n const value = meshData[key];\n console.log(`[MMDPlayerBase] ${key}:`, typeof value, value?.constructor?.name || value);\n });\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No meshData found in WeakMap for this mesh');\n }\n }\n \n // 如果没有从 WeakMap 获取到,使用 mesh 本身作为 fallback\n if (!meshData) {\n console.log('[MMDPlayerBase] Using mesh itself as meshData');\n meshData = mesh;\n }\n \n // 清理物理系统 - 从 meshData 中获取\n const physics = meshData?.physics;\n \n if (physics) {\n try {\n console.log('[MMDPlayerBase] 🎯 Starting physics cleanup for mesh', idx);\n console.log('[MMDPlayerBase] Debug: physics object keys:', Object.keys(physics));\n \n // 优先使用 MMDPhysics.dispose() 方法(three-stdlib 提供的标准清理方法)\n if (typeof physics.dispose === 'function') {\n console.log('[MMDPlayerBase] Calling MMDPhysics.dispose()...');\n physics.dispose();\n console.log('[MMDPlayerBase] ✅ MMDPhysics.dispose() completed');\n } else {\n // 手动清理物理组件\n console.log('[MMDPlayerBase] No dispose method, manually cleaning physics components...');\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 console.log(`[MMDPlayerBase] Cleaning ${physics.bodies.length} rigid bodies...`);\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 console.log('[MMDPlayerBase] ✅ All rigid bodies removed');\n }\n \n // 清理约束\n if (physics.world && Array.isArray(physics.constraints) && physics.constraints.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.constraints.length} constraints...`);\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 console.log('[MMDPlayerBase] ✅ All constraints removed');\n }\n \n // 注意:不在这里销毁 world,因为它会在后面统一清理\n }\n }\n \n // 清除引用\n meshData.physics = null;\n \n console.log('[MMDPlayerBase] ✅ Physics cleanup completed for mesh', idx);\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 } else {\n console.log('[MMDPlayerBase] ⚠️ No physics object found for mesh', idx);\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 console.log('[MMDPlayerBase] 🔥 Starting CRITICAL physics components cleanup...');\n const Ammo = (window as any).Ammo;\n if (Ammo && Ammo.destroy) {\n const components = physicsComponentsRef.current;\n \n console.log(`[MMDPlayerBase] 📊 Physics components count:`, {\n worlds: components.worlds.length,\n solvers: components.solvers.length,\n caches: components.caches.length,\n dispatchers: components.dispatchers.length,\n configs: components.configs.length\n });\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 console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.worlds.length} btDiscreteDynamicsWorld(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDiscreteDynamicsWorld destroyed');\n }\n \n // 销毁所有 solvers\n if (components.solvers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.solvers.length} btSequentialImpulseConstraintSolver(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btSequentialImpulseConstraintSolver destroyed');\n }\n \n // 销毁所有 caches\n if (components.caches.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.caches.length} btDbvtBroadphase(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDbvtBroadphase destroyed');\n }\n \n // 销毁所有 dispatchers\n if (components.dispatchers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.dispatchers.length} btCollisionDispatcher(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btCollisionDispatcher destroyed');\n }\n \n // 销毁所有 configs\n if (components.configs.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.configs.length} btDefaultCollisionConfiguration(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDefaultCollisionConfiguration destroyed');\n }\n \n console.log('[MMDPlayerBase] 🎉 Physics components cleanup completed!');\n } else {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available, skipping physics cleanup');\n }\n \n // 清理 sharedPhysics 和 masterPhysics(如果存在)\n console.log('[MMDPlayerBase] Checking helper-level physics...');\n if ((helperRef.current as any).sharedPhysics) {\n console.log('[MMDPlayerBase] Clearing sharedPhysics reference...');\n (helperRef.current as any).sharedPhysics = null;\n }\n if ((helperRef.current as any).masterPhysics) {\n console.log('[MMDPlayerBase] Clearing masterPhysics reference...');\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 // 清理所有渲染目标\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]); // 关键依赖:当 resources 变了(且没有 key 强制重刷时),执行这个 effect\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 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 onTimeUpdate?.(currentTime);\n \n // 简单的结束检测(非循环模式)\n if (!loopRef.current && duration > 0 && elapsed >= duration) {\n isPlayingRef.current = false;\n clockRef.current.stop();\n onEnded?.();\n }\n }\n \n rendererRef.current.render(sceneRef.current, cameraRef.current);\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 || '#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 } from 'lucide-react';\n\ninterface ControlPanelProps {\n isPlaying: boolean;\n isFullscreen: boolean;\n isLooping: boolean; // 是否单节点循环播放\n isListLooping?: 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}\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n isFullscreen,\n isLooping,\n isListLooping,\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}) => {\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 {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\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}\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 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 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 />\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 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 {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","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","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 opacity-25 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","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 onStart?: () => void;\n /** 自定义类名 */\n className?: string;\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 onStart,\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[StartScreen] Render state:', {\n showStartScreen,\n scriptName,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!showStartScreen) {\n console.log('[StartScreen] 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 cursor-pointer ${className}`}\n style={{\n zIndex: 999999,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n margin: 0,\n padding: 0,\n }}\n onClick={onStart}\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.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n }}\n\n >\n {/* 背景装饰层 - 柔和的彩虹渐变 */}\n <div\n className=\"flex items-center justify-center flex-col inset-0 w-full h-full opacity-30 pointer-events-none\"\n style={{\n background: `linear-gradient(45deg, \n rgba(255, 182, 193, 0.25) 0%, \n rgba(173, 216, 230, 0.25) 25%,\n rgba(221, 160, 221, 0.25) 50%,\n rgba(255, 218, 185, 0.25) 75%,\n rgba(255, 182, 193, 0.25) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n {/* 内容容器 */}\n <div\n className=\"relative z-10 text-center px-16 py-14 rounded-3xl max-w-2xl mx-auto transform transition-all hover:scale-105\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: '2px solid rgba(255, 255, 255, 0.3)',\n boxShadow: `\n 0 12px 48px rgba(255, 255, 255, 0.15),\n 0 4px 16px rgba(255, 255, 255, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.4)\n `,\n }}\n >\n {/* 顶部装饰光效 */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1 margin-auto\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent)',\n }}\n />\n\n {/* 标题 */}\n <h1\n className=\"text-5xl font-bold text-white mb-8 relative\"\n style={{\n textShadow: '0 4px 16px rgba(255, 255, 255, 0.3), 0 2px 8px rgba(0, 0, 0, 0.5)',\n }}\n >\n {scriptName}\n {/* 标题下划线装饰 */}\n <div\n className=\"absolute -bottom-3 left-1/2 transform -translate-x-1/2 h-1 rounded-full\"\n style={{\n width: '60%',\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n </h1>\n\n {/* 开始按钮 */}\n <div\n className=\"inline-block px-10 py-4 rounded-2xl font-bold text-xl text-white transition-all hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '2px solid rgba(255, 255, 255, 0.4)',\n boxShadow: `\n 0 8px 32px rgba(255, 255, 255, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.5)\n `,\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n animation: 'pulse 2s ease-in-out infinite',\n }}\n >\n <span className=\"relative z-10\">{startText}</span>\n </div>\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 </div>\n </div>\n\n </div>\n\n\n\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('start-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'start-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: 999999;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nStartScreen.displayName = 'StartScreen';\n\nexport default StartScreen;\n\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 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 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 onStart={onStart}\n className={className}\n />\n </>\n );\n};\n\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport default LoadingOverlay;\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 {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelNode,\n DialogueLine,\n DialogueHistoryItem,\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 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\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\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 goToNextDialogue = useCallback(() => {\n if (!currentNode) return;\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 {\n // 当前节点对话结束,切换到下一个节点\n const nextNodeIndex = currentNodeIndex + 1;\n\n if (nextNodeIndex < nodes.length) {\n // 还有更多节点\n goToNode(nextNodeIndex);\n } else if (loop) {\n // 循环播放\n goToNode(0);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }\n }, [currentNode, currentDialogueIndex, currentNodeIndex, nodes.length, loop, addToHistory, onDialogueChange, onScriptComplete]);\n\n // 切换到指定节点\n const goToNode = useCallback(\n (nodeIndex: number) => {\n if (nodeIndex < 0 || nodeIndex >= nodes.length) return;\n if (isTransitioning) return;\n\n const node = nodes[nodeIndex];\n if (!node) return;\n\n console.log(`[MMDVisualNovel] Transitioning to node ${nodeIndex}`);\n\n // 🔧 立即设置加载状态,确保遮罩覆盖整个切换过程\n setIsTransitioning(true);\n setIsLoading(true);\n setIsAnimationPlaying(false); // 重置动画播放状态\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]\n );\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 // 切换自动模式\n const toggleAutoMode = useCallback(() => {\n setIsAutoMode((prev) => !prev);\n }, []);\n\n // 快进 - 跳到下一个节点\n const handleSkip = useCallback(() => {\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 setAutoMode: setIsAutoMode,\n skipTyping: () => {\n typingCompleteRef.current = true;\n },\n }),\n [goToNode, goToDialogue, currentNodeIndex, currentDialogueIndex, history]\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 };\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}\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 onError={onError}\n />\n )}\n </div>\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=\"点击开始\"\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\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 showControls={true}\n showSkipButton={showSkipButton}\n showAutoButton={showAutoButton}\n showHistoryButton={showHistoryButton}\n />\n ) : null;\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mmd/utils/ammo-loader.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/MMDVisualNovel.tsx"],"names":["THREE","forwardRef","useRef","useImperativeHandle","useEffect","OrbitControls","MMDLoader","MMDAnimationHelper","mesh","Ammo","React","SkipBack","Pause","Play","SkipForward","Repeat","Repeat1","Grid3x3","Settings","Minimize","Maximize","Video","Check","User","ImageIcon","Music","X","useState","useCallback","StatusBadge","createPortal"],"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","import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls, MMDLoader, MMDAnimationHelper } from 'three-stdlib';\nimport { loadAmmo } from '../utils/ammo-loader';\nimport { MMDPlayerBaseProps, MMDPlayerBaseRef } from '../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 console.log(`[MMDPlayerBase] Found ${meshCount} meshes and ${textures.length} unique textures`);\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 console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: No image`);\n resolve();\n return;\n }\n \n if (image instanceof HTMLImageElement) {\n if (image.complete && image.naturalWidth > 0) {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Already loaded`);\n resolve();\n } else {\n // 等待图像加载\n const onLoad = () => {\n console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Loaded`);\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 console.log(`[MMDPlayerBase] Texture ${index + 1}/${textures.length}: Non-image type`);\n resolve();\n }\n });\n });\n \n await Promise.all(texturePromises);\n console.log('[MMDPlayerBase] All texture images loaded');\n \n // 强制更新所有材质的纹理需要更新标志\n textures.forEach((texture) => {\n texture.needsUpdate = true;\n });\n \n // 执行几次渲染循环,确保所有纹理都上传到 GPU\n console.log('[MMDPlayerBase] Warming up renderer...');\n for (let i = 0; i < 3; i++) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n renderer.render(scene, camera);\n console.log(`[MMDPlayerBase] Warmup render ${i + 1}/3`);\n resolve();\n });\n });\n }\n \n console.log('[MMDPlayerBase] All materials and textures fully ready');\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 className,\n style,\n } = props;\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 controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<any>(null); // MMDAnimationHelper\n const axesHelperRef = useRef<THREE.AxesHelper | null>(null); // 坐标轴\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const animationIdRef = useRef<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n \n // 状态 Refs\n const 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 \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 onPlay?.();\n },\n pause: () => {\n if (!isPlayingRef.current) return;\n isPlayingRef.current = false;\n clockRef.current.stop();\n onPause?.();\n },\n stop: () => {\n isPlayingRef.current = false;\n clockRef.current.stop();\n 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 }));\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 console.log('[MMDPlayerBase] 🕐 系统启动时间:', new Date(startTimeRef.current).toLocaleString());\n } else {\n // 模型切换\n modelSwitchCountRef.current++;\n const runningTime = Date.now() - startTimeRef.current;\n const minutes = Math.floor(runningTime / 60000);\n const seconds = Math.floor((runningTime % 60000) / 1000);\n console.log(`[MMDPlayerBase] 🔄 模型切换 #${modelSwitchCountRef.current} (运行时间: ${minutes}分${seconds}秒)`);\n }\n\n try {\n // 4. 物理引擎加载\n if (stage.enablePhysics !== false && !mobileOptimization.disablePhysics) {\n console.log('[MMDPlayerBase] Loading Ammo.js physics engine...');\n await loadAmmo(stage.physicsPath);\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] Ammo.js loaded successfully');\n \n // 🎯 关键修复:Hook MMDPhysics._createWorld 以捕获物理引擎组件\n // 这样我们可以在清理时正确销毁它们,防止 WASM 内存泄漏\n const Ammo = (window as any).Ammo;\n if (Ammo) {\n console.log('[MMDPlayerBase] Setting up physics component tracking...');\n \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 console.log(`[MMDPlayerBase] 🔍 Captured btDefaultCollisionConfiguration #${componentsRef.configs.length}`);\n return obj;\n };\n \n Ammo.btCollisionDispatcher = function(...args: any[]) {\n const obj = new originalBtCollisionDispatcher(...args);\n componentsRef.dispatchers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btCollisionDispatcher #${componentsRef.dispatchers.length}`);\n return obj;\n };\n \n Ammo.btDbvtBroadphase = function(...args: any[]) {\n const obj = new originalBtDbvtBroadphase(...args);\n componentsRef.caches.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDbvtBroadphase #${componentsRef.caches.length}`);\n return obj;\n };\n \n Ammo.btSequentialImpulseConstraintSolver = function(...args: any[]) {\n const obj = new originalBtSequentialImpulseConstraintSolver(...args);\n componentsRef.solvers.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btSequentialImpulseConstraintSolver #${componentsRef.solvers.length}`);\n return obj;\n };\n \n Ammo.btDiscreteDynamicsWorld = function(...args: any[]) {\n const obj = new originalBtDiscreteDynamicsWorld(...args);\n componentsRef.worlds.push(obj);\n console.log(`[MMDPlayerBase] 🔍 Captured btDiscreteDynamicsWorld #${componentsRef.worlds.length}`);\n return obj;\n };\n \n console.log('[MMDPlayerBase] ✅ Physics component tracking setup complete');\n }\n } else {\n console.log('[MMDPlayerBase] Physics disabled');\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) {\n scene.background = new THREE.Color(stage.backgroundColor);\n }\n sceneRef.current = scene;\n\n // Camera\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\n if (stage.cameraPosition) {\n const pos = stage.cameraPosition as any;\n camera.position.set(pos.x, pos.y, pos.z);\n } else {\n camera.position.set(0, 20, 30);\n }\n cameraRef.current = camera;\n\n // Renderer\n const renderer = new THREE.WebGLRenderer({ \n antialias: !mobileOptimization.enabled, \n alpha: true, \n preserveDrawingBuffer: true \n });\n renderer.setSize(width, height);\n // 使用更高的像素比例以获得更清晰的渲染效果\n const pixelRatio = mobileOptimization.enabled \n ? (mobileOptimization.pixelRatio || Math.min(window.devicePixelRatio, 2))\n : window.devicePixelRatio;\n renderer.setPixelRatio(pixelRatio);\n console.log('[MMDPlayerBase] Pixel ratio set to:', pixelRatio);\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 // Lights\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(10, 20, 10);\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 // 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 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 console.log('[MMDPlayerBase] Starting render loop (animation paused)');\n animate();\n\n // 6. 资源加载\n console.log('[MMDPlayerBase] Start loading resources...', resources);\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 console.log('[MMDPlayerBase] Loading model with motion:', 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 console.log('[MMDPlayerBase] Loading model only');\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 console.log('[MMDPlayerBase] Model loaded:', mesh);\n \n // 保存动画时长\n if (animation) {\n animationClipRef.current = animation;\n durationRef.current = animation.duration;\n console.log('[MMDPlayerBase] Animation duration:', animation.duration);\n }\n\n // 设置模型基础属性\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n \n // 🎯 关键优化:先等待所有材质和纹理加载完成,再添加到场景\n // 这样可以避免用户看到\"逐个子模型显示\"的过程\n console.log('[MMDPlayerBase] Waiting for all materials and textures to load...');\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 console.log('[MMDPlayerBase] ✅ All materials and textures loaded');\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 console.log('[MMDPlayerBase] Model bounds:', { center, size });\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 console.log('[MMDPlayerBase] Auto camera position:', camera.position);\n }\n controls.update();\n }\n }\n \n // 🎯 现在所有纹理都已加载完成,添加到场景和 helper\n const enablePhysics = stage.enablePhysics !== false && !mobileOptimization.disablePhysics;\n \n helper.add(mesh, {\n animation: animation,\n physics: enablePhysics\n });\n\n scene.add(mesh);\n console.log('[MMDPlayerBase] ✅ Model added to scene (fully loaded)');\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 supported');\n } else {\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 if (simplifiedMaterialCount > 0) {\n console.log(`[MMDPlayerBase] ✅ Simplified ${simplifiedMaterialCount} materials to MeshBasicMaterial`);\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 } else {\n console.log(`[MMDPlayerBase] ✅ Bone count: ${boneCount} (within limit)`);\n }\n }\n \n console.log('[MMDPlayerBase] 📱 Mobile optimizations applied');\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.4 加载音频\n if (resources.audioPath) {\n const listener = new THREE.AudioListener();\n camera.add(listener);\n \n const sound = new THREE.Audio(listener);\n const audioLoader = new THREE.AudioLoader();\n \n audioLoader.load(\n resources.audioPath,\n (buffer) => {\n if (checkCancelled()) return; // Callback check\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 undefined,\n (err) => console.error('Failed to load audio:', err)\n );\n }\n\n // 6.5 加载舞台\n let stageMesh: THREE.Object3D | null = null;\n if (resources.stageModelPath) {\n try {\n stageMesh = await new Promise<THREE.Object3D>((resolve, reject) => {\n loader.load(\n resources.stageModelPath!,\n (mesh) => resolve(mesh),\n undefined,\n (err) => reject(err)\n );\n });\n \n if (checkCancelled()) return;\n \n console.log('[MMDPlayerBase] Stage model loaded:', stageMesh);\n stageMesh.castShadow = true;\n stageMesh.receiveShadow = true;\n \n // 🎯 同样,先等待舞台的材质和纹理加载完成,再添加到场景\n console.log('[MMDPlayerBase] Waiting for stage materials and textures...');\n const tempStageScene = new THREE.Scene();\n tempStageScene.add(stageMesh);\n await waitForMaterialsReady(stageMesh, renderer, tempStageScene, camera);\n tempStageScene.remove(stageMesh);\n \n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] ✅ Stage materials and textures loaded');\n \n // 现在添加到主场景\n scene.add(stageMesh);\n console.log('[MMDPlayerBase] ✅ Stage added to scene (fully loaded)');\n } catch (err) {\n console.error('Failed to load stage:', err);\n }\n }\n\n if (checkCancelled()) return;\n \n // 🎯 所有资源完全加载完成,模型已完全显示,现在可以触发回调并开始播放动画\n isReadyRef.current = true;\n console.log('[MMDPlayerBase] 🎉 All resources fully loaded and ready!');\n console.log('[MMDPlayerBase] 📊 Summary:');\n console.log(`[MMDPlayerBase] - Model: ✅ Fully loaded with all textures`);\n if (resources.stageModelPath) {\n console.log(`[MMDPlayerBase] - Stage: ✅ Fully loaded with all textures`);\n }\n if (animation) {\n console.log(`[MMDPlayerBase] - Animation: ✅ Ready (${animation.duration.toFixed(2)}s)`);\n }\n console.log('[MMDPlayerBase] 🔔 Triggering onLoad callback');\n onLoad?.();\n \n if (autoPlay) {\n // 给一点时间让渲染系统稳定,然后开始播放动画\n setTimeout(() => {\n if (checkCancelled()) return;\n console.log('[MMDPlayerBase] 🎬 Starting animation playback (after materials fully loaded)');\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 console.log(`[MMDPlayerBase] Cleaning mesh ${idx}:`, mesh.uuid);\n \n // 🎯 关键修复:从 WeakMap 中获取真正的 meshData\n let meshData: any = null;\n \n if (helperObjects instanceof WeakMap) {\n console.log('[MMDPlayerBase] Accessing WeakMap with mesh as key...');\n meshData = helperObjects.get(mesh);\n \n if (meshData) {\n const meshDataKeys = Object.keys(meshData);\n console.log(`[MMDPlayerBase] ✅ Got meshData from WeakMap, keys (${meshDataKeys.length}):`, meshDataKeys);\n \n // 打印物理相关的属性\n const physicsRelatedKeys = meshDataKeys.filter(k => k.toLowerCase().includes('phys'));\n if (physicsRelatedKeys.length > 0) {\n console.log(`[MMDPlayerBase] Physics-related keys:`, physicsRelatedKeys);\n physicsRelatedKeys.forEach(key => {\n const value = meshData[key];\n console.log(`[MMDPlayerBase] ${key}:`, typeof value, value?.constructor?.name || value);\n });\n }\n } else {\n console.log('[MMDPlayerBase] ⚠️ No meshData found in WeakMap for this mesh');\n }\n }\n \n // 如果没有从 WeakMap 获取到,使用 mesh 本身作为 fallback\n if (!meshData) {\n console.log('[MMDPlayerBase] Using mesh itself as meshData');\n meshData = mesh;\n }\n \n // 清理物理系统 - 从 meshData 中获取\n const physics = meshData?.physics;\n \n if (physics) {\n try {\n console.log('[MMDPlayerBase] 🎯 Starting physics cleanup for mesh', idx);\n console.log('[MMDPlayerBase] Debug: physics object keys:', Object.keys(physics));\n \n // 优先使用 MMDPhysics.dispose() 方法(three-stdlib 提供的标准清理方法)\n if (typeof physics.dispose === 'function') {\n console.log('[MMDPlayerBase] Calling MMDPhysics.dispose()...');\n physics.dispose();\n console.log('[MMDPlayerBase] ✅ MMDPhysics.dispose() completed');\n } else {\n // 手动清理物理组件\n console.log('[MMDPlayerBase] No dispose method, manually cleaning physics components...');\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 console.log(`[MMDPlayerBase] Cleaning ${physics.bodies.length} rigid bodies...`);\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 console.log('[MMDPlayerBase] ✅ All rigid bodies removed');\n }\n \n // 清理约束\n if (physics.world && Array.isArray(physics.constraints) && physics.constraints.length > 0) {\n console.log(`[MMDPlayerBase] Cleaning ${physics.constraints.length} constraints...`);\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 console.log('[MMDPlayerBase] ✅ All constraints removed');\n }\n \n // 注意:不在这里销毁 world,因为它会在后面统一清理\n }\n }\n \n // 清除引用\n meshData.physics = null;\n \n console.log('[MMDPlayerBase] ✅ Physics cleanup completed for mesh', idx);\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 } else {\n console.log('[MMDPlayerBase] ⚠️ No physics object found for mesh', idx);\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 console.log('[MMDPlayerBase] 🔥 Starting CRITICAL physics components cleanup...');\n const Ammo = (window as any).Ammo;\n if (Ammo && Ammo.destroy) {\n const components = physicsComponentsRef.current;\n \n console.log(`[MMDPlayerBase] 📊 Physics components count:`, {\n worlds: components.worlds.length,\n solvers: components.solvers.length,\n caches: components.caches.length,\n dispatchers: components.dispatchers.length,\n configs: components.configs.length\n });\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 console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.worlds.length} btDiscreteDynamicsWorld(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDiscreteDynamicsWorld destroyed');\n }\n \n // 销毁所有 solvers\n if (components.solvers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.solvers.length} btSequentialImpulseConstraintSolver(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btSequentialImpulseConstraintSolver destroyed');\n }\n \n // 销毁所有 caches\n if (components.caches.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.caches.length} btDbvtBroadphase(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDbvtBroadphase destroyed');\n }\n \n // 销毁所有 dispatchers\n if (components.dispatchers.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.dispatchers.length} btCollisionDispatcher(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btCollisionDispatcher destroyed');\n }\n \n // 销毁所有 configs\n if (components.configs.length > 0) {\n console.log(`[MMDPlayerBase] 🗑️ Destroying ${components.configs.length} btDefaultCollisionConfiguration(s)...`);\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 console.log('[MMDPlayerBase] ✅ All btDefaultCollisionConfiguration destroyed');\n }\n \n console.log('[MMDPlayerBase] 🎉 Physics components cleanup completed!');\n } else {\n console.warn('[MMDPlayerBase] ⚠️ Ammo.destroy not available, skipping physics cleanup');\n }\n \n // 清理 sharedPhysics 和 masterPhysics(如果存在)\n console.log('[MMDPlayerBase] Checking helper-level physics...');\n if ((helperRef.current as any).sharedPhysics) {\n console.log('[MMDPlayerBase] Clearing sharedPhysics reference...');\n (helperRef.current as any).sharedPhysics = null;\n }\n if ((helperRef.current as any).masterPhysics) {\n console.log('[MMDPlayerBase] Clearing masterPhysics reference...');\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 // 清理所有渲染目标\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]); // 关键依赖:当 resources 变了(且没有 key 强制重刷时),执行这个 effect\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 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 onTimeUpdate?.(currentTime);\n \n // 简单的结束检测(非循环模式)\n if (!loopRef.current && duration > 0 && elapsed >= duration) {\n isPlayingRef.current = false;\n clockRef.current.stop();\n onEnded?.();\n }\n }\n \n rendererRef.current.render(sceneRef.current, cameraRef.current);\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 || '#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 } from 'lucide-react';\n\ninterface ControlPanelProps {\n isPlaying: boolean;\n isFullscreen: boolean;\n isLooping: boolean; // 是否单节点循环播放\n isListLooping?: 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}\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n isFullscreen,\n isLooping,\n isListLooping,\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}) => {\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 {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\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}\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 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 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 />\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 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 {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","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","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","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 onStart?: () => void;\n /** 自定义类名 */\n className?: string;\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 onStart,\n className = '',\n}) => {\n // 使用 state 确保 SSR 和客户端初始渲染一致\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // 调试日志\n console.log('[StartScreen] Render state:', {\n showStartScreen,\n scriptName,\n isMounted,\n });\n\n // 只在客户端挂载后才渲染\n if (!isMounted) {\n return null;\n }\n\n // 如果不显示,返回 null\n if (!showStartScreen) {\n console.log('[StartScreen] 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 cursor-pointer ${className}`}\n style={{\n zIndex: 999999,\n pointerEvents: 'auto',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n margin: 0,\n padding: 0,\n }}\n onClick={onStart}\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.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(40px) saturate(200%)',\n WebkitBackdropFilter: 'blur(40px) saturate(200%)',\n }}\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.25) 0%, \n rgba(173, 216, 230, 0.25) 25%,\n rgba(221, 160, 221, 0.25) 50%,\n rgba(255, 218, 185, 0.25) 75%,\n rgba(255, 182, 193, 0.25) 100%)`,\n backgroundSize: '400% 400%',\n animation: 'gradientShift 15s ease infinite',\n }}\n >\n {/* 内容容器 */}\n <div\n className=\"relative z-10 text-center px-16 py-14 rounded-3xl max-w-2xl mx-auto transform transition-all hover:scale-105\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.15))',\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: '2px solid rgba(255, 255, 255, 0.3)',\n boxShadow: `\n 0 12px 48px rgba(255, 255, 255, 0.15),\n 0 4px 16px rgba(255, 255, 255, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.4)\n `,\n }}\n >\n {/* 顶部装饰光效 */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1 margin-auto\"\n style={{\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent)',\n }}\n />\n\n {/* 标题 */}\n <h1\n className=\"text-5xl font-bold text-white mb-8 relative\"\n style={{\n textShadow: '0 4px 16px rgba(255, 255, 255, 0.3), 0 2px 8px rgba(0, 0, 0, 0.5)',\n }}\n >\n {scriptName}\n {/* 标题下划线装饰 */}\n <div\n className=\"absolute -bottom-3 left-1/2 transform -translate-x-1/2 h-1 rounded-full\"\n style={{\n width: '60%',\n background: 'linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent)',\n }}\n />\n </h1>\n\n {/* 开始按钮 */}\n <div\n className=\"inline-block px-10 py-4 rounded-2xl font-bold text-xl text-white transition-all hover:scale-110 active:scale-95\"\n style={{\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.25))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '2px solid rgba(255, 255, 255, 0.4)',\n boxShadow: `\n 0 8px 32px rgba(255, 255, 255, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.5)\n `,\n textShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n animation: 'pulse 2s ease-in-out infinite',\n }}\n >\n <span className=\"relative z-10\">{startText}</span>\n </div>\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 </div>\n </div>\n\n </div>\n\n\n\n </div>\n );\n\n // 使用 Portal 渲染到 body\n let portalContainer = document.getElementById('start-screen-portal-root');\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.id = 'start-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: 999999;\n pointer-events: none;\n `.replace(/\\s+/g, ' ').trim();\n\n return createPortal(content, portalContainer);\n};\n\nStartScreen.displayName = 'StartScreen';\n\nexport default StartScreen;\n\n\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 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 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 onStart={onStart}\n className={className}\n />\n </>\n );\n};\n\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport default LoadingOverlay;\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 { DialogueBox } from './DialogueBox';\nimport { HistoryPanel } from './HistoryPanel';\nimport { LoadingOverlay } from './LoadingOverlay';\nimport {\n MMDVisualNovelProps,\n MMDVisualNovelRef,\n VisualNovelNode,\n DialogueLine,\n DialogueHistoryItem,\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 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\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\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 goToNextDialogue = useCallback(() => {\n if (!currentNode) return;\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 {\n // 当前节点对话结束,切换到下一个节点\n const nextNodeIndex = currentNodeIndex + 1;\n\n if (nextNodeIndex < nodes.length) {\n // 还有更多节点\n goToNode(nextNodeIndex);\n } else if (loop) {\n // 循环播放\n goToNode(0);\n } else {\n // 剧本结束\n onScriptComplete?.();\n }\n }\n }, [currentNode, currentDialogueIndex, currentNodeIndex, nodes.length, loop, addToHistory, onDialogueChange, onScriptComplete]);\n\n // 切换到指定节点\n const goToNode = useCallback(\n (nodeIndex: number) => {\n if (nodeIndex < 0 || nodeIndex >= nodes.length) return;\n if (isTransitioning) return;\n\n const node = nodes[nodeIndex];\n if (!node) return;\n\n console.log(`[MMDVisualNovel] Transitioning to node ${nodeIndex}`);\n\n // 🔧 立即设置加载状态,确保遮罩覆盖整个切换过程\n setIsTransitioning(true);\n setIsLoading(true);\n setIsAnimationPlaying(false); // 重置动画播放状态\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]\n );\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 // 切换自动模式\n const toggleAutoMode = useCallback(() => {\n setIsAutoMode((prev) => !prev);\n }, []);\n\n // 快进 - 跳到下一个节点\n const handleSkip = useCallback(() => {\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 setAutoMode: setIsAutoMode,\n skipTyping: () => {\n typingCompleteRef.current = true;\n },\n }),\n [goToNode, goToDialogue, currentNodeIndex, currentDialogueIndex, history]\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 };\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}\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 onError={onError}\n />\n )}\n </div>\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=\"点击开始\"\n onStart={handleStart}\n />\n\n {/* 对话框 - 仅在动画开始播放后显示 */}\n {(() => {\n const shouldShow = isStarted && isAnimationPlaying && currentDialogue && !showHistory;\n console.log('[MMDVisualNovel] DialogueBox render condition:', {\n isStarted,\n isAnimationPlaying,\n hasDialogue: !!currentDialogue,\n showHistory,\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 showControls={true}\n showSkipButton={showSkipButton}\n showAutoButton={showAutoButton}\n showHistoryButton={showHistoryButton}\n />\n ) : null;\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"]}
|