sa2kit 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mmd/index.js +18 -1
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +18 -1
- package/dist/mmd/index.mjs.map +1 -1
- package/package.json +1 -1
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","useMemo","THREE2","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 // 资源切换状态(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 helperRef.current.update(delta);\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 console.log('🧹 [MMDPlayerEnhanced] 开始清除旧资源');\n \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 = null;\n }\n\n // 清除 helper 中的所有对象\n if (helperRef.current) {\n // MMDAnimationHelper 没有公开的清除方法,我们需要创建新的\n helperRef.current = null;\n }\n\n // 清除场景中的所有 MMD 相关对象(保留灯光和网格)\n const objectsToRemove: THREE.Object3D[] = [];\n sceneRef.current.traverse((child) => {\n // 移除所有 SkinnedMesh(MMD 模型)\n if (child.type === 'SkinnedMesh' || (child as any).isSkinnedMesh) {\n objectsToRemove.push(child);\n }\n // 移除所有 Mesh(场景模型)\n if (child.type === 'Mesh' && child !== sceneRef.current) {\n objectsToRemove.push(child);\n }\n });\n\n objectsToRemove.forEach((obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n // 清理几何体和材质\n if ((obj as any).geometry) {\n (obj as any).geometry.dispose();\n }\n if ((obj as any).material) {\n if (Array.isArray((obj as any).material)) {\n (obj as any).material.forEach((mat: any) => mat.dispose());\n } else {\n (obj as any).material.dispose();\n }\n }\n });\n\n // 重置时钟\n clockRef.current = new THREE.Clock();\n\n // 清除 VMD 数据\n vmdDataRef.current = null;\n\n console.log(`✅ [MMDPlayerEnhanced] 已清除 ${objectsToRemove.length} 个旧对象`);\n };\n\n // 加载MMD资源\n useEffect(() => {\n console.log('📦 [MMDPlayerEnhanced] 资源加载 useEffect 触发')\n console.log('🔍 [MMDPlayerEnhanced] sceneRef.current:', sceneRef.current)\n console.log('🔍 [MMDPlayerEnhanced] cameraRef.current:', cameraRef.current)\n console.log('🔍 [MMDPlayerEnhanced] isLoadedRef.current:', isLoadedRef.current)\n \n if (!sceneRef.current || !cameraRef.current) {\n console.warn('⚠️ [MMDPlayerEnhanced] 场景或相机未初始化,跳过资源加载')\n return\n }\n\n // 防止重复加载 - 使用 ref 标记\n if (isLoadedRef.current) {\n console.log('⚠️ [MMDPlayerEnhanced] 资源已加载,跳过重复加载');\n return;\n }\n\n console.log('✅ [MMDPlayerEnhanced] 场景和相机已就绪,开始加载资源')\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 const ammoScriptPath = stage?.ammoPath || '/mikutalking/libs/ammo.wasm.js';\n const ammoWasmPath = stage?.ammoWasmPath || '/mikutalking/libs/';\n \n console.log('🔧 [MMDPlayerEnhanced] 检测到启用物理,开始加载 Ammo.js');\n console.log('📂 [MMDPlayerEnhanced] Ammo 脚本路径:', ammoScriptPath);\n console.log('📂 [MMDPlayerEnhanced] Ammo WASM 路径:', ammoWasmPath);\n setLoadingProgress(5);\n \n await loadAmmo({\n scriptPath: ammoScriptPath,\n wasmBasePath: ammoWasmPath,\n });\n \n console.log('✅ [MMDPlayerEnhanced] Ammo.js 加载完成');\n }\n\n const loader = new MMDLoader();\n const helper = new MMDAnimationHelper();\n helperRef.current = helper;\n\n // 加载模型\n setLoadingProgress(20);\n console.log('🎭 开始加载模型:', currentResources.modelPath);\n\n const mesh = await new Promise<any>((resolve, reject) => {\n loader.load(\n currentResources.modelPath,\n (object: any) => {\n console.log('✅ 模型加载成功');\n resolve(object);\n },\n (progress: any) => {\n if (progress.total > 0) {\n const percent = (progress.loaded / progress.total) * 30 + 20;\n setLoadingProgress(Math.min(percent, 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 console.log('🏰 开始加载场景模型:', currentResources.stageModelPath);\n \n const stageMesh = await new Promise<any>((resolve, reject) => {\n loader.load(\n currentResources.stageModelPath!,\n (object: any) => {\n console.log('✅ 场景模型加载成功');\n resolve(object);\n },\n undefined,\n (error: any) => {\n console.error('❌ 场景模型加载失败:', error);\n reject(error);\n }\n );\n });\n\n // 场景模型通常不需要物理计算,直接添加即可\n // 注意:这里我们不把它加到 helper 中,除非它有动作\n // 确保场景在人物后面(通常不需要特殊处理,深度缓冲会处理)\n // 但我们可以调整一下渲染顺序或位置如果需要\n sceneRef.current.add(stageMesh);\n }\n\n // 加载背景图片\n if (currentResources.backgroundPath && sceneRef.current) {\n console.log('🖼️ 开始加载背景图片:', currentResources.backgroundPath);\n const textureLoader = new THREE.TextureLoader();\n \n const backgroundTexture = await new Promise<THREE.Texture>((resolve, reject) => {\n textureLoader.load(\n currentResources.backgroundPath!,\n (texture) => resolve(texture),\n undefined,\n (err) => reject(err)\n );\n });\n\n backgroundTexture.colorSpace = THREE.SRGBColorSpace;\n\n if (stage?.backgroundType === 'skybox') {\n backgroundTexture.mapping = THREE.EquirectangularReflectionMapping;\n sceneRef.current.background = backgroundTexture;\n sceneRef.current.environment = backgroundTexture;\n } else if (stage?.backgroundType === 'image') {\n sceneRef.current.background = backgroundTexture;\n // 对于固定背景图,不一定要设为 environment\n } else {\n // 默认 fallback 到 color 或保持原样\n sceneRef.current.background = backgroundTexture;\n }\n console.log('✅ 背景图片加载成功');\n }\n\n // 初始化动画数据存储\n let vmd: any = null;\n let cameraVmd: any = null;\n\n // 加载动作\n if (currentResources.motionPath) {\n setLoadingProgress(60);\n console.log('💃 开始加载动作:', currentResources.motionPath);\n\n vmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(\n currentResources.motionPath!,\n mesh,\n (vmdObject: any) => {\n console.log('✅ 动作加载成功');\n resolve(vmdObject);\n },\n (progress: any) => {\n if (progress.total > 0) {\n const percent = (progress.loaded / progress.total) * 20 + 60;\n setLoadingProgress(Math.min(percent, 80));\n }\n },\n (error: any) => {\n console.error('❌ 动作加载失败:', error);\n reject(error);\n }\n );\n });\n\n helper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n\n // 计算动画时长(从 VMD 数据中获取)\n // VMD 数据结构:vmd 是一个包含多个轨道的对象\n if (vmd) {\n let maxDuration = 0;\n \n // 尝试从 duration 属性获取\n if (vmd.duration !== undefined) {\n maxDuration = vmd.duration;\n } \n // 尝试从 animations 数组获取\n else if (Array.isArray(vmd) && vmd.length > 0 && vmd[0].duration !== undefined) {\n maxDuration = vmd[0].duration;\n }\n // 尝试从 clip 获取\n else if (vmd.clip && vmd.clip.duration !== undefined) {\n maxDuration = vmd.clip.duration;\n }\n \n if (maxDuration > 0) {\n animationDurationRef.current = maxDuration;\n console.log('⏱️ 动画时长:', maxDuration, '秒');\n } else {\n console.warn('⚠️ 无法获取动画时长,将无法自动检测动画结束');\n console.log('📋 VMD 数据结构:', vmd);\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 console.log('📷 开始加载镜头:', currentResources.cameraPath);\n\n cameraVmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(\n currentResources.cameraPath!,\n cameraRef.current!,\n (vmdObject: any) => {\n console.log('✅ 镜头加载成功');\n resolve(vmdObject);\n },\n undefined,\n (error: any) => {\n console.error('❌ 镜头加载失败:', error);\n reject(error);\n }\n );\n });\n\n helper.add(cameraRef.current, { animation: cameraVmd });\n }\n\n // 加载音频\n if (currentResources.audioPath) {\n setLoadingProgress(90);\n console.log('🎵 开始加载音频:', currentResources.audioPath);\n\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 // 监听音频结束事件\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 // 触发音频结束回调\n onAudioEnded?.();\n };\n\n console.log('✅ 音频加载成功');\n }\n\n setLoadingProgress(100);\n setLoading(false);\n\n // 保存动画数据用于后续重置\n vmdDataRef.current = {\n mesh,\n vmd,\n cameraVmd,\n };\n\n console.log('🎉 所有资源加载完成!');\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 console.log('🎬 [play] 函数被调用,needReset =', needReset);\n \n if (!helperRef.current) return;\n\n // 如果需要重置(从 stop 恢复),重新创建 helper 并重新添加现有模型和动画\n if (needReset && vmdDataRef.current && sceneRef.current && cameraRef.current) {\n console.log('🔄 检测到需要重置,重新初始化 helper(保留模型)');\n \n const { mesh, vmd, cameraVmd } = vmdDataRef.current;\n\n // 创建新的 helper 和 clock\n const newHelper = new MMDAnimationHelper();\n helperRef.current = newHelper;\n clockRef.current = new THREE.Clock();\n\n // 重新添加模型和动画(模型已经在场景中,不需要重新添加到场景)\n if (vmd && typeof vmd === 'object') {\n console.log('📦 重新添加模型动画,vmd:', vmd);\n try {\n newHelper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n } catch (error) {\n console.error('❌ 重新添加模型动画失败:', error);\n console.log('📋 vmd 数据:', vmd);\n // 如果添加动画失败,至少添加模型和物理\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n }\n } else {\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n }\n\n // 重新添加相机动画\n if (cameraVmd && typeof cameraVmd === 'object') {\n console.log('📷 重新添加相机动画');\n try {\n newHelper.add(cameraRef.current, { animation: cameraVmd });\n } catch (error) {\n console.error('❌ 重新添加相机动画失败:', error);\n }\n }\n\n // 重置音频\n if (audioRef.current) {\n audioRef.current.currentTime = 0;\n }\n\n setNeedReset(false);\n console.log('✅ Helper 重新初始化完成,准备从第一帧播放');\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 // 停止播放状态\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 // 重置模型姿势到初始状态(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 useEffect(() => {\n console.log(`🔄 [MMDPlaylist] 节点切换: ${currentNodeIndex} - ${currentNode.name}`);\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]);\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/MMDPlayerEnhanced.tsx","../../src/mmd/components/MMDPlaylist.tsx","../../src/mmd/presets.ts"],"names":["useRef","useState","useEffect","THREE","OutlineEffect","MMDAnimationHelper","MMDLoader","width","height","React","useMemo","THREE2","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 // 资源切换状态(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 helperRef.current.update(delta);\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 console.log('🧹 [MMDPlayerEnhanced] 开始清除旧资源');\n \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 = null;\n }\n\n // 清除 helper 中的所有对象\n if (helperRef.current) {\n // MMDAnimationHelper 没有公开的清除方法,我们需要创建新的\n helperRef.current = null;\n }\n\n // 清除场景中的所有 MMD 相关对象(保留灯光和网格)\n const objectsToRemove: THREE.Object3D[] = [];\n sceneRef.current.traverse((child) => {\n // 移除所有 SkinnedMesh(MMD 模型)\n if (child.type === 'SkinnedMesh' || (child as any).isSkinnedMesh) {\n objectsToRemove.push(child);\n }\n // 移除所有 Mesh(场景模型)\n if (child.type === 'Mesh' && child !== sceneRef.current) {\n objectsToRemove.push(child);\n }\n });\n\n objectsToRemove.forEach((obj) => {\n if (obj.parent) {\n obj.parent.remove(obj);\n }\n // 清理几何体和材质\n if ((obj as any).geometry) {\n (obj as any).geometry.dispose();\n }\n if ((obj as any).material) {\n if (Array.isArray((obj as any).material)) {\n (obj as any).material.forEach((mat: any) => mat.dispose());\n } else {\n (obj as any).material.dispose();\n }\n }\n });\n\n // 重置时钟\n clockRef.current = new THREE.Clock();\n\n // 清除 VMD 数据\n vmdDataRef.current = null;\n\n console.log(`✅ [MMDPlayerEnhanced] 已清除 ${objectsToRemove.length} 个旧对象`);\n };\n\n // 加载MMD资源\n useEffect(() => {\n console.log('📦 [MMDPlayerEnhanced] 资源加载 useEffect 触发')\n console.log('🔍 [MMDPlayerEnhanced] sceneRef.current:', sceneRef.current)\n console.log('🔍 [MMDPlayerEnhanced] cameraRef.current:', cameraRef.current)\n console.log('🔍 [MMDPlayerEnhanced] isLoadedRef.current:', isLoadedRef.current)\n \n if (!sceneRef.current || !cameraRef.current) {\n console.warn('⚠️ [MMDPlayerEnhanced] 场景或相机未初始化,跳过资源加载')\n return\n }\n\n // 防止重复加载 - 使用 ref 标记\n if (isLoadedRef.current) {\n console.log('⚠️ [MMDPlayerEnhanced] 资源已加载,跳过重复加载');\n return;\n }\n\n console.log('✅ [MMDPlayerEnhanced] 场景和相机已就绪,开始加载资源')\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 const ammoScriptPath = stage?.ammoPath || '/mikutalking/libs/ammo.wasm.js';\n const ammoWasmPath = stage?.ammoWasmPath || '/mikutalking/libs/';\n \n console.log('🔧 [MMDPlayerEnhanced] 检测到启用物理,开始加载 Ammo.js');\n console.log('📂 [MMDPlayerEnhanced] Ammo 脚本路径:', ammoScriptPath);\n console.log('📂 [MMDPlayerEnhanced] Ammo WASM 路径:', ammoWasmPath);\n setLoadingProgress(5);\n \n await loadAmmo({\n scriptPath: ammoScriptPath,\n wasmBasePath: ammoWasmPath,\n });\n \n console.log('✅ [MMDPlayerEnhanced] Ammo.js 加载完成');\n }\n\n // 创建 LoadingManager 来处理贴图路径\n const manager = new THREE.LoadingManager();\n \n // 设置资源路径解析器\n // 从模型 URL 中提取基础路径,用于加载相对路径的贴图\n const modelUrl = currentResources.modelPath;\n const basePath = modelUrl.substring(0, modelUrl.lastIndexOf('/') + 1);\n console.log('📂 [MMDPlayerEnhanced] 模型基础路径:', basePath);\n \n // 配置 LoadingManager 的 URL 修改器\n manager.setURLModifier((url: string) => {\n // 如果是完整 URL(http/https),直接返回\n if (url.startsWith('http://') || url.startsWith('https://')) {\n console.log('🔗 [MMDPlayerEnhanced] 使用完整 URL:', url);\n return url;\n }\n \n // 如果是绝对路径(以 / 开头),直接返回\n if (url.startsWith('/')) {\n console.log('🔗 [MMDPlayerEnhanced] 使用绝对路径:', url);\n return url;\n }\n \n // 否则,拼接基础路径(相对路径)\n const fullUrl = basePath + url;\n console.log('🔗 [MMDPlayerEnhanced] 相对路径转换:', url, '->', fullUrl);\n return fullUrl;\n });\n\n const loader = new MMDLoader(manager);\n const helper = new MMDAnimationHelper();\n helperRef.current = helper;\n\n // 加载模型\n setLoadingProgress(20);\n console.log('🎭 开始加载模型:', currentResources.modelPath);\n\n const mesh = await new Promise<any>((resolve, reject) => {\n loader.load(\n currentResources.modelPath,\n (object: any) => {\n console.log('✅ 模型加载成功');\n resolve(object);\n },\n (progress: any) => {\n if (progress.total > 0) {\n const percent = (progress.loaded / progress.total) * 30 + 20;\n setLoadingProgress(Math.min(percent, 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 console.log('🏰 开始加载场景模型:', currentResources.stageModelPath);\n \n const stageMesh = await new Promise<any>((resolve, reject) => {\n loader.load(\n currentResources.stageModelPath!,\n (object: any) => {\n console.log('✅ 场景模型加载成功');\n resolve(object);\n },\n undefined,\n (error: any) => {\n console.error('❌ 场景模型加载失败:', error);\n reject(error);\n }\n );\n });\n\n // 场景模型通常不需要物理计算,直接添加即可\n // 注意:这里我们不把它加到 helper 中,除非它有动作\n // 确保场景在人物后面(通常不需要特殊处理,深度缓冲会处理)\n // 但我们可以调整一下渲染顺序或位置如果需要\n sceneRef.current.add(stageMesh);\n }\n\n // 加载背景图片\n if (currentResources.backgroundPath && sceneRef.current) {\n console.log('🖼️ 开始加载背景图片:', currentResources.backgroundPath);\n const textureLoader = new THREE.TextureLoader();\n \n const backgroundTexture = await new Promise<THREE.Texture>((resolve, reject) => {\n textureLoader.load(\n currentResources.backgroundPath!,\n (texture) => resolve(texture),\n undefined,\n (err) => reject(err)\n );\n });\n\n backgroundTexture.colorSpace = THREE.SRGBColorSpace;\n\n if (stage?.backgroundType === 'skybox') {\n backgroundTexture.mapping = THREE.EquirectangularReflectionMapping;\n sceneRef.current.background = backgroundTexture;\n sceneRef.current.environment = backgroundTexture;\n } else if (stage?.backgroundType === 'image') {\n sceneRef.current.background = backgroundTexture;\n // 对于固定背景图,不一定要设为 environment\n } else {\n // 默认 fallback 到 color 或保持原样\n sceneRef.current.background = backgroundTexture;\n }\n console.log('✅ 背景图片加载成功');\n }\n\n // 初始化动画数据存储\n let vmd: any = null;\n let cameraVmd: any = null;\n\n // 加载动作\n if (currentResources.motionPath) {\n setLoadingProgress(60);\n console.log('💃 开始加载动作:', currentResources.motionPath);\n\n vmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(\n currentResources.motionPath!,\n mesh,\n (vmdObject: any) => {\n console.log('✅ 动作加载成功');\n resolve(vmdObject);\n },\n (progress: any) => {\n if (progress.total > 0) {\n const percent = (progress.loaded / progress.total) * 20 + 60;\n setLoadingProgress(Math.min(percent, 80));\n }\n },\n (error: any) => {\n console.error('❌ 动作加载失败:', error);\n reject(error);\n }\n );\n });\n\n helper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n\n // 计算动画时长(从 VMD 数据中获取)\n // VMD 数据结构:vmd 是一个包含多个轨道的对象\n if (vmd) {\n let maxDuration = 0;\n \n // 尝试从 duration 属性获取\n if (vmd.duration !== undefined) {\n maxDuration = vmd.duration;\n } \n // 尝试从 animations 数组获取\n else if (Array.isArray(vmd) && vmd.length > 0 && vmd[0].duration !== undefined) {\n maxDuration = vmd[0].duration;\n }\n // 尝试从 clip 获取\n else if (vmd.clip && vmd.clip.duration !== undefined) {\n maxDuration = vmd.clip.duration;\n }\n \n if (maxDuration > 0) {\n animationDurationRef.current = maxDuration;\n console.log('⏱️ 动画时长:', maxDuration, '秒');\n } else {\n console.warn('⚠️ 无法获取动画时长,将无法自动检测动画结束');\n console.log('📋 VMD 数据结构:', vmd);\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 console.log('📷 开始加载镜头:', currentResources.cameraPath);\n\n cameraVmd = await new Promise<any>((resolve, reject) => {\n loader.loadAnimation(\n currentResources.cameraPath!,\n cameraRef.current!,\n (vmdObject: any) => {\n console.log('✅ 镜头加载成功');\n resolve(vmdObject);\n },\n undefined,\n (error: any) => {\n console.error('❌ 镜头加载失败:', error);\n reject(error);\n }\n );\n });\n\n helper.add(cameraRef.current, { animation: cameraVmd });\n }\n\n // 加载音频\n if (currentResources.audioPath) {\n setLoadingProgress(90);\n console.log('🎵 开始加载音频:', currentResources.audioPath);\n\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 // 监听音频结束事件\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 // 触发音频结束回调\n onAudioEnded?.();\n };\n\n console.log('✅ 音频加载成功');\n }\n\n setLoadingProgress(100);\n setLoading(false);\n\n // 保存动画数据用于后续重置\n vmdDataRef.current = {\n mesh,\n vmd,\n cameraVmd,\n };\n\n console.log('🎉 所有资源加载完成!');\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 console.log('🎬 [play] 函数被调用,needReset =', needReset);\n \n if (!helperRef.current) return;\n\n // 如果需要重置(从 stop 恢复),重新创建 helper 并重新添加现有模型和动画\n if (needReset && vmdDataRef.current && sceneRef.current && cameraRef.current) {\n console.log('🔄 检测到需要重置,重新初始化 helper(保留模型)');\n \n const { mesh, vmd, cameraVmd } = vmdDataRef.current;\n\n // 创建新的 helper 和 clock\n const newHelper = new MMDAnimationHelper();\n helperRef.current = newHelper;\n clockRef.current = new THREE.Clock();\n\n // 重新添加模型和动画(模型已经在场景中,不需要重新添加到场景)\n if (vmd && typeof vmd === 'object') {\n console.log('📦 重新添加模型动画,vmd:', vmd);\n try {\n newHelper.add(mesh, {\n animation: vmd,\n physics: stage?.enablePhysics !== false,\n });\n } catch (error) {\n console.error('❌ 重新添加模型动画失败:', error);\n console.log('📋 vmd 数据:', vmd);\n // 如果添加动画失败,至少添加模型和物理\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n }\n } else {\n newHelper.add(mesh, { physics: stage?.enablePhysics !== false });\n }\n\n // 重新添加相机动画\n if (cameraVmd && typeof cameraVmd === 'object') {\n console.log('📷 重新添加相机动画');\n try {\n newHelper.add(cameraRef.current, { animation: cameraVmd });\n } catch (error) {\n console.error('❌ 重新添加相机动画失败:', error);\n }\n }\n\n // 重置音频\n if (audioRef.current) {\n audioRef.current.currentTime = 0;\n }\n\n setNeedReset(false);\n console.log('✅ Helper 重新初始化完成,准备从第一帧播放');\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 // 停止播放状态\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 // 重置模型姿势到初始状态(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 useEffect(() => {\n console.log(`🔄 [MMDPlaylist] 节点切换: ${currentNodeIndex} - ${currentNode.name}`);\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]);\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"]}
|