sa2kit 1.0.9 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mmd/index.d.mts +187 -278
- package/dist/mmd/index.d.ts +187 -278
- package/dist/mmd/index.js +1425 -1638
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +1419 -1630
- package/dist/mmd/index.mjs.map +1 -1
- package/package.json +11 -9
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/MMDPlayerEnhanced.tsx","../../src/mmd/components/MMDPlaylist.tsx","../../src/mmd/presets.ts"],"names":["useRef","useState","useEffect","THREE","OutlineEffect","MMDAnimationHelper","MMDLoader","width","height","React","THREE2","useMemo","OrbitControls","error","mesh"],"mappings":"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","file":"index.js","sourcesContent":["let ammoPromise: Promise<void> | null = null;\n\nexport interface AmmoConfig {\n /** Ammo.js 脚本路径(例如:'/mikutalking/libs/ammo.wasm.js') */\n scriptPath: string;\n /** Ammo WASM 文件的基础路径(例如:'/mikutalking/libs/') */\n wasmBasePath: string;\n}\n\n/**\n * 加载 Ammo.js 物理引擎\n * @param config Ammo.js 配置,包含脚本路径和 WASM 基础路径\n */\nexport const loadAmmo = (config: AmmoConfig): Promise<void> => {\n // 每次调用都重新检查配置,如果配置变了就重新加载\n const configKey = `${config.scriptPath}|${config.wasmBasePath}`;\n const currentConfigKey = (window as any).__AMMO_CONFIG_KEY__;\n\n // 如果已经加载过且配置相同,直接返回\n if (ammoPromise && currentConfigKey === configKey) {\n return ammoPromise;\n }\n\n // 配置变了,重置 promise\n if (currentConfigKey && currentConfigKey !== configKey) {\n ammoPromise = null;\n (window as any).Ammo = undefined;\n }\n\n ammoPromise = new Promise((resolve, reject) => {\n if (typeof window === 'undefined') {\n resolve(); // SSR support\n return;\n }\n\n if ((window as any).Ammo && currentConfigKey === configKey) {\n console.log('✅ [Ammo] 已加载,直接使用');\n resolve();\n return;\n }\n\n console.log('📦 [Ammo] 开始加载 Ammo.js...');\n console.log('📂 [Ammo] 脚本路径:', config.scriptPath);\n console.log('📂 [Ammo] WASM 基础路径:', config.wasmBasePath);\n\n // 保存当前配置\n (window as any).__AMMO_CONFIG_KEY__ = configKey;\n \n // 设置 Ammo 配置,指定 WASM 文件路径\n (window as any).AMMO_PATH = config.wasmBasePath;\n\n const script = document.createElement('script');\n script.src = config.scriptPath;\n script.async = true;\n\n script.onload = () => {\n console.log('✅ [Ammo] 脚本加载完成,等待初始化...');\n // After script load, we need to wait for the WASM initialization\n const checkAmmo = () => {\n if (typeof (window as any).Ammo === 'function') {\n console.log('🔄 [Ammo] 开始初始化 WASM...');\n (window as any).Ammo({\n locateFile: (path: string) => {\n console.log('📍 [Ammo] 定位文件:', path);\n if (path.endsWith('.wasm')) {\n return config.wasmBasePath + path;\n }\n return path;\n }\n }).then((AmmoLib: any) => {\n console.log('✅ [Ammo] 初始化完成!');\n (window as any).Ammo = AmmoLib;\n resolve();\n }).catch((err: any) => {\n console.error('❌ [Ammo] 初始化失败:', err);\n reject(err);\n });\n } else {\n // Sometimes it might be already initialized or different structure depending on the build\n // But standard ammo.wasm.js returns a promise-like factory\n if ((window as any).Ammo) {\n console.log('✅ [Ammo] 已初始化');\n resolve();\n } else {\n console.log('⏳ [Ammo] 等待初始化...');\n setTimeout(checkAmmo, 100);\n }\n }\n };\n checkAmmo();\n };\n\n script.onerror = (e) => {\n console.error('❌ [Ammo] 加载失败:', e);\n reject(new Error(`Failed to load Ammo.js from ${config.scriptPath}. Please ensure the file exists.`));\n ammoPromise = null;\n (window as any).__AMMO_CONFIG_KEY__ = undefined;\n };\n\n document.body.appendChild(script);\n });\n\n return ammoPromise;\n};\n\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as THREE from 'three';\nimport { MMDLoader, MMDAnimationHelper, OutlineEffect } from 'three-stdlib';\nimport { MMDPlayerBaseProps } from '../types';\nimport { loadAmmo } from '../utils/ammo-loader';\n\nexport const MMDPlayerBase: React.FC<MMDPlayerBaseProps> = ({\n modelUrl,\n vmdUrl,\n cameraUrl,\n audioUrl,\n physics = true,\n width = '100%',\n height = '100%',\n onLoad,\n onProgress,\n onError,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n let scene: THREE.Scene;\n let camera: THREE.PerspectiveCamera;\n let renderer: THREE.WebGLRenderer;\n let effect: OutlineEffect;\n let helper: MMDAnimationHelper;\n // Unused variables removed to fix lint errors\n // let ikHelper: THREE.Object3D;\n // let physicsHelper: THREE.Object3D;\n let clock: THREE.Clock;\n let animationId: number;\n\n const init = async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Load Ammo.js if physics is enabled\n if (physics) {\n await loadAmmo({\n scriptPath: '/mikutalking/libs/ammo.wasm.js',\n wasmBasePath: '/mikutalking/libs/',\n });\n }\n\n const container = containerRef.current!;\n const w = container.clientWidth;\n const h = container.clientHeight;\n\n // Scene\n scene = new THREE.Scene();\n scene.background = new THREE.Color(0xffffff);\n\n // Camera\n camera = new THREE.PerspectiveCamera(45, w / h, 1, 2000);\n camera.position.z = 30;\n\n // Light\n const ambient = new THREE.AmbientLight(0x666666);\n scene.add(ambient);\n\n const directionalLight = new THREE.DirectionalLight(0x887766);\n directionalLight.position.set(-1, 1, 1).normalize();\n scene.add(directionalLight);\n\n // Renderer\n renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(w, h);\n container.appendChild(renderer.domElement);\n\n // Effect\n effect = new OutlineEffect(renderer);\n\n // Helper\n helper = new MMDAnimationHelper({\n afterglow: 2.0,\n });\n\n // Loader\n const loader = new MMDLoader();\n\n // Load Model\n loader.load(\n modelUrl,\n (mesh: any) => { // Explicitly type mesh as any for now since MMDLoader types can be tricky\n scene.add(mesh);\n \n // Load VMD (Model Motion)\n if (vmdUrl) {\n loader.loadAnimation(\n vmdUrl,\n mesh,\n (vmdObject: any) => {\n helper.add(mesh, {\n animation: vmdObject,\n physics: physics,\n });\n },\n (xhr: ProgressEvent) => {\n if (onProgress) onProgress(xhr);\n },\n (err: unknown) => {\n console.error('Error loading animation', err);\n if (onError) onError(err as Error);\n }\n );\n } else {\n helper.add(mesh, { physics: physics });\n }\n\n // Load Camera Motion\n if (cameraUrl) {\n loader.loadAnimation(\n cameraUrl,\n camera,\n (cameraVmdObject: any) => {\n helper.add(camera, {\n animation: cameraVmdObject,\n });\n },\n undefined,\n (err: unknown) => {\n console.error('Error loading camera motion', err);\n // Don't fail the whole load if camera fails\n }\n );\n }\n\n // Load Audio\n if (audioUrl) {\n new THREE.AudioLoader().load(\n audioUrl,\n (buffer: AudioBuffer) => {\n const listener = new THREE.AudioListener();\n camera.add(listener);\n const audio = new THREE.Audio(listener);\n audio.setBuffer(buffer);\n helper.add(audio as any);\n },\n undefined,\n (err: unknown) => {\n console.error('Error loading audio', err);\n }\n );\n }\n\n if (onLoad) onLoad();\n setLoading(false);\n },\n (xhr: ProgressEvent) => {\n if (onProgress) onProgress(xhr);\n },\n (err: unknown) => {\n setError('Failed to load model');\n if (onError) onError(err as Error);\n setLoading(false);\n }\n );\n\n clock = new THREE.Clock();\n\n const animate = () => {\n animationId = requestAnimationFrame(animate);\n helper.update(clock.getDelta());\n effect.render(scene, camera);\n };\n\n animate();\n\n // Resize handler\n const handleResize = () => {\n if (!container) return;\n const width = container.clientWidth;\n const height = container.clientHeight;\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n effect.setSize(width, height);\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n }\n\n } catch (e) {\n console.error(e);\n setError('Initialization error');\n setLoading(false);\n }\n return undefined;\n };\n\n init();\n\n return () => {\n if (animationId) cancelAnimationFrame(animationId);\n if (renderer) {\n renderer.dispose();\n const domElement = renderer.domElement;\n if (domElement && domElement.parentNode) {\n domElement.parentNode.removeChild(domElement);\n }\n }\n // Dispose scenes, materials, etc. could be added here\n };\n }, [modelUrl, vmdUrl, cameraUrl, audioUrl, physics]);\n\n return (\n <div \n ref={containerRef} \n style={{ width, height, position: 'relative', overflow: 'hidden' }}\n >\n {loading && (\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: '#f0f0f0',\n color: '#666',\n zIndex: 1\n }}>\n Loading MMD...\n </div>\n )}\n {error && (\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: '#ffeeee',\n color: '#cc0000',\n zIndex: 2\n }}>\n {error}\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\nimport React, { useRef, useEffect, useState, useMemo } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls, MMDLoader, MMDAnimationHelper } from 'three-stdlib';\nimport type { MMDPlayerEnhancedProps } from '../types';\nimport { loadAmmo } from '../utils/ammo-loader';\n\n/**\n * 增强版 MMD 播放器组件\n * 支持通过 resources 和 stage 配置快速使用\n * 所有资源均从 public 目录加载,无需额外配置\n */\nexport const MMDPlayerEnhanced: React.FC<MMDPlayerEnhancedProps> = ({\n resources,\n resourcesList,\n defaultResourceId,\n resourceOptions,\n defaultSelection,\n stage,\n autoPlay = false,\n loop = false,\n className = '',\n style,\n onLoad,\n onError,\n onResourceChange,\n onSelectionChange,\n onAudioEnded,\n onAnimationEnded,\n}) => {\n console.log('🎨 [MMDPlayerEnhanced] 组件初始化')\n\n // 🔥 组件卸载时清理所有资源\n useEffect(() => {\n return () => {\n console.log('🧹 [MMDPlayerEnhanced] 组件卸载,执行完整清理');\n\n // 停止动画循环\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n animationIdRef.current = null;\n }\n\n // 清理音频\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n audioRef.current.load();\n audioRef.current = null;\n }\n\n // 深度清理物理系统\n if (helperRef.current) {\n try {\n helperRef.current.enable('animation', false);\n helperRef.current.enable('ik', false);\n helperRef.current.enable('grant', false);\n helperRef.current.enable('physics', false);\n\n const helperObjects = (helperRef.current as any).objects;\n if (helperObjects && Array.isArray(helperObjects)) {\n const physicsWorldsToDestroy = new Set<any>();\n\n helperObjects.forEach((obj: any) => {\n if (obj.physics) {\n const physics = obj.physics;\n if (physics.world) physicsWorldsToDestroy.add(physics.world);\n\n // 清理刚体和约束\n if (physics.bodies) physics.bodies.length = 0;\n if (physics.constraints) physics.constraints.length = 0;\n obj.physics = null;\n }\n });\n\n // 销毁物理世界\n physicsWorldsToDestroy.forEach((world) => {\n try {\n while (world.getNumCollisionObjects() > 0) {\n const obj = world.getCollisionObjectArray().at(0);\n world.removeCollisionObject(obj);\n if (obj && obj.destroy) obj.destroy();\n }\n if (world.destroy) world.destroy();\n } catch (e) {}\n });\n\n helperObjects.length = 0;\n }\n } catch (e) {}\n helperRef.current = null;\n }\n\n // 清理场景\n if (sceneRef.current) {\n sceneRef.current.clear();\n sceneRef.current = null;\n }\n\n // 清理渲染器\n if (rendererRef.current) {\n rendererRef.current.dispose();\n rendererRef.current = null;\n }\n\n // 清理控制器\n if (controlsRef.current) {\n controlsRef.current.dispose();\n controlsRef.current = null;\n }\n\n // 重置所有ref\n cameraRef.current = null;\n if (clockRef.current) {\n clockRef.current = new THREE.Clock(); // 重新创建一个新的Clock而不是null\n }\n vmdDataRef.current = null;\n\n // 强制垃圾回收\n if ((window as any).gc) {\n try {\n (window as any).gc();\n } catch (e) {}\n }\n\n console.log('✅ [MMDPlayerEnhanced] 组件卸载清理完成');\n };\n }, []);\n\n // 资源切换状态(resourcesList 模式)\n const [selectedResourceId, setSelectedResourceId] = useState<string>(\n defaultResourceId || resourcesList?.[0]?.id || ''\n );\n \n // 资源选择状态(resourceOptions 模式)\n const [selectedModelId, setSelectedModelId] = useState<string>(\n defaultSelection?.modelId || resourceOptions?.models?.[0]?.id || ''\n );\n const [selectedMotionId, setSelectedMotionId] = useState<string>(\n defaultSelection?.motionId || ''\n );\n const [selectedAudioId, setSelectedAudioId] = useState<string>(\n defaultSelection?.audioId || ''\n );\n const [selectedCameraId, setSelectedCameraId] = useState<string>(\n defaultSelection?.cameraId || ''\n );\n const [selectedStageModelId, setSelectedStageModelId] = useState<string>(\n defaultSelection?.stageModelId || ''\n );\n const [selectedBackgroundId, setSelectedBackgroundId] = useState<string>(\n defaultSelection?.backgroundId || ''\n );\n \n const [showSettings, setShowSettings] = useState(false);\n \n // 下拉菜单展开状态\n const [expandedSection, setExpandedSection] = useState<string | null>(null);\n\n // 计算当前使用的资源\n const currentResources = useMemo(() => {\n // 模式1: resourceOptions(下拉框独立选择)\n if (resourceOptions) {\n const model = resourceOptions.models?.find(m => m.id === selectedModelId);\n const motion = resourceOptions.motions?.find(m => m.id === selectedMotionId);\n const audio = resourceOptions.audios?.find(a => a.id === selectedAudioId);\n const camera = resourceOptions.cameras?.find(c => c.id === selectedCameraId);\n const stageModel = resourceOptions.stageModels?.find(s => s.id === selectedStageModelId);\n const background = resourceOptions.backgrounds?.find(b => b.id === selectedBackgroundId);\n \n return {\n modelPath: model?.path || resourceOptions.models?.[0]?.path || '',\n motionPath: motion?.path,\n audioPath: audio?.path,\n cameraPath: camera?.path,\n stageModelPath: stageModel?.path,\n backgroundPath: background?.path,\n };\n }\n \n // 模式2: resourcesList(预设组合)\n if (resourcesList && resourcesList.length > 0) {\n const selected = resourcesList.find(r => r.id === selectedResourceId);\n const resourceItem = selected || resourcesList[0];\n if (!resourceItem) {\n throw new Error('无法找到有效的资源配置');\n }\n return resourceItem.resources;\n }\n \n // 模式3: resources(单资源)\n if (!resources) {\n throw new Error('必须提供 resources、resourcesList 或 resourceOptions');\n }\n return resources;\n }, [\n resources, \n resourcesList, \n selectedResourceId,\n resourceOptions,\n selectedModelId,\n selectedMotionId,\n selectedAudioId,\n selectedCameraId,\n selectedStageModelId,\n selectedBackgroundId,\n ]);\n\n console.log('📂 [MMDPlayerEnhanced] 当前资源配置:', currentResources)\n console.log('🎭 [MMDPlayerEnhanced] 舞台配置:', stage)\n \n const containerRef = useRef<HTMLDivElement>(null);\n const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n const sceneRef = useRef<THREE.Scene | null>(null);\n const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n const controlsRef = useRef<OrbitControls | null>(null);\n const helperRef = useRef<MMDAnimationHelper | null>(null);\n const clockRef = useRef<THREE.Clock>(new THREE.Clock());\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const animationIdRef = useRef<number | null>(null);\n const isPlayingRef = useRef<boolean>(false); // 用 ref 存储播放状态,避免闭包问题\n const isLoadedRef = useRef<boolean>(false); // 标记资源是否已加载\n const shouldAutoPlayAfterReloadRef = useRef<boolean>(false); // 标记重新加载后是否自动播放\n const vmdDataRef = useRef<{ mesh: any; vmd: any; cameraVmd: any } | null>(null); // 保存动画数据用于重置\n const animationDurationRef = useRef<number>(0); // 动画时长(秒)\n const hasAudioRef = useRef<boolean>(false); // 是否有音频\n const animationEndedFiredRef = useRef<boolean>(false); // 标记动画结束回调是否已触发\n const lastAnimationTimeRef = useRef<number>(0); // 上一帧的动画时间\n const animationStoppedCountRef = useRef<number>(0); // 动画停止的帧数计数\n\n const [loading, setLoading] = useState(false);\n const [loadingProgress, setLoadingProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [reloadTrigger, setReloadTrigger] = useState(0); // 用于触发重新加载\n const [needReset, setNeedReset] = useState(false); // 标记是否需要重置(改用 state)\n\n // 初始化场景\n useEffect(() => {\n console.log('🏗️ [MMDPlayerEnhanced] 场景初始化 useEffect 触发')\n if (!containerRef.current) {\n console.warn('⚠️ [MMDPlayerEnhanced] containerRef.current 不存在')\n return\n }\n\n console.log('✅ [MMDPlayerEnhanced] 容器元素存在,开始初始化场景')\n const container = containerRef.current;\n \n // 防止重复初始化\n if (container.children.length > 0) {\n console.log('⚠️ [MMDPlayerEnhanced] 场景已经初始化,跳过')\n return\n }\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // 创建场景\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(stage?.backgroundColor || '#000000');\n sceneRef.current = scene;\n\n // 创建相机\n const camera = new THREE.PerspectiveCamera(45, width / height, 1, 2000);\n const camPos = stage?.cameraPosition || { x: 0, y: 10, z: 30 };\n camera.position.set(camPos.x, camPos.y, camPos.z);\n cameraRef.current = camera;\n\n // 创建渲染器\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setSize(width, height);\n renderer.setPixelRatio(window.devicePixelRatio);\n container.appendChild(renderer.domElement);\n rendererRef.current = renderer;\n\n // 添加光源\n const ambient = new THREE.AmbientLight(0xffffff, 0.6);\n scene.add(ambient);\n\n const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(1, 1, 1);\n scene.add(directionalLight);\n\n // 添加网格(可选)\n if (stage?.showGrid !== false) {\n const gridHelper = new THREE.PolarGridHelper(30, 10);\n scene.add(gridHelper);\n }\n\n // 创建控制器\n const controls = new OrbitControls(camera, renderer.domElement);\n const target = stage?.cameraTarget || { x: 0, y: 10, z: 0 };\n controls.target.set(target.x, target.y, target.z);\n controls.update();\n controlsRef.current = controls;\n\n // 处理窗口大小变化\n const handleResize = () => {\n if (!container || !camera || !renderer) return;\n const newWidth = container.clientWidth;\n const newHeight = container.clientHeight;\n camera.aspect = newWidth / newHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(newWidth, newHeight);\n };\n window.addEventListener('resize', handleResize);\n\n // 开始动画循环\n const animate = () => {\n animationIdRef.current = requestAnimationFrame(animate);\n\n // 只在播放状态时更新动画\n if (helperRef.current && isPlayingRef.current) {\n const delta = clockRef.current.getDelta();\n \n // 防止物理更新时出现OOM\n try {\n helperRef.current.update(delta);\n } catch (error: any) {\n if (error.message && error.message.includes('OOM')) {\n console.error('❌ 物理引擎内存溢出,停止播放');\n isPlayingRef.current = false;\n setIsPlaying(false);\n onError?.(new Error('物理引擎内存溢出'));\n return;\n }\n throw error;\n }\n\n // 检测动画是否结束(仅在没有音频时)\n if (!hasAudioRef.current && !loop && !animationEndedFiredRef.current) {\n const currentTime = clockRef.current.getElapsedTime();\n \n // 方法1: 使用动画时长判定(如果有的话)\n if (animationDurationRef.current > 0) {\n if (currentTime >= animationDurationRef.current - 0.1) {\n console.log('🎬 [MMDPlayerEnhanced] 动画播放结束(时长判定)');\n animationEndedFiredRef.current = true;\n isPlayingRef.current = false;\n setIsPlaying(false);\n onAnimationEnded?.();\n }\n } \n // 方法2: 检测动画是否停止变化(备用方案)\n else {\n // 检查动画时间是否停止增长\n if (Math.abs(currentTime - lastAnimationTimeRef.current) < 0.001) {\n animationStoppedCountRef.current++;\n // 连续30帧(约0.5秒)动画时间不变,认为动画已结束\n if (animationStoppedCountRef.current > 30) {\n console.log('🎬 [MMDPlayerEnhanced] 动画播放结束(停止检测)');\n animationEndedFiredRef.current = true;\n isPlayingRef.current = false;\n setIsPlaying(false);\n onAnimationEnded?.();\n }\n } else {\n animationStoppedCountRef.current = 0;\n }\n lastAnimationTimeRef.current = currentTime;\n }\n }\n }\n\n if (controlsRef.current) {\n controlsRef.current.update();\n }\n\n if (renderer && scene && camera) {\n renderer.render(scene, camera);\n }\n };\n animate();\n \n // 标记场景已初始化\n setIsInitialized(true);\n console.log('✅ [MMDPlayerEnhanced] 场景初始化完成');\n\n return () => {\n window.removeEventListener('resize', handleResize);\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n }\n if (renderer) {\n renderer.dispose();\n if (renderer.domElement && renderer.domElement.parentNode) {\n container.removeChild(renderer.domElement);\n }\n }\n if (controls) {\n controls.dispose();\n }\n };\n }, [stage]);\n\n // 清除旧资源(增强版:更彻底的内存清理)\n const clearOldResources = () => {\n if (!sceneRef.current) return;\n\n // 停止播放\n if (isPlayingRef.current) {\n isPlayingRef.current = false;\n setIsPlaying(false);\n }\n\n // 停止并清理音频\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n audioRef.current.onended = null;\n audioRef.current.src = ''; // 释放音频资源\n audioRef.current.load(); // 强制卸载\n audioRef.current = null;\n }\n\n // ⚠️ 关键修复:完全清除 helper 中的所有对象和物理系统\n if (helperRef.current) {\n try {\n // 1. 停用所有系统\n helperRef.current.enable('animation', false);\n helperRef.current.enable('ik', false);\n helperRef.current.enable('grant', false);\n helperRef.current.enable('physics', false);\n\n // 2. 深度清理物理系统(防止 OOM)\n const helperObjects = (helperRef.current as any).objects;\n if (helperObjects && Array.isArray(helperObjects)) {\n // 收集所有物理世界引用,用于最后销毁\n const physicsWorldsToDestroy = new Set<any>();\n \n helperObjects.forEach((obj: any) => {\n if (obj.physics) {\n try {\n const physics = obj.physics;\n \n // 记录物理世界,稍后统一销毁\n if (physics.world) {\n physicsWorldsToDestroy.add(physics.world);\n }\n \n // 清理刚体\n if (physics.bodies && Array.isArray(physics.bodies)) {\n physics.bodies.forEach((body: any) => {\n if (physics.world && body) {\n try {\n physics.world.removeRigidBody(body);\n // Ammo.js 对象需要手动销毁\n if ((window as any).Ammo && body.destroy) {\n body.destroy();\n }\n } catch (e) {}\n }\n });\n physics.bodies.length = 0;\n physics.bodies = null;\n }\n \n // 清理约束\n if (physics.constraints && Array.isArray(physics.constraints)) {\n physics.constraints.forEach((constraint: any) => {\n if (physics.world && constraint) {\n try {\n physics.world.removeConstraint(constraint);\n if ((window as any).Ammo && constraint.destroy) {\n constraint.destroy();\n }\n } catch (e) {}\n }\n });\n physics.constraints.length = 0;\n physics.constraints = null;\n }\n \n // 调用 reset 并销毁\n if (physics.reset) physics.reset();\n physics.world = null;\n obj.physics = null;\n } catch (e) {\n console.warn('清理物理系统失败:', e);\n }\n }\n });\n \n // 🔥 关键:销毁所有 Ammo.js 物理世界\n physicsWorldsToDestroy.forEach((world) => {\n try {\n // 移除所有剩余的碰撞对象\n while (world.getNumCollisionObjects() > 0) {\n const obj = world.getCollisionObjectArray().at(0);\n world.removeCollisionObject(obj);\n if (obj && obj.destroy) {\n obj.destroy();\n }\n }\n \n // 销毁世界本身\n if (world.destroy) {\n world.destroy();\n }\n } catch (e) {\n console.warn('销毁物理世界失败:', e);\n }\n });\n \n // 清空对象数组\n helperObjects.length = 0;\n }\n } catch (error) {\n console.warn('清理 helper 失败:', error);\n }\n \n helperRef.current = null;\n }\n\n // 清除场景背景和环境贴图\n if (sceneRef.current.background && (sceneRef.current.background as any).isTexture) {\n (sceneRef.current.background as THREE.Texture).dispose();\n sceneRef.current.background = null;\n }\n if (sceneRef.current.environment && (sceneRef.current.environment as any).isTexture) {\n (sceneRef.current.environment as THREE.Texture).dispose();\n sceneRef.current.environment = null;\n }\n\n // 清除场景中的所有 MMD 对象\n const objectsToRemove: THREE.Object3D[] = [];\n sceneRef.current.traverse((child) => {\n if (child.type === 'SkinnedMesh' || (child as any).isSkinnedMesh) {\n objectsToRemove.push(child);\n }\n if (child.type === 'Mesh' && child !== sceneRef.current) {\n objectsToRemove.push(child);\n }\n });\n\n objectsToRemove.forEach((obj) => {\n if (obj.parent) obj.parent.remove(obj);\n\n // 清理 geometry\n if ((obj as any).geometry) {\n (obj as any).geometry.dispose();\n }\n\n // 清理 material 和所有贴图\n if ((obj as any).material) {\n const disposeMaterial = (m: any) => {\n ['map', 'emissiveMap', 'normalMap', 'bumpMap', 'specularMap', \n 'envMap', 'lightMap', 'aoMap', 'alphaMap'].forEach(prop => {\n if (m[prop]) m[prop].dispose();\n });\n m.dispose();\n };\n\n const material = (obj as any).material;\n if (Array.isArray(material)) {\n material.forEach(disposeMaterial);\n } else {\n disposeMaterial(material);\n }\n }\n\n // 清理骨骼\n if ((obj as any).skeleton) {\n (obj as any).skeleton = null;\n }\n });\n\n // 重置时钟和数据\n clockRef.current = new THREE.Clock();\n vmdDataRef.current = null;\n setNeedReset(false);\n\n // 🔥 强制垃圾回收(关键优化)\n if ((window as any).gc) {\n try {\n (window as any).gc();\n console.log('♻️ 已触发垃圾回收');\n } catch (e) {\n // gc() 可能不可用\n }\n }\n\n console.log(`✅ 资源清理完成 (${objectsToRemove.length} 个对象)`);\n };\n\n // 加载MMD资源\n useEffect(() => {\n if (!sceneRef.current || !cameraRef.current) return;\n if (isLoadedRef.current) return;\n \n // 清除旧资源\n clearOldResources();\n \n // 标记为正在加载\n isLoadedRef.current = true;\n const loadMMD = async () => {\n try {\n setLoading(true);\n setLoadingProgress(0);\n\n // 重置动画相关标记\n animationDurationRef.current = 0;\n hasAudioRef.current = false;\n animationEndedFiredRef.current = false;\n lastAnimationTimeRef.current = 0;\n animationStoppedCountRef.current = 0;\n\n // 如果启用物理,先加载 Ammo.js\n if (stage?.enablePhysics !== false) {\n setLoadingProgress(5);\n await loadAmmo({\n scriptPath: stage?.ammoPath || '/mikutalking/libs/ammo.wasm.js',\n wasmBasePath: stage?.ammoWasmPath || '/mikutalking/libs/',\n });\n }\n\n // 创建 LoadingManager 来处理贴图路径\n const manager = new THREE.LoadingManager();\n const basePath = currentResources.modelPath.substring(0, currentResources.modelPath.lastIndexOf('/') + 1);\n \n manager.setURLModifier((url: string) => {\n if (url.startsWith('http://') || url.startsWith('https://')) return url;\n if (url.startsWith('/')) return url;\n return basePath + url;\n });\n\n const loader = new MMDLoader(manager);\n const helper = new MMDAnimationHelper();\n helperRef.current = helper;\n\n // 加载模型\n setLoadingProgress(20);\n const modelStartTime = performance.now();\n const mesh = await new Promise<any>((resolve, reject) => {\n loader.load(\n currentResources.modelPath,\n (object: any) => {\n const loadTime = ((performance.now() - modelStartTime) / 1000).toFixed(2);\n console.log(`✅ 模型加载完成 (${loadTime}s)`);\n resolve(object);\n },\n (progress: any) => {\n if (progress.total > 0) {\n setLoadingProgress(Math.min((progress.loaded / progress.total) * 30 + 20, 50));\n }\n },\n (error: any) => {\n console.error('❌ 模型加载失败:', error);\n reject(error);\n }\n );\n });\n\n if (!sceneRef.current) {\n throw new Error('场景未初始化');\n }\n\n sceneRef.current.add(mesh);\n\n // 加载场景模型\n if (currentResources.stageModelPath) {\n const stageMesh = await new Promise<any>((resolve, reject) => {\n loader.load(currentResources.stageModelPath!, resolve, undefined, reject);\n });\n sceneRef.current.add(stageMesh);\n }\n\n // 加载背景图片\n if (currentResources.backgroundPath && sceneRef.current) {\n const textureLoader = new THREE.TextureLoader();\n const backgroundTexture = await new Promise<THREE.Texture>((resolve, reject) => {\n textureLoader.load(currentResources.backgroundPath!, resolve, undefined, reject);\n });\n\n backgroundTexture.colorSpace = THREE.SRGBColorSpace;\n if (stage?.backgroundType === 'skybox') {\n backgroundTexture.mapping = THREE.EquirectangularReflectionMapping;\n sceneRef.current.background = backgroundTexture;\n sceneRef.current.environment = backgroundTexture;\n } else {\n sceneRef.current.background = backgroundTexture;\n }\n }\n\n // 初始化动画数据存储\n let vmd: any = null;\n let cameraVmd: any = null;\n\n // 加载动作\n if (currentResources.motionPath) {\n setLoadingProgress(60);\n vmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(\n currentResources.motionPath!,\n mesh,\n resolve,\n (progress: any) => {\n if (progress.total > 0) {\n setLoadingProgress(Math.min((progress.loaded / progress.total) * 20 + 60, 80));\n }\n },\n reject\n );\n });\n\n helper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n\n // 计算动画时长\n if (vmd) {\n let maxDuration = 0;\n if (vmd.duration !== undefined) {\n maxDuration = vmd.duration;\n } else if (Array.isArray(vmd) && vmd.length > 0 && vmd[0].duration !== undefined) {\n maxDuration = vmd[0].duration;\n } else if (vmd.clip && vmd.clip.duration !== undefined) {\n maxDuration = vmd.clip.duration;\n }\n if (maxDuration > 0) {\n animationDurationRef.current = maxDuration;\n }\n }\n } else {\n helper.add(mesh, { physics: stage?.enablePhysics !== false });\n }\n\n // 加载镜头动画\n if (currentResources.cameraPath && cameraRef.current) {\n setLoadingProgress(80);\n cameraVmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(currentResources.cameraPath!, cameraRef.current!, resolve, undefined, reject);\n });\n helper.add(cameraRef.current, { animation: cameraVmd });\n }\n\n // 加载音频\n if (currentResources.audioPath) {\n setLoadingProgress(90);\n const audio = new Audio(currentResources.audioPath);\n audio.volume = 0.5;\n audio.loop = loop;\n audioRef.current = audio;\n hasAudioRef.current = true;\n\n audio.onended = () => {\n if (!loop) {\n setIsPlaying(false);\n if (helperRef.current && sceneRef.current) {\n const mesh = sceneRef.current.children.find(\n (child) => child.type === 'SkinnedMesh'\n );\n if (mesh) {\n helperRef.current.pose(mesh as any, {});\n }\n }\n }\n onAudioEnded?.();\n };\n }\n\n setLoadingProgress(100);\n setLoading(false);\n\n // 保存动画数据用于后续重置\n vmdDataRef.current = { mesh, vmd, cameraVmd };\n\n // 如果是从 stop 后重新加载,则自动播放\n if (shouldAutoPlayAfterReloadRef.current) {\n shouldAutoPlayAfterReloadRef.current = false;\n setTimeout(() => play(), 500);\n } else if (autoPlay) {\n // 否则根据 autoPlay 配置决定是否播放\n setTimeout(() => play(), 500);\n }\n\n onLoad?.();\n } catch (err: any) {\n console.error('❌ MMD加载失败:', err);\n setError(err.message || '加载失败');\n setLoading(false);\n isLoadedRef.current = false; // 加载失败时重置标记,允许重试\n onError?.(err);\n }\n };\n\n loadMMD();\n }, [currentResources, stage?.enablePhysics, autoPlay, loop, onLoad, onError, reloadTrigger]);\n\n // 播放控制\n const play = () => {\n // 🔥 关键修复:强制清理所有可能存在的物理世界引用\n if (needReset && vmdDataRef.current && sceneRef.current && cameraRef.current) {\n console.log('🔄 检测到需要重置,开始强制清理...');\n\n // 1. 强制停止所有动画循环\n if (animationIdRef.current) {\n cancelAnimationFrame(animationIdRef.current);\n animationIdRef.current = null;\n }\n\n // 2. 深度清理物理系统(在创建新helper前)\n if (helperRef.current) {\n try {\n // 停用所有系统\n helperRef.current.enable('animation', false);\n helperRef.current.enable('ik', false);\n helperRef.current.enable('grant', false);\n helperRef.current.enable('physics', false);\n\n // 清理物理世界\n const helperObjects = (helperRef.current as any).objects;\n if (helperObjects && Array.isArray(helperObjects)) {\n const physicsWorldsToDestroy = new Set<any>();\n\n helperObjects.forEach((obj: any) => {\n if (obj.physics) {\n try {\n const physics = obj.physics;\n if (physics.world) {\n physicsWorldsToDestroy.add(physics.world);\n }\n\n // 清理刚体\n if (physics.bodies && Array.isArray(physics.bodies)) {\n physics.bodies.forEach((body: any) => {\n if (physics.world && body) {\n try {\n physics.world.removeRigidBody(body);\n if ((window as any).Ammo && body.destroy) {\n body.destroy();\n }\n } catch (e) {}\n }\n });\n physics.bodies.length = 0;\n physics.bodies = null;\n }\n\n // 清理约束\n if (physics.constraints && Array.isArray(physics.constraints)) {\n physics.constraints.forEach((constraint: any) => {\n if (physics.world && constraint) {\n try {\n physics.world.removeConstraint(constraint);\n if ((window as any).Ammo && constraint.destroy) {\n constraint.destroy();\n }\n } catch (e) {}\n }\n });\n physics.constraints.length = 0;\n physics.constraints = null;\n }\n\n physics.world = null;\n obj.physics = null;\n } catch (e) {}\n }\n });\n\n // 🔥 强制销毁物理世界\n physicsWorldsToDestroy.forEach((world) => {\n try {\n while (world.getNumCollisionObjects() > 0) {\n const obj = world.getCollisionObjectArray().at(0);\n world.removeCollisionObject(obj);\n if (obj && obj.destroy) obj.destroy();\n }\n if (world.destroy) world.destroy();\n } catch (e) {}\n });\n\n helperObjects.length = 0;\n }\n } catch (error) {}\n }\n\n // 3. 创建全新的helper实例\n const newHelper = new MMDAnimationHelper();\n helperRef.current = newHelper;\n clockRef.current = new THREE.Clock();\n\n const { mesh, vmd, cameraVmd } = vmdDataRef.current;\n\n // 4. 重新添加模型和动画\n if (vmd && typeof vmd === 'object') {\n try {\n newHelper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n } catch (error) {\n try {\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n } catch (innerError) {}\n }\n } else {\n try {\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n } catch (error) {}\n }\n\n // 5. 重新添加相机动画\n if (cameraVmd && typeof cameraVmd === 'object') {\n try {\n newHelper.add(cameraRef.current, { animation: cameraVmd });\n } catch (error) {}\n }\n\n // 6. 重置音频\n if (audioRef.current) {\n audioRef.current.currentTime = 0;\n }\n\n setNeedReset(false);\n console.log('✅ 强制清理完成,开始播放');\n }\n\n if (!helperRef.current) {\n console.error('❌ [play] helper 不存在,无法播放');\n return;\n }\n\n // 正常播放流程\n // 播放音频\n if (audioRef.current) {\n audioRef.current.play();\n }\n\n // 启用动画和物理\n helperRef.current.enable('animation', true);\n helperRef.current.enable('ik', true);\n helperRef.current.enable('grant', true);\n helperRef.current.enable('physics', true);\n\n if (!isPlaying) {\n clockRef.current.start();\n }\n\n // 重置动画结束标记,允许再次触发\n animationEndedFiredRef.current = false;\n lastAnimationTimeRef.current = 0;\n animationStoppedCountRef.current = 0;\n\n isPlayingRef.current = true; // 更新 ref\n setIsPlaying(true);\n\n console.log('▶️ 开始播放(包括相机动画)');\n };\n\n const pause = () => {\n if (!helperRef.current) return;\n\n // 暂停音频\n if (audioRef.current) {\n audioRef.current.pause();\n }\n\n // 停止时钟更新,这样 helper.update() 就不会推进动画时间\n clockRef.current.stop();\n\n isPlayingRef.current = false; // 更新 ref,停止动画循环中的更新\n setIsPlaying(false);\n console.log('⏸️ 暂停播放(包括相机动画)');\n };\n\n const stop = () => {\n if (!helperRef.current || !sceneRef.current) return;\n\n console.log('⏹️ 停止播放,开始清理物理系统...');\n\n // 停止播放状态\n isPlayingRef.current = false;\n setIsPlaying(false);\n\n // 重置音频到开头\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n }\n\n // 停止并重置时钟 - 这会让下次播放从头开始\n clockRef.current.stop();\n clockRef.current = new THREE.Clock();\n\n // 🔥 关键修复:强制清理物理系统,避免OOM\n try {\n // 停用所有系统\n helperRef.current.enable('animation', false);\n helperRef.current.enable('ik', false);\n helperRef.current.enable('grant', false);\n helperRef.current.enable('physics', false);\n\n // 深度清理物理世界\n const helperObjects = (helperRef.current as any).objects;\n if (helperObjects && Array.isArray(helperObjects)) {\n const physicsWorldsToDestroy = new Set<any>();\n\n helperObjects.forEach((obj: any) => {\n if (obj.physics) {\n try {\n const physics = obj.physics;\n if (physics.world) {\n physicsWorldsToDestroy.add(physics.world);\n }\n\n // 清理刚体\n if (physics.bodies && Array.isArray(physics.bodies)) {\n physics.bodies.forEach((body: any) => {\n if (physics.world && body) {\n try {\n physics.world.removeRigidBody(body);\n if ((window as any).Ammo && body.destroy) {\n body.destroy();\n }\n } catch (e) {}\n }\n });\n physics.bodies.length = 0;\n physics.bodies = null;\n }\n\n // 清理约束\n if (physics.constraints && Array.isArray(physics.constraints)) {\n physics.constraints.forEach((constraint: any) => {\n if (physics.world && constraint) {\n try {\n physics.world.removeConstraint(constraint);\n if ((window as any).Ammo && constraint.destroy) {\n constraint.destroy();\n }\n } catch (e) {}\n }\n });\n physics.constraints.length = 0;\n physics.constraints = null;\n }\n\n physics.world = null;\n obj.physics = null;\n } catch (e) {}\n }\n });\n\n // 🔥 强制销毁物理世界\n physicsWorldsToDestroy.forEach((world) => {\n try {\n while (world.getNumCollisionObjects() > 0) {\n const obj = world.getCollisionObjectArray().at(0);\n world.removeCollisionObject(obj);\n if (obj && obj.destroy) obj.destroy();\n }\n if (world.destroy) world.destroy();\n } catch (e) {}\n });\n\n helperObjects.length = 0;\n }\n } catch (error) {\n console.warn('停止时清理物理系统失败:', error);\n }\n\n // 重置模型姿势到初始状态(T-pose)\n const mesh = sceneRef.current.children.find(\n (child) => child.type === 'SkinnedMesh' || (child as any).isSkinnedMesh\n );\n if (mesh && (mesh as any).skeleton) {\n // 使用 skeleton 的 pose() 方法重置骨骼到初始姿势\n (mesh as any).skeleton.pose();\n }\n\n // 重置相机到初始位置\n if (cameraRef.current) {\n const camPos = stage?.cameraPosition || { x: 0, y: 10, z: 30 };\n const camTarget = stage?.cameraTarget || { x: 0, y: 10, z: 0 };\n cameraRef.current.position.set(camPos.x, camPos.y, camPos.z);\n\n // 如果有 OrbitControls,也需要重置目标\n if (controlsRef.current) {\n controlsRef.current.target.set(camTarget.x, camTarget.y, camTarget.z);\n controlsRef.current.update();\n } else {\n cameraRef.current.lookAt(camTarget.x, camTarget.y, camTarget.z);\n }\n }\n\n // 标记需要在下次播放时重置动画\n setNeedReset(true);\n\n console.log('✅ 停止播放并清理完成,needReset = true');\n };\n\n // 资源切换处理(resourcesList 模式)\n const handleResourceChange = (resourceId: string) => {\n console.log('🔄 [MMDPlayerEnhanced] 切换资源:', resourceId);\n \n // 停止当前播放\n if (isPlayingRef.current) {\n isPlayingRef.current = false;\n setIsPlaying(false);\n }\n\n // 停止音频\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n }\n\n // 更新选中的资源ID\n setSelectedResourceId(resourceId);\n \n // 标记需要重新加载(不使用 needReset,那是给 stop 按钮用的)\n isLoadedRef.current = false;\n setNeedReset(false); // 确保 needReset 为 false\n \n // 触发重新加载\n setReloadTrigger(prev => prev + 1);\n\n // 触发回调\n if (onResourceChange) {\n onResourceChange(resourceId);\n }\n\n // 关闭设置弹窗\n setShowSettings(false);\n };\n\n // 资源选择处理(resourceOptions 模式)\n const handleSelectionChange = (type: 'model' | 'motion' | 'audio' | 'camera' | 'stageModel' | 'background', id: string) => {\n console.log(`🔄 [MMDPlayerEnhanced] 选择${type}:`, id);\n \n // 记录当前是否在播放,用于重新加载后恢复播放状态\n const wasPlaying = isPlayingRef.current;\n \n // 停止当前播放\n if (isPlayingRef.current) {\n isPlayingRef.current = false;\n setIsPlaying(false);\n }\n\n // 停止音频\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n }\n\n // 更新选中的资源\n if (type === 'model') setSelectedModelId(id);\n if (type === 'motion') setSelectedMotionId(id);\n if (type === 'audio') setSelectedAudioId(id);\n if (type === 'camera') setSelectedCameraId(id);\n if (type === 'stageModel') setSelectedStageModelId(id);\n if (type === 'background') setSelectedBackgroundId(id);\n \n // 标记需要重新加载(不使用 needReset,那是给 stop 按钮用的)\n isLoadedRef.current = false;\n setNeedReset(false); // 确保 needReset 为 false\n \n // 如果之前在播放,或者 autoPlay 为 true,则重新加载后自动播放\n if (wasPlaying || autoPlay) {\n shouldAutoPlayAfterReloadRef.current = true;\n }\n \n // 触发重新加载\n setReloadTrigger(prev => prev + 1);\n\n // 触发回调\n if (onSelectionChange) {\n const newSelection = {\n modelId: type === 'model' ? id : selectedModelId,\n motionId: type === 'motion' ? id : selectedMotionId,\n audioId: type === 'audio' ? id : selectedAudioId,\n cameraId: type === 'camera' ? id : selectedCameraId,\n stageModelId: type === 'stageModel' ? id : selectedStageModelId,\n backgroundId: type === 'background' ? id : selectedBackgroundId,\n };\n onSelectionChange(newSelection);\n }\n };\n\n // 移除了这部分代码,改为使用覆盖层\n\n return (\n <div className={`relative h-full w-full ${className}`} style={style}>\n <div ref={containerRef} className=\"h-full w-full\" />\n\n {/* 加载状态覆盖层 */}\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black text-white\">\n <div className=\"mb-4 text-2xl\">🎭 加载MMD资源中...</div>\n <div className=\"h-4 w-3/4 max-w-md overflow-hidden rounded-full bg-gray-700\">\n <div\n className=\"h-full bg-gradient-to-r from-blue-500 to-purple-500 transition-all duration-300\"\n style={{ width: `${loadingProgress}%` }}\n />\n </div>\n <div className=\"mt-2 text-sm text-gray-400\">{Math.round(loadingProgress)}%</div>\n </div>\n )}\n\n {/* 错误状态覆盖层 */}\n {/* {error && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-red-900 text-white\">\n <div className=\"text-center\">\n <div className=\"mb-4 text-4xl\">❌</div>\n <div className=\"text-xl\">加载失败</div>\n <div className=\"mt-2 text-sm text-gray-300\">{error}</div>\n </div>\n </div>\n )} */}\n\n {/* 播放控制按钮 */}\n {isInitialized && !loading && !error && (\n <div className=\"absolute bottom-4 left-1/2 flex -translate-x-1/2 gap-2 rounded-full bg-black/50 px-4 py-2 backdrop-blur-md\">\n {!isPlaying ? (\n <button\n onClick={play}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-green-500 text-xl text-white transition-colors hover:bg-green-600\"\n title=\"播放\"\n >\n ▶️\n </button>\n ) : (\n <button\n onClick={pause}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-yellow-500 text-xl text-white transition-colors hover:bg-yellow-600\"\n title=\"暂停\"\n >\n ⏸️\n </button>\n )}\n\n <button\n onClick={stop}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-500 text-xl text-white transition-colors hover:bg-red-600\"\n title=\"停止\"\n >\n ⏹️\n </button>\n\n {/* 设置按钮(仅在提供资源列表或资源选项时显示) */}\n {((resourcesList && resourcesList.length > 1) || resourceOptions) && (\n <button\n onClick={() => setShowSettings(true)}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-purple-500 text-xl text-white transition-colors hover:bg-purple-600\"\n title=\"设置\"\n >\n ⚙️\n </button>\n )}\n </div>\n )}\n\n {/* 设置弹窗 - resourcesList 模式 */}\n {showSettings && resourcesList && (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"max-h-[80vh] w-full max-w-md overflow-hidden rounded-2xl bg-gradient-to-br from-gray-900 to-black shadow-2xl\">\n {/* 标题栏 */}\n <div className=\"flex items-center justify-between border-b border-white/10 px-6 py-4\">\n <h3 className=\"text-xl font-bold text-white\">选择资源</h3>\n <button\n onClick={() => setShowSettings(false)}\n className=\"text-2xl text-white/60 transition-colors hover:text-white\"\n >\n ✕\n </button>\n </div>\n\n {/* 资源列表 */}\n <div className=\"max-h-[60vh] overflow-y-auto p-4\">\n {resourcesList.map((item) => (\n <button\n key={item.id}\n onClick={() => handleResourceChange(item.id)}\n className={`mb-3 w-full rounded-xl p-4 text-left transition-all ${\n selectedResourceId === item.id\n ? 'bg-gradient-to-r from-purple-600 to-blue-600 shadow-lg'\n : 'bg-white/5 hover:bg-white/10'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1\">\n <h4 className=\"font-semibold text-white\">{item.name}</h4>\n <div className=\"mt-1 flex flex-wrap gap-2 text-xs text-white/60\">\n {item.resources.modelPath && (\n <span className=\"rounded bg-white/10 px-2 py-1\">模型</span>\n )}\n {item.resources.motionPath && (\n <span className=\"rounded bg-white/10 px-2 py-1\">动作</span>\n )}\n {item.resources.cameraPath && (\n <span className=\"rounded bg-white/10 px-2 py-1\">相机</span>\n )}\n {item.resources.audioPath && (\n <span className=\"rounded bg-white/10 px-2 py-1\">音频</span>\n )}\n </div>\n </div>\n {selectedResourceId === item.id && (\n <div className=\"ml-4 text-2xl\">✓</div>\n )}\n </div>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* 设置弹窗 - resourceOptions 模式(自定义下拉选择) */}\n {showSettings && resourceOptions && (\n <div className=\"absolute top-4 right-4 z-50 w-80 rounded-xl bg-black/90 backdrop-blur-md shadow-2xl border border-white/10\">\n {/* 标题栏 */}\n <div className=\"flex items-center justify-between border-b border-white/10 px-4 py-3\">\n <h3 className=\"text-sm font-bold text-white\">资源设置</h3>\n <button\n onClick={() => setShowSettings(false)}\n className=\"text-lg text-white/60 transition-colors hover:text-white\"\n >\n ✕\n </button>\n </div>\n\n {/* 选择区域 */}\n <div className=\"max-h-[70vh] overflow-y-auto p-4 space-y-2\">\n {/* 模型选择 */}\n {resourceOptions.models && resourceOptions.models.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'model' ? null : 'model')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">模型</span>\n <span className=\"text-sm text-white font-medium\">\n {resourceOptions.models.find(m => m.id === selectedModelId)?.name || '未选择'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'model' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'model' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n {resourceOptions.models.map((model) => (\n <button\n key={model.id}\n onClick={() => {\n handleSelectionChange('model', model.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedModelId === model.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {model.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 动作选择 */}\n {resourceOptions.motions && resourceOptions.motions.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'motion' ? null : 'motion')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">动作</span>\n <span className=\"text-sm text-white font-medium\">\n {selectedMotionId ? resourceOptions.motions.find(m => m.id === selectedMotionId)?.name : '无'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'motion' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'motion' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n <button\n onClick={() => {\n handleSelectionChange('motion', '');\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedMotionId === ''\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n 无\n </button>\n {resourceOptions.motions.map((motion) => (\n <button\n key={motion.id}\n onClick={() => {\n handleSelectionChange('motion', motion.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedMotionId === motion.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {motion.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 音乐选择 */}\n {resourceOptions.audios && resourceOptions.audios.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'audio' ? null : 'audio')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">音乐</span>\n <span className=\"text-sm text-white font-medium\">\n {selectedAudioId ? resourceOptions.audios.find(a => a.id === selectedAudioId)?.name : '无'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'audio' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'audio' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n <button\n onClick={() => {\n handleSelectionChange('audio', '');\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedAudioId === ''\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n 无\n </button>\n {resourceOptions.audios.map((audio) => (\n <button\n key={audio.id}\n onClick={() => {\n handleSelectionChange('audio', audio.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedAudioId === audio.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {audio.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 相机选择 */}\n {resourceOptions.cameras && resourceOptions.cameras.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'camera' ? null : 'camera')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">相机</span>\n <span className=\"text-sm text-white font-medium\">\n {selectedCameraId ? resourceOptions.cameras.find(c => c.id === selectedCameraId)?.name : '无'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'camera' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'camera' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n <button\n onClick={() => {\n handleSelectionChange('camera', '');\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedCameraId === ''\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n 无\n </button>\n {resourceOptions.cameras.map((camera) => (\n <button\n key={camera.id}\n onClick={() => {\n handleSelectionChange('camera', camera.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedCameraId === camera.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {camera.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 场景选择 */}\n {resourceOptions.stageModels && resourceOptions.stageModels.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'stageModel' ? null : 'stageModel')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">场景</span>\n <span className=\"text-sm text-white font-medium\">\n {selectedStageModelId ? resourceOptions.stageModels.find(s => s.id === selectedStageModelId)?.name : '无'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'stageModel' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'stageModel' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n <button\n onClick={() => {\n handleSelectionChange('stageModel', '');\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedStageModelId === ''\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n 无\n </button>\n {resourceOptions.stageModels.map((stageModel) => (\n <button\n key={stageModel.id}\n onClick={() => {\n handleSelectionChange('stageModel', stageModel.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedStageModelId === stageModel.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {stageModel.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 背景选择 */}\n {resourceOptions.backgrounds && resourceOptions.backgrounds.length > 0 && (\n <div className=\"rounded-lg bg-white/5 overflow-hidden\">\n <button\n onClick={() => setExpandedSection(expandedSection === 'background' ? null : 'background')}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-white/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-white/70\">背景</span>\n <span className=\"text-sm text-white font-medium\">\n {selectedBackgroundId ? resourceOptions.backgrounds.find(b => b.id === selectedBackgroundId)?.name : '无'}\n </span>\n </div>\n <span className={`text-white/60 transition-transform ${expandedSection === 'background' ? 'rotate-180' : ''}`}>\n ▼\n </span>\n </button>\n {expandedSection === 'background' && (\n <div className=\"border-t border-white/10 p-2 space-y-1 max-h-60 overflow-y-auto\">\n <button\n onClick={() => {\n handleSelectionChange('background', '');\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedBackgroundId === ''\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n 无\n </button>\n {resourceOptions.backgrounds.map((background) => (\n <button\n key={background.id}\n onClick={() => {\n handleSelectionChange('background', background.id);\n setExpandedSection(null);\n }}\n className={`w-full rounded px-3 py-2 text-left text-sm transition-all ${\n selectedBackgroundId === background.id\n ? 'bg-purple-600 text-white font-medium'\n : 'text-white/80 hover:bg-white/10'\n }`}\n >\n {background.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\n","'use client'\n\nimport React, { useState, useRef, useEffect } from 'react'\nimport { MMDPlayerEnhanced } from './MMDPlayerEnhanced'\nimport type { MMDPlaylistProps, MMDPlaylistNode } from '../types'\n\n/**\n * MMD 播放列表组件(预加载版本)\n * \n * 在初始化时预加载所有节点的资源,切换时无需加载页面,实现无缝切换\n * \n * @example\n * ```tsx\n * const playlist = {\n * id: 'my-playlist',\n * name: '我的播放列表',\n * nodes: [\n * {\n * id: 'node1',\n * name: '第一个节点',\n * resources: { modelPath: '...', motionPath: '...', audioPath: '...' }\n * },\n * {\n * id: 'node2',\n * name: '第二个节点',\n * resources: { modelPath: '...', motionPath: '...', audioPath: '...' }\n * }\n * ],\n * loop: true,\n * autoPlay: true\n * };\n * \n * <MMDPlaylist playlist={playlist} />\n * ```\n */\nexport const MMDPlaylist: React.FC<MMDPlaylistProps> = ({\n playlist,\n stage,\n defaultNodeIndex = 0,\n className,\n style,\n onLoad,\n onError,\n onNodeChange,\n onPlaylistComplete,\n}) => {\n console.log('🎬 [MMDPlaylist] 组件初始化');\n console.log('📋 [MMDPlaylist] 播放列表:', playlist.name, '节点数:', playlist.nodes.length);\n\n // 当前播放的节点索引\n const [currentNodeIndex, setCurrentNodeIndex] = useState<number>(defaultNodeIndex);\n // 是否显示配置弹窗(不是播放列表弹窗)\n const [showSettings, setShowSettings] = useState(false);\n // 预加载状态\n const [preloadedNodes, setPreloadedNodes] = useState<Set<number>>(new Set());\n const [isPreloading, setIsPreloading] = useState(true);\n const [preloadProgress, setPreloadProgress] = useState(0);\n \n // 播放列表节点管理(本地状态)\n const [editableNodes, setEditableNodes] = useState<MMDPlaylistNode[]>(playlist.nodes);\n \n // 使用 ref 保存当前节点索引,避免闭包问题\n const currentNodeIndexRef = useRef<number>(defaultNodeIndex);\n // 标记是否是自动切换(用于控制是否自动播放)\n const isAutoSwitchRef = useRef<boolean>(false);\n // 保存每个播放器的 ref\n const playerRefsMap = useRef<Map<number, any>>(new Map());\n\n // 同步 currentNodeIndex 到 ref\n useEffect(() => {\n currentNodeIndexRef.current = currentNodeIndex;\n }, [currentNodeIndex]);\n\n // 获取当前节点(使用可编辑的节点列表)\n const currentNode = editableNodes[currentNodeIndex];\n\n if (!currentNode) {\n console.error('❌ [MMDPlaylist] 无效的节点索引:', currentNodeIndex);\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-black text-white\">\n <p>播放列表节点索引无效</p>\n </div>\n );\n }\n\n console.log('🎯 [MMDPlaylist] 当前节点:', currentNode.name, '索引:', currentNodeIndex);\n\n // 停止指定节点的播放\n const stopNode = (nodeIndex: number) => {\n const playerElement = playerRefsMap.current.get(nodeIndex);\n if (!playerElement) return;\n\n console.log(`⏹️ [MMDPlaylist] 停止节点 ${nodeIndex}`);\n\n // 1. 停止音频\n const audioElement = playerElement.querySelector('audio');\n if (audioElement) {\n audioElement.pause();\n audioElement.currentTime = 0;\n console.log(` 🔇 停止音频`);\n }\n\n // 2. 点击停止按钮(如果存在)\n const stopButton = playerElement.querySelector('button[title=\"停止\"]');\n if (stopButton) {\n (stopButton as HTMLButtonElement).click();\n console.log(` ⏹️ 点击停止按钮`);\n } else {\n // 如果没有停止按钮,尝试点击暂停按钮\n const pauseButton = playerElement.querySelector('button[title=\"暂停\"]');\n if (pauseButton) {\n (pauseButton as HTMLButtonElement).click();\n console.log(` ⏸️ 点击暂停按钮`);\n }\n }\n };\n\n // 节点切换处理\n useEffect(() => {\n console.log(`🔄 [MMDPlaylist] 节点切换: ${currentNodeIndex} - ${currentNode.name}`);\n \n // 停止所有其他节点的播放\n editableNodes.forEach((_, index) => {\n if (index !== currentNodeIndex) {\n stopNode(index);\n }\n });\n\n onNodeChange?.(currentNodeIndex, currentNode);\n \n // 如果预加载已完成,且是自动切换或 playlist.autoPlay 为 true,则开始播放\n if (!isPreloading && (isAutoSwitchRef.current || playlist.autoPlay)) {\n console.log(`▶️ [MMDPlaylist] 准备播放节点 ${currentNodeIndex}`);\n \n // 确保节点已经预加载完成再触发播放\n if (!preloadedNodes.has(currentNodeIndex)) {\n console.warn(`⚠️ [MMDPlaylist] 节点 ${currentNodeIndex} 尚未预加载完成,等待...`);\n return;\n }\n \n // 延迟一帧,确保 visibility 切换完成和停止操作完成\n requestAnimationFrame(() => {\n const playerElement = playerRefsMap.current.get(currentNodeIndex);\n if (playerElement) {\n // 查找播放按钮并点击\n const playButton = playerElement.querySelector('button[title=\"播放\"]');\n if (playButton) {\n console.log(`🎬 [MMDPlaylist] 触发节点 ${currentNodeIndex} 播放`);\n (playButton as HTMLButtonElement).click();\n } else {\n console.warn(`⚠️ [MMDPlaylist] 未找到节点 ${currentNodeIndex} 的播放按钮`);\n }\n } else {\n console.warn(`⚠️ [MMDPlaylist] 未找到节点 ${currentNodeIndex} 的 DOM 元素`);\n }\n });\n }\n }, [currentNodeIndex, currentNode, onNodeChange, isPreloading, playlist.autoPlay, preloadedNodes, editableNodes]);\n\n // 处理节点预加载完成\n const handleNodePreloaded = (nodeIndex: number) => {\n console.log(`✅ [MMDPlaylist] 节点 ${nodeIndex} 预加载完成`);\n setPreloadedNodes(prev => {\n const newSet = new Set(prev);\n newSet.add(nodeIndex);\n return newSet;\n });\n };\n\n // 检查所有节点是否都已预加载\n useEffect(() => {\n if (preloadedNodes.size === editableNodes.length) {\n console.log('🎉 [MMDPlaylist] 所有节点预加载完成');\n setIsPreloading(false);\n onLoad?.();\n } else {\n const progress = Math.round((preloadedNodes.size / editableNodes.length) * 100);\n setPreloadProgress(progress);\n }\n }, [preloadedNodes, editableNodes.length, onLoad]);\n\n // 处理播放结束事件(音频或动画结束时触发)\n // 使用 useCallback 并为每个节点创建独立的回调\n const handlePlaybackEnded = (nodeIndex: number) => {\n console.log(`🎵 [MMDPlaylist] 节点 ${nodeIndex} 播放完成`);\n \n // 只处理当前正在播放的节点\n if (nodeIndex !== currentNodeIndexRef.current) {\n console.log(`⚠️ [MMDPlaylist] 忽略非当前节点 ${nodeIndex} 的播放结束事件(当前: ${currentNodeIndexRef.current})`);\n return;\n }\n\n const node = editableNodes[nodeIndex];\n if (!node) return;\n\n // 如果当前节点设置了循环,则不切换\n if (node.loop) {\n console.log('🔁 [MMDPlaylist] 当前节点循环播放');\n return;\n }\n\n const isLastNode = nodeIndex === editableNodes.length - 1;\n\n // 如果不是最后一个节点,切换到下一个\n if (!isLastNode) {\n console.log(`➡️ [MMDPlaylist] 切换到下一个节点: ${nodeIndex + 1}`);\n isAutoSwitchRef.current = true; // 标记为自动切换\n setCurrentNodeIndex(nodeIndex + 1);\n return;\n }\n\n // 如果是最后一个节点且列表设置了循环,回到第一个\n if (playlist.loop) {\n console.log('🔁 [MMDPlaylist] 播放列表循环,回到第一个节点');\n isAutoSwitchRef.current = true; // 标记为自动切换\n setCurrentNodeIndex(0);\n return;\n }\n\n // 否则,播放列表结束\n console.log('✅ [MMDPlaylist] 播放列表播放完成');\n onPlaylistComplete?.();\n };\n\n // 播放列表控制函数\n const playlistPrevious = () => {\n const newIndex = currentNodeIndex > 0 ? currentNodeIndex - 1 : editableNodes.length - 1;\n console.log(`⬅️ [MMDPlaylist] 上一个节点: ${newIndex}`);\n isAutoSwitchRef.current = false; // 手动切换\n setCurrentNodeIndex(newIndex);\n };\n\n const playlistNext = () => {\n const newIndex = currentNodeIndex < editableNodes.length - 1 ? currentNodeIndex + 1 : 0;\n console.log(`➡️ [MMDPlaylist] 下一个节点: ${newIndex}`);\n isAutoSwitchRef.current = false; // 手动切换\n setCurrentNodeIndex(newIndex);\n };\n\n const playlistJumpTo = (index: number) => {\n if (index < 0 || index >= editableNodes.length) return;\n console.log(`🎯 [MMDPlaylist] 跳转到节点: ${index}`);\n isAutoSwitchRef.current = false; // 手动切换\n setCurrentNodeIndex(index);\n };\n\n // 节点管理函数\n const handleDeleteNode = (index: number) => {\n if (editableNodes.length <= 1) {\n alert('播放列表至少需要保留一个节点');\n return;\n }\n\n const newNodes = editableNodes.filter((_, i) => i !== index);\n setEditableNodes(newNodes);\n \n // 如果删除的是当前节点之前的节点,需要调整当前索引\n if (index < currentNodeIndex) {\n setCurrentNodeIndex(currentNodeIndex - 1);\n }\n // 如果删除的是当前节点,跳转到前一个节点(或第一个节点)\n else if (index === currentNodeIndex) {\n const newIndex = Math.max(0, currentNodeIndex - 1);\n setCurrentNodeIndex(newIndex);\n }\n \n console.log(`🗑️ [MMDPlaylist] 删除节点 ${index}`);\n };\n\n const handleMoveNodeUp = (index: number) => {\n if (index === 0) return;\n \n const newNodes = [...editableNodes];\n const temp = newNodes[index - 1]!;\n newNodes[index - 1] = newNodes[index]!;\n newNodes[index] = temp;\n setEditableNodes(newNodes);\n \n // 更新当前索引\n if (currentNodeIndex === index) {\n setCurrentNodeIndex(index - 1);\n } else if (currentNodeIndex === index - 1) {\n setCurrentNodeIndex(index);\n }\n \n console.log(`⬆️ [MMDPlaylist] 节点 ${index} 上移`);\n };\n\n const handleMoveNodeDown = (index: number) => {\n if (index === editableNodes.length - 1) return;\n \n const newNodes = [...editableNodes];\n const temp = newNodes[index]!;\n newNodes[index] = newNodes[index + 1]!;\n newNodes[index + 1] = temp;\n setEditableNodes(newNodes);\n \n // 更新当前索引\n if (currentNodeIndex === index) {\n setCurrentNodeIndex(index + 1);\n } else if (currentNodeIndex === index + 1) {\n setCurrentNodeIndex(index);\n }\n \n console.log(`⬇️ [MMDPlaylist] 节点 ${index} 下移`);\n };\n\n // 计算是否应该自动播放\n // 只在初始加载时,根据 playlist.autoPlay 决定是否自动播放第一个节点\n const shouldAutoPlayInitial = playlist.autoPlay && currentNodeIndex === defaultNodeIndex && !isPreloading;\n\n return (\n <div className={`relative ${className || ''}`} style={style}>\n {/* 预加载所有节点(隐藏) */}\n {editableNodes.map((node, index) => {\n return (\n <div\n key={`player-${node.id}-${index}`}\n ref={(el) => {\n if (el) {\n playerRefsMap.current.set(index, el);\n }\n }}\n className=\"absolute inset-0\"\n style={{\n visibility: index === currentNodeIndex ? 'visible' : 'hidden',\n zIndex: index === currentNodeIndex ? 1 : 0,\n }}\n >\n <MMDPlayerEnhanced\n resources={node.resources}\n stage={stage}\n autoPlay={index === currentNodeIndex && shouldAutoPlayInitial}\n loop={node.loop || false}\n className=\"h-full w-full\"\n onLoad={() => {\n handleNodePreloaded(index);\n }}\n onError={(error) => {\n console.error(`❌ [MMDPlaylist] 节点 ${index} 加载失败:`, error);\n if (index === currentNodeIndex) {\n onError?.(error);\n }\n }}\n onAudioEnded={() => handlePlaybackEnded(index)}\n onAnimationEnded={() => handlePlaybackEnded(index)}\n />\n </div>\n );\n })}\n\n {/* 预加载进度提示 */}\n {isPreloading && (\n <div className=\"absolute inset-0 z-50 flex flex-col items-center justify-center bg-black/80 backdrop-blur-sm\">\n <div className=\"text-center\">\n <div className=\"mb-4 text-2xl font-bold text-white\">\n 正在预加载播放列表\n </div>\n <div className=\"mb-2 text-lg text-white/80\">\n {preloadedNodes.size} / {editableNodes.length} 节点\n </div>\n <div className=\"h-2 w-64 overflow-hidden rounded-full bg-white/20\">\n <div\n className=\"h-full bg-gradient-to-r from-purple-500 to-blue-500 transition-all duration-300\"\n style={{ width: `${preloadProgress}%` }}\n />\n </div>\n <div className=\"mt-4 text-sm text-white/60\">\n 预加载所有资源后,切换节点将无需等待\n </div>\n </div>\n </div>\n )}\n\n {/* 播放列表控制按钮(位于右下角,不与播放器按钮重叠) */}\n {!isPreloading && (\n <div className=\"absolute bottom-4 right-4 z-10 flex gap-2\">\n {/* 上一个按钮 */}\n {editableNodes.length > 1 && (\n <button\n onClick={playlistPrevious}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-blue-500/90 text-xl text-white shadow-lg backdrop-blur-md transition-all hover:bg-blue-600 hover:scale-110\"\n title=\"上一个节点\"\n >\n ⏮️\n </button>\n )}\n\n {/* 设置按钮(原播放列表按钮) */}\n <button\n onClick={() => setShowSettings(true)}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-purple-500/90 text-xl text-white shadow-lg backdrop-blur-md transition-all hover:bg-purple-600 hover:scale-110\"\n title=\"播放列表设置\"\n >\n ⚙️\n </button>\n\n {/* 下一个按钮 */}\n {editableNodes.length > 1 && (\n <button\n onClick={playlistNext}\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-blue-500/90 text-xl text-white shadow-lg backdrop-blur-md transition-all hover:bg-blue-600 hover:scale-110\"\n title=\"下一个节点\"\n >\n ⏭️\n </button>\n )}\n </div>\n )}\n\n {/* 当前节点信息提示(左上角) */}\n {!isPreloading && (\n <div className=\"absolute left-4 top-4 z-10 rounded-lg bg-black/50 px-4 py-2 backdrop-blur-md\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold text-white/60\">\n {currentNodeIndex + 1}/{editableNodes.length}\n </span>\n <span className=\"text-sm font-medium text-white\">{currentNode.name}</span>\n {currentNode.loop && (\n <span className=\"rounded bg-white/20 px-2 py-0.5 text-xs text-white\">🔁</span>\n )}\n </div>\n </div>\n )}\n\n {/* 配置弹窗 - 小型右上角弹窗 */}\n {showSettings && (\n <div \n className=\"absolute inset-0 z-[100] flex items-start justify-end bg-black/40\" \n onClick={() => setShowSettings(false)}\n >\n {/* 弹窗内容 */}\n <div \n className=\"relative m-4 flex w-full max-w-md flex-col overflow-hidden rounded-xl bg-gradient-to-br from-gray-900 to-black shadow-2xl border border-white/20\"\n style={{ maxHeight: 'calc(100vh - 2rem)' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* 标题栏 - 固定在顶部 */}\n <div className=\"flex items-center justify-between border-b border-white/10 bg-gradient-to-r from-purple-900/50 to-blue-900/50 px-4 py-3 flex-shrink-0\">\n <h3 className=\"flex items-center gap-2 text-base font-bold text-white\">\n ⚙️ 播放列表配置\n </h3>\n <button\n onClick={() => setShowSettings(false)}\n className=\"text-xl text-white/60 transition-colors hover:text-white\"\n >\n ✕\n </button>\n </div>\n\n {/* 可滚动内容区域 */}\n <div className=\"flex-1 overflow-y-auto p-4\" style={{ scrollbarWidth: 'thin', scrollbarColor: 'rgba(255,255,255,0.2) transparent' }}>\n {/* 播放列表信息卡片 */}\n <div className=\"mb-3 rounded-lg bg-gradient-to-br from-indigo-900/30 to-purple-900/30 p-3 border border-white/10\">\n <h4 className=\"text-sm font-semibold text-white mb-2 flex items-center gap-2\">\n 📋 播放列表\n </h4>\n <div className=\"space-y-1 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-white/60\">名称:</span>\n <span className=\"text-white font-medium\">{playlist.name}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-white/60\">节点数:</span>\n <span className=\"text-white font-medium\">{editableNodes.length}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-white/60\">循环:</span>\n <span className=\"text-white font-medium\">{playlist.loop ? '是' : '否'}</span>\n </div>\n </div>\n </div>\n\n {/* 当前节点信息卡片 */}\n <div className=\"mb-3 rounded-lg bg-gradient-to-br from-blue-900/30 to-cyan-900/30 p-3 border border-white/10\">\n <h4 className=\"text-sm font-semibold text-white mb-2 flex items-center gap-2\">\n 🎯 当前节点\n </h4>\n <div className=\"space-y-1 text-xs\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-white/60\">名称:</span>\n <span className=\"text-white font-medium truncate ml-2\">{currentNode.name}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-white/60\">位置:</span>\n <span className=\"text-white font-medium\">{currentNodeIndex + 1} / {editableNodes.length}</span>\n </div>\n {currentNode.resources.audioPath && (\n <div className=\"text-white/80 mt-1\">🎵 有音乐</div>\n )}\n {currentNode.resources.cameraPath && (\n <div className=\"text-white/80\">📷 有相机</div>\n )}\n </div>\n </div>\n\n {/* 节点列表 */}\n <div className=\"rounded-lg bg-gradient-to-br from-gray-800/50 to-gray-900/50 border border-white/10 p-3\">\n <h4 className=\"mb-2 flex items-center gap-2 text-sm font-semibold text-white\">\n 📝 节点管理\n </h4>\n <div className=\"max-h-64 space-y-2 overflow-y-auto pr-1\" style={{ scrollbarWidth: 'thin', scrollbarColor: 'rgba(255,255,255,0.2) transparent' }}>\n {editableNodes.map((node, index) => (\n <div\n key={`${node.id}-${index}`}\n className={`rounded-md p-2 transition-all text-xs ${\n currentNodeIndex === index\n ? 'bg-gradient-to-r from-purple-600/50 to-blue-600/50 border border-purple-400/50'\n : 'bg-white/5 hover:bg-white/10 border border-white/10'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1 mb-1\">\n <span className=\"text-xs font-bold text-white/40\">#{index + 1}</span>\n <h5 className=\"font-semibold text-white text-xs truncate\">{node.name}</h5>\n {currentNodeIndex === index && (\n <span className=\"rounded bg-green-500/30 px-1 py-0.5 text-[10px] text-green-300 flex-shrink-0\">\n ▶️\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap gap-1 text-[10px] text-white/60\">\n {node.resources.modelPath && <span>👤</span>}\n {node.resources.motionPath && <span>💃</span>}\n {node.resources.audioPath && <span>🎵</span>}\n {node.resources.cameraPath && <span>📷</span>}\n </div>\n </div>\n <div className=\"flex flex-col gap-0.5 flex-shrink-0\">\n {index > 0 && (\n <button\n onClick={() => handleMoveNodeUp(index)}\n className=\"p-0.5 rounded bg-white/10 hover:bg-white/20 text-white text-[10px] transition-colors\"\n title=\"上移\"\n >\n ⬆️\n </button>\n )}\n {index < editableNodes.length - 1 && (\n <button\n onClick={() => handleMoveNodeDown(index)}\n className=\"p-0.5 rounded bg-white/10 hover:bg-white/20 text-white text-[10px] transition-colors\"\n title=\"下移\"\n >\n ⬇️\n </button>\n )}\n <button\n onClick={() => playlistJumpTo(index)}\n className=\"p-0.5 rounded bg-blue-500/30 hover:bg-blue-500/50 text-white text-[10px] transition-colors\"\n title=\"跳转\"\n >\n ▶️\n </button>\n <button\n onClick={() => {\n if (confirm(`确定删除 \"${node.name}\"?`)) {\n handleDeleteNode(index);\n }\n }}\n className=\"p-0.5 rounded bg-red-500/30 hover:bg-red-500/50 text-white text-[10px] transition-colors\"\n title=\"删除\"\n >\n 🗑️\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import type { MMDResources, MMDStage } from './types';\n\n/**\n * MMD 预设配置\n */\nexport interface MMDPreset {\n /** 预设ID */\n id: string;\n /** 预设名称 */\n name: string;\n /** 预设简介 */\n summary: string;\n /** 预设标签 */\n badges?: string[];\n /** 资源配置 */\n resources: MMDResources;\n /** 舞台配置 */\n stage?: MMDStage;\n}\n\n/**\n * 默认预设 - 仅模型\n */\nexport const defaultMMDPreset: MMDPreset = {\n id: 'default',\n name: '默认模型',\n summary: '仅展示模型,无动作和音频',\n badges: ['模型', '静态'],\n resources: {\n modelPath: '/mikutalking/models/YYB_Z6SakuraMiku/miku.pmx',\n },\n stage: {\n backgroundColor: '#000000',\n cameraPosition: { x: 0, y: 10, z: 30 },\n cameraTarget: { x: 0, y: 10, z: 0 },\n enablePhysics: true,\n showGrid: true,\n ammoPath: '/mikutalking/libs/ammo.wasm.js',\n ammoWasmPath: '/mikutalking/libs/',\n },\n};\n\n/**\n * 完整动画预设 - 模型+动作+相机+音频\n */\nexport const catchTheWavePreset: MMDPreset = {\n id: 'catch-the-wave',\n name: 'Catch The Wave',\n summary: '完整的MMD表演:模型、动作、相机运镜、音频同步',\n badges: ['模型', '动作', '相机', '音频'],\n resources: {\n modelPath: '/mikutalking/models/YYB_Z6SakuraMiku/miku.pmx',\n motionPath: '/mikutalking/actions/CatchTheWave/mmd_CatchTheWave_motion.vmd',\n cameraPath: '/mikutalking/actions/CatchTheWave/camera.vmd',\n audioPath: '/mikutalking/actions/CatchTheWave/pv_268.wav',\n },\n stage: {\n backgroundColor: '#01030b',\n cameraPosition: { x: 0, y: 10, z: 30 },\n cameraTarget: { x: 0, y: 10, z: 0 },\n enablePhysics: true,\n showGrid: false,\n ammoPath: '/mikutalking/libs/ammo.wasm.js',\n ammoWasmPath: '/mikutalking/libs/',\n },\n};\n\n/**\n * 简单模型预设\n */\nexport const simpleModelPreset: MMDPreset = {\n id: 'simple-model',\n name: '简单模型',\n summary: '轻量级测试模型',\n badges: ['模型', '轻量'],\n resources: {\n modelPath: '/mikutalking/models/test/v4c5.0.pmx',\n },\n stage: {\n backgroundColor: '#ffffff',\n cameraPosition: { x: 0, y: 10, z: 30 },\n cameraTarget: { x: 0, y: 10, z: 0 },\n enablePhysics: true,\n showGrid: true,\n ammoPath: '/mikutalking/libs/ammo.wasm.js',\n ammoWasmPath: '/mikutalking/libs/',\n },\n};\n\n/**\n * 所有可用的预设\n */\nexport const availableMMDPresets: MMDPreset[] = [\n catchTheWavePreset,\n defaultMMDPreset,\n simpleModelPreset,\n];\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"],"names":["forwardRef","useRef","THREE","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"],"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\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 renderer.setPixelRatio(mobileOptimization.enabled ? mobileOptimization.pixelRatio || 1 : window.devicePixelRatio);\n \n // 5. 关键检查点:在操作 DOM 之前再次检查\n if (checkCancelled()) {\n renderer.dispose();\n return;\n }\n \n // 再次确保容器为空,防止并行执行导致的残留\n container.innerHTML = '';\n \n // 强制 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 \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 // 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 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 mesh.castShadow = true;\n mesh.receiveShadow = true;\n\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\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 if (resources.stageModelPath) {\n loader.load(\n resources.stageModelPath, \n (stageMesh) => {\n if (checkCancelled()) return; // Callback check\n stageMesh.castShadow = true;\n stageMesh.receiveShadow = true;\n scene.add(stageMesh);\n },\n undefined,\n (err) => console.error('Failed to load stage:', err)\n );\n }\n\n if (checkCancelled()) return;\n \n isReadyRef.current = true;\n onLoad?.();\n \n if (autoPlay) {\n setTimeout(() => {\n if (checkCancelled()) return;\n isPlayingRef.current = true;\n if (!clockRef.current.running) clockRef.current.start();\n onPlay?.();\n }, 100);\n }\n\n // 7. 开始渲染循环\n animate();\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',\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"]}
|