@fengyizhi/scene-lib 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fengyizhi-scene-lib.mjs","sources":["../../../projects/scene-lib/src/lib/types.ts","../../../projects/scene-lib/src/lib/history.ts","../../../projects/scene-lib/src/lib/store.ts","../../../projects/scene-lib/src/lib/commands.ts","../../../projects/scene-lib/src/lib/particle-system.ts","../../../projects/scene-lib/src/lib/segmented-path.ts","../../../projects/scene-lib/src/lib/path-particle-system.ts","../../../projects/scene-lib/src/lib/path-editor.ts","../../../projects/scene-lib/src/lib/viewer.ts","../../../projects/scene-lib/src/lib/scene-view.component.ts","../../../projects/scene-lib/src/lib/draco-path.ts","../../../projects/scene-lib/src/public-api.ts","../../../projects/scene-lib/src/fengyizhi-scene-lib.ts"],"sourcesContent":["/** 看板数据点(value widget 用) */\nexport interface DashboardDataPoint {\n /** 标签 */\n label: string;\n /** 显示绑定点 ID */\n bindingId: string;\n /** 动画绑定点 ID */\n animationBindingId?: string;\n /** 单位 */\n unit?: string;\n /** 数据源(可选,如果不用绑定点) */\n dataSource?: {\n mode: 'static' | 'simulated' | 'api';\n staticValue?: number | string;\n simulated?: { type: 'sine' | 'random'; min: number; max: number; interval: number };\n api?: { url: string; field: string; pollInterval: number };\n };\n}\n\n/** 看板 Widget */\nexport interface DashboardWidget {\n id: string;\n type: 'value' | 'gauge' | 'progress' | 'status' | 'chart' | 'text';\n /** 布局模式:screen=屏幕固定,world=绑定3D位置 */\n mode: 'screen' | 'world';\n /** screen 模式:百分比坐标 0-1 */\n screen?: { x: number; y: number; width: number; height: number };\n /** world 模式:3D 坐标 */\n world?: { position: Vec3 };\n /** 数据源(非 value 类型用) */\n dataSource?: {\n mode: 'static' | 'simulated' | 'api';\n staticValue?: number | string;\n simulated?: { type: 'sine' | 'random'; min: number; max: number; interval: number };\n api?: { url: string; field: string; pollInterval: number };\n };\n /** 数据点列表(value 类型用,多值显示) */\n dataPoints?: DashboardDataPoint[];\n /** 显示标签 */\n label?: string;\n /** 单位 */\n unit?: string;\n /** 最小值(仪表/进度条用) */\n min?: number;\n /** 最大值(仪表/进度条用) */\n max?: number;\n /** 阈值变色 */\n thresholds?: { value: number; color: string }[];\n /** 小数位数 */\n decimals?: number;\n}\n\n/** 看板配置 */\nexport interface DashboardConfig {\n /** 是否显示 */\n visible: boolean;\n /** Widget 列表 */\n widgets: DashboardWidget[];\n}\n\n/** 告警配置 */\nexport interface AlarmConfig {\n /** 查询告警详情的 API URL */\n apiUrl: string;\n /** 弹框显示时长(毫秒) */\n displayDuration: number;\n}\n\n/** 场景文档模型(scene.json v3)——纯数据,不依赖 three / Angular */\n\nexport type Vec3 = [number, number, number];\n\nexport type PrimitiveKind = 'box' | 'sphere' | 'cylinder' | 'group' | 'asset' | 'light' | 'label';\n\nexport interface TransformState {\n position: Vec3;\n /** 欧拉角,单位:度(对 UI 友好) */\n rotation: Vec3;\n scale: Vec3;\n}\n\nexport interface NodeDoc extends TransformState {\n id: string;\n name: string;\n primitive: PrimitiveKind;\n visible: boolean;\n children: string[];\n /** 标签文字内容(仅 label 节点) */\n text?: string;\n /** 资产 ID(服务器分配的 assetId) */\n assetId?: string;\n /** 资产库 ID(如 '021000') */\n assetLibraryId?: string;\n /** 资产文件 URL(运行时生成,不持久化也可) */\n assetUrl?: string;\n /** 资产显示名称 */\n assetName?: string;\n /** 资产文件格式(如 'glb', 'gltf', 'obj') */\n assetFormat?: string;\n /** MTL 文件路径(仅 OBJ 格式时使用) */\n assetMtlUrl?: string;\n\n // ── 材质覆盖(第二阶段实现) ──\n materialOverrides?: Record<string, MaterialOverride>;\n\n // ── 动画/绑定规则(第四阶段实现) ──\n animations?: AnimationRule[];\n\n // ── 视觉效果 ──\n effects?: VisualEffect[];\n\n // ── 灯光节点专用(第三阶段实现) ──\n lightType?: 'ambient' | 'directional' | 'point' | 'spot';\n lightColor?: string;\n lightIntensity?: number;\n lightCastShadow?: boolean;\n lightTarget?: Vec3;\n /** 点光源/聚光灯照射距离(0 = 无限) */\n lightDistance?: number;\n /** 光照衰减率 */\n lightDecay?: number;\n /** 聚光灯锥角(弧度) */\n lightAngle?: number;\n /** 聚光灯边缘柔和度(0-1) */\n lightPenumbra?: number;\n}\n\n/** 材质覆盖:场景级别,不修改资产本身 */\nexport interface MaterialOverride {\n color?: string; // \"#ff0000\"\n opacity?: number; // 0-1\n roughness?: number; // 0-1\n metalness?: number; // 0-1\n emissive?: string; // \"#000000\"\n visible?: boolean;\n // 贴图(dataURL)\n map?: string; // 漫反射贴图\n normalMap?: string; // 法线贴图\n roughnessMap?: string; // 粗糙度贴图\n metalnessMap?: string; // 金属度贴图\n emissiveMap?: string; // 自发光贴图\n /** 基础色是否与贴图叠加(默认 true;关闭后基础色强制 #ffffff,贴图原样显示) */\n useBaseColor?: boolean;\n}\n\n/** 动画/绑定规则 */\nexport interface AnimationRule {\n id: string;\n targetMeshName: string;\n property: string; // 'rotation.y', 'position.x', 'emissive' 等\n type: 'continuous' | 'oscillate' | 'data-driven' | 'trigger' | 'emissive' | 'emissive-constant' | 'emissive-temperature';\n speed?: number; // continuous: °/秒\n from?: number;\n to?: number;\n duration?: number; // trigger: 过渡时长(秒)\n easing?: string; // 'linear' | 'easeIn' | 'easeOut' | 'easeInOut'\n triggerBy?: 'click' | 'manual';\n dataSource?: string; // data-driven: URL\n dataMin?: number;\n dataMax?: number;\n valueMin?: number;\n valueMax?: number;\n /** 告警颜色(emissive 类型用,如 '#ff0000') */\n alarmColor?: string;\n /** 高亮颜色(emissive-constant 用,如 '#00aaff') */\n highlightColor?: string;\n /** 点位注释(自动生成,人能看懂的描述,如\"空调1号温度传感器\") */\n pointComment?: string;\n /** 温度梯度颜色(emissive-temperature 用,如 ['#00ff00', '#ffff00', '#ff0000']) */\n tempColors?: string[];\n /** 唯一绑定 ID,用于关联实时数据点位(对应 point 表的 ElementIDName3d) */\n bindingId?: string;\n /** 预设动画名称(如'旋转风扇',由编辑器自动生成) */\n presetName?: string;\n}\n\n// ── 视觉效果 ──\n\nexport type VisualEffectKind = 'particle' | 'uv-animation' | 'path-particle' | 'screen-content';\n\nexport interface VisualEffectBase {\n id: string;\n kind: VisualEffectKind;\n enabled: boolean;\n /** 目标子网格名(可选) */\n targetMeshName?: string;\n}\n\n/** UV 动画(管道液体流动、电缆电流) */\nexport interface UvAnimationEffect extends VisualEffectBase {\n kind: 'uv-animation';\n /** U 方向滚动速度(UV 坐标/秒) */\n speedU: number;\n /** V 方向滚动速度 */\n speedV: number;\n}\n\n/** 粒子效果(蒸汽、烟雾) */\nexport interface ParticleEffect extends VisualEffectBase {\n kind: 'particle';\n /** 发射速率(粒子/秒) */\n emissionRate: number;\n /** 粒子最大数量 */\n maxParticles: number;\n /** 粒子生命周期(秒) */\n lifetime: number;\n /** 发射方向 */\n direction: Vec3;\n /** 发射锥角(弧度) */\n spreadAngle: number;\n /** 初速度 */\n speed: number;\n /** 速度衰减 */\n damping: number;\n /** 粒子大小 */\n size: number;\n /** 大小随机范围 */\n sizeRandom: number;\n startColor: string;\n endColor: string;\n startOpacity: number;\n endOpacity: number;\n /** 重力(0=无) */\n gravity: number;\n blendMode: 'normal' | 'additive';\n}\n\n/** 路径粒子效果(管道水流、光纤) */\nexport interface PathParticleEffect extends VisualEffectBase {\n kind: 'path-particle';\n /** 路径点数组(世界坐标) */\n pathPoints: Vec3[];\n /** 段类型数组,长度 = pathPoints.length - 1\n * - 'linear': 直线段\n * - 'smooth': 平滑曲线段(CatmullRom)\n */\n segmentTypes: ('linear' | 'smooth')[];\n /** 粒子数量 */\n particleCount: number;\n /** 粒子大小 */\n size: number;\n /** 流动速度(路径进度/秒,0-1) */\n speed: number;\n /** 粒子颜色 */\n color: string;\n /** 粒子透明度 */\n opacity: number;\n /** 混合模式 */\n blendMode: 'normal' | 'additive';\n /** 是否循环 */\n loop: boolean;\n /** 粒子外观类型 */\n textureType: 'dot' | 'arrow' | 'wave';\n /** 拖尾效果 */\n trail: boolean;\n /** 发光效果 */\n glow: boolean;\n /** 管道透明度(0=完全透明 1=不透明,1 表示不隐藏管道) */\n pipeOpacity: number;\n /** 粒子分布半径(管道截面内随机偏移范围) */\n pipeRadius?: number;\n}\n\n/** 屏幕内容切换效果(大屏贴图轮播) */\nexport interface ScreenContentEffect extends VisualEffectBase {\n kind: 'screen-content';\n /** 图片 URL 数组(base64 或 http) */\n images: string[];\n /** 轮播间隔(毫秒) */\n interval: number;\n /** 是否自动播放 */\n autoPlay: boolean;\n /** 目标网格名称(为空则应用到所有网格) */\n targetMeshName?: string;\n /** 当前图片索引(运行时使用,不持久化) */\n currentIndex?: number;\n}\n\nexport type VisualEffect = UvAnimationEffect | ParticleEffect | PathParticleEffect | ScreenContentEffect;\n\n/** 飞行路线关键帧 */\nexport interface CameraKeyframe {\n /** 相机位置 */\n position: Vec3;\n /** 相机目标点 */\n target: Vec3;\n /** 到达此关键帧的时间(秒,相对于路径起点) */\n time: number;\n}\n\n/** 飞行路线 */\nexport interface FlyPath {\n id: string;\n name: string;\n keyframes: CameraKeyframe[];\n /** 是否循环播放 */\n loop: boolean;\n /** 总时长(秒,若未指定则从关键帧计算) */\n duration?: number;\n /** 关键帧默认间隔(秒),默认 2 */\n interval?: number;\n}\n\nexport interface CameraDoc {\n position: Vec3;\n target: Vec3;\n}\n\n/** 环境配置(场景级) */\nexport interface EnvironmentConfig {\n /** 背景色 */\n background?: string;\n /** 半球光 */\n hemisphere?: {\n /** 是否启用(默认 true) */\n enabled?: boolean;\n skyColor?: string;\n groundColor?: string;\n intensity?: number;\n };\n /** 默认平行光 */\n directional?: {\n /** 是否启用(默认 true) */\n enabled?: boolean;\n color?: string;\n intensity?: number;\n position?: Vec3;\n };\n /** HDRI 环境贴图(base64 data URL),优先于 background 纯色背景 */\n hdriDataUrl?: string;\n /** 阴影配置 */\n shadow?: {\n /** 是否启用阴影(默认 true) */\n enabled?: boolean;\n /** 阴影贴图分辨率(默认 2048) */\n mapSize?: number;\n /** 阴影相机范围(默认 15,对应 -range ~ +range) */\n cameraRange?: number;\n };\n /** 场景空间配置 */\n room?: {\n /** 是否启用 */\n enabled?: boolean;\n /** 宽度(X 轴),默认 30 */\n width?: number;\n /** 深度(Z 轴),默认 30 */\n depth?: number;\n /** 高度(Y 轴),默认 10 */\n height?: number;\n /** 地板颜色 */\n floorColor?: string;\n /** 墙壁颜色 */\n wallColor?: string;\n /** 天花板颜色 */\n ceilingColor?: string;\n /** 地板漫反射贴图(base64 data URL) */\n floorTexture?: string;\n /** 地板法线贴图 */\n floorNormalTexture?: string;\n /** 地板粗糙度贴图 */\n floorRoughnessTexture?: string;\n /** 墙壁漫反射贴图 */\n wallTexture?: string;\n /** 墙壁法线贴图 */\n wallNormalTexture?: string;\n /** 墙壁粗糙度贴图 */\n wallRoughnessTexture?: string;\n /** 天花板漫反射贴图 */\n ceilingTexture?: string;\n /** 天花板法线贴图 */\n ceilingNormalTexture?: string;\n /** 天花板粗糙度贴图 */\n ceilingRoughnessTexture?: string;\n /** 基础色是否与贴图叠加(默认 true;关闭后基础色强制 #ffffff,贴图原样显示) */\n floorUseBaseColor?: boolean;\n wallUseBaseColor?: boolean;\n ceilingUseBaseColor?: boolean;\n };\n}\n\nexport interface SceneDoc {\n schemaVersion: 3;\n /** 场景 ID(服务器分配) */\n id?: string;\n /** 场景名称 */\n name?: string;\n nodes: NodeDoc[];\n /** 相机位置 */\n camera?: CameraDoc;\n /** 环境配置 */\n environment?: EnvironmentConfig;\n /** 飞行路线 */\n flyPaths?: FlyPath[];\n /** 大屏看板 */\n dashboard?: DashboardConfig;\n /** 告警配置 */\n alarm?: AlarmConfig;\n}\n\n/** 场景元数据(列表用,不包含完整 SceneDoc) */\nexport interface SceneMeta {\n id: string;\n name: string;\n createdAt: number;\n updatedAt: number;\n}\n\nlet seq = 0;\nexport function nextId(prefix = 'n'): string {\n seq += 1;\n return `${prefix}_${Date.now().toString(36)}_${seq.toString(36)}`;\n}\n\nexport function createNode(primitive: PrimitiveKind, name: string): NodeDoc {\n return {\n id: nextId(),\n name,\n primitive,\n position: [0, 0.5, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n visible: true,\n children: [],\n };\n}\n\nexport function createSceneDoc(): SceneDoc {\n return { schemaVersion: 3, nodes: [] };\n}\n\nexport function clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n/** 告警弹窗数据 */\nexport interface AlarmPopupData {\n deviceName: string;\n alarmType: string;\n currentValue: number;\n threshold: number;\n priority: 'high' | 'medium' | 'low';\n suggestion: string;\n timestamp: number;\n}\n","import type { SceneStore } from './store';\nimport type { MaterialOverride } from './types';\n\n/** 命令:一切场景修改的唯一入口,天然可撤销 */\nexport interface Command {\n label: string;\n do(store: SceneStore): void;\n undo(store: SceneStore): void;\n}\n\nexport class History {\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n constructor(private readonly store: SceneStore) {}\n\n execute(cmd: Command): void {\n cmd.do(this.store);\n this.undoStack.push(cmd);\n this.redoStack.length = 0;\n this.store.notifyChanged();\n }\n\n undo(): void {\n const cmd = this.undoStack.pop();\n if (!cmd) return;\n cmd.undo(this.store);\n this.redoStack.push(cmd);\n this.store.notifyChanged();\n }\n\n redo(): void {\n const cmd = this.redoStack.pop();\n if (!cmd) return;\n cmd.do(this.store);\n this.undoStack.push(cmd);\n this.store.notifyChanged();\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** 清空所有历史记录 */\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n\n /** 检查撤销栈中是否有指定节点/mesh 的材质命令 */\n hasMaterialCmdFor(nodeId: string, meshName: string): boolean {\n for (let i = this.undoStack.length - 1; i >= 0; i--) {\n const cmd = this.undoStack[i] as any;\n if (cmd.nodeId === nodeId && cmd.meshName === meshName) return true;\n }\n return false;\n }\n\n /** 更新栈顶最后一个指定节点/mesh 的材质命令的 after 状态(用于贴图上传完成后替换临时 URL)\n * 返回 true 表示找到并更新了,false 表示栈中没有匹配的命令 */\n updateLastMaterialAfter(nodeId: string, meshName: string, newAfter: MaterialOverride): boolean {\n for (let i = this.undoStack.length - 1; i >= 0; i--) {\n const cmd = this.undoStack[i] as any;\n if (cmd.nodeId === nodeId && cmd.meshName === meshName) {\n cmd.after = newAfter;\n return true;\n }\n }\n return false;\n }\n\n /** 直接推入命令(用于已手动应用变更的场景,不再执行 do) */\n pushCommand(cmd: Command): void {\n this.undoStack.push(cmd);\n this.redoStack.length = 0;\n this.store.notifyChanged();\n }\n}\n","import { History } from './history';\nimport { createSceneDoc, type NodeDoc, type SceneDoc } from './types';\n\ntype Listener = () => void;\n\n/** 单一数据源:场景文档 + 选择 + 历史。不依赖 Angular / three */\nexport class SceneStore {\n readonly doc: SceneDoc = createSceneDoc();\n readonly history = new History(this);\n\n private docListeners = new Set<Listener>();\n private selectionListeners = new Set<Listener>();\n private _selection: string[] = [];\n\n get selection(): readonly string[] {\n return this._selection;\n }\n\n node(id: string): NodeDoc | undefined {\n return this.doc.nodes.find(n => n.id === id);\n }\n\n parentOf(id: string): NodeDoc | undefined {\n return this.doc.nodes.find(n => n.children.includes(id));\n }\n\n /** 收集节点自身及全部后代 */\n subtree(id: string): NodeDoc[] {\n const out: NodeDoc[] = [];\n const walk = (nid: string): void => {\n const n = this.node(nid);\n if (!n) return;\n out.push(n);\n n.children.forEach(walk);\n };\n walk(id);\n return out;\n }\n\n roots(): NodeDoc[] {\n const childIds = new Set(this.doc.nodes.flatMap(n => n.children));\n return this.doc.nodes.filter(n => !childIds.has(n.id));\n }\n\n setSelection(ids: string[]): void {\n this._selection = [...ids];\n this.selectionListeners.forEach(l => l());\n }\n\n onDocChange(l: Listener): () => void {\n this.docListeners.add(l);\n return () => this.docListeners.delete(l);\n }\n\n onSelectionChange(l: Listener): () => void {\n this.selectionListeners.add(l);\n return () => this.selectionListeners.delete(l);\n }\n\n /** History 与直接修改(如选择无关的文档变更)后调用 */\n notifyChanged(): void {\n this.docListeners.forEach(l => l());\n }\n\n /** 从 JSON 加载场景文档(替换当前文档,兼容 v2 和 v3) */\n loadDoc(doc: SceneDoc): void {\n this.doc.schemaVersion = doc.schemaVersion ?? 3;\n this.doc.id = doc.id;\n this.doc.name = doc.name;\n this.doc.nodes = doc.nodes ?? [];\n this.doc.camera = doc.camera;\n this.doc.environment = doc.environment;\n this.doc.flyPaths = doc.flyPaths;\n this.doc.dashboard = doc.dashboard;\n this._selection = [];\n // 加载文档时清空撤销/重做历史\n this.history.clear();\n this.notifyChanged();\n this.selectionListeners.forEach(l => l());\n }\n}\n","import type { Command } from './history';\nimport type { SceneStore } from './store';\nimport { clone, createNode, nextId, type AlarmConfig, type AnimationRule, type CameraKeyframe, type DashboardConfig, type EnvironmentConfig, type FlyPath, type MaterialOverride, type NodeDoc, type TransformState, type Vec3, type VisualEffect } from './types';\n\nexport class AddNodeCommand implements Command {\n readonly label: string;\n\n constructor(\n private readonly node: NodeDoc,\n private readonly parentId: string | null = null,\n ) {\n this.label = `添加 ${node.name}`;\n }\n\n do(store: SceneStore): void {\n if (!store.node(this.node.id)) {\n store.doc.nodes.push(clone(this.node));\n }\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p && !p.children.includes(this.node.id)) p.children.push(this.node.id);\n }\n }\n\n undo(store: SceneStore): void {\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.node.id);\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p) p.children = p.children.filter(c => c !== this.node.id);\n }\n }\n}\n\nexport class RemoveNodeCommand implements Command {\n readonly label = '删除节点';\n private removed: NodeDoc[] = [];\n private parentId: string | null = null;\n\n constructor(private readonly id: string) {}\n\n do(store: SceneStore): void {\n this.parentId = store.parentOf(this.id)?.id ?? null;\n this.removed = store.subtree(this.id);\n const ids = new Set(this.removed.map(n => n.id));\n store.doc.nodes = store.doc.nodes.filter(n => !ids.has(n.id));\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p) p.children = p.children.filter(c => c !== this.id);\n }\n }\n\n undo(store: SceneStore): void {\n store.doc.nodes.push(...clone(this.removed));\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p && !p.children.includes(this.id)) p.children.push(this.id);\n }\n }\n}\n\nexport class TransformCommand implements Command {\n readonly label = '变换';\n\n constructor(\n private readonly id: string,\n private readonly before: TransformState,\n private readonly after: TransformState,\n ) {}\n\n do(store: SceneStore): void {\n applyTransform(store, this.id, this.after);\n }\n\n undo(store: SceneStore): void {\n applyTransform(store, this.id, this.before);\n }\n}\n\nfunction applyTransform(store: SceneStore, id: string, t: TransformState): void {\n const n = store.node(id);\n if (!n) return;\n n.position = clone(t.position);\n n.rotation = clone(t.rotation);\n n.scale = clone(t.scale);\n}\n\n/** 合并选中节点为一个 group */\nexport class GroupCommand implements Command {\n readonly label = '合并为组';\n private groupId: string;\n private originalParents: Map<string, string | null> = new Map();\n private originalPositions: Map<string, [number, number, number]> = new Map();\n private removedEmptyGroups: NodeDoc[] = [];\n\n constructor(private readonly selectedIds: string[]) {\n this.groupId = nextId('grp');\n }\n\n do(store: SceneStore): void {\n this.removedEmptyGroups = [];\n // 记录每个选中节点的原始父节点和位置\n this.originalParents.clear();\n this.originalPositions.clear();\n for (const id of this.selectedIds) {\n this.originalParents.set(id, store.parentOf(id)?.id ?? null);\n const child = store.node(id);\n if (child) this.originalPositions.set(id, [...child.position] as [number, number, number]);\n }\n\n // 从原父节点移除选中的子节点(必须在添加 group 之前,否则 parentOf 会返回新 group)\n for (const id of this.selectedIds) {\n const parent = store.parentOf(id);\n if (parent) {\n parent.children = parent.children.filter(c => c !== id);\n }\n }\n\n // 检查是否有组变为空,删除空组\n for (const n of [...store.doc.nodes]) {\n if (n.primitive === 'group' && n.children.length === 0 && n.id !== this.groupId) {\n this.removedEmptyGroups.push(clone(n));\n store.doc.nodes = store.doc.nodes.filter(x => x.id !== n.id);\n }\n }\n\n // 计算所有选中节点的中心点(平均值),作为组的原点\n let cx = 0, cy = 0, cz = 0;\n for (const id of this.selectedIds) {\n const child = store.node(id);\n if (child) {\n cx += child.position[0];\n cy += child.position[1];\n cz += child.position[2];\n }\n }\n const count = this.selectedIds.length;\n if (count > 0) { cx /= count; cy /= count; cz /= count; }\n\n // 创建 group 节点\n const group = createNode('group', `组`);\n group.id = this.groupId;\n group.children = [...this.selectedIds];\n group.position = [\n Math.round(cx * 1000) / 1000,\n Math.round(cy * 1000) / 1000,\n Math.round(cz * 1000) / 1000,\n ];\n\n // 调整子节点位置:相对于组中心\n for (const id of this.selectedIds) {\n const child = store.node(id);\n if (child) {\n child.position = [\n Math.round((child.position[0] - cx) * 1000) / 1000,\n Math.round((child.position[1] - cy) * 1000) / 1000,\n Math.round((child.position[2] - cz) * 1000) / 1000,\n ];\n }\n }\n\n store.doc.nodes.push(clone(group));\n }\n\n undo(store: SceneStore): void {\n // 删除新创建的 group\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.groupId);\n\n // 恢复被删除的空组\n for (const g of this.removedEmptyGroups) {\n store.doc.nodes.push(clone(g));\n }\n\n // 恢复子节点到原父节点,并还原原始位置\n for (const [id, parentId] of this.originalParents) {\n if (parentId) {\n const p = store.node(parentId);\n if (p && !p.children.includes(id)) p.children.push(id);\n }\n // 还原子节点到原始位置(组内坐标 → 原始世界坐标)\n const origPos = this.originalPositions.get(id);\n const child = store.node(id);\n if (origPos && child) {\n child.position = [...origPos];\n }\n }\n }\n}\n\n/** 解除合并:将 group 的子节点提升到 group 的父节点下,删除 group */\nexport class UngroupCommand implements Command {\n readonly label = '解除合并';\n private groupId: string;\n private children: string[] = [];\n private groupParentId: string | null = null;\n private groupName = '';\n\n constructor(groupId: string) {\n this.groupId = groupId;\n }\n\n do(store: SceneStore): void {\n const group = store.node(this.groupId);\n if (!group || group.primitive !== 'group') return;\n\n this.groupParentId = store.parentOf(this.groupId)?.id ?? null;\n this.children = [...group.children];\n this.groupName = group.name;\n\n // 将子节点移到 group 的父节点下\n if (this.groupParentId) {\n const parent = store.node(this.groupParentId);\n if (parent) {\n const idx = parent.children.indexOf(this.groupId);\n if (idx >= 0) {\n parent.children.splice(idx, 1, ...this.children);\n } else {\n parent.children.push(...this.children);\n }\n }\n }\n\n // 删除 group\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.groupId);\n }\n\n undo(store: SceneStore): void {\n // 重建 group\n const group = createNode('group', this.groupName || '组');\n group.id = this.groupId;\n group.children = [...this.children];\n\n store.doc.nodes.push(clone(group));\n\n // 从当前父节点移除子节点\n for (const id of this.children) {\n const parent = store.parentOf(id);\n if (parent && parent.id !== this.groupId) {\n parent.children = parent.children.filter(c => c !== id);\n }\n }\n\n // 恢复 group 到原父节点\n if (this.groupParentId) {\n const parent = store.node(this.groupParentId);\n if (parent) {\n parent.children = parent.children.filter(c => !this.children.includes(c));\n if (!parent.children.includes(this.groupId)) {\n parent.children.push(this.groupId);\n }\n }\n }\n }\n}\n\n/** 材质覆盖命令:记录 before/after,支持 undo/redo */\nexport class MaterialOverrideCommand implements Command {\n readonly label = '修改材质';\n\n constructor(\n private readonly nodeId: string,\n private readonly meshName: string,\n private readonly before: MaterialOverride | undefined,\n private readonly after: MaterialOverride,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.materialOverrides) node.materialOverrides = {};\n node.materialOverrides[this.meshName] = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.materialOverrides) return;\n if (this.before) {\n node.materialOverrides[this.meshName] = clone(this.before);\n } else {\n delete node.materialOverrides[this.meshName];\n // 如果 materialOverrides 为空,清理掉\n if (Object.keys(node.materialOverrides).length === 0) {\n delete node.materialOverrides;\n }\n }\n }\n}\n\n/** 同步材质到同资产实例命令(批量) */\nexport class SyncMaterialCommand implements Command {\n readonly label = '同步材质到同资产实例';\n\n constructor(\n private readonly sourceNodeId: string,\n private readonly targetNodeIds: string[],\n private readonly beforeMap: Map<string, Record<string, MaterialOverride> | undefined>,\n private readonly after: Record<string, MaterialOverride> | undefined,\n ) {}\n\n do(store: SceneStore): void {\n for (const nodeId of this.targetNodeIds) {\n const node = store.node(nodeId);\n if (!node) continue;\n if (this.after) {\n node.materialOverrides = clone(this.after);\n } else {\n delete node.materialOverrides;\n }\n }\n }\n\n undo(store: SceneStore): void {\n for (const nodeId of this.targetNodeIds) {\n const node = store.node(nodeId);\n if (!node) continue;\n const before = this.beforeMap.get(nodeId);\n if (before) {\n node.materialOverrides = clone(before);\n } else {\n delete node.materialOverrides;\n }\n }\n }\n}\n\n/** 看板配置命令 */\nexport class SetDashboardCommand implements Command {\n readonly label = '修改看板';\n\n constructor(\n private readonly before: DashboardConfig | undefined,\n private readonly after: DashboardConfig,\n ) {}\n\n do(store: SceneStore): void {\n store.doc.dashboard = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n if (this.before) {\n store.doc.dashboard = clone(this.before);\n } else {\n delete store.doc.dashboard;\n }\n }\n}\n\n/** 告警配置命令 */\nexport class SetAlarmCommand implements Command {\n readonly label = '修改告警';\n\n constructor(\n private readonly before: AlarmConfig | undefined,\n private readonly after: AlarmConfig,\n ) {}\n\n do(store: SceneStore): void {\n store.doc.alarm = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n if (this.before) {\n store.doc.alarm = clone(this.before);\n } else {\n delete store.doc.alarm;\n }\n }\n}\n\n/** 拖动节点改变父节点 */\nexport class ReparentCommand implements Command {\n readonly label = '移动节点';\n private oldParentId: string | null = null;\n private oldIndex = 0;\n\n constructor(\n private readonly nodeId: string,\n private readonly newParentId: string | null,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n\n // 记录旧位置\n this.oldParentId = store.parentOf(this.nodeId)?.id ?? null;\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent) {\n this.oldIndex = oldParent.children.indexOf(this.nodeId);\n }\n }\n\n // 从旧父节点移除\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent) {\n oldParent.children = oldParent.children.filter(c => c !== this.nodeId);\n }\n }\n\n // 添加到新父节点\n if (this.newParentId) {\n const newParent = store.node(this.newParentId);\n if (newParent && !newParent.children.includes(this.nodeId)) {\n newParent.children.push(this.nodeId);\n }\n }\n }\n\n undo(store: SceneStore): void {\n // 从当前父节点移除\n const currentParent = store.parentOf(this.nodeId);\n if (currentParent) {\n currentParent.children = currentParent.children.filter(c => c !== this.nodeId);\n }\n\n // 恢复到原来的父节点和位置\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent && !oldParent.children.includes(this.nodeId)) {\n oldParent.children.splice(this.oldIndex, 0, this.nodeId);\n }\n }\n }\n}\n\n/** 环境配置命令:背景色、半球光、平行光、HDRI、场景空间 */\nexport class SetEnvironmentCommand implements Command {\n readonly label = '修改环境';\n\n constructor(\n private readonly before: EnvironmentConfig | undefined,\n private readonly after: EnvironmentConfig,\n ) {}\n\n do(store: SceneStore): void {\n const floorColor = this.after.room?.floorColor || 'none';\n const floorTexture = this.after.room?.floorTexture?.substring(0, 30) || 'no texture';\n console.log('[SetEnvironmentCommand.do] applying - floorColor:', floorColor, 'floorTexture:', floorTexture);\n store.doc.environment = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n const floorColor = this.before?.room?.floorColor || 'none';\n const floorTexture = this.before?.room?.floorTexture?.substring(0, 30) || 'no texture';\n console.log('[SetEnvironmentCommand.undo] restoring - floorColor:', floorColor, 'floorTexture:', floorTexture);\n if (this.before) {\n store.doc.environment = clone(this.before);\n } else {\n delete store.doc.environment;\n }\n }\n}\n\n/** 灯光属性修改命令 */\nexport class SetLightPropertyCommand implements Command {\n readonly label = '修改灯光';\n private oldValue: unknown;\n\n constructor(\n private readonly nodeId: string,\n private readonly prop: string,\n private readonly newValue: unknown,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || node.primitive !== 'light') return;\n (node as any)[this.prop] = this.newValue;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n (node as any)[this.prop] = this.oldValue;\n }\n\n /** 执行前保存旧值(必须在 do 之前调用) */\n captureOldValue(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (node) this.oldValue = (node as any)[this.prop];\n }\n}\n\n/** 节点重命名命令 */\nexport class SetNodeNameCommand implements Command {\n readonly label = '重命名';\n private oldName = '';\n\n constructor(\n private readonly nodeId: string,\n private readonly newName: string,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n this.oldName = node.name;\n node.name = this.newName;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n node.name = this.oldName;\n }\n}\n\nexport class SetNodeTextCommand implements Command {\n readonly label = '标签文字';\n private oldText = '';\n\n constructor(\n private readonly nodeId: string,\n private readonly newText: string,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n this.oldText = node.text ?? '';\n node.text = this.newText;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n node.text = this.oldText;\n }\n}\n\n/** 批量删除命令(多选删除合并为单个撤销步骤) */\nexport class BatchRemoveCommand implements Command {\n readonly label = '删除节点';\n private removedGroups: { nodes: NodeDoc[]; parentId: string | null; rootId: string }[] = [];\n\n constructor(private readonly ids: string[]) {}\n\n do(store: SceneStore): void {\n this.removedGroups = [];\n for (const id of this.ids) {\n const parentId = store.parentOf(id)?.id ?? null;\n const subtree = store.subtree(id);\n if (subtree.length === 0) continue;\n this.removedGroups.push({ nodes: clone(subtree), parentId, rootId: id });\n // 删除整个子树\n const subIds = new Set(subtree.map(n => n.id));\n store.doc.nodes = store.doc.nodes.filter(n => !subIds.has(n.id));\n if (parentId) {\n const p = store.node(parentId);\n if (p) p.children = p.children.filter(c => c !== id);\n }\n }\n }\n\n undo(store: SceneStore): void {\n for (const group of this.removedGroups) {\n // 恢复所有节点\n store.doc.nodes.push(...clone(group.nodes));\n // 恢复到父节点\n if (group.parentId) {\n const p = store.node(group.parentId);\n if (p && !p.children.includes(group.rootId)) p.children.push(group.rootId);\n }\n }\n }\n}\n\n/** 动画添加命令 */\nexport class AddAnimationCommand implements Command {\n readonly label = '添加动画';\n\n constructor(\n private readonly nodeId: string,\n private readonly rule: AnimationRule,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.animations) node.animations = [];\n if (!node.animations.find(r => r.id === this.rule.id)) {\n node.animations.push(clone(this.rule));\n }\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations) return;\n node.animations = node.animations.filter(r => r.id !== this.rule.id);\n if (node.animations.length === 0) delete node.animations;\n }\n}\n\n/** 动画更新命令 */\nexport class UpdateAnimationCommand implements Command {\n readonly label = '修改动画';\n private oldRule: AnimationRule | undefined;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n private readonly newRule: AnimationRule,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index]) return;\n this.oldRule = clone(node.animations[this.index]);\n node.animations[this.index] = clone(this.newRule);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index] || !this.oldRule) return;\n node.animations[this.index] = clone(this.oldRule);\n }\n}\n\n/** 动画删除命令 */\nexport class RemoveAnimationCommand implements Command {\n readonly label = '删除动画';\n private oldRule: AnimationRule | undefined;\n private oldIndex = -1;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index]) return;\n this.oldRule = clone(node.animations[this.index]);\n this.oldIndex = this.index;\n node.animations.splice(this.index, 1);\n if (node.animations.length === 0) delete node.animations;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || !this.oldRule) return;\n if (!node.animations) node.animations = [];\n node.animations.splice(this.oldIndex, 0, clone(this.oldRule));\n }\n}\n\n/** 飞行路线操作命令(创建/更新/删除合并为一个命令类) */\nexport class FlyPathCommand implements Command {\n readonly label: string;\n private beforePaths: FlyPath[] | undefined;\n\n constructor(\n private readonly action: 'create' | 'update' | 'delete',\n private readonly pathId: string,\n private readonly pathData?: FlyPath,\n private readonly updates?: Partial<FlyPath>,\n ) {\n this.label = action === 'create' ? '创建飞行路线' : action === 'update' ? '修改飞行路线' : '删除飞行路线';\n }\n\n do(store: SceneStore): void {\n // 保存当前状态用于 undo\n this.beforePaths = store.doc.flyPaths ? clone(store.doc.flyPaths) : undefined;\n\n if (!store.doc.flyPaths) store.doc.flyPaths = [];\n\n switch (this.action) {\n case 'create':\n if (this.pathData && !store.doc.flyPaths.find(p => p.id === this.pathId)) {\n store.doc.flyPaths.push(clone(this.pathData));\n }\n break;\n case 'update':\n const path = store.doc.flyPaths.find(p => p.id === this.pathId);\n if (path && this.updates) Object.assign(path, this.updates);\n break;\n case 'delete':\n const idx = store.doc.flyPaths.findIndex(p => p.id === this.pathId);\n if (idx >= 0) {\n store.doc.flyPaths.splice(idx, 1);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n }\n break;\n }\n }\n\n undo(store: SceneStore): void {\n if (this.beforePaths) {\n store.doc.flyPaths = clone(this.beforePaths);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n } else {\n delete store.doc.flyPaths;\n }\n }\n}\n\n/** 关键帧操作命令(添加/更新/删除/插入/覆盖合并为一个命令类) */\nexport class KeyframeCommand implements Command {\n readonly label: string;\n private beforePaths: FlyPath[] | undefined;\n\n constructor(\n private readonly action: 'add' | 'update' | 'delete' | 'insert' | 'overwrite',\n private readonly pathId: string,\n private readonly index?: number,\n private readonly keyframe?: CameraKeyframe,\n ) {\n this.label = action === 'add' ? '添加关键帧' : action === 'update' ? '修改关键帧' :\n action === 'delete' ? '删除关键帧' : action === 'insert' ? '插入关键帧' : '覆盖关键帧';\n }\n\n do(store: SceneStore): void {\n // 保存当前状态用于 undo\n this.beforePaths = store.doc.flyPaths ? clone(store.doc.flyPaths) : undefined;\n\n const path = store.doc.flyPaths?.find(p => p.id === this.pathId);\n if (!path) return;\n\n switch (this.action) {\n case 'add':\n if (this.keyframe) {\n path.keyframes.push(clone(this.keyframe));\n path.keyframes.sort((a, b) => a.time - b.time);\n }\n break;\n case 'update':\n if (this.index !== undefined && this.keyframe && path.keyframes[this.index]) {\n path.keyframes[this.index] = clone(this.keyframe);\n path.keyframes.sort((a, b) => a.time - b.time);\n }\n break;\n case 'delete':\n if (this.index !== undefined) {\n path.keyframes.splice(this.index, 1);\n }\n break;\n case 'insert':\n if (this.index !== undefined && this.keyframe) {\n path.keyframes.splice(this.index + 1, 0, clone(this.keyframe));\n const interval = path.interval ?? 2;\n for (let i = this.index + 2; i < path.keyframes.length; i++) {\n path.keyframes[i].time = path.keyframes[i - 1].time + interval;\n }\n }\n break;\n case 'overwrite':\n if (this.index !== undefined && this.keyframe && path.keyframes[this.index]) {\n path.keyframes[this.index] = {\n ...path.keyframes[this.index],\n position: clone(this.keyframe.position),\n target: clone(this.keyframe.target),\n };\n }\n break;\n }\n }\n\n undo(store: SceneStore): void {\n if (this.beforePaths) {\n store.doc.flyPaths = clone(this.beforePaths);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n } else {\n delete store.doc.flyPaths;\n }\n }\n}\n\n// ── 视觉效果命令 ──\n\n/** 添加视觉效果 */\nexport class AddEffectCommand implements Command {\n readonly label = '添加特效';\n\n constructor(\n private readonly nodeId: string,\n private readonly effect: VisualEffect,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.effects) node.effects = [];\n if (!node.effects.find(e => e.id === this.effect.id)) {\n node.effects.push(clone(this.effect));\n }\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects) return;\n node.effects = node.effects.filter(e => e.id !== this.effect.id);\n if (node.effects.length === 0) delete node.effects;\n }\n}\n\n/** 更新视觉效果 */\nexport class UpdateEffectCommand implements Command {\n readonly label = '修改特效';\n private oldEffect: VisualEffect | undefined;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n private readonly newEffect: VisualEffect,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index]) return;\n this.oldEffect = clone(node.effects[this.index]);\n node.effects[this.index] = clone(this.newEffect);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index] || !this.oldEffect) return;\n node.effects[this.index] = clone(this.oldEffect);\n }\n}\n\n/** 删除视觉效果 */\nexport class RemoveEffectCommand implements Command {\n readonly label = '删除特效';\n private oldEffect: VisualEffect | undefined;\n private oldIndex = -1;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index]) return;\n this.oldEffect = clone(node.effects[this.index]);\n this.oldIndex = this.index;\n node.effects.splice(this.index, 1);\n if (node.effects.length === 0) delete node.effects;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || !this.oldEffect) return;\n if (!node.effects) node.effects = [];\n node.effects.splice(this.oldIndex, 0, clone(this.oldEffect));\n }\n}\n\n// ── 路径点编辑命令 ──\n\n/** 更新路径点位置 */\nexport class UpdatePathPointsCommand implements Command {\n readonly label = '修改路径点';\n private oldPoints: Vec3[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly newPoints: Vec3[],\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n this.oldPoints = clone(effect.pathPoints);\n effect.pathPoints = clone(this.newPoints);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n }\n}\n\nexport class InsertPathPointCommand implements Command {\n readonly label = '添加路径点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly insertAfter: number,\n private readonly position: Vec3,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const newPoints = clone(effect.pathPoints);\n newPoints.splice(this.insertAfter + 1, 0, clone(this.position));\n\n // 插入对应的 segmentType(默认 linear)\n const newSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : [];\n if (newSegmentTypes.length === newPoints.length - 2) {\n newSegmentTypes.splice(this.insertAfter + 1, 0, 'linear');\n } else {\n // 如果 segmentTypes 长度不对,重新生成\n while (newSegmentTypes.length < newPoints.length - 1) {\n newSegmentTypes.push('linear');\n }\n }\n\n effect.pathPoints = newPoints;\n effect.segmentTypes = newSegmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n\n/** 删除路径点(最少保留 2 个) */\nexport class RemovePathPointCommand implements Command {\n readonly label = '删除路径点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly pointIndex: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n if (effect.pathPoints.length <= 2) return; // 最少保留 2 个点\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const newPoints = clone(effect.pathPoints);\n newPoints.splice(this.pointIndex, 1);\n\n // 删除对应的 segmentType\n const newSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : [];\n if (newSegmentTypes.length >= newPoints.length) {\n // 删除点前面的段类型(如果存在)\n const segIndex = Math.min(this.pointIndex, newSegmentTypes.length - 1);\n newSegmentTypes.splice(segIndex, 1);\n }\n // 确保长度匹配\n while (newSegmentTypes.length < newPoints.length - 1) {\n newSegmentTypes.push('linear');\n }\n\n effect.pathPoints = newPoints;\n effect.segmentTypes = newSegmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n\n/** 切换段类型(直线/曲线) */\nexport class ToggleSegmentTypeCommand implements Command {\n readonly label = '切换段类型';\n private oldType: ('linear' | 'smooth') | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly segmentIndex: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n if (!effect.segmentTypes) {\n effect.segmentTypes = new Array(effect.pathPoints.length - 1).fill('linear');\n }\n if (this.segmentIndex < 0 || this.segmentIndex >= effect.segmentTypes.length) return;\n\n this.oldType = effect.segmentTypes[this.segmentIndex];\n effect.segmentTypes[this.segmentIndex] = this.oldType === 'linear' ? 'smooth' : 'linear';\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldType) return;\n effect.segmentTypes[this.segmentIndex] = this.oldType;\n }\n}\n\n/** 移动控制点到数组开头或结尾 */\nexport class MovePathPointToEndCommand implements Command {\n readonly label = '移动控制点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly pointIndex: number,\n private readonly toStart: boolean,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const points = [...effect.pathPoints];\n const segmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : new Array(points.length - 1).fill('linear');\n\n // 取出要移动的点\n const point = points.splice(this.pointIndex, 1)[0];\n\n // 调整 segmentTypes:删除被移动点相关的段\n if (this.pointIndex > 0) {\n segmentTypes.splice(this.pointIndex - 1, 1);\n }\n if (this.pointIndex < points.length) {\n segmentTypes.splice(this.pointIndex, 1);\n }\n\n // 插入到开头或结尾\n if (this.toStart) {\n points.unshift(point);\n segmentTypes.unshift('linear');\n } else {\n points.push(point);\n segmentTypes.push('linear');\n }\n\n effect.pathPoints = points;\n effect.segmentTypes = segmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n","/**\n * 粒子系统运行时\n * 使用 BufferGeometry + Points + ShaderMaterial 实现 GPU 加速的粒子效果\n */\n\nimport * as THREE from 'three';\nimport type { ParticleEffect, Vec3 } from './types';\n\n// 顶点着色器\nconst VERTEX_SHADER = `\n attribute float aAge;\n attribute float aLifetime;\n attribute float aSize;\n\n varying float vProgress; // age / lifetime (0-1)\n\n void main() {\n vProgress = clamp(aAge / max(aLifetime, 0.001), 0.0, 1.0);\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n // 粒子大小:初始小,逐渐变大(蒸汽扩散效果)\n // 生命周期内膨胀 5 倍,初始更大\n float sizeGrowth = 1.0 + vProgress * 4.0;\n // 距离衰减:更大的基础大小\n gl_PointSize = aSize * sizeGrowth * (300.0 / -mvPosition.z);\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n// 片元着色器\nconst FRAGMENT_SHADER = `\n varying float vProgress;\n\n uniform vec3 uStartColor;\n uniform vec3 uEndColor;\n uniform float uStartOpacity;\n uniform float uEndOpacity;\n\n void main() {\n // 圆形粒子\n vec2 center = gl_PointCoord - vec2(0.5);\n float dist = length(center);\n if (dist > 0.5) discard;\n\n // 颜色在 startColor → endColor 间插值\n vec3 color = mix(uStartColor, uEndColor, vProgress);\n\n // 透明度:缓慢出现,慢慢消失(蒸汽扩散效果)\n float fadeIn = smoothstep(0.0, 0.2, vProgress); // 更长的淡入\n float fadeOut = 1.0 - smoothstep(0.4, 1.0, vProgress); // 更晚开始消散\n float baseOpacity = mix(uStartOpacity, uEndOpacity, vProgress);\n float alpha = baseOpacity * fadeIn * fadeOut;\n\n // 更柔和的边缘(蒸汽扩散效果)\n // 使用更小的指数值让边缘更模糊\n float edgeSoft = exp(-dist * dist * 4.0); // 从 8.0 降到 4.0\n alpha *= edgeSoft;\n\n gl_FragColor = vec4(color, alpha);\n }\n`;\n\n/** 粒子运行时状态 */\nexport class ParticleRuntime {\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n points: THREE.Points;\n\n // CPU 侧状态\n private positions: Float32Array;\n private velocities: Float32Array;\n private ages: Float32Array;\n private lifetimes: Float32Array;\n private sizes: Float32Array;\n private alive: Uint8Array;\n private emitAccumulator = 0;\n private config: ParticleEffect;\n private origin: THREE.Vector3;\n /** 水平漂移累积(每个粒子独立的随机相位) */\n private driftPhases: Float32Array;\n\n // BufferAttribute 引用\n private posAttr: THREE.BufferAttribute;\n private ageAttr: THREE.BufferAttribute;\n private lifetimeAttr: THREE.BufferAttribute;\n private sizeAttr: THREE.BufferAttribute;\n\n constructor(config: ParticleEffect, origin: THREE.Vector3) {\n this.config = { ...config };\n this.origin = origin.clone();\n const max = config.maxParticles;\n\n // CPU 数组\n this.positions = new Float32Array(max * 3);\n this.velocities = new Float32Array(max * 3);\n this.ages = new Float32Array(max);\n this.lifetimes = new Float32Array(max);\n this.sizes = new Float32Array(max);\n this.alive = new Uint8Array(max);\n this.driftPhases = new Float32Array(max); // 随机相位,用于漂移\n\n // 初始化所有粒子为 dead\n this.ages.fill(9999);\n this.lifetimes.fill(1);\n\n // BufferGeometry\n this.geometry = new THREE.BufferGeometry();\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.ageAttr = new THREE.BufferAttribute(this.ages, 1);\n this.ageAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aAge', this.ageAttr);\n\n this.lifetimeAttr = new THREE.BufferAttribute(this.lifetimes, 1);\n this.lifetimeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aLifetime', this.lifetimeAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n // 颜色和透明度通过 uniform 传入(startColor/endColor/startOpacity/endOpacity)\n // 每个粒子的 color 和 opacity 在顶点着色器中根据 progress 插值\n\n // ShaderMaterial\n const startColor = new THREE.Color(config.startColor);\n const endColor = new THREE.Color(config.endColor);\n\n this.material = new THREE.ShaderMaterial({\n vertexShader: VERTEX_SHADER,\n fragmentShader: FRAGMENT_SHADER,\n uniforms: {\n uStartColor: { value: startColor },\n uEndColor: { value: endColor },\n uStartOpacity: { value: config.startOpacity },\n uEndOpacity: { value: config.endOpacity },\n },\n transparent: true,\n depthWrite: false,\n blending: config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n this.points = new THREE.Points(this.geometry, this.material);\n this.points.frustumCulled = false;\n }\n\n /** 更新配置参数(不重建 geometry) */\n updateConfig(config: ParticleEffect): void {\n this.config = { ...config };\n const startColor = new THREE.Color(config.startColor);\n const endColor = new THREE.Color(config.endColor);\n this.material.uniforms['uStartColor'].value = startColor;\n this.material.uniforms['uEndColor'].value = endColor;\n this.material.uniforms['uStartOpacity'].value = config.startOpacity;\n this.material.uniforms['uEndOpacity'].value = config.endOpacity;\n this.material.blending = config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending;\n this.material.needsUpdate = true;\n }\n\n /** 发射粒子 */\n private emit(count: number): void {\n const cfg = this.config;\n const dir = new THREE.Vector3(...cfg.direction).normalize();\n const spread = cfg.spreadAngle;\n\n for (let i = 0; i < count; i++) {\n // 找一个 dead 的槽位\n const idx = this.findDeadSlot();\n if (idx < 0) break;\n\n // 位置:从 origin 发射\n const i3 = idx * 3;\n this.positions[i3] = this.origin.x;\n this.positions[i3 + 1] = this.origin.y;\n this.positions[i3 + 2] = this.origin.z;\n\n // 速度:direction + 随机锥角偏移\n const velocity = dir.clone();\n if (spread > 0) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.random() * spread;\n const sinPhi = Math.sin(phi);\n velocity.x += sinPhi * Math.cos(theta);\n velocity.y += Math.cos(phi);\n velocity.z += sinPhi * Math.sin(theta);\n velocity.normalize();\n }\n velocity.multiplyScalar(cfg.speed * (0.8 + Math.random() * 0.4));\n this.velocities[i3] = velocity.x;\n this.velocities[i3 + 1] = velocity.y;\n this.velocities[i3 + 2] = velocity.z;\n\n // 年龄、生命、大小\n this.ages[idx] = 0;\n this.lifetimes[idx] = cfg.lifetime * (0.8 + Math.random() * 0.4);\n this.sizes[idx] = cfg.size + (Math.random() - 0.5) * cfg.sizeRandom * 2;\n this.driftPhases[idx] = Math.random() * Math.PI * 2; // 随机漂移相位\n this.alive[idx] = 1;\n }\n }\n\n private findDeadSlot(): number {\n for (let i = 0; i < this.config.maxParticles; i++) {\n if (!this.alive[i]) return i;\n }\n return -1;\n }\n\n /** 每帧更新 */\n update(dt: number): void {\n const cfg = this.config;\n const gravity = cfg.gravity;\n const damping = cfg.damping;\n\n // 发射新粒子\n this.emitAccumulator += cfg.emissionRate * dt;\n const toEmit = Math.floor(this.emitAccumulator);\n if (toEmit > 0) {\n this.emit(toEmit);\n this.emitAccumulator -= toEmit;\n }\n\n // 更新现有粒子\n for (let i = 0; i < cfg.maxParticles; i++) {\n if (!this.alive[i]) continue;\n\n this.ages[i] += dt;\n if (this.ages[i] >= this.lifetimes[i]) {\n // 粒子死亡\n this.alive[i] = 0;\n this.ages[i] = 9999;\n // 移到屏幕外\n const i3 = i * 3;\n this.positions[i3] = 0;\n this.positions[i3 + 1] = -9999;\n this.positions[i3 + 2] = 0;\n continue;\n }\n\n const i3 = i * 3;\n\n // 进度\n const progress = this.ages[i] / this.lifetimes[i];\n\n // 重力(负值 = 向上浮力)\n this.velocities[i3 + 1] -= gravity * dt;\n\n // 上升速度随时间衰减(蒸汽浮力减弱)\n this.velocities[i3 + 1] *= (1 - 0.3 * dt);\n\n // 水平漂移:随进度增大,模拟蒸汽扩散\n const driftStrength = progress * 0.8; // 越老漂移越强\n const phase = this.driftPhases[i];\n this.velocities[i3] += Math.sin(phase + this.ages[i] * 1.5) * driftStrength * dt;\n this.velocities[i3 + 2] += Math.cos(phase + this.ages[i] * 1.2) * driftStrength * dt;\n\n // 速度衰减(空气阻力)\n this.velocities[i3] *= (1 - damping * dt);\n this.velocities[i3 + 2] *= (1 - damping * dt);\n\n // 位置更新\n this.positions[i3] += this.velocities[i3] * dt;\n this.positions[i3 + 1] += this.velocities[i3 + 1] * dt;\n this.positions[i3 + 2] += this.velocities[i3 + 2] * dt;\n }\n\n // 标记 buffer 需要更新\n this.posAttr.needsUpdate = true;\n this.ageAttr.needsUpdate = true;\n this.lifetimeAttr.needsUpdate = true;\n this.sizeAttr.needsUpdate = true;\n }\n\n /** 更新粒子系统的原点位置(跟随父节点) */\n setOrigin(position: THREE.Vector3): void {\n this.origin.copy(position);\n }\n\n dispose(): void {\n this.geometry.dispose();\n this.material.dispose();\n this.points.parent?.remove(this.points);\n }\n}\n","/**\n * 分段路径 — 根据 segmentTypes 逐段生成曲线\n * - 'linear': 直线段(线性插值)\n * - 'smooth': 平滑曲线段(CatmullRom,前后各借一个控制点)\n *\n * 注意:CatmullRomCurve3([p0,p1,p2,p3]) 的参数范围是 p0→p3 (t=0→1)\n * 其中 p1 在 t=1/3, p2 在 t=2/3\n * 所以段 p1→p2 对应曲线参数 t∈[1/3, 2/3]\n */\n\nimport * as THREE from 'three';\n\n// CatmullRom 4 控制点时,p1 和 p2 对应的参数\nconst CR_T_START = 1 / 3; // p1 的位置\nconst CR_T_END = 2 / 3; // p2 的位置\n\ninterface LinearSegment {\n type: 'linear';\n start: THREE.Vector3;\n end: THREE.Vector3;\n length: number;\n}\n\ninterface SmoothSegment {\n type: 'smooth';\n curve: THREE.CatmullRomCurve3;\n length: number; // 仅 p1→p2 段的弧长\n}\n\ntype PathSegment = LinearSegment | SmoothSegment;\n\n/**\n * 分段路径类\n * 根据 segmentTypes 数组决定每段是直线还是曲线\n */\nexport class SegmentedPath {\n private segments: PathSegment[] = [];\n private totalLength: number = 0;\n\n /**\n * @param points 路径点数组\n * @param segmentTypes 段类型数组,长度 = points.length - 1\n */\n constructor(points: THREE.Vector3[], segmentTypes: ('linear' | 'smooth')[]) {\n this.buildSegments(points, segmentTypes);\n }\n\n private buildSegments(points: THREE.Vector3[], segmentTypes: ('linear' | 'smooth')[]): void {\n this.segments = [];\n\n if (points.length < 2) return;\n\n // 遍历每一段\n for (let i = 0; i < points.length - 1; i++) {\n const segType = segmentTypes[i] || 'linear';\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n if (segType === 'linear') {\n // 直段:线性插值\n const length = p1.distanceTo(p2);\n this.segments.push({\n type: 'linear',\n start: p1.clone(),\n end: p2.clone(),\n length,\n });\n } else {\n // 弯段:CatmullRom,需要前后各一个控制点\n const curve = new THREE.CatmullRomCurve3([p0, p1, p2, p3], false, 'catmullrom', 0.5);\n // 只计算 p1→p2 段的弧长(曲线参数 t∈[1/3, 2/3])\n const length = this.computeSegmentLength(curve, CR_T_START, CR_T_END);\n this.segments.push({\n type: 'smooth',\n curve,\n length,\n });\n }\n }\n\n // 计算总长度\n this.totalLength = this.segments.reduce((sum, seg) => sum + seg.length, 0);\n }\n\n /** 数值积分计算曲线在参数范围 [t0, t1] 内的弧长 */\n private computeSegmentLength(curve: THREE.CatmullRomCurve3, t0: number, t1: number, steps = 64): number {\n let length = 0;\n let prev = curve.getPoint(t0);\n for (let s = 1; s <= steps; s++) {\n const t = t0 + (s / steps) * (t1 - t0);\n const curr = curve.getPoint(t);\n length += prev.distanceTo(curr);\n prev = curr;\n }\n return length;\n }\n\n /** 将段内局部参数 t∈[0,1] 映射到曲线参数 t∈[1/3, 2/3] */\n private mapToCurveT(localT: number): number {\n return CR_T_START + localT * (CR_T_END - CR_T_START);\n }\n\n /** 获取段上某局部参数对应的点 */\n private getSmoothPoint(seg: SmoothSegment, localT: number): THREE.Vector3 {\n return seg.curve.getPoint(this.mapToCurveT(localT));\n }\n\n /**\n * 根据进度 t (0-1) 获取路径上的点\n * 按弧长参数化,保证匀速运动\n */\n getPointAt(t: number): THREE.Vector3 {\n if (this.segments.length === 0) {\n return new THREE.Vector3();\n }\n\n if (t <= 0) {\n const first = this.segments[0];\n return first.type === 'linear' ? first.start.clone() : this.getSmoothPoint(first, 0);\n }\n\n if (t >= 1) {\n const last = this.segments[this.segments.length - 1];\n return last.type === 'linear' ? last.end.clone() : this.getSmoothPoint(last, 1);\n }\n\n const targetLength = t * this.totalLength;\n let accumulatedLength = 0;\n\n for (const segment of this.segments) {\n if (accumulatedLength + segment.length >= targetLength) {\n // 找到目标段\n const localT = (targetLength - accumulatedLength) / segment.length;\n\n if (segment.type === 'linear') {\n return segment.start.clone().lerp(segment.end, localT);\n } else {\n return this.getSmoothPoint(segment, localT);\n }\n }\n\n accumulatedLength += segment.length;\n }\n\n // fallback:返回最后一个点\n const last = this.segments[this.segments.length - 1];\n return last.type === 'linear' ? last.end.clone() : this.getSmoothPoint(last, 1);\n }\n\n /**\n * 获取路径上的采样点(用于可视化)\n * @param totalSegments 总采样段数\n */\n getPoints(totalSegments: number = 64): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n\n if (this.segments.length === 0) return points;\n\n // 按段长度比例分配采样点数\n for (const segment of this.segments) {\n const segSamples = Math.max(1, Math.round((segment.length / this.totalLength) * totalSegments));\n\n if (segment.type === 'linear') {\n for (let i = 0; i <= segSamples; i++) {\n const t = i / segSamples;\n points.push(segment.start.clone().lerp(segment.end, t));\n }\n } else {\n // 只采样 p1→p2 段(曲线参数 t∈[1/3, 2/3])\n for (let i = 0; i <= segSamples; i++) {\n const localT = i / segSamples;\n points.push(this.getSmoothPoint(segment, localT));\n }\n }\n }\n\n // 去重(相邻段的连接点会重复)\n const uniquePoints: THREE.Vector3[] = [points[0]];\n for (let i = 1; i < points.length; i++) {\n const prev = uniquePoints[uniquePoints.length - 1];\n if (points[i].distanceTo(prev) > 0.001) {\n uniquePoints.push(points[i]);\n }\n }\n\n return uniquePoints;\n }\n\n /**\n * 按弧长均匀采样路径点(用于粒子均匀分布)\n * @param count 采样点数量\n */\n getSpacedPoints(count: number = 64): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n points.push(this.getPointAt(t));\n }\n return points;\n }\n\n /** 获取总长度 */\n getLength(): number {\n return this.totalLength;\n }\n\n /**\n * 根据进度 t (0-1) 获取路径在该点的切线方向(单位向量)\n */\n getTangentAt(t: number): THREE.Vector3 {\n if (this.segments.length === 0) {\n return new THREE.Vector3(0, 0, 1);\n }\n\n t = Math.max(0, Math.min(1, t));\n\n if (t <= 0) {\n const first = this.segments[0];\n if (first.type === 'linear') {\n return first.end.clone().sub(first.start).normalize();\n }\n return first.curve.getTangent(this.mapToCurveT(0)).normalize();\n }\n\n if (t >= 1) {\n const last = this.segments[this.segments.length - 1];\n if (last.type === 'linear') {\n return last.end.clone().sub(last.start).normalize();\n }\n return last.curve.getTangent(this.mapToCurveT(1)).normalize();\n }\n\n const targetLength = t * this.totalLength;\n let accumulatedLength = 0;\n\n for (const segment of this.segments) {\n if (accumulatedLength + segment.length >= targetLength) {\n const localT = (targetLength - accumulatedLength) / segment.length;\n\n if (segment.type === 'linear') {\n return segment.end.clone().sub(segment.start).normalize();\n } else {\n return segment.curve.getTangent(this.mapToCurveT(localT)).normalize();\n }\n }\n\n accumulatedLength += segment.length;\n }\n\n const last = this.segments[this.segments.length - 1];\n if (last.type === 'linear') {\n return last.end.clone().sub(last.start).normalize();\n }\n return last.curve.getTangent(this.mapToCurveT(1)).normalize();\n }\n}\n","/**\n * 路径粒子系统运行时\n * 粒子沿指定路径(曲线)运动,模拟管道水流/光纤效果\n */\n\nimport * as THREE from 'three';\nimport type { PathParticleEffect, Vec3 } from './types';\nimport { SegmentedPath } from './segmented-path';\n\n// 顶点着色器\nconst VERTEX_SHADER = `\n attribute float aProgress;\n attribute float aSize;\n attribute float aOpacity;\n attribute float aTrailProgress;\n\n varying float vOpacity;\n varying vec3 vColor;\n varying float vTrailProgress;\n varying float vProgress;\n\n uniform vec3 uColor;\n uniform float uBaseOpacity;\n uniform bool uTrail;\n\n void main() {\n vOpacity = aOpacity * uBaseOpacity;\n vColor = uColor;\n vTrailProgress = aTrailProgress;\n vProgress = aProgress;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\n if (uTrail) {\n gl_PointSize = aSize * (200.0 / -mvPosition.z) * (0.3 + 0.7 * aTrailProgress);\n } else {\n gl_PointSize = aSize * (200.0 / -mvPosition.z);\n }\n\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n// 片元着色器\nconst FRAGMENT_SHADER = `\n varying float vOpacity;\n varying vec3 vColor;\n varying float vTrailProgress;\n varying float vProgress;\n\n uniform bool uTrail;\n uniform bool uGlow;\n uniform int uTextureType;\n uniform float uTime;\n\n // 简易哈希噪声\n float hash(float n) { return fract(sin(n) * 43758.5453123); }\n\n void main() {\n vec2 center = gl_PointCoord - vec2(0.5);\n float dist = length(center);\n\n float shape;\n if (uTextureType == 0) {\n shape = exp(-dist * dist * 8.0);\n } else if (uTextureType == 1) {\n float tri = smoothstep(0.5, 0.0, abs(center.x) + center.y * 0.5 + 0.1);\n shape = tri * smoothstep(0.5, 0.0, dist);\n } else {\n float wave = sin(center.x * 6.2832) * 0.3;\n shape = smoothstep(0.1, 0.0, abs(center.y - wave) - 0.15) * smoothstep(0.5, 0.0, dist);\n }\n\n if (shape < 0.01) discard;\n\n float alpha = vOpacity * shape;\n\n if (uTrail) {\n alpha *= vTrailProgress;\n }\n\n if (uGlow) {\n alpha *= 1.0 + (1.0 - dist * 2.0) * 0.5;\n }\n\n // 沿流动方向拉伸的噪声,模拟水流动态模糊感\n float stretch = 3.0; // 拉伸倍数,越大条纹越长\n float noise1 = hash(floor((vProgress * 80.0 + uTime * 2.0) / stretch));\n float noise2 = hash(floor((vProgress * 80.0 + uTime * 2.0) / stretch + 17.31));\n float variation = 0.5 + 0.25 * noise1 + 0.25 * noise2; // [0.5, 1.0]\n\n vec3 col = vColor * variation;\n\n gl_FragColor = vec4(col, alpha);\n }\n`;\n\n/** 路径粒子运行时状态 */\nexport class PathParticleRuntime {\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n points: THREE.Points;\n\n // CPU 侧状态\n private positions: Float32Array;\n private progresses: Float32Array;\n private sizes: Float32Array;\n /** 每个粒子的固定 3D 偏移(管道截面内随机分布) */\n private offsets: Float32Array; // count * 3\n private opacities: Float32Array;\n private trailProgresses: Float32Array; // 拖尾进度\n private config: PathParticleEffect;\n\n // 路径曲线\n private curve: SegmentedPath;\n private time = 0;\n\n // BufferAttribute 引用\n private posAttr: THREE.BufferAttribute;\n private progressAttr: THREE.BufferAttribute;\n private sizeAttr: THREE.BufferAttribute;\n private opacityAttr: THREE.BufferAttribute;\n private trailAttr: THREE.BufferAttribute;\n\n constructor(config: PathParticleEffect) {\n this.config = { ...config };\n const count = config.particleCount;\n\n // 创建路径曲线\n const points = config.pathPoints.map((p: Vec3) => new THREE.Vector3(...p));\n const segmentTypes = config.segmentTypes || new Array(points.length - 1).fill('linear');\n this.curve = new SegmentedPath(points, segmentTypes);\n\n // CPU 数组\n this.positions = new Float32Array(count * 3);\n this.progresses = new Float32Array(count);\n this.sizes = new Float32Array(count);\n this.opacities = new Float32Array(count);\n this.trailProgresses = new Float32Array(count);\n this.offsets = new Float32Array(count * 3);\n\n const pipeR = config.pipeRadius ?? 0.3;\n\n // 初始化粒子:均匀分布在路径上,截面圆盘内随机偏移\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n this.progresses[i] = t;\n this.trailProgresses[i] = 1.0;\n\n // offsets 存储角度和半径(圆盘内均匀分布),实际 3D 偏移在 update 时根据切线计算\n const angle = Math.random() * Math.PI * 2;\n const radius = pipeR * Math.sqrt(Math.random());\n this.offsets[i * 3] = angle;\n this.offsets[i * 3 + 1] = radius;\n this.offsets[i * 3 + 2] = 0;\n\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(angle, radius, tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n this.sizes[i] = config.size;\n this.opacities[i] = 0.5 + Math.random() * 0.5;\n }\n\n // BufferGeometry\n this.geometry = new THREE.BufferGeometry();\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.progressAttr = new THREE.BufferAttribute(this.progresses, 1);\n this.progressAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aProgress', this.progressAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n this.opacityAttr = new THREE.BufferAttribute(this.opacities, 1);\n this.opacityAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aOpacity', this.opacityAttr);\n\n this.trailAttr = new THREE.BufferAttribute(this.trailProgresses, 1);\n this.trailAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aTrailProgress', this.trailAttr);\n\n // ShaderMaterial\n const color = new THREE.Color(config.color);\n\n this.material = new THREE.ShaderMaterial({\n vertexShader: VERTEX_SHADER,\n fragmentShader: FRAGMENT_SHADER,\n uniforms: {\n uColor: { value: color },\n uBaseOpacity: { value: config.opacity },\n uTrail: { value: config.trail || false },\n uGlow: { value: config.glow || false },\n uTextureType: { value: config.textureType === 'dot' ? 0 : config.textureType === 'arrow' ? 1 : 2 },\n uTime: { value: 0 },\n },\n transparent: true,\n depthTest: true,\n depthWrite: false,\n blending: config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n this.points = new THREE.Points(this.geometry, this.material);\n this.points.frustumCulled = false;\n }\n\n /** 获取当前路径点(用于比较是否变化) */\n getPathPoints(): Vec3[] {\n return this.config.pathPoints;\n }\n\n /** 更新配置参数 */\n updateConfig(config: PathParticleEffect): void {\n const oldCount = this.config.particleCount;\n const oldSize = this.config.size;\n const oldPathPoints = this.config.pathPoints; // 保存旧的路径点\n const oldSegmentTypes = this.config.segmentTypes; // 保存旧的段类型\n const oldPipeRadius = this.config.pipeRadius; // 保存旧的分布半径\n this.config = { ...config };\n\n const color = new THREE.Color(config.color);\n this.material.uniforms['uColor'].value = color;\n this.material.uniforms['uBaseOpacity'].value = config.opacity;\n this.material.uniforms['uTrail'].value = config.trail || false;\n this.material.uniforms['uGlow'].value = config.glow || false;\n this.material.uniforms['uTextureType'].value = config.textureType === 'dot' ? 0 : config.textureType === 'arrow' ? 1 : 2;\n this.material.blending = config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending;\n this.material.needsUpdate = true;\n\n // 如果粒子数量或大小变化,重建 buffer\n if (config.particleCount !== oldCount || config.size !== oldSize) {\n this.rebuildBuffers(config.particleCount);\n }\n\n // 如果路径点或段类型变化,重建曲线\n if (this.pathChanged(oldPathPoints, config.pathPoints) || this.segmentTypesChanged(oldSegmentTypes, config.segmentTypes)) {\n const points = config.pathPoints.map((p: Vec3) => new THREE.Vector3(...p));\n const segmentTypes = config.segmentTypes || new Array(points.length - 1).fill('linear');\n this.curve = new SegmentedPath(points, segmentTypes);\n\n // 重建所有粒子位置\n const count = this.config.particleCount;\n for (let i = 0; i < count; i++) {\n const t = i / count;\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n\n // 如果分布半径变化,重新生成半径偏移并更新位置(保留进度和角度)\n if (config.pipeRadius !== oldPipeRadius && config.particleCount === oldCount) {\n const pipeR = config.pipeRadius ?? 0.3;\n const count = config.particleCount;\n for (let i = 0; i < count; i++) {\n // 按比例缩放旧半径,保持分布形状\n const oldR = oldPipeRadius ?? 0.3;\n const scale = pipeR / oldR;\n this.offsets[i * 3 + 1] *= scale;\n // 重新计算位置\n const t = this.progresses[i];\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n }\n\n private segmentTypesChanged(oldTypes: ('linear' | 'smooth')[] | undefined, newTypes: ('linear' | 'smooth')[] | undefined): boolean {\n if (!oldTypes && !newTypes) return false;\n if (!oldTypes || !newTypes) return true;\n if (oldTypes.length !== newTypes.length) return true;\n for (let i = 0; i < oldTypes.length; i++) {\n if (oldTypes[i] !== newTypes[i]) return true;\n }\n return false;\n }\n\n private pathChanged(oldPoints: Vec3[], newPoints: Vec3[]): boolean {\n if (newPoints.length !== oldPoints.length) return true;\n for (let i = 0; i < newPoints.length; i++) {\n if (newPoints[i][0] !== oldPoints[i][0] ||\n newPoints[i][1] !== oldPoints[i][1] ||\n newPoints[i][2] !== oldPoints[i][2]) {\n return true;\n }\n }\n return false;\n }\n\n private rebuildBuffers(count: number): void {\n // 保存旧进度,重建后恢复(避免调参时水流突然重置)\n const oldProgresses = this.progresses ? Float32Array.from(this.progresses) : null;\n const oldOffsets = this.offsets ? Float32Array.from(this.offsets) : null;\n\n this.positions = new Float32Array(count * 3);\n this.progresses = new Float32Array(count);\n this.sizes = new Float32Array(count);\n this.opacities = new Float32Array(count);\n this.trailProgresses = new Float32Array(count);\n this.offsets = new Float32Array(count * 3);\n\n const pipeR = this.config.pipeRadius ?? 0.3;\n\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n // 保留旧进度(如果存在),新粒子从初始位置开始\n this.progresses[i] = oldProgresses && i < oldProgresses.length ? oldProgresses[i] : t;\n this.trailProgresses[i] = 1.0;\n\n // 保留旧偏移(角度+半径),新粒子随机生成\n if (oldOffsets && i < oldOffsets.length / 3) {\n this.offsets[i * 3] = oldOffsets[i * 3];\n this.offsets[i * 3 + 1] = oldOffsets[i * 3 + 1];\n this.offsets[i * 3 + 2] = 0;\n } else {\n const angle = Math.random() * Math.PI * 2;\n const radius = pipeR * Math.sqrt(Math.random());\n this.offsets[i * 3] = angle;\n this.offsets[i * 3 + 1] = radius;\n this.offsets[i * 3 + 2] = 0;\n }\n\n const pos = this.curve.getPointAt(this.progresses[i]);\n const tangent = this.curve.getTangentAt(this.progresses[i]);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n this.sizes[i] = this.config.size;\n this.opacities[i] = 0.5 + Math.random() * 0.5;\n }\n\n // 创建新的 BufferAttribute 并替换旧的(粒子数量变化时必须这样做)\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.progressAttr = new THREE.BufferAttribute(this.progresses, 1);\n this.progressAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aProgress', this.progressAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n this.opacityAttr = new THREE.BufferAttribute(this.opacities, 1);\n this.opacityAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aOpacity', this.opacityAttr);\n\n this.trailAttr = new THREE.BufferAttribute(this.trailProgresses, 1);\n this.trailAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aTrailProgress', this.trailAttr);\n }\n\n /** 每帧更新 */\n update(dt: number): void {\n this.time += dt;\n this.material.uniforms['uTime'].value = this.time;\n\n const cfg = this.config;\n const count = cfg.particleCount;\n const speed = cfg.speed;\n const trail = cfg.trail || false;\n\n // 拖尾进度:先求最大进度(只算一次,避免 O(n²))\n let maxProgress = 0;\n if (trail) {\n for (let j = 0; j < count; j++) {\n if (this.progresses[j] > maxProgress) maxProgress = this.progresses[j];\n }\n }\n\n for (let i = 0; i < count; i++) {\n // 更新进度\n this.progresses[i] += speed * dt;\n\n // 循环或重置\n if (this.progresses[i] > 1) {\n if (cfg.loop) {\n this.progresses[i] -= 1;\n } else {\n this.progresses[i] = 0;\n }\n }\n\n // 根据进度获取路径上的位置 + 垂直于切线的圆盘偏移\n const t = Math.max(0, Math.min(1, this.progresses[i]));\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n // 拖尾进度:距最前方粒子的归一化距离\n if (trail) {\n this.trailProgresses[i] = maxProgress > 0 ? this.progresses[i] / maxProgress : 1.0;\n } else {\n this.trailProgresses[i] = 1.0;\n }\n }\n\n // 标记 buffer 需要更新\n this.posAttr.needsUpdate = true;\n this.progressAttr.needsUpdate = true;\n this.trailAttr.needsUpdate = true;\n }\n\n /** 更新路径点(仅更新曲线和粒子位置,不更新 config.pathPoints) */\n setPathPoints(points: Vec3[], segmentTypes?: ('linear' | 'smooth')[]): void {\n // 不更新 this.config.pathPoints,避免 syncEffects 时误判为路径变化\n const vec3Points = points.map((p: Vec3) => new THREE.Vector3(...p));\n const types = segmentTypes || this.config.segmentTypes || new Array(vec3Points.length - 1).fill('linear');\n this.curve = new SegmentedPath(vec3Points, types);\n\n // 重新计算所有粒子位置\n const count = this.config.particleCount;\n for (let i = 0; i < count; i++) {\n const t = this.progresses[i];\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n\n /** 根据切线方向,在垂直平面内计算圆盘偏移的 3D 向量 */\n private static _tmpN = new THREE.Vector3();\n private static _tmpB = new THREE.Vector3();\n private static _tmpT = new THREE.Vector3();\n static offsetOnPlane(angle: number, radius: number, tangent: THREE.Vector3): THREE.Vector3 {\n const t = this._tmpT.copy(tangent).normalize();\n // 选一个不与切线平行的参考轴\n const ref = Math.abs(t.x) < 0.9 ? this._tmpN.set(1, 0, 0) : this._tmpN.set(0, 1, 0);\n // 法线 = ref × t,副法线 = t × 法线\n const n = this._tmpN.crossVectors(ref, t).normalize();\n const b = this._tmpB.crossVectors(t, n).normalize();\n // 圆盘偏移 = radius * (cos(angle)*n + sin(angle)*b)\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return new THREE.Vector3(\n radius * (cos * n.x + sin * b.x),\n radius * (cos * n.y + sin * b.y),\n radius * (cos * n.z + sin * b.z),\n );\n }\n\n dispose(): void {\n this.geometry.dispose();\n this.material.dispose();\n this.points.parent?.remove(this.points);\n }\n}\n","/**\n * 路径编辑器 — 可视化编辑路径粒子的路径点\n * 控制点球体 + 路径线,支持拖拽/添加/删除\n * 复用 viewer 的 TransformControls,不创建独立实例\n */\n\nimport * as THREE from 'three';\nimport type { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';\nimport type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport type { Vec3, PathParticleEffect } from './types';\nimport type { SceneStore } from './store';\nimport { SegmentedPath } from './segmented-path';\n\nexport interface PathEditorCallbacks {\n onPathPointMoved(nodeId: string, effectIndex: number, pointIndex: number, newPosition: Vec3): void;\n onPathPointDrag?(nodeId: string, effectIndex: number, newPoints: Vec3[]): void;\n onAddPathPoint(nodeId: string, effectIndex: number, insertAfter: number, position: Vec3): void;\n onDeletePathPoint(nodeId: string, effectIndex: number, pointIndex: number): void;\n onActiveEffectChanged?(effectKey: string | null): void;\n /** 控制点右键点击 */\n onPathPointRightClick?(nodeId: string, effectIndex: number, pointIndex: number, position: Vec3, event: MouseEvent): void;\n /** 线段右键点击 */\n onSegmentRightClick?(nodeId: string, effectIndex: number, segmentIndex: number, position: Vec3, event: MouseEvent): void;\n /** 模型表面点击(左键) */\n onModelSurfaceClick?(nodeId: string, effectIndex: number, position: Vec3, event: PointerEvent): void;\n /** 移动控制点到数组开头/结尾 */\n onMovePathPointToEnd?(nodeId: string, effectIndex: number, pointIndex: number, toStart: boolean): void;\n /** 获取模型节点对象(用于添加子级) */\n getNodeObject?(nodeId: string): THREE.Object3D | null;\n}\n\ninterface PathVis {\n handles: THREE.Mesh[];\n curveLine: THREE.Line;\n segmentLines: THREE.Line[]; // 每段独立的线(用于颜色区分和点击检测)\n effectKey: string; // nodeId:effectId\n nodeId: string;\n effectIndex: number;\n pathPoints: Vec3[];\n segmentTypes: ('linear' | 'smooth')[];\n}\n\nconst HANDLE_RADIUS = 0.05;\nconst HANDLE_COLOR = 0x00ff88;\nconst LINEAR_COLOR = 0x4a9eff; // 直段蓝色\nconst SMOOTH_COLOR = 0x00ff88; // 弯段绿色\nconst SELECTED_COLOR = 0xffff00; // 选中黄色\nconst CURVE_SEGMENTS = 64;\n\n/** 共享几何体缓存(按半径) */\nconst handleGeometryCache = new Map<number, THREE.SphereGeometry>();\n\nfunction getHandleGeometry(radius: number = HANDLE_RADIUS): THREE.SphereGeometry {\n let geom = handleGeometryCache.get(radius);\n if (!geom) {\n geom = new THREE.SphereGeometry(radius, 16, 12);\n handleGeometryCache.set(radius, geom);\n }\n return geom;\n}\n\nexport class PathEditor {\n private visuals = new Map<string, PathVis>();\n private activeEffectKey: string | null = null;\n private dragging: { vis: PathVis; index: number; before: Vec3[] } | null = null;\n private handleSize: number = HANDLE_RADIUS;\n private pendingAttachIndex: number | null = null; // 待绑定的控制点索引(sync 后绑定)\n\n /** 复用 viewer 的 gizmo,不创建独立实例 */\n private gizmo: TransformControls | null = null;\n private raycaster = new THREE.Raycaster();\n private pointer = new THREE.Vector2();\n onActiveEffectChanged?: (effectKey: string | null) => void;\n\n /** 设置 viewer 的 gizmo(由 viewer 初始化时调用) */\n setGizmo(gizmo: TransformControls): void {\n this.gizmo = gizmo;\n }\n\n constructor(\n private scene: THREE.Scene,\n private camera: THREE.Camera,\n private renderer: THREE.WebGLRenderer,\n private store: SceneStore,\n private orbit: OrbitControls,\n private cb: PathEditorCallbacks,\n ) {\n // 不再创建独立的 TransformControls\n // gizmo 由 viewer 通过 setGizmo() 提供\n // 设置线段拾取阈值\n if (!this.raycaster.params.Line) {\n this.raycaster.params.Line = { threshold: 1 };\n } else {\n this.raycaster.params.Line.threshold = 1;\n }\n }\n\n /** 绑定 gizmo 事件(由 viewer 初始化时调用一次) */\n bindGizmoEvents(): void {\n if (!this.gizmo) return;\n\n this.gizmo.addEventListener('dragging-changed', (e) => {\n this.orbit.enabled = !e.value;\n if (e.value) {\n this.startDrag();\n } else {\n this.finishDrag();\n }\n });\n\n this.gizmo.addEventListener('objectChange', () => {\n if (this.dragging) {\n this.updateDrag();\n }\n });\n }\n\n // ── 公共 API ──\n\n /** 同步 store 数据到可视化 */\n sync(): void {\n // 拖动中不同步位置(避免重置)\n if (this.dragging) return;\n\n const activeKey = this.activeEffectKey;\n\n // 检查活动效果是否还存在,不存在则清理并退出编辑\n if (activeKey) {\n const [nodeId, effectId] = activeKey.split(':');\n const node = this.store.node(nodeId);\n const effectExists = node?.effects?.some(e => e.id === effectId && e.kind === 'path-particle');\n if (!effectExists) {\n // 活动效果已被删除,清理可视化并退出编辑\n const vis = this.visuals.get(activeKey);\n if (vis) {\n this.removeVisual(vis);\n this.visuals.delete(activeKey);\n }\n this.gizmo?.detach();\n this.activeEffectKey = null;\n this.onActiveEffectChanged?.(null);\n }\n }\n\n // 遍历所有节点的所有 path-particle 效果\n for (const node of this.store.doc.nodes) {\n if (!node.effects) continue;\n for (let i = 0; i < node.effects.length; i++) {\n const effect = node.effects[i];\n if (effect.kind !== 'path-particle') continue;\n\n const key = `${node.id}:${effect.id}`;\n const vis = this.visuals.get(key);\n\n if (key === activeKey) {\n // 活动效果:创建或更新\n if (!vis) {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n const newVis = this.createVisual(key, node.id, i, effect.pathPoints, segTypes);\n this.visuals.set(key, newVis);\n } else {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n // 检查路径点是否变化(撤销/重做时坐标变了,视觉需要更新)\n const pathPointsChanged = vis.pathPoints.length !== effect.pathPoints.length ||\n vis.pathPoints.some((p, idx) =>\n p[0] !== effect.pathPoints[idx][0] ||\n p[1] !== effect.pathPoints[idx][1] ||\n p[2] !== effect.pathPoints[idx][2]\n );\n if (pathPointsChanged) {\n this.updateVisual(vis, effect.pathPoints, segTypes, i);\n } else {\n // 只更新 segmentTypes\n vis.segmentTypes = [...segTypes];\n vis.effectIndex = i;\n }\n }\n } else if (vis) {\n // 非活动效果:移除可视化\n this.removeVisual(vis);\n this.visuals.delete(key);\n }\n }\n }\n\n // 清理已删除的效果\n for (const [key, vis] of this.visuals) {\n if (key !== activeKey) {\n this.removeVisual(vis);\n this.visuals.delete(key);\n }\n }\n\n // 同步后检查 gizmo 绑定\n const attached = this.gizmo?.object;\n if (activeKey) {\n const vis = this.visuals.get(activeKey);\n if (vis) {\n // 优先绑定到 pendingAttachIndex(新增控制点)\n if (this.pendingAttachIndex !== null) {\n this.gizmo?.detach();\n if (vis.handles[this.pendingAttachIndex]) {\n this.attachGizmo(vis, vis.handles[this.pendingAttachIndex], this.pendingAttachIndex);\n }\n this.pendingAttachIndex = null;\n } else if (attached) {\n // 检查当前绑定的控制点是否还存在\n const handles = this.getHandles();\n if (!handles.includes(attached as THREE.Mesh)) {\n // 控制点已被删除或重建,重新绑定到第一个控制点\n this.gizmo?.detach();\n if (vis.handles.length > 0) {\n this.attachGizmo(vis, vis.handles[0], 0);\n }\n }\n }\n }\n }\n }\n\n /** 设置活动编辑效果 */\n setActiveEffect(effectKey: string | null): void {\n if (this.activeEffectKey === effectKey) return;\n\n // 隐藏旧的活动效果\n if (this.activeEffectKey) {\n const oldVis = this.visuals.get(this.activeEffectKey);\n if (oldVis) {\n this.setVisVisible(oldVis, false);\n }\n }\n\n this.activeEffectKey = effectKey;\n\n // 立即创建并显示新的活动效果(不等待 sync)\n if (effectKey) {\n let newVis = this.visuals.get(effectKey);\n if (!newVis) {\n // 从 store 查找对应的 effect\n const [nodeId, effectId] = effectKey.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n const effect = node.effects[effectIndex];\n if (effect.kind === 'path-particle') {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n newVis = this.createVisual(effectKey, nodeId, effectIndex, effect.pathPoints, segTypes);\n this.visuals.set(effectKey, newVis);\n }\n }\n }\n }\n if (newVis) {\n this.setVisVisible(newVis, true);\n // 自动选中第一个控制点\n if (newVis.handles.length > 0) {\n this.attachGizmo(newVis, newVis.handles[0], 0);\n }\n }\n } else {\n // 退出编辑模式\n this.gizmo?.detach();\n }\n\n // 通知外部更新选中状态(取消场景选中)\n this.onActiveEffectChanged?.(effectKey);\n }\n\n /** 是否正在编辑 */\n isActive(): boolean {\n return this.activeEffectKey !== null;\n }\n\n /** 获取所有绿球 mesh(用于射线检测) */\n getHandles(): THREE.Mesh[] {\n const handles: THREE.Mesh[] = [];\n for (const vis of this.visuals.values()) {\n handles.push(...vis.handles);\n }\n return handles;\n }\n\n /** 获取活动效果 key */\n getActiveEffectKey(): string | null {\n return this.activeEffectKey;\n }\n\n /** 根据世界坐标位置找到插入位置 */\n getInsertPosition(worldPoint: THREE.Vector3): { insertAfter: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return null;\n return this.findInsertPosition(vis, worldPoint);\n }\n\n /** 设置控制点球体大小 */\n setHandleSize(size: number): void {\n this.handleSize = size;\n // 清除几何体缓存\n handleGeometryCache.clear();\n // 重新创建所有控制点\n for (const vis of this.visuals.values()) {\n this.recreateHandles(vis);\n }\n }\n\n /** 设置待绑定的控制点索引(sync 后绑定到该点) */\n setPendingAttachIndex(index: number): void {\n this.pendingAttachIndex = index;\n }\n\n private recreateHandles(vis: PathVis): void {\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 移除旧的球体\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.handles.length = 0;\n\n // 创建新的球体(pathPoints 已经是本地坐标)\n for (let i = 0; i < vis.pathPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...vis.pathPoints[i]);\n handle.userData = {\n id: `__path_handle_${vis.effectKey}_${i}`,\n isPathHandle: true,\n effectKey: vis.effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n vis.handles.push(handle);\n }\n }\n\n /** 尝试拾取控制点,返回是否拾取到 */\n pickHandle(event: PointerEvent): boolean {\n if (!this.activeEffectKey) return false;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return false;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 确保控制点的世界矩阵是最新的\n for (const handle of vis.handles) {\n handle.updateWorldMatrix(true, false);\n }\n\n const intersects = this.raycaster.intersectObjects(vis.handles, false);\n if (intersects.length > 0) {\n const handle = intersects[0].object as THREE.Mesh;\n const index = vis.handles.indexOf(handle);\n if (index >= 0) {\n this.attachGizmo(vis, handle, index);\n return true;\n }\n }\n return false;\n }\n\n /** 尝试拾取路径线,返回插入位置 */\n pickCurve(event: PointerEvent, groundY: number = 0): { insertAfter: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis || vis.pathPoints.length < 2) return null;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 优先检测独立的线段(更精确)\n if (vis.segmentLines.length > 0) {\n // 确保线段的世界矩阵是最新的\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n const segIntersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (segIntersects.length > 0) {\n const segLine = segIntersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = segIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return {\n insertAfter: segmentIndex, // 在 segmentIndex 和 segmentIndex+1 之间插入\n position: [point.x, point.y, point.z],\n };\n }\n }\n\n // 降级:检测整体曲线\n if (vis.curveLine) {\n vis.curveLine.updateWorldMatrix(true, false);\n }\n const intersects = this.raycaster.intersectObject(vis.curveLine, false);\n if (intersects.length > 0) {\n const point = intersects[0].point;\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return this.findInsertPosition(vis, point);\n }\n return null;\n }\n\n /** 拾取线段,返回段索引 */\n pickSegment(event: PointerEvent): { segmentIndex: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis || vis.segmentLines.length === 0) return null;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 确保线段的世界矩阵是最新的\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n\n const intersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (intersects.length > 0) {\n const segLine = intersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = intersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return {\n segmentIndex,\n position: [point.x, point.y, point.z],\n };\n }\n return null;\n }\n\n /** 处理右键点击 */\n handleRightClick(event: MouseEvent): boolean {\n if (!this.activeEffectKey) return false;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return false;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 先检测控制点\n for (const handle of vis.handles) {\n handle.updateWorldMatrix(true, false);\n }\n const handleIntersects = this.raycaster.intersectObjects(vis.handles, false);\n if (handleIntersects.length > 0) {\n const handle = handleIntersects[0].object as THREE.Mesh;\n const index = vis.handles.indexOf(handle);\n if (index >= 0) {\n const point = handleIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n this.cb.onPathPointRightClick?.(vis.nodeId, vis.effectIndex, index, [point.x, point.y, point.z], event);\n return true;\n }\n }\n\n // 再检测线段\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n const segIntersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (segIntersects.length > 0) {\n const segLine = segIntersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = segIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n this.cb.onSegmentRightClick?.(vis.nodeId, vis.effectIndex, segmentIndex, [point.x, point.y, point.z], event);\n return true;\n }\n\n return false;\n }\n\n /** 根据点击位置找到插入位置(开头/结尾) */\n findInsertPosition(vis: PathVis, point: THREE.Vector3): { insertAfter: number; position: Vec3 } {\n const points = vis.pathPoints;\n if (points.length < 2) return { insertAfter: 0, position: [point.x, point.y, point.z] };\n\n const firstPoint = new THREE.Vector3(...points[0]);\n const lastPoint = new THREE.Vector3(...points[points.length - 1]);\n const distToStart = point.distanceTo(firstPoint);\n const distToEnd = point.distanceTo(lastPoint);\n\n // 离哪个端点近就插到哪个旁边\n const isNearEnd = distToEnd <= distToStart;\n return {\n insertAfter: isNearEnd ? points.length - 1 : -1,\n position: [point.x, point.y, point.z],\n };\n }\n\n /** 释放资源 */\n dispose(): void {\n for (const vis of this.visuals.values()) {\n this.removeVisual(vis);\n }\n this.visuals.clear();\n if (this.gizmo) {\n this.gizmo.detach();\n // 不 dispose gizmo,因为是 viewer 的实例\n }\n }\n\n // ── 私有方法 ──\n\n private updatePointer(event: MouseEvent | PointerEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n this.pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n this.pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n }\n\n private createVisual(effectKey: string, nodeId: string, effectIndex: number, pathPoints: Vec3[], segmentTypes: ('linear' | 'smooth')[]): PathVis {\n const handles: THREE.Mesh[] = [];\n const nodeObj = this.cb.getNodeObject?.(nodeId) ?? null;\n\n // 创建控制点球体(pathPoints 已经是本地坐标)\n for (let i = 0; i < pathPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...pathPoints[i]);\n handle.userData = {\n id: `__path_handle_${effectKey}_${i}`,\n isPathHandle: true,\n effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n handles.push(handle);\n }\n\n // 创建路径线(整体,用于显示)\n const curvePoints = this.buildCurvePoints(pathPoints, segmentTypes);\n const lineGeometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n const lineMaterial = new THREE.LineBasicMaterial({\n color: LINEAR_COLOR,\n transparent: true,\n opacity: 0.6,\n depthTest: false,\n });\n const curveLine = new THREE.Line(lineGeometry, lineMaterial);\n curveLine.renderOrder = 998;\n if (nodeObj) {\n nodeObj.add(curveLine);\n } else {\n this.scene.add(curveLine);\n }\n\n // 创建每段独立的线(用于颜色区分和点击检测)\n const segmentLines: THREE.Line[] = [];\n for (let i = 0; i < pathPoints.length - 1; i++) {\n const segPoints = this.buildSegmentCurvePoints(pathPoints, segmentTypes, i);\n const segGeom = new THREE.BufferGeometry().setFromPoints(segPoints);\n const color = segmentTypes[i] === 'smooth' ? SMOOTH_COLOR : LINEAR_COLOR;\n const segMat = new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n });\n const segLine = new THREE.Line(segGeom, segMat);\n segLine.renderOrder = 999;\n segLine.userData = {\n isPathSegment: true,\n effectKey,\n segmentIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(segLine);\n } else {\n this.scene.add(segLine);\n }\n segmentLines.push(segLine);\n }\n\n const vis: PathVis = {\n handles,\n curveLine,\n segmentLines,\n effectKey,\n nodeId,\n effectIndex,\n pathPoints: [...pathPoints],\n segmentTypes: [...segmentTypes],\n };\n\n // 如果不是活动效果,隐藏\n if (effectKey !== this.activeEffectKey) {\n this.setVisVisible(vis, false);\n }\n\n return vis;\n }\n\n private updateVisual(vis: PathVis, newPoints: Vec3[], newSegmentTypes: ('linear' | 'smooth')[], effectIndex: number): void {\n vis.effectIndex = effectIndex;\n\n // 更新 segmentTypes\n vis.segmentTypes = [...newSegmentTypes];\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 检查点数是否变化\n if (vis.pathPoints.length !== newPoints.length) {\n // 重建控制点\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.handles.length = 0;\n\n for (let i = 0; i < newPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...newPoints[i]);\n handle.userData = {\n id: `__path_handle_${vis.effectKey}_${i}`,\n isPathHandle: true,\n effectKey: vis.effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n vis.handles.push(handle);\n }\n } else {\n // 更新位置\n for (let i = 0; i < newPoints.length; i++) {\n vis.handles[i].position.set(...newPoints[i]);\n }\n }\n\n // 更新路径线\n const curvePoints = this.buildCurvePoints(newPoints, newSegmentTypes);\n vis.curveLine.geometry.dispose();\n vis.curveLine.geometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n\n // 重建每段独立的线\n for (const segLine of vis.segmentLines) {\n segLine.parent?.remove(segLine);\n segLine.geometry.dispose();\n (segLine.material as THREE.Material).dispose();\n }\n vis.segmentLines.length = 0;\n\n for (let i = 0; i < newPoints.length - 1; i++) {\n const segPoints = this.buildSegmentCurvePoints(newPoints, newSegmentTypes, i);\n const segGeom = new THREE.BufferGeometry().setFromPoints(segPoints);\n const color = newSegmentTypes[i] === 'smooth' ? SMOOTH_COLOR : LINEAR_COLOR;\n const segMat = new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n });\n const segLine = new THREE.Line(segGeom, segMat);\n segLine.renderOrder = 999;\n segLine.userData = {\n isPathSegment: true,\n effectKey: vis.effectKey,\n segmentIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(segLine);\n } else {\n this.scene.add(segLine);\n }\n vis.segmentLines.push(segLine);\n }\n\n vis.pathPoints = [...newPoints];\n }\n\n private removeVisual(vis: PathVis): void {\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.curveLine.parent?.remove(vis.curveLine);\n vis.curveLine.geometry.dispose();\n (vis.curveLine.material as THREE.Material).dispose();\n for (const segLine of vis.segmentLines) {\n segLine.parent?.remove(segLine);\n segLine.geometry.dispose();\n (segLine.material as THREE.Material).dispose();\n }\n vis.segmentLines.length = 0;\n }\n\n private setVisVisible(vis: PathVis, visible: boolean): void {\n for (const handle of vis.handles) {\n handle.visible = visible;\n }\n vis.curveLine.visible = visible;\n for (const segLine of vis.segmentLines) {\n segLine.visible = visible;\n }\n }\n\n private buildCurvePoints(pathPoints: Vec3[], segmentTypes: ('linear' | 'smooth')[]): THREE.Vector3[] {\n if (pathPoints.length < 2) return [];\n const vec3Points = pathPoints.map((p) => new THREE.Vector3(...p));\n const types = segmentTypes.length === pathPoints.length - 1\n ? segmentTypes\n : new Array(pathPoints.length - 1).fill('linear');\n const path = new SegmentedPath(vec3Points, types);\n return path.getSpacedPoints(CURVE_SEGMENTS);\n }\n\n /** 为单个段构建曲线点,包含上下文点以便 smooth 段能正确弯曲 */\n private buildSegmentCurvePoints(\n allPoints: Vec3[],\n segmentTypes: ('linear' | 'smooth')[],\n segmentIndex: number,\n samplesPerSegment: number = 16,\n ): THREE.Vector3[] {\n const i = segmentIndex;\n const p1 = new THREE.Vector3(...allPoints[i]);\n const p2 = new THREE.Vector3(...allPoints[i + 1]);\n\n if (segmentTypes[i] !== 'smooth') {\n // 直线段:只需两个端点\n return [p1, p2];\n }\n\n // 弯段:使用前后各一个上下文点构造 CatmullRom\n // CatmullRomCurve3([p0, p1, p2, p3]) 的参数范围是 p0→p3 (t=0→1)\n // 其中 p1 在 t=1/3, p2 在 t=2/3,需要只采样 p1→p2 这段\n const p0 = new THREE.Vector3(...allPoints[Math.max(0, i - 1)]);\n const p3 = new THREE.Vector3(...allPoints[Math.min(allPoints.length - 1, i + 2)]);\n\n const curve = new THREE.CatmullRomCurve3([p0, p1, p2, p3], false, 'catmullrom', 0.5);\n const T0 = 1 / 3; // p1 对应的参数\n const T1 = 2 / 3; // p2 对应的参数\n\n const pts: THREE.Vector3[] = [];\n for (let s = 0; s <= samplesPerSegment; s++) {\n const t = T0 + (s / samplesPerSegment) * (T1 - T0);\n pts.push(curve.getPoint(t));\n }\n return pts;\n }\n\n private attachGizmo(vis: PathVis, handle: THREE.Mesh, index: number): void {\n if (!this.gizmo) return;\n this.gizmo.attach(handle);\n }\n\n private startDrag(): void {\n if (!this.activeEffectKey || !this.gizmo) return;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return;\n\n // 找到正在拖拽的控制点索引\n const attached = this.gizmo.object;\n if (!attached) return;\n\n const index = vis.handles.indexOf(attached as THREE.Mesh);\n if (index < 0) return;\n\n this.dragging = {\n vis,\n index,\n before: [...vis.pathPoints.map((p) => [...p] as Vec3)],\n };\n }\n\n private updateDrag(): void {\n if (!this.dragging) return;\n const { vis, index } = this.dragging;\n const handle = vis.handles[index];\n if (!handle) return;\n\n // handle.position 是本地坐标,直接使用\n const newPos: Vec3 = [handle.position.x, handle.position.y, handle.position.z];\n vis.pathPoints[index] = newPos;\n\n // 更新整体路径线(pathPoints 已经是本地坐标)\n const curvePoints = this.buildCurvePoints(vis.pathPoints, vis.segmentTypes);\n vis.curveLine.geometry.dispose();\n vis.curveLine.geometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n\n // 更新每段独立的线\n for (let i = 0; i < vis.segmentLines.length; i++) {\n const segLine = vis.segmentLines[i];\n if (segLine) {\n const segPoints = this.buildSegmentCurvePoints(vis.pathPoints, vis.segmentTypes, i);\n segLine.geometry.dispose();\n segLine.geometry = new THREE.BufferGeometry().setFromPoints(segPoints);\n }\n }\n\n // 通知回调(实时更新粒子路径,不创建历史记录)\n this.cb.onPathPointDrag?.(vis.nodeId, vis.effectIndex, [...vis.pathPoints]);\n }\n\n private finishDrag(): void {\n if (!this.dragging) return;\n const { vis, index, before } = this.dragging;\n const handle = vis.handles[index];\n if (!handle) {\n this.dragging = null;\n return;\n }\n\n // 获取最终位置(本地坐标)\n const finalPos: Vec3 = [handle.position.x, handle.position.y, handle.position.z];\n\n // 检查是否真的移动了\n const oldPos = before[index];\n const moved = finalPos[0] !== oldPos[0] || finalPos[1] !== oldPos[1] || finalPos[2] !== oldPos[2];\n\n if (moved) {\n // 创建历史记录(一次撤销可以恢复原位)\n this.cb.onPathPointMoved(vis.nodeId, vis.effectIndex, index, finalPos);\n }\n\n this.dragging = null;\n }\n}\n","import * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { TextureLoader } from 'three';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { SSAOPass } from 'three/examples/jsm/postprocessing/SSAOPass.js';\nimport { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';\nimport { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js';\nimport type { NodeDoc, TransformState, Vec3, FlyPath, CameraKeyframe, DashboardConfig, DashboardWidget, VisualEffect, ParticleEffect, UvAnimationEffect, PathParticleEffect, ScreenContentEffect, AlarmPopupData } from './types';\nimport type { SceneStore } from './store';\nimport { ParticleRuntime } from './particle-system';\nimport { PathParticleRuntime } from './path-particle-system';\nimport { PathEditor, type PathEditorCallbacks } from './path-editor';\n\nexport type TransformMode = 'translate' | 'rotate' | 'scale';\n\nexport interface PickEvent {\n id: string | null;\n /** 是否按住 Ctrl/Cmd 追加(true = 切换;false = 排他选中) */\n additive: boolean;\n}\n\nexport interface ViewerCallbacks {\n onSelect(ev: PickEvent): void;\n onTransformEnd(id: string, before: TransformState, after: TransformState): void;\n /** 资产加载完成后生成缩略图 */\n onThumbnailGenerated?(assetId: string, dataUrl: string): void;\n /** 路径点移动 */\n onPathPointMoved?(nodeId: string, effectIndex: number, pointIndex: number, newPosition: Vec3): void;\n /** 添加路径点 */\n onAddPathPoint?(nodeId: string, effectIndex: number, insertAfter: number, position: Vec3): void;\n /** 删除路径点 */\n onDeletePathPoint?(nodeId: string, effectIndex: number, pointIndex: number): void;\n /** 路径编辑模式变化 */\n onPathEditingChanged?(isEditing: boolean): void;\n /** 控制点右键点击 */\n onPathPointRightClick?(nodeId: string, effectIndex: number, pointIndex: number, position: Vec3, event: MouseEvent): void;\n /** 线段右键点击 */\n onSegmentRightClick?(nodeId: string, effectIndex: number, segmentIndex: number, position: Vec3, event: MouseEvent): void;\n /** 模型表面点击(左键) */\n onModelSurfaceClick?(nodeId: string, effectIndex: number, position: Vec3, event: PointerEvent): void;\n /** 移动控制点到数组开头/结尾 */\n onMovePathPointToEnd?(nodeId: string, effectIndex: number, pointIndex: number, toStart: boolean): void;\n}\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\nconst PRIMITIVE_COLORS: Record<string, number> = {\n box: 0x4f83cc,\n sphere: 0xcc8a4f,\n cylinder: 0x57a773,\n};\n\n/** three.js 视口:只认 SceneStore 这份单一数据源,sync() 是唯一写 three 对象的入口 */\nexport class SceneViewer {\n private renderer: THREE.WebGLRenderer;\n /** 后处理合成器 */\n private composer!: EffectComposer;\n private scene = new THREE.Scene();\n private camera: THREE.PerspectiveCamera;\n private orbit: OrbitControls;\n private gizmo: TransformControls;\n private hemiLight: THREE.HemisphereLight | null = null;\n private dirLight: THREE.DirectionalLight | null = null;\n private objects = new Map<string, THREE.Object3D>();\n private helpers = new Map<string, THREE.BoxHelper>();\n private lightTargets = new Map<string, THREE.Object3D>();\n private lightHelpers = new Map<string, THREE.Object3D>();\n private lightPickers = new Map<string, THREE.Mesh>();\n private assetCache = new Map<string, THREE.Group>();\n /** 正在等待加载的节点(URL → 等待中的 nodeId 集合),处理 undo→redo 竞态 */\n private pendingAssetNodes = new Map<string, Set<string>>();\n /** 动画基础变换(nodeId → 数据模型原始变换) */\n private animBases = new Map<string, TransformState>();\n /** 缩略图渲染器(离屏) */\n private thumbRenderer?: THREE.WebGLRenderer;\n private thumbScene = new THREE.Scene();\n private thumbCamera = new THREE.PerspectiveCamera(50, 4 / 3, 0.1, 1000);\n /** 动画时间 */\n private animTime = 0;\n /** 上一帧时间戳 */\n private lastFrameTime = 0;\n /** 拖拽中冻结动画 */\n private animationFrozen = false;\n /** 相机是否已从文档恢复(只在首次 sync 时恢复一次) */\n private cameraRestored = false;\n /** 保存原始材质参数(覆盖前),用于撤销覆盖时恢复 */\n private originalMaterials = new Map<string, Record<string, { color: string; opacity: number; transparent: boolean; roughness: number; metalness: number; emissive: string; visible: boolean; map: THREE.Texture | null; normalMap: THREE.Texture | null; roughnessMap: THREE.Texture | null; metalnessMap: THREE.Texture | null; emissiveMap: THREE.Texture | null }>>();\n /** undo/redo 期间为 true,sync() 中据此传 isUndoRedoing 给 applyMaterialOverrides */\n private _isUndoRedoing = false;\n /** 贴图缓存(dataURL → THREE.Texture) */\n private textureCache = new Map<string, THREE.Texture>();\n /** 标签对象缓存(nodeId → label mesh) */\n private labelObjects = new Map<string, THREE.Mesh>();\n private textureLoader = new TextureLoader();\n /** HDRI 环境贴图缓存 */\n private hdriTexture: THREE.Texture | null = null;\n /** 当前 HDRI data URL(用于判断是否需要重新加载) */\n private hdriCurrentUrl: string | null = null;\n /** 网格辅助线 */\n private gridHelper: THREE.GridHelper;\n /** 场景空间网格 */\n private roomMesh: THREE.Mesh | null = null;\n /** 缓存上次的房间配置,避免每次 state 变化都重建 */\n private lastRoomKey = '';\n private gltfLoader = this.createGltfLoader();\n /** 正在加载中的资产 URL(防止重复加载) */\n private loadingAssetUrls = new Set<string>();\n private dragBefore: TransformState | null = null;\n private downPos: [number, number] | null = null;\n private ro: ResizeObserver;\n private raycaster = new THREE.Raycaster();\n private unsubDoc: () => void;\n private unsubSel: () => void;\n\n /** 看板 overlay 元素 */\n private dashboardOverlayEl?: HTMLDivElement;\n /** 看板 widget DOM 元素缓存 (widgetId → HTMLDivElement) */\n private dashboardElements = new Map<string, HTMLDivElement>();\n /** 看板数据源定时器 */\n private dashboardIntervals = new Map<string, number>();\n /** 看板当前数据值 (widgetId → value) */\n private dashboardValues = new Map<string, number | string>();\n\n // ── 飞行路线 ──\n /** 当前播放的飞行路线 */\n private flyPathPlaying: FlyPath | null = null;\n /** 播放开始的真实时间戳 */\n private flyPathStartTime = 0;\n\n // ── 告警弹窗 ──\n /** 告警弹窗 (nodeId → mesh) */\n private alarmPopups = new Map<string, THREE.Mesh>();\n /** 告警弹窗创建时间 (nodeId → timestamp) */\n private alarmCreationTime = new Map<string, number>();\n /** 暂停时已经过的时间(秒) */\n private flyPathPausedElapsed = 0;\n /** 是否暂停 */\n private flyPathPaused = false;\n /** 是否刚从暂停恢复(需要在下一帧重算 startTime) */\n private flyPathResuming = false;\n /** 飞行路线回调 */\n private flyPathCallbacks: { onComplete?: () => void } = {};\n\n // ── 框选 ──\n private boxSelecting = false;\n private boxStart: [number, number] | null = null;\n private boxEl: HTMLDivElement | null = null;\n\n // ── 键盘漫游(WASD) ──\n private keysPressed = new Set<string>();\n private moveSpeed = 5; // 单位/秒\n /** 复用的临时向量,避免每帧 GC */\n private _tmpVec = new THREE.Vector3();\n private _tmpVec2 = new THREE.Vector3();\n private _tmpVec3 = new THREE.Vector3();\n private _upVector = new THREE.Vector3(0, 1, 0);\n private onKeyDown!: (e: KeyboardEvent) => void;\n private onKeyUp!: (e: KeyboardEvent) => void;\n\n // ── 视觉效果 ──\n /** nodeId → effectId → THREE.Object3D(粒子系统等) */\n private effectObjects = new Map<string, Map<string, THREE.Object3D>>();\n /** `${nodeId}:${effectId}` → ParticleRuntime */\n private particleSystems = new Map<string, ParticleRuntime>();\n /** `${nodeId}:${effectId}` → PathParticleRuntime */\n private pathParticleSystems = new Map<string, PathParticleRuntime>();\n /** UV 动画状态:`${nodeId}:${effectId}` → { offsetU, offsetV } */\n private uvAnimStates = new Map<string, { offsetU: number; offsetV: number }>();\n /** 屏幕内容切换状态:`${nodeId}:${effectId}` → { intervalId, currentIndex, targetMeshName } */\n private screenContentStates = new Map<string, { intervalId: number; currentIndex: number; targetMeshName?: string }>();\n /** 管道水流效果导致的材质半透明:nodeId → [{ mesh, material, originalOpacity, originalDepthWrite }] */\n private pipeTransparencyBackup = new Map<string, { mesh: THREE.Mesh; material: THREE.Material; originalOpacity: number; originalDepthWrite: boolean }[]>();\n\n // ── 路径编辑器 ──\n private pathEditor: PathEditor;\n\n /** 是否为编辑器模式(编辑器模式下动画默认播放,不依赖数据) */\n private isEditorMode: boolean;\n\n constructor(\n private host: HTMLElement,\n private store: SceneStore,\n private cb: ViewerCallbacks,\n dashboardOverlayEl?: HTMLDivElement,\n isEditorMode = false,\n ) {\n this.isEditorMode = isEditorMode;\n this.dashboardOverlayEl = dashboardOverlayEl;\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this.renderer.toneMapping = THREE.ACESFilmicToneMapping;\n this.renderer.toneMappingExposure = 1.0;\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n host.appendChild(this.renderer.domElement);\n\n this.scene.background = new THREE.Color(0x808080);\n this.camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this.camera.position.set(6, 6, 8);\n\n this.gridHelper = new THREE.GridHelper(40, 40, 0x4a5568, 0x2a3140);\n this.scene.add(this.gridHelper);\n\n this.orbit = new OrbitControls(this.camera, this.renderer.domElement);\n this.orbit.enableDamping = true;\n\n this.gizmo = new TransformControls(this.camera, this.renderer.domElement);\n this.gizmo.setSize(0.9);\n this.gizmo.addEventListener('dragging-changed', (e: any) => {\n this.orbit.enabled = !e.value;\n });\n this.gizmo.addEventListener('mouseDown', () => {\n const id = this.store.selection[0];\n this.dragBefore = id ? this.snapshot(id) : null;\n // 冻结动画,让用户拖拽基于数据模型位置\n if (id && this.animBases.has(id)) {\n this.animationFrozen = true;\n const base = this.animBases.get(id)!;\n const obj = this.objects.get(id);\n if (obj) {\n obj.position.set(...base.position);\n obj.rotation.set(base.rotation[0] * DEG2RAD, base.rotation[1] * DEG2RAD, base.rotation[2] * DEG2RAD);\n obj.scale.set(...base.scale);\n }\n }\n });\n this.gizmo.addEventListener('mouseUp', () => {\n const id = this.store.selection[0];\n if (id && this.dragBefore) {\n this.cb.onTransformEnd(id, this.dragBefore, this.snapshot(id));\n }\n this.dragBefore = null;\n this.animationFrozen = false;\n });\n this.scene.add(this.gizmo.getHelper());\n\n const el = this.renderer.domElement;\n el.addEventListener('pointerdown', e => {\n // 路径编辑器优先处理控制点拖拽\n if (this.pathEditor.isActive() && this.pathEditor.pickHandle(e)) {\n return;\n }\n if (e.shiftKey) {\n // Shift + 左键:开始框选\n this.boxSelecting = true;\n this.boxStart = [e.clientX, e.clientY];\n this.orbit.enabled = false; // 锁定场景控制\n this.createBoxEl(e);\n } else {\n this.downPos = [e.clientX, e.clientY];\n }\n });\n el.addEventListener('pointermove', e => {\n if (this.boxSelecting && this.boxEl) {\n this.updateBoxEl(e);\n }\n });\n el.addEventListener('pointerup', e => {\n // 只处理左键(button===0),右键由 contextmenu 处理\n if (e.button !== 0) return;\n\n // 路径编辑器:点击路径线添加点\n if (this.pathEditor.isActive() && this.downPos && Math.hypot(e.clientX - this.downPos[0], e.clientY - this.downPos[1]) < 4) {\n const result = this.pathEditor.pickCurve(e);\n if (result) {\n const key = this.pathEditor.getActiveEffectKey();\n if (key) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 设置待绑定索引(sync 后绑定到新点)\n this.pathEditor.setPendingAttachIndex(result.insertAfter + 1);\n this.cb.onAddPathPoint?.(nodeId, effectIndex, result.insertAfter, result.position);\n this.downPos = null;\n return;\n }\n }\n }\n }\n\n // 路径编辑器:点击模型表面弹出菜单\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) allMeshes.push(obj);\n else obj.traverse(c => { if (c instanceof THREE.Mesh) allMeshes.push(c); });\n }\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n if (hits.length > 0) {\n const key = this.pathEditor.getActiveEffectKey();\n if (key) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 世界坐标转本地坐标\n const point = hits[0].point;\n const obj = this.objects.get(nodeId);\n if (obj) {\n obj.updateWorldMatrix(true, false); // 确保世界矩阵是最新的\n obj.worldToLocal(point);\n }\n // 弹出菜单让用户选择添加到起点还是终点\n this.cb.onModelSurfaceClick?.(nodeId, effectIndex, [point.x, point.y, point.z], e);\n this.downPos = null;\n return;\n }\n }\n }\n }\n }\n if (this.boxSelecting) {\n this.finishBoxSelect(e);\n this.orbit.enabled = true; // 解锁场景控制\n } else if (this.downPos && Math.hypot(e.clientX - this.downPos[0], e.clientY - this.downPos[1]) < 4) {\n this.pick(e);\n }\n this.downPos = null;\n });\n // 双击拉近视角\n el.addEventListener('dblclick', e => {\n this.onDblClick(e);\n });\n // 右键菜单\n el.addEventListener('contextmenu', e => {\n if (this.pathEditor.isActive() && this.pathEditor.handleRightClick(e)) {\n e.preventDefault();\n }\n });\n\n this.ro = new ResizeObserver(() => this.resize());\n this.ro.observe(host);\n this.resize();\n\n // 键盘监听(WASD 漫游 + ESC 退出路径编辑 + Delete 删除控制点)\n this.onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.pathEditor.isActive()) {\n // ESC 退出路径编辑模式\n this.pathEditor.setActiveEffect(null);\n this.cb.onPathEditingChanged?.(false);\n return;\n }\n\n // Delete 删除选中的控制点\n if (e.key === 'Delete' && this.pathEditor.isActive()) {\n const activeKey = this.pathEditor.getActiveEffectKey();\n if (activeKey) {\n const [nodeId, effectId] = activeKey.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 找到当前 gizmo 绑定的控制点索引\n const attached = this.gizmo?.object;\n if (attached) {\n // 通过 userData 找到索引\n const handles = this.pathEditor.getHandles();\n const index = handles.indexOf(attached as THREE.Mesh);\n const effect = node.effects[effectIndex];\n if (index >= 0 && effect.kind === 'path-particle' && effect.pathPoints.length > 2) {\n // 先断开 gizmo 绑定,再删除控制点\n this.gizmo?.detach();\n this.cb.onDeletePathPoint?.(nodeId, effectIndex, index);\n }\n }\n }\n }\n }\n return;\n }\n\n this.keysPressed.add(e.key.toLowerCase());\n };\n this.onKeyUp = (e: KeyboardEvent) => this.keysPressed.delete(e.key.toLowerCase());\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n\n this.unsubDoc = store.onDocChange(() => this.sync());\n this.unsubSel = store.onSelectionChange(() => this.refreshSelection());\n\n // 初始化后处理\n this.initPostProcessing();\n\n this.renderer.setAnimationLoop(() => {\n for (const h of this.helpers.values()) {\n h.update();\n // 组的包围盒已预计算,跳过逐帧放大\n if (h.userData['isGroupHelper']) continue;\n // 给包围盒加 3% 空隙,让框与模型之间有视觉间距\n const pos = h.geometry.attributes['position'].array as Float32Array;\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let i = 0; i < pos.length; i += 3) {\n if (pos[i] < minX) minX = pos[i];\n if (pos[i + 1] < minY) minY = pos[i + 1];\n if (pos[i + 2] < minZ) minZ = pos[i + 2];\n if (pos[i] > maxX) maxX = pos[i];\n if (pos[i + 1] > maxY) maxY = pos[i + 1];\n if (pos[i + 2] > maxZ) maxZ = pos[i + 2];\n }\n const cx = (minX + maxX) / 2, cy = (minY + maxY) / 2, cz = (minZ + maxZ) / 2;\n const pad = 0.03;\n for (let i = 0; i < pos.length; i += 3) {\n pos[i] = cx + (pos[i] - cx) + (pos[i] - cx >= 0 ? pad : -pad);\n pos[i + 1] = cy + (pos[i + 1] - cy) + (pos[i + 1] - cy >= 0 ? pad : -pad);\n pos[i + 2] = cz + (pos[i + 2] - cz) + (pos[i + 2] - cz >= 0 ? pad : -pad);\n }\n h.geometry.attributes['position'].needsUpdate = true;\n }\n // 更新灯光助手\n for (const h of this.lightHelpers.values()) {\n if (h instanceof THREE.DirectionalLightHelper || h instanceof THREE.SpotLightHelper) {\n h.update();\n }\n }\n // 同步灯光拾取球位置(世界空间)\n for (const [id, picker] of this.lightPickers) {\n const light = this.objects.get(id);\n if (light) {\n light.getWorldPosition(picker.position);\n }\n }\n // 计算 delta time(提到顶部,供所有 update 方法共享)\n const now = performance.now();\n const dt = this.lastFrameTime ? (now - this.lastFrameTime) / 1000 : 0;\n this.lastFrameTime = now;\n\n // 更新动画\n this.updateAnimations(dt);\n // 更新视觉效果(UV 动画、粒子系统)\n this.updateEffects(dt);\n // 更新飞行路线\n this.updateFlyPath();\n // 更新告警弹窗(自动消失)\n this.updateAlarmSprites();\n // 先更新 orbit 确保相机矩阵最新\n this.orbit.update();\n // 键盘漫游(WASD + Q/E)\n this.processKeyboardMovement();\n // 场景空间开启时,限制相机在房间内部\n this.constrainCameraToRoom();\n // 更新看板 world 模式\n this.updateDashboard();\n this.composer.render();\n });\n\n // 初始化路径编辑器\n const pathEditorCallbacks: PathEditorCallbacks = {\n onPathPointMoved: (nodeId, effectIndex, pointIndex, newPosition) => {\n this.cb.onPathPointMoved?.(nodeId, effectIndex, pointIndex, newPosition);\n },\n onPathPointDrag: (nodeId, effectIndex, newPoints) => {\n // 实时更新粒子路径(不创建历史记录)\n const node = this.store.node(nodeId);\n if (!node?.effects?.[effectIndex]) return;\n const effect = node.effects[effectIndex];\n if (effect.kind !== 'path-particle') return;\n\n const effectKey = `${nodeId}:${effect.id}`;\n const rt = this.pathParticleSystems.get(effectKey);\n if (rt) {\n // newPoints 已经是本地坐标,直接使用\n rt.setPathPoints(newPoints, effect.segmentTypes);\n }\n },\n onAddPathPoint: (nodeId, effectIndex, insertAfter, position) => {\n this.cb.onAddPathPoint?.(nodeId, effectIndex, insertAfter, position);\n },\n onDeletePathPoint: (nodeId, effectIndex, pointIndex) => {\n this.cb.onDeletePathPoint?.(nodeId, effectIndex, pointIndex);\n },\n onActiveEffectChanged: (effectKey) => {\n // 路径编辑激活时,取消场景选中\n if (effectKey && this.store.selection.length > 0) {\n this.store.setSelection([]);\n }\n },\n onPathPointRightClick: (nodeId, effectIndex, pointIndex, position, event) => {\n this.cb.onPathPointRightClick?.(nodeId, effectIndex, pointIndex, position, event);\n },\n onSegmentRightClick: (nodeId, effectIndex, segmentIndex, position, event) => {\n this.cb.onSegmentRightClick?.(nodeId, effectIndex, segmentIndex, position, event);\n },\n onModelSurfaceClick: (nodeId, effectIndex, position, event) => {\n this.cb.onModelSurfaceClick?.(nodeId, effectIndex, position, event);\n },\n onMovePathPointToEnd: (nodeId, effectIndex, pointIndex, toStart) => {\n this.cb.onMovePathPointToEnd?.(nodeId, effectIndex, pointIndex, toStart);\n },\n getNodeObject: (nodeId: string): THREE.Object3D | null => {\n return this.objects.get(nodeId) ?? null;\n },\n };\n this.pathEditor = new PathEditor(\n this.scene,\n this.camera,\n this.renderer,\n this.store,\n this.orbit,\n pathEditorCallbacks,\n );\n // 复用 viewer 的 gizmo,不创建独立实例\n this.pathEditor.setGizmo(this.gizmo);\n this.pathEditor.bindGizmoEvents();\n\n this.sync();\n this.refreshSelection();\n }\n\n setMode(mode: TransformMode): void {\n this.gizmo.setMode(mode);\n }\n\n // ── 路径编辑 ──\n\n /** 设置路径编辑的活动效果 */\n setPathEditingEffect(effectKey: string | null): void {\n this.pathEditor.setActiveEffect(effectKey);\n }\n\n /** 是否正在编辑路径 */\n isPathEditing(): boolean {\n return this.pathEditor.isActive();\n }\n\n /** 设置路径编辑控制点大小 */\n setPathHandleSize(size: number): void {\n this.pathEditor.setHandleSize(size);\n }\n\n /** 将当前相机状态写入 SceneDoc(保存前调用) */\n saveCamera(): void {\n this.store.doc.camera = {\n position: [\n Math.round(this.camera.position.x * 100) / 100,\n Math.round(this.camera.position.y * 100) / 100,\n Math.round(this.camera.position.z * 100) / 100,\n ],\n target: [\n Math.round(this.orbit.target.x * 100) / 100,\n Math.round(this.orbit.target.y * 100) / 100,\n Math.round(this.orbit.target.z * 100) / 100,\n ],\n };\n }\n\n /** 从 SceneDoc 恢复相机位置 */\n private restoreCamera(): void {\n const cam = this.store.doc.camera;\n if (!cam) return;\n this.camera.position.set(...cam.position);\n this.orbit.target.set(...cam.target);\n // 重置 damping 状态,防止残留速度导致位置漂移\n this.orbit.enableDamping = false;\n this.orbit.update();\n this.orbit.enableDamping = true;\n // 强制相机朝向 target\n this.camera.lookAt(this.orbit.target);\n }\n\n /** 导出场景为 GLB 文件 */\n exportScene(): void {\n const exporter = new GLTFExporter();\n const exportScene = new THREE.Scene();\n\n // 只导出根节点(没有父节点的),子节点会自动跟随\n for (const [id, obj] of this.objects) {\n const node = this.store.node(id);\n if (!node) continue;\n const parent = this.store.parentOf(id);\n if (!parent && obj.parent) {\n // 根节点:clone 整个子树\n exportScene.add(obj.clone(true));\n }\n }\n\n exporter.parse(\n exportScene,\n (result: ArrayBuffer | object) => {\n const output = result instanceof ArrayBuffer\n ? new Blob([result], { type: 'application/octet-stream' })\n : new Blob([JSON.stringify(result)], { type: 'application/json' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(output);\n link.download = result instanceof ArrayBuffer ? 'scene.glb' : 'scene.gltf';\n link.click();\n },\n (error: unknown) => {\n console.error('导出失败:', error);\n },\n { binary: true },\n );\n }\n\n /** 按文档重建/更新/删除 three 对象 */\n sync(): void {\n // 检测文档是否被整体替换(新场景加载):如果当前对象缓存为空但文档有节点,说明是首次加载\n const currentIds = new Set(this.objects.keys());\n const docIds = new Set(this.store.doc.nodes.map(n => n.id));\n // 如果文档 ID 集合和缓存完全不重叠(且文档非空),视为新文档 → 重置相机和资产加载状态\n if (docIds.size > 0 && currentIds.size > 0) {\n let overlap = false;\n for (const id of docIds) {\n if (currentIds.has(id)) { overlap = true; break; }\n }\n if (!overlap) {\n this.cameraRestored = false;\n // 新文档加载:清空资产加载状态,确保资产重新加载\n this.loadingAssetUrls.clear();\n }\n }\n\n const seen = new Set<string>();\n for (const n of this.store.doc.nodes) {\n seen.add(n.id);\n // group 节点用 Object3D 占位(用于 gizmo)\n if (n.primitive === 'group') {\n let obj = this.objects.get(n.id);\n if (!obj) {\n obj = new THREE.Object3D();\n this.objects.set(n.id, obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // label 节点创建标签 mesh\n if (n.primitive === 'label') {\n let obj = this.labelObjects.get(n.id);\n if (!obj) {\n obj = this.createLabel(n.text || n.name);\n obj.userData['id'] = n.id; // 设置 id 以便拾取\n this.labelObjects.set(n.id, obj);\n this.objects.set(n.id, obj); // 同时添加到 objects 以便拾取\n this.scene.add(obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // asset 节点异步加载\n if (n.primitive === 'asset') {\n let obj = this.objects.get(n.id);\n if (!obj) {\n obj = new THREE.Object3D();\n this.objects.set(n.id, obj);\n }\n const assetLoaded = !!obj.userData['assetLoaded'];\n const loadingUrl = n.assetUrl ? this.loadingAssetUrls.has(n.assetUrl) : false;\n // 如果还没加载完成,需要确保被加入等待列表(或开始加载)\n if (!assetLoaded && n.assetUrl) {\n if (!loadingUrl) {\n // URL 没在加载中,开始加载\n this.loadAsset(n.id);\n } else {\n // URL 正在加载中,确保当前节点在等待列表中\n let pending = this.pendingAssetNodes.get(n.assetUrl);\n if (!pending) {\n pending = new Set();\n this.pendingAssetNodes.set(n.assetUrl, pending);\n }\n if (!pending.has(n.id)) {\n pending.add(n.id);\n }\n }\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // light 节点创建/更新灯光\n if (n.primitive === 'light') {\n let obj = this.objects.get(n.id);\n const needsRecreate = !obj || !this.isLight(obj) ||\n (obj as any).__lightType !== n.lightType;\n if (needsRecreate) {\n // 清理旧对象(如果有)\n if (obj) {\n obj.parent?.remove(obj);\n }\n // 清理旧的灯光目标/助手/拾取球\n const oldTarget = this.lightTargets.get(n.id);\n if (oldTarget) { oldTarget.parent?.remove(oldTarget); this.lightTargets.delete(n.id); }\n const oldHelper = this.lightHelpers.get(n.id);\n if (oldHelper) {\n oldHelper.parent?.remove(oldHelper);\n if (oldHelper instanceof THREE.DirectionalLightHelper) oldHelper.dispose();\n if (oldHelper instanceof THREE.SpotLightHelper) oldHelper.dispose();\n this.lightHelpers.delete(n.id);\n }\n const oldPicker = this.lightPickers.get(n.id);\n if (oldPicker) { oldPicker.parent?.remove(oldPicker); oldPicker.geometry.dispose(); (oldPicker.material as THREE.Material).dispose(); this.lightPickers.delete(n.id); }\n const light = this.createLight(n);\n (light as any).__lightType = n.lightType;\n this.objects.set(n.id, light);\n obj = light;\n } else {\n this.updateLightProperties(obj as THREE.Light, n);\n }\n if (!obj) continue;\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n let obj = this.objects.get(n.id);\n if (!obj || !(obj instanceof THREE.Mesh)) {\n obj = this.createMesh(n);\n this.objects.set(n.id, obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n }\n for (const [id, obj] of [...this.objects]) {\n if (!seen.has(id)) {\n this.objects.delete(id);\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Mesh) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n // 从等待加载列表中移除\n for (const [, nodeIds] of this.pendingAssetNodes) {\n nodeIds.delete(id);\n }\n // 清理灯光相关对象\n const target = this.lightTargets.get(id);\n if (target) {\n target.parent?.remove(target);\n this.lightTargets.delete(id);\n }\n const helper = this.lightHelpers.get(id);\n if (helper) {\n helper.parent?.remove(helper);\n if (helper instanceof THREE.DirectionalLightHelper) helper.dispose();\n if (helper instanceof THREE.SpotLightHelper) helper.dispose();\n this.lightHelpers.delete(id);\n }\n const picker = this.lightPickers.get(id);\n if (picker) {\n picker.parent?.remove(picker);\n picker.geometry.dispose();\n (picker.material as THREE.Material).dispose();\n this.lightPickers.delete(id);\n }\n // 清理标签对象\n const label = this.labelObjects.get(id);\n if (label) {\n label.parent?.remove(label);\n label.geometry.dispose();\n (label.material as THREE.Material).dispose();\n this.labelObjects.delete(id);\n }\n }\n }\n // 层级关系\n for (const n of this.store.doc.nodes) {\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n const parent = this.store.parentOf(n.id);\n const target = (parent && this.objects.get(parent.id)) || this.scene;\n if (obj.parent !== target) {\n // 先 detach 再 add,确保 Object3D 层级与数据模型一致\n obj.parent?.remove(obj);\n target.add(obj);\n // add 后根据数据模型重新设置本地变换\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n }\n }\n // 同步所有节点的材质覆盖(确保 undo/redo 后视觉正确)\n for (const n of this.store.doc.nodes) {\n if (this.objects.has(n.id)) {\n this.applyMaterialOverrides(n.id, this._isUndoRedoing);\n }\n }\n // 保存动画基础变换(始终与数据模型同步)\n for (const n of this.store.doc.nodes) {\n if (n.animations && n.animations.length > 0 && this.objects.has(n.id)) {\n this.saveBaseTransforms(n.id);\n }\n }\n // 同步看板 widget DOM\n this.syncDashboard();\n // 同步视觉效果\n this.syncEffects();\n // 同步路径编辑器\n this.pathEditor.sync();\n // 应用环境配置\n this.applyEnvironment();\n // 只在首次加载时恢复相机(后续 doc 变更不重置视角)\n if (!this.cameraRestored) {\n this.restoreCamera();\n this.cameraRestored = true;\n }\n this.refreshSelection();\n }\n\n /** 强制恢复相机(草稿恢复后调用) */\n forceRestoreCamera(): void {\n this.cameraRestored = false;\n this.restoreCamera();\n this.cameraRestored = true;\n }\n\n /** 创建标签 mesh */\n private createLabel(text: string): THREE.Mesh {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = 256;\n canvas.height = 64;\n\n // 圆角矩形路径\n const radius = 8;\n const w = canvas.width;\n const h = canvas.height;\n\n // 深色半透明背景(类似看板样式)\n ctx.fillStyle = 'rgba(20, 25, 35, 0.85)';\n ctx.beginPath();\n ctx.moveTo(radius, 0);\n ctx.lineTo(w - radius, 0);\n ctx.arcTo(w, 0, w, radius, radius);\n ctx.lineTo(w, h - radius);\n ctx.arcTo(w, h, w - radius, h, radius);\n ctx.lineTo(radius, h);\n ctx.arcTo(0, h, 0, h - radius, radius);\n ctx.lineTo(0, radius);\n ctx.arcTo(0, 0, radius, 0, radius);\n ctx.closePath();\n ctx.fill();\n\n // 蓝色边框\n ctx.strokeStyle = 'rgba(79, 131, 204, 0.5)';\n ctx.lineWidth = 2;\n ctx.stroke();\n\n // 白色文字\n ctx.fillStyle = '#ffffff';\n ctx.font = 'bold 28px Arial, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, w / 2, h / 2);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n\n const geometry = new THREE.PlaneGeometry(1, 0.25);\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n });\n return new THREE.Mesh(geometry, material);\n }\n\n // ── 环境配置 ──\n\n /** 应用场景环境配置(背景色、半球光、平行光、HDRI) */\n private applyEnvironment(): void {\n const env = this.store.doc.environment;\n if (!env) {\n // 无配置 → 使用默认灯光(默认启用)\n this.clearHdri();\n this.scene.background = new THREE.Color(0x808080);\n this.ensureHemiLight();\n this.hemiLight!.color.set(0xffffff);\n this.hemiLight!.groundColor.set(0xffffff);\n this.hemiLight!.intensity = 2.5;\n this.ensureDirLight();\n this.dirLight!.color.set(0xffffff);\n this.dirLight!.intensity = 5.0;\n this.dirLight!.position.set(0, 15, 5);\n this.applyRoom();\n return;\n }\n\n // HDRI 环境贴图(优先于纯色背景)\n const hdriUrl = env.hdriDataUrl || null;\n if (hdriUrl) {\n if (hdriUrl === this.hdriCurrentUrl && this.hdriTexture) {\n // 已缓存,直接应用\n this.scene.environment = this.hdriTexture;\n this.scene.background = this.hdriTexture;\n } else {\n // 新 HDRI,异步加载\n new RGBELoader().load(hdriUrl, (texture) => {\n const pmrem = new THREE.PMREMGenerator(this.renderer);\n const envMap = pmrem.fromEquirectangular(texture).texture;\n pmrem.dispose();\n texture.dispose();\n // 释放旧的 HDRI 纹理\n if (this.hdriTexture) {\n this.hdriTexture.dispose();\n }\n this.hdriTexture = envMap;\n this.hdriCurrentUrl = hdriUrl;\n // 只在当前环境仍是同一个 HDRI 时才应用(防止切换竞态)\n if (this.store.doc.environment?.hdriDataUrl === hdriUrl) {\n this.scene.environment = envMap;\n this.scene.background = envMap;\n }\n });\n }\n } else {\n this.clearHdri();\n if (env.background) {\n this.scene.background = new THREE.Color(env.background);\n }\n }\n\n // 半球光(enabled 默认 true)\n const hemiEnabled = env.hemisphere?.enabled !== false;\n if (hemiEnabled) {\n this.ensureHemiLight();\n if (env.hemisphere?.skyColor) this.hemiLight!.color.set(env.hemisphere.skyColor);\n if (env.hemisphere?.groundColor) this.hemiLight!.groundColor.set(env.hemisphere.groundColor);\n if (env.hemisphere?.intensity !== undefined) this.hemiLight!.intensity = env.hemisphere.intensity;\n } else {\n this.removeHemiLight();\n }\n\n // 平行光(enabled 默认 true)\n const dirEnabled = env.directional?.enabled !== false;\n if (dirEnabled) {\n this.ensureDirLight();\n if (env.directional?.color) this.dirLight!.color.set(env.directional.color);\n if (env.directional?.intensity !== undefined) this.dirLight!.intensity = env.directional.intensity;\n if (env.directional?.position) this.dirLight!.position.set(...env.directional.position);\n } else {\n this.removeDirLight();\n }\n\n // 阴影配置\n const shadowEnabled = env.shadow?.enabled !== false;\n this.renderer.shadowMap.enabled = shadowEnabled;\n if (this.dirLight) {\n this.dirLight.castShadow = shadowEnabled;\n const mapSize = env.shadow?.mapSize ?? 2048;\n this.dirLight.shadow.mapSize.set(mapSize, mapSize);\n const range = env.shadow?.cameraRange ?? 15;\n this.dirLight.shadow.camera.left = -range;\n this.dirLight.shadow.camera.right = range;\n this.dirLight.shadow.camera.top = range;\n this.dirLight.shadow.camera.bottom = -range;\n this.dirLight.shadow.camera.updateProjectionMatrix();\n }\n\n // 场景空间\n this.applyRoom();\n }\n\n /** 确保半球光存在并加入场景 */\n private ensureHemiLight(): void {\n if (!this.hemiLight) {\n this.hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 1.4);\n this.scene.add(this.hemiLight);\n }\n }\n\n /** 移除半球光 */\n private removeHemiLight(): void {\n if (this.hemiLight) {\n this.scene.remove(this.hemiLight);\n this.hemiLight = null;\n }\n }\n\n /** 确保平行光存在并加入场景 */\n private ensureDirLight(): void {\n if (!this.dirLight) {\n this.dirLight = new THREE.DirectionalLight(0xffffff, 2.2);\n this.dirLight.position.set(5, 10, 6);\n this.dirLight.castShadow = true;\n // 阴影相机配置:覆盖典型房间范围\n this.dirLight.shadow.mapSize.set(2048, 2048);\n this.dirLight.shadow.camera.near = 0.5;\n this.dirLight.shadow.camera.far = 50;\n this.dirLight.shadow.camera.left = -15;\n this.dirLight.shadow.camera.right = 15;\n this.dirLight.shadow.camera.top = 15;\n this.dirLight.shadow.camera.bottom = -15;\n this.dirLight.shadow.bias = -0.0005;\n this.dirLight.shadow.normalBias = 0.02;\n this.scene.add(this.dirLight);\n }\n }\n\n /** 移除平行光 */\n private removeDirLight(): void {\n if (this.dirLight) {\n this.scene.remove(this.dirLight);\n this.dirLight = null;\n }\n }\n\n /** 应用场景空间配置 */\n private applyRoom(): void {\n const room = this.store.doc.environment?.room;\n // 构建配置签名,未变化则跳过重建\n const key = room?.enabled\n ? `${room.width ?? 30}_${room.height ?? 10}_${room.depth ?? 30}_${room.floorColor ?? ''}_${room.wallColor ?? ''}_${room.ceilingColor ?? ''}_${(room.floorTexture ?? '').length}_${(room.wallTexture ?? '').length}_${(room.ceilingTexture ?? '').length}_${room.floorUseBaseColor ?? true}_${room.wallUseBaseColor ?? true}_${room.ceilingUseBaseColor ?? true}`\n : 'off';\n if (key === this.lastRoomKey) return;\n this.lastRoomKey = key;\n\n if (!room?.enabled) {\n this.disposeRoom();\n this.gridHelper.visible = true;\n this.orbit.maxDistance = Infinity;\n this.orbit.minDistance = 0;\n return;\n }\n\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n const floorColor = (room.floorUseBaseColor ?? true) ? (room.floorColor ?? '#808080') : '#ffffff';\n const wallColor = (room.wallUseBaseColor ?? true) ? (room.wallColor ?? '#c8c0b0') : '#ffffff';\n const ceilingColor = (room.ceilingUseBaseColor ?? true) ? (room.ceilingColor ?? '#a0a0a0') : '#ffffff';\n\n this.disposeRoom();\n this.scene.background = null;\n\n // 构建 6 面材质:[+X墙, -X墙, +Y天花板, -Y地板, +Z墙, -Z墙]\n const materials = this.buildRoomMaterials(\n wallColor, ceilingColor, floorColor,\n room.wallTexture, room.ceilingTexture, room.floorTexture,\n w, h, d,\n room.wallNormalTexture, room.wallRoughnessTexture,\n room.floorNormalTexture, room.floorRoughnessTexture,\n room.ceilingNormalTexture, room.ceilingRoughnessTexture,\n );\n\n const geometry = new THREE.BoxGeometry(w, h, d);\n this.fixBoxBackSideUV(geometry);\n this.roomMesh = new THREE.Mesh(geometry, materials);\n this.roomMesh.position.y = h / 2;\n this.roomMesh.receiveShadow = true;\n this.scene.add(this.roomMesh);\n\n // 房间内部光源已移除(用户要求去掉点光源)\n // 天花板黑是因为半球光的地面颜色较暗,需要调整半球光设置或添加专用光源\n\n this.gridHelper.visible = false;\n\n const maxDim = Math.max(w, h, d);\n this.orbit.maxDistance = maxDim * 2;\n this.orbit.minDistance = 1;\n }\n\n /** 构建房间 6 面材质 */\n private buildRoomMaterials(\n wallColor: string, ceilingColor: string, floorColor: string,\n wallTex?: string, ceilingTex?: string, floorTex?: string,\n roomW?: number, roomH?: number, roomD?: number,\n wallNormal?: string, wallRough?: string,\n floorNormal?: string, floorRough?: string,\n ceilingNormal?: string, ceilingRough?: string,\n ): THREE.MeshStandardMaterial[] {\n const makeMat = (\n color: string,\n texUrl?: string,\n normalUrl?: string,\n roughUrl?: string,\n faceW?: number,\n faceH?: number,\n defaultRoughness = 0.9,\n ): THREE.MeshStandardMaterial => {\n const mat = new THREE.MeshStandardMaterial({\n color: new THREE.Color(color),\n roughness: roughUrl ? 1 : defaultRoughness, // 有粗糙度贴图时设为 1,让贴图完全控制\n metalness: 0.05,\n side: THREE.BackSide,\n });\n\n const applyTex = (url: string, isColorMap: boolean, repeatX?: number, repeatY?: number) => {\n let tex = this.textureCache.get(url);\n if (!tex) {\n tex = this.textureLoader.load(url);\n tex.colorSpace = isColorMap ? THREE.SRGBColorSpace : THREE.LinearSRGBColorSpace;\n tex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n this.textureCache.set(url, tex);\n }\n if (repeatX && repeatY) {\n tex = tex.clone(); // 克隆以允许不同面有不同的 repeat\n tex.repeat.set(repeatX, repeatY);\n tex.needsUpdate = true;\n }\n return tex;\n };\n\n if (texUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.map = applyTex(texUrl, true, repeatX, repeatY);\n }\n if (normalUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.normalMap = applyTex(normalUrl, false, repeatX, repeatY);\n mat.normalScale = new THREE.Vector2(1, 1);\n }\n if (roughUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.roughnessMap = applyTex(roughUrl, false, repeatX, repeatY);\n }\n return mat;\n };\n // BoxGeometry 的 6 个面顺序:+X, -X, +Y, -Y, +Z, -Z\n return [\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomD, roomH), // +X 墙\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomD, roomH), // -X 墙\n makeMat(ceilingColor, ceilingTex, ceilingNormal, ceilingRough, roomW, roomD), // +Y 天花板\n makeMat(floorColor, floorTex, floorNormal, floorRough, roomW, roomD), // -Y 地板\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomW, roomH), // +Z 墙\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomW, roomH), // -Z 墙\n ];\n }\n\n /**\n * 修正 BoxGeometry + BackSide 的 UV 镜像问题\n * BackSide 从内部看盒子时,+X、+Z 面 U 反向,+Y 天花板 UV 全反,-Y 地板 V 反向\n */\n private fixBoxBackSideUV(geometry: THREE.BoxGeometry): void {\n const uvAttr = geometry.getAttribute('uv') as THREE.BufferAttribute;\n const uv = uvAttr.array as Float32Array;\n const pos = geometry.getAttribute('position');\n // BoxGeometry 每面 2 个三角 = 6 顶点,6 面 = 36 顶点\n // 面顺序: +X(0-5), -X(6-11), +Y(12-17), -Y(18-23), +Z(24-29), -Z(30-35)\n for (let face = 0; face < 6; face++) {\n const base = face * 6 * 2; // 每面 6 个顶点 × 2 分量\n switch (face) {\n case 0: // +X → u 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2] = 1 - uv[base + i * 2]; break;\n case 2: // +Y 天花板 → u, v 全反\n for (let i = 0; i < 6; i++) { uv[base + i * 2] = 1 - uv[base + i * 2]; uv[base + i * 2 + 1] = 1 - uv[base + i * 2 + 1]; } break;\n case 3: // -Y 地板 → v 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2 + 1] = 1 - uv[base + i * 2 + 1]; break;\n case 4: // +Z → u 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2] = 1 - uv[base + i * 2]; break;\n }\n }\n uvAttr.needsUpdate = true;\n }\n\n /** 销毁房间网格和材质 */\n private disposeRoom(): void {\n if (this.roomMesh) {\n this.roomMesh.geometry.dispose();\n const mats = Array.isArray(this.roomMesh.material) ? this.roomMesh.material : [this.roomMesh.material];\n for (const mat of mats) {\n const m = mat as THREE.MeshStandardMaterial;\n if (m.map) m.map.dispose();\n if (m.normalMap) m.normalMap.dispose();\n if (m.roughnessMap) m.roughnessMap.dispose();\n mat.dispose();\n }\n this.scene.remove(this.roomMesh);\n this.roomMesh = null;\n }\n }\n\n /** 处理键盘移动(WASD + Q/E)—— 仅当场景空间启用时生效 */\n private processKeyboardMovement(): void {\n const room = this.store.doc.environment?.room;\n if (!room?.enabled) return;\n\n const keys = this.keysPressed;\n const hasMovement = keys.has('w') || keys.has('s') || keys.has('a') || keys.has('d') ||\n keys.has('q') || keys.has('e') || keys.has(' ');\n\n if (!hasMovement) return;\n\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n const margin = Math.max(0.3, Math.min(w, h, d) * 0.05);\n\n // 复用临时向量\n const forward = this._tmpVec;\n const right = this._tmpVec2;\n const move = this._tmpVec3;\n\n this.camera.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n\n right.crossVectors(forward, this._upVector).normalize();\n\n move.set(0, 0, 0);\n if (keys.has('w')) move.add(forward);\n if (keys.has('s')) move.sub(forward);\n if (keys.has('a')) move.sub(right);\n if (keys.has('d')) move.add(right);\n if (keys.has('q') || keys.has('shift')) move.y -= 1;\n if (keys.has('e') || keys.has(' ')) move.y += 1;\n\n if (move.lengthSq() === 0) return;\n move.normalize().multiplyScalar(this.moveSpeed * 0.016); // 假设 60fps,约 16ms/帧\n\n // 同时移动 orbit target 和 camera\n this.orbit.target.add(move);\n this.camera.position.add(move);\n\n // 限制在房间范围内\n const halfW = w / 2 - margin;\n const halfD = d / 2 - margin;\n this.orbit.target.x = THREE.MathUtils.clamp(this.orbit.target.x, -halfW, halfW);\n this.orbit.target.y = THREE.MathUtils.clamp(this.orbit.target.y, margin, h - margin);\n this.orbit.target.z = THREE.MathUtils.clamp(this.orbit.target.z, -halfD, halfD);\n this.camera.position.x = THREE.MathUtils.clamp(this.camera.position.x, -halfW, halfW);\n this.camera.position.y = THREE.MathUtils.clamp(this.camera.position.y, margin, h - margin);\n this.camera.position.z = THREE.MathUtils.clamp(this.camera.position.z, -halfD, halfD);\n }\n\n /** 场景空间开启时,限制 orbit 目标和相机在房间内部 */\n private constrainCameraToRoom(): void {\n const room = this.store.doc.environment?.room;\n if (!room?.enabled) return;\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n // margin 随房间尺寸缩放,最小 0.1,最大为最小维度的 3%\n const minDim = Math.min(w, h, d);\n const margin = Math.max(0.1, minDim * 0.03);\n const halfW = w / 2 - margin;\n const halfD = d / 2 - margin;\n const minY = margin;\n const maxY = h - margin;\n let changed = false;\n // 限制 orbit 目标点在房间范围内\n const tx = THREE.MathUtils.clamp(this.orbit.target.x, -halfW, halfW);\n const ty = THREE.MathUtils.clamp(this.orbit.target.y, minY, maxY);\n const tz = THREE.MathUtils.clamp(this.orbit.target.z, -halfD, halfD);\n if (tx !== this.orbit.target.x || ty !== this.orbit.target.y || tz !== this.orbit.target.z) {\n this.orbit.target.set(tx, ty, tz);\n changed = true;\n }\n // 限制相机位置在房间范围内\n const cx = THREE.MathUtils.clamp(this.camera.position.x, -halfW, halfW);\n const cy = THREE.MathUtils.clamp(this.camera.position.y, minY, maxY);\n const cz = THREE.MathUtils.clamp(this.camera.position.z, -halfD, halfD);\n if (cx !== this.camera.position.x || cy !== this.camera.position.y || cz !== this.camera.position.z) {\n this.camera.position.set(cx, cy, cz);\n changed = true;\n }\n // 如果目标被修改,需要重新更新 orbit\n if (changed) {\n this.orbit.update();\n }\n }\n\n /** 清除 HDRI 环境贴图 */\n private clearHdri(): void {\n if (this.hdriTexture) {\n this.hdriTexture.dispose();\n this.hdriTexture = null;\n }\n this.hdriCurrentUrl = null;\n this.scene.environment = null;\n }\n\n /** 初始化后处理效果链:SSAO + Bloom + 色调映射输出 */\n private initPostProcessing(): void {\n const w = this.host.clientWidth || 1;\n const h = this.host.clientHeight || 1;\n\n // 创建合成器\n this.composer = new EffectComposer(this.renderer);\n\n // 1. 基础渲染通道\n const renderPass = new RenderPass(this.scene, this.camera);\n this.composer.addPass(renderPass);\n\n // 2. SSAO(屏幕空间环境光遮蔽)—— 增强角落/缝隙的阴影深度\n const ssaoPass = new SSAOPass(this.scene, this.camera, w, h);\n ssaoPass.kernelRadius = 16; // 采样半径\n ssaoPass.minDistance = 0.005; // 最小距离阈值\n ssaoPass.maxDistance = 0.1; // 最大距离阈值\n ssaoPass.output = SSAOPass.OUTPUT.Default;\n this.composer.addPass(ssaoPass);\n\n // 3. Bloom(泛光)—— 高亮区域发光效果\n const bloomPass = new UnrealBloomPass(\n new THREE.Vector2(w, h),\n 0.3, // strength:泛光强度(低值,避免过曝)\n 0.4, // radius:泛光扩散范围\n 0.85, // threshold:亮度阈值(只让很亮的区域发光)\n );\n this.composer.addPass(bloomPass);\n\n // 4. 输出通道(色调映射 + 色彩空间转换)\n const outputPass = new OutputPass();\n this.composer.addPass(outputPass);\n }\n\n // ── 动画引擎 ─\n\n // ── 飞行路线播放 ──\n\n /** 播放飞行路线 */\n playFlyPath(path: FlyPath, callbacks?: { onComplete?: () => void }): void {\n if (!path.keyframes || path.keyframes.length < 2) {\n console.warn('飞行路线至少需要 2 个关键帧');\n return;\n }\n this.flyPathPlaying = path;\n this.flyPathStartTime = performance.now();\n this.flyPathPausedElapsed = 0;\n this.flyPathPaused = false;\n this.flyPathResuming = false;\n this.flyPathCallbacks = callbacks ?? {};\n // 禁用轨道控制\n this.orbit.enabled = false;\n }\n\n /** 停止飞行路线 */\n stopFlyPath(): void {\n if (!this.flyPathPlaying) return;\n this.flyPathPlaying = null;\n this.flyPathStartTime = 0;\n this.flyPathPausedElapsed = 0;\n this.flyPathPaused = false;\n this.flyPathResuming = false;\n this.flyPathCallbacks = {};\n // 重新启用轨道控制\n this.orbit.enabled = true;\n }\n\n /** 暂停飞行路线 */\n pauseFlyPath(): void {\n if (!this.flyPathPlaying) return;\n // 记录暂停时已经过的时间\n this.flyPathPausedElapsed = (performance.now() - this.flyPathStartTime) / 1000;\n this.flyPathPaused = true;\n this.flyPathResuming = false;\n }\n\n /** 恢复播放(从暂停处继续) */\n resumeFlyPath(): void {\n if (!this.flyPathPlaying) return;\n this.flyPathPaused = false;\n this.flyPathResuming = true; // 标记需要在下一帧重算 startTime\n }\n\n /** 是否正在播放飞行路线 */\n isFlyPathPlaying(): boolean {\n return this.flyPathPlaying !== null;\n }\n\n /** 更新飞行路线相机(在渲染循环中调用) */\n private updateFlyPath(): void {\n if (!this.flyPathPlaying) return;\n // 暂停中,冻结相机\n if (this.flyPathPaused) return;\n\n // 刚从暂停恢复,在渲染循环中重算 startTime(避免 Angular zone 延迟)\n if (this.flyPathResuming) {\n this.flyPathStartTime = performance.now() - this.flyPathPausedElapsed * 1000;\n this.flyPathResuming = false;\n }\n\n const path = this.flyPathPlaying;\n const elapsed = (performance.now() - this.flyPathStartTime) / 1000;\n\n // 计算总时长\n const totalDuration = path.duration ?? (path.keyframes.length > 0\n ? path.keyframes[path.keyframes.length - 1].time\n : 0);\n\n if (totalDuration <= 0) {\n this.stopFlyPath();\n this.flyPathCallbacks.onComplete?.();\n return;\n }\n\n let t = elapsed;\n if (elapsed >= totalDuration) {\n if (path.loop) {\n // 循环播放\n t = elapsed % totalDuration;\n } else {\n // 播放完毕\n this.stopFlyPath();\n this.flyPathCallbacks.onComplete?.();\n return;\n }\n }\n\n // 找到当前时间段的关键帧\n const kf = path.keyframes;\n let i = 0;\n while (i < kf.length - 1 && kf[i + 1].time <= t) i++;\n\n if (i >= kf.length - 1) {\n // 到达最后一个关键帧\n this.setCameraFromKeyframe(kf[kf.length - 1]);\n return;\n }\n\n // 在两个关键帧之间线性插值(匀速飞行,无停顿)\n const kf0 = kf[i];\n const kf1 = kf[i + 1];\n const segDuration = kf1.time - kf0.time;\n const segT = segDuration > 0 ? (t - kf0.time) / segDuration : 0;\n\n // 插值位置\n const pos = new THREE.Vector3(\n kf0.position[0] + (kf1.position[0] - kf0.position[0]) * segT,\n kf0.position[1] + (kf1.position[1] - kf0.position[1]) * segT,\n kf0.position[2] + (kf1.position[2] - kf0.position[2]) * segT,\n );\n\n // 插值目标点\n const target = new THREE.Vector3(\n kf0.target[0] + (kf1.target[0] - kf0.target[0]) * segT,\n kf0.target[1] + (kf1.target[1] - kf0.target[1]) * segT,\n kf0.target[2] + (kf1.target[2] - kf0.target[2]) * segT,\n );\n\n // 应用相机\n this.camera.position.copy(pos);\n this.camera.lookAt(target);\n this.orbit.target.copy(target);\n }\n\n /** 从关键帧设置相机 */\n private setCameraFromKeyframe(kf: CameraKeyframe): void {\n this.camera.position.set(...kf.position);\n this.camera.lookAt(new THREE.Vector3(...kf.target));\n this.orbit.target.set(...kf.target);\n }\n\n\n /** 保存节点的基础变换(数据模型值) */\n private saveBaseTransforms(nodeId: string): void {\n const n = this.store.node(nodeId);\n if (!n) return;\n this.animBases.set(nodeId, {\n position: [...n.position] as Vec3,\n rotation: [...n.rotation] as Vec3,\n scale: [...n.scale] as Vec3,\n });\n }\n\n /** 每帧更新所有动画 */\n private updateAnimations(dt: number): void {\n if (this.animationFrozen) return;\n this.animTime += dt;\n\n for (const n of this.store.doc.nodes) {\n if (!n.animations || n.animations.length === 0) continue;\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n\n // 确保基础变换已保存\n if (!this.animBases.has(n.id)) {\n this.saveBaseTransforms(n.id);\n }\n const base = this.animBases.get(n.id)!;\n\n // 从基础变换开始\n obj.position.set(...base.position);\n obj.rotation.set(base.rotation[0] * DEG2RAD, base.rotation[1] * DEG2RAD, base.rotation[2] * DEG2RAD);\n obj.scale.set(...base.scale);\n\n // 应用每条动画规则\n for (const rule of n.animations) {\n const value = this.evaluateAnimation(rule, n.id);\n\n // emissive 类型特殊处理:作用于材质\n if (rule.type === 'emissive' || rule.type === 'emissive-constant' || rule.type === 'emissive-temperature') {\n if (!rule.targetMeshName) {\n this.applyEmissiveRule(obj, rule, value, n.id);\n } else {\n obj.traverse(child => {\n if (child.name === rule.targetMeshName) {\n this.applyEmissiveRule(child, rule, value, n.id);\n }\n });\n }\n continue;\n }\n\n if (value == null) continue;\n\n if (!rule.targetMeshName) {\n // 根节点属性\n this.applyAnimValue(obj, rule.property, value);\n } else {\n // 特定子网格属性\n obj.traverse(child => {\n if (child.name === rule.targetMeshName) {\n this.applyAnimValue(child, rule.property, value);\n }\n });\n }\n }\n }\n }\n\n /** 将动画值应用到对象的指定属性 */\n private applyAnimValue(obj: THREE.Object3D, property: string, value: number): void {\n const parts = property.split('.');\n const prop = parts[0];\n const axis = parts[1];\n const target = (obj as any)[prop];\n if (!target) return;\n\n if (prop === 'rotation') {\n if (axis) target[axis] = value * DEG2RAD;\n } else {\n if (axis) target[axis] = value;\n }\n }\n\n /** 应用发射光动画规则 */\n private applyEmissiveRule(obj: THREE.Object3D, rule: any, value: number | null, nodeId?: string): void {\n if (!(obj instanceof THREE.Mesh)) return;\n const material = obj.material;\n if (!material) return;\n\n const materials = Array.isArray(material) ? material : [material];\n for (const mat of materials) {\n if (!mat.isMeshPhongMaterial && !mat.isMeshStandardMaterial) continue;\n const phongMat = mat as THREE.MeshPhongMaterial | THREE.MeshStandardMaterial;\n\n if (rule.type === 'emissive-constant') {\n // 常亮:直接设置高亮颜色\n phongMat.emissive = new THREE.Color(rule.highlightColor ?? '#00aaff');\n } else if (rule.type === 'emissive-temperature') {\n // 温度梯度:根据数据值插值颜色\n const colors = rule.tempColors ?? ['#00ff00', '#ffff00', '#ff0000'];\n // 优先使用节点数据,否则回退到全局 dataSignal\n const dataKey = rule.dataSource;\n const dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n const dataMin = rule.dataMin ?? 0;\n const dataMax = rule.dataMax ?? 100;\n const t = Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n const color = this.interpolateColorGradient(colors, t);\n phongMat.emissive = color;\n } else if (rule.type === 'emissive') {\n // value 为 null 表示开关关闭,不设置 emissive\n if (value == null) return;\n // 闪烁:正弦波在暗→亮之间\n const v = value;\n const origColor = new THREE.Color(rule.alarmColor ?? '#ff0000');\n const darkColor = origColor.clone().multiplyScalar(0.1);\n const interpColor = darkColor.clone().lerp(origColor, v);\n phongMat.emissive = interpColor;\n }\n }\n }\n\n /** 多色梯度插值 */\n private interpolateColorGradient(colors: string[], t: number): THREE.Color {\n if (colors.length === 0) return new THREE.Color('#ffffff');\n if (colors.length === 1) return new THREE.Color(colors[0]);\n\n const scaledT = t * (colors.length - 1);\n const index = Math.floor(scaledT);\n const localT = scaledT - index;\n\n if (index >= colors.length - 1) {\n return new THREE.Color(colors[colors.length - 1]);\n }\n\n const c1 = new THREE.Color(colors[index]);\n const c2 = new THREE.Color(colors[index + 1]);\n return c1.clone().lerp(c2, localT);\n }\n\n /** 计算单条动画规则的当前值 */\n private evaluateAnimation(rule: { type: string; speed?: number; from?: number; to?: number; duration?: number; easing?: string; dataSource?: string; dataMin?: number; dataMax?: number; bindingId?: string; threshold?: number }, nodeId?: string): number | null {\n switch (rule.type) {\n case 'continuous': {\n // 持续旋转/移动:基于时间\n // 如果有 bindingId,作为开关控制(值 > threshold 时旋转)\n // 编辑器模式:忽略 bindingId,直接播放\n if (rule.bindingId && !this.isEditorMode) {\n const switchValue = this.getBindingData(rule.bindingId) ?? 0;\n const threshold = rule.threshold ?? 0.5;\n if (switchValue <= threshold) {\n return null; // 开关关闭,不旋转\n }\n }\n return (this.animTime * (rule.speed ?? 60)) % 360;\n }\n\n case 'oscillate': {\n // 振荡:正弦波\n const from = rule.from ?? 0;\n const to = rule.to ?? 1;\n const period = rule.duration ?? 2;\n const t = (Math.sin(this.animTime * (2 * Math.PI / period)) + 1) / 2;\n return from + t * (to - from);\n }\n\n case 'data-driven': {\n // 数据驱动:优先使用 bindingId 查表,其次节点数据,最后全局 dataSignal\n // 编辑器模式:使用 dataSignal 或默认值,不依赖真实数据\n let dataValue: number;\n if (this.isEditorMode) {\n // 编辑器模式:使用模拟值(正弦波)\n dataValue = (Math.sin(this.animTime) + 1) / 2 * 100;\n } else if (rule.bindingId) {\n dataValue = this.getBindingData(rule.bindingId) ?? this.dataSignal;\n } else {\n const dataKey = rule.dataSource;\n dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n }\n const dataMin = rule.dataMin ?? rule.from ?? 0;\n const dataMax = rule.dataMax ?? rule.to ?? 100;\n const valueMin = rule.from ?? 0;\n const valueMax = rule.to ?? 1;\n const t = Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n return valueMin + t * (valueMax - valueMin);\n }\n\n case 'trigger':\n // 触发型:暂不自动处理\n return null;\n\n case 'emissive': {\n // 如果有 bindingId,作为开关控制(值 > threshold 时闪烁)\n // 编辑器模式:忽略 bindingId,直接播放闪烁动画\n if (rule.bindingId && !this.isEditorMode) {\n const switchValue = this.getBindingData(rule.bindingId) ?? 0;\n const threshold = rule.threshold ?? 0.5;\n if (switchValue <= threshold) {\n return null; // 开关关闭,不显示告警\n }\n }\n // 发射光闪烁:正弦波 0-1\n const period = rule.duration ?? 1;\n return (Math.sin(this.animTime * (2 * Math.PI / period)) + 1) / 2;\n }\n\n case 'emissive-constant':\n // 常亮:不需要计算值,直接设置颜色\n return null;\n\n case 'emissive-temperature': {\n // 温度梯度:优先使用 bindingId 查表,其次节点数据,最后全局 dataSignal\n // 编辑器模式:使用模拟值(正弦波)\n let dataValue: number;\n if (this.isEditorMode) {\n // 编辑器模式:使用模拟值(正弦波 0-100)\n dataValue = (Math.sin(this.animTime * 0.5) + 1) / 2 * 100;\n } else if (rule.bindingId) {\n dataValue = this.getBindingData(rule.bindingId) ?? this.dataSignal;\n } else {\n const dataKey = rule.dataSource;\n dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n }\n const dataMin = rule.dataMin ?? rule.from ?? 0;\n const dataMax = rule.dataMax ?? rule.to ?? 100;\n return Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n }\n\n default:\n return null;\n }\n }\n\n /** 全局模拟数据(0-100),可由外部设置 */\n dataSignal = 0;\n\n /** 每节点实时数据:nodeId → { dataKey: value } */\n private nodeDataMap = new Map<string, Record<string, number>>();\n\n /** 按 bindingId 存储实时数据:bindingId → value */\n private bindingDataMap = new Map<string, number>();\n\n /** 设置模拟数据值(用于数据驱动动画测试) */\n setDataSignal(value: number): void {\n this.dataSignal = value;\n }\n\n /** 设置节点实时数据(用于 per-node 数据驱动动画) */\n setData(nodeId: string, data: Record<string, number>): void {\n const existing = this.nodeDataMap.get(nodeId) ?? {};\n this.nodeDataMap.set(nodeId, { ...existing, ...data });\n }\n\n /** 获取节点实时数据值 */\n getNodeData(nodeId: string, key: string): number | undefined {\n return this.nodeDataMap.get(nodeId)?.[key];\n }\n\n /** 按 bindingId 设置实时数据(用于点位绑定) */\n setBindingData(bindingId: string, value: number): void {\n this.bindingDataMap.set(bindingId, value);\n }\n\n /** 获取 bindingId 对应的数据值 */\n getBindingData(bindingId: string): number | undefined {\n return this.bindingDataMap.get(bindingId);\n }\n\n /** 为资产生成缩略图(离屏渲染 512×384) */\n generateThumbnail(assetId: string, model: THREE.Object3D): void {\n // 初始化离屏渲染器\n if (!this.thumbRenderer) {\n this.thumbRenderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, preserveDrawingBuffer: true });\n this.thumbRenderer.setSize(512, 384);\n this.thumbRenderer.setClearColor(0x000000, 0);\n // 添加基础光照\n this.thumbScene.add(new THREE.HemisphereLight(0xffffff, 0x44505e, 1.5));\n const dir = new THREE.DirectionalLight(0xffffff, 2);\n dir.position.set(3, 5, 4);\n this.thumbScene.add(dir);\n }\n\n // 清除旧的缩略图内容\n while (this.thumbScene.children.length > 2) {\n this.thumbScene.remove(this.thumbScene.children[2]);\n }\n\n // 克隆模型放入缩略图场景\n const clone = model.clone();\n this.thumbScene.add(clone);\n\n // 计算包围盒,让模型居中并占满画面\n const box = new THREE.Box3().setFromObject(clone);\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n const maxDim = Math.max(size.x, size.y, size.z);\n\n // 相机距离更近,让模型占满画面约 90%\n const fov = this.thumbCamera.fov * (Math.PI / 180);\n const dist = maxDim / (2 * Math.tan(fov / 2)) * 1.1;\n\n // 相机放在等距斜上方,正对中心\n this.thumbCamera.position.set(center.x + dist * 0.5, center.y + dist * 0.4, center.z + dist * 0.7);\n this.thumbCamera.lookAt(center);\n\n // 渲染并获取 data URL\n this.thumbRenderer.render(this.thumbScene, this.thumbCamera);\n const dataUrl = this.thumbRenderer.domElement.toDataURL('image/png');\n\n this.cb.onThumbnailGenerated?.(assetId, dataUrl);\n }\n\n /** 标记正在 undo/redo,sync() 中据此传 isUndoRedoing 给 applyMaterialOverrides */\n setUndoRedoing(value: boolean): void {\n this._isUndoRedoing = value;\n }\n\n // ── 告警弹窗 ──\n\n /** 显示告警弹窗 */\n showAlarm(nodeId: string, data: AlarmPopupData): void {\n // 如果已有弹窗,先移除\n this.hideAlarm(nodeId);\n\n // 获取节点对象\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n // 创建 Canvas 贴图\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 120;\n const ctx = canvas.getContext('2d')!;\n\n // 根据优先级设置背景颜色\n const bgColor = data.priority === 'high' ? 'rgba(220, 53, 69, 0.9)' :\n data.priority === 'medium' ? 'rgba(255, 140, 0, 0.9)' :\n 'rgba(255, 193, 7, 0.9)';\n\n // 绘制背景\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, 300, 120);\n\n // 绘制边框\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)';\n ctx.lineWidth = 2;\n ctx.strokeRect(1, 1, 298, 118);\n\n // 绘制文本\n ctx.fillStyle = '#ffffff';\n ctx.font = 'bold 16px Arial';\n ctx.fillText(data.deviceName, 10, 25);\n\n ctx.font = '14px Arial';\n ctx.fillText(`告警类型: ${data.alarmType}`, 10, 48);\n ctx.fillText(`当前值: ${data.currentValue.toFixed(1)} / 阈值: ${data.threshold}`, 10, 68);\n\n ctx.font = '12px Arial';\n ctx.fillText(data.suggestion, 10, 90);\n\n // 绘制时间\n const timeStr = new Date(data.timestamp).toLocaleTimeString('zh-CN');\n ctx.fillText(timeStr, 10, 110);\n\n // 创建纹理和 Mesh(billboard 朝向)\n const texture = new THREE.CanvasTexture(canvas);\n const material = new THREE.MeshBasicMaterial({ map: texture, transparent: true, side: THREE.DoubleSide });\n const geometry = new THREE.PlaneGeometry(3, 1.2);\n const mesh = new THREE.Mesh(geometry, material);\n\n // 设置 Mesh 位置(设备上方 2 单位)\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n mesh.position.set(worldPos.x, worldPos.y + 2, worldPos.z);\n\n // 初始面向相机\n mesh.lookAt(this.camera.position);\n\n // 添加到场景\n this.scene.add(mesh);\n this.alarmPopups.set(nodeId, mesh);\n this.alarmCreationTime.set(nodeId, Date.now());\n }\n\n /** 隐藏告警弹窗 */\n hideAlarm(nodeId: string): void {\n const mesh = this.alarmPopups.get(nodeId);\n if (mesh) {\n this.scene.remove(mesh);\n (mesh.material as THREE.MeshBasicMaterial).map?.dispose();\n (mesh.material as THREE.MeshBasicMaterial).dispose();\n mesh.geometry.dispose();\n this.alarmPopups.delete(nodeId);\n this.alarmCreationTime.delete(nodeId);\n }\n }\n\n /** 每帧更新告警弹窗(自动消失 + billboard 朝向) */\n private updateAlarmSprites(): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [nodeId, mesh] of this.alarmPopups) {\n const creationTime = this.alarmCreationTime.get(nodeId);\n if (!creationTime) continue;\n\n // 5 秒后自动消失\n if (now - creationTime > 5000) {\n toRemove.push(nodeId);\n continue;\n }\n\n // billboard:每帧面向相机\n mesh.lookAt(this.camera.position);\n }\n\n // 移除过期的弹窗\n for (const nodeId of toRemove) {\n this.hideAlarm(nodeId);\n }\n }\n\n // ── 看板 ──\n\n /** 同步看板 widget DOM 与数据模型 */\n private syncDashboard(): void {\n if (!this.dashboardOverlayEl) return;\n\n const dashboard = this.store.doc.dashboard;\n const widgets = dashboard?.visible ? (dashboard.widgets || []) : [];\n const activeIds = new Set(widgets.map(w => w.id));\n\n // 移除不再存在的 widget\n for (const [id, el] of this.dashboardElements) {\n if (!activeIds.has(id)) {\n el.remove();\n this.dashboardElements.delete(id);\n // 清理定时器\n const intervalId = this.dashboardIntervals.get(id);\n if (intervalId) {\n clearInterval(intervalId);\n this.dashboardIntervals.delete(id);\n }\n this.dashboardValues.delete(id);\n }\n }\n\n // 创建新增的 widget,更新已存在的 widget\n for (const widget of widgets) {\n const existingEl = this.dashboardElements.get(widget.id);\n if (!existingEl) {\n this.createDashboardWidget(widget);\n } else {\n // 更新已存在的 widget 的样式和内容\n this.applyWidgetStyle(existingEl, widget);\n this.updateWidgetContent(existingEl, widget);\n }\n }\n }\n\n /** 创建单个看板 widget */\n private createDashboardWidget(widget: DashboardWidget): void {\n if (!this.dashboardOverlayEl) return;\n\n const el = document.createElement('div');\n el.className = 'dashboard-widget';\n el.dataset['widgetId'] = widget.id;\n this.applyWidgetStyle(el, widget);\n this.updateWidgetContent(el, widget);\n this.dashboardOverlayEl.appendChild(el);\n this.dashboardElements.set(widget.id, el);\n\n // 初始化数据源\n this.initWidgetDataSource(widget);\n }\n\n /** 应用 widget 样式 */\n private applyWidgetStyle(el: HTMLDivElement, widget: DashboardWidget): void {\n // 基础样式\n el.style.position = 'absolute';\n el.style.background = 'rgba(20, 25, 35, 0.85)';\n el.style.border = '1px solid rgba(79, 131, 204, 0.5)';\n el.style.borderRadius = '8px';\n el.style.padding = '12px';\n el.style.color = '#e0e6ed';\n el.style.fontFamily = 'system-ui, sans-serif';\n el.style.boxSizing = 'border-box';\n\n if (widget.mode === 'screen' && widget.screen) {\n // 屏幕固定模式:百分比定位\n el.style.left = `${widget.screen.x * 100}%`;\n el.style.top = `${widget.screen.y * 100}%`;\n el.style.width = `${widget.screen.width * 100}%`;\n el.style.height = `${widget.screen.height * 100}%`;\n }\n // world 模式在 updateDashboard() 中动态设置 transform\n }\n\n /** 更新 widget 内容 */\n private updateWidgetContent(el: HTMLDivElement, widget: DashboardWidget): void {\n const value = this.dashboardValues.get(widget.id);\n const displayValue = this.formatValue(value, widget);\n\n switch (widget.type) {\n case 'value':\n // 支持多数据点显示\n if (widget.dataPoints && widget.dataPoints.length > 0) {\n const rows = widget.dataPoints.map((dp, i) => {\n const dpValue = this.dashboardValues.get(`${widget.id}_dp${i}`);\n const dpDisplay = this.formatValue(dpValue, { decimals: widget.decimals } as any);\n return `\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 4px 0; border-bottom: 1px solid rgba(255,255,255,0.05);\">\n <span style=\"font-size: 12px; opacity: 0.7;\">${dp.label}</span>\n <span style=\"font-size: 16px; font-weight: 500;\">${dpDisplay}${dp.unit ? `<small style=\"font-size: 11px; opacity: 0.6; margin-left: 2px;\">${dp.unit}</small>` : ''}</span>\n </div>\n `;\n }).join('');\n el.innerHTML = rows;\n } else {\n // 兼容旧的单值模式\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 28px; font-weight: 600;\">${displayValue}</div>\n ${widget.unit ? `<div style=\"font-size: 12px; opacity: 0.6; margin-top: 2px;\">${widget.unit}</div>` : ''}\n `;\n }\n break;\n case 'text':\n el.innerHTML = `<div style=\"font-size: 14px;\">${widget.dataSource?.staticValue || widget.label || ''}</div>`;\n break;\n case 'status':\n const statusColor = this.getStatusColor(value, widget);\n el.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <div style=\"width: 12px; height: 12px; border-radius: 50%; background: ${statusColor};\"></div>\n <div style=\"font-size: 14px;\">${widget.label || ''}</div>\n </div>\n `;\n break;\n case 'progress':\n const progress = this.calcProgress(value, widget);\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 8px;\">${widget.label || ''}</div>\n <div style=\"height: 8px; background: rgba(255,255,255,0.1); border-radius: 4px; overflow: hidden;\">\n <div style=\"height: 100%; width: ${progress}%; background: #4f83cc; transition: width 0.3s;\"></div>\n </div>\n <div style=\"font-size: 12px; text-align: right; margin-top: 4px;\">${displayValue}</div>\n `;\n break;\n case 'gauge':\n // 简化版仪表:只显示数值\n const gaugeProgress = this.calcProgress(value, widget);\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 24px; font-weight: 600; text-align: center;\">${displayValue}</div>\n <div style=\"height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;\">\n <div style=\"height: 100%; width: ${gaugeProgress}%; background: #4f83cc;\"></div>\n </div>\n `;\n break;\n case 'chart':\n // 简化版:显示当前值\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 20px; font-weight: 500;\">${displayValue}</div>\n `;\n break;\n }\n }\n\n /** 初始化 widget 数据源 */\n private initWidgetDataSource(widget: DashboardWidget): void {\n // value 类型支持多数据点\n if (widget.type === 'value' && widget.dataPoints && widget.dataPoints.length > 0) {\n widget.dataPoints.forEach((dp, i) => {\n const key = `${widget.id}_dp${i}`;\n const ds = dp.dataSource;\n if (!ds) {\n // 绑定点模式,值由外部设置\n return;\n }\n if (ds.mode === 'static') {\n this.dashboardValues.set(key, ds.staticValue ?? 0);\n } else if (ds.mode === 'simulated' && ds.simulated) {\n const { type, min, max, interval } = ds.simulated;\n let t = 0;\n const update = () => {\n t += interval / 1000;\n let value: number;\n if (type === 'sine') {\n value = min + (max - min) * (Math.sin(t * 0.5) * 0.5 + 0.5);\n } else {\n value = min + Math.random() * (max - min);\n }\n this.dashboardValues.set(key, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n };\n update();\n const intervalId = window.setInterval(update, interval);\n this.dashboardIntervals.set(key, intervalId);\n } else if (ds.mode === 'api' && ds.api) {\n const { url, field, pollInterval } = ds.api;\n const fetchValue = async () => {\n try {\n const res = await fetch(url);\n const data = await res.json();\n const value = field.split('.').reduce((obj, key) => obj?.[key], data);\n this.dashboardValues.set(key, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n } catch (e) {\n console.error('Dashboard API fetch failed:', e);\n }\n };\n fetchValue();\n const intervalId = window.setInterval(fetchValue, pollInterval);\n this.dashboardIntervals.set(key, intervalId);\n }\n });\n return;\n }\n\n // 其他类型使用原有的 dataSource\n const ds = widget.dataSource;\n if (!ds) return;\n\n if (ds.mode === 'static') {\n this.dashboardValues.set(widget.id, ds.staticValue ?? 0);\n } else if (ds.mode === 'simulated' && ds.simulated) {\n const { type, min, max, interval } = ds.simulated;\n let t = 0;\n const update = () => {\n t += interval / 1000;\n let value: number;\n if (type === 'sine') {\n value = min + (max - min) * (Math.sin(t * 0.5) * 0.5 + 0.5);\n } else {\n value = min + Math.random() * (max - min);\n }\n this.dashboardValues.set(widget.id, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n };\n update();\n const intervalId = window.setInterval(update, interval);\n this.dashboardIntervals.set(widget.id, intervalId);\n } else if (ds.mode === 'api' && ds.api) {\n const { url, field, pollInterval } = ds.api;\n const fetchValue = async () => {\n try {\n const res = await fetch(url);\n const data = await res.json();\n const value = field.split('.').reduce((obj, key) => obj?.[key], data);\n this.dashboardValues.set(widget.id, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n } catch (e) {\n console.error('Dashboard API fetch failed:', e);\n }\n };\n fetchValue();\n const intervalId = window.setInterval(fetchValue, pollInterval);\n this.dashboardIntervals.set(widget.id, intervalId);\n }\n }\n\n /** 格式化显示值 */\n private formatValue(value: number | string | undefined, widget: DashboardWidget): string {\n if (value === undefined) return '--';\n if (typeof value === 'string') return value;\n const decimals = widget.decimals ?? 1;\n return value.toFixed(decimals);\n }\n\n /** 获取状态灯颜色 */\n private getStatusColor(value: number | string | undefined, widget: DashboardWidget): string {\n if (typeof value !== 'number' || !widget.thresholds) return '#4ade80';\n for (let i = widget.thresholds.length - 1; i >= 0; i--) {\n if (value >= widget.thresholds[i].value) return widget.thresholds[i].color;\n }\n return widget.thresholds[0]?.color || '#4ade80';\n }\n\n /** 计算进度百分比 */\n private calcProgress(value: number | string | undefined, widget: DashboardWidget): number {\n if (typeof value !== 'number') return 0;\n const min = widget.min ?? 0;\n const max = widget.max ?? 100;\n return Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n }\n\n /** 每帧更新看板 widget 位置(world 模式) */\n private updateDashboard(): void {\n if (!this.dashboardOverlayEl) return;\n\n const dashboard = this.store.doc.dashboard;\n if (!dashboard?.visible) return;\n\n const rect = this.renderer.domElement.getBoundingClientRect();\n\n for (const widget of dashboard.widgets || []) {\n const el = this.dashboardElements.get(widget.id);\n if (!el) continue;\n\n if (widget.mode === 'world' && widget.world) {\n // 3D → 2D 投影\n const [wx, wy, wz] = widget.world.position;\n const v = new THREE.Vector3(wx, wy, wz);\n v.project(this.camera);\n\n // 相机背面隐藏\n if (v.z > 1) {\n el.style.display = 'none';\n continue;\n }\n el.style.display = '';\n\n // NDC → 屏幕像素\n const x = (v.x * 0.5 + 0.5) * rect.width;\n const y = (-v.y * 0.5 + 0.5) * rect.height;\n\n // 使用百分比大小(相对于视口)\n const screenW = widget.screen?.width ?? 0.15;\n const screenH = widget.screen?.height ?? 0.1;\n el.style.width = `${screenW * 100}%`;\n el.style.height = `${screenH * 100}%`;\n el.style.transform = `translate(-50%, -50%) translate(${x}px, ${y}px)`;\n }\n }\n }\n\n // ── 视觉效果同步与更新 ──\n\n /** 同步视觉效果:创建/更新/销毁 effect 对应的 three.js 对象 */\n private syncEffects(): void {\n const seen = new Set<string>();\n\n for (const n of this.store.doc.nodes) {\n if (!n.effects || n.effects.length === 0) {\n // 节点没有效果,清理旧的效果对象\n this.clearNodeEffects(n.id);\n continue;\n }\n\n let nodeEffects = this.effectObjects.get(n.id);\n if (!nodeEffects) {\n nodeEffects = new Map();\n this.effectObjects.set(n.id, nodeEffects);\n }\n\n const effectIds = new Set<string>();\n for (const effect of n.effects) {\n effectIds.add(effect.id);\n const key = `${n.id}:${effect.id}`;\n\n if (effect.kind === 'uv-animation') {\n // UV 动画不需要创建 Object3D,只需初始化状态\n if (!this.uvAnimStates.has(key)) {\n this.uvAnimStates.set(key, { offsetU: 0, offsetV: 0 });\n }\n // 如果目标材质没有贴图,自动生成一个程序化的流动纹理\n this.ensureFlowTexture(n.id, effect.targetMeshName);\n } else if (effect.kind === 'particle') {\n // 粒子系统\n if (!this.particleSystems.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj) {\n // 添加到场景根节点,避免继承节点缩放\n // 用世界坐标定位发射器位置\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n const rt = new ParticleRuntime(effect, worldPos);\n this.particleSystems.set(key, rt);\n this.scene.add(rt.points);\n rt.points.visible = effect.enabled !== false;\n nodeEffects.set(effect.id, rt.points);\n }\n } else {\n // 更新参数和位置\n const rt = this.particleSystems.get(key)!;\n rt.updateConfig(effect);\n // 更新发射器位置(跟随节点移动)\n const obj = this.objects.get(n.id);\n if (obj) {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n rt.setOrigin(worldPos);\n }\n rt.points.visible = effect.enabled !== false;\n }\n } else if (effect.kind === 'path-particle') {\n // 路径粒子系统\n const effEnabled = effect.enabled !== false;\n if (!this.pathParticleSystems.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj) {\n const rt = new PathParticleRuntime(effect);\n this.pathParticleSystems.set(key, rt);\n obj.add(rt.points);\n rt.points.visible = effEnabled;\n nodeEffects.set(effect.id, rt.points);\n }\n } else {\n const rt = this.pathParticleSystems.get(key)!;\n rt.updateConfig(effect);\n rt.points.visible = effEnabled;\n }\n } else if (effect.kind === 'screen-content') {\n // 屏幕内容切换(大屏贴图轮播)\n if (!this.screenContentStates.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj && effect.images.length > 0) {\n // 初始化:加载第一张图片\n const state = { intervalId: 0, currentIndex: 0, targetMeshName: effect.targetMeshName };\n this.screenContentStates.set(key, state);\n this.updateScreenContent(n.id, effect, state);\n // 设置定时器轮播\n if (effect.autoPlay && effect.interval > 0) {\n state.intervalId = window.setInterval(() => {\n state.currentIndex = (state.currentIndex + 1) % effect.images.length;\n this.updateScreenContent(n.id, effect, state);\n }, effect.interval);\n }\n }\n } else {\n // 更新已有状态\n const state = this.screenContentStates.get(key)!;\n // 清除旧定时器\n if (state.intervalId) {\n window.clearInterval(state.intervalId);\n }\n // 重新设置定时器\n if (effect.autoPlay && effect.interval > 0 && effect.images.length > 0) {\n state.intervalId = window.setInterval(() => {\n state.currentIndex = (state.currentIndex + 1) % effect.images.length;\n this.updateScreenContent(n.id, effect, state);\n }, effect.interval);\n }\n state.targetMeshName = effect.targetMeshName;\n }\n }\n\n seen.add(key);\n }\n\n // 管道透明度:收集所有 path-particle 效果,取最小 pipeOpacity(至少一个启用则生效)\n let bestPipeOpacity = -1;\n for (const effect of n.effects) {\n if (effect.kind !== 'path-particle') continue;\n if (effect.enabled === false) continue;\n const po = effect.pipeOpacity ?? 0.9;\n if (bestPipeOpacity < 0 || po < bestPipeOpacity) bestPipeOpacity = po;\n }\n if (bestPipeOpacity >= 0) {\n this.setPipeTransparency(n.id, bestPipeOpacity);\n } else {\n this.restorePipeTransparency(n.id);\n }\n\n // 清理该节点已删除的效果\n for (const [effectId, obj] of [...nodeEffects]) {\n if (!effectIds.has(effectId)) {\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Points) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n nodeEffects.delete(effectId);\n const key = `${n.id}:${effectId}`;\n this.particleSystems.delete(key);\n this.pathParticleSystems.delete(key);\n this.uvAnimStates.delete(key);\n // 清除屏幕内容切换定时器\n const screenState = this.screenContentStates.get(key);\n if (screenState?.intervalId) {\n window.clearInterval(screenState.intervalId);\n }\n this.screenContentStates.delete(key);\n }\n }\n }\n\n // 清理已删除节点的特效\n for (const [nodeId, nodeEffects] of [...this.effectObjects]) {\n if (!this.store.node(nodeId)) {\n this.clearNodeEffects(nodeId);\n }\n }\n }\n\n /** 清理节点的所有效果 */\n private clearNodeEffects(nodeId: string): void {\n const nodeEffects = this.effectObjects.get(nodeId);\n if (!nodeEffects) return;\n for (const [effectId, obj] of nodeEffects) {\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Points) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n const key = `${nodeId}:${effectId}`;\n this.particleSystems.delete(key);\n this.pathParticleSystems.delete(key);\n this.uvAnimStates.delete(key);\n // 清除屏幕内容切换定时器\n const screenState = this.screenContentStates.get(key);\n if (screenState?.intervalId) {\n window.clearInterval(screenState.intervalId);\n }\n this.screenContentStates.delete(key);\n }\n this.effectObjects.delete(nodeId);\n // 恢复管道原始不透明度\n this.restorePipeTransparency(nodeId);\n }\n\n /** 设置管道半透明(水流效果激活时调用) */\n private setPipeTransparency(nodeId: string, pipeOpacity: number): void {\n // pipeOpacity = 1 表示不需要透明化\n if (pipeOpacity >= 1) {\n this.restorePipeTransparency(nodeId);\n return;\n }\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const backups = this.pipeTransparencyBackup.get(nodeId);\n if (!backups) {\n // 首次:备份原始值并设置透明度\n const newBackups: { mesh: THREE.Mesh; material: THREE.Material; originalOpacity: number; originalDepthWrite: boolean }[] = [];\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n const mat = child.material as THREE.MeshStandardMaterial;\n if (mat.transparent && mat.opacity < 1) return;\n newBackups.push({ mesh: child, material: mat, originalOpacity: mat.opacity, originalDepthWrite: mat.depthWrite });\n mat.transparent = true;\n mat.opacity = pipeOpacity;\n mat.depthWrite = false; // 不写深度缓冲,避免管道内表面遮挡水流粒子\n mat.needsUpdate = true;\n });\n if (newBackups.length > 0) {\n this.pipeTransparencyBackup.set(nodeId, newBackups);\n }\n } else {\n // 已有备份:恢复到原始值后再设置新的透明度\n for (const { material, originalOpacity } of backups) {\n const mat = material as THREE.MeshStandardMaterial;\n mat.opacity = originalOpacity;\n if (originalOpacity >= 1) mat.transparent = false;\n mat.transparent = true;\n mat.opacity = pipeOpacity;\n mat.depthWrite = false;\n mat.needsUpdate = true;\n }\n }\n }\n\n /** 恢复管道原始不透明度 */\n private restorePipeTransparency(nodeId: string): void {\n const backups = this.pipeTransparencyBackup.get(nodeId);\n if (!backups) return;\n for (const { material, originalOpacity, originalDepthWrite } of backups) {\n const mat = material as THREE.MeshStandardMaterial;\n mat.opacity = originalOpacity;\n mat.depthWrite = originalDepthWrite;\n if (originalOpacity >= 1) {\n mat.transparent = false;\n }\n mat.needsUpdate = true;\n }\n this.pipeTransparencyBackup.delete(nodeId);\n }\n\n /** 确保目标 mesh 有流动贴图(程序化生成) */\n private ensureFlowTexture(nodeId: string, targetMeshName?: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const applyFlowTexture = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n // 已有贴图则跳过\n if (mat.map) return;\n\n // 创建程序化的流动纹理(渐变条纹,沿 V 方向流动)\n const canvas = document.createElement('canvas');\n canvas.width = 64;\n canvas.height = 256; // 纵向长,沿管道轴向\n const ctx = canvas.getContext('2d')!;\n\n // 背景色(深蓝色管道)\n ctx.fillStyle = '#0a2a5e';\n ctx.fillRect(0, 0, 64, 256);\n\n // 流动光带(渐变)\n const gradient = ctx.createLinearGradient(0, 0, 0, 256);\n gradient.addColorStop(0, 'rgba(90, 158, 255, 0)');\n gradient.addColorStop(0.3, 'rgba(90, 158, 255, 0.3)');\n gradient.addColorStop(0.5, 'rgba(150, 200, 255, 0.8)');\n gradient.addColorStop(0.7, 'rgba(90, 158, 255, 0.3)');\n gradient.addColorStop(1, 'rgba(90, 158, 255, 0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 256);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n texture.repeat.set(1, 4); // 沿 V 方向重复 4 次(管道轴向)\n\n mat.map = texture;\n mat.needsUpdate = true;\n };\n\n if (targetMeshName) {\n obj.traverse(child => {\n if (child.name === targetMeshName) applyFlowTexture(child);\n });\n } else {\n obj.traverse(applyFlowTexture);\n }\n }\n\n /** 更新屏幕内容贴图 */\n private updateScreenContent(nodeId: string, effect: ScreenContentEffect, state: { currentIndex: number; targetMeshName?: string }): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n if (effect.images.length === 0) return;\n\n const imageUrl = effect.images[state.currentIndex];\n if (!imageUrl) return;\n\n // 使用 TextureLoader 加载 base64 图片\n const loader = new THREE.TextureLoader();\n loader.load(\n imageUrl,\n (texture) => {\n texture.colorSpace = THREE.SRGBColorSpace;\n\n const applyTexture = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n\n const geom = mesh.geometry as THREE.BoxGeometry;\n if (geom && geom.type === 'BoxGeometry') {\n // Box 几何体:创建正面 Plane 子网格来显示贴图\n // 先移除旧的 screenPlane(如果存在)\n const oldPlane = mesh.getObjectByName('__screenPlane');\n if (oldPlane) {\n mesh.remove(oldPlane);\n const oldMat = (oldPlane as THREE.Mesh).material as THREE.MeshStandardMaterial;\n if (oldMat.map) oldMat.map.dispose();\n oldMat.dispose();\n (oldPlane as THREE.Mesh).geometry.dispose();\n }\n\n // Plane 是 mesh 的子节点,继承父级 scale,所以用几何体本地单位尺寸即可\n const geomSize = new THREE.Vector3();\n geom.computeBoundingBox();\n geom.boundingBox!.getSize(geomSize);\n\n // 在正面(+Z 面)创建一个 Plane 网格\n const planeGeom = new THREE.PlaneGeometry(geomSize.x, geomSize.y);\n const planeMat = new THREE.MeshStandardMaterial({\n map: texture,\n color: '#ffffff',\n roughness: 0.3,\n metalness: 0.1,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n });\n const plane = new THREE.Mesh(planeGeom, planeMat);\n plane.name = '__screenPlane';\n // 用世界空间偏移 / 父级 scale 得到局部空间偏移,确保至少 0.01 世界单位\n const worldOffset = 0.01;\n plane.position.z = geomSize.z / 2 + worldOffset / Math.abs(mesh.scale.z);\n mesh.add(plane);\n } else {\n // 非 Box 几何体:直接贴图到所有面\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.map) {\n mat.map.dispose();\n }\n mat.map = texture;\n mat.color.set('#ffffff');\n mat.needsUpdate = true;\n }\n };\n\n if (state.targetMeshName) {\n obj.traverse(child => {\n if (child.name === state.targetMeshName) applyTexture(child);\n });\n } else {\n obj.traverse(applyTexture);\n }\n },\n undefined,\n (err) => {\n console.error(`[ScreenContent] 图片加载失败:`, err);\n }\n );\n }\n\n /** 每帧更新所有视觉效果 */\n private updateEffects(dt: number): void {\n if (this.animationFrozen) return;\n\n // UV 动画\n for (const n of this.store.doc.nodes) {\n if (!n.effects) continue;\n for (const effect of n.effects) {\n if (effect.kind !== 'uv-animation' || !effect.enabled) continue;\n const key = `${n.id}:${effect.id}`;\n const state = this.uvAnimStates.get(key);\n if (!state) continue;\n\n // 更新 UV offset\n state.offsetU += effect.speedU * dt;\n state.offsetV += effect.speedV * dt;\n\n // 应用到目标 mesh 的贴图\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n\n const applyToMesh = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (!mat.map) return;\n mat.map.offset.set(state.offsetU, state.offsetV);\n mat.map.needsUpdate = true;\n };\n\n if (effect.targetMeshName) {\n obj.traverse(child => {\n if (child.name === effect.targetMeshName) applyToMesh(child);\n });\n } else {\n obj.traverse(applyToMesh);\n }\n }\n }\n\n // 粒子系统\n for (const [key, rt] of this.particleSystems) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (!node) continue;\n const effect = node.effects?.find(e => e.id === effectId);\n if (!effect || effect.kind !== 'particle' || !effect.enabled) continue;\n rt.update(dt);\n }\n\n // 路径粒子系统\n for (const [key, rt] of this.pathParticleSystems) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (!node) continue;\n const effect = node.effects?.find(e => e.id === effectId);\n if (!effect || effect.kind !== 'path-particle' || !effect.enabled) continue;\n rt.update(dt);\n }\n }\n\n dispose(): void {\n this.unsubDoc();\n this.unsubSel();\n this.ro.disconnect();\n // 移除键盘监听\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n this.renderer.setAnimationLoop(null);\n this.orbit.dispose();\n this.gizmo.dispose();\n // 清理视觉效果\n for (const rt of this.particleSystems.values()) {\n rt.dispose();\n }\n this.particleSystems.clear();\n for (const rt of this.pathParticleSystems.values()) {\n rt.dispose();\n }\n this.pathParticleSystems.clear();\n this.uvAnimStates.clear();\n this.pipeTransparencyBackup.clear();\n // 清理路径编辑器\n this.pathEditor.dispose();\n for (const nodeEffects of this.effectObjects.values()) {\n for (const obj of nodeEffects.values()) {\n obj.parent?.remove(obj);\n }\n }\n this.effectObjects.clear();\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n }\n this.objects.clear();\n for (const h of this.helpers.values()) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n this.helpers.clear();\n for (const h of this.lightHelpers.values()) {\n if (h instanceof THREE.DirectionalLightHelper) h.dispose();\n if (h instanceof THREE.SpotLightHelper) h.dispose();\n if (h instanceof THREE.Mesh) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n this.lightHelpers.clear();\n this.lightTargets.clear();\n // 清理看板 DOM 和定时器\n for (const el of this.dashboardElements.values()) {\n el.remove();\n }\n this.dashboardElements.clear();\n for (const id of this.dashboardIntervals.values()) {\n clearInterval(id);\n }\n this.dashboardIntervals.clear();\n this.dashboardValues.clear();\n this.clearHdri();\n this.disposeRoom();\n this.composer.dispose();\n this.renderer.dispose();\n this.renderer.domElement.remove();\n }\n\n private createMesh(n: NodeDoc): THREE.Mesh {\n const geometry =\n n.primitive === 'sphere'\n ? new THREE.SphereGeometry(0.6, 32, 16)\n : n.primitive === 'cylinder'\n ? new THREE.CylinderGeometry(0.5, 0.5, 1.2, 32)\n : new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({\n color: PRIMITIVE_COLORS[n.primitive] ?? 0x888888,\n metalness: 0.1,\n roughness: 0.7,\n });\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData['id'] = n.id;\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n return mesh;\n }\n\n /** 判断对象是否为灯光 */\n private isLight(obj: THREE.Object3D): boolean {\n return obj instanceof THREE.Light;\n }\n\n /** 根据节点数据创建灯光对象 */\n private createLight(n: NodeDoc): THREE.Light {\n const color = new THREE.Color(n.lightColor ?? '#ffffff');\n const intensity = n.lightIntensity ?? 1;\n let light: THREE.Light;\n\n switch (n.lightType) {\n case 'ambient':\n light = new THREE.AmbientLight(color, intensity);\n break;\n case 'directional': {\n const dir = new THREE.DirectionalLight(color, intensity);\n dir.castShadow = n.lightCastShadow ?? false;\n if (dir.castShadow) {\n dir.shadow.mapSize.set(2048, 2048);\n dir.shadow.camera.near = 0.5;\n dir.shadow.camera.far = 50;\n dir.shadow.camera.left = -15;\n dir.shadow.camera.right = 15;\n dir.shadow.camera.top = 15;\n dir.shadow.camera.bottom = -15;\n dir.shadow.bias = -0.0005;\n dir.shadow.normalBias = 0.02;\n }\n // 创建目标点\n const target = new THREE.Object3D();\n target.userData['id'] = n.id + '_target';\n if (n.lightTarget) {\n target.position.set(...n.lightTarget);\n } else {\n target.position.set(0, 0, 0);\n }\n this.lightTargets.set(n.id, target);\n dir.target = target;\n this.scene.add(target);\n light = dir;\n break;\n }\n case 'point':\n light = new THREE.PointLight(color, intensity, n.lightDistance ?? 50, n.lightDecay ?? 1.5);\n break;\n case 'spot': {\n const spot = new THREE.SpotLight(color, intensity);\n spot.angle = n.lightAngle ?? (Math.PI / 4);\n spot.penumbra = n.lightPenumbra ?? 0.3;\n spot.distance = n.lightDistance ?? 50;\n spot.decay = n.lightDecay ?? 1.5;\n spot.castShadow = n.lightCastShadow ?? false;\n if (spot.castShadow) {\n spot.shadow.mapSize.set(1024, 1024);\n spot.shadow.camera.near = 0.5;\n spot.shadow.camera.far = 50;\n spot.shadow.bias = -0.0005;\n spot.shadow.normalBias = 0.02;\n }\n // 创建目标点\n const target = new THREE.Object3D();\n target.userData['id'] = n.id + '_target';\n if (n.lightTarget) {\n target.position.set(...n.lightTarget);\n } else {\n target.position.set(0, 0, 0);\n }\n this.lightTargets.set(n.id, target);\n spot.target = target;\n this.scene.add(target);\n light = spot;\n break;\n }\n default:\n light = new THREE.PointLight(color, intensity, 0, 2);\n }\n light.userData['id'] = n.id;\n // 创建不可见的拾取球(让灯光在视口中可点击选中)\n const picker = new THREE.Mesh(\n new THREE.SphereGeometry(0.3, 8, 6),\n new THREE.MeshBasicMaterial({ visible: false }),\n );\n picker.userData['id'] = n.id;\n this.lightPickers.set(n.id, picker);\n this.scene.add(picker);\n return light;\n }\n\n /** 更新灯光属性(不改变位置) */\n private updateLightProperties(light: THREE.Light, n: NodeDoc): void {\n const color = new THREE.Color(n.lightColor ?? '#ffffff');\n light.color.copy(color);\n light.intensity = n.lightIntensity ?? 1;\n\n if (light instanceof THREE.PointLight) {\n light.distance = n.lightDistance ?? 50;\n light.decay = n.lightDecay ?? 1.5;\n }\n if (light instanceof THREE.SpotLight) {\n light.angle = n.lightAngle ?? (Math.PI / 4);\n light.penumbra = n.lightPenumbra ?? 0.3;\n light.distance = n.lightDistance ?? 50;\n light.decay = n.lightDecay ?? 1.5;\n light.castShadow = n.lightCastShadow ?? false;\n const target = this.lightTargets.get(n.id);\n if (target && n.lightTarget) {\n target.position.set(...n.lightTarget);\n }\n }\n if (light instanceof THREE.DirectionalLight) {\n light.castShadow = n.lightCastShadow ?? false;\n const target = this.lightTargets.get(n.id);\n if (target && n.lightTarget) {\n target.position.set(...n.lightTarget);\n }\n }\n }\n\n /** 异步加载资产(从 URL,包括 blob URL) */\n private loadAsset(nodeId: string): void {\n const node = this.store.node(nodeId);\n if (!node) {\n // 节点已不存在(可能被撤销),从等待列表中移除\n for (const [, nodeIds] of this.pendingAssetNodes) {\n nodeIds.delete(nodeId);\n }\n return;\n }\n\n const url = node.assetUrl;\n if (!url) {\n console.warn('资产节点缺少 assetUrl:', nodeId);\n return;\n }\n\n // 检查缓存\n const cached = this.assetCache.get(url);\n if (cached) {\n this.applyAssetToNode(nodeId, cached);\n // 加载完成,清理等待列表\n this.pendingAssetNodes.delete(url);\n return;\n }\n\n // 如果 URL 正在加载中,将当前节点加入等待列表\n if (this.loadingAssetUrls.has(url)) {\n let pending = this.pendingAssetNodes.get(url);\n if (!pending) {\n pending = new Set();\n this.pendingAssetNodes.set(url, pending);\n }\n pending.add(nodeId);\n return;\n }\n this.loadingAssetUrls.add(url);\n\n // 根据格式选择加载器\n const fmt = node.assetFormat?.toLowerCase();\n if (fmt === 'obj') {\n this.loadObj(nodeId, url, node.assetMtlUrl).finally(() => {\n this.loadingAssetUrls.delete(url);\n this.pendingAssetNodes.delete(url);\n });\n } else {\n this.loadGltf(nodeId, url).finally(() => {\n this.loadingAssetUrls.delete(url);\n this.pendingAssetNodes.delete(url);\n });\n }\n }\n\n /** 创建红色占位线框 */\n private createPlaceholder(nodeId: string): void {\n const placeholder = new THREE.Mesh(\n new THREE.BoxGeometry(0.5, 0.5, 0.5),\n new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true }),\n );\n placeholder.userData['id'] = nodeId;\n const existingObj = this.objects.get(nodeId);\n if (existingObj) {\n if (existingObj.parent) {\n existingObj.parent.add(placeholder);\n existingObj.parent.remove(existingObj);\n } else {\n this.scene.add(placeholder);\n }\n this.objects.set(nodeId, placeholder);\n } else {\n this.scene.add(placeholder);\n this.objects.set(nodeId, placeholder);\n }\n }\n\n /** 创建带 Draco 解码器的 GLTFLoader */\n private createGltfLoader(): GLTFLoader {\n const loader = new GLTFLoader();\n const dracoLoader = new DRACOLoader();\n // 使用本地托管的 Draco 解码器(从 public/draco/gltf/ 提供)\n dracoLoader.setDecoderPath('/draco/gltf/');\n loader.setDRACOLoader(dracoLoader);\n return loader;\n }\n\n /** 加载 GLTF/GLB */\n private async loadGltf(nodeId: string, url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (gltf: any) => {\n const cached = this.assetCache.get(url);\n if (!cached) {\n this.assetCache.set(url, gltf.scene);\n }\n // 应用到原始节点(如果还在)\n this.applyAssetToNode(nodeId, gltf.scene);\n // 应用到所有等待同一 URL 的节点(处理 undo→redo 竞态)\n const pending = this.pendingAssetNodes.get(url);\n if (pending) {\n for (const pendingId of pending) {\n if (pendingId !== nodeId && this.store.node(pendingId)) {\n this.applyAssetToNode(pendingId, gltf.scene);\n }\n }\n }\n // 通知 UI 刷新(材质面板需要显示 mesh 列表)\n this.store.notifyChanged();\n resolve();\n },\n undefined,\n (error: unknown) => {\n console.error('加载 GLTF 失败:', url, error);\n reject(error);\n },\n );\n });\n }\n\n /** 加载 OBJ + 可选 MTL */\n private async loadObj(nodeId: string, url: string, mtlUrl?: string): Promise<void> {\n return new Promise(async (resolve, reject) => {\n try {\n // 读取 OBJ 文件为 ArrayBuffer,自动检测编码(UTF-8 / GBK)\n const objBuffer = await fetch(url).then(r => r.arrayBuffer());\n const objText = this.decodeText(objBuffer, 'OBJ');\n\n const loadObjWithMaterials = (materials?: any) => {\n const objLoader = new OBJLoader();\n if (materials) objLoader.setMaterials(materials);\n const obj = objLoader.parse(objText);\n this.assetCache.set(url, obj);\n this.applyAssetToNode(nodeId, obj);\n // 应用到所有等待同一 URL 的节点(处理 undo→redo 竞态)\n const pending = this.pendingAssetNodes.get(url);\n if (pending) {\n for (const pendingId of pending) {\n if (pendingId !== nodeId && this.store.node(pendingId)) {\n this.applyAssetToNode(pendingId, obj);\n }\n }\n }\n this.store.notifyChanged();\n resolve();\n };\n\n if (mtlUrl) {\n // MTL 文件也需要自动检测编码\n try {\n const mtlBuffer = await fetch(mtlUrl).then(r => r.arrayBuffer());\n const mtlText = this.decodeText(mtlBuffer, 'MTL');\n const mtlLoader = new MTLLoader();\n const materials = mtlLoader.parse(mtlText, '');\n materials.preload();\n loadObjWithMaterials(materials);\n } catch {\n // MTL 加载失败,无材质加载 OBJ\n loadObjWithMaterials(undefined);\n }\n } else {\n loadObjWithMaterials(undefined);\n }\n } catch (error) {\n console.error('加载 OBJ 失败:', url, error);\n reject(error);\n }\n });\n }\n\n /** 解码文本,自动检测 UTF-8 或 GBK 编码(处理中文 mesh 名称乱码) */\n private decodeText(buffer: ArrayBuffer, label: string = ''): string {\n const logPrefix = '[decodeText' + (label ? ':' + label : '') + ']';\n // 先尝试 UTF-8(严格模式,遇到无效序列抛异常)\n try {\n const utf8Decoder = new TextDecoder('utf-8', { fatal: true });\n const utf8Text = utf8Decoder.decode(buffer);\n console.log(logPrefix + ' UTF-8 解码成功,长度=' + utf8Text.length);\n return utf8Text;\n } catch (e) {\n console.log(logPrefix + ' UTF-8 解码失败,尝试 GBK 解码');\n }\n // UTF-8 失败,用 GBK(GB18030 兼容 GBK/ANSI)\n try {\n const gbkDecoder = new TextDecoder('gb18030', { fatal: true });\n const gbkText = gbkDecoder.decode(buffer);\n console.log(logPrefix + ' GBK 解码成功,文本预览:', gbkText.substring(0, 200));\n return gbkText;\n } catch (e) {\n console.warn(logPrefix + ' GBK 解码也失败,使用 UTF-8 非严格模式');\n const utf8Decoder = new TextDecoder('utf-8', { fatal: false });\n return utf8Decoder.decode(buffer);\n }\n }\n\n /** 将加载的资产模型应用到节点 */\n private applyAssetToNode(nodeId: string, assetScene: THREE.Group): void {\n const node = this.store.node(nodeId);\n if (!node) return;\n\n const clone = assetScene.clone(true);\n clone.userData['id'] = nodeId;\n // 彻底断开材质共享:clone(true) 不会 clone 材质(只是引用复制),\n // 需要给每个 mesh 都分配独立材质副本,避免跨节点/跨 mesh 共享\n clone.traverse(child => {\n if (child instanceof THREE.Mesh) {\n child.userData['id'] = nodeId;\n child.castShadow = true;\n child.receiveShadow = true;\n const mat = child.material as THREE.Material;\n if (mat) {\n child.material = mat.clone();\n }\n }\n });\n\n // 将 pivot 校正到几何中心:把子对象整体反向偏移 -center\n // 这样外层 clone 的 pivot 就落在几何中心,旋转/缩放/吸附都以此为基准\n const box = new THREE.Box3().setFromObject(clone);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n if (center.lengthSq() > 1e-6) {\n for (const child of clone.children) {\n child.position.sub(center);\n }\n }\n }\n\n // 替换占位对象\n const oldObj = this.objects.get(nodeId);\n if (oldObj) {\n if (this.store.selection[0] === nodeId) this.gizmo.detach();\n // 将旧对象的子级(效果对象如粒子、路径编辑器可视化)转移到新模型上\n const childrenToMove: THREE.Object3D[] = [];\n oldObj.children.forEach(child => {\n // 转移效果对象(Points、Line)和路径编辑器控制点(Mesh with userData.isPathHandle)\n if (child instanceof THREE.Points ||\n child instanceof THREE.Line ||\n (child instanceof THREE.Mesh && child.userData['isPathHandle'])) {\n childrenToMove.push(child);\n }\n });\n // oldObj 可能是 sync() 创建的占位 Object3D(没添加到场景,parent 为 null)\n if (oldObj.parent) {\n oldObj.parent.add(clone);\n oldObj.parent.remove(oldObj);\n } else {\n this.scene.add(clone);\n }\n // 将效果对象添加到新模型\n for (const child of childrenToMove) {\n clone.add(child);\n }\n if (oldObj instanceof THREE.Mesh && oldObj.material instanceof THREE.MeshBasicMaterial) {\n oldObj.geometry.dispose();\n (oldObj.material as THREE.Material).dispose();\n }\n } else {\n this.scene.add(clone);\n }\n this.objects.set(nodeId, clone);\n\n clone.position.set(...node.position);\n clone.rotation.set(node.rotation[0] * DEG2RAD, node.rotation[1] * DEG2RAD, node.rotation[2] * DEG2RAD);\n clone.scale.set(...node.scale);\n clone.visible = node.visible;\n clone.userData['assetLoaded'] = true;\n\n // 层级关系\n const parent = this.store.parentOf(nodeId);\n const target = (parent && this.objects.get(parent.id)) || this.scene;\n if (clone.parent !== target) {\n clone.parent?.remove(clone);\n target.add(clone);\n }\n\n if (this.store.selection[0] === nodeId) this.refreshSelection();\n\n // 继承同资产其他节点的材质覆盖(仅当节点自己没有覆盖时才继承,找最后一个即最新创建的)\n if (node.assetId && (!node.materialOverrides || Object.keys(node.materialOverrides).length === 0)) {\n const nodes = this.store.doc.nodes;\n for (let i = nodes.length - 1; i >= 0; i--) {\n const n = nodes[i];\n if (n.id !== nodeId && n.assetId === node.assetId && n.materialOverrides && Object.keys(n.materialOverrides).length > 0) {\n node.materialOverrides = JSON.parse(JSON.stringify(n.materialOverrides));\n console.log(`[applyAssetToNode] ${nodeId}: 继承同资产节点 ${n.id} 的材质覆盖`);\n break;\n }\n }\n }\n\n // 在应用材质覆盖前,先保存所有 mesh 的原始材质\n this.saveAllOriginalMaterials(nodeId);\n this.applyMaterialOverrides(nodeId);\n\n // 强制所有贴图上传到 GPU(GLTFLoader 加载后 needsUpdate 可能未设置)\n clone.traverse((child: any) => {\n if (child.material) {\n const mats = Array.isArray(child.material) ? child.material : [child.material];\n for (const mat of mats) {\n if (mat.map) mat.map.needsUpdate = true;\n if (mat.normalMap) mat.normalMap.needsUpdate = true;\n if (mat.roughnessMap) mat.roughnessMap.needsUpdate = true;\n if (mat.metalnessMap) mat.metalnessMap.needsUpdate = true;\n if (mat.emissiveMap) mat.emissiveMap.needsUpdate = true;\n mat.needsUpdate = true;\n }\n }\n });\n\n // 生成缩略图(传 assetId 而非 nodeId,便于后端更新元数据)\n const assetId = node.assetId;\n if (assetId) {\n this.generateThumbnail(assetId, clone);\n }\n }\n\n /** 确保所有 mesh 都有 name(供其他方法调用) */\n private ensureMeshNames(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n let unnamedIndex = 0;\n obj.traverse(child => {\n if (child instanceof THREE.Mesh && !child.name) {\n child.name = `mesh_${unnamedIndex++}`;\n }\n });\n }\n\n /** 获取资产节点的 mesh 名称列表 */\n getMeshNames(nodeId: string): string[] {\n // 先确保所有 mesh 都有 name\n this.ensureMeshNames(nodeId);\n const obj = this.objects.get(nodeId);\n if (!obj) return [];\n const names: string[] = [];\n obj.traverse(child => {\n if (child instanceof THREE.Mesh && child.name) {\n names.push(child.name);\n }\n });\n return names;\n }\n\n /** 获取节点的包围盒信息(世界坐标) */\n getNodeBounds(nodeId: string): { center: [number, number, number]; size: [number, number, number] } | null {\n const obj = this.objects.get(nodeId);\n if (!obj) return null;\n\n const box = new THREE.Box3();\n box.setFromObject(obj);\n\n if (box.isEmpty()) return null;\n\n const center = new THREE.Vector3();\n const size = new THREE.Vector3();\n box.getCenter(center);\n box.getSize(size);\n\n return {\n center: [center.x, center.y, center.z],\n size: [size.x, size.y, size.z],\n };\n }\n\n /** 应用材质覆盖到指定节点(含处理覆盖移除 — 恢复原始材质) */\n applyMaterialOverrides(nodeId: string, isUndoRedoing: boolean = false): void {\n const node = this.store.node(nodeId);\n if (!node) return;\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const overrides = node.materialOverrides ?? {};\n // 整体覆盖(key 为空字符串)\n const globalOverride = overrides[''];\n\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n let mat = child.material as THREE.MeshStandardMaterial;\n if (!mat) return;\n\n // OBJ 加载的可能是 MeshPhongMaterial/MeshLambertMaterial,转换为 MeshStandardMaterial\n if (!(mat instanceof THREE.MeshStandardMaterial)) {\n const oldMat = mat as any;\n const newMat = new THREE.MeshStandardMaterial();\n if (oldMat.color) newMat.color.copy(oldMat.color);\n if (oldMat.opacity !== undefined) newMat.opacity = oldMat.opacity;\n if (oldMat.transparent !== undefined) newMat.transparent = oldMat.transparent;\n if (oldMat.emissive) newMat.emissive.copy(oldMat.emissive);\n if (oldMat.map) newMat.map = oldMat.map;\n child.material = newMat;\n mat = newMat;\n }\n\n // 优先级:子部件覆盖 > 整体覆盖 > 原始材质\n const override = overrides[child.name] || globalOverride;\n\n // undo/redo 时:先从保存的真正原始状态恢复,再应用当前 override\n // 确保每次 undo/redo 都从干净的原始状态开始,避免残留上一步的修改\n if (isUndoRedoing) {\n this.resetMaterialToOriginal(nodeId, child.name, mat);\n }\n\n if (override) {\n // 首次覆盖前,保存原始材质(仅首次保存,不覆盖)\n this.saveOriginalMaterials(nodeId, child.name, mat, child.visible);\n // 应用颜色/数值属性\n if (override.useBaseColor === false && override.map) {\n mat.color.set('#ffffff');\n } else if (override.color !== undefined) {\n mat.color.set(override.color);\n }\n if (override.opacity !== undefined) {\n mat.opacity = override.opacity;\n mat.transparent = override.opacity < 1;\n }\n if (override.roughness !== undefined) mat.roughness = override.roughness;\n if (override.metalness !== undefined) mat.metalness = override.metalness;\n if (override.emissive !== undefined) mat.emissive.set(override.emissive);\n if (override.visible !== undefined) child.visible = override.visible;\n // 应用贴图\n this.applyTexture(mat, 'map', override.map);\n this.applyTexture(mat, 'normalMap', override.normalMap);\n this.applyTexture(mat, 'roughnessMap', override.roughnessMap);\n this.applyTexture(mat, 'metalnessMap', override.metalnessMap);\n this.applyTexture(mat, 'emissiveMap', override.emissiveMap);\n mat.needsUpdate = true;\n } else if (!isUndoRedoing) {\n // 非 undo/redo 且无覆盖时,恢复原始材质\n this.resetMaterialToOriginal(nodeId, child.name, mat);\n }\n });\n }\n\n /** 加载或获取缓存的贴图,应用到材质 */\n private applyTexture(mat: THREE.MeshStandardMaterial, prop: string, dataUrl: string | undefined): void {\n if (dataUrl === undefined) return; // override 未指定该贴图,保持原样\n if (!dataUrl) {\n // 显式清空贴图\n (mat as any)[prop] = null;\n return;\n }\n let tex = this.textureCache.get(dataUrl);\n if (!tex) {\n tex = this.textureLoader.load(dataUrl);\n tex.colorSpace = prop === 'map' || prop === 'emissiveMap'\n ? THREE.SRGBColorSpace\n : THREE.LinearSRGBColorSpace;\n this.textureCache.set(dataUrl, tex);\n }\n (mat as any)[prop] = tex;\n }\n\n /** 保存 mesh 的原始材质(仅首次保存,后续调用不覆盖) */\n private saveOriginalMaterials(nodeId: string, meshName: string, mat: THREE.MeshStandardMaterial, visible: boolean = true): void {\n let nodeMats = this.originalMaterials.get(nodeId);\n if (!nodeMats) {\n nodeMats = {};\n this.originalMaterials.set(nodeId, nodeMats);\n }\n // 仅首次保存 — 保存模型加载后、任何 override 之前的真正原始状态\n if (nodeMats[meshName]) return;\n nodeMats[meshName] = {\n color: '#' + mat.color.getHexString(),\n opacity: mat.opacity,\n transparent: mat.transparent,\n roughness: mat.roughness,\n metalness: mat.metalness,\n emissive: '#' + mat.emissive.getHexString(),\n visible: visible,\n map: mat.map ?? null,\n normalMap: mat.normalMap ?? null,\n roughnessMap: mat.roughnessMap ?? null,\n metalnessMap: mat.metalnessMap ?? null,\n emissiveMap: mat.emissiveMap ?? null,\n };\n }\n\n /** 隔离显示子部件:其他部件隐藏 */\n isolateSubMesh(nodeId: string, meshName: string): void {\n // 先确保所有 mesh 都有 name\n this.ensureMeshNames(nodeId);\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n // 只修改 visible,不修改 opacity(避免材质共享问题)\n child.visible = (child.name === meshName);\n });\n }\n\n /** 退出隔离显示:恢复所有部件到正常状态 */\n exitIsolation(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n // 先恢复所有部件的 visible\n obj.traverse(child => {\n if (child instanceof THREE.Mesh) {\n child.visible = true;\n }\n });\n\n // 再调用 applyMaterialOverrides 恢复正常状态\n this.applyMaterialOverrides(nodeId);\n }\n\n /** 保存节点所有 mesh 的原始材质(模型加载后调用) */\n private saveAllOriginalMaterials(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n let unnamedIndex = 0;\n // 跟踪已见过的材质对象,用于检测材质共享\n const seenMaterials = new Map<THREE.Material, THREE.MeshStandardMaterial>();\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n // 给没有 name 的 mesh 设置默认名称(与 getMeshNames 保持一致)\n if (!child.name) child.name = `mesh_${unnamedIndex++}`;\n let mat = child.material as THREE.MeshStandardMaterial;\n if (!mat) return;\n // OBJ 加载的可能是其他材质类型,转换为 MeshStandardMaterial\n if (!(mat instanceof THREE.MeshStandardMaterial)) {\n const oldMat = mat as any;\n const newMat = new THREE.MeshStandardMaterial();\n if (oldMat.color) newMat.color.copy(oldMat.color);\n if (oldMat.opacity !== undefined) newMat.opacity = oldMat.opacity;\n if (oldMat.transparent !== undefined) newMat.transparent = oldMat.transparent;\n if (oldMat.emissive) newMat.emissive.copy(oldMat.emissive);\n if (oldMat.map) newMat.map = oldMat.map;\n child.material = newMat;\n mat = newMat;\n }\n // 如果材质被多个 mesh 共享,给当前 mesh 分配独立副本\n if (seenMaterials.has(mat)) {\n const independentMat = mat.clone();\n child.material = independentMat;\n mat = independentMat;\n } else {\n seenMaterials.set(mat, mat);\n }\n this.saveOriginalMaterials(nodeId, child.name, mat, child.visible);\n });\n }\n\n /** 恢复 mesh 到原始材质 */\n private resetMaterialToOriginal(nodeId: string, meshName: string, mat: THREE.MeshStandardMaterial): void {\n const orig = this.originalMaterials.get(nodeId)?.[meshName];\n if (!orig) return; // 没有保存的原始材质,说明从未被覆盖过\n mat.color.set(orig.color);\n mat.opacity = orig.opacity;\n mat.transparent = orig.transparent;\n mat.roughness = orig.roughness;\n mat.metalness = orig.metalness;\n mat.emissive.set(orig.emissive);\n // 恢复原始贴图\n mat.map = orig.map ?? null;\n mat.normalMap = orig.normalMap ?? null;\n mat.roughnessMap = orig.roughnessMap ?? null;\n mat.metalnessMap = orig.metalnessMap ?? null;\n mat.emissiveMap = orig.emissiveMap ?? null;\n mat.needsUpdate = true;\n }\n\n /** 获取 mesh 的原始材质(未覆盖前的值) */\n getOriginalMaterial(nodeId: string, meshName: string): { color: string; opacity: number; roughness: number; metalness: number; emissive: string; visible: boolean; map: THREE.Texture | null } | undefined {\n return this.originalMaterials.get(nodeId)?.[meshName];\n }\n\n private refreshSelection(): void {\n const sel = new Set(this.store.selection);\n // 清理不再被选中的 BoxHelper\n for (const [id, h] of [...this.helpers]) {\n if (!sel.has(id)) {\n this.helpers.delete(id);\n h.parent?.remove(h); // 用 parent.remove 而不是 scene.remove,因为组的 helper 挂在组上\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n // 清理不再被选中的灯光助手\n for (const [id, h] of [...this.lightHelpers]) {\n if (!sel.has(id)) {\n this.lightHelpers.delete(id);\n h.parent?.remove(h);\n if (h instanceof THREE.DirectionalLightHelper) h.dispose();\n if (h instanceof THREE.SpotLightHelper) h.dispose();\n if (h instanceof THREE.Mesh) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n }\n // 给新选中的对象挂上黄色边框\n for (const id of this.store.selection) {\n const node = this.store.node(id);\n if (!node) continue;\n\n if (node.primitive === 'group') {\n // Group:每次刷新都重建包围盒(确保合并/撤销后包围盒正确)\n const oldHelper = this.helpers.get(id);\n if (oldHelper) {\n oldHelper.parent?.remove(oldHelper);\n oldHelper.geometry.dispose();\n (oldHelper.material as THREE.Material).dispose();\n this.helpers.delete(id);\n }\n const box = this.computeGroupLocalBounds(id);\n if (box && !box.isEmpty()) {\n // 固定 0.03 单位空隙\n box.expandByScalar(0.03);\n // 用 LineSegments 手动创建包围盒\n const helper = new THREE.BoxHelper(new THREE.Object3D(), 0xfadb14);\n helper.geometry.dispose();\n helper.geometry = this.createBoxGeometry(box);\n helper.userData['isGroupHelper'] = true;\n helper.userData['isSelectionHelper'] = true;\n this.helpers.set(id, helper);\n // 挂到组的 Object3D 上,跟随组移动\n const groupObj = this.objects.get(id);\n if (groupObj) {\n groupObj.add(helper);\n } else {\n this.scene.add(helper);\n }\n }\n } else if (node.primitive === 'light') {\n // Light:显示灯光助手\n const light = this.objects.get(id) as THREE.Light;\n if (!light) continue;\n\n if (!this.lightHelpers.has(id)) {\n let helper: THREE.Object3D | null = null;\n if (light instanceof THREE.DirectionalLight) {\n helper = new THREE.DirectionalLightHelper(light, 2);\n } else if (light instanceof THREE.SpotLight) {\n helper = new THREE.SpotLightHelper(light);\n } else if (light instanceof THREE.PointLight) {\n // PointLight 用菱形线框表示(挂到灯光上跟随移动)\n const sphere = new THREE.Mesh(\n new THREE.OctahedronGeometry(0.5, 1),\n new THREE.MeshBasicMaterial({ color: 0xfadb14, wireframe: true }),\n );\n light.add(sphere);\n helper = sphere;\n } else {\n // AmbientLight 用球形线框表示\n const sphere = new THREE.Mesh(\n new THREE.SphereGeometry(0.25, 8, 6),\n new THREE.MeshBasicMaterial({ color: 0xfadb14, wireframe: true }),\n );\n helper = sphere;\n }\n if (helper) {\n this.lightHelpers.set(id, helper);\n // 如果 helper 不是灯光子对象,手动加到场景\n if (!helper.parent) this.scene.add(helper);\n }\n }\n } else {\n // 普通节点(asset 节点等模型加载完再创建包围盒,避免在占位位置闪现)\n const obj = this.objects.get(id);\n if (obj && !this.helpers.has(id)) {\n if (node.primitive === 'asset' && !obj.userData['assetLoaded']) continue;\n const h = new THREE.BoxHelper(obj, 0xfadb14);\n this.helpers.set(id, h);\n this.scene.add(h);\n }\n }\n }\n // Gizmo 只挂到第一个选中对象(asset 节点等模型加载完再挂载)\n // 路径编辑器激活时,gizmo 由 pathEditor 管理,refreshSelection 不干涉\n if (this.pathEditor.isActive()) {\n return;\n }\n const primary = this.store.selection[0];\n if (primary) {\n const target = this.objects.get(primary) ?? null;\n const primaryNode = this.store.node(primary);\n // asset 节点未加载时不挂载 gizmo\n if (primaryNode?.primitive === 'asset' && target && !target.userData['assetLoaded']) {\n this.gizmo.detach();\n } else if (target && target.parent) {\n this.gizmo.attach(target);\n } else {\n this.gizmo.detach();\n }\n } else {\n this.gizmo.detach();\n }\n }\n\n /** 根据 Box3 创建包围盒的几何体 */\n private createBoxGeometry(box: THREE.Box3): THREE.BufferGeometry {\n const min = box.min;\n const max = box.max;\n const positions = new Float32Array([\n // 前面\n min.x, min.y, max.z, max.x, min.y, max.z, max.x, min.y, max.z, max.x, max.y, max.z, max.x, max.y, max.z,\n min.x, max.y, max.z, min.x, max.y, max.z, min.x, min.y, max.z,\n // 后面\n min.x, min.y, min.z, max.x, min.y, min.z, max.x, min.y, min.z, max.x, max.y, min.z, max.x, max.y, min.z,\n min.x, max.y, min.z, min.x, max.y, min.z, min.x, min.y, min.z,\n // 连接边\n min.x, min.y, min.z, min.x, min.y, max.z, max.x, min.y, min.z, max.x, min.y, max.z, max.x, max.y, min.z,\n max.x, max.y, max.z, min.x, max.y, min.z, min.x, max.y, max.z,\n ]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n return geometry;\n }\n\n /** 计算 group 的所有后代的包围盒(本地空间,相对于组的 Object3D) */\n private computeGroupLocalBounds(groupId: string): THREE.Box3 | null {\n const box = new THREE.Box3();\n const groupObj = this.objects.get(groupId);\n if (!groupObj) return null;\n\n // 确保组的世界矩阵是最新的\n groupObj.updateMatrixWorld(true);\n\n const descendants = this.store.subtree(groupId);\n let hasMesh = false;\n\n for (const desc of descendants) {\n if (desc.id === groupId) continue;\n // 跳过其他组的黄色 helper(避免包围盒被 helper 几何体撑大)\n const obj = this.objects.get(desc.id);\n if (!obj) continue;\n if (obj.userData['isSelectionHelper']) continue;\n\n if (obj instanceof THREE.Object3D) {\n // 更新整棵子树的世界矩阵,确保 reparent 后包围盒计算正确\n obj.updateWorldMatrix(true, true);\n const worldBox = new THREE.Box3().setFromObject(obj);\n // 转换到组的本地空间\n const localBox = worldBox.clone().applyMatrix4(\n groupObj.matrixWorld.clone().invert()\n );\n box.union(localBox);\n hasMesh = true;\n }\n }\n return hasMesh ? box : null;\n }\n\n /** 计算 group 的所有后代的包围盒(世界空间) */\n private computeGroupBounds(groupId: string): THREE.Box3 | null {\n const box = new THREE.Box3();\n const descendants = this.store.subtree(groupId);\n let hasMesh = false;\n for (const node of descendants) {\n if (node.id === groupId || node.primitive === 'group') continue;\n const obj = this.objects.get(node.id);\n if (obj) {\n box.expandByObject(obj);\n hasMesh = true;\n }\n }\n return hasMesh ? box : null;\n }\n\n private snapshot(id: string): TransformState {\n const o = this.objects.get(id);\n const r3 = (v: number) => Math.round(v * 1000) / 1000;\n if (!o) return { position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1] };\n return {\n position: o.position.toArray().map(r3) as Vec3,\n rotation: [r3(o.rotation.x * RAD2DEG), r3(o.rotation.y * RAD2DEG), r3(o.rotation.z * RAD2DEG)],\n scale: o.scale.toArray().map(r3) as Vec3,\n };\n }\n\n private pick(e: PointerEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n // 收集所有可拾取的 Mesh(包括 Group/资产内部的子 Mesh)\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) {\n allMeshes.push(obj);\n } else {\n // Group 或资产:递归收集子 Mesh\n obj.traverse(child => {\n if (child instanceof THREE.Mesh) {\n allMeshes.push(child);\n }\n });\n }\n }\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n const id = (hits[0]?.object.userData['id'] as string) ?? null;\n this.cb.onSelect({ id, additive: e.ctrlKey || e.metaKey });\n }\n\n // ── 框选方法 ──\n\n private createBoxEl(e: PointerEvent): void {\n if (!this.host.parentElement) return;\n this.boxEl = document.createElement('div');\n this.boxEl.style.cssText = 'position:fixed;border:1px dashed #4f83cc;background:rgba(79,131,204,0.15);pointer-events:none;z-index:9999;';\n this.boxEl.style.left = e.clientX + 'px';\n this.boxEl.style.top = e.clientY + 'px';\n this.boxEl.style.width = '0px';\n this.boxEl.style.height = '0px';\n document.body.appendChild(this.boxEl);\n }\n\n private updateBoxEl(e: PointerEvent): void {\n if (!this.boxEl || !this.boxStart) return;\n const [sx, sy] = this.boxStart;\n const x = Math.min(sx, e.clientX);\n const y = Math.min(sy, e.clientY);\n const w = Math.abs(e.clientX - sx);\n const h = Math.abs(e.clientY - sy);\n this.boxEl.style.left = x + 'px';\n this.boxEl.style.top = y + 'px';\n this.boxEl.style.width = w + 'px';\n this.boxEl.style.height = h + 'px';\n }\n\n private finishBoxSelect(e: PointerEvent): void {\n this.boxSelecting = false;\n if (this.boxEl) {\n this.boxEl.remove();\n this.boxEl = null;\n }\n if (!this.boxStart) return;\n\n const [sx, sy] = this.boxStart;\n this.boxStart = null;\n const rect = this.renderer.domElement.getBoundingClientRect();\n const minX = Math.min(sx, e.clientX) - rect.left;\n const maxX = Math.max(sx, e.clientX) - rect.left;\n const minY = Math.min(sy, e.clientY) - rect.top;\n const maxY = Math.max(sy, e.clientY) - rect.top;\n\n // 忽略太小的框选(点击误触)\n if (maxX - minX < 4 && maxY - minY < 4) return;\n\n const ndcMinX = (minX / rect.width) * 2 - 1;\n const ndcMaxX = (maxX / rect.width) * 2 - 1;\n const ndcMinY = -((maxY / rect.height) * 2 - 1);\n const ndcMaxY = -((minY / rect.height) * 2 - 1);\n\n // 将每个对象中心投影到屏幕,检查是否在框选范围内\n const selected: string[] = [];\n for (const [id, obj] of this.objects) {\n const node = this.store.node(id);\n if (!node) continue;\n const center = new THREE.Vector3();\n if (obj instanceof THREE.Mesh) {\n obj.getWorldPosition(center);\n } else {\n const box = new THREE.Box3().setFromObject(obj);\n box.getCenter(center);\n }\n const projected = center.clone().project(this.camera);\n // 检查是否在相机前方且在框选范围内\n if (projected.z < 1 &&\n projected.x >= ndcMinX && projected.x <= ndcMaxX &&\n projected.y >= ndcMinY && projected.y <= ndcMaxY) {\n selected.push(id);\n }\n }\n this.cb.onSelect({ id: null, additive: false });\n this.store.setSelection(selected);\n }\n\n /** 双击拉近视角:将相机平滑移动到目标对象前方 */\n private onDblClick(e: MouseEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n\n // 检测所有 mesh(包括模型和绿球)\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) allMeshes.push(obj);\n else obj.traverse(c => { if (c instanceof THREE.Mesh) allMeshes.push(c); });\n }\n // 绿球不在 this.objects 里,从 PathEditor 补充\n if (this.pathEditor.isActive()) {\n for (const handle of this.pathEditor.getHandles()) {\n if (!allMeshes.includes(handle)) {\n allMeshes.push(handle);\n }\n }\n }\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n if (hits.length === 0) return;\n\n const hit = hits[0];\n const target = hit.point.clone();\n\n // 计算目标对象的包围盒中心\n const objId = hit.object.userData['id'] as string;\n const obj = this.objects.get(objId);\n let center = target.clone();\n if (obj) {\n const box = new THREE.Box3().setFromObject(obj);\n center = box.getCenter(new THREE.Vector3());\n }\n\n // 计算相机目标位置:从当前方向看向中心,距离为包围盒对角线 * 1.5\n const box = new THREE.Box3().setFromObject(obj || hit.object);\n const size = box.getSize(new THREE.Vector3());\n const dist = Math.max(size.length() * 1.5, 2);\n const dir = this.camera.position.clone().sub(center).normalize();\n const newPos = center.clone().add(dir.multiplyScalar(dist));\n\n // 平滑动画\n const startPos = this.camera.position.clone();\n const startTarget = this.orbit.target.clone();\n const duration = 400;\n const startTime = performance.now();\n\n const animateZoom = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n // easeOutCubic\n const ease = 1 - Math.pow(1 - t, 3);\n\n this.camera.position.lerpVectors(startPos, newPos, ease);\n this.orbit.target.lerpVectors(startTarget, center, ease);\n this.orbit.update();\n\n if (t < 1) requestAnimationFrame(animateZoom);\n };\n requestAnimationFrame(animateZoom);\n }\n\n /** 平滑聚焦到指定节点:将相机移动到对象前方 */\n focusOnNode(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n const box = new THREE.Box3().setFromObject(obj);\n if (box.isEmpty()) return;\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n const dist = Math.max(size.length() * 1.5, 2);\n const dir = this.camera.position.clone().sub(center).normalize();\n const newPos = center.clone().add(dir.multiplyScalar(dist));\n\n const startPos = this.camera.position.clone();\n const startTarget = this.orbit.target.clone();\n const duration = 400;\n const startTime = performance.now();\n\n const animateZoom = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const ease = 1 - Math.pow(1 - t, 3);\n this.camera.position.lerpVectors(startPos, newPos, ease);\n this.orbit.target.lerpVectors(startTarget, center, ease);\n this.orbit.update();\n if (t < 1) requestAnimationFrame(animateZoom);\n };\n requestAnimationFrame(animateZoom);\n }\n\n private resize(): void {\n const w = this.host.clientWidth || 1;\n const h = this.host.clientHeight || 1;\n this.renderer.setSize(w, h);\n // composer 可能尚未初始化(ResizeObserver 先于 initPostProcessing 触发)\n if (this.composer) this.composer.setSize(w, h);\n this.camera.aspect = w / h;\n this.camera.updateProjectionMatrix();\n }\n\n /** 屏幕坐标 → 地面(y=0)世界坐标 */\n screenToGround(viewportX: number, viewportY: number): Vec3 | null {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((viewportX - rect.left) / rect.width) * 2 - 1,\n -((viewportY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);\n const target = new THREE.Vector3();\n const hit = this.raycaster.ray.intersectPlane(plane, target);\n if (!hit) return null;\n return [\n Math.round(hit.x * 100) / 100,\n 0.5,\n Math.round(hit.z * 100) / 100,\n ];\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport type { TransformState, FlyPath, Vec3 } from './types';\nimport type { SceneStore } from './store';\nimport { SceneViewer, type PickEvent, type TransformMode } from './viewer';\n\n/**\n * 场景视口组件:three.js 全部跑在 NgZone 之外,\n * 只有对外事件才回到 zone 内触发变更检测。\n */\n@Component({\n selector: 'twin-scene-view',\n standalone: true,\n template: `\n <div #host class=\"scene-host\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\"></div>\n <div #dashboardOverlay class=\"dashboard-overlay\"></div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n .scene-host {\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n .scene-host canvas {\n display: block;\n }\n .dashboard-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n }\n .dashboard-overlay .dashboard-widget {\n pointer-events: auto;\n }\n `],\n})\nexport class SceneViewComponent implements AfterViewInit, OnChanges, OnDestroy {\n @ViewChild('host', { static: true }) host!: ElementRef<HTMLDivElement>;\n @ViewChild('dashboardOverlay', { static: true }) dashboardOverlay!: ElementRef<HTMLDivElement>;\n\n @Input() store!: SceneStore;\n @Input() mode: TransformMode = 'translate';\n @Input() isEditorMode = false;\n\n @Output() select = new EventEmitter<PickEvent>();\n @Output() transformEnd = new EventEmitter<{ id: string; before: TransformState; after: TransformState }>();\n @Output() dropAsset = new EventEmitter<{ x: number; y: number; assetId: string; assetName: string; assetFormat: string; assetLibraryId: string }>();\n @Output() thumbnailGenerated = new EventEmitter<{ assetId: string; dataUrl: string }>();\n @Output() pathPointMoved = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; position: Vec3 }>();\n @Output() addPathPoint = new EventEmitter<{ nodeId: string; effectIndex: number; insertAfter: number; position: Vec3 }>();\n @Output() deletePathPoint = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number }>();\n @Output() pathEditingChanged = new EventEmitter<boolean>();\n @Output() pathPointRightClick = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; position: Vec3; event: MouseEvent }>();\n @Output() segmentRightClick = new EventEmitter<{ nodeId: string; effectIndex: number; segmentIndex: number; position: Vec3; event: MouseEvent }>();\n @Output() modelSurfaceClick = new EventEmitter<{ nodeId: string; effectIndex: number; position: Vec3; event: PointerEvent }>();\n @Output() movePathPointToEnd = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; toStart: boolean }>();\n\n private viewer: SceneViewer | null = null;\n\n constructor(private zone: NgZone) {}\n\n ngAfterViewInit(): void {\n this.zone.runOutsideAngular(() => {\n this.viewer = new SceneViewer(\n this.host.nativeElement,\n this.store,\n {\n onSelect: ev => this.zone.run(() => this.select.emit(ev)),\n onTransformEnd: (id, before, after) => this.zone.run(() => this.transformEnd.emit({ id, before, after })),\n onThumbnailGenerated: (assetId, dataUrl) => this.zone.run(() => this.thumbnailGenerated.emit({ assetId, dataUrl })),\n onPathPointMoved: (nodeId, effectIndex, pointIndex, position) => this.zone.run(() => this.pathPointMoved.emit({ nodeId, effectIndex, pointIndex, position })),\n onAddPathPoint: (nodeId, effectIndex, insertAfter, position) => this.zone.run(() => this.addPathPoint.emit({ nodeId, effectIndex, insertAfter, position })),\n onDeletePathPoint: (nodeId, effectIndex, pointIndex) => this.zone.run(() => this.deletePathPoint.emit({ nodeId, effectIndex, pointIndex })),\n onPathEditingChanged: (isEditing) => this.zone.run(() => this.pathEditingChanged.emit(isEditing)),\n onPathPointRightClick: (nodeId, effectIndex, pointIndex, position, event) => this.zone.run(() => this.pathPointRightClick.emit({ nodeId, effectIndex, pointIndex, position, event })),\n onSegmentRightClick: (nodeId, effectIndex, segmentIndex, position, event) => this.zone.run(() => this.segmentRightClick.emit({ nodeId, effectIndex, segmentIndex, position, event })),\n onModelSurfaceClick: (nodeId, effectIndex, position, event) => this.zone.run(() => this.modelSurfaceClick.emit({ nodeId, effectIndex, position, event })),\n onMovePathPointToEnd: (nodeId, effectIndex, pointIndex, toStart) => this.zone.run(() => this.movePathPointToEnd.emit({ nodeId, effectIndex, pointIndex, toStart })),\n },\n this.dashboardOverlay.nativeElement,\n this.isEditorMode,\n );\n this.viewer.setMode(this.mode);\n });\n }\n\n ngOnChanges(changes: { [key: string]: any }): void {\n if (changes['mode'] && this.viewer) {\n this.viewer.setMode(this.mode);\n }\n }\n\n ngOnDestroy(): void {\n this.viewer?.dispose();\n this.viewer = null;\n }\n\n /** 导出场景为 GLB */\n exportScene(): void {\n this.viewer?.exportScene();\n }\n\n /** 屏幕坐标 → 地面世界坐标 */\n screenToGround(screenX: number, screenY: number): [number, number, number] | null {\n if (!this.viewer) return null;\n return this.viewer.screenToGround(screenX, screenY);\n }\n\n /** 获取资产节点的 mesh 名称列表 */\n getMeshNames(nodeId: string): string[] {\n return this.viewer?.getMeshNames(nodeId) ?? [];\n }\n\n /** 获取节点的包围盒信息(世界坐标) */\n getNodeBounds(nodeId: string): { center: [number, number, number]; size: [number, number, number] } | null {\n return this.viewer?.getNodeBounds(nodeId) ?? null;\n }\n\n /** 重新应用材质覆盖(材质参数变化后调用) */\n applyMaterialOverrides(nodeId: string): void {\n this.viewer?.applyMaterialOverrides(nodeId);\n }\n\n /** 获取 mesh 的原始材质(未覆盖前的值) */\n getOriginalMaterial(nodeId: string, meshName: string): { color: string; opacity: number; roughness: number; metalness: number; emissive: string; visible: boolean } | undefined {\n return this.viewer?.getOriginalMaterial(nodeId, meshName);\n }\n\n /** 隔离显示子部件:其他部件变为半透明 */\n isolateSubMesh(nodeId: string, meshName: string): void {\n this.viewer?.isolateSubMesh(nodeId, meshName);\n }\n\n /** 退出隔离显示:恢复所有部件到原始状态 */\n exitIsolation(nodeId: string): void {\n this.viewer?.exitIsolation(nodeId);\n }\n\n /** 保存当前相机状态到 SceneDoc */\n saveCamera(): void {\n this.viewer?.saveCamera();\n }\n\n /** 强制恢复相机(草稿恢复后调用) */\n forceRestoreCamera(): void {\n this.viewer?.forceRestoreCamera();\n }\n\n /** 设置模拟数据信号(用于数据驱动动画测试) */\n setDataSignal(value: number): void {\n this.viewer?.setDataSignal(value);\n }\n\n /** 设置节点实时数据(用于 per-node 数据驱动动画) */\n setData(nodeId: string, data: Record<string, number>): void {\n this.viewer?.setData(nodeId, data);\n }\n\n /** 按 bindingId 设置实时数据(用于点位绑定) */\n setBindingData(bindingId: string, value: number): void {\n this.viewer?.setBindingData(bindingId, value);\n }\n\n /** 标记正在 undo/redo */\n setUndoRedoing(value: boolean): void {\n this.viewer?.setUndoRedoing(value);\n }\n\n /** 播放飞行路线 */\n playFlyPath(path: FlyPath, callbacks?: { onComplete?: () => void }): void {\n this.viewer?.playFlyPath(path, callbacks);\n }\n\n /** 停止飞行路线 */\n stopFlyPath(): void {\n this.viewer?.stopFlyPath();\n }\n\n /** 暂停飞行路线 */\n pauseFlyPath(): void {\n this.viewer?.pauseFlyPath();\n }\n\n /** 恢复播放 */\n resumeFlyPath(): void {\n this.viewer?.resumeFlyPath();\n }\n\n /** 是否正在播放飞行路线 */\n isFlyPathPlaying(): boolean {\n return this.viewer?.isFlyPathPlaying() ?? false;\n }\n\n /** 获取当前相机位置(用于添加关键帧) */\n getCameraState(): { position: [number, number, number]; target: [number, number, number] } | null {\n if (!this.viewer) return null;\n const cam = (this.viewer as any).camera;\n const orbit = (this.viewer as any).orbit;\n if (!cam || !orbit) return null;\n return {\n position: [cam.position.x, cam.position.y, cam.position.z],\n target: [orbit.target.x, orbit.target.y, orbit.target.z],\n };\n }\n\n /** 设置相机位置(跳转到指定视角) */\n setCameraState(state: { position: [number, number, number]; target: [number, number, number] }): void {\n if (!this.viewer) return;\n const cam = (this.viewer as any).camera;\n const orbit = (this.viewer as any).orbit;\n if (!cam || !orbit) return;\n // 停止播放中的飞行路线\n this.viewer.stopFlyPath();\n cam.position.set(...state.position);\n orbit.target.set(...state.target);\n orbit.update();\n cam.lookAt(orbit.target);\n }\n\n /** 平滑聚焦到指定节点 */\n focusOnNode(nodeId: string): void {\n this.viewer?.focusOnNode(nodeId);\n }\n\n /** 设置路径编辑的活动效果 */\n setPathEditingEffect(effectKey: string | null): void {\n this.viewer?.setPathEditingEffect(effectKey);\n }\n\n /** 是否正在编辑路径 */\n isPathEditing(): boolean {\n return this.viewer?.isPathEditing() ?? false;\n }\n\n /** 设置路径编辑控制点大小 */\n setPathHandleSize(size: number): void {\n this.viewer?.setPathHandleSize(size);\n }\n\n /** 显示告警弹框 */\n showAlarm(nodeId: string, data: any): void {\n this.viewer?.showAlarm(nodeId, data);\n }\n\n /** 隐藏告警弹框 */\n hideAlarm(nodeId: string): void {\n this.viewer?.hideAlarm(nodeId);\n }\n\n /** 拖拽悬停:允许放置 */\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n }\n\n /** 拖拽放置:解析资产信息并发射事件 */\n onDrop(e: DragEvent): void {\n e.preventDefault();\n const assetId = e.dataTransfer?.getData('application/x-asset-id');\n if (!assetId) return;\n\n // 传 viewport 坐标,由 screenToGround 统一用 canvas rect 转换\n this.dropAsset.emit({\n x: e.clientX,\n y: e.clientY,\n assetId,\n assetName: e.dataTransfer?.getData('application/x-asset-name') ?? '',\n assetFormat: e.dataTransfer?.getData('application/x-asset-format') ?? '',\n assetLibraryId: e.dataTransfer?.getData('application/x-asset-library') ?? '',\n });\n }\n\n /** 获取 viewer 实例(供外部调用高级功能如告警弹窗) */\n getViewer(): SceneViewer | null {\n return this.viewer;\n }\n}\n","/** Draco 解码器路径(打包进 npm 包) */\nexport const DRACO_DECODER_PATH = 'assets/draco/gltf/';\n\n/** Draco 编码器路径(打包进 npm 包) */\nexport const DRACO_ENCODER_PATH = 'assets/draco/encoder/';\n","// Core\nexport * from './lib/types';\nexport * from './lib/store';\nexport * from './lib/history';\nexport * from './lib/commands';\n\n// Runtime\nexport * from './lib/viewer';\nexport * from './lib/scene-view.component';\nexport * from './lib/path-editor';\nexport * from './lib/particle-system';\nexport * from './lib/path-particle-system';\nexport * from './lib/segmented-path';\nexport * from './lib/draco-path';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fengyizhi-scene-lib.mjs","sources":["../../../projects/scene-lib/src/lib/types.ts","../../../projects/scene-lib/src/lib/history.ts","../../../projects/scene-lib/src/lib/store.ts","../../../projects/scene-lib/src/lib/commands.ts","../../../projects/scene-lib/src/lib/particle-system.ts","../../../projects/scene-lib/src/lib/segmented-path.ts","../../../projects/scene-lib/src/lib/path-particle-system.ts","../../../projects/scene-lib/src/lib/path-editor.ts","../../../projects/scene-lib/src/lib/viewer.ts","../../../projects/scene-lib/src/lib/scene-view.component.ts","../../../projects/scene-lib/src/lib/draco-path.ts","../../../projects/scene-lib/src/public-api.ts","../../../projects/scene-lib/src/fengyizhi-scene-lib.ts"],"sourcesContent":["/** 看板数据点(value widget 用) */\nexport interface DashboardDataPoint {\n /** 标签 */\n label: string;\n /** 显示绑定点 ID */\n bindingId: string;\n /** 动画绑定点 ID */\n animationBindingId?: string;\n /** 单位 */\n unit?: string;\n /** 数据源(可选,如果不用绑定点) */\n dataSource?: {\n mode: 'static' | 'simulated' | 'api';\n staticValue?: number | string;\n simulated?: { type: 'sine' | 'random'; min: number; max: number; interval: number };\n api?: { url: string; field: string; pollInterval: number };\n };\n}\n\n/** 看板 Widget */\nexport interface DashboardWidget {\n id: string;\n type: 'value' | 'gauge' | 'progress' | 'status' | 'chart' | 'text';\n /** 布局模式:screen=屏幕固定,world=绑定3D位置 */\n mode: 'screen' | 'world';\n /** screen 模式:百分比坐标 0-1 */\n screen?: { x: number; y: number; width: number; height: number };\n /** world 模式:3D 坐标 */\n world?: { position: Vec3 };\n /** 数据源(非 value 类型用) */\n dataSource?: {\n mode: 'static' | 'simulated' | 'api';\n staticValue?: number | string;\n simulated?: { type: 'sine' | 'random'; min: number; max: number; interval: number };\n api?: { url: string; field: string; pollInterval: number };\n };\n /** 数据点列表(value 类型用,多值显示) */\n dataPoints?: DashboardDataPoint[];\n /** 显示标签 */\n label?: string;\n /** 单位 */\n unit?: string;\n /** 最小值(仪表/进度条用) */\n min?: number;\n /** 最大值(仪表/进度条用) */\n max?: number;\n /** 阈值变色 */\n thresholds?: { value: number; color: string }[];\n /** 小数位数 */\n decimals?: number;\n}\n\n/** 看板配置 */\nexport interface DashboardConfig {\n /** 是否显示 */\n visible: boolean;\n /** Widget 列表 */\n widgets: DashboardWidget[];\n}\n\n/** 告警配置 */\nexport interface AlarmConfig {\n /** 查询告警详情的 API URL */\n apiUrl: string;\n /** 弹框显示时长(毫秒) */\n displayDuration: number;\n}\n\n/** 场景文档模型(scene.json v3)——纯数据,不依赖 three / Angular */\n\nexport type Vec3 = [number, number, number];\n\nexport type PrimitiveKind = 'box' | 'sphere' | 'cylinder' | 'group' | 'asset' | 'light' | 'label';\n\nexport interface TransformState {\n position: Vec3;\n /** 欧拉角,单位:度(对 UI 友好) */\n rotation: Vec3;\n scale: Vec3;\n}\n\nexport interface NodeDoc extends TransformState {\n id: string;\n name: string;\n primitive: PrimitiveKind;\n visible: boolean;\n children: string[];\n /** 标签文字内容(仅 label 节点) */\n text?: string;\n /** 资产 ID(服务器分配的 assetId) */\n assetId?: string;\n /** 资产库 ID(如 '021000') */\n assetLibraryId?: string;\n /** 资产文件 URL(运行时生成,不持久化也可) */\n assetUrl?: string;\n /** 资产显示名称 */\n assetName?: string;\n /** 资产文件格式(如 'glb', 'gltf', 'obj') */\n assetFormat?: string;\n /** MTL 文件路径(仅 OBJ 格式时使用) */\n assetMtlUrl?: string;\n\n // ── 材质覆盖(第二阶段实现) ──\n materialOverrides?: Record<string, MaterialOverride>;\n\n // ── 动画/绑定规则(第四阶段实现) ──\n animations?: AnimationRule[];\n\n // ── 视觉效果 ──\n effects?: VisualEffect[];\n\n // ── 灯光节点专用(第三阶段实现) ──\n lightType?: 'ambient' | 'directional' | 'point' | 'spot';\n lightColor?: string;\n lightIntensity?: number;\n lightCastShadow?: boolean;\n lightTarget?: Vec3;\n /** 点光源/聚光灯照射距离(0 = 无限) */\n lightDistance?: number;\n /** 光照衰减率 */\n lightDecay?: number;\n /** 聚光灯锥角(弧度) */\n lightAngle?: number;\n /** 聚光灯边缘柔和度(0-1) */\n lightPenumbra?: number;\n}\n\n/** 材质覆盖:场景级别,不修改资产本身 */\nexport interface MaterialOverride {\n color?: string; // \"#ff0000\"\n opacity?: number; // 0-1\n roughness?: number; // 0-1\n metalness?: number; // 0-1\n emissive?: string; // \"#000000\"\n visible?: boolean;\n // 贴图(dataURL)\n map?: string; // 漫反射贴图\n normalMap?: string; // 法线贴图\n roughnessMap?: string; // 粗糙度贴图\n metalnessMap?: string; // 金属度贴图\n emissiveMap?: string; // 自发光贴图\n /** 基础色是否与贴图叠加(默认 true;关闭后基础色强制 #ffffff,贴图原样显示) */\n useBaseColor?: boolean;\n}\n\n/** 动画/绑定规则 */\nexport interface AnimationRule {\n id: string;\n targetMeshName: string;\n property: string; // 'rotation.y', 'position.x', 'emissive' 等\n type: 'continuous' | 'oscillate' | 'data-driven' | 'trigger' | 'emissive' | 'emissive-constant' | 'emissive-temperature';\n speed?: number; // continuous: °/秒\n from?: number;\n to?: number;\n duration?: number; // trigger: 过渡时长(秒)\n easing?: string; // 'linear' | 'easeIn' | 'easeOut' | 'easeInOut'\n triggerBy?: 'click' | 'manual';\n dataSource?: string; // data-driven: URL\n dataMin?: number;\n dataMax?: number;\n valueMin?: number;\n valueMax?: number;\n /** 告警颜色(emissive 类型用,如 '#ff0000') */\n alarmColor?: string;\n /** 高亮颜色(emissive-constant 用,如 '#00aaff') */\n highlightColor?: string;\n /** 点位注释(自动生成,人能看懂的描述,如\"空调1号温度传感器\") */\n pointComment?: string;\n /** 温度梯度颜色(emissive-temperature 用,如 ['#00ff00', '#ffff00', '#ff0000']) */\n tempColors?: string[];\n /** 唯一绑定 ID,用于关联实时数据点位(对应 point 表的 ElementIDName3d) */\n bindingId?: string;\n /** 预设动画名称(如'旋转风扇',由编辑器自动生成) */\n presetName?: string;\n}\n\n// ── 视觉效果 ──\n\nexport type VisualEffectKind = 'particle' | 'uv-animation' | 'path-particle' | 'screen-content';\n\nexport interface VisualEffectBase {\n id: string;\n kind: VisualEffectKind;\n enabled: boolean;\n /** 目标子网格名(可选) */\n targetMeshName?: string;\n}\n\n/** UV 动画(管道液体流动、电缆电流) */\nexport interface UvAnimationEffect extends VisualEffectBase {\n kind: 'uv-animation';\n /** U 方向滚动速度(UV 坐标/秒) */\n speedU: number;\n /** V 方向滚动速度 */\n speedV: number;\n}\n\n/** 粒子效果(蒸汽、烟雾) */\nexport interface ParticleEffect extends VisualEffectBase {\n kind: 'particle';\n /** 发射速率(粒子/秒) */\n emissionRate: number;\n /** 粒子最大数量 */\n maxParticles: number;\n /** 粒子生命周期(秒) */\n lifetime: number;\n /** 发射方向 */\n direction: Vec3;\n /** 发射锥角(弧度) */\n spreadAngle: number;\n /** 初速度 */\n speed: number;\n /** 速度衰减 */\n damping: number;\n /** 粒子大小 */\n size: number;\n /** 大小随机范围 */\n sizeRandom: number;\n startColor: string;\n endColor: string;\n startOpacity: number;\n endOpacity: number;\n /** 重力(0=无) */\n gravity: number;\n blendMode: 'normal' | 'additive';\n}\n\n/** 路径粒子效果(管道水流、光纤) */\nexport interface PathParticleEffect extends VisualEffectBase {\n kind: 'path-particle';\n /** 路径点数组(世界坐标) */\n pathPoints: Vec3[];\n /** 段类型数组,长度 = pathPoints.length - 1\n * - 'linear': 直线段\n * - 'smooth': 平滑曲线段(CatmullRom)\n */\n segmentTypes: ('linear' | 'smooth')[];\n /** 粒子数量 */\n particleCount: number;\n /** 粒子大小 */\n size: number;\n /** 流动速度(路径进度/秒,0-1) */\n speed: number;\n /** 粒子颜色 */\n color: string;\n /** 粒子透明度 */\n opacity: number;\n /** 混合模式 */\n blendMode: 'normal' | 'additive';\n /** 是否循环 */\n loop: boolean;\n /** 粒子外观类型 */\n textureType: 'dot' | 'arrow' | 'wave';\n /** 拖尾效果 */\n trail: boolean;\n /** 发光效果 */\n glow: boolean;\n /** 管道透明度(0=完全透明 1=不透明,1 表示不隐藏管道) */\n pipeOpacity: number;\n /** 粒子分布半径(管道截面内随机偏移范围) */\n pipeRadius?: number;\n}\n\n/** 屏幕内容切换效果(大屏贴图轮播) */\nexport interface ScreenContentEffect extends VisualEffectBase {\n kind: 'screen-content';\n /** 图片 URL 数组(base64 或 http) */\n images: string[];\n /** 轮播间隔(毫秒) */\n interval: number;\n /** 是否自动播放 */\n autoPlay: boolean;\n /** 目标网格名称(为空则应用到所有网格) */\n targetMeshName?: string;\n /** 当前图片索引(运行时使用,不持久化) */\n currentIndex?: number;\n}\n\nexport type VisualEffect = UvAnimationEffect | ParticleEffect | PathParticleEffect | ScreenContentEffect;\n\n/** 飞行路线关键帧 */\nexport interface CameraKeyframe {\n /** 相机位置 */\n position: Vec3;\n /** 相机目标点 */\n target: Vec3;\n /** 到达此关键帧的时间(秒,相对于路径起点) */\n time: number;\n}\n\n/** 飞行路线 */\nexport interface FlyPath {\n id: string;\n name: string;\n keyframes: CameraKeyframe[];\n /** 是否循环播放 */\n loop: boolean;\n /** 总时长(秒,若未指定则从关键帧计算) */\n duration?: number;\n /** 关键帧默认间隔(秒),默认 2 */\n interval?: number;\n}\n\nexport interface CameraDoc {\n position: Vec3;\n target: Vec3;\n}\n\n/** 环境配置(场景级) */\nexport interface EnvironmentConfig {\n /** 背景色 */\n background?: string;\n /** 半球光 */\n hemisphere?: {\n /** 是否启用(默认 true) */\n enabled?: boolean;\n skyColor?: string;\n groundColor?: string;\n intensity?: number;\n };\n /** 默认平行光 */\n directional?: {\n /** 是否启用(默认 true) */\n enabled?: boolean;\n color?: string;\n intensity?: number;\n position?: Vec3;\n };\n /** HDRI 环境贴图(base64 data URL),优先于 background 纯色背景 */\n hdriDataUrl?: string;\n /** 阴影配置 */\n shadow?: {\n /** 是否启用阴影(默认 true) */\n enabled?: boolean;\n /** 阴影贴图分辨率(默认 2048) */\n mapSize?: number;\n /** 阴影相机范围(默认 15,对应 -range ~ +range) */\n cameraRange?: number;\n };\n /** 场景空间配置 */\n room?: {\n /** 是否启用 */\n enabled?: boolean;\n /** 宽度(X 轴),默认 30 */\n width?: number;\n /** 深度(Z 轴),默认 30 */\n depth?: number;\n /** 高度(Y 轴),默认 10 */\n height?: number;\n /** 地板颜色 */\n floorColor?: string;\n /** 墙壁颜色 */\n wallColor?: string;\n /** 天花板颜色 */\n ceilingColor?: string;\n /** 地板漫反射贴图(base64 data URL) */\n floorTexture?: string;\n /** 地板法线贴图 */\n floorNormalTexture?: string;\n /** 地板粗糙度贴图 */\n floorRoughnessTexture?: string;\n /** 墙壁漫反射贴图 */\n wallTexture?: string;\n /** 墙壁法线贴图 */\n wallNormalTexture?: string;\n /** 墙壁粗糙度贴图 */\n wallRoughnessTexture?: string;\n /** 天花板漫反射贴图 */\n ceilingTexture?: string;\n /** 天花板法线贴图 */\n ceilingNormalTexture?: string;\n /** 天花板粗糙度贴图 */\n ceilingRoughnessTexture?: string;\n /** 基础色是否与贴图叠加(默认 true;关闭后基础色强制 #ffffff,贴图原样显示) */\n floorUseBaseColor?: boolean;\n wallUseBaseColor?: boolean;\n ceilingUseBaseColor?: boolean;\n };\n}\n\nexport interface SceneDoc {\n schemaVersion: 3;\n /** 场景 ID(服务器分配) */\n id?: string;\n /** 场景名称 */\n name?: string;\n nodes: NodeDoc[];\n /** 相机位置 */\n camera?: CameraDoc;\n /** 环境配置 */\n environment?: EnvironmentConfig;\n /** 飞行路线 */\n flyPaths?: FlyPath[];\n /** 大屏看板 */\n dashboard?: DashboardConfig;\n /** 告警配置 */\n alarm?: AlarmConfig;\n}\n\n/** 场景元数据(列表用,不包含完整 SceneDoc) */\nexport interface SceneMeta {\n id: string;\n name: string;\n createdAt: number;\n updatedAt: number;\n}\n\nlet seq = 0;\nexport function nextId(prefix = 'n'): string {\n seq += 1;\n return `${prefix}_${Date.now().toString(36)}_${seq.toString(36)}`;\n}\n\nexport function createNode(primitive: PrimitiveKind, name: string): NodeDoc {\n return {\n id: nextId(),\n name,\n primitive,\n position: [0, 0.5, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n visible: true,\n children: [],\n };\n}\n\nexport function createSceneDoc(): SceneDoc {\n return { schemaVersion: 3, nodes: [] };\n}\n\nexport function clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n/** 告警弹窗数据 */\nexport interface AlarmPopupData {\n deviceName: string;\n alarmType: string;\n currentValue: number;\n threshold: number;\n priority: 'high' | 'medium' | 'low';\n suggestion: string;\n timestamp: number;\n}\n","import type { SceneStore } from './store';\nimport type { MaterialOverride } from './types';\n\n/** 命令:一切场景修改的唯一入口,天然可撤销 */\nexport interface Command {\n label: string;\n do(store: SceneStore): void;\n undo(store: SceneStore): void;\n}\n\nexport class History {\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n constructor(private readonly store: SceneStore) {}\n\n execute(cmd: Command): void {\n cmd.do(this.store);\n this.undoStack.push(cmd);\n this.redoStack.length = 0;\n this.store.notifyChanged();\n }\n\n undo(): void {\n const cmd = this.undoStack.pop();\n if (!cmd) return;\n cmd.undo(this.store);\n this.redoStack.push(cmd);\n this.store.notifyChanged();\n }\n\n redo(): void {\n const cmd = this.redoStack.pop();\n if (!cmd) return;\n cmd.do(this.store);\n this.undoStack.push(cmd);\n this.store.notifyChanged();\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** 清空所有历史记录 */\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n\n /** 检查撤销栈中是否有指定节点/mesh 的材质命令 */\n hasMaterialCmdFor(nodeId: string, meshName: string): boolean {\n for (let i = this.undoStack.length - 1; i >= 0; i--) {\n const cmd = this.undoStack[i] as any;\n if (cmd.nodeId === nodeId && cmd.meshName === meshName) return true;\n }\n return false;\n }\n\n /** 更新栈顶最后一个指定节点/mesh 的材质命令的 after 状态(用于贴图上传完成后替换临时 URL)\n * 返回 true 表示找到并更新了,false 表示栈中没有匹配的命令 */\n updateLastMaterialAfter(nodeId: string, meshName: string, newAfter: MaterialOverride): boolean {\n for (let i = this.undoStack.length - 1; i >= 0; i--) {\n const cmd = this.undoStack[i] as any;\n if (cmd.nodeId === nodeId && cmd.meshName === meshName) {\n cmd.after = newAfter;\n return true;\n }\n }\n return false;\n }\n\n /** 直接推入命令(用于已手动应用变更的场景,不再执行 do) */\n pushCommand(cmd: Command): void {\n this.undoStack.push(cmd);\n this.redoStack.length = 0;\n this.store.notifyChanged();\n }\n}\n","import { History } from './history';\nimport { createSceneDoc, type NodeDoc, type SceneDoc } from './types';\n\ntype Listener = () => void;\n\n/** 单一数据源:场景文档 + 选择 + 历史。不依赖 Angular / three */\nexport class SceneStore {\n readonly doc: SceneDoc = createSceneDoc();\n readonly history = new History(this);\n\n private docListeners = new Set<Listener>();\n private selectionListeners = new Set<Listener>();\n private _selection: string[] = [];\n\n get selection(): readonly string[] {\n return this._selection;\n }\n\n node(id: string): NodeDoc | undefined {\n return this.doc.nodes.find(n => n.id === id);\n }\n\n parentOf(id: string): NodeDoc | undefined {\n return this.doc.nodes.find(n => n.children.includes(id));\n }\n\n /** 收集节点自身及全部后代 */\n subtree(id: string): NodeDoc[] {\n const out: NodeDoc[] = [];\n const walk = (nid: string): void => {\n const n = this.node(nid);\n if (!n) return;\n out.push(n);\n n.children.forEach(walk);\n };\n walk(id);\n return out;\n }\n\n roots(): NodeDoc[] {\n const childIds = new Set(this.doc.nodes.flatMap(n => n.children));\n return this.doc.nodes.filter(n => !childIds.has(n.id));\n }\n\n setSelection(ids: string[]): void {\n this._selection = [...ids];\n this.selectionListeners.forEach(l => l());\n }\n\n onDocChange(l: Listener): () => void {\n this.docListeners.add(l);\n return () => this.docListeners.delete(l);\n }\n\n onSelectionChange(l: Listener): () => void {\n this.selectionListeners.add(l);\n return () => this.selectionListeners.delete(l);\n }\n\n /** History 与直接修改(如选择无关的文档变更)后调用 */\n notifyChanged(): void {\n this.docListeners.forEach(l => l());\n }\n\n /** 从 JSON 加载场景文档(替换当前文档,兼容 v2 和 v3) */\n loadDoc(doc: SceneDoc): void {\n this.doc.schemaVersion = doc.schemaVersion ?? 3;\n this.doc.id = doc.id;\n this.doc.name = doc.name;\n this.doc.nodes = doc.nodes ?? [];\n this.doc.camera = doc.camera;\n this.doc.environment = doc.environment;\n this.doc.flyPaths = doc.flyPaths;\n this.doc.dashboard = doc.dashboard;\n this._selection = [];\n // 加载文档时清空撤销/重做历史\n this.history.clear();\n this.notifyChanged();\n this.selectionListeners.forEach(l => l());\n }\n}\n","import type { Command } from './history';\nimport type { SceneStore } from './store';\nimport { clone, createNode, nextId, type AlarmConfig, type AnimationRule, type CameraKeyframe, type DashboardConfig, type EnvironmentConfig, type FlyPath, type MaterialOverride, type NodeDoc, type TransformState, type Vec3, type VisualEffect } from './types';\n\nexport class AddNodeCommand implements Command {\n readonly label: string;\n\n constructor(\n private readonly node: NodeDoc,\n private readonly parentId: string | null = null,\n ) {\n this.label = `添加 ${node.name}`;\n }\n\n do(store: SceneStore): void {\n if (!store.node(this.node.id)) {\n store.doc.nodes.push(clone(this.node));\n }\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p && !p.children.includes(this.node.id)) p.children.push(this.node.id);\n }\n }\n\n undo(store: SceneStore): void {\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.node.id);\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p) p.children = p.children.filter(c => c !== this.node.id);\n }\n }\n}\n\nexport class RemoveNodeCommand implements Command {\n readonly label = '删除节点';\n private removed: NodeDoc[] = [];\n private parentId: string | null = null;\n\n constructor(private readonly id: string) {}\n\n do(store: SceneStore): void {\n this.parentId = store.parentOf(this.id)?.id ?? null;\n this.removed = store.subtree(this.id);\n const ids = new Set(this.removed.map(n => n.id));\n store.doc.nodes = store.doc.nodes.filter(n => !ids.has(n.id));\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p) p.children = p.children.filter(c => c !== this.id);\n }\n }\n\n undo(store: SceneStore): void {\n store.doc.nodes.push(...clone(this.removed));\n if (this.parentId) {\n const p = store.node(this.parentId);\n if (p && !p.children.includes(this.id)) p.children.push(this.id);\n }\n }\n}\n\nexport class TransformCommand implements Command {\n readonly label = '变换';\n\n constructor(\n private readonly id: string,\n private readonly before: TransformState,\n private readonly after: TransformState,\n ) {}\n\n do(store: SceneStore): void {\n applyTransform(store, this.id, this.after);\n }\n\n undo(store: SceneStore): void {\n applyTransform(store, this.id, this.before);\n }\n}\n\nfunction applyTransform(store: SceneStore, id: string, t: TransformState): void {\n const n = store.node(id);\n if (!n) return;\n n.position = clone(t.position);\n n.rotation = clone(t.rotation);\n n.scale = clone(t.scale);\n}\n\n/** 合并选中节点为一个 group */\nexport class GroupCommand implements Command {\n readonly label = '合并为组';\n private groupId: string;\n private originalParents: Map<string, string | null> = new Map();\n private originalPositions: Map<string, [number, number, number]> = new Map();\n private removedEmptyGroups: NodeDoc[] = [];\n\n constructor(private readonly selectedIds: string[]) {\n this.groupId = nextId('grp');\n }\n\n do(store: SceneStore): void {\n this.removedEmptyGroups = [];\n // 记录每个选中节点的原始父节点和位置\n this.originalParents.clear();\n this.originalPositions.clear();\n for (const id of this.selectedIds) {\n this.originalParents.set(id, store.parentOf(id)?.id ?? null);\n const child = store.node(id);\n if (child) this.originalPositions.set(id, [...child.position] as [number, number, number]);\n }\n\n // 从原父节点移除选中的子节点(必须在添加 group 之前,否则 parentOf 会返回新 group)\n for (const id of this.selectedIds) {\n const parent = store.parentOf(id);\n if (parent) {\n parent.children = parent.children.filter(c => c !== id);\n }\n }\n\n // 检查是否有组变为空,删除空组\n for (const n of [...store.doc.nodes]) {\n if (n.primitive === 'group' && n.children.length === 0 && n.id !== this.groupId) {\n this.removedEmptyGroups.push(clone(n));\n store.doc.nodes = store.doc.nodes.filter(x => x.id !== n.id);\n }\n }\n\n // 计算所有选中节点的中心点(平均值),作为组的原点\n let cx = 0, cy = 0, cz = 0;\n for (const id of this.selectedIds) {\n const child = store.node(id);\n if (child) {\n cx += child.position[0];\n cy += child.position[1];\n cz += child.position[2];\n }\n }\n const count = this.selectedIds.length;\n if (count > 0) { cx /= count; cy /= count; cz /= count; }\n\n // 创建 group 节点\n const group = createNode('group', `组`);\n group.id = this.groupId;\n group.children = [...this.selectedIds];\n group.position = [\n Math.round(cx * 1000) / 1000,\n Math.round(cy * 1000) / 1000,\n Math.round(cz * 1000) / 1000,\n ];\n\n // 调整子节点位置:相对于组中心\n for (const id of this.selectedIds) {\n const child = store.node(id);\n if (child) {\n child.position = [\n Math.round((child.position[0] - cx) * 1000) / 1000,\n Math.round((child.position[1] - cy) * 1000) / 1000,\n Math.round((child.position[2] - cz) * 1000) / 1000,\n ];\n }\n }\n\n store.doc.nodes.push(clone(group));\n }\n\n undo(store: SceneStore): void {\n // 删除新创建的 group\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.groupId);\n\n // 恢复被删除的空组\n for (const g of this.removedEmptyGroups) {\n store.doc.nodes.push(clone(g));\n }\n\n // 恢复子节点到原父节点,并还原原始位置\n for (const [id, parentId] of this.originalParents) {\n if (parentId) {\n const p = store.node(parentId);\n if (p && !p.children.includes(id)) p.children.push(id);\n }\n // 还原子节点到原始位置(组内坐标 → 原始世界坐标)\n const origPos = this.originalPositions.get(id);\n const child = store.node(id);\n if (origPos && child) {\n child.position = [...origPos];\n }\n }\n }\n}\n\n/** 解除合并:将 group 的子节点提升到 group 的父节点下,删除 group */\nexport class UngroupCommand implements Command {\n readonly label = '解除合并';\n private groupId: string;\n private children: string[] = [];\n private groupParentId: string | null = null;\n private groupName = '';\n\n constructor(groupId: string) {\n this.groupId = groupId;\n }\n\n do(store: SceneStore): void {\n const group = store.node(this.groupId);\n if (!group || group.primitive !== 'group') return;\n\n this.groupParentId = store.parentOf(this.groupId)?.id ?? null;\n this.children = [...group.children];\n this.groupName = group.name;\n\n // 将子节点移到 group 的父节点下\n if (this.groupParentId) {\n const parent = store.node(this.groupParentId);\n if (parent) {\n const idx = parent.children.indexOf(this.groupId);\n if (idx >= 0) {\n parent.children.splice(idx, 1, ...this.children);\n } else {\n parent.children.push(...this.children);\n }\n }\n }\n\n // 删除 group\n store.doc.nodes = store.doc.nodes.filter(n => n.id !== this.groupId);\n }\n\n undo(store: SceneStore): void {\n // 重建 group\n const group = createNode('group', this.groupName || '组');\n group.id = this.groupId;\n group.children = [...this.children];\n\n store.doc.nodes.push(clone(group));\n\n // 从当前父节点移除子节点\n for (const id of this.children) {\n const parent = store.parentOf(id);\n if (parent && parent.id !== this.groupId) {\n parent.children = parent.children.filter(c => c !== id);\n }\n }\n\n // 恢复 group 到原父节点\n if (this.groupParentId) {\n const parent = store.node(this.groupParentId);\n if (parent) {\n parent.children = parent.children.filter(c => !this.children.includes(c));\n if (!parent.children.includes(this.groupId)) {\n parent.children.push(this.groupId);\n }\n }\n }\n }\n}\n\n/** 材质覆盖命令:记录 before/after,支持 undo/redo */\nexport class MaterialOverrideCommand implements Command {\n readonly label = '修改材质';\n\n constructor(\n private readonly nodeId: string,\n private readonly meshName: string,\n private readonly before: MaterialOverride | undefined,\n private readonly after: MaterialOverride,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.materialOverrides) node.materialOverrides = {};\n node.materialOverrides[this.meshName] = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.materialOverrides) return;\n if (this.before) {\n node.materialOverrides[this.meshName] = clone(this.before);\n } else {\n delete node.materialOverrides[this.meshName];\n // 如果 materialOverrides 为空,清理掉\n if (Object.keys(node.materialOverrides).length === 0) {\n delete node.materialOverrides;\n }\n }\n }\n}\n\n/** 同步材质到同资产实例命令(批量) */\nexport class SyncMaterialCommand implements Command {\n readonly label = '同步材质到同资产实例';\n\n constructor(\n private readonly sourceNodeId: string,\n private readonly targetNodeIds: string[],\n private readonly beforeMap: Map<string, Record<string, MaterialOverride> | undefined>,\n private readonly after: Record<string, MaterialOverride> | undefined,\n ) {}\n\n do(store: SceneStore): void {\n for (const nodeId of this.targetNodeIds) {\n const node = store.node(nodeId);\n if (!node) continue;\n if (this.after) {\n node.materialOverrides = clone(this.after);\n } else {\n delete node.materialOverrides;\n }\n }\n }\n\n undo(store: SceneStore): void {\n for (const nodeId of this.targetNodeIds) {\n const node = store.node(nodeId);\n if (!node) continue;\n const before = this.beforeMap.get(nodeId);\n if (before) {\n node.materialOverrides = clone(before);\n } else {\n delete node.materialOverrides;\n }\n }\n }\n}\n\n/** 看板配置命令 */\nexport class SetDashboardCommand implements Command {\n readonly label = '修改看板';\n\n constructor(\n private readonly before: DashboardConfig | undefined,\n private readonly after: DashboardConfig,\n ) {}\n\n do(store: SceneStore): void {\n store.doc.dashboard = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n if (this.before) {\n store.doc.dashboard = clone(this.before);\n } else {\n delete store.doc.dashboard;\n }\n }\n}\n\n/** 告警配置命令 */\nexport class SetAlarmCommand implements Command {\n readonly label = '修改告警';\n\n constructor(\n private readonly before: AlarmConfig | undefined,\n private readonly after: AlarmConfig,\n ) {}\n\n do(store: SceneStore): void {\n store.doc.alarm = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n if (this.before) {\n store.doc.alarm = clone(this.before);\n } else {\n delete store.doc.alarm;\n }\n }\n}\n\n/** 拖动节点改变父节点 */\nexport class ReparentCommand implements Command {\n readonly label = '移动节点';\n private oldParentId: string | null = null;\n private oldIndex = 0;\n\n constructor(\n private readonly nodeId: string,\n private readonly newParentId: string | null,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n\n // 记录旧位置\n this.oldParentId = store.parentOf(this.nodeId)?.id ?? null;\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent) {\n this.oldIndex = oldParent.children.indexOf(this.nodeId);\n }\n }\n\n // 从旧父节点移除\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent) {\n oldParent.children = oldParent.children.filter(c => c !== this.nodeId);\n }\n }\n\n // 添加到新父节点\n if (this.newParentId) {\n const newParent = store.node(this.newParentId);\n if (newParent && !newParent.children.includes(this.nodeId)) {\n newParent.children.push(this.nodeId);\n }\n }\n }\n\n undo(store: SceneStore): void {\n // 从当前父节点移除\n const currentParent = store.parentOf(this.nodeId);\n if (currentParent) {\n currentParent.children = currentParent.children.filter(c => c !== this.nodeId);\n }\n\n // 恢复到原来的父节点和位置\n if (this.oldParentId) {\n const oldParent = store.node(this.oldParentId);\n if (oldParent && !oldParent.children.includes(this.nodeId)) {\n oldParent.children.splice(this.oldIndex, 0, this.nodeId);\n }\n }\n }\n}\n\n/** 环境配置命令:背景色、半球光、平行光、HDRI、场景空间 */\nexport class SetEnvironmentCommand implements Command {\n readonly label = '修改环境';\n\n constructor(\n private readonly before: EnvironmentConfig | undefined,\n private readonly after: EnvironmentConfig,\n ) {}\n\n do(store: SceneStore): void {\n const floorColor = this.after.room?.floorColor || 'none';\n const floorTexture = this.after.room?.floorTexture?.substring(0, 30) || 'no texture';\n console.log('[SetEnvironmentCommand.do] applying - floorColor:', floorColor, 'floorTexture:', floorTexture);\n store.doc.environment = clone(this.after);\n }\n\n undo(store: SceneStore): void {\n const floorColor = this.before?.room?.floorColor || 'none';\n const floorTexture = this.before?.room?.floorTexture?.substring(0, 30) || 'no texture';\n console.log('[SetEnvironmentCommand.undo] restoring - floorColor:', floorColor, 'floorTexture:', floorTexture);\n if (this.before) {\n store.doc.environment = clone(this.before);\n } else {\n delete store.doc.environment;\n }\n }\n}\n\n/** 灯光属性修改命令 */\nexport class SetLightPropertyCommand implements Command {\n readonly label = '修改灯光';\n private oldValue: unknown;\n\n constructor(\n private readonly nodeId: string,\n private readonly prop: string,\n private readonly newValue: unknown,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || node.primitive !== 'light') return;\n (node as any)[this.prop] = this.newValue;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n (node as any)[this.prop] = this.oldValue;\n }\n\n /** 执行前保存旧值(必须在 do 之前调用) */\n captureOldValue(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (node) this.oldValue = (node as any)[this.prop];\n }\n}\n\n/** 节点重命名命令 */\nexport class SetNodeNameCommand implements Command {\n readonly label = '重命名';\n private oldName = '';\n\n constructor(\n private readonly nodeId: string,\n private readonly newName: string,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n this.oldName = node.name;\n node.name = this.newName;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n node.name = this.oldName;\n }\n}\n\nexport class SetNodeTextCommand implements Command {\n readonly label = '标签文字';\n private oldText = '';\n\n constructor(\n private readonly nodeId: string,\n private readonly newText: string,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n this.oldText = node.text ?? '';\n node.text = this.newText;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n node.text = this.oldText;\n }\n}\n\n/** 批量删除命令(多选删除合并为单个撤销步骤) */\nexport class BatchRemoveCommand implements Command {\n readonly label = '删除节点';\n private removedGroups: { nodes: NodeDoc[]; parentId: string | null; rootId: string }[] = [];\n\n constructor(private readonly ids: string[]) {}\n\n do(store: SceneStore): void {\n this.removedGroups = [];\n for (const id of this.ids) {\n const parentId = store.parentOf(id)?.id ?? null;\n const subtree = store.subtree(id);\n if (subtree.length === 0) continue;\n this.removedGroups.push({ nodes: clone(subtree), parentId, rootId: id });\n // 删除整个子树\n const subIds = new Set(subtree.map(n => n.id));\n store.doc.nodes = store.doc.nodes.filter(n => !subIds.has(n.id));\n if (parentId) {\n const p = store.node(parentId);\n if (p) p.children = p.children.filter(c => c !== id);\n }\n }\n }\n\n undo(store: SceneStore): void {\n for (const group of this.removedGroups) {\n // 恢复所有节点\n store.doc.nodes.push(...clone(group.nodes));\n // 恢复到父节点\n if (group.parentId) {\n const p = store.node(group.parentId);\n if (p && !p.children.includes(group.rootId)) p.children.push(group.rootId);\n }\n }\n }\n}\n\n/** 动画添加命令 */\nexport class AddAnimationCommand implements Command {\n readonly label = '添加动画';\n\n constructor(\n private readonly nodeId: string,\n private readonly rule: AnimationRule,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.animations) node.animations = [];\n if (!node.animations.find(r => r.id === this.rule.id)) {\n node.animations.push(clone(this.rule));\n }\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations) return;\n node.animations = node.animations.filter(r => r.id !== this.rule.id);\n if (node.animations.length === 0) delete node.animations;\n }\n}\n\n/** 动画更新命令 */\nexport class UpdateAnimationCommand implements Command {\n readonly label = '修改动画';\n private oldRule: AnimationRule | undefined;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n private readonly newRule: AnimationRule,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index]) return;\n this.oldRule = clone(node.animations[this.index]);\n node.animations[this.index] = clone(this.newRule);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index] || !this.oldRule) return;\n node.animations[this.index] = clone(this.oldRule);\n }\n}\n\n/** 动画删除命令 */\nexport class RemoveAnimationCommand implements Command {\n readonly label = '删除动画';\n private oldRule: AnimationRule | undefined;\n private oldIndex = -1;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.animations?.[this.index]) return;\n this.oldRule = clone(node.animations[this.index]);\n this.oldIndex = this.index;\n node.animations.splice(this.index, 1);\n if (node.animations.length === 0) delete node.animations;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || !this.oldRule) return;\n if (!node.animations) node.animations = [];\n node.animations.splice(this.oldIndex, 0, clone(this.oldRule));\n }\n}\n\n/** 飞行路线操作命令(创建/更新/删除合并为一个命令类) */\nexport class FlyPathCommand implements Command {\n readonly label: string;\n private beforePaths: FlyPath[] | undefined;\n\n constructor(\n private readonly action: 'create' | 'update' | 'delete',\n private readonly pathId: string,\n private readonly pathData?: FlyPath,\n private readonly updates?: Partial<FlyPath>,\n ) {\n this.label = action === 'create' ? '创建飞行路线' : action === 'update' ? '修改飞行路线' : '删除飞行路线';\n }\n\n do(store: SceneStore): void {\n // 保存当前状态用于 undo\n this.beforePaths = store.doc.flyPaths ? clone(store.doc.flyPaths) : undefined;\n\n if (!store.doc.flyPaths) store.doc.flyPaths = [];\n\n switch (this.action) {\n case 'create':\n if (this.pathData && !store.doc.flyPaths.find(p => p.id === this.pathId)) {\n store.doc.flyPaths.push(clone(this.pathData));\n }\n break;\n case 'update':\n const path = store.doc.flyPaths.find(p => p.id === this.pathId);\n if (path && this.updates) Object.assign(path, this.updates);\n break;\n case 'delete':\n const idx = store.doc.flyPaths.findIndex(p => p.id === this.pathId);\n if (idx >= 0) {\n store.doc.flyPaths.splice(idx, 1);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n }\n break;\n }\n }\n\n undo(store: SceneStore): void {\n if (this.beforePaths) {\n store.doc.flyPaths = clone(this.beforePaths);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n } else {\n delete store.doc.flyPaths;\n }\n }\n}\n\n/** 关键帧操作命令(添加/更新/删除/插入/覆盖合并为一个命令类) */\nexport class KeyframeCommand implements Command {\n readonly label: string;\n private beforePaths: FlyPath[] | undefined;\n\n constructor(\n private readonly action: 'add' | 'update' | 'delete' | 'insert' | 'overwrite',\n private readonly pathId: string,\n private readonly index?: number,\n private readonly keyframe?: CameraKeyframe,\n ) {\n this.label = action === 'add' ? '添加关键帧' : action === 'update' ? '修改关键帧' :\n action === 'delete' ? '删除关键帧' : action === 'insert' ? '插入关键帧' : '覆盖关键帧';\n }\n\n do(store: SceneStore): void {\n // 保存当前状态用于 undo\n this.beforePaths = store.doc.flyPaths ? clone(store.doc.flyPaths) : undefined;\n\n const path = store.doc.flyPaths?.find(p => p.id === this.pathId);\n if (!path) return;\n\n switch (this.action) {\n case 'add':\n if (this.keyframe) {\n path.keyframes.push(clone(this.keyframe));\n path.keyframes.sort((a, b) => a.time - b.time);\n }\n break;\n case 'update':\n if (this.index !== undefined && this.keyframe && path.keyframes[this.index]) {\n path.keyframes[this.index] = clone(this.keyframe);\n path.keyframes.sort((a, b) => a.time - b.time);\n }\n break;\n case 'delete':\n if (this.index !== undefined) {\n path.keyframes.splice(this.index, 1);\n }\n break;\n case 'insert':\n if (this.index !== undefined && this.keyframe) {\n path.keyframes.splice(this.index + 1, 0, clone(this.keyframe));\n const interval = path.interval ?? 2;\n for (let i = this.index + 2; i < path.keyframes.length; i++) {\n path.keyframes[i].time = path.keyframes[i - 1].time + interval;\n }\n }\n break;\n case 'overwrite':\n if (this.index !== undefined && this.keyframe && path.keyframes[this.index]) {\n path.keyframes[this.index] = {\n ...path.keyframes[this.index],\n position: clone(this.keyframe.position),\n target: clone(this.keyframe.target),\n };\n }\n break;\n }\n }\n\n undo(store: SceneStore): void {\n if (this.beforePaths) {\n store.doc.flyPaths = clone(this.beforePaths);\n if (store.doc.flyPaths.length === 0) delete store.doc.flyPaths;\n } else {\n delete store.doc.flyPaths;\n }\n }\n}\n\n// ── 视觉效果命令 ──\n\n/** 添加视觉效果 */\nexport class AddEffectCommand implements Command {\n readonly label = '添加特效';\n\n constructor(\n private readonly nodeId: string,\n private readonly effect: VisualEffect,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node) return;\n if (!node.effects) node.effects = [];\n if (!node.effects.find(e => e.id === this.effect.id)) {\n node.effects.push(clone(this.effect));\n }\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects) return;\n node.effects = node.effects.filter(e => e.id !== this.effect.id);\n if (node.effects.length === 0) delete node.effects;\n }\n}\n\n/** 更新视觉效果 */\nexport class UpdateEffectCommand implements Command {\n readonly label = '修改特效';\n private oldEffect: VisualEffect | undefined;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n private readonly newEffect: VisualEffect,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index]) return;\n this.oldEffect = clone(node.effects[this.index]);\n node.effects[this.index] = clone(this.newEffect);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index] || !this.oldEffect) return;\n node.effects[this.index] = clone(this.oldEffect);\n }\n}\n\n/** 删除视觉效果 */\nexport class RemoveEffectCommand implements Command {\n readonly label = '删除特效';\n private oldEffect: VisualEffect | undefined;\n private oldIndex = -1;\n\n constructor(\n private readonly nodeId: string,\n private readonly index: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node?.effects?.[this.index]) return;\n this.oldEffect = clone(node.effects[this.index]);\n this.oldIndex = this.index;\n node.effects.splice(this.index, 1);\n if (node.effects.length === 0) delete node.effects;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n if (!node || !this.oldEffect) return;\n if (!node.effects) node.effects = [];\n node.effects.splice(this.oldIndex, 0, clone(this.oldEffect));\n }\n}\n\n// ── 路径点编辑命令 ──\n\n/** 更新路径点位置 */\nexport class UpdatePathPointsCommand implements Command {\n readonly label = '修改路径点';\n private oldPoints: Vec3[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly newPoints: Vec3[],\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n this.oldPoints = clone(effect.pathPoints);\n effect.pathPoints = clone(this.newPoints);\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n }\n}\n\nexport class InsertPathPointCommand implements Command {\n readonly label = '添加路径点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly insertAfter: number,\n private readonly position: Vec3,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const newPoints = clone(effect.pathPoints);\n newPoints.splice(this.insertAfter + 1, 0, clone(this.position));\n\n // 插入对应的 segmentType(默认 linear)\n const newSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : [];\n if (newSegmentTypes.length === newPoints.length - 2) {\n newSegmentTypes.splice(this.insertAfter + 1, 0, 'linear');\n } else {\n // 如果 segmentTypes 长度不对,重新生成\n while (newSegmentTypes.length < newPoints.length - 1) {\n newSegmentTypes.push('linear');\n }\n }\n\n effect.pathPoints = newPoints;\n effect.segmentTypes = newSegmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n\n/** 删除路径点(最少保留 2 个) */\nexport class RemovePathPointCommand implements Command {\n readonly label = '删除路径点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly pointIndex: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n if (effect.pathPoints.length <= 2) return; // 最少保留 2 个点\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const newPoints = clone(effect.pathPoints);\n newPoints.splice(this.pointIndex, 1);\n\n // 删除对应的 segmentType\n const newSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : [];\n if (newSegmentTypes.length >= newPoints.length) {\n // 删除点前面的段类型(如果存在)\n const segIndex = Math.min(this.pointIndex, newSegmentTypes.length - 1);\n newSegmentTypes.splice(segIndex, 1);\n }\n // 确保长度匹配\n while (newSegmentTypes.length < newPoints.length - 1) {\n newSegmentTypes.push('linear');\n }\n\n effect.pathPoints = newPoints;\n effect.segmentTypes = newSegmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n\n/** 切换段类型(直线/曲线) */\nexport class ToggleSegmentTypeCommand implements Command {\n readonly label = '切换段类型';\n private oldType: ('linear' | 'smooth') | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly segmentIndex: number,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n if (!effect.segmentTypes) {\n effect.segmentTypes = new Array(effect.pathPoints.length - 1).fill('linear');\n }\n if (this.segmentIndex < 0 || this.segmentIndex >= effect.segmentTypes.length) return;\n\n this.oldType = effect.segmentTypes[this.segmentIndex];\n effect.segmentTypes[this.segmentIndex] = this.oldType === 'linear' ? 'smooth' : 'linear';\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldType) return;\n effect.segmentTypes[this.segmentIndex] = this.oldType;\n }\n}\n\n/** 移动控制点到数组开头或结尾 */\nexport class MovePathPointToEndCommand implements Command {\n readonly label = '移动控制点';\n private oldPoints: Vec3[] | null = null;\n private oldSegmentTypes: ('linear' | 'smooth')[] | null = null;\n\n constructor(\n private readonly nodeId: string,\n private readonly effectIndex: number,\n private readonly pointIndex: number,\n private readonly toStart: boolean,\n ) {}\n\n do(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle') return;\n\n this.oldPoints = clone(effect.pathPoints);\n this.oldSegmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : null;\n\n const points = [...effect.pathPoints];\n const segmentTypes = effect.segmentTypes ? [...effect.segmentTypes] : new Array(points.length - 1).fill('linear');\n\n // 取出要移动的点\n const point = points.splice(this.pointIndex, 1)[0];\n\n // 调整 segmentTypes:删除被移动点相关的段\n if (this.pointIndex > 0) {\n segmentTypes.splice(this.pointIndex - 1, 1);\n }\n if (this.pointIndex < points.length) {\n segmentTypes.splice(this.pointIndex, 1);\n }\n\n // 插入到开头或结尾\n if (this.toStart) {\n points.unshift(point);\n segmentTypes.unshift('linear');\n } else {\n points.push(point);\n segmentTypes.push('linear');\n }\n\n effect.pathPoints = points;\n effect.segmentTypes = segmentTypes;\n }\n\n undo(store: SceneStore): void {\n const node = store.node(this.nodeId);\n const effect = node?.effects?.[this.effectIndex];\n if (!effect || effect.kind !== 'path-particle' || !this.oldPoints) return;\n effect.pathPoints = clone(this.oldPoints);\n if (this.oldSegmentTypes) {\n effect.segmentTypes = [...this.oldSegmentTypes];\n }\n }\n}\n","/**\n * 粒子系统运行时\n * 使用 BufferGeometry + Points + ShaderMaterial 实现 GPU 加速的粒子效果\n */\n\nimport * as THREE from 'three';\nimport type { ParticleEffect, Vec3 } from './types';\n\n// 顶点着色器\nconst VERTEX_SHADER = `\n attribute float aAge;\n attribute float aLifetime;\n attribute float aSize;\n\n varying float vProgress; // age / lifetime (0-1)\n\n void main() {\n vProgress = clamp(aAge / max(aLifetime, 0.001), 0.0, 1.0);\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n // 粒子大小:初始小,逐渐变大(蒸汽扩散效果)\n // 生命周期内膨胀 5 倍,初始更大\n float sizeGrowth = 1.0 + vProgress * 4.0;\n // 距离衰减:更大的基础大小\n gl_PointSize = aSize * sizeGrowth * (300.0 / -mvPosition.z);\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n// 片元着色器\nconst FRAGMENT_SHADER = `\n varying float vProgress;\n\n uniform vec3 uStartColor;\n uniform vec3 uEndColor;\n uniform float uStartOpacity;\n uniform float uEndOpacity;\n\n void main() {\n // 圆形粒子\n vec2 center = gl_PointCoord - vec2(0.5);\n float dist = length(center);\n if (dist > 0.5) discard;\n\n // 颜色在 startColor → endColor 间插值\n vec3 color = mix(uStartColor, uEndColor, vProgress);\n\n // 透明度:缓慢出现,慢慢消失(蒸汽扩散效果)\n float fadeIn = smoothstep(0.0, 0.2, vProgress); // 更长的淡入\n float fadeOut = 1.0 - smoothstep(0.4, 1.0, vProgress); // 更晚开始消散\n float baseOpacity = mix(uStartOpacity, uEndOpacity, vProgress);\n float alpha = baseOpacity * fadeIn * fadeOut;\n\n // 更柔和的边缘(蒸汽扩散效果)\n // 使用更小的指数值让边缘更模糊\n float edgeSoft = exp(-dist * dist * 4.0); // 从 8.0 降到 4.0\n alpha *= edgeSoft;\n\n gl_FragColor = vec4(color, alpha);\n }\n`;\n\n/** 粒子运行时状态 */\nexport class ParticleRuntime {\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n points: THREE.Points;\n\n // CPU 侧状态\n private positions: Float32Array;\n private velocities: Float32Array;\n private ages: Float32Array;\n private lifetimes: Float32Array;\n private sizes: Float32Array;\n private alive: Uint8Array;\n private emitAccumulator = 0;\n private config: ParticleEffect;\n private origin: THREE.Vector3;\n /** 水平漂移累积(每个粒子独立的随机相位) */\n private driftPhases: Float32Array;\n\n // BufferAttribute 引用\n private posAttr: THREE.BufferAttribute;\n private ageAttr: THREE.BufferAttribute;\n private lifetimeAttr: THREE.BufferAttribute;\n private sizeAttr: THREE.BufferAttribute;\n\n constructor(config: ParticleEffect, origin: THREE.Vector3) {\n this.config = { ...config };\n this.origin = origin.clone();\n const max = config.maxParticles;\n\n // CPU 数组\n this.positions = new Float32Array(max * 3);\n this.velocities = new Float32Array(max * 3);\n this.ages = new Float32Array(max);\n this.lifetimes = new Float32Array(max);\n this.sizes = new Float32Array(max);\n this.alive = new Uint8Array(max);\n this.driftPhases = new Float32Array(max); // 随机相位,用于漂移\n\n // 初始化所有粒子为 dead\n this.ages.fill(9999);\n this.lifetimes.fill(1);\n\n // BufferGeometry\n this.geometry = new THREE.BufferGeometry();\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.ageAttr = new THREE.BufferAttribute(this.ages, 1);\n this.ageAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aAge', this.ageAttr);\n\n this.lifetimeAttr = new THREE.BufferAttribute(this.lifetimes, 1);\n this.lifetimeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aLifetime', this.lifetimeAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n // 颜色和透明度通过 uniform 传入(startColor/endColor/startOpacity/endOpacity)\n // 每个粒子的 color 和 opacity 在顶点着色器中根据 progress 插值\n\n // ShaderMaterial\n const startColor = new THREE.Color(config.startColor);\n const endColor = new THREE.Color(config.endColor);\n\n this.material = new THREE.ShaderMaterial({\n vertexShader: VERTEX_SHADER,\n fragmentShader: FRAGMENT_SHADER,\n uniforms: {\n uStartColor: { value: startColor },\n uEndColor: { value: endColor },\n uStartOpacity: { value: config.startOpacity },\n uEndOpacity: { value: config.endOpacity },\n },\n transparent: true,\n depthWrite: false,\n blending: config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n this.points = new THREE.Points(this.geometry, this.material);\n this.points.frustumCulled = false;\n }\n\n /** 更新配置参数(不重建 geometry) */\n updateConfig(config: ParticleEffect): void {\n this.config = { ...config };\n const startColor = new THREE.Color(config.startColor);\n const endColor = new THREE.Color(config.endColor);\n this.material.uniforms['uStartColor'].value = startColor;\n this.material.uniforms['uEndColor'].value = endColor;\n this.material.uniforms['uStartOpacity'].value = config.startOpacity;\n this.material.uniforms['uEndOpacity'].value = config.endOpacity;\n this.material.blending = config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending;\n this.material.needsUpdate = true;\n }\n\n /** 发射粒子 */\n private emit(count: number): void {\n const cfg = this.config;\n const dir = new THREE.Vector3(...cfg.direction).normalize();\n const spread = cfg.spreadAngle;\n\n for (let i = 0; i < count; i++) {\n // 找一个 dead 的槽位\n const idx = this.findDeadSlot();\n if (idx < 0) break;\n\n // 位置:从 origin 发射\n const i3 = idx * 3;\n this.positions[i3] = this.origin.x;\n this.positions[i3 + 1] = this.origin.y;\n this.positions[i3 + 2] = this.origin.z;\n\n // 速度:direction + 随机锥角偏移\n const velocity = dir.clone();\n if (spread > 0) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.random() * spread;\n const sinPhi = Math.sin(phi);\n velocity.x += sinPhi * Math.cos(theta);\n velocity.y += Math.cos(phi);\n velocity.z += sinPhi * Math.sin(theta);\n velocity.normalize();\n }\n velocity.multiplyScalar(cfg.speed * (0.8 + Math.random() * 0.4));\n this.velocities[i3] = velocity.x;\n this.velocities[i3 + 1] = velocity.y;\n this.velocities[i3 + 2] = velocity.z;\n\n // 年龄、生命、大小\n this.ages[idx] = 0;\n this.lifetimes[idx] = cfg.lifetime * (0.8 + Math.random() * 0.4);\n this.sizes[idx] = cfg.size + (Math.random() - 0.5) * cfg.sizeRandom * 2;\n this.driftPhases[idx] = Math.random() * Math.PI * 2; // 随机漂移相位\n this.alive[idx] = 1;\n }\n }\n\n private findDeadSlot(): number {\n for (let i = 0; i < this.config.maxParticles; i++) {\n if (!this.alive[i]) return i;\n }\n return -1;\n }\n\n /** 每帧更新 */\n update(dt: number): void {\n const cfg = this.config;\n const gravity = cfg.gravity;\n const damping = cfg.damping;\n\n // 发射新粒子\n this.emitAccumulator += cfg.emissionRate * dt;\n const toEmit = Math.floor(this.emitAccumulator);\n if (toEmit > 0) {\n this.emit(toEmit);\n this.emitAccumulator -= toEmit;\n }\n\n // 更新现有粒子\n for (let i = 0; i < cfg.maxParticles; i++) {\n if (!this.alive[i]) continue;\n\n this.ages[i] += dt;\n if (this.ages[i] >= this.lifetimes[i]) {\n // 粒子死亡\n this.alive[i] = 0;\n this.ages[i] = 9999;\n // 移到屏幕外\n const i3 = i * 3;\n this.positions[i3] = 0;\n this.positions[i3 + 1] = -9999;\n this.positions[i3 + 2] = 0;\n continue;\n }\n\n const i3 = i * 3;\n\n // 进度\n const progress = this.ages[i] / this.lifetimes[i];\n\n // 重力(负值 = 向上浮力)\n this.velocities[i3 + 1] -= gravity * dt;\n\n // 上升速度随时间衰减(蒸汽浮力减弱)\n this.velocities[i3 + 1] *= (1 - 0.3 * dt);\n\n // 水平漂移:随进度增大,模拟蒸汽扩散\n const driftStrength = progress * 0.8; // 越老漂移越强\n const phase = this.driftPhases[i];\n this.velocities[i3] += Math.sin(phase + this.ages[i] * 1.5) * driftStrength * dt;\n this.velocities[i3 + 2] += Math.cos(phase + this.ages[i] * 1.2) * driftStrength * dt;\n\n // 速度衰减(空气阻力)\n this.velocities[i3] *= (1 - damping * dt);\n this.velocities[i3 + 2] *= (1 - damping * dt);\n\n // 位置更新\n this.positions[i3] += this.velocities[i3] * dt;\n this.positions[i3 + 1] += this.velocities[i3 + 1] * dt;\n this.positions[i3 + 2] += this.velocities[i3 + 2] * dt;\n }\n\n // 标记 buffer 需要更新\n this.posAttr.needsUpdate = true;\n this.ageAttr.needsUpdate = true;\n this.lifetimeAttr.needsUpdate = true;\n this.sizeAttr.needsUpdate = true;\n }\n\n /** 更新粒子系统的原点位置(跟随父节点) */\n setOrigin(position: THREE.Vector3): void {\n this.origin.copy(position);\n }\n\n dispose(): void {\n this.geometry.dispose();\n this.material.dispose();\n this.points.parent?.remove(this.points);\n }\n}\n","/**\n * 分段路径 — 根据 segmentTypes 逐段生成曲线\n * - 'linear': 直线段(线性插值)\n * - 'smooth': 平滑曲线段(CatmullRom,前后各借一个控制点)\n *\n * 注意:CatmullRomCurve3([p0,p1,p2,p3]) 的参数范围是 p0→p3 (t=0→1)\n * 其中 p1 在 t=1/3, p2 在 t=2/3\n * 所以段 p1→p2 对应曲线参数 t∈[1/3, 2/3]\n */\n\nimport * as THREE from 'three';\n\n// CatmullRom 4 控制点时,p1 和 p2 对应的参数\nconst CR_T_START = 1 / 3; // p1 的位置\nconst CR_T_END = 2 / 3; // p2 的位置\n\ninterface LinearSegment {\n type: 'linear';\n start: THREE.Vector3;\n end: THREE.Vector3;\n length: number;\n}\n\ninterface SmoothSegment {\n type: 'smooth';\n curve: THREE.CatmullRomCurve3;\n length: number; // 仅 p1→p2 段的弧长\n}\n\ntype PathSegment = LinearSegment | SmoothSegment;\n\n/**\n * 分段路径类\n * 根据 segmentTypes 数组决定每段是直线还是曲线\n */\nexport class SegmentedPath {\n private segments: PathSegment[] = [];\n private totalLength: number = 0;\n\n /**\n * @param points 路径点数组\n * @param segmentTypes 段类型数组,长度 = points.length - 1\n */\n constructor(points: THREE.Vector3[], segmentTypes: ('linear' | 'smooth')[]) {\n this.buildSegments(points, segmentTypes);\n }\n\n private buildSegments(points: THREE.Vector3[], segmentTypes: ('linear' | 'smooth')[]): void {\n this.segments = [];\n\n if (points.length < 2) return;\n\n // 遍历每一段\n for (let i = 0; i < points.length - 1; i++) {\n const segType = segmentTypes[i] || 'linear';\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n if (segType === 'linear') {\n // 直段:线性插值\n const length = p1.distanceTo(p2);\n this.segments.push({\n type: 'linear',\n start: p1.clone(),\n end: p2.clone(),\n length,\n });\n } else {\n // 弯段:CatmullRom,需要前后各一个控制点\n const curve = new THREE.CatmullRomCurve3([p0, p1, p2, p3], false, 'catmullrom', 0.5);\n // 只计算 p1→p2 段的弧长(曲线参数 t∈[1/3, 2/3])\n const length = this.computeSegmentLength(curve, CR_T_START, CR_T_END);\n this.segments.push({\n type: 'smooth',\n curve,\n length,\n });\n }\n }\n\n // 计算总长度\n this.totalLength = this.segments.reduce((sum, seg) => sum + seg.length, 0);\n }\n\n /** 数值积分计算曲线在参数范围 [t0, t1] 内的弧长 */\n private computeSegmentLength(curve: THREE.CatmullRomCurve3, t0: number, t1: number, steps = 64): number {\n let length = 0;\n let prev = curve.getPoint(t0);\n for (let s = 1; s <= steps; s++) {\n const t = t0 + (s / steps) * (t1 - t0);\n const curr = curve.getPoint(t);\n length += prev.distanceTo(curr);\n prev = curr;\n }\n return length;\n }\n\n /** 将段内局部参数 t∈[0,1] 映射到曲线参数 t∈[1/3, 2/3] */\n private mapToCurveT(localT: number): number {\n return CR_T_START + localT * (CR_T_END - CR_T_START);\n }\n\n /** 获取段上某局部参数对应的点 */\n private getSmoothPoint(seg: SmoothSegment, localT: number): THREE.Vector3 {\n return seg.curve.getPoint(this.mapToCurveT(localT));\n }\n\n /**\n * 根据进度 t (0-1) 获取路径上的点\n * 按弧长参数化,保证匀速运动\n */\n getPointAt(t: number): THREE.Vector3 {\n if (this.segments.length === 0) {\n return new THREE.Vector3();\n }\n\n if (t <= 0) {\n const first = this.segments[0];\n return first.type === 'linear' ? first.start.clone() : this.getSmoothPoint(first, 0);\n }\n\n if (t >= 1) {\n const last = this.segments[this.segments.length - 1];\n return last.type === 'linear' ? last.end.clone() : this.getSmoothPoint(last, 1);\n }\n\n const targetLength = t * this.totalLength;\n let accumulatedLength = 0;\n\n for (const segment of this.segments) {\n if (accumulatedLength + segment.length >= targetLength) {\n // 找到目标段\n const localT = (targetLength - accumulatedLength) / segment.length;\n\n if (segment.type === 'linear') {\n return segment.start.clone().lerp(segment.end, localT);\n } else {\n return this.getSmoothPoint(segment, localT);\n }\n }\n\n accumulatedLength += segment.length;\n }\n\n // fallback:返回最后一个点\n const last = this.segments[this.segments.length - 1];\n return last.type === 'linear' ? last.end.clone() : this.getSmoothPoint(last, 1);\n }\n\n /**\n * 获取路径上的采样点(用于可视化)\n * @param totalSegments 总采样段数\n */\n getPoints(totalSegments: number = 64): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n\n if (this.segments.length === 0) return points;\n\n // 按段长度比例分配采样点数\n for (const segment of this.segments) {\n const segSamples = Math.max(1, Math.round((segment.length / this.totalLength) * totalSegments));\n\n if (segment.type === 'linear') {\n for (let i = 0; i <= segSamples; i++) {\n const t = i / segSamples;\n points.push(segment.start.clone().lerp(segment.end, t));\n }\n } else {\n // 只采样 p1→p2 段(曲线参数 t∈[1/3, 2/3])\n for (let i = 0; i <= segSamples; i++) {\n const localT = i / segSamples;\n points.push(this.getSmoothPoint(segment, localT));\n }\n }\n }\n\n // 去重(相邻段的连接点会重复)\n const uniquePoints: THREE.Vector3[] = [points[0]];\n for (let i = 1; i < points.length; i++) {\n const prev = uniquePoints[uniquePoints.length - 1];\n if (points[i].distanceTo(prev) > 0.001) {\n uniquePoints.push(points[i]);\n }\n }\n\n return uniquePoints;\n }\n\n /**\n * 按弧长均匀采样路径点(用于粒子均匀分布)\n * @param count 采样点数量\n */\n getSpacedPoints(count: number = 64): THREE.Vector3[] {\n const points: THREE.Vector3[] = [];\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n points.push(this.getPointAt(t));\n }\n return points;\n }\n\n /** 获取总长度 */\n getLength(): number {\n return this.totalLength;\n }\n\n /**\n * 根据进度 t (0-1) 获取路径在该点的切线方向(单位向量)\n */\n getTangentAt(t: number): THREE.Vector3 {\n if (this.segments.length === 0) {\n return new THREE.Vector3(0, 0, 1);\n }\n\n t = Math.max(0, Math.min(1, t));\n\n if (t <= 0) {\n const first = this.segments[0];\n if (first.type === 'linear') {\n return first.end.clone().sub(first.start).normalize();\n }\n return first.curve.getTangent(this.mapToCurveT(0)).normalize();\n }\n\n if (t >= 1) {\n const last = this.segments[this.segments.length - 1];\n if (last.type === 'linear') {\n return last.end.clone().sub(last.start).normalize();\n }\n return last.curve.getTangent(this.mapToCurveT(1)).normalize();\n }\n\n const targetLength = t * this.totalLength;\n let accumulatedLength = 0;\n\n for (const segment of this.segments) {\n if (accumulatedLength + segment.length >= targetLength) {\n const localT = (targetLength - accumulatedLength) / segment.length;\n\n if (segment.type === 'linear') {\n return segment.end.clone().sub(segment.start).normalize();\n } else {\n return segment.curve.getTangent(this.mapToCurveT(localT)).normalize();\n }\n }\n\n accumulatedLength += segment.length;\n }\n\n const last = this.segments[this.segments.length - 1];\n if (last.type === 'linear') {\n return last.end.clone().sub(last.start).normalize();\n }\n return last.curve.getTangent(this.mapToCurveT(1)).normalize();\n }\n}\n","/**\n * 路径粒子系统运行时\n * 粒子沿指定路径(曲线)运动,模拟管道水流/光纤效果\n */\n\nimport * as THREE from 'three';\nimport type { PathParticleEffect, Vec3 } from './types';\nimport { SegmentedPath } from './segmented-path';\n\n// 顶点着色器\nconst VERTEX_SHADER = `\n attribute float aProgress;\n attribute float aSize;\n attribute float aOpacity;\n attribute float aTrailProgress;\n\n varying float vOpacity;\n varying vec3 vColor;\n varying float vTrailProgress;\n varying float vProgress;\n\n uniform vec3 uColor;\n uniform float uBaseOpacity;\n uniform bool uTrail;\n\n void main() {\n vOpacity = aOpacity * uBaseOpacity;\n vColor = uColor;\n vTrailProgress = aTrailProgress;\n vProgress = aProgress;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\n if (uTrail) {\n gl_PointSize = aSize * (200.0 / -mvPosition.z) * (0.3 + 0.7 * aTrailProgress);\n } else {\n gl_PointSize = aSize * (200.0 / -mvPosition.z);\n }\n\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n// 片元着色器\nconst FRAGMENT_SHADER = `\n varying float vOpacity;\n varying vec3 vColor;\n varying float vTrailProgress;\n varying float vProgress;\n\n uniform bool uTrail;\n uniform bool uGlow;\n uniform int uTextureType;\n uniform float uTime;\n\n // 简易哈希噪声\n float hash(float n) { return fract(sin(n) * 43758.5453123); }\n\n void main() {\n vec2 center = gl_PointCoord - vec2(0.5);\n float dist = length(center);\n\n float shape;\n if (uTextureType == 0) {\n shape = exp(-dist * dist * 8.0);\n } else if (uTextureType == 1) {\n float tri = smoothstep(0.5, 0.0, abs(center.x) + center.y * 0.5 + 0.1);\n shape = tri * smoothstep(0.5, 0.0, dist);\n } else {\n float wave = sin(center.x * 6.2832) * 0.3;\n shape = smoothstep(0.1, 0.0, abs(center.y - wave) - 0.15) * smoothstep(0.5, 0.0, dist);\n }\n\n if (shape < 0.01) discard;\n\n float alpha = vOpacity * shape;\n\n if (uTrail) {\n alpha *= vTrailProgress;\n }\n\n if (uGlow) {\n alpha *= 1.0 + (1.0 - dist * 2.0) * 0.5;\n }\n\n // 沿流动方向拉伸的噪声,模拟水流动态模糊感\n float stretch = 3.0; // 拉伸倍数,越大条纹越长\n float noise1 = hash(floor((vProgress * 80.0 + uTime * 2.0) / stretch));\n float noise2 = hash(floor((vProgress * 80.0 + uTime * 2.0) / stretch + 17.31));\n float variation = 0.5 + 0.25 * noise1 + 0.25 * noise2; // [0.5, 1.0]\n\n vec3 col = vColor * variation;\n\n gl_FragColor = vec4(col, alpha);\n }\n`;\n\n/** 路径粒子运行时状态 */\nexport class PathParticleRuntime {\n geometry: THREE.BufferGeometry;\n material: THREE.ShaderMaterial;\n points: THREE.Points;\n\n // CPU 侧状态\n private positions: Float32Array;\n private progresses: Float32Array;\n private sizes: Float32Array;\n /** 每个粒子的固定 3D 偏移(管道截面内随机分布) */\n private offsets: Float32Array; // count * 3\n private opacities: Float32Array;\n private trailProgresses: Float32Array; // 拖尾进度\n private config: PathParticleEffect;\n\n // 路径曲线\n private curve: SegmentedPath;\n private time = 0;\n\n // BufferAttribute 引用\n private posAttr: THREE.BufferAttribute;\n private progressAttr: THREE.BufferAttribute;\n private sizeAttr: THREE.BufferAttribute;\n private opacityAttr: THREE.BufferAttribute;\n private trailAttr: THREE.BufferAttribute;\n\n constructor(config: PathParticleEffect) {\n this.config = { ...config };\n const count = config.particleCount;\n\n // 创建路径曲线\n const points = config.pathPoints.map((p: Vec3) => new THREE.Vector3(...p));\n const segmentTypes = config.segmentTypes || new Array(points.length - 1).fill('linear');\n this.curve = new SegmentedPath(points, segmentTypes);\n\n // CPU 数组\n this.positions = new Float32Array(count * 3);\n this.progresses = new Float32Array(count);\n this.sizes = new Float32Array(count);\n this.opacities = new Float32Array(count);\n this.trailProgresses = new Float32Array(count);\n this.offsets = new Float32Array(count * 3);\n\n const pipeR = config.pipeRadius ?? 0.3;\n\n // 初始化粒子:均匀分布在路径上,截面圆盘内随机偏移\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n this.progresses[i] = t;\n this.trailProgresses[i] = 1.0;\n\n // offsets 存储角度和半径(圆盘内均匀分布),实际 3D 偏移在 update 时根据切线计算\n const angle = Math.random() * Math.PI * 2;\n const radius = pipeR * Math.sqrt(Math.random());\n this.offsets[i * 3] = angle;\n this.offsets[i * 3 + 1] = radius;\n this.offsets[i * 3 + 2] = 0;\n\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(angle, radius, tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n this.sizes[i] = config.size;\n this.opacities[i] = 0.5 + Math.random() * 0.5;\n }\n\n // BufferGeometry\n this.geometry = new THREE.BufferGeometry();\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.progressAttr = new THREE.BufferAttribute(this.progresses, 1);\n this.progressAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aProgress', this.progressAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n this.opacityAttr = new THREE.BufferAttribute(this.opacities, 1);\n this.opacityAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aOpacity', this.opacityAttr);\n\n this.trailAttr = new THREE.BufferAttribute(this.trailProgresses, 1);\n this.trailAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aTrailProgress', this.trailAttr);\n\n // ShaderMaterial\n const color = new THREE.Color(config.color);\n\n this.material = new THREE.ShaderMaterial({\n vertexShader: VERTEX_SHADER,\n fragmentShader: FRAGMENT_SHADER,\n uniforms: {\n uColor: { value: color },\n uBaseOpacity: { value: config.opacity },\n uTrail: { value: config.trail || false },\n uGlow: { value: config.glow || false },\n uTextureType: { value: config.textureType === 'dot' ? 0 : config.textureType === 'arrow' ? 1 : 2 },\n uTime: { value: 0 },\n },\n transparent: true,\n depthTest: true,\n depthWrite: false,\n blending: config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n this.points = new THREE.Points(this.geometry, this.material);\n this.points.frustumCulled = false;\n }\n\n /** 获取当前路径点(用于比较是否变化) */\n getPathPoints(): Vec3[] {\n return this.config.pathPoints;\n }\n\n /** 更新配置参数 */\n updateConfig(config: PathParticleEffect): void {\n const oldCount = this.config.particleCount;\n const oldSize = this.config.size;\n const oldPathPoints = this.config.pathPoints; // 保存旧的路径点\n const oldSegmentTypes = this.config.segmentTypes; // 保存旧的段类型\n const oldPipeRadius = this.config.pipeRadius; // 保存旧的分布半径\n this.config = { ...config };\n\n const color = new THREE.Color(config.color);\n this.material.uniforms['uColor'].value = color;\n this.material.uniforms['uBaseOpacity'].value = config.opacity;\n this.material.uniforms['uTrail'].value = config.trail || false;\n this.material.uniforms['uGlow'].value = config.glow || false;\n this.material.uniforms['uTextureType'].value = config.textureType === 'dot' ? 0 : config.textureType === 'arrow' ? 1 : 2;\n this.material.blending = config.blendMode === 'additive' ? THREE.AdditiveBlending : THREE.NormalBlending;\n this.material.needsUpdate = true;\n\n // 如果粒子数量或大小变化,重建 buffer\n if (config.particleCount !== oldCount || config.size !== oldSize) {\n this.rebuildBuffers(config.particleCount);\n }\n\n // 如果路径点或段类型变化,重建曲线\n if (this.pathChanged(oldPathPoints, config.pathPoints) || this.segmentTypesChanged(oldSegmentTypes, config.segmentTypes)) {\n const points = config.pathPoints.map((p: Vec3) => new THREE.Vector3(...p));\n const segmentTypes = config.segmentTypes || new Array(points.length - 1).fill('linear');\n this.curve = new SegmentedPath(points, segmentTypes);\n\n // 重建所有粒子位置\n const count = this.config.particleCount;\n for (let i = 0; i < count; i++) {\n const t = i / count;\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n\n // 如果分布半径变化,重新生成半径偏移并更新位置(保留进度和角度)\n if (config.pipeRadius !== oldPipeRadius && config.particleCount === oldCount) {\n const pipeR = config.pipeRadius ?? 0.3;\n const count = config.particleCount;\n for (let i = 0; i < count; i++) {\n // 按比例缩放旧半径,保持分布形状\n const oldR = oldPipeRadius ?? 0.3;\n const scale = pipeR / oldR;\n this.offsets[i * 3 + 1] *= scale;\n // 重新计算位置\n const t = this.progresses[i];\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n }\n\n private segmentTypesChanged(oldTypes: ('linear' | 'smooth')[] | undefined, newTypes: ('linear' | 'smooth')[] | undefined): boolean {\n if (!oldTypes && !newTypes) return false;\n if (!oldTypes || !newTypes) return true;\n if (oldTypes.length !== newTypes.length) return true;\n for (let i = 0; i < oldTypes.length; i++) {\n if (oldTypes[i] !== newTypes[i]) return true;\n }\n return false;\n }\n\n private pathChanged(oldPoints: Vec3[], newPoints: Vec3[]): boolean {\n if (newPoints.length !== oldPoints.length) return true;\n for (let i = 0; i < newPoints.length; i++) {\n if (newPoints[i][0] !== oldPoints[i][0] ||\n newPoints[i][1] !== oldPoints[i][1] ||\n newPoints[i][2] !== oldPoints[i][2]) {\n return true;\n }\n }\n return false;\n }\n\n private rebuildBuffers(count: number): void {\n // 保存旧进度,重建后恢复(避免调参时水流突然重置)\n const oldProgresses = this.progresses ? Float32Array.from(this.progresses) : null;\n const oldOffsets = this.offsets ? Float32Array.from(this.offsets) : null;\n\n this.positions = new Float32Array(count * 3);\n this.progresses = new Float32Array(count);\n this.sizes = new Float32Array(count);\n this.opacities = new Float32Array(count);\n this.trailProgresses = new Float32Array(count);\n this.offsets = new Float32Array(count * 3);\n\n const pipeR = this.config.pipeRadius ?? 0.3;\n\n for (let i = 0; i < count; i++) {\n const t = count > 1 ? i / (count - 1) : 0;\n // 保留旧进度(如果存在),新粒子从初始位置开始\n this.progresses[i] = oldProgresses && i < oldProgresses.length ? oldProgresses[i] : t;\n this.trailProgresses[i] = 1.0;\n\n // 保留旧偏移(角度+半径),新粒子随机生成\n if (oldOffsets && i < oldOffsets.length / 3) {\n this.offsets[i * 3] = oldOffsets[i * 3];\n this.offsets[i * 3 + 1] = oldOffsets[i * 3 + 1];\n this.offsets[i * 3 + 2] = 0;\n } else {\n const angle = Math.random() * Math.PI * 2;\n const radius = pipeR * Math.sqrt(Math.random());\n this.offsets[i * 3] = angle;\n this.offsets[i * 3 + 1] = radius;\n this.offsets[i * 3 + 2] = 0;\n }\n\n const pos = this.curve.getPointAt(this.progresses[i]);\n const tangent = this.curve.getTangentAt(this.progresses[i]);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n this.sizes[i] = this.config.size;\n this.opacities[i] = 0.5 + Math.random() * 0.5;\n }\n\n // 创建新的 BufferAttribute 并替换旧的(粒子数量变化时必须这样做)\n this.posAttr = new THREE.BufferAttribute(this.positions, 3);\n this.posAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('position', this.posAttr);\n\n this.progressAttr = new THREE.BufferAttribute(this.progresses, 1);\n this.progressAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aProgress', this.progressAttr);\n\n this.sizeAttr = new THREE.BufferAttribute(this.sizes, 1);\n this.sizeAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aSize', this.sizeAttr);\n\n this.opacityAttr = new THREE.BufferAttribute(this.opacities, 1);\n this.opacityAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aOpacity', this.opacityAttr);\n\n this.trailAttr = new THREE.BufferAttribute(this.trailProgresses, 1);\n this.trailAttr.setUsage(THREE.DynamicDrawUsage);\n this.geometry.setAttribute('aTrailProgress', this.trailAttr);\n }\n\n /** 每帧更新 */\n update(dt: number): void {\n this.time += dt;\n this.material.uniforms['uTime'].value = this.time;\n\n const cfg = this.config;\n const count = cfg.particleCount;\n const speed = cfg.speed;\n const trail = cfg.trail || false;\n\n // 拖尾进度:先求最大进度(只算一次,避免 O(n²))\n let maxProgress = 0;\n if (trail) {\n for (let j = 0; j < count; j++) {\n if (this.progresses[j] > maxProgress) maxProgress = this.progresses[j];\n }\n }\n\n for (let i = 0; i < count; i++) {\n // 更新进度\n this.progresses[i] += speed * dt;\n\n // 循环或重置\n if (this.progresses[i] > 1) {\n if (cfg.loop) {\n this.progresses[i] -= 1;\n } else {\n this.progresses[i] = 0;\n }\n }\n\n // 根据进度获取路径上的位置 + 垂直于切线的圆盘偏移\n const t = Math.max(0, Math.min(1, this.progresses[i]));\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n\n // 拖尾进度:距最前方粒子的归一化距离\n if (trail) {\n this.trailProgresses[i] = maxProgress > 0 ? this.progresses[i] / maxProgress : 1.0;\n } else {\n this.trailProgresses[i] = 1.0;\n }\n }\n\n // 标记 buffer 需要更新\n this.posAttr.needsUpdate = true;\n this.progressAttr.needsUpdate = true;\n this.trailAttr.needsUpdate = true;\n }\n\n /** 更新路径点(仅更新曲线和粒子位置,不更新 config.pathPoints) */\n setPathPoints(points: Vec3[], segmentTypes?: ('linear' | 'smooth')[]): void {\n // 不更新 this.config.pathPoints,避免 syncEffects 时误判为路径变化\n const vec3Points = points.map((p: Vec3) => new THREE.Vector3(...p));\n const types = segmentTypes || this.config.segmentTypes || new Array(vec3Points.length - 1).fill('linear');\n this.curve = new SegmentedPath(vec3Points, types);\n\n // 重新计算所有粒子位置\n const count = this.config.particleCount;\n for (let i = 0; i < count; i++) {\n const t = this.progresses[i];\n const pos = this.curve.getPointAt(t);\n const tangent = this.curve.getTangentAt(t);\n const off = PathParticleRuntime.offsetOnPlane(this.offsets[i * 3], this.offsets[i * 3 + 1], tangent);\n this.positions[i * 3] = pos.x + off.x;\n this.positions[i * 3 + 1] = pos.y + off.y;\n this.positions[i * 3 + 2] = pos.z + off.z;\n }\n this.posAttr.needsUpdate = true;\n }\n\n /** 根据切线方向,在垂直平面内计算圆盘偏移的 3D 向量 */\n private static _tmpN = new THREE.Vector3();\n private static _tmpB = new THREE.Vector3();\n private static _tmpT = new THREE.Vector3();\n static offsetOnPlane(angle: number, radius: number, tangent: THREE.Vector3): THREE.Vector3 {\n const t = this._tmpT.copy(tangent).normalize();\n // 选一个不与切线平行的参考轴\n const ref = Math.abs(t.x) < 0.9 ? this._tmpN.set(1, 0, 0) : this._tmpN.set(0, 1, 0);\n // 法线 = ref × t,副法线 = t × 法线\n const n = this._tmpN.crossVectors(ref, t).normalize();\n const b = this._tmpB.crossVectors(t, n).normalize();\n // 圆盘偏移 = radius * (cos(angle)*n + sin(angle)*b)\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return new THREE.Vector3(\n radius * (cos * n.x + sin * b.x),\n radius * (cos * n.y + sin * b.y),\n radius * (cos * n.z + sin * b.z),\n );\n }\n\n dispose(): void {\n this.geometry.dispose();\n this.material.dispose();\n this.points.parent?.remove(this.points);\n }\n}\n","/**\n * 路径编辑器 — 可视化编辑路径粒子的路径点\n * 控制点球体 + 路径线,支持拖拽/添加/删除\n * 复用 viewer 的 TransformControls,不创建独立实例\n */\n\nimport * as THREE from 'three';\nimport type { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';\nimport type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport type { Vec3, PathParticleEffect } from './types';\nimport type { SceneStore } from './store';\nimport { SegmentedPath } from './segmented-path';\n\nexport interface PathEditorCallbacks {\n onPathPointMoved(nodeId: string, effectIndex: number, pointIndex: number, newPosition: Vec3): void;\n onPathPointDrag?(nodeId: string, effectIndex: number, newPoints: Vec3[]): void;\n onAddPathPoint(nodeId: string, effectIndex: number, insertAfter: number, position: Vec3): void;\n onDeletePathPoint(nodeId: string, effectIndex: number, pointIndex: number): void;\n onActiveEffectChanged?(effectKey: string | null): void;\n /** 控制点右键点击 */\n onPathPointRightClick?(nodeId: string, effectIndex: number, pointIndex: number, position: Vec3, event: MouseEvent): void;\n /** 线段右键点击 */\n onSegmentRightClick?(nodeId: string, effectIndex: number, segmentIndex: number, position: Vec3, event: MouseEvent): void;\n /** 模型表面点击(左键) */\n onModelSurfaceClick?(nodeId: string, effectIndex: number, position: Vec3, event: PointerEvent): void;\n /** 移动控制点到数组开头/结尾 */\n onMovePathPointToEnd?(nodeId: string, effectIndex: number, pointIndex: number, toStart: boolean): void;\n /** 获取模型节点对象(用于添加子级) */\n getNodeObject?(nodeId: string): THREE.Object3D | null;\n}\n\ninterface PathVis {\n handles: THREE.Mesh[];\n curveLine: THREE.Line;\n segmentLines: THREE.Line[]; // 每段独立的线(用于颜色区分和点击检测)\n effectKey: string; // nodeId:effectId\n nodeId: string;\n effectIndex: number;\n pathPoints: Vec3[];\n segmentTypes: ('linear' | 'smooth')[];\n}\n\nconst HANDLE_RADIUS = 0.05;\nconst HANDLE_COLOR = 0x00ff88;\nconst LINEAR_COLOR = 0x4a9eff; // 直段蓝色\nconst SMOOTH_COLOR = 0x00ff88; // 弯段绿色\nconst SELECTED_COLOR = 0xffff00; // 选中黄色\nconst CURVE_SEGMENTS = 64;\n\n/** 共享几何体缓存(按半径) */\nconst handleGeometryCache = new Map<number, THREE.SphereGeometry>();\n\nfunction getHandleGeometry(radius: number = HANDLE_RADIUS): THREE.SphereGeometry {\n let geom = handleGeometryCache.get(radius);\n if (!geom) {\n geom = new THREE.SphereGeometry(radius, 16, 12);\n handleGeometryCache.set(radius, geom);\n }\n return geom;\n}\n\nexport class PathEditor {\n private visuals = new Map<string, PathVis>();\n private activeEffectKey: string | null = null;\n private dragging: { vis: PathVis; index: number; before: Vec3[] } | null = null;\n private handleSize: number = HANDLE_RADIUS;\n private pendingAttachIndex: number | null = null; // 待绑定的控制点索引(sync 后绑定)\n\n /** 复用 viewer 的 gizmo,不创建独立实例 */\n private gizmo: TransformControls | null = null;\n private raycaster = new THREE.Raycaster();\n private pointer = new THREE.Vector2();\n onActiveEffectChanged?: (effectKey: string | null) => void;\n\n /** 设置 viewer 的 gizmo(由 viewer 初始化时调用) */\n setGizmo(gizmo: TransformControls): void {\n this.gizmo = gizmo;\n }\n\n constructor(\n private scene: THREE.Scene,\n private camera: THREE.Camera,\n private renderer: THREE.WebGLRenderer,\n private store: SceneStore,\n private orbit: OrbitControls,\n private cb: PathEditorCallbacks,\n ) {\n // 不再创建独立的 TransformControls\n // gizmo 由 viewer 通过 setGizmo() 提供\n // 设置线段拾取阈值\n if (!this.raycaster.params.Line) {\n this.raycaster.params.Line = { threshold: 1 };\n } else {\n this.raycaster.params.Line.threshold = 1;\n }\n }\n\n /** 绑定 gizmo 事件(由 viewer 初始化时调用一次) */\n bindGizmoEvents(): void {\n if (!this.gizmo) return;\n\n this.gizmo.addEventListener('dragging-changed', (e) => {\n this.orbit.enabled = !e.value;\n if (e.value) {\n this.startDrag();\n } else {\n this.finishDrag();\n }\n });\n\n this.gizmo.addEventListener('objectChange', () => {\n if (this.dragging) {\n this.updateDrag();\n }\n });\n }\n\n // ── 公共 API ──\n\n /** 同步 store 数据到可视化 */\n sync(): void {\n // 拖动中不同步位置(避免重置)\n if (this.dragging) return;\n\n const activeKey = this.activeEffectKey;\n\n // 检查活动效果是否还存在,不存在则清理并退出编辑\n if (activeKey) {\n const [nodeId, effectId] = activeKey.split(':');\n const node = this.store.node(nodeId);\n const effectExists = node?.effects?.some(e => e.id === effectId && e.kind === 'path-particle');\n if (!effectExists) {\n // 活动效果已被删除,清理可视化并退出编辑\n const vis = this.visuals.get(activeKey);\n if (vis) {\n this.removeVisual(vis);\n this.visuals.delete(activeKey);\n }\n this.gizmo?.detach();\n this.activeEffectKey = null;\n this.onActiveEffectChanged?.(null);\n }\n }\n\n // 遍历所有节点的所有 path-particle 效果\n for (const node of this.store.doc.nodes) {\n if (!node.effects) continue;\n for (let i = 0; i < node.effects.length; i++) {\n const effect = node.effects[i];\n if (effect.kind !== 'path-particle') continue;\n\n const key = `${node.id}:${effect.id}`;\n const vis = this.visuals.get(key);\n\n if (key === activeKey) {\n // 活动效果:创建或更新\n if (!vis) {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n const newVis = this.createVisual(key, node.id, i, effect.pathPoints, segTypes);\n this.visuals.set(key, newVis);\n } else {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n // 检查路径点是否变化(撤销/重做时坐标变了,视觉需要更新)\n const pathPointsChanged = vis.pathPoints.length !== effect.pathPoints.length ||\n vis.pathPoints.some((p, idx) =>\n p[0] !== effect.pathPoints[idx][0] ||\n p[1] !== effect.pathPoints[idx][1] ||\n p[2] !== effect.pathPoints[idx][2]\n );\n if (pathPointsChanged) {\n this.updateVisual(vis, effect.pathPoints, segTypes, i);\n } else {\n // 只更新 segmentTypes\n vis.segmentTypes = [...segTypes];\n vis.effectIndex = i;\n }\n }\n } else if (vis) {\n // 非活动效果:移除可视化\n this.removeVisual(vis);\n this.visuals.delete(key);\n }\n }\n }\n\n // 清理已删除的效果\n for (const [key, vis] of this.visuals) {\n if (key !== activeKey) {\n this.removeVisual(vis);\n this.visuals.delete(key);\n }\n }\n\n // 同步后检查 gizmo 绑定\n const attached = this.gizmo?.object;\n if (activeKey) {\n const vis = this.visuals.get(activeKey);\n if (vis) {\n // 优先绑定到 pendingAttachIndex(新增控制点)\n if (this.pendingAttachIndex !== null) {\n this.gizmo?.detach();\n if (vis.handles[this.pendingAttachIndex]) {\n this.attachGizmo(vis, vis.handles[this.pendingAttachIndex], this.pendingAttachIndex);\n }\n this.pendingAttachIndex = null;\n } else if (attached) {\n // 检查当前绑定的控制点是否还存在\n const handles = this.getHandles();\n if (!handles.includes(attached as THREE.Mesh)) {\n // 控制点已被删除或重建,重新绑定到第一个控制点\n this.gizmo?.detach();\n if (vis.handles.length > 0) {\n this.attachGizmo(vis, vis.handles[0], 0);\n }\n }\n }\n }\n }\n }\n\n /** 设置活动编辑效果 */\n setActiveEffect(effectKey: string | null): void {\n if (this.activeEffectKey === effectKey) return;\n\n // 隐藏旧的活动效果\n if (this.activeEffectKey) {\n const oldVis = this.visuals.get(this.activeEffectKey);\n if (oldVis) {\n this.setVisVisible(oldVis, false);\n }\n }\n\n this.activeEffectKey = effectKey;\n\n // 立即创建并显示新的活动效果(不等待 sync)\n if (effectKey) {\n let newVis = this.visuals.get(effectKey);\n if (!newVis) {\n // 从 store 查找对应的 effect\n const [nodeId, effectId] = effectKey.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n const effect = node.effects[effectIndex];\n if (effect.kind === 'path-particle') {\n const segTypes = effect.segmentTypes && effect.segmentTypes.length === effect.pathPoints.length - 1\n ? effect.segmentTypes\n : new Array(effect.pathPoints.length - 1).fill('linear');\n newVis = this.createVisual(effectKey, nodeId, effectIndex, effect.pathPoints, segTypes);\n this.visuals.set(effectKey, newVis);\n }\n }\n }\n }\n if (newVis) {\n this.setVisVisible(newVis, true);\n // 自动选中第一个控制点\n if (newVis.handles.length > 0) {\n this.attachGizmo(newVis, newVis.handles[0], 0);\n }\n }\n } else {\n // 退出编辑模式\n this.gizmo?.detach();\n }\n\n // 通知外部更新选中状态(取消场景选中)\n this.onActiveEffectChanged?.(effectKey);\n }\n\n /** 是否正在编辑 */\n isActive(): boolean {\n return this.activeEffectKey !== null;\n }\n\n /** 获取所有绿球 mesh(用于射线检测) */\n getHandles(): THREE.Mesh[] {\n const handles: THREE.Mesh[] = [];\n for (const vis of this.visuals.values()) {\n handles.push(...vis.handles);\n }\n return handles;\n }\n\n /** 获取活动效果 key */\n getActiveEffectKey(): string | null {\n return this.activeEffectKey;\n }\n\n /** 根据世界坐标位置找到插入位置 */\n getInsertPosition(worldPoint: THREE.Vector3): { insertAfter: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return null;\n return this.findInsertPosition(vis, worldPoint);\n }\n\n /** 设置控制点球体大小 */\n setHandleSize(size: number): void {\n this.handleSize = size;\n // 清除几何体缓存\n handleGeometryCache.clear();\n // 重新创建所有控制点\n for (const vis of this.visuals.values()) {\n this.recreateHandles(vis);\n }\n }\n\n /** 设置待绑定的控制点索引(sync 后绑定到该点) */\n setPendingAttachIndex(index: number): void {\n this.pendingAttachIndex = index;\n }\n\n private recreateHandles(vis: PathVis): void {\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 移除旧的球体\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.handles.length = 0;\n\n // 创建新的球体(pathPoints 已经是本地坐标)\n for (let i = 0; i < vis.pathPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...vis.pathPoints[i]);\n handle.userData = {\n id: `__path_handle_${vis.effectKey}_${i}`,\n isPathHandle: true,\n effectKey: vis.effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n vis.handles.push(handle);\n }\n }\n\n /** 尝试拾取控制点,返回是否拾取到 */\n pickHandle(event: PointerEvent): boolean {\n if (!this.activeEffectKey) return false;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return false;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 确保控制点的世界矩阵是最新的\n for (const handle of vis.handles) {\n handle.updateWorldMatrix(true, false);\n }\n\n const intersects = this.raycaster.intersectObjects(vis.handles, false);\n if (intersects.length > 0) {\n const handle = intersects[0].object as THREE.Mesh;\n const index = vis.handles.indexOf(handle);\n if (index >= 0) {\n this.attachGizmo(vis, handle, index);\n return true;\n }\n }\n return false;\n }\n\n /** 尝试拾取路径线,返回插入位置 */\n pickCurve(event: PointerEvent, groundY: number = 0): { insertAfter: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis || vis.pathPoints.length < 2) return null;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 优先检测独立的线段(更精确)\n if (vis.segmentLines.length > 0) {\n // 确保线段的世界矩阵是最新的\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n const segIntersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (segIntersects.length > 0) {\n const segLine = segIntersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = segIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return {\n insertAfter: segmentIndex, // 在 segmentIndex 和 segmentIndex+1 之间插入\n position: [point.x, point.y, point.z],\n };\n }\n }\n\n // 降级:检测整体曲线\n if (vis.curveLine) {\n vis.curveLine.updateWorldMatrix(true, false);\n }\n const intersects = this.raycaster.intersectObject(vis.curveLine, false);\n if (intersects.length > 0) {\n const point = intersects[0].point;\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return this.findInsertPosition(vis, point);\n }\n return null;\n }\n\n /** 拾取线段,返回段索引 */\n pickSegment(event: PointerEvent): { segmentIndex: number; position: Vec3 } | null {\n if (!this.activeEffectKey) return null;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis || vis.segmentLines.length === 0) return null;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 确保线段的世界矩阵是最新的\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n\n const intersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (intersects.length > 0) {\n const segLine = intersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = intersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n return {\n segmentIndex,\n position: [point.x, point.y, point.z],\n };\n }\n return null;\n }\n\n /** 处理右键点击 */\n handleRightClick(event: MouseEvent): boolean {\n if (!this.activeEffectKey) return false;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return false;\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 确保世界矩阵是最新的(模型加载后可能需要更新)\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, true);\n }\n\n this.updatePointer(event);\n this.raycaster.setFromCamera(this.pointer, this.camera);\n\n // 先检测控制点\n for (const handle of vis.handles) {\n handle.updateWorldMatrix(true, false);\n }\n const handleIntersects = this.raycaster.intersectObjects(vis.handles, false);\n if (handleIntersects.length > 0) {\n const handle = handleIntersects[0].object as THREE.Mesh;\n const index = vis.handles.indexOf(handle);\n if (index >= 0) {\n const point = handleIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n this.cb.onPathPointRightClick?.(vis.nodeId, vis.effectIndex, index, [point.x, point.y, point.z], event);\n return true;\n }\n }\n\n // 再检测线段\n for (const line of vis.segmentLines) {\n line.updateWorldMatrix(true, false);\n }\n const segIntersects = this.raycaster.intersectObjects(vis.segmentLines, false);\n if (segIntersects.length > 0) {\n const segLine = segIntersects[0].object as THREE.Line;\n const segmentIndex = segLine.userData['segmentIndex'];\n const point = segIntersects[0].point;\n // 世界坐标转本地坐标\n if (nodeObj) {\n nodeObj.updateWorldMatrix(true, false);\n nodeObj.worldToLocal(point);\n }\n this.cb.onSegmentRightClick?.(vis.nodeId, vis.effectIndex, segmentIndex, [point.x, point.y, point.z], event);\n return true;\n }\n\n return false;\n }\n\n /** 根据点击位置找到插入位置(开头/结尾) */\n findInsertPosition(vis: PathVis, point: THREE.Vector3): { insertAfter: number; position: Vec3 } {\n const points = vis.pathPoints;\n if (points.length < 2) return { insertAfter: 0, position: [point.x, point.y, point.z] };\n\n const firstPoint = new THREE.Vector3(...points[0]);\n const lastPoint = new THREE.Vector3(...points[points.length - 1]);\n const distToStart = point.distanceTo(firstPoint);\n const distToEnd = point.distanceTo(lastPoint);\n\n // 离哪个端点近就插到哪个旁边\n const isNearEnd = distToEnd <= distToStart;\n return {\n insertAfter: isNearEnd ? points.length - 1 : -1,\n position: [point.x, point.y, point.z],\n };\n }\n\n /** 释放资源 */\n dispose(): void {\n for (const vis of this.visuals.values()) {\n this.removeVisual(vis);\n }\n this.visuals.clear();\n if (this.gizmo) {\n this.gizmo.detach();\n // 不 dispose gizmo,因为是 viewer 的实例\n }\n }\n\n // ── 私有方法 ──\n\n private updatePointer(event: MouseEvent | PointerEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n this.pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n this.pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n }\n\n private createVisual(effectKey: string, nodeId: string, effectIndex: number, pathPoints: Vec3[], segmentTypes: ('linear' | 'smooth')[]): PathVis {\n const handles: THREE.Mesh[] = [];\n const nodeObj = this.cb.getNodeObject?.(nodeId) ?? null;\n\n // 创建控制点球体(pathPoints 已经是本地坐标)\n for (let i = 0; i < pathPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...pathPoints[i]);\n handle.userData = {\n id: `__path_handle_${effectKey}_${i}`,\n isPathHandle: true,\n effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n handles.push(handle);\n }\n\n // 创建路径线(整体,用于显示)\n const curvePoints = this.buildCurvePoints(pathPoints, segmentTypes);\n const lineGeometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n const lineMaterial = new THREE.LineBasicMaterial({\n color: LINEAR_COLOR,\n transparent: true,\n opacity: 0.6,\n depthTest: false,\n });\n const curveLine = new THREE.Line(lineGeometry, lineMaterial);\n curveLine.renderOrder = 998;\n if (nodeObj) {\n nodeObj.add(curveLine);\n } else {\n this.scene.add(curveLine);\n }\n\n // 创建每段独立的线(用于颜色区分和点击检测)\n const segmentLines: THREE.Line[] = [];\n for (let i = 0; i < pathPoints.length - 1; i++) {\n const segPoints = this.buildSegmentCurvePoints(pathPoints, segmentTypes, i);\n const segGeom = new THREE.BufferGeometry().setFromPoints(segPoints);\n const color = segmentTypes[i] === 'smooth' ? SMOOTH_COLOR : LINEAR_COLOR;\n const segMat = new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n });\n const segLine = new THREE.Line(segGeom, segMat);\n segLine.renderOrder = 999;\n segLine.userData = {\n isPathSegment: true,\n effectKey,\n segmentIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(segLine);\n } else {\n this.scene.add(segLine);\n }\n segmentLines.push(segLine);\n }\n\n const vis: PathVis = {\n handles,\n curveLine,\n segmentLines,\n effectKey,\n nodeId,\n effectIndex,\n pathPoints: [...pathPoints],\n segmentTypes: [...segmentTypes],\n };\n\n // 如果不是活动效果,隐藏\n if (effectKey !== this.activeEffectKey) {\n this.setVisVisible(vis, false);\n }\n\n return vis;\n }\n\n private updateVisual(vis: PathVis, newPoints: Vec3[], newSegmentTypes: ('linear' | 'smooth')[], effectIndex: number): void {\n vis.effectIndex = effectIndex;\n\n // 更新 segmentTypes\n vis.segmentTypes = [...newSegmentTypes];\n\n const nodeObj = this.cb.getNodeObject?.(vis.nodeId) ?? null;\n\n // 检查点数是否变化\n if (vis.pathPoints.length !== newPoints.length) {\n // 重建控制点\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.handles.length = 0;\n\n for (let i = 0; i < newPoints.length; i++) {\n const material = new THREE.MeshBasicMaterial({\n color: HANDLE_COLOR,\n transparent: true,\n opacity: 0.85,\n });\n const handle = new THREE.Mesh(getHandleGeometry(this.handleSize), material);\n handle.position.set(...newPoints[i]);\n handle.userData = {\n id: `__path_handle_${vis.effectKey}_${i}`,\n isPathHandle: true,\n effectKey: vis.effectKey,\n pointIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(handle);\n // 补偿父级缩放,保持控制点视觉大小一致\n nodeObj.updateWorldMatrix(true, false);\n const s = new THREE.Vector3();\n nodeObj.getWorldScale(s);\n handle.scale.set(1 / s.x, 1 / s.y, 1 / s.z);\n } else {\n this.scene.add(handle);\n }\n vis.handles.push(handle);\n }\n } else {\n // 更新位置\n for (let i = 0; i < newPoints.length; i++) {\n vis.handles[i].position.set(...newPoints[i]);\n }\n }\n\n // 更新路径线\n const curvePoints = this.buildCurvePoints(newPoints, newSegmentTypes);\n vis.curveLine.geometry.dispose();\n vis.curveLine.geometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n\n // 重建每段独立的线\n for (const segLine of vis.segmentLines) {\n segLine.parent?.remove(segLine);\n segLine.geometry.dispose();\n (segLine.material as THREE.Material).dispose();\n }\n vis.segmentLines.length = 0;\n\n for (let i = 0; i < newPoints.length - 1; i++) {\n const segPoints = this.buildSegmentCurvePoints(newPoints, newSegmentTypes, i);\n const segGeom = new THREE.BufferGeometry().setFromPoints(segPoints);\n const color = newSegmentTypes[i] === 'smooth' ? SMOOTH_COLOR : LINEAR_COLOR;\n const segMat = new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n });\n const segLine = new THREE.Line(segGeom, segMat);\n segLine.renderOrder = 999;\n segLine.userData = {\n isPathSegment: true,\n effectKey: vis.effectKey,\n segmentIndex: i,\n };\n if (nodeObj) {\n nodeObj.add(segLine);\n } else {\n this.scene.add(segLine);\n }\n vis.segmentLines.push(segLine);\n }\n\n vis.pathPoints = [...newPoints];\n }\n\n private removeVisual(vis: PathVis): void {\n for (const handle of vis.handles) {\n handle.parent?.remove(handle);\n (handle.material as THREE.MeshBasicMaterial).dispose();\n }\n vis.curveLine.parent?.remove(vis.curveLine);\n vis.curveLine.geometry.dispose();\n (vis.curveLine.material as THREE.Material).dispose();\n for (const segLine of vis.segmentLines) {\n segLine.parent?.remove(segLine);\n segLine.geometry.dispose();\n (segLine.material as THREE.Material).dispose();\n }\n vis.segmentLines.length = 0;\n }\n\n private setVisVisible(vis: PathVis, visible: boolean): void {\n for (const handle of vis.handles) {\n handle.visible = visible;\n }\n vis.curveLine.visible = visible;\n for (const segLine of vis.segmentLines) {\n segLine.visible = visible;\n }\n }\n\n private buildCurvePoints(pathPoints: Vec3[], segmentTypes: ('linear' | 'smooth')[]): THREE.Vector3[] {\n if (pathPoints.length < 2) return [];\n const vec3Points = pathPoints.map((p) => new THREE.Vector3(...p));\n const types = segmentTypes.length === pathPoints.length - 1\n ? segmentTypes\n : new Array(pathPoints.length - 1).fill('linear');\n const path = new SegmentedPath(vec3Points, types);\n return path.getSpacedPoints(CURVE_SEGMENTS);\n }\n\n /** 为单个段构建曲线点,包含上下文点以便 smooth 段能正确弯曲 */\n private buildSegmentCurvePoints(\n allPoints: Vec3[],\n segmentTypes: ('linear' | 'smooth')[],\n segmentIndex: number,\n samplesPerSegment: number = 16,\n ): THREE.Vector3[] {\n const i = segmentIndex;\n const p1 = new THREE.Vector3(...allPoints[i]);\n const p2 = new THREE.Vector3(...allPoints[i + 1]);\n\n if (segmentTypes[i] !== 'smooth') {\n // 直线段:只需两个端点\n return [p1, p2];\n }\n\n // 弯段:使用前后各一个上下文点构造 CatmullRom\n // CatmullRomCurve3([p0, p1, p2, p3]) 的参数范围是 p0→p3 (t=0→1)\n // 其中 p1 在 t=1/3, p2 在 t=2/3,需要只采样 p1→p2 这段\n const p0 = new THREE.Vector3(...allPoints[Math.max(0, i - 1)]);\n const p3 = new THREE.Vector3(...allPoints[Math.min(allPoints.length - 1, i + 2)]);\n\n const curve = new THREE.CatmullRomCurve3([p0, p1, p2, p3], false, 'catmullrom', 0.5);\n const T0 = 1 / 3; // p1 对应的参数\n const T1 = 2 / 3; // p2 对应的参数\n\n const pts: THREE.Vector3[] = [];\n for (let s = 0; s <= samplesPerSegment; s++) {\n const t = T0 + (s / samplesPerSegment) * (T1 - T0);\n pts.push(curve.getPoint(t));\n }\n return pts;\n }\n\n private attachGizmo(vis: PathVis, handle: THREE.Mesh, index: number): void {\n if (!this.gizmo) return;\n this.gizmo.attach(handle);\n }\n\n private startDrag(): void {\n if (!this.activeEffectKey || !this.gizmo) return;\n const vis = this.visuals.get(this.activeEffectKey);\n if (!vis) return;\n\n // 找到正在拖拽的控制点索引\n const attached = this.gizmo.object;\n if (!attached) return;\n\n const index = vis.handles.indexOf(attached as THREE.Mesh);\n if (index < 0) return;\n\n this.dragging = {\n vis,\n index,\n before: [...vis.pathPoints.map((p) => [...p] as Vec3)],\n };\n }\n\n private updateDrag(): void {\n if (!this.dragging) return;\n const { vis, index } = this.dragging;\n const handle = vis.handles[index];\n if (!handle) return;\n\n // handle.position 是本地坐标,直接使用\n const newPos: Vec3 = [handle.position.x, handle.position.y, handle.position.z];\n vis.pathPoints[index] = newPos;\n\n // 更新整体路径线(pathPoints 已经是本地坐标)\n const curvePoints = this.buildCurvePoints(vis.pathPoints, vis.segmentTypes);\n vis.curveLine.geometry.dispose();\n vis.curveLine.geometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n\n // 更新每段独立的线\n for (let i = 0; i < vis.segmentLines.length; i++) {\n const segLine = vis.segmentLines[i];\n if (segLine) {\n const segPoints = this.buildSegmentCurvePoints(vis.pathPoints, vis.segmentTypes, i);\n segLine.geometry.dispose();\n segLine.geometry = new THREE.BufferGeometry().setFromPoints(segPoints);\n }\n }\n\n // 通知回调(实时更新粒子路径,不创建历史记录)\n this.cb.onPathPointDrag?.(vis.nodeId, vis.effectIndex, [...vis.pathPoints]);\n }\n\n private finishDrag(): void {\n if (!this.dragging) return;\n const { vis, index, before } = this.dragging;\n const handle = vis.handles[index];\n if (!handle) {\n this.dragging = null;\n return;\n }\n\n // 获取最终位置(本地坐标)\n const finalPos: Vec3 = [handle.position.x, handle.position.y, handle.position.z];\n\n // 检查是否真的移动了\n const oldPos = before[index];\n const moved = finalPos[0] !== oldPos[0] || finalPos[1] !== oldPos[1] || finalPos[2] !== oldPos[2];\n\n if (moved) {\n // 创建历史记录(一次撤销可以恢复原位)\n this.cb.onPathPointMoved(vis.nodeId, vis.effectIndex, index, finalPos);\n }\n\n this.dragging = null;\n }\n}\n","import * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { TextureLoader } from 'three';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { SSAOPass } from 'three/examples/jsm/postprocessing/SSAOPass.js';\nimport { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';\nimport { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js';\nimport type { NodeDoc, TransformState, Vec3, FlyPath, CameraKeyframe, DashboardConfig, DashboardWidget, VisualEffect, ParticleEffect, UvAnimationEffect, PathParticleEffect, ScreenContentEffect, AlarmPopupData } from './types';\nimport type { SceneStore } from './store';\nimport { ParticleRuntime } from './particle-system';\nimport { PathParticleRuntime } from './path-particle-system';\nimport { PathEditor, type PathEditorCallbacks } from './path-editor';\n\nexport type TransformMode = 'translate' | 'rotate' | 'scale';\n\nexport interface PickEvent {\n id: string | null;\n /** 是否按住 Ctrl/Cmd 追加(true = 切换;false = 排他选中) */\n additive: boolean;\n}\n\nexport interface ViewerCallbacks {\n onSelect(ev: PickEvent): void;\n onTransformEnd(id: string, before: TransformState, after: TransformState): void;\n /** 资产加载完成后生成缩略图 */\n onThumbnailGenerated?(assetId: string, dataUrl: string): void;\n /** 路径点移动 */\n onPathPointMoved?(nodeId: string, effectIndex: number, pointIndex: number, newPosition: Vec3): void;\n /** 添加路径点 */\n onAddPathPoint?(nodeId: string, effectIndex: number, insertAfter: number, position: Vec3): void;\n /** 删除路径点 */\n onDeletePathPoint?(nodeId: string, effectIndex: number, pointIndex: number): void;\n /** 路径编辑模式变化 */\n onPathEditingChanged?(isEditing: boolean): void;\n /** 控制点右键点击 */\n onPathPointRightClick?(nodeId: string, effectIndex: number, pointIndex: number, position: Vec3, event: MouseEvent): void;\n /** 线段右键点击 */\n onSegmentRightClick?(nodeId: string, effectIndex: number, segmentIndex: number, position: Vec3, event: MouseEvent): void;\n /** 模型表面点击(左键) */\n onModelSurfaceClick?(nodeId: string, effectIndex: number, position: Vec3, event: PointerEvent): void;\n /** 移动控制点到数组开头/结尾 */\n onMovePathPointToEnd?(nodeId: string, effectIndex: number, pointIndex: number, toStart: boolean): void;\n}\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\nconst PRIMITIVE_COLORS: Record<string, number> = {\n box: 0x4f83cc,\n sphere: 0xcc8a4f,\n cylinder: 0x57a773,\n};\n\n/** three.js 视口:只认 SceneStore 这份单一数据源,sync() 是唯一写 three 对象的入口 */\nexport class SceneViewer {\n private renderer: THREE.WebGLRenderer;\n /** 后处理合成器 */\n private composer!: EffectComposer;\n private scene = new THREE.Scene();\n private camera: THREE.PerspectiveCamera;\n private orbit: OrbitControls;\n private gizmo: TransformControls;\n private hemiLight: THREE.HemisphereLight | null = null;\n private dirLight: THREE.DirectionalLight | null = null;\n private objects = new Map<string, THREE.Object3D>();\n private helpers = new Map<string, THREE.BoxHelper>();\n private lightTargets = new Map<string, THREE.Object3D>();\n private lightHelpers = new Map<string, THREE.Object3D>();\n private lightPickers = new Map<string, THREE.Mesh>();\n private assetCache = new Map<string, THREE.Group>();\n /** 正在等待加载的节点(URL → 等待中的 nodeId 集合),处理 undo→redo 竞态 */\n private pendingAssetNodes = new Map<string, Set<string>>();\n /** 动画基础变换(nodeId → 数据模型原始变换) */\n private animBases = new Map<string, TransformState>();\n /** 缩略图渲染器(离屏) */\n private thumbRenderer?: THREE.WebGLRenderer;\n private thumbScene = new THREE.Scene();\n private thumbCamera = new THREE.PerspectiveCamera(50, 4 / 3, 0.1, 1000);\n /** 动画时间 */\n private animTime = 0;\n /** 上一帧时间戳 */\n private lastFrameTime = 0;\n /** 拖拽中冻结动画 */\n private animationFrozen = false;\n /** 相机是否已从文档恢复(只在首次 sync 时恢复一次) */\n private cameraRestored = false;\n /** 保存原始材质参数(覆盖前),用于撤销覆盖时恢复 */\n private originalMaterials = new Map<string, Record<string, { color: string; opacity: number; transparent: boolean; roughness: number; metalness: number; emissive: string; visible: boolean; map: THREE.Texture | null; normalMap: THREE.Texture | null; roughnessMap: THREE.Texture | null; metalnessMap: THREE.Texture | null; emissiveMap: THREE.Texture | null }>>();\n /** undo/redo 期间为 true,sync() 中据此传 isUndoRedoing 给 applyMaterialOverrides */\n private _isUndoRedoing = false;\n /** 贴图缓存(dataURL → THREE.Texture) */\n private textureCache = new Map<string, THREE.Texture>();\n /** 标签对象缓存(nodeId → label mesh) */\n private labelObjects = new Map<string, THREE.Mesh>();\n private textureLoader = new TextureLoader();\n /** HDRI 环境贴图缓存 */\n private hdriTexture: THREE.Texture | null = null;\n /** 当前 HDRI data URL(用于判断是否需要重新加载) */\n private hdriCurrentUrl: string | null = null;\n /** 网格辅助线 */\n private gridHelper: THREE.GridHelper;\n /** 场景空间网格 */\n private roomMesh: THREE.Mesh | null = null;\n /** 缓存上次的房间配置,避免每次 state 变化都重建 */\n private lastRoomKey = '';\n private gltfLoader = this.createGltfLoader();\n /** 正在加载中的资产 URL(防止重复加载) */\n private loadingAssetUrls = new Set<string>();\n private dragBefore: TransformState | null = null;\n private downPos: [number, number] | null = null;\n private ro: ResizeObserver;\n private raycaster = new THREE.Raycaster();\n private unsubDoc: () => void;\n private unsubSel: () => void;\n\n /** 看板 overlay 元素 */\n private dashboardOverlayEl?: HTMLDivElement;\n /** 看板 widget DOM 元素缓存 (widgetId → HTMLDivElement) */\n private dashboardElements = new Map<string, HTMLDivElement>();\n /** 看板数据源定时器 */\n private dashboardIntervals = new Map<string, number>();\n /** 看板当前数据值 (widgetId → value) */\n private dashboardValues = new Map<string, number | string>();\n\n // ── 飞行路线 ──\n /** 当前播放的飞行路线 */\n private flyPathPlaying: FlyPath | null = null;\n /** 播放开始的真实时间戳 */\n private flyPathStartTime = 0;\n\n // ── 告警弹窗 ──\n /** 告警弹窗 (nodeId → mesh) */\n private alarmPopups = new Map<string, THREE.Mesh>();\n /** 告警弹窗创建时间 (nodeId → timestamp) */\n private alarmCreationTime = new Map<string, number>();\n /** 暂停时已经过的时间(秒) */\n private flyPathPausedElapsed = 0;\n /** 是否暂停 */\n private flyPathPaused = false;\n /** 是否刚从暂停恢复(需要在下一帧重算 startTime) */\n private flyPathResuming = false;\n /** 飞行路线回调 */\n private flyPathCallbacks: { onComplete?: () => void } = {};\n\n // ── 框选 ──\n private boxSelecting = false;\n private boxStart: [number, number] | null = null;\n private boxEl: HTMLDivElement | null = null;\n\n // ── 键盘漫游(WASD) ──\n private keysPressed = new Set<string>();\n private moveSpeed = 5; // 单位/秒\n /** 复用的临时向量,避免每帧 GC */\n private _tmpVec = new THREE.Vector3();\n private _tmpVec2 = new THREE.Vector3();\n private _tmpVec3 = new THREE.Vector3();\n private _upVector = new THREE.Vector3(0, 1, 0);\n private onKeyDown!: (e: KeyboardEvent) => void;\n private onKeyUp!: (e: KeyboardEvent) => void;\n\n // ── 视觉效果 ──\n /** nodeId → effectId → THREE.Object3D(粒子系统等) */\n private effectObjects = new Map<string, Map<string, THREE.Object3D>>();\n /** `${nodeId}:${effectId}` → ParticleRuntime */\n private particleSystems = new Map<string, ParticleRuntime>();\n /** `${nodeId}:${effectId}` → PathParticleRuntime */\n private pathParticleSystems = new Map<string, PathParticleRuntime>();\n /** UV 动画状态:`${nodeId}:${effectId}` → { offsetU, offsetV } */\n private uvAnimStates = new Map<string, { offsetU: number; offsetV: number }>();\n /** 屏幕内容切换状态:`${nodeId}:${effectId}` → { intervalId, currentIndex, targetMeshName } */\n private screenContentStates = new Map<string, { intervalId: number; currentIndex: number; targetMeshName?: string }>();\n /** 管道水流效果导致的材质半透明:nodeId → [{ mesh, material, originalOpacity, originalDepthWrite }] */\n private pipeTransparencyBackup = new Map<string, { mesh: THREE.Mesh; material: THREE.Material; originalOpacity: number; originalDepthWrite: boolean }[]>();\n\n // ── 路径编辑器 ──\n private pathEditor: PathEditor;\n\n /** 是否为编辑器模式(编辑器模式下动画默认播放,不依赖数据) */\n private isEditorMode: boolean;\n\n constructor(\n private host: HTMLElement,\n private store: SceneStore,\n private cb: ViewerCallbacks,\n dashboardOverlayEl?: HTMLDivElement,\n isEditorMode = false,\n ) {\n this.isEditorMode = isEditorMode;\n this.dashboardOverlayEl = dashboardOverlayEl;\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this.renderer.toneMapping = THREE.ACESFilmicToneMapping;\n this.renderer.toneMappingExposure = 1.0;\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n host.appendChild(this.renderer.domElement);\n\n this.scene.background = new THREE.Color(0x808080);\n this.camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this.camera.position.set(6, 6, 8);\n\n this.gridHelper = new THREE.GridHelper(40, 40, 0x4a5568, 0x2a3140);\n this.scene.add(this.gridHelper);\n\n this.orbit = new OrbitControls(this.camera, this.renderer.domElement);\n this.orbit.enableDamping = true;\n\n this.gizmo = new TransformControls(this.camera, this.renderer.domElement);\n this.gizmo.setSize(0.9);\n this.gizmo.addEventListener('dragging-changed', (e: any) => {\n this.orbit.enabled = !e.value;\n });\n this.gizmo.addEventListener('mouseDown', () => {\n const id = this.store.selection[0];\n this.dragBefore = id ? this.snapshot(id) : null;\n // 冻结动画,让用户拖拽基于数据模型位置\n if (id && this.animBases.has(id)) {\n this.animationFrozen = true;\n const base = this.animBases.get(id)!;\n const obj = this.objects.get(id);\n if (obj) {\n obj.position.set(...base.position);\n obj.rotation.set(base.rotation[0] * DEG2RAD, base.rotation[1] * DEG2RAD, base.rotation[2] * DEG2RAD);\n obj.scale.set(...base.scale);\n }\n }\n });\n this.gizmo.addEventListener('mouseUp', () => {\n const id = this.store.selection[0];\n if (id && this.dragBefore) {\n this.cb.onTransformEnd(id, this.dragBefore, this.snapshot(id));\n }\n this.dragBefore = null;\n this.animationFrozen = false;\n });\n this.scene.add(this.gizmo.getHelper());\n\n const el = this.renderer.domElement;\n el.addEventListener('pointerdown', e => {\n // 路径编辑器优先处理控制点拖拽\n if (this.pathEditor.isActive() && this.pathEditor.pickHandle(e)) {\n return;\n }\n if (e.shiftKey) {\n // Shift + 左键:开始框选\n this.boxSelecting = true;\n this.boxStart = [e.clientX, e.clientY];\n this.orbit.enabled = false; // 锁定场景控制\n this.createBoxEl(e);\n } else {\n this.downPos = [e.clientX, e.clientY];\n }\n });\n el.addEventListener('pointermove', e => {\n if (this.boxSelecting && this.boxEl) {\n this.updateBoxEl(e);\n }\n });\n el.addEventListener('pointerup', e => {\n // 只处理左键(button===0),右键由 contextmenu 处理\n if (e.button !== 0) return;\n\n // 路径编辑器:点击路径线添加点\n if (this.pathEditor.isActive() && this.downPos && Math.hypot(e.clientX - this.downPos[0], e.clientY - this.downPos[1]) < 4) {\n const result = this.pathEditor.pickCurve(e);\n if (result) {\n const key = this.pathEditor.getActiveEffectKey();\n if (key) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 设置待绑定索引(sync 后绑定到新点)\n this.pathEditor.setPendingAttachIndex(result.insertAfter + 1);\n this.cb.onAddPathPoint?.(nodeId, effectIndex, result.insertAfter, result.position);\n this.downPos = null;\n return;\n }\n }\n }\n }\n\n // 路径编辑器:点击模型表面弹出菜单\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) allMeshes.push(obj);\n else obj.traverse(c => { if (c instanceof THREE.Mesh) allMeshes.push(c); });\n }\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n if (hits.length > 0) {\n const key = this.pathEditor.getActiveEffectKey();\n if (key) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 世界坐标转本地坐标\n const point = hits[0].point;\n const obj = this.objects.get(nodeId);\n if (obj) {\n obj.updateWorldMatrix(true, false); // 确保世界矩阵是最新的\n obj.worldToLocal(point);\n }\n // 弹出菜单让用户选择添加到起点还是终点\n this.cb.onModelSurfaceClick?.(nodeId, effectIndex, [point.x, point.y, point.z], e);\n this.downPos = null;\n return;\n }\n }\n }\n }\n }\n if (this.boxSelecting) {\n this.finishBoxSelect(e);\n this.orbit.enabled = true; // 解锁场景控制\n } else if (this.downPos && Math.hypot(e.clientX - this.downPos[0], e.clientY - this.downPos[1]) < 4) {\n this.pick(e);\n }\n this.downPos = null;\n });\n // 双击拉近视角\n el.addEventListener('dblclick', e => {\n this.onDblClick(e);\n });\n // 右键菜单\n el.addEventListener('contextmenu', e => {\n if (this.pathEditor.isActive() && this.pathEditor.handleRightClick(e)) {\n e.preventDefault();\n }\n });\n\n this.ro = new ResizeObserver(() => this.resize());\n this.ro.observe(host);\n this.resize();\n\n // 键盘监听(WASD 漫游 + ESC 退出路径编辑 + Delete 删除控制点)\n this.onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.pathEditor.isActive()) {\n // ESC 退出路径编辑模式\n this.pathEditor.setActiveEffect(null);\n this.cb.onPathEditingChanged?.(false);\n return;\n }\n\n // Delete 删除选中的控制点\n if (e.key === 'Delete' && this.pathEditor.isActive()) {\n const activeKey = this.pathEditor.getActiveEffectKey();\n if (activeKey) {\n const [nodeId, effectId] = activeKey.split(':');\n const node = this.store.node(nodeId);\n if (node?.effects) {\n const effectIndex = node.effects.findIndex(e => e.id === effectId);\n if (effectIndex >= 0) {\n // 找到当前 gizmo 绑定的控制点索引\n const attached = this.gizmo?.object;\n if (attached) {\n // 通过 userData 找到索引\n const handles = this.pathEditor.getHandles();\n const index = handles.indexOf(attached as THREE.Mesh);\n const effect = node.effects[effectIndex];\n if (index >= 0 && effect.kind === 'path-particle' && effect.pathPoints.length > 2) {\n // 先断开 gizmo 绑定,再删除控制点\n this.gizmo?.detach();\n this.cb.onDeletePathPoint?.(nodeId, effectIndex, index);\n }\n }\n }\n }\n }\n return;\n }\n\n this.keysPressed.add(e.key.toLowerCase());\n };\n this.onKeyUp = (e: KeyboardEvent) => this.keysPressed.delete(e.key.toLowerCase());\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n\n this.unsubDoc = store.onDocChange(() => this.sync());\n this.unsubSel = store.onSelectionChange(() => this.refreshSelection());\n\n // 初始化后处理\n this.initPostProcessing();\n\n this.renderer.setAnimationLoop(() => {\n for (const h of this.helpers.values()) {\n h.update();\n // 组的包围盒已预计算,跳过逐帧放大\n if (h.userData['isGroupHelper']) continue;\n // 给包围盒加 3% 空隙,让框与模型之间有视觉间距\n const pos = h.geometry.attributes['position'].array as Float32Array;\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let i = 0; i < pos.length; i += 3) {\n if (pos[i] < minX) minX = pos[i];\n if (pos[i + 1] < minY) minY = pos[i + 1];\n if (pos[i + 2] < minZ) minZ = pos[i + 2];\n if (pos[i] > maxX) maxX = pos[i];\n if (pos[i + 1] > maxY) maxY = pos[i + 1];\n if (pos[i + 2] > maxZ) maxZ = pos[i + 2];\n }\n const cx = (minX + maxX) / 2, cy = (minY + maxY) / 2, cz = (minZ + maxZ) / 2;\n const pad = 0.03;\n for (let i = 0; i < pos.length; i += 3) {\n pos[i] = cx + (pos[i] - cx) + (pos[i] - cx >= 0 ? pad : -pad);\n pos[i + 1] = cy + (pos[i + 1] - cy) + (pos[i + 1] - cy >= 0 ? pad : -pad);\n pos[i + 2] = cz + (pos[i + 2] - cz) + (pos[i + 2] - cz >= 0 ? pad : -pad);\n }\n h.geometry.attributes['position'].needsUpdate = true;\n }\n // 更新灯光助手\n for (const h of this.lightHelpers.values()) {\n if (h instanceof THREE.DirectionalLightHelper || h instanceof THREE.SpotLightHelper) {\n h.update();\n }\n }\n // 同步灯光拾取球位置(世界空间)\n for (const [id, picker] of this.lightPickers) {\n const light = this.objects.get(id);\n if (light) {\n light.getWorldPosition(picker.position);\n }\n }\n // 计算 delta time(提到顶部,供所有 update 方法共享)\n const now = performance.now();\n const dt = this.lastFrameTime ? (now - this.lastFrameTime) / 1000 : 0;\n this.lastFrameTime = now;\n\n // 更新动画\n this.updateAnimations(dt);\n // 更新视觉效果(UV 动画、粒子系统)\n this.updateEffects(dt);\n // 更新飞行路线\n this.updateFlyPath();\n // 更新告警弹窗(自动消失)\n this.updateAlarmSprites();\n // 先更新 orbit 确保相机矩阵最新\n this.orbit.update();\n // 键盘漫游(WASD + Q/E)\n this.processKeyboardMovement();\n // 场景空间开启时,限制相机在房间内部\n this.constrainCameraToRoom();\n // 更新看板 world 模式\n this.updateDashboard();\n this.composer.render();\n });\n\n // 初始化路径编辑器\n const pathEditorCallbacks: PathEditorCallbacks = {\n onPathPointMoved: (nodeId, effectIndex, pointIndex, newPosition) => {\n this.cb.onPathPointMoved?.(nodeId, effectIndex, pointIndex, newPosition);\n },\n onPathPointDrag: (nodeId, effectIndex, newPoints) => {\n // 实时更新粒子路径(不创建历史记录)\n const node = this.store.node(nodeId);\n if (!node?.effects?.[effectIndex]) return;\n const effect = node.effects[effectIndex];\n if (effect.kind !== 'path-particle') return;\n\n const effectKey = `${nodeId}:${effect.id}`;\n const rt = this.pathParticleSystems.get(effectKey);\n if (rt) {\n // newPoints 已经是本地坐标,直接使用\n rt.setPathPoints(newPoints, effect.segmentTypes);\n }\n },\n onAddPathPoint: (nodeId, effectIndex, insertAfter, position) => {\n this.cb.onAddPathPoint?.(nodeId, effectIndex, insertAfter, position);\n },\n onDeletePathPoint: (nodeId, effectIndex, pointIndex) => {\n this.cb.onDeletePathPoint?.(nodeId, effectIndex, pointIndex);\n },\n onActiveEffectChanged: (effectKey) => {\n // 路径编辑激活时,取消场景选中\n if (effectKey && this.store.selection.length > 0) {\n this.store.setSelection([]);\n }\n },\n onPathPointRightClick: (nodeId, effectIndex, pointIndex, position, event) => {\n this.cb.onPathPointRightClick?.(nodeId, effectIndex, pointIndex, position, event);\n },\n onSegmentRightClick: (nodeId, effectIndex, segmentIndex, position, event) => {\n this.cb.onSegmentRightClick?.(nodeId, effectIndex, segmentIndex, position, event);\n },\n onModelSurfaceClick: (nodeId, effectIndex, position, event) => {\n this.cb.onModelSurfaceClick?.(nodeId, effectIndex, position, event);\n },\n onMovePathPointToEnd: (nodeId, effectIndex, pointIndex, toStart) => {\n this.cb.onMovePathPointToEnd?.(nodeId, effectIndex, pointIndex, toStart);\n },\n getNodeObject: (nodeId: string): THREE.Object3D | null => {\n return this.objects.get(nodeId) ?? null;\n },\n };\n this.pathEditor = new PathEditor(\n this.scene,\n this.camera,\n this.renderer,\n this.store,\n this.orbit,\n pathEditorCallbacks,\n );\n // 复用 viewer 的 gizmo,不创建独立实例\n this.pathEditor.setGizmo(this.gizmo);\n this.pathEditor.bindGizmoEvents();\n\n this.sync();\n this.refreshSelection();\n }\n\n setMode(mode: TransformMode): void {\n this.gizmo.setMode(mode);\n }\n\n // ── 路径编辑 ──\n\n /** 设置路径编辑的活动效果 */\n setPathEditingEffect(effectKey: string | null): void {\n this.pathEditor.setActiveEffect(effectKey);\n }\n\n /** 是否正在编辑路径 */\n isPathEditing(): boolean {\n return this.pathEditor.isActive();\n }\n\n /** 设置路径编辑控制点大小 */\n setPathHandleSize(size: number): void {\n this.pathEditor.setHandleSize(size);\n }\n\n /** 将当前相机状态写入 SceneDoc(保存前调用) */\n saveCamera(): void {\n this.store.doc.camera = {\n position: [\n Math.round(this.camera.position.x * 100) / 100,\n Math.round(this.camera.position.y * 100) / 100,\n Math.round(this.camera.position.z * 100) / 100,\n ],\n target: [\n Math.round(this.orbit.target.x * 100) / 100,\n Math.round(this.orbit.target.y * 100) / 100,\n Math.round(this.orbit.target.z * 100) / 100,\n ],\n };\n }\n\n /** 从 SceneDoc 恢复相机位置 */\n private restoreCamera(): void {\n const cam = this.store.doc.camera;\n if (!cam) return;\n this.camera.position.set(...cam.position);\n this.orbit.target.set(...cam.target);\n // 重置 damping 状态,防止残留速度导致位置漂移\n this.orbit.enableDamping = false;\n this.orbit.update();\n this.orbit.enableDamping = true;\n // 强制相机朝向 target\n this.camera.lookAt(this.orbit.target);\n }\n\n /** 导出场景为 GLB 文件 */\n exportScene(): void {\n const exporter = new GLTFExporter();\n const exportScene = new THREE.Scene();\n\n // 只导出根节点(没有父节点的),子节点会自动跟随\n for (const [id, obj] of this.objects) {\n const node = this.store.node(id);\n if (!node) continue;\n const parent = this.store.parentOf(id);\n if (!parent && obj.parent) {\n // 根节点:clone 整个子树\n exportScene.add(obj.clone(true));\n }\n }\n\n exporter.parse(\n exportScene,\n (result: ArrayBuffer | object) => {\n const output = result instanceof ArrayBuffer\n ? new Blob([result], { type: 'application/octet-stream' })\n : new Blob([JSON.stringify(result)], { type: 'application/json' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(output);\n link.download = result instanceof ArrayBuffer ? 'scene.glb' : 'scene.gltf';\n link.click();\n },\n (error: unknown) => {\n console.error('导出失败:', error);\n },\n { binary: true },\n );\n }\n\n /** 按文档重建/更新/删除 three 对象 */\n sync(): void {\n // 检测文档是否被整体替换(新场景加载):如果当前对象缓存为空但文档有节点,说明是首次加载\n const currentIds = new Set(this.objects.keys());\n const docIds = new Set(this.store.doc.nodes.map(n => n.id));\n // 如果文档 ID 集合和缓存完全不重叠(且文档非空),视为新文档 → 重置相机和资产加载状态\n if (docIds.size > 0 && currentIds.size > 0) {\n let overlap = false;\n for (const id of docIds) {\n if (currentIds.has(id)) { overlap = true; break; }\n }\n if (!overlap) {\n this.cameraRestored = false;\n // 新文档加载:清空资产加载状态,确保资产重新加载\n this.loadingAssetUrls.clear();\n }\n }\n\n const seen = new Set<string>();\n for (const n of this.store.doc.nodes) {\n seen.add(n.id);\n // group 节点用 Object3D 占位(用于 gizmo)\n if (n.primitive === 'group') {\n let obj = this.objects.get(n.id);\n if (!obj) {\n obj = new THREE.Object3D();\n this.objects.set(n.id, obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // label 节点创建标签 mesh\n if (n.primitive === 'label') {\n let obj = this.labelObjects.get(n.id);\n if (!obj) {\n obj = this.createLabel(n.text || n.name);\n obj.userData['id'] = n.id; // 设置 id 以便拾取\n this.labelObjects.set(n.id, obj);\n this.objects.set(n.id, obj); // 同时添加到 objects 以便拾取\n this.scene.add(obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // asset 节点异步加载\n if (n.primitive === 'asset') {\n let obj = this.objects.get(n.id);\n if (!obj) {\n obj = new THREE.Object3D();\n this.objects.set(n.id, obj);\n }\n const assetLoaded = !!obj.userData['assetLoaded'];\n const loadingUrl = n.assetUrl ? this.loadingAssetUrls.has(n.assetUrl) : false;\n // 如果还没加载完成,需要确保被加入等待列表(或开始加载)\n if (!assetLoaded && n.assetUrl) {\n if (!loadingUrl) {\n // URL 没在加载中,开始加载\n this.loadAsset(n.id);\n } else {\n // URL 正在加载中,确保当前节点在等待列表中\n let pending = this.pendingAssetNodes.get(n.assetUrl);\n if (!pending) {\n pending = new Set();\n this.pendingAssetNodes.set(n.assetUrl, pending);\n }\n if (!pending.has(n.id)) {\n pending.add(n.id);\n }\n }\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n // light 节点创建/更新灯光\n if (n.primitive === 'light') {\n let obj = this.objects.get(n.id);\n const needsRecreate = !obj || !this.isLight(obj) ||\n (obj as any).__lightType !== n.lightType;\n if (needsRecreate) {\n // 清理旧对象(如果有)\n if (obj) {\n obj.parent?.remove(obj);\n }\n // 清理旧的灯光目标/助手/拾取球\n const oldTarget = this.lightTargets.get(n.id);\n if (oldTarget) { oldTarget.parent?.remove(oldTarget); this.lightTargets.delete(n.id); }\n const oldHelper = this.lightHelpers.get(n.id);\n if (oldHelper) {\n oldHelper.parent?.remove(oldHelper);\n if (oldHelper instanceof THREE.DirectionalLightHelper) oldHelper.dispose();\n if (oldHelper instanceof THREE.SpotLightHelper) oldHelper.dispose();\n this.lightHelpers.delete(n.id);\n }\n const oldPicker = this.lightPickers.get(n.id);\n if (oldPicker) { oldPicker.parent?.remove(oldPicker); oldPicker.geometry.dispose(); (oldPicker.material as THREE.Material).dispose(); this.lightPickers.delete(n.id); }\n const light = this.createLight(n);\n (light as any).__lightType = n.lightType;\n this.objects.set(n.id, light);\n obj = light;\n } else {\n this.updateLightProperties(obj as THREE.Light, n);\n }\n if (!obj) continue;\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n continue;\n }\n\n let obj = this.objects.get(n.id);\n if (!obj || !(obj instanceof THREE.Mesh)) {\n obj = this.createMesh(n);\n this.objects.set(n.id, obj);\n }\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n obj.visible = n.visible;\n }\n for (const [id, obj] of [...this.objects]) {\n if (!seen.has(id)) {\n this.objects.delete(id);\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Mesh) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n // 从等待加载列表中移除\n for (const [, nodeIds] of this.pendingAssetNodes) {\n nodeIds.delete(id);\n }\n // 清理灯光相关对象\n const target = this.lightTargets.get(id);\n if (target) {\n target.parent?.remove(target);\n this.lightTargets.delete(id);\n }\n const helper = this.lightHelpers.get(id);\n if (helper) {\n helper.parent?.remove(helper);\n if (helper instanceof THREE.DirectionalLightHelper) helper.dispose();\n if (helper instanceof THREE.SpotLightHelper) helper.dispose();\n this.lightHelpers.delete(id);\n }\n const picker = this.lightPickers.get(id);\n if (picker) {\n picker.parent?.remove(picker);\n picker.geometry.dispose();\n (picker.material as THREE.Material).dispose();\n this.lightPickers.delete(id);\n }\n // 清理标签对象\n const label = this.labelObjects.get(id);\n if (label) {\n label.parent?.remove(label);\n label.geometry.dispose();\n (label.material as THREE.Material).dispose();\n this.labelObjects.delete(id);\n }\n }\n }\n // 层级关系\n for (const n of this.store.doc.nodes) {\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n const parent = this.store.parentOf(n.id);\n const target = (parent && this.objects.get(parent.id)) || this.scene;\n if (obj.parent !== target) {\n // 先 detach 再 add,确保 Object3D 层级与数据模型一致\n obj.parent?.remove(obj);\n target.add(obj);\n // add 后根据数据模型重新设置本地变换\n obj.position.set(...n.position);\n obj.rotation.set(n.rotation[0] * DEG2RAD, n.rotation[1] * DEG2RAD, n.rotation[2] * DEG2RAD);\n obj.scale.set(...n.scale);\n }\n }\n // 同步所有节点的材质覆盖(确保 undo/redo 后视觉正确)\n for (const n of this.store.doc.nodes) {\n if (this.objects.has(n.id)) {\n this.applyMaterialOverrides(n.id, this._isUndoRedoing);\n }\n }\n // 保存动画基础变换(始终与数据模型同步)\n for (const n of this.store.doc.nodes) {\n if (n.animations && n.animations.length > 0 && this.objects.has(n.id)) {\n this.saveBaseTransforms(n.id);\n }\n }\n // 同步看板 widget DOM\n this.syncDashboard();\n // 同步视觉效果\n this.syncEffects();\n // 同步路径编辑器\n this.pathEditor.sync();\n // 应用环境配置\n this.applyEnvironment();\n // 只在首次加载时恢复相机(后续 doc 变更不重置视角)\n if (!this.cameraRestored) {\n this.restoreCamera();\n this.cameraRestored = true;\n }\n this.refreshSelection();\n }\n\n /** 强制恢复相机(草稿恢复后调用) */\n forceRestoreCamera(): void {\n this.cameraRestored = false;\n this.restoreCamera();\n this.cameraRestored = true;\n }\n\n /** 创建标签 mesh */\n private createLabel(text: string): THREE.Mesh {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = 256;\n canvas.height = 64;\n\n // 圆角矩形路径\n const radius = 8;\n const w = canvas.width;\n const h = canvas.height;\n\n // 深色半透明背景(类似看板样式)\n ctx.fillStyle = 'rgba(20, 25, 35, 0.85)';\n ctx.beginPath();\n ctx.moveTo(radius, 0);\n ctx.lineTo(w - radius, 0);\n ctx.arcTo(w, 0, w, radius, radius);\n ctx.lineTo(w, h - radius);\n ctx.arcTo(w, h, w - radius, h, radius);\n ctx.lineTo(radius, h);\n ctx.arcTo(0, h, 0, h - radius, radius);\n ctx.lineTo(0, radius);\n ctx.arcTo(0, 0, radius, 0, radius);\n ctx.closePath();\n ctx.fill();\n\n // 蓝色边框\n ctx.strokeStyle = 'rgba(79, 131, 204, 0.5)';\n ctx.lineWidth = 2;\n ctx.stroke();\n\n // 白色文字\n ctx.fillStyle = '#ffffff';\n ctx.font = 'bold 28px Arial, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, w / 2, h / 2);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n\n const geometry = new THREE.PlaneGeometry(1, 0.25);\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n side: THREE.DoubleSide,\n });\n return new THREE.Mesh(geometry, material);\n }\n\n // ── 环境配置 ──\n\n /** 应用场景环境配置(背景色、半球光、平行光、HDRI) */\n private applyEnvironment(): void {\n const env = this.store.doc.environment;\n if (!env) {\n // 无配置 → 使用默认灯光(默认启用)\n this.clearHdri();\n this.scene.background = new THREE.Color(0x808080);\n this.ensureHemiLight();\n this.hemiLight!.color.set(0xffffff);\n this.hemiLight!.groundColor.set(0xffffff);\n this.hemiLight!.intensity = 2.5;\n this.ensureDirLight();\n this.dirLight!.color.set(0xffffff);\n this.dirLight!.intensity = 5.0;\n this.dirLight!.position.set(0, 15, 5);\n this.applyRoom();\n return;\n }\n\n // HDRI 环境贴图(优先于纯色背景)\n const hdriUrl = env.hdriDataUrl || null;\n if (hdriUrl) {\n if (hdriUrl === this.hdriCurrentUrl && this.hdriTexture) {\n // 已缓存,直接应用\n this.scene.environment = this.hdriTexture;\n this.scene.background = this.hdriTexture;\n } else {\n // 新 HDRI,异步加载\n new RGBELoader().load(hdriUrl, (texture) => {\n const pmrem = new THREE.PMREMGenerator(this.renderer);\n const envMap = pmrem.fromEquirectangular(texture).texture;\n pmrem.dispose();\n texture.dispose();\n // 释放旧的 HDRI 纹理\n if (this.hdriTexture) {\n this.hdriTexture.dispose();\n }\n this.hdriTexture = envMap;\n this.hdriCurrentUrl = hdriUrl;\n // 只在当前环境仍是同一个 HDRI 时才应用(防止切换竞态)\n if (this.store.doc.environment?.hdriDataUrl === hdriUrl) {\n this.scene.environment = envMap;\n this.scene.background = envMap;\n }\n });\n }\n } else {\n this.clearHdri();\n if (env.background) {\n this.scene.background = new THREE.Color(env.background);\n }\n }\n\n // 半球光(enabled 默认 true)\n const hemiEnabled = env.hemisphere?.enabled !== false;\n if (hemiEnabled) {\n this.ensureHemiLight();\n if (env.hemisphere?.skyColor) this.hemiLight!.color.set(env.hemisphere.skyColor);\n if (env.hemisphere?.groundColor) this.hemiLight!.groundColor.set(env.hemisphere.groundColor);\n if (env.hemisphere?.intensity !== undefined) this.hemiLight!.intensity = env.hemisphere.intensity;\n } else {\n this.removeHemiLight();\n }\n\n // 平行光(enabled 默认 true)\n const dirEnabled = env.directional?.enabled !== false;\n if (dirEnabled) {\n this.ensureDirLight();\n if (env.directional?.color) this.dirLight!.color.set(env.directional.color);\n if (env.directional?.intensity !== undefined) this.dirLight!.intensity = env.directional.intensity;\n if (env.directional?.position) this.dirLight!.position.set(...env.directional.position);\n } else {\n this.removeDirLight();\n }\n\n // 阴影配置\n const shadowEnabled = env.shadow?.enabled !== false;\n this.renderer.shadowMap.enabled = shadowEnabled;\n if (this.dirLight) {\n this.dirLight.castShadow = shadowEnabled;\n const mapSize = env.shadow?.mapSize ?? 2048;\n this.dirLight.shadow.mapSize.set(mapSize, mapSize);\n const range = env.shadow?.cameraRange ?? 15;\n this.dirLight.shadow.camera.left = -range;\n this.dirLight.shadow.camera.right = range;\n this.dirLight.shadow.camera.top = range;\n this.dirLight.shadow.camera.bottom = -range;\n this.dirLight.shadow.camera.updateProjectionMatrix();\n }\n\n // 场景空间\n this.applyRoom();\n }\n\n /** 确保半球光存在并加入场景 */\n private ensureHemiLight(): void {\n if (!this.hemiLight) {\n this.hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 1.4);\n this.scene.add(this.hemiLight);\n }\n }\n\n /** 移除半球光 */\n private removeHemiLight(): void {\n if (this.hemiLight) {\n this.scene.remove(this.hemiLight);\n this.hemiLight = null;\n }\n }\n\n /** 确保平行光存在并加入场景 */\n private ensureDirLight(): void {\n if (!this.dirLight) {\n this.dirLight = new THREE.DirectionalLight(0xffffff, 2.2);\n this.dirLight.position.set(5, 10, 6);\n this.dirLight.castShadow = true;\n // 阴影相机配置:覆盖典型房间范围\n this.dirLight.shadow.mapSize.set(2048, 2048);\n this.dirLight.shadow.camera.near = 0.5;\n this.dirLight.shadow.camera.far = 50;\n this.dirLight.shadow.camera.left = -15;\n this.dirLight.shadow.camera.right = 15;\n this.dirLight.shadow.camera.top = 15;\n this.dirLight.shadow.camera.bottom = -15;\n this.dirLight.shadow.bias = -0.0005;\n this.dirLight.shadow.normalBias = 0.02;\n this.scene.add(this.dirLight);\n }\n }\n\n /** 移除平行光 */\n private removeDirLight(): void {\n if (this.dirLight) {\n this.scene.remove(this.dirLight);\n this.dirLight = null;\n }\n }\n\n /** 应用场景空间配置 */\n private applyRoom(): void {\n const room = this.store.doc.environment?.room;\n // 构建配置签名,未变化则跳过重建\n const key = room?.enabled\n ? `${room.width ?? 30}_${room.height ?? 10}_${room.depth ?? 30}_${room.floorColor ?? ''}_${room.wallColor ?? ''}_${room.ceilingColor ?? ''}_${(room.floorTexture ?? '').length}_${(room.wallTexture ?? '').length}_${(room.ceilingTexture ?? '').length}_${room.floorUseBaseColor ?? true}_${room.wallUseBaseColor ?? true}_${room.ceilingUseBaseColor ?? true}`\n : 'off';\n if (key === this.lastRoomKey) return;\n this.lastRoomKey = key;\n\n if (!room?.enabled) {\n this.disposeRoom();\n this.gridHelper.visible = true;\n this.orbit.maxDistance = Infinity;\n this.orbit.minDistance = 0;\n return;\n }\n\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n const floorColor = (room.floorUseBaseColor ?? true) ? (room.floorColor ?? '#808080') : '#ffffff';\n const wallColor = (room.wallUseBaseColor ?? true) ? (room.wallColor ?? '#c8c0b0') : '#ffffff';\n const ceilingColor = (room.ceilingUseBaseColor ?? true) ? (room.ceilingColor ?? '#a0a0a0') : '#ffffff';\n\n this.disposeRoom();\n this.scene.background = null;\n\n // 构建 6 面材质:[+X墙, -X墙, +Y天花板, -Y地板, +Z墙, -Z墙]\n const materials = this.buildRoomMaterials(\n wallColor, ceilingColor, floorColor,\n room.wallTexture, room.ceilingTexture, room.floorTexture,\n w, h, d,\n room.wallNormalTexture, room.wallRoughnessTexture,\n room.floorNormalTexture, room.floorRoughnessTexture,\n room.ceilingNormalTexture, room.ceilingRoughnessTexture,\n );\n\n const geometry = new THREE.BoxGeometry(w, h, d);\n this.fixBoxBackSideUV(geometry);\n this.roomMesh = new THREE.Mesh(geometry, materials);\n this.roomMesh.position.y = h / 2;\n this.roomMesh.receiveShadow = true;\n this.scene.add(this.roomMesh);\n\n // 房间内部光源已移除(用户要求去掉点光源)\n // 天花板黑是因为半球光的地面颜色较暗,需要调整半球光设置或添加专用光源\n\n this.gridHelper.visible = false;\n\n const maxDim = Math.max(w, h, d);\n this.orbit.maxDistance = maxDim * 2;\n this.orbit.minDistance = 1;\n }\n\n /** 构建房间 6 面材质 */\n private buildRoomMaterials(\n wallColor: string, ceilingColor: string, floorColor: string,\n wallTex?: string, ceilingTex?: string, floorTex?: string,\n roomW?: number, roomH?: number, roomD?: number,\n wallNormal?: string, wallRough?: string,\n floorNormal?: string, floorRough?: string,\n ceilingNormal?: string, ceilingRough?: string,\n ): THREE.MeshStandardMaterial[] {\n const makeMat = (\n color: string,\n texUrl?: string,\n normalUrl?: string,\n roughUrl?: string,\n faceW?: number,\n faceH?: number,\n defaultRoughness = 0.9,\n ): THREE.MeshStandardMaterial => {\n const mat = new THREE.MeshStandardMaterial({\n color: new THREE.Color(color),\n roughness: roughUrl ? 1 : defaultRoughness, // 有粗糙度贴图时设为 1,让贴图完全控制\n metalness: 0.05,\n side: THREE.BackSide,\n });\n\n const applyTex = (url: string, isColorMap: boolean, repeatX?: number, repeatY?: number) => {\n let tex = this.textureCache.get(url);\n if (!tex) {\n tex = this.textureLoader.load(url);\n tex.colorSpace = isColorMap ? THREE.SRGBColorSpace : THREE.LinearSRGBColorSpace;\n tex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n this.textureCache.set(url, tex);\n }\n if (repeatX && repeatY) {\n tex = tex.clone(); // 克隆以允许不同面有不同的 repeat\n tex.repeat.set(repeatX, repeatY);\n tex.needsUpdate = true;\n }\n return tex;\n };\n\n if (texUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.map = applyTex(texUrl, true, repeatX, repeatY);\n }\n if (normalUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.normalMap = applyTex(normalUrl, false, repeatX, repeatY);\n mat.normalScale = new THREE.Vector2(1, 1);\n }\n if (roughUrl) {\n const repeatX = faceW ? Math.max(1, Math.round(faceW / 2)) : 1;\n const repeatY = faceH ? Math.max(1, Math.round(faceH / 2)) : 1;\n mat.roughnessMap = applyTex(roughUrl, false, repeatX, repeatY);\n }\n return mat;\n };\n // BoxGeometry 的 6 个面顺序:+X, -X, +Y, -Y, +Z, -Z\n return [\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomD, roomH), // +X 墙\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomD, roomH), // -X 墙\n makeMat(ceilingColor, ceilingTex, ceilingNormal, ceilingRough, roomW, roomD), // +Y 天花板\n makeMat(floorColor, floorTex, floorNormal, floorRough, roomW, roomD), // -Y 地板\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomW, roomH), // +Z 墙\n makeMat(wallColor, wallTex, wallNormal, wallRough, roomW, roomH), // -Z 墙\n ];\n }\n\n /**\n * 修正 BoxGeometry + BackSide 的 UV 镜像问题\n * BackSide 从内部看盒子时,+X、+Z 面 U 反向,+Y 天花板 UV 全反,-Y 地板 V 反向\n */\n private fixBoxBackSideUV(geometry: THREE.BoxGeometry): void {\n const uvAttr = geometry.getAttribute('uv') as THREE.BufferAttribute;\n const uv = uvAttr.array as Float32Array;\n const pos = geometry.getAttribute('position');\n // BoxGeometry 每面 2 个三角 = 6 顶点,6 面 = 36 顶点\n // 面顺序: +X(0-5), -X(6-11), +Y(12-17), -Y(18-23), +Z(24-29), -Z(30-35)\n for (let face = 0; face < 6; face++) {\n const base = face * 6 * 2; // 每面 6 个顶点 × 2 分量\n switch (face) {\n case 0: // +X → u 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2] = 1 - uv[base + i * 2]; break;\n case 2: // +Y 天花板 → u, v 全反\n for (let i = 0; i < 6; i++) { uv[base + i * 2] = 1 - uv[base + i * 2]; uv[base + i * 2 + 1] = 1 - uv[base + i * 2 + 1]; } break;\n case 3: // -Y 地板 → v 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2 + 1] = 1 - uv[base + i * 2 + 1]; break;\n case 4: // +Z → u 反向\n for (let i = 0; i < 6; i++) uv[base + i * 2] = 1 - uv[base + i * 2]; break;\n }\n }\n uvAttr.needsUpdate = true;\n }\n\n /** 销毁房间网格和材质 */\n private disposeRoom(): void {\n if (this.roomMesh) {\n this.roomMesh.geometry.dispose();\n const mats = Array.isArray(this.roomMesh.material) ? this.roomMesh.material : [this.roomMesh.material];\n for (const mat of mats) {\n const m = mat as THREE.MeshStandardMaterial;\n if (m.map) m.map.dispose();\n if (m.normalMap) m.normalMap.dispose();\n if (m.roughnessMap) m.roughnessMap.dispose();\n mat.dispose();\n }\n this.scene.remove(this.roomMesh);\n this.roomMesh = null;\n }\n }\n\n /** 处理键盘移动(WASD + Q/E)—— 仅当场景空间启用时生效 */\n private processKeyboardMovement(): void {\n const room = this.store.doc.environment?.room;\n if (!room?.enabled) return;\n\n const keys = this.keysPressed;\n const hasMovement = keys.has('w') || keys.has('s') || keys.has('a') || keys.has('d') ||\n keys.has('q') || keys.has('e') || keys.has(' ');\n\n if (!hasMovement) return;\n\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n const margin = Math.max(0.3, Math.min(w, h, d) * 0.05);\n\n // 复用临时向量\n const forward = this._tmpVec;\n const right = this._tmpVec2;\n const move = this._tmpVec3;\n\n this.camera.getWorldDirection(forward);\n forward.y = 0;\n forward.normalize();\n\n right.crossVectors(forward, this._upVector).normalize();\n\n move.set(0, 0, 0);\n if (keys.has('w')) move.add(forward);\n if (keys.has('s')) move.sub(forward);\n if (keys.has('a')) move.sub(right);\n if (keys.has('d')) move.add(right);\n if (keys.has('q') || keys.has('shift')) move.y -= 1;\n if (keys.has('e') || keys.has(' ')) move.y += 1;\n\n if (move.lengthSq() === 0) return;\n move.normalize().multiplyScalar(this.moveSpeed * 0.016); // 假设 60fps,约 16ms/帧\n\n // 同时移动 orbit target 和 camera\n this.orbit.target.add(move);\n this.camera.position.add(move);\n\n // 限制在房间范围内\n const halfW = w / 2 - margin;\n const halfD = d / 2 - margin;\n this.orbit.target.x = THREE.MathUtils.clamp(this.orbit.target.x, -halfW, halfW);\n this.orbit.target.y = THREE.MathUtils.clamp(this.orbit.target.y, margin, h - margin);\n this.orbit.target.z = THREE.MathUtils.clamp(this.orbit.target.z, -halfD, halfD);\n this.camera.position.x = THREE.MathUtils.clamp(this.camera.position.x, -halfW, halfW);\n this.camera.position.y = THREE.MathUtils.clamp(this.camera.position.y, margin, h - margin);\n this.camera.position.z = THREE.MathUtils.clamp(this.camera.position.z, -halfD, halfD);\n }\n\n /** 场景空间开启时,限制 orbit 目标和相机在房间内部 */\n private constrainCameraToRoom(): void {\n const room = this.store.doc.environment?.room;\n if (!room?.enabled) return;\n const w = room.width ?? 30;\n const h = room.height ?? 10;\n const d = room.depth ?? 30;\n // margin 随房间尺寸缩放,最小 0.1,最大为最小维度的 3%\n const minDim = Math.min(w, h, d);\n const margin = Math.max(0.1, minDim * 0.03);\n const halfW = w / 2 - margin;\n const halfD = d / 2 - margin;\n const minY = margin;\n const maxY = h - margin;\n let changed = false;\n // 限制 orbit 目标点在房间范围内\n const tx = THREE.MathUtils.clamp(this.orbit.target.x, -halfW, halfW);\n const ty = THREE.MathUtils.clamp(this.orbit.target.y, minY, maxY);\n const tz = THREE.MathUtils.clamp(this.orbit.target.z, -halfD, halfD);\n if (tx !== this.orbit.target.x || ty !== this.orbit.target.y || tz !== this.orbit.target.z) {\n this.orbit.target.set(tx, ty, tz);\n changed = true;\n }\n // 限制相机位置在房间范围内\n const cx = THREE.MathUtils.clamp(this.camera.position.x, -halfW, halfW);\n const cy = THREE.MathUtils.clamp(this.camera.position.y, minY, maxY);\n const cz = THREE.MathUtils.clamp(this.camera.position.z, -halfD, halfD);\n if (cx !== this.camera.position.x || cy !== this.camera.position.y || cz !== this.camera.position.z) {\n this.camera.position.set(cx, cy, cz);\n changed = true;\n }\n // 如果目标被修改,需要重新更新 orbit\n if (changed) {\n this.orbit.update();\n }\n }\n\n /** 清除 HDRI 环境贴图 */\n private clearHdri(): void {\n if (this.hdriTexture) {\n this.hdriTexture.dispose();\n this.hdriTexture = null;\n }\n this.hdriCurrentUrl = null;\n this.scene.environment = null;\n }\n\n /** 初始化后处理效果链:SSAO + Bloom + 色调映射输出 */\n private initPostProcessing(): void {\n const w = this.host.clientWidth || 1;\n const h = this.host.clientHeight || 1;\n\n // 创建合成器\n this.composer = new EffectComposer(this.renderer);\n\n // 1. 基础渲染通道\n const renderPass = new RenderPass(this.scene, this.camera);\n this.composer.addPass(renderPass);\n\n // 2. SSAO(屏幕空间环境光遮蔽)—— 增强角落/缝隙的阴影深度\n const ssaoPass = new SSAOPass(this.scene, this.camera, w, h);\n ssaoPass.kernelRadius = 16; // 采样半径\n ssaoPass.minDistance = 0.005; // 最小距离阈值\n ssaoPass.maxDistance = 0.1; // 最大距离阈值\n ssaoPass.output = SSAOPass.OUTPUT.Default;\n this.composer.addPass(ssaoPass);\n\n // 3. Bloom(泛光)—— 高亮区域发光效果\n const bloomPass = new UnrealBloomPass(\n new THREE.Vector2(w, h),\n 0.3, // strength:泛光强度(低值,避免过曝)\n 0.4, // radius:泛光扩散范围\n 0.85, // threshold:亮度阈值(只让很亮的区域发光)\n );\n this.composer.addPass(bloomPass);\n\n // 4. 输出通道(色调映射 + 色彩空间转换)\n const outputPass = new OutputPass();\n this.composer.addPass(outputPass);\n }\n\n // ── 动画引擎 ─\n\n // ── 飞行路线播放 ──\n\n /** 播放飞行路线 */\n playFlyPath(path: FlyPath, callbacks?: { onComplete?: () => void }): void {\n if (!path.keyframes || path.keyframes.length < 2) {\n console.warn('飞行路线至少需要 2 个关键帧');\n return;\n }\n this.flyPathPlaying = path;\n this.flyPathStartTime = performance.now();\n this.flyPathPausedElapsed = 0;\n this.flyPathPaused = false;\n this.flyPathResuming = false;\n this.flyPathCallbacks = callbacks ?? {};\n // 禁用轨道控制\n this.orbit.enabled = false;\n }\n\n /** 停止飞行路线 */\n stopFlyPath(): void {\n if (!this.flyPathPlaying) return;\n this.flyPathPlaying = null;\n this.flyPathStartTime = 0;\n this.flyPathPausedElapsed = 0;\n this.flyPathPaused = false;\n this.flyPathResuming = false;\n this.flyPathCallbacks = {};\n // 重新启用轨道控制\n this.orbit.enabled = true;\n }\n\n /** 暂停飞行路线 */\n pauseFlyPath(): void {\n if (!this.flyPathPlaying) return;\n // 记录暂停时已经过的时间\n this.flyPathPausedElapsed = (performance.now() - this.flyPathStartTime) / 1000;\n this.flyPathPaused = true;\n this.flyPathResuming = false;\n }\n\n /** 恢复播放(从暂停处继续) */\n resumeFlyPath(): void {\n if (!this.flyPathPlaying) return;\n this.flyPathPaused = false;\n this.flyPathResuming = true; // 标记需要在下一帧重算 startTime\n }\n\n /** 是否正在播放飞行路线 */\n isFlyPathPlaying(): boolean {\n return this.flyPathPlaying !== null;\n }\n\n /** 更新飞行路线相机(在渲染循环中调用) */\n private updateFlyPath(): void {\n if (!this.flyPathPlaying) return;\n // 暂停中,冻结相机\n if (this.flyPathPaused) return;\n\n // 刚从暂停恢复,在渲染循环中重算 startTime(避免 Angular zone 延迟)\n if (this.flyPathResuming) {\n this.flyPathStartTime = performance.now() - this.flyPathPausedElapsed * 1000;\n this.flyPathResuming = false;\n }\n\n const path = this.flyPathPlaying;\n const elapsed = (performance.now() - this.flyPathStartTime) / 1000;\n\n // 计算总时长\n const totalDuration = path.duration ?? (path.keyframes.length > 0\n ? path.keyframes[path.keyframes.length - 1].time\n : 0);\n\n if (totalDuration <= 0) {\n this.stopFlyPath();\n this.flyPathCallbacks.onComplete?.();\n return;\n }\n\n let t = elapsed;\n if (elapsed >= totalDuration) {\n if (path.loop) {\n // 循环播放\n t = elapsed % totalDuration;\n } else {\n // 播放完毕\n this.stopFlyPath();\n this.flyPathCallbacks.onComplete?.();\n return;\n }\n }\n\n // 找到当前时间段的关键帧\n const kf = path.keyframes;\n let i = 0;\n while (i < kf.length - 1 && kf[i + 1].time <= t) i++;\n\n if (i >= kf.length - 1) {\n // 到达最后一个关键帧\n this.setCameraFromKeyframe(kf[kf.length - 1]);\n return;\n }\n\n // 在两个关键帧之间线性插值(匀速飞行,无停顿)\n const kf0 = kf[i];\n const kf1 = kf[i + 1];\n const segDuration = kf1.time - kf0.time;\n const segT = segDuration > 0 ? (t - kf0.time) / segDuration : 0;\n\n // 插值位置\n const pos = new THREE.Vector3(\n kf0.position[0] + (kf1.position[0] - kf0.position[0]) * segT,\n kf0.position[1] + (kf1.position[1] - kf0.position[1]) * segT,\n kf0.position[2] + (kf1.position[2] - kf0.position[2]) * segT,\n );\n\n // 插值目标点\n const target = new THREE.Vector3(\n kf0.target[0] + (kf1.target[0] - kf0.target[0]) * segT,\n kf0.target[1] + (kf1.target[1] - kf0.target[1]) * segT,\n kf0.target[2] + (kf1.target[2] - kf0.target[2]) * segT,\n );\n\n // 应用相机\n this.camera.position.copy(pos);\n this.camera.lookAt(target);\n this.orbit.target.copy(target);\n }\n\n /** 从关键帧设置相机 */\n private setCameraFromKeyframe(kf: CameraKeyframe): void {\n this.camera.position.set(...kf.position);\n this.camera.lookAt(new THREE.Vector3(...kf.target));\n this.orbit.target.set(...kf.target);\n }\n\n\n /** 保存节点的基础变换(数据模型值) */\n private saveBaseTransforms(nodeId: string): void {\n const n = this.store.node(nodeId);\n if (!n) return;\n this.animBases.set(nodeId, {\n position: [...n.position] as Vec3,\n rotation: [...n.rotation] as Vec3,\n scale: [...n.scale] as Vec3,\n });\n }\n\n /** 每帧更新所有动画 */\n private updateAnimations(dt: number): void {\n if (this.animationFrozen) return;\n this.animTime += dt;\n\n for (const n of this.store.doc.nodes) {\n if (!n.animations || n.animations.length === 0) continue;\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n\n // 确保基础变换已保存\n if (!this.animBases.has(n.id)) {\n this.saveBaseTransforms(n.id);\n }\n const base = this.animBases.get(n.id)!;\n\n // 从基础变换开始\n obj.position.set(...base.position);\n obj.rotation.set(base.rotation[0] * DEG2RAD, base.rotation[1] * DEG2RAD, base.rotation[2] * DEG2RAD);\n obj.scale.set(...base.scale);\n\n // 应用每条动画规则\n for (const rule of n.animations) {\n const value = this.evaluateAnimation(rule, n.id);\n\n // emissive 类型特殊处理:作用于材质\n if (rule.type === 'emissive' || rule.type === 'emissive-constant' || rule.type === 'emissive-temperature') {\n if (!rule.targetMeshName) {\n this.applyEmissiveRule(obj, rule, value, n.id);\n } else {\n obj.traverse(child => {\n if (child.name === rule.targetMeshName) {\n this.applyEmissiveRule(child, rule, value, n.id);\n }\n });\n }\n continue;\n }\n\n if (value == null) continue;\n\n if (!rule.targetMeshName) {\n // 根节点属性\n this.applyAnimValue(obj, rule.property, value);\n } else {\n // 特定子网格属性\n obj.traverse(child => {\n if (child.name === rule.targetMeshName) {\n this.applyAnimValue(child, rule.property, value);\n }\n });\n }\n }\n }\n }\n\n /** 将动画值应用到对象的指定属性 */\n private applyAnimValue(obj: THREE.Object3D, property: string, value: number): void {\n const parts = property.split('.');\n const prop = parts[0];\n const axis = parts[1];\n const target = (obj as any)[prop];\n if (!target) return;\n\n if (prop === 'rotation') {\n if (axis) target[axis] = value * DEG2RAD;\n } else {\n if (axis) target[axis] = value;\n }\n }\n\n /** 应用发射光动画规则 */\n private applyEmissiveRule(obj: THREE.Object3D, rule: any, value: number | null, nodeId?: string): void {\n if (!(obj instanceof THREE.Mesh)) return;\n const material = obj.material;\n if (!material) return;\n\n const materials = Array.isArray(material) ? material : [material];\n for (const mat of materials) {\n if (!mat.isMeshPhongMaterial && !mat.isMeshStandardMaterial) continue;\n const phongMat = mat as THREE.MeshPhongMaterial | THREE.MeshStandardMaterial;\n\n if (rule.type === 'emissive-constant') {\n // 常亮:直接设置高亮颜色\n phongMat.emissive = new THREE.Color(rule.highlightColor ?? '#00aaff');\n } else if (rule.type === 'emissive-temperature') {\n // 温度梯度:根据数据值插值颜色\n const colors = rule.tempColors ?? ['#00ff00', '#ffff00', '#ff0000'];\n // 优先使用节点数据,否则回退到全局 dataSignal\n const dataKey = rule.dataSource;\n const dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n const dataMin = rule.dataMin ?? 0;\n const dataMax = rule.dataMax ?? 100;\n const t = Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n const color = this.interpolateColorGradient(colors, t);\n phongMat.emissive = color;\n } else if (rule.type === 'emissive') {\n // value 为 null 表示开关关闭,不设置 emissive\n if (value == null) return;\n // 闪烁:正弦波在暗→亮之间\n const v = value;\n const origColor = new THREE.Color(rule.alarmColor ?? '#ff0000');\n const darkColor = origColor.clone().multiplyScalar(0.1);\n const interpColor = darkColor.clone().lerp(origColor, v);\n phongMat.emissive = interpColor;\n }\n }\n }\n\n /** 多色梯度插值 */\n private interpolateColorGradient(colors: string[], t: number): THREE.Color {\n if (colors.length === 0) return new THREE.Color('#ffffff');\n if (colors.length === 1) return new THREE.Color(colors[0]);\n\n const scaledT = t * (colors.length - 1);\n const index = Math.floor(scaledT);\n const localT = scaledT - index;\n\n if (index >= colors.length - 1) {\n return new THREE.Color(colors[colors.length - 1]);\n }\n\n const c1 = new THREE.Color(colors[index]);\n const c2 = new THREE.Color(colors[index + 1]);\n return c1.clone().lerp(c2, localT);\n }\n\n /** 计算单条动画规则的当前值 */\n private evaluateAnimation(rule: { type: string; speed?: number; from?: number; to?: number; duration?: number; easing?: string; dataSource?: string; dataMin?: number; dataMax?: number; bindingId?: string; threshold?: number }, nodeId?: string): number | null {\n switch (rule.type) {\n case 'continuous': {\n // 持续旋转/移动:基于时间\n // 如果有 bindingId,作为开关控制(值 > threshold 时旋转)\n // 编辑器模式:忽略 bindingId,直接播放\n if (rule.bindingId && !this.isEditorMode) {\n const switchValue = this.getBindingData(rule.bindingId) ?? 0;\n const threshold = rule.threshold ?? 0.5;\n if (switchValue <= threshold) {\n return null; // 开关关闭,不旋转\n }\n }\n return (this.animTime * (rule.speed ?? 60)) % 360;\n }\n\n case 'oscillate': {\n // 振荡:正弦波\n const from = rule.from ?? 0;\n const to = rule.to ?? 1;\n const period = rule.duration ?? 2;\n const t = (Math.sin(this.animTime * (2 * Math.PI / period)) + 1) / 2;\n return from + t * (to - from);\n }\n\n case 'data-driven': {\n // 数据驱动:优先使用 bindingId 查表,其次节点数据,最后全局 dataSignal\n // 编辑器模式:使用 dataSignal 或默认值,不依赖真实数据\n let dataValue: number;\n if (this.isEditorMode) {\n // 编辑器模式:使用模拟值(正弦波)\n dataValue = (Math.sin(this.animTime) + 1) / 2 * 100;\n } else if (rule.bindingId) {\n dataValue = this.getBindingData(rule.bindingId) ?? this.dataSignal;\n } else {\n const dataKey = rule.dataSource;\n dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n }\n const dataMin = rule.dataMin ?? rule.from ?? 0;\n const dataMax = rule.dataMax ?? rule.to ?? 100;\n const valueMin = rule.from ?? 0;\n const valueMax = rule.to ?? 1;\n const t = Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n return valueMin + t * (valueMax - valueMin);\n }\n\n case 'trigger':\n // 触发型:暂不自动处理\n return null;\n\n case 'emissive': {\n // 如果有 bindingId,作为开关控制(值 > threshold 时闪烁)\n // 编辑器模式:忽略 bindingId,直接播放闪烁动画\n if (rule.bindingId && !this.isEditorMode) {\n const switchValue = this.getBindingData(rule.bindingId) ?? 0;\n const threshold = rule.threshold ?? 0.5;\n if (switchValue <= threshold) {\n return null; // 开关关闭,不显示告警\n }\n }\n // 发射光闪烁:正弦波 0-1\n const period = rule.duration ?? 1;\n return (Math.sin(this.animTime * (2 * Math.PI / period)) + 1) / 2;\n }\n\n case 'emissive-constant':\n // 常亮:不需要计算值,直接设置颜色\n return null;\n\n case 'emissive-temperature': {\n // 温度梯度:优先使用 bindingId 查表,其次节点数据,最后全局 dataSignal\n // 编辑器模式:使用模拟值(正弦波)\n let dataValue: number;\n if (this.isEditorMode) {\n // 编辑器模式:使用模拟值(正弦波 0-100)\n dataValue = (Math.sin(this.animTime * 0.5) + 1) / 2 * 100;\n } else if (rule.bindingId) {\n dataValue = this.getBindingData(rule.bindingId) ?? this.dataSignal;\n } else {\n const dataKey = rule.dataSource;\n dataValue = (nodeId && dataKey) ? (this.getNodeData(nodeId, dataKey) ?? this.dataSignal) : this.dataSignal;\n }\n const dataMin = rule.dataMin ?? rule.from ?? 0;\n const dataMax = rule.dataMax ?? rule.to ?? 100;\n return Math.max(0, Math.min(1, (dataValue - dataMin) / (dataMax - dataMin || 1)));\n }\n\n default:\n return null;\n }\n }\n\n /** 全局模拟数据(0-100),可由外部设置 */\n dataSignal = 0;\n\n /** 每节点实时数据:nodeId → { dataKey: value } */\n private nodeDataMap = new Map<string, Record<string, number>>();\n\n /** 按 bindingId 存储实时数据:bindingId → value */\n private bindingDataMap = new Map<string, number>();\n\n /** 设置模拟数据值(用于数据驱动动画测试) */\n setDataSignal(value: number): void {\n this.dataSignal = value;\n }\n\n /** 设置节点实时数据(用于 per-node 数据驱动动画) */\n setData(nodeId: string, data: Record<string, number>): void {\n const existing = this.nodeDataMap.get(nodeId) ?? {};\n this.nodeDataMap.set(nodeId, { ...existing, ...data });\n }\n\n /** 获取节点实时数据值 */\n getNodeData(nodeId: string, key: string): number | undefined {\n return this.nodeDataMap.get(nodeId)?.[key];\n }\n\n /** 按 bindingId 设置实时数据(用于点位绑定) */\n setBindingData(bindingId: string, value: number): void {\n this.bindingDataMap.set(bindingId, value);\n }\n\n /** 获取 bindingId 对应的数据值 */\n getBindingData(bindingId: string): number | undefined {\n return this.bindingDataMap.get(bindingId);\n }\n\n /** 为资产生成缩略图(离屏渲染 512×384) */\n generateThumbnail(assetId: string, model: THREE.Object3D): void {\n // 初始化离屏渲染器\n if (!this.thumbRenderer) {\n this.thumbRenderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, preserveDrawingBuffer: true });\n this.thumbRenderer.setSize(512, 384);\n this.thumbRenderer.setClearColor(0x000000, 0);\n // 添加基础光照\n this.thumbScene.add(new THREE.HemisphereLight(0xffffff, 0x44505e, 1.5));\n const dir = new THREE.DirectionalLight(0xffffff, 2);\n dir.position.set(3, 5, 4);\n this.thumbScene.add(dir);\n }\n\n // 清除旧的缩略图内容\n while (this.thumbScene.children.length > 2) {\n this.thumbScene.remove(this.thumbScene.children[2]);\n }\n\n // 克隆模型放入缩略图场景\n const clone = model.clone();\n this.thumbScene.add(clone);\n\n // 计算包围盒,让模型居中并占满画面\n const box = new THREE.Box3().setFromObject(clone);\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n const maxDim = Math.max(size.x, size.y, size.z);\n\n // 相机距离更近,让模型占满画面约 90%\n const fov = this.thumbCamera.fov * (Math.PI / 180);\n const dist = maxDim / (2 * Math.tan(fov / 2)) * 1.1;\n\n // 相机放在等距斜上方,正对中心\n this.thumbCamera.position.set(center.x + dist * 0.5, center.y + dist * 0.4, center.z + dist * 0.7);\n this.thumbCamera.lookAt(center);\n\n // 渲染并获取 data URL\n this.thumbRenderer.render(this.thumbScene, this.thumbCamera);\n const dataUrl = this.thumbRenderer.domElement.toDataURL('image/png');\n\n this.cb.onThumbnailGenerated?.(assetId, dataUrl);\n }\n\n /** 标记正在 undo/redo,sync() 中据此传 isUndoRedoing 给 applyMaterialOverrides */\n setUndoRedoing(value: boolean): void {\n this._isUndoRedoing = value;\n }\n\n // ── 告警弹窗 ──\n\n /** 显示告警弹窗 */\n showAlarm(nodeId: string, data: AlarmPopupData): void {\n // 如果已有弹窗,先移除\n this.hideAlarm(nodeId);\n\n // 获取节点对象\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n // 创建 Canvas 贴图\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 120;\n const ctx = canvas.getContext('2d')!;\n\n // 根据优先级设置背景颜色\n const bgColor = data.priority === 'high' ? 'rgba(220, 53, 69, 0.9)' :\n data.priority === 'medium' ? 'rgba(255, 140, 0, 0.9)' :\n 'rgba(255, 193, 7, 0.9)';\n\n // 绘制背景\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, 300, 120);\n\n // 绘制边框\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)';\n ctx.lineWidth = 2;\n ctx.strokeRect(1, 1, 298, 118);\n\n // 绘制文本\n ctx.fillStyle = '#ffffff';\n ctx.font = 'bold 16px Arial';\n ctx.fillText(data.deviceName, 10, 25);\n\n ctx.font = '14px Arial';\n ctx.fillText(`告警类型: ${data.alarmType}`, 10, 48);\n ctx.fillText(`当前值: ${data.currentValue.toFixed(1)} / 阈值: ${data.threshold}`, 10, 68);\n\n ctx.font = '12px Arial';\n ctx.fillText(data.suggestion, 10, 90);\n\n // 绘制时间\n const timeStr = new Date(data.timestamp).toLocaleTimeString('zh-CN');\n ctx.fillText(timeStr, 10, 110);\n\n // 创建纹理和 Mesh(billboard 朝向)\n const texture = new THREE.CanvasTexture(canvas);\n const material = new THREE.MeshBasicMaterial({ map: texture, transparent: true, side: THREE.DoubleSide });\n const geometry = new THREE.PlaneGeometry(3, 1.2);\n const mesh = new THREE.Mesh(geometry, material);\n\n // 设置 Mesh 位置(设备上方 2 单位)\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n mesh.position.set(worldPos.x, worldPos.y + 2, worldPos.z);\n\n // 初始面向相机\n mesh.lookAt(this.camera.position);\n\n // 添加到场景\n this.scene.add(mesh);\n this.alarmPopups.set(nodeId, mesh);\n this.alarmCreationTime.set(nodeId, Date.now());\n }\n\n /** 隐藏告警弹窗 */\n hideAlarm(nodeId: string): void {\n const mesh = this.alarmPopups.get(nodeId);\n if (mesh) {\n this.scene.remove(mesh);\n (mesh.material as THREE.MeshBasicMaterial).map?.dispose();\n (mesh.material as THREE.MeshBasicMaterial).dispose();\n mesh.geometry.dispose();\n this.alarmPopups.delete(nodeId);\n this.alarmCreationTime.delete(nodeId);\n }\n }\n\n /** 每帧更新告警弹窗(自动消失 + billboard 朝向) */\n private updateAlarmSprites(): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [nodeId, mesh] of this.alarmPopups) {\n const creationTime = this.alarmCreationTime.get(nodeId);\n if (!creationTime) continue;\n\n // 5 秒后自动消失\n if (now - creationTime > 5000) {\n toRemove.push(nodeId);\n continue;\n }\n\n // billboard:每帧面向相机\n mesh.lookAt(this.camera.position);\n }\n\n // 移除过期的弹窗\n for (const nodeId of toRemove) {\n this.hideAlarm(nodeId);\n }\n }\n\n // ── 看板 ──\n\n /** 同步看板 widget DOM 与数据模型 */\n private syncDashboard(): void {\n if (!this.dashboardOverlayEl) return;\n\n const dashboard = this.store.doc.dashboard;\n const widgets = dashboard?.visible ? (dashboard.widgets || []) : [];\n const activeIds = new Set(widgets.map(w => w.id));\n\n // 移除不再存在的 widget\n for (const [id, el] of this.dashboardElements) {\n if (!activeIds.has(id)) {\n el.remove();\n this.dashboardElements.delete(id);\n // 清理定时器\n const intervalId = this.dashboardIntervals.get(id);\n if (intervalId) {\n clearInterval(intervalId);\n this.dashboardIntervals.delete(id);\n }\n this.dashboardValues.delete(id);\n }\n }\n\n // 创建新增的 widget,更新已存在的 widget\n for (const widget of widgets) {\n const existingEl = this.dashboardElements.get(widget.id);\n if (!existingEl) {\n this.createDashboardWidget(widget);\n } else {\n // 更新已存在的 widget 的样式和内容\n this.applyWidgetStyle(existingEl, widget);\n this.updateWidgetContent(existingEl, widget);\n }\n }\n }\n\n /** 创建单个看板 widget */\n private createDashboardWidget(widget: DashboardWidget): void {\n if (!this.dashboardOverlayEl) return;\n\n const el = document.createElement('div');\n el.className = 'dashboard-widget';\n el.dataset['widgetId'] = widget.id;\n this.applyWidgetStyle(el, widget);\n this.updateWidgetContent(el, widget);\n this.dashboardOverlayEl.appendChild(el);\n this.dashboardElements.set(widget.id, el);\n\n // 初始化数据源\n this.initWidgetDataSource(widget);\n }\n\n /** 应用 widget 样式 */\n private applyWidgetStyle(el: HTMLDivElement, widget: DashboardWidget): void {\n // 基础样式\n el.style.position = 'absolute';\n el.style.background = 'rgba(20, 25, 35, 0.85)';\n el.style.border = '1px solid rgba(79, 131, 204, 0.5)';\n el.style.borderRadius = '8px';\n el.style.padding = '12px';\n el.style.color = '#e0e6ed';\n el.style.fontFamily = 'system-ui, sans-serif';\n el.style.boxSizing = 'border-box';\n\n if (widget.mode === 'screen' && widget.screen) {\n // 屏幕固定模式:百分比定位\n el.style.left = `${widget.screen.x * 100}%`;\n el.style.top = `${widget.screen.y * 100}%`;\n el.style.width = `${widget.screen.width * 100}%`;\n el.style.height = `${widget.screen.height * 100}%`;\n }\n // world 模式在 updateDashboard() 中动态设置 transform\n }\n\n /** 更新 widget 内容 */\n private updateWidgetContent(el: HTMLDivElement, widget: DashboardWidget): void {\n const value = this.dashboardValues.get(widget.id);\n const displayValue = this.formatValue(value, widget);\n\n switch (widget.type) {\n case 'value':\n // 支持多数据点显示\n if (widget.dataPoints && widget.dataPoints.length > 0) {\n const rows = widget.dataPoints.map((dp, i) => {\n const dpValue = this.dashboardValues.get(`${widget.id}_dp${i}`);\n const dpDisplay = this.formatValue(dpValue, { decimals: widget.decimals } as any);\n return `\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 4px 0; border-bottom: 1px solid rgba(255,255,255,0.05);\">\n <span style=\"font-size: 12px; opacity: 0.7;\">${dp.label}</span>\n <span style=\"font-size: 16px; font-weight: 500;\">${dpDisplay}${dp.unit ? `<small style=\"font-size: 11px; opacity: 0.6; margin-left: 2px;\">${dp.unit}</small>` : ''}</span>\n </div>\n `;\n }).join('');\n el.innerHTML = rows;\n } else {\n // 兼容旧的单值模式\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 28px; font-weight: 600;\">${displayValue}</div>\n ${widget.unit ? `<div style=\"font-size: 12px; opacity: 0.6; margin-top: 2px;\">${widget.unit}</div>` : ''}\n `;\n }\n break;\n case 'text':\n el.innerHTML = `<div style=\"font-size: 14px;\">${widget.dataSource?.staticValue || widget.label || ''}</div>`;\n break;\n case 'status':\n const statusColor = this.getStatusColor(value, widget);\n el.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <div style=\"width: 12px; height: 12px; border-radius: 50%; background: ${statusColor};\"></div>\n <div style=\"font-size: 14px;\">${widget.label || ''}</div>\n </div>\n `;\n break;\n case 'progress':\n const progress = this.calcProgress(value, widget);\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 8px;\">${widget.label || ''}</div>\n <div style=\"height: 8px; background: rgba(255,255,255,0.1); border-radius: 4px; overflow: hidden;\">\n <div style=\"height: 100%; width: ${progress}%; background: #4f83cc; transition: width 0.3s;\"></div>\n </div>\n <div style=\"font-size: 12px; text-align: right; margin-top: 4px;\">${displayValue}</div>\n `;\n break;\n case 'gauge':\n // 简化版仪表:只显示数值\n const gaugeProgress = this.calcProgress(value, widget);\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 24px; font-weight: 600; text-align: center;\">${displayValue}</div>\n <div style=\"height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;\">\n <div style=\"height: 100%; width: ${gaugeProgress}%; background: #4f83cc;\"></div>\n </div>\n `;\n break;\n case 'chart':\n // 简化版:显示当前值\n el.innerHTML = `\n <div style=\"font-size: 12px; opacity: 0.7; margin-bottom: 4px;\">${widget.label || ''}</div>\n <div style=\"font-size: 20px; font-weight: 500;\">${displayValue}</div>\n `;\n break;\n }\n }\n\n /** 初始化 widget 数据源 */\n private initWidgetDataSource(widget: DashboardWidget): void {\n // value 类型支持多数据点\n if (widget.type === 'value' && widget.dataPoints && widget.dataPoints.length > 0) {\n widget.dataPoints.forEach((dp, i) => {\n const key = `${widget.id}_dp${i}`;\n const ds = dp.dataSource;\n if (!ds) {\n // 绑定点模式,值由外部设置\n return;\n }\n if (ds.mode === 'static') {\n this.dashboardValues.set(key, ds.staticValue ?? 0);\n } else if (ds.mode === 'simulated' && ds.simulated) {\n const { type, min, max, interval } = ds.simulated;\n let t = 0;\n const update = () => {\n t += interval / 1000;\n let value: number;\n if (type === 'sine') {\n value = min + (max - min) * (Math.sin(t * 0.5) * 0.5 + 0.5);\n } else {\n value = min + Math.random() * (max - min);\n }\n this.dashboardValues.set(key, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n };\n update();\n const intervalId = window.setInterval(update, interval);\n this.dashboardIntervals.set(key, intervalId);\n } else if (ds.mode === 'api' && ds.api) {\n const { url, field, pollInterval } = ds.api;\n const fetchValue = async () => {\n try {\n const res = await fetch(url);\n const data = await res.json();\n const value = field.split('.').reduce((obj, key) => obj?.[key], data);\n this.dashboardValues.set(key, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n } catch (e) {\n console.error('Dashboard API fetch failed:', e);\n }\n };\n fetchValue();\n const intervalId = window.setInterval(fetchValue, pollInterval);\n this.dashboardIntervals.set(key, intervalId);\n }\n });\n return;\n }\n\n // 其他类型使用原有的 dataSource\n const ds = widget.dataSource;\n if (!ds) return;\n\n if (ds.mode === 'static') {\n this.dashboardValues.set(widget.id, ds.staticValue ?? 0);\n } else if (ds.mode === 'simulated' && ds.simulated) {\n const { type, min, max, interval } = ds.simulated;\n let t = 0;\n const update = () => {\n t += interval / 1000;\n let value: number;\n if (type === 'sine') {\n value = min + (max - min) * (Math.sin(t * 0.5) * 0.5 + 0.5);\n } else {\n value = min + Math.random() * (max - min);\n }\n this.dashboardValues.set(widget.id, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n };\n update();\n const intervalId = window.setInterval(update, interval);\n this.dashboardIntervals.set(widget.id, intervalId);\n } else if (ds.mode === 'api' && ds.api) {\n const { url, field, pollInterval } = ds.api;\n const fetchValue = async () => {\n try {\n const res = await fetch(url);\n const data = await res.json();\n const value = field.split('.').reduce((obj, key) => obj?.[key], data);\n this.dashboardValues.set(widget.id, value);\n const el = this.dashboardElements.get(widget.id);\n if (el) this.updateWidgetContent(el, widget);\n } catch (e) {\n console.error('Dashboard API fetch failed:', e);\n }\n };\n fetchValue();\n const intervalId = window.setInterval(fetchValue, pollInterval);\n this.dashboardIntervals.set(widget.id, intervalId);\n }\n }\n\n /** 格式化显示值 */\n private formatValue(value: number | string | undefined, widget: DashboardWidget): string {\n if (value === undefined) return '--';\n if (typeof value === 'string') return value;\n const decimals = widget.decimals ?? 1;\n return value.toFixed(decimals);\n }\n\n /** 获取状态灯颜色 */\n private getStatusColor(value: number | string | undefined, widget: DashboardWidget): string {\n if (typeof value !== 'number' || !widget.thresholds) return '#4ade80';\n for (let i = widget.thresholds.length - 1; i >= 0; i--) {\n if (value >= widget.thresholds[i].value) return widget.thresholds[i].color;\n }\n return widget.thresholds[0]?.color || '#4ade80';\n }\n\n /** 计算进度百分比 */\n private calcProgress(value: number | string | undefined, widget: DashboardWidget): number {\n if (typeof value !== 'number') return 0;\n const min = widget.min ?? 0;\n const max = widget.max ?? 100;\n return Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n }\n\n /** 每帧更新看板 widget 位置(world 模式) */\n private updateDashboard(): void {\n if (!this.dashboardOverlayEl) return;\n\n const dashboard = this.store.doc.dashboard;\n if (!dashboard?.visible) return;\n\n const rect = this.renderer.domElement.getBoundingClientRect();\n\n for (const widget of dashboard.widgets || []) {\n const el = this.dashboardElements.get(widget.id);\n if (!el) continue;\n\n if (widget.mode === 'world' && widget.world) {\n // 3D → 2D 投影\n const [wx, wy, wz] = widget.world.position;\n const v = new THREE.Vector3(wx, wy, wz);\n v.project(this.camera);\n\n // 相机背面隐藏\n if (v.z > 1) {\n el.style.display = 'none';\n continue;\n }\n el.style.display = '';\n\n // NDC → 屏幕像素\n const x = (v.x * 0.5 + 0.5) * rect.width;\n const y = (-v.y * 0.5 + 0.5) * rect.height;\n\n // 使用百分比大小(相对于视口)\n const screenW = widget.screen?.width ?? 0.15;\n const screenH = widget.screen?.height ?? 0.1;\n el.style.width = `${screenW * 100}%`;\n el.style.height = `${screenH * 100}%`;\n el.style.transform = `translate(-50%, -50%) translate(${x}px, ${y}px)`;\n }\n }\n }\n\n // ── 视觉效果同步与更新 ──\n\n /** 同步视觉效果:创建/更新/销毁 effect 对应的 three.js 对象 */\n private syncEffects(): void {\n const seen = new Set<string>();\n\n for (const n of this.store.doc.nodes) {\n if (!n.effects || n.effects.length === 0) {\n // 节点没有效果,清理旧的效果对象\n this.clearNodeEffects(n.id);\n continue;\n }\n\n let nodeEffects = this.effectObjects.get(n.id);\n if (!nodeEffects) {\n nodeEffects = new Map();\n this.effectObjects.set(n.id, nodeEffects);\n }\n\n const effectIds = new Set<string>();\n for (const effect of n.effects) {\n effectIds.add(effect.id);\n const key = `${n.id}:${effect.id}`;\n\n if (effect.kind === 'uv-animation') {\n // UV 动画不需要创建 Object3D,只需初始化状态\n if (!this.uvAnimStates.has(key)) {\n this.uvAnimStates.set(key, { offsetU: 0, offsetV: 0 });\n }\n // 如果目标材质没有贴图,自动生成一个程序化的流动纹理\n this.ensureFlowTexture(n.id, effect.targetMeshName);\n } else if (effect.kind === 'particle') {\n // 粒子系统\n if (!this.particleSystems.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj) {\n // 添加到场景根节点,避免继承节点缩放\n // 用世界坐标定位发射器位置\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n const rt = new ParticleRuntime(effect, worldPos);\n this.particleSystems.set(key, rt);\n this.scene.add(rt.points);\n rt.points.visible = effect.enabled !== false;\n nodeEffects.set(effect.id, rt.points);\n }\n } else {\n // 更新参数和位置\n const rt = this.particleSystems.get(key)!;\n rt.updateConfig(effect);\n // 更新发射器位置(跟随节点移动)\n const obj = this.objects.get(n.id);\n if (obj) {\n const worldPos = new THREE.Vector3();\n obj.getWorldPosition(worldPos);\n rt.setOrigin(worldPos);\n }\n rt.points.visible = effect.enabled !== false;\n }\n } else if (effect.kind === 'path-particle') {\n // 路径粒子系统\n const effEnabled = effect.enabled !== false;\n if (!this.pathParticleSystems.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj) {\n const rt = new PathParticleRuntime(effect);\n this.pathParticleSystems.set(key, rt);\n obj.add(rt.points);\n rt.points.visible = effEnabled;\n nodeEffects.set(effect.id, rt.points);\n }\n } else {\n const rt = this.pathParticleSystems.get(key)!;\n rt.updateConfig(effect);\n rt.points.visible = effEnabled;\n }\n } else if (effect.kind === 'screen-content') {\n // 屏幕内容切换(大屏贴图轮播)\n if (!this.screenContentStates.has(key)) {\n const obj = this.objects.get(n.id);\n if (obj && effect.images.length > 0) {\n // 初始化:加载第一张图片\n const state = { intervalId: 0, currentIndex: 0, targetMeshName: effect.targetMeshName };\n this.screenContentStates.set(key, state);\n this.updateScreenContent(n.id, effect, state);\n // 设置定时器轮播\n if (effect.autoPlay && effect.interval > 0) {\n state.intervalId = window.setInterval(() => {\n state.currentIndex = (state.currentIndex + 1) % effect.images.length;\n this.updateScreenContent(n.id, effect, state);\n }, effect.interval);\n }\n }\n } else {\n // 更新已有状态\n const state = this.screenContentStates.get(key)!;\n // 清除旧定时器\n if (state.intervalId) {\n window.clearInterval(state.intervalId);\n }\n // 重新设置定时器\n if (effect.autoPlay && effect.interval > 0 && effect.images.length > 0) {\n state.intervalId = window.setInterval(() => {\n state.currentIndex = (state.currentIndex + 1) % effect.images.length;\n this.updateScreenContent(n.id, effect, state);\n }, effect.interval);\n }\n state.targetMeshName = effect.targetMeshName;\n }\n }\n\n seen.add(key);\n }\n\n // 管道透明度:收集所有 path-particle 效果,取最小 pipeOpacity(至少一个启用则生效)\n let bestPipeOpacity = -1;\n for (const effect of n.effects) {\n if (effect.kind !== 'path-particle') continue;\n if (effect.enabled === false) continue;\n const po = effect.pipeOpacity ?? 0.9;\n if (bestPipeOpacity < 0 || po < bestPipeOpacity) bestPipeOpacity = po;\n }\n if (bestPipeOpacity >= 0) {\n this.setPipeTransparency(n.id, bestPipeOpacity);\n } else {\n this.restorePipeTransparency(n.id);\n }\n\n // 清理该节点已删除的效果\n for (const [effectId, obj] of [...nodeEffects]) {\n if (!effectIds.has(effectId)) {\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Points) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n nodeEffects.delete(effectId);\n const key = `${n.id}:${effectId}`;\n this.particleSystems.delete(key);\n this.pathParticleSystems.delete(key);\n this.uvAnimStates.delete(key);\n // 清除屏幕内容切换定时器\n const screenState = this.screenContentStates.get(key);\n if (screenState?.intervalId) {\n window.clearInterval(screenState.intervalId);\n }\n this.screenContentStates.delete(key);\n }\n }\n }\n\n // 清理已删除节点的特效\n for (const [nodeId, nodeEffects] of [...this.effectObjects]) {\n if (!this.store.node(nodeId)) {\n this.clearNodeEffects(nodeId);\n }\n }\n }\n\n /** 清理节点的所有效果 */\n private clearNodeEffects(nodeId: string): void {\n const nodeEffects = this.effectObjects.get(nodeId);\n if (!nodeEffects) return;\n for (const [effectId, obj] of nodeEffects) {\n obj.parent?.remove(obj);\n if (obj instanceof THREE.Points) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n const key = `${nodeId}:${effectId}`;\n this.particleSystems.delete(key);\n this.pathParticleSystems.delete(key);\n this.uvAnimStates.delete(key);\n // 清除屏幕内容切换定时器\n const screenState = this.screenContentStates.get(key);\n if (screenState?.intervalId) {\n window.clearInterval(screenState.intervalId);\n }\n this.screenContentStates.delete(key);\n }\n this.effectObjects.delete(nodeId);\n // 恢复管道原始不透明度\n this.restorePipeTransparency(nodeId);\n }\n\n /** 设置管道半透明(水流效果激活时调用) */\n private setPipeTransparency(nodeId: string, pipeOpacity: number): void {\n // pipeOpacity = 1 表示不需要透明化\n if (pipeOpacity >= 1) {\n this.restorePipeTransparency(nodeId);\n return;\n }\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const backups = this.pipeTransparencyBackup.get(nodeId);\n if (!backups) {\n // 首次:备份原始值并设置透明度\n const newBackups: { mesh: THREE.Mesh; material: THREE.Material; originalOpacity: number; originalDepthWrite: boolean }[] = [];\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n const mat = child.material as THREE.MeshStandardMaterial;\n if (mat.transparent && mat.opacity < 1) return;\n newBackups.push({ mesh: child, material: mat, originalOpacity: mat.opacity, originalDepthWrite: mat.depthWrite });\n mat.transparent = true;\n mat.opacity = pipeOpacity;\n mat.depthWrite = false; // 不写深度缓冲,避免管道内表面遮挡水流粒子\n mat.needsUpdate = true;\n });\n if (newBackups.length > 0) {\n this.pipeTransparencyBackup.set(nodeId, newBackups);\n }\n } else {\n // 已有备份:恢复到原始值后再设置新的透明度\n for (const { material, originalOpacity } of backups) {\n const mat = material as THREE.MeshStandardMaterial;\n mat.opacity = originalOpacity;\n if (originalOpacity >= 1) mat.transparent = false;\n mat.transparent = true;\n mat.opacity = pipeOpacity;\n mat.depthWrite = false;\n mat.needsUpdate = true;\n }\n }\n }\n\n /** 恢复管道原始不透明度 */\n private restorePipeTransparency(nodeId: string): void {\n const backups = this.pipeTransparencyBackup.get(nodeId);\n if (!backups) return;\n for (const { material, originalOpacity, originalDepthWrite } of backups) {\n const mat = material as THREE.MeshStandardMaterial;\n mat.opacity = originalOpacity;\n mat.depthWrite = originalDepthWrite;\n if (originalOpacity >= 1) {\n mat.transparent = false;\n }\n mat.needsUpdate = true;\n }\n this.pipeTransparencyBackup.delete(nodeId);\n }\n\n /** 确保目标 mesh 有流动贴图(程序化生成) */\n private ensureFlowTexture(nodeId: string, targetMeshName?: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const applyFlowTexture = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n // 已有贴图则跳过\n if (mat.map) return;\n\n // 创建程序化的流动纹理(渐变条纹,沿 V 方向流动)\n const canvas = document.createElement('canvas');\n canvas.width = 64;\n canvas.height = 256; // 纵向长,沿管道轴向\n const ctx = canvas.getContext('2d')!;\n\n // 背景色(深蓝色管道)\n ctx.fillStyle = '#0a2a5e';\n ctx.fillRect(0, 0, 64, 256);\n\n // 流动光带(渐变)\n const gradient = ctx.createLinearGradient(0, 0, 0, 256);\n gradient.addColorStop(0, 'rgba(90, 158, 255, 0)');\n gradient.addColorStop(0.3, 'rgba(90, 158, 255, 0.3)');\n gradient.addColorStop(0.5, 'rgba(150, 200, 255, 0.8)');\n gradient.addColorStop(0.7, 'rgba(90, 158, 255, 0.3)');\n gradient.addColorStop(1, 'rgba(90, 158, 255, 0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 256);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n texture.repeat.set(1, 4); // 沿 V 方向重复 4 次(管道轴向)\n\n mat.map = texture;\n mat.needsUpdate = true;\n };\n\n if (targetMeshName) {\n obj.traverse(child => {\n if (child.name === targetMeshName) applyFlowTexture(child);\n });\n } else {\n obj.traverse(applyFlowTexture);\n }\n }\n\n /** 更新屏幕内容贴图 */\n private updateScreenContent(nodeId: string, effect: ScreenContentEffect, state: { currentIndex: number; targetMeshName?: string }): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n if (effect.images.length === 0) return;\n\n const imageUrl = effect.images[state.currentIndex];\n if (!imageUrl) return;\n\n // 使用 TextureLoader 加载 base64 图片\n const loader = new THREE.TextureLoader();\n loader.load(\n imageUrl,\n (texture) => {\n texture.colorSpace = THREE.SRGBColorSpace;\n\n const applyTexture = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n\n const geom = mesh.geometry as THREE.BoxGeometry;\n if (geom && geom.type === 'BoxGeometry') {\n // Box 几何体:创建正面 Plane 子网格来显示贴图\n // 先移除旧的 screenPlane(如果存在)\n const oldPlane = mesh.getObjectByName('__screenPlane');\n if (oldPlane) {\n mesh.remove(oldPlane);\n const oldMat = (oldPlane as THREE.Mesh).material as THREE.MeshStandardMaterial;\n if (oldMat.map) oldMat.map.dispose();\n oldMat.dispose();\n (oldPlane as THREE.Mesh).geometry.dispose();\n }\n\n // Plane 是 mesh 的子节点,继承父级 scale,所以用几何体本地单位尺寸即可\n const geomSize = new THREE.Vector3();\n geom.computeBoundingBox();\n geom.boundingBox!.getSize(geomSize);\n\n // 在正面(+Z 面)创建一个 Plane 网格\n const planeGeom = new THREE.PlaneGeometry(geomSize.x, geomSize.y);\n const planeMat = new THREE.MeshStandardMaterial({\n map: texture,\n color: '#ffffff',\n roughness: 0.3,\n metalness: 0.1,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n });\n const plane = new THREE.Mesh(planeGeom, planeMat);\n plane.name = '__screenPlane';\n // 用世界空间偏移 / 父级 scale 得到局部空间偏移,确保至少 0.01 世界单位\n const worldOffset = 0.01;\n plane.position.z = geomSize.z / 2 + worldOffset / Math.abs(mesh.scale.z);\n mesh.add(plane);\n } else {\n // 非 Box 几何体:直接贴图到所有面\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.map) {\n mat.map.dispose();\n }\n mat.map = texture;\n mat.color.set('#ffffff');\n mat.needsUpdate = true;\n }\n };\n\n if (state.targetMeshName) {\n obj.traverse(child => {\n if (child.name === state.targetMeshName) applyTexture(child);\n });\n } else {\n obj.traverse(applyTexture);\n }\n },\n undefined,\n (err) => {\n console.error(`[ScreenContent] 图片加载失败:`, err);\n }\n );\n }\n\n /** 每帧更新所有视觉效果 */\n private updateEffects(dt: number): void {\n if (this.animationFrozen) return;\n\n // UV 动画\n for (const n of this.store.doc.nodes) {\n if (!n.effects) continue;\n for (const effect of n.effects) {\n if (effect.kind !== 'uv-animation' || !effect.enabled) continue;\n const key = `${n.id}:${effect.id}`;\n const state = this.uvAnimStates.get(key);\n if (!state) continue;\n\n // 更新 UV offset\n state.offsetU += effect.speedU * dt;\n state.offsetV += effect.speedV * dt;\n\n // 应用到目标 mesh 的贴图\n const obj = this.objects.get(n.id);\n if (!obj) continue;\n\n const applyToMesh = (mesh: THREE.Object3D) => {\n if (!(mesh instanceof THREE.Mesh)) return;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (!mat.map) return;\n mat.map.offset.set(state.offsetU, state.offsetV);\n mat.map.needsUpdate = true;\n };\n\n if (effect.targetMeshName) {\n obj.traverse(child => {\n if (child.name === effect.targetMeshName) applyToMesh(child);\n });\n } else {\n obj.traverse(applyToMesh);\n }\n }\n }\n\n // 粒子系统\n for (const [key, rt] of this.particleSystems) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (!node) continue;\n const effect = node.effects?.find(e => e.id === effectId);\n if (!effect || effect.kind !== 'particle' || !effect.enabled) continue;\n rt.update(dt);\n }\n\n // 路径粒子系统\n for (const [key, rt] of this.pathParticleSystems) {\n const [nodeId, effectId] = key.split(':');\n const node = this.store.node(nodeId);\n if (!node) continue;\n const effect = node.effects?.find(e => e.id === effectId);\n if (!effect || effect.kind !== 'path-particle' || !effect.enabled) continue;\n rt.update(dt);\n }\n }\n\n dispose(): void {\n this.unsubDoc();\n this.unsubSel();\n this.ro.disconnect();\n // 移除键盘监听\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n this.renderer.setAnimationLoop(null);\n this.orbit.dispose();\n this.gizmo.dispose();\n // 清理视觉效果\n for (const rt of this.particleSystems.values()) {\n rt.dispose();\n }\n this.particleSystems.clear();\n for (const rt of this.pathParticleSystems.values()) {\n rt.dispose();\n }\n this.pathParticleSystems.clear();\n this.uvAnimStates.clear();\n this.pipeTransparencyBackup.clear();\n // 清理路径编辑器\n this.pathEditor.dispose();\n for (const nodeEffects of this.effectObjects.values()) {\n for (const obj of nodeEffects.values()) {\n obj.parent?.remove(obj);\n }\n }\n this.effectObjects.clear();\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) {\n obj.geometry.dispose();\n (obj.material as THREE.Material).dispose();\n }\n }\n this.objects.clear();\n for (const h of this.helpers.values()) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n this.helpers.clear();\n for (const h of this.lightHelpers.values()) {\n if (h instanceof THREE.DirectionalLightHelper) h.dispose();\n if (h instanceof THREE.SpotLightHelper) h.dispose();\n if (h instanceof THREE.Mesh) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n this.lightHelpers.clear();\n this.lightTargets.clear();\n // 清理看板 DOM 和定时器\n for (const el of this.dashboardElements.values()) {\n el.remove();\n }\n this.dashboardElements.clear();\n for (const id of this.dashboardIntervals.values()) {\n clearInterval(id);\n }\n this.dashboardIntervals.clear();\n this.dashboardValues.clear();\n this.clearHdri();\n this.disposeRoom();\n this.composer.dispose();\n this.renderer.dispose();\n this.renderer.domElement.remove();\n }\n\n private createMesh(n: NodeDoc): THREE.Mesh {\n const geometry =\n n.primitive === 'sphere'\n ? new THREE.SphereGeometry(0.6, 32, 16)\n : n.primitive === 'cylinder'\n ? new THREE.CylinderGeometry(0.5, 0.5, 1.2, 32)\n : new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({\n color: PRIMITIVE_COLORS[n.primitive] ?? 0x888888,\n metalness: 0.1,\n roughness: 0.7,\n });\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData['id'] = n.id;\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n return mesh;\n }\n\n /** 判断对象是否为灯光 */\n private isLight(obj: THREE.Object3D): boolean {\n return obj instanceof THREE.Light;\n }\n\n /** 根据节点数据创建灯光对象 */\n private createLight(n: NodeDoc): THREE.Light {\n const color = new THREE.Color(n.lightColor ?? '#ffffff');\n const intensity = n.lightIntensity ?? 1;\n let light: THREE.Light;\n\n switch (n.lightType) {\n case 'ambient':\n light = new THREE.AmbientLight(color, intensity);\n break;\n case 'directional': {\n const dir = new THREE.DirectionalLight(color, intensity);\n dir.castShadow = n.lightCastShadow ?? false;\n if (dir.castShadow) {\n dir.shadow.mapSize.set(2048, 2048);\n dir.shadow.camera.near = 0.5;\n dir.shadow.camera.far = 50;\n dir.shadow.camera.left = -15;\n dir.shadow.camera.right = 15;\n dir.shadow.camera.top = 15;\n dir.shadow.camera.bottom = -15;\n dir.shadow.bias = -0.0005;\n dir.shadow.normalBias = 0.02;\n }\n // 创建目标点\n const target = new THREE.Object3D();\n target.userData['id'] = n.id + '_target';\n if (n.lightTarget) {\n target.position.set(...n.lightTarget);\n } else {\n target.position.set(0, 0, 0);\n }\n this.lightTargets.set(n.id, target);\n dir.target = target;\n this.scene.add(target);\n light = dir;\n break;\n }\n case 'point':\n light = new THREE.PointLight(color, intensity, n.lightDistance ?? 50, n.lightDecay ?? 1.5);\n break;\n case 'spot': {\n const spot = new THREE.SpotLight(color, intensity);\n spot.angle = n.lightAngle ?? (Math.PI / 4);\n spot.penumbra = n.lightPenumbra ?? 0.3;\n spot.distance = n.lightDistance ?? 50;\n spot.decay = n.lightDecay ?? 1.5;\n spot.castShadow = n.lightCastShadow ?? false;\n if (spot.castShadow) {\n spot.shadow.mapSize.set(1024, 1024);\n spot.shadow.camera.near = 0.5;\n spot.shadow.camera.far = 50;\n spot.shadow.bias = -0.0005;\n spot.shadow.normalBias = 0.02;\n }\n // 创建目标点\n const target = new THREE.Object3D();\n target.userData['id'] = n.id + '_target';\n if (n.lightTarget) {\n target.position.set(...n.lightTarget);\n } else {\n target.position.set(0, 0, 0);\n }\n this.lightTargets.set(n.id, target);\n spot.target = target;\n this.scene.add(target);\n light = spot;\n break;\n }\n default:\n light = new THREE.PointLight(color, intensity, 0, 2);\n }\n light.userData['id'] = n.id;\n // 创建不可见的拾取球(让灯光在视口中可点击选中)\n const picker = new THREE.Mesh(\n new THREE.SphereGeometry(0.3, 8, 6),\n new THREE.MeshBasicMaterial({ visible: false }),\n );\n picker.userData['id'] = n.id;\n this.lightPickers.set(n.id, picker);\n this.scene.add(picker);\n return light;\n }\n\n /** 更新灯光属性(不改变位置) */\n private updateLightProperties(light: THREE.Light, n: NodeDoc): void {\n const color = new THREE.Color(n.lightColor ?? '#ffffff');\n light.color.copy(color);\n light.intensity = n.lightIntensity ?? 1;\n\n if (light instanceof THREE.PointLight) {\n light.distance = n.lightDistance ?? 50;\n light.decay = n.lightDecay ?? 1.5;\n }\n if (light instanceof THREE.SpotLight) {\n light.angle = n.lightAngle ?? (Math.PI / 4);\n light.penumbra = n.lightPenumbra ?? 0.3;\n light.distance = n.lightDistance ?? 50;\n light.decay = n.lightDecay ?? 1.5;\n light.castShadow = n.lightCastShadow ?? false;\n const target = this.lightTargets.get(n.id);\n if (target && n.lightTarget) {\n target.position.set(...n.lightTarget);\n }\n }\n if (light instanceof THREE.DirectionalLight) {\n light.castShadow = n.lightCastShadow ?? false;\n const target = this.lightTargets.get(n.id);\n if (target && n.lightTarget) {\n target.position.set(...n.lightTarget);\n }\n }\n }\n\n /** 异步加载资产(从 URL,包括 blob URL) */\n private loadAsset(nodeId: string): void {\n const node = this.store.node(nodeId);\n if (!node) {\n // 节点已不存在(可能被撤销),从等待列表中移除\n for (const [, nodeIds] of this.pendingAssetNodes) {\n nodeIds.delete(nodeId);\n }\n return;\n }\n\n const url = node.assetUrl;\n if (!url) {\n console.warn('资产节点缺少 assetUrl:', nodeId);\n return;\n }\n\n // 检查缓存\n const cached = this.assetCache.get(url);\n if (cached) {\n this.applyAssetToNode(nodeId, cached);\n // 加载完成,清理等待列表\n this.pendingAssetNodes.delete(url);\n return;\n }\n\n // 如果 URL 正在加载中,将当前节点加入等待列表\n if (this.loadingAssetUrls.has(url)) {\n let pending = this.pendingAssetNodes.get(url);\n if (!pending) {\n pending = new Set();\n this.pendingAssetNodes.set(url, pending);\n }\n pending.add(nodeId);\n return;\n }\n this.loadingAssetUrls.add(url);\n\n // 根据格式选择加载器\n const fmt = node.assetFormat?.toLowerCase();\n if (fmt === 'obj') {\n this.loadObj(nodeId, url, node.assetMtlUrl).finally(() => {\n this.loadingAssetUrls.delete(url);\n this.pendingAssetNodes.delete(url);\n });\n } else {\n this.loadGltf(nodeId, url).finally(() => {\n this.loadingAssetUrls.delete(url);\n this.pendingAssetNodes.delete(url);\n });\n }\n }\n\n /** 创建红色占位线框 */\n private createPlaceholder(nodeId: string): void {\n const placeholder = new THREE.Mesh(\n new THREE.BoxGeometry(0.5, 0.5, 0.5),\n new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true }),\n );\n placeholder.userData['id'] = nodeId;\n const existingObj = this.objects.get(nodeId);\n if (existingObj) {\n if (existingObj.parent) {\n existingObj.parent.add(placeholder);\n existingObj.parent.remove(existingObj);\n } else {\n this.scene.add(placeholder);\n }\n this.objects.set(nodeId, placeholder);\n } else {\n this.scene.add(placeholder);\n this.objects.set(nodeId, placeholder);\n }\n }\n\n /** 创建带 Draco 解码器的 GLTFLoader */\n private createGltfLoader(): GLTFLoader {\n const loader = new GLTFLoader();\n const dracoLoader = new DRACOLoader();\n // 使用本地托管的 Draco 解码器(从 scene-lib assets 提供)\n dracoLoader.setDecoderPath('/assets/scene-lib/draco/gltf/');\n loader.setDRACOLoader(dracoLoader);\n return loader;\n }\n\n /** 加载 GLTF/GLB */\n private async loadGltf(nodeId: string, url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (gltf: any) => {\n const cached = this.assetCache.get(url);\n if (!cached) {\n this.assetCache.set(url, gltf.scene);\n }\n // 应用到原始节点(如果还在)\n this.applyAssetToNode(nodeId, gltf.scene);\n // 应用到所有等待同一 URL 的节点(处理 undo→redo 竞态)\n const pending = this.pendingAssetNodes.get(url);\n if (pending) {\n for (const pendingId of pending) {\n if (pendingId !== nodeId && this.store.node(pendingId)) {\n this.applyAssetToNode(pendingId, gltf.scene);\n }\n }\n }\n // 通知 UI 刷新(材质面板需要显示 mesh 列表)\n this.store.notifyChanged();\n resolve();\n },\n undefined,\n (error: unknown) => {\n console.error('加载 GLTF 失败:', url, error);\n reject(error);\n },\n );\n });\n }\n\n /** 加载 OBJ + 可选 MTL */\n private async loadObj(nodeId: string, url: string, mtlUrl?: string): Promise<void> {\n return new Promise(async (resolve, reject) => {\n try {\n // 读取 OBJ 文件为 ArrayBuffer,自动检测编码(UTF-8 / GBK)\n const objBuffer = await fetch(url).then(r => r.arrayBuffer());\n const objText = this.decodeText(objBuffer, 'OBJ');\n\n const loadObjWithMaterials = (materials?: any) => {\n const objLoader = new OBJLoader();\n if (materials) objLoader.setMaterials(materials);\n const obj = objLoader.parse(objText);\n this.assetCache.set(url, obj);\n this.applyAssetToNode(nodeId, obj);\n // 应用到所有等待同一 URL 的节点(处理 undo→redo 竞态)\n const pending = this.pendingAssetNodes.get(url);\n if (pending) {\n for (const pendingId of pending) {\n if (pendingId !== nodeId && this.store.node(pendingId)) {\n this.applyAssetToNode(pendingId, obj);\n }\n }\n }\n this.store.notifyChanged();\n resolve();\n };\n\n if (mtlUrl) {\n // MTL 文件也需要自动检测编码\n try {\n const mtlBuffer = await fetch(mtlUrl).then(r => r.arrayBuffer());\n const mtlText = this.decodeText(mtlBuffer, 'MTL');\n const mtlLoader = new MTLLoader();\n const materials = mtlLoader.parse(mtlText, '');\n materials.preload();\n loadObjWithMaterials(materials);\n } catch {\n // MTL 加载失败,无材质加载 OBJ\n loadObjWithMaterials(undefined);\n }\n } else {\n loadObjWithMaterials(undefined);\n }\n } catch (error) {\n console.error('加载 OBJ 失败:', url, error);\n reject(error);\n }\n });\n }\n\n /** 解码文本,自动检测 UTF-8 或 GBK 编码(处理中文 mesh 名称乱码) */\n private decodeText(buffer: ArrayBuffer, label: string = ''): string {\n const logPrefix = '[decodeText' + (label ? ':' + label : '') + ']';\n // 先尝试 UTF-8(严格模式,遇到无效序列抛异常)\n try {\n const utf8Decoder = new TextDecoder('utf-8', { fatal: true });\n const utf8Text = utf8Decoder.decode(buffer);\n console.log(logPrefix + ' UTF-8 解码成功,长度=' + utf8Text.length);\n return utf8Text;\n } catch (e) {\n console.log(logPrefix + ' UTF-8 解码失败,尝试 GBK 解码');\n }\n // UTF-8 失败,用 GBK(GB18030 兼容 GBK/ANSI)\n try {\n const gbkDecoder = new TextDecoder('gb18030', { fatal: true });\n const gbkText = gbkDecoder.decode(buffer);\n console.log(logPrefix + ' GBK 解码成功,文本预览:', gbkText.substring(0, 200));\n return gbkText;\n } catch (e) {\n console.warn(logPrefix + ' GBK 解码也失败,使用 UTF-8 非严格模式');\n const utf8Decoder = new TextDecoder('utf-8', { fatal: false });\n return utf8Decoder.decode(buffer);\n }\n }\n\n /** 将加载的资产模型应用到节点 */\n private applyAssetToNode(nodeId: string, assetScene: THREE.Group): void {\n const node = this.store.node(nodeId);\n if (!node) return;\n\n const clone = assetScene.clone(true);\n clone.userData['id'] = nodeId;\n // 彻底断开材质共享:clone(true) 不会 clone 材质(只是引用复制),\n // 需要给每个 mesh 都分配独立材质副本,避免跨节点/跨 mesh 共享\n clone.traverse(child => {\n if (child instanceof THREE.Mesh) {\n child.userData['id'] = nodeId;\n child.castShadow = true;\n child.receiveShadow = true;\n const mat = child.material as THREE.Material;\n if (mat) {\n child.material = mat.clone();\n }\n }\n });\n\n // 将 pivot 校正到几何中心:把子对象整体反向偏移 -center\n // 这样外层 clone 的 pivot 就落在几何中心,旋转/缩放/吸附都以此为基准\n const box = new THREE.Box3().setFromObject(clone);\n if (!box.isEmpty()) {\n const center = box.getCenter(new THREE.Vector3());\n if (center.lengthSq() > 1e-6) {\n for (const child of clone.children) {\n child.position.sub(center);\n }\n }\n }\n\n // 替换占位对象\n const oldObj = this.objects.get(nodeId);\n if (oldObj) {\n if (this.store.selection[0] === nodeId) this.gizmo.detach();\n // 将旧对象的子级(效果对象如粒子、路径编辑器可视化)转移到新模型上\n const childrenToMove: THREE.Object3D[] = [];\n oldObj.children.forEach(child => {\n // 转移效果对象(Points、Line)和路径编辑器控制点(Mesh with userData.isPathHandle)\n if (child instanceof THREE.Points ||\n child instanceof THREE.Line ||\n (child instanceof THREE.Mesh && child.userData['isPathHandle'])) {\n childrenToMove.push(child);\n }\n });\n // oldObj 可能是 sync() 创建的占位 Object3D(没添加到场景,parent 为 null)\n if (oldObj.parent) {\n oldObj.parent.add(clone);\n oldObj.parent.remove(oldObj);\n } else {\n this.scene.add(clone);\n }\n // 将效果对象添加到新模型\n for (const child of childrenToMove) {\n clone.add(child);\n }\n if (oldObj instanceof THREE.Mesh && oldObj.material instanceof THREE.MeshBasicMaterial) {\n oldObj.geometry.dispose();\n (oldObj.material as THREE.Material).dispose();\n }\n } else {\n this.scene.add(clone);\n }\n this.objects.set(nodeId, clone);\n\n clone.position.set(...node.position);\n clone.rotation.set(node.rotation[0] * DEG2RAD, node.rotation[1] * DEG2RAD, node.rotation[2] * DEG2RAD);\n clone.scale.set(...node.scale);\n clone.visible = node.visible;\n clone.userData['assetLoaded'] = true;\n\n // 层级关系\n const parent = this.store.parentOf(nodeId);\n const target = (parent && this.objects.get(parent.id)) || this.scene;\n if (clone.parent !== target) {\n clone.parent?.remove(clone);\n target.add(clone);\n }\n\n if (this.store.selection[0] === nodeId) this.refreshSelection();\n\n // 继承同资产其他节点的材质覆盖(仅当节点自己没有覆盖时才继承,找最后一个即最新创建的)\n if (node.assetId && (!node.materialOverrides || Object.keys(node.materialOverrides).length === 0)) {\n const nodes = this.store.doc.nodes;\n for (let i = nodes.length - 1; i >= 0; i--) {\n const n = nodes[i];\n if (n.id !== nodeId && n.assetId === node.assetId && n.materialOverrides && Object.keys(n.materialOverrides).length > 0) {\n node.materialOverrides = JSON.parse(JSON.stringify(n.materialOverrides));\n console.log(`[applyAssetToNode] ${nodeId}: 继承同资产节点 ${n.id} 的材质覆盖`);\n break;\n }\n }\n }\n\n // 在应用材质覆盖前,先保存所有 mesh 的原始材质\n this.saveAllOriginalMaterials(nodeId);\n this.applyMaterialOverrides(nodeId);\n\n // 强制所有贴图上传到 GPU(GLTFLoader 加载后 needsUpdate 可能未设置)\n clone.traverse((child: any) => {\n if (child.material) {\n const mats = Array.isArray(child.material) ? child.material : [child.material];\n for (const mat of mats) {\n if (mat.map) mat.map.needsUpdate = true;\n if (mat.normalMap) mat.normalMap.needsUpdate = true;\n if (mat.roughnessMap) mat.roughnessMap.needsUpdate = true;\n if (mat.metalnessMap) mat.metalnessMap.needsUpdate = true;\n if (mat.emissiveMap) mat.emissiveMap.needsUpdate = true;\n mat.needsUpdate = true;\n }\n }\n });\n\n // 生成缩略图(传 assetId 而非 nodeId,便于后端更新元数据)\n const assetId = node.assetId;\n if (assetId) {\n this.generateThumbnail(assetId, clone);\n }\n }\n\n /** 确保所有 mesh 都有 name(供其他方法调用) */\n private ensureMeshNames(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n let unnamedIndex = 0;\n obj.traverse(child => {\n if (child instanceof THREE.Mesh && !child.name) {\n child.name = `mesh_${unnamedIndex++}`;\n }\n });\n }\n\n /** 获取资产节点的 mesh 名称列表 */\n getMeshNames(nodeId: string): string[] {\n // 先确保所有 mesh 都有 name\n this.ensureMeshNames(nodeId);\n const obj = this.objects.get(nodeId);\n if (!obj) return [];\n const names: string[] = [];\n obj.traverse(child => {\n if (child instanceof THREE.Mesh && child.name) {\n names.push(child.name);\n }\n });\n return names;\n }\n\n /** 获取节点的包围盒信息(世界坐标) */\n getNodeBounds(nodeId: string): { center: [number, number, number]; size: [number, number, number] } | null {\n const obj = this.objects.get(nodeId);\n if (!obj) return null;\n\n const box = new THREE.Box3();\n box.setFromObject(obj);\n\n if (box.isEmpty()) return null;\n\n const center = new THREE.Vector3();\n const size = new THREE.Vector3();\n box.getCenter(center);\n box.getSize(size);\n\n return {\n center: [center.x, center.y, center.z],\n size: [size.x, size.y, size.z],\n };\n }\n\n /** 应用材质覆盖到指定节点(含处理覆盖移除 — 恢复原始材质) */\n applyMaterialOverrides(nodeId: string, isUndoRedoing: boolean = false): void {\n const node = this.store.node(nodeId);\n if (!node) return;\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n const overrides = node.materialOverrides ?? {};\n // 整体覆盖(key 为空字符串)\n const globalOverride = overrides[''];\n\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n let mat = child.material as THREE.MeshStandardMaterial;\n if (!mat) return;\n\n // OBJ 加载的可能是 MeshPhongMaterial/MeshLambertMaterial,转换为 MeshStandardMaterial\n if (!(mat instanceof THREE.MeshStandardMaterial)) {\n const oldMat = mat as any;\n const newMat = new THREE.MeshStandardMaterial();\n if (oldMat.color) newMat.color.copy(oldMat.color);\n if (oldMat.opacity !== undefined) newMat.opacity = oldMat.opacity;\n if (oldMat.transparent !== undefined) newMat.transparent = oldMat.transparent;\n if (oldMat.emissive) newMat.emissive.copy(oldMat.emissive);\n if (oldMat.map) newMat.map = oldMat.map;\n child.material = newMat;\n mat = newMat;\n }\n\n // 优先级:子部件覆盖 > 整体覆盖 > 原始材质\n const override = overrides[child.name] || globalOverride;\n\n // undo/redo 时:先从保存的真正原始状态恢复,再应用当前 override\n // 确保每次 undo/redo 都从干净的原始状态开始,避免残留上一步的修改\n if (isUndoRedoing) {\n this.resetMaterialToOriginal(nodeId, child.name, mat);\n }\n\n if (override) {\n // 首次覆盖前,保存原始材质(仅首次保存,不覆盖)\n this.saveOriginalMaterials(nodeId, child.name, mat, child.visible);\n // 应用颜色/数值属性\n if (override.useBaseColor === false && override.map) {\n mat.color.set('#ffffff');\n } else if (override.color !== undefined) {\n mat.color.set(override.color);\n }\n if (override.opacity !== undefined) {\n mat.opacity = override.opacity;\n mat.transparent = override.opacity < 1;\n }\n if (override.roughness !== undefined) mat.roughness = override.roughness;\n if (override.metalness !== undefined) mat.metalness = override.metalness;\n if (override.emissive !== undefined) mat.emissive.set(override.emissive);\n if (override.visible !== undefined) child.visible = override.visible;\n // 应用贴图\n this.applyTexture(mat, 'map', override.map);\n this.applyTexture(mat, 'normalMap', override.normalMap);\n this.applyTexture(mat, 'roughnessMap', override.roughnessMap);\n this.applyTexture(mat, 'metalnessMap', override.metalnessMap);\n this.applyTexture(mat, 'emissiveMap', override.emissiveMap);\n mat.needsUpdate = true;\n } else if (!isUndoRedoing) {\n // 非 undo/redo 且无覆盖时,恢复原始材质\n this.resetMaterialToOriginal(nodeId, child.name, mat);\n }\n });\n }\n\n /** 加载或获取缓存的贴图,应用到材质 */\n private applyTexture(mat: THREE.MeshStandardMaterial, prop: string, dataUrl: string | undefined): void {\n if (dataUrl === undefined) return; // override 未指定该贴图,保持原样\n if (!dataUrl) {\n // 显式清空贴图\n (mat as any)[prop] = null;\n return;\n }\n let tex = this.textureCache.get(dataUrl);\n if (!tex) {\n tex = this.textureLoader.load(dataUrl);\n tex.colorSpace = prop === 'map' || prop === 'emissiveMap'\n ? THREE.SRGBColorSpace\n : THREE.LinearSRGBColorSpace;\n this.textureCache.set(dataUrl, tex);\n }\n (mat as any)[prop] = tex;\n }\n\n /** 保存 mesh 的原始材质(仅首次保存,后续调用不覆盖) */\n private saveOriginalMaterials(nodeId: string, meshName: string, mat: THREE.MeshStandardMaterial, visible: boolean = true): void {\n let nodeMats = this.originalMaterials.get(nodeId);\n if (!nodeMats) {\n nodeMats = {};\n this.originalMaterials.set(nodeId, nodeMats);\n }\n // 仅首次保存 — 保存模型加载后、任何 override 之前的真正原始状态\n if (nodeMats[meshName]) return;\n nodeMats[meshName] = {\n color: '#' + mat.color.getHexString(),\n opacity: mat.opacity,\n transparent: mat.transparent,\n roughness: mat.roughness,\n metalness: mat.metalness,\n emissive: '#' + mat.emissive.getHexString(),\n visible: visible,\n map: mat.map ?? null,\n normalMap: mat.normalMap ?? null,\n roughnessMap: mat.roughnessMap ?? null,\n metalnessMap: mat.metalnessMap ?? null,\n emissiveMap: mat.emissiveMap ?? null,\n };\n }\n\n /** 隔离显示子部件:其他部件隐藏 */\n isolateSubMesh(nodeId: string, meshName: string): void {\n // 先确保所有 mesh 都有 name\n this.ensureMeshNames(nodeId);\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n // 只修改 visible,不修改 opacity(避免材质共享问题)\n child.visible = (child.name === meshName);\n });\n }\n\n /** 退出隔离显示:恢复所有部件到正常状态 */\n exitIsolation(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n\n // 先恢复所有部件的 visible\n obj.traverse(child => {\n if (child instanceof THREE.Mesh) {\n child.visible = true;\n }\n });\n\n // 再调用 applyMaterialOverrides 恢复正常状态\n this.applyMaterialOverrides(nodeId);\n }\n\n /** 保存节点所有 mesh 的原始材质(模型加载后调用) */\n private saveAllOriginalMaterials(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n let unnamedIndex = 0;\n // 跟踪已见过的材质对象,用于检测材质共享\n const seenMaterials = new Map<THREE.Material, THREE.MeshStandardMaterial>();\n obj.traverse(child => {\n if (!(child instanceof THREE.Mesh)) return;\n // 给没有 name 的 mesh 设置默认名称(与 getMeshNames 保持一致)\n if (!child.name) child.name = `mesh_${unnamedIndex++}`;\n let mat = child.material as THREE.MeshStandardMaterial;\n if (!mat) return;\n // OBJ 加载的可能是其他材质类型,转换为 MeshStandardMaterial\n if (!(mat instanceof THREE.MeshStandardMaterial)) {\n const oldMat = mat as any;\n const newMat = new THREE.MeshStandardMaterial();\n if (oldMat.color) newMat.color.copy(oldMat.color);\n if (oldMat.opacity !== undefined) newMat.opacity = oldMat.opacity;\n if (oldMat.transparent !== undefined) newMat.transparent = oldMat.transparent;\n if (oldMat.emissive) newMat.emissive.copy(oldMat.emissive);\n if (oldMat.map) newMat.map = oldMat.map;\n child.material = newMat;\n mat = newMat;\n }\n // 如果材质被多个 mesh 共享,给当前 mesh 分配独立副本\n if (seenMaterials.has(mat)) {\n const independentMat = mat.clone();\n child.material = independentMat;\n mat = independentMat;\n } else {\n seenMaterials.set(mat, mat);\n }\n this.saveOriginalMaterials(nodeId, child.name, mat, child.visible);\n });\n }\n\n /** 恢复 mesh 到原始材质 */\n private resetMaterialToOriginal(nodeId: string, meshName: string, mat: THREE.MeshStandardMaterial): void {\n const orig = this.originalMaterials.get(nodeId)?.[meshName];\n if (!orig) return; // 没有保存的原始材质,说明从未被覆盖过\n mat.color.set(orig.color);\n mat.opacity = orig.opacity;\n mat.transparent = orig.transparent;\n mat.roughness = orig.roughness;\n mat.metalness = orig.metalness;\n mat.emissive.set(orig.emissive);\n // 恢复原始贴图\n mat.map = orig.map ?? null;\n mat.normalMap = orig.normalMap ?? null;\n mat.roughnessMap = orig.roughnessMap ?? null;\n mat.metalnessMap = orig.metalnessMap ?? null;\n mat.emissiveMap = orig.emissiveMap ?? null;\n mat.needsUpdate = true;\n }\n\n /** 获取 mesh 的原始材质(未覆盖前的值) */\n getOriginalMaterial(nodeId: string, meshName: string): { color: string; opacity: number; roughness: number; metalness: number; emissive: string; visible: boolean; map: THREE.Texture | null } | undefined {\n return this.originalMaterials.get(nodeId)?.[meshName];\n }\n\n private refreshSelection(): void {\n const sel = new Set(this.store.selection);\n // 清理不再被选中的 BoxHelper\n for (const [id, h] of [...this.helpers]) {\n if (!sel.has(id)) {\n this.helpers.delete(id);\n h.parent?.remove(h); // 用 parent.remove 而不是 scene.remove,因为组的 helper 挂在组上\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n // 清理不再被选中的灯光助手\n for (const [id, h] of [...this.lightHelpers]) {\n if (!sel.has(id)) {\n this.lightHelpers.delete(id);\n h.parent?.remove(h);\n if (h instanceof THREE.DirectionalLightHelper) h.dispose();\n if (h instanceof THREE.SpotLightHelper) h.dispose();\n if (h instanceof THREE.Mesh) {\n h.geometry.dispose();\n (h.material as THREE.Material).dispose();\n }\n }\n }\n // 给新选中的对象挂上黄色边框\n for (const id of this.store.selection) {\n const node = this.store.node(id);\n if (!node) continue;\n\n if (node.primitive === 'group') {\n // Group:每次刷新都重建包围盒(确保合并/撤销后包围盒正确)\n const oldHelper = this.helpers.get(id);\n if (oldHelper) {\n oldHelper.parent?.remove(oldHelper);\n oldHelper.geometry.dispose();\n (oldHelper.material as THREE.Material).dispose();\n this.helpers.delete(id);\n }\n const box = this.computeGroupLocalBounds(id);\n if (box && !box.isEmpty()) {\n // 固定 0.03 单位空隙\n box.expandByScalar(0.03);\n // 用 LineSegments 手动创建包围盒\n const helper = new THREE.BoxHelper(new THREE.Object3D(), 0xfadb14);\n helper.geometry.dispose();\n helper.geometry = this.createBoxGeometry(box);\n helper.userData['isGroupHelper'] = true;\n helper.userData['isSelectionHelper'] = true;\n this.helpers.set(id, helper);\n // 挂到组的 Object3D 上,跟随组移动\n const groupObj = this.objects.get(id);\n if (groupObj) {\n groupObj.add(helper);\n } else {\n this.scene.add(helper);\n }\n }\n } else if (node.primitive === 'light') {\n // Light:显示灯光助手\n const light = this.objects.get(id) as THREE.Light;\n if (!light) continue;\n\n if (!this.lightHelpers.has(id)) {\n let helper: THREE.Object3D | null = null;\n if (light instanceof THREE.DirectionalLight) {\n helper = new THREE.DirectionalLightHelper(light, 2);\n } else if (light instanceof THREE.SpotLight) {\n helper = new THREE.SpotLightHelper(light);\n } else if (light instanceof THREE.PointLight) {\n // PointLight 用菱形线框表示(挂到灯光上跟随移动)\n const sphere = new THREE.Mesh(\n new THREE.OctahedronGeometry(0.5, 1),\n new THREE.MeshBasicMaterial({ color: 0xfadb14, wireframe: true }),\n );\n light.add(sphere);\n helper = sphere;\n } else {\n // AmbientLight 用球形线框表示\n const sphere = new THREE.Mesh(\n new THREE.SphereGeometry(0.25, 8, 6),\n new THREE.MeshBasicMaterial({ color: 0xfadb14, wireframe: true }),\n );\n helper = sphere;\n }\n if (helper) {\n this.lightHelpers.set(id, helper);\n // 如果 helper 不是灯光子对象,手动加到场景\n if (!helper.parent) this.scene.add(helper);\n }\n }\n } else {\n // 普通节点(asset 节点等模型加载完再创建包围盒,避免在占位位置闪现)\n const obj = this.objects.get(id);\n if (obj && !this.helpers.has(id)) {\n if (node.primitive === 'asset' && !obj.userData['assetLoaded']) continue;\n const h = new THREE.BoxHelper(obj, 0xfadb14);\n this.helpers.set(id, h);\n this.scene.add(h);\n }\n }\n }\n // Gizmo 只挂到第一个选中对象(asset 节点等模型加载完再挂载)\n // 路径编辑器激活时,gizmo 由 pathEditor 管理,refreshSelection 不干涉\n if (this.pathEditor.isActive()) {\n return;\n }\n const primary = this.store.selection[0];\n if (primary) {\n const target = this.objects.get(primary) ?? null;\n const primaryNode = this.store.node(primary);\n // asset 节点未加载时不挂载 gizmo\n if (primaryNode?.primitive === 'asset' && target && !target.userData['assetLoaded']) {\n this.gizmo.detach();\n } else if (target && target.parent) {\n this.gizmo.attach(target);\n } else {\n this.gizmo.detach();\n }\n } else {\n this.gizmo.detach();\n }\n }\n\n /** 根据 Box3 创建包围盒的几何体 */\n private createBoxGeometry(box: THREE.Box3): THREE.BufferGeometry {\n const min = box.min;\n const max = box.max;\n const positions = new Float32Array([\n // 前面\n min.x, min.y, max.z, max.x, min.y, max.z, max.x, min.y, max.z, max.x, max.y, max.z, max.x, max.y, max.z,\n min.x, max.y, max.z, min.x, max.y, max.z, min.x, min.y, max.z,\n // 后面\n min.x, min.y, min.z, max.x, min.y, min.z, max.x, min.y, min.z, max.x, max.y, min.z, max.x, max.y, min.z,\n min.x, max.y, min.z, min.x, max.y, min.z, min.x, min.y, min.z,\n // 连接边\n min.x, min.y, min.z, min.x, min.y, max.z, max.x, min.y, min.z, max.x, min.y, max.z, max.x, max.y, min.z,\n max.x, max.y, max.z, min.x, max.y, min.z, min.x, max.y, max.z,\n ]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n return geometry;\n }\n\n /** 计算 group 的所有后代的包围盒(本地空间,相对于组的 Object3D) */\n private computeGroupLocalBounds(groupId: string): THREE.Box3 | null {\n const box = new THREE.Box3();\n const groupObj = this.objects.get(groupId);\n if (!groupObj) return null;\n\n // 确保组的世界矩阵是最新的\n groupObj.updateMatrixWorld(true);\n\n const descendants = this.store.subtree(groupId);\n let hasMesh = false;\n\n for (const desc of descendants) {\n if (desc.id === groupId) continue;\n // 跳过其他组的黄色 helper(避免包围盒被 helper 几何体撑大)\n const obj = this.objects.get(desc.id);\n if (!obj) continue;\n if (obj.userData['isSelectionHelper']) continue;\n\n if (obj instanceof THREE.Object3D) {\n // 更新整棵子树的世界矩阵,确保 reparent 后包围盒计算正确\n obj.updateWorldMatrix(true, true);\n const worldBox = new THREE.Box3().setFromObject(obj);\n // 转换到组的本地空间\n const localBox = worldBox.clone().applyMatrix4(\n groupObj.matrixWorld.clone().invert()\n );\n box.union(localBox);\n hasMesh = true;\n }\n }\n return hasMesh ? box : null;\n }\n\n /** 计算 group 的所有后代的包围盒(世界空间) */\n private computeGroupBounds(groupId: string): THREE.Box3 | null {\n const box = new THREE.Box3();\n const descendants = this.store.subtree(groupId);\n let hasMesh = false;\n for (const node of descendants) {\n if (node.id === groupId || node.primitive === 'group') continue;\n const obj = this.objects.get(node.id);\n if (obj) {\n box.expandByObject(obj);\n hasMesh = true;\n }\n }\n return hasMesh ? box : null;\n }\n\n private snapshot(id: string): TransformState {\n const o = this.objects.get(id);\n const r3 = (v: number) => Math.round(v * 1000) / 1000;\n if (!o) return { position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1] };\n return {\n position: o.position.toArray().map(r3) as Vec3,\n rotation: [r3(o.rotation.x * RAD2DEG), r3(o.rotation.y * RAD2DEG), r3(o.rotation.z * RAD2DEG)],\n scale: o.scale.toArray().map(r3) as Vec3,\n };\n }\n\n private pick(e: PointerEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n // 收集所有可拾取的 Mesh(包括 Group/资产内部的子 Mesh)\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) {\n allMeshes.push(obj);\n } else {\n // Group 或资产:递归收集子 Mesh\n obj.traverse(child => {\n if (child instanceof THREE.Mesh) {\n allMeshes.push(child);\n }\n });\n }\n }\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n const id = (hits[0]?.object.userData['id'] as string) ?? null;\n this.cb.onSelect({ id, additive: e.ctrlKey || e.metaKey });\n }\n\n // ── 框选方法 ──\n\n private createBoxEl(e: PointerEvent): void {\n if (!this.host.parentElement) return;\n this.boxEl = document.createElement('div');\n this.boxEl.style.cssText = 'position:fixed;border:1px dashed #4f83cc;background:rgba(79,131,204,0.15);pointer-events:none;z-index:9999;';\n this.boxEl.style.left = e.clientX + 'px';\n this.boxEl.style.top = e.clientY + 'px';\n this.boxEl.style.width = '0px';\n this.boxEl.style.height = '0px';\n document.body.appendChild(this.boxEl);\n }\n\n private updateBoxEl(e: PointerEvent): void {\n if (!this.boxEl || !this.boxStart) return;\n const [sx, sy] = this.boxStart;\n const x = Math.min(sx, e.clientX);\n const y = Math.min(sy, e.clientY);\n const w = Math.abs(e.clientX - sx);\n const h = Math.abs(e.clientY - sy);\n this.boxEl.style.left = x + 'px';\n this.boxEl.style.top = y + 'px';\n this.boxEl.style.width = w + 'px';\n this.boxEl.style.height = h + 'px';\n }\n\n private finishBoxSelect(e: PointerEvent): void {\n this.boxSelecting = false;\n if (this.boxEl) {\n this.boxEl.remove();\n this.boxEl = null;\n }\n if (!this.boxStart) return;\n\n const [sx, sy] = this.boxStart;\n this.boxStart = null;\n const rect = this.renderer.domElement.getBoundingClientRect();\n const minX = Math.min(sx, e.clientX) - rect.left;\n const maxX = Math.max(sx, e.clientX) - rect.left;\n const minY = Math.min(sy, e.clientY) - rect.top;\n const maxY = Math.max(sy, e.clientY) - rect.top;\n\n // 忽略太小的框选(点击误触)\n if (maxX - minX < 4 && maxY - minY < 4) return;\n\n const ndcMinX = (minX / rect.width) * 2 - 1;\n const ndcMaxX = (maxX / rect.width) * 2 - 1;\n const ndcMinY = -((maxY / rect.height) * 2 - 1);\n const ndcMaxY = -((minY / rect.height) * 2 - 1);\n\n // 将每个对象中心投影到屏幕,检查是否在框选范围内\n const selected: string[] = [];\n for (const [id, obj] of this.objects) {\n const node = this.store.node(id);\n if (!node) continue;\n const center = new THREE.Vector3();\n if (obj instanceof THREE.Mesh) {\n obj.getWorldPosition(center);\n } else {\n const box = new THREE.Box3().setFromObject(obj);\n box.getCenter(center);\n }\n const projected = center.clone().project(this.camera);\n // 检查是否在相机前方且在框选范围内\n if (projected.z < 1 &&\n projected.x >= ndcMinX && projected.x <= ndcMaxX &&\n projected.y >= ndcMinY && projected.y <= ndcMaxY) {\n selected.push(id);\n }\n }\n this.cb.onSelect({ id: null, additive: false });\n this.store.setSelection(selected);\n }\n\n /** 双击拉近视角:将相机平滑移动到目标对象前方 */\n private onDblClick(e: MouseEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n\n // 检测所有 mesh(包括模型和绿球)\n const allMeshes: THREE.Mesh[] = [];\n for (const obj of this.objects.values()) {\n if (obj instanceof THREE.Mesh) allMeshes.push(obj);\n else obj.traverse(c => { if (c instanceof THREE.Mesh) allMeshes.push(c); });\n }\n // 绿球不在 this.objects 里,从 PathEditor 补充\n if (this.pathEditor.isActive()) {\n for (const handle of this.pathEditor.getHandles()) {\n if (!allMeshes.includes(handle)) {\n allMeshes.push(handle);\n }\n }\n }\n const hits = this.raycaster.intersectObjects(allMeshes, false);\n if (hits.length === 0) return;\n\n const hit = hits[0];\n const target = hit.point.clone();\n\n // 计算目标对象的包围盒中心\n const objId = hit.object.userData['id'] as string;\n const obj = this.objects.get(objId);\n let center = target.clone();\n if (obj) {\n const box = new THREE.Box3().setFromObject(obj);\n center = box.getCenter(new THREE.Vector3());\n }\n\n // 计算相机目标位置:从当前方向看向中心,距离为包围盒对角线 * 1.5\n const box = new THREE.Box3().setFromObject(obj || hit.object);\n const size = box.getSize(new THREE.Vector3());\n const dist = Math.max(size.length() * 1.5, 2);\n const dir = this.camera.position.clone().sub(center).normalize();\n const newPos = center.clone().add(dir.multiplyScalar(dist));\n\n // 平滑动画\n const startPos = this.camera.position.clone();\n const startTarget = this.orbit.target.clone();\n const duration = 400;\n const startTime = performance.now();\n\n const animateZoom = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n // easeOutCubic\n const ease = 1 - Math.pow(1 - t, 3);\n\n this.camera.position.lerpVectors(startPos, newPos, ease);\n this.orbit.target.lerpVectors(startTarget, center, ease);\n this.orbit.update();\n\n if (t < 1) requestAnimationFrame(animateZoom);\n };\n requestAnimationFrame(animateZoom);\n }\n\n /** 平滑聚焦到指定节点:将相机移动到对象前方 */\n focusOnNode(nodeId: string): void {\n const obj = this.objects.get(nodeId);\n if (!obj) return;\n const box = new THREE.Box3().setFromObject(obj);\n if (box.isEmpty()) return;\n const center = box.getCenter(new THREE.Vector3());\n const size = box.getSize(new THREE.Vector3());\n const dist = Math.max(size.length() * 1.5, 2);\n const dir = this.camera.position.clone().sub(center).normalize();\n const newPos = center.clone().add(dir.multiplyScalar(dist));\n\n const startPos = this.camera.position.clone();\n const startTarget = this.orbit.target.clone();\n const duration = 400;\n const startTime = performance.now();\n\n const animateZoom = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const ease = 1 - Math.pow(1 - t, 3);\n this.camera.position.lerpVectors(startPos, newPos, ease);\n this.orbit.target.lerpVectors(startTarget, center, ease);\n this.orbit.update();\n if (t < 1) requestAnimationFrame(animateZoom);\n };\n requestAnimationFrame(animateZoom);\n }\n\n private resize(): void {\n const w = this.host.clientWidth || 1;\n const h = this.host.clientHeight || 1;\n this.renderer.setSize(w, h);\n // composer 可能尚未初始化(ResizeObserver 先于 initPostProcessing 触发)\n if (this.composer) this.composer.setSize(w, h);\n this.camera.aspect = w / h;\n this.camera.updateProjectionMatrix();\n }\n\n /** 屏幕坐标 → 地面(y=0)世界坐标 */\n screenToGround(viewportX: number, viewportY: number): Vec3 | null {\n const rect = this.renderer.domElement.getBoundingClientRect();\n const ndc = new THREE.Vector2(\n ((viewportX - rect.left) / rect.width) * 2 - 1,\n -((viewportY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(ndc, this.camera);\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);\n const target = new THREE.Vector3();\n const hit = this.raycaster.ray.intersectPlane(plane, target);\n if (!hit) return null;\n return [\n Math.round(hit.x * 100) / 100,\n 0.5,\n Math.round(hit.z * 100) / 100,\n ];\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport type { TransformState, FlyPath, Vec3 } from './types';\nimport type { SceneStore } from './store';\nimport { SceneViewer, type PickEvent, type TransformMode } from './viewer';\n\n/**\n * 场景视口组件:three.js 全部跑在 NgZone 之外,\n * 只有对外事件才回到 zone 内触发变更检测。\n */\n@Component({\n selector: 'twin-scene-view',\n standalone: true,\n template: `\n <div #host class=\"scene-host\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\"></div>\n <div #dashboardOverlay class=\"dashboard-overlay\"></div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n .scene-host {\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n .scene-host canvas {\n display: block;\n }\n .dashboard-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n }\n .dashboard-overlay .dashboard-widget {\n pointer-events: auto;\n }\n `],\n})\nexport class SceneViewComponent implements AfterViewInit, OnChanges, OnDestroy {\n @ViewChild('host', { static: true }) host!: ElementRef<HTMLDivElement>;\n @ViewChild('dashboardOverlay', { static: true }) dashboardOverlay!: ElementRef<HTMLDivElement>;\n\n @Input() store!: SceneStore;\n @Input() mode: TransformMode = 'translate';\n @Input() isEditorMode = false;\n\n @Output() select = new EventEmitter<PickEvent>();\n @Output() transformEnd = new EventEmitter<{ id: string; before: TransformState; after: TransformState }>();\n @Output() dropAsset = new EventEmitter<{ x: number; y: number; assetId: string; assetName: string; assetFormat: string; assetLibraryId: string }>();\n @Output() thumbnailGenerated = new EventEmitter<{ assetId: string; dataUrl: string }>();\n @Output() pathPointMoved = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; position: Vec3 }>();\n @Output() addPathPoint = new EventEmitter<{ nodeId: string; effectIndex: number; insertAfter: number; position: Vec3 }>();\n @Output() deletePathPoint = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number }>();\n @Output() pathEditingChanged = new EventEmitter<boolean>();\n @Output() pathPointRightClick = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; position: Vec3; event: MouseEvent }>();\n @Output() segmentRightClick = new EventEmitter<{ nodeId: string; effectIndex: number; segmentIndex: number; position: Vec3; event: MouseEvent }>();\n @Output() modelSurfaceClick = new EventEmitter<{ nodeId: string; effectIndex: number; position: Vec3; event: PointerEvent }>();\n @Output() movePathPointToEnd = new EventEmitter<{ nodeId: string; effectIndex: number; pointIndex: number; toStart: boolean }>();\n\n private viewer: SceneViewer | null = null;\n\n constructor(private zone: NgZone) {}\n\n ngAfterViewInit(): void {\n this.zone.runOutsideAngular(() => {\n this.viewer = new SceneViewer(\n this.host.nativeElement,\n this.store,\n {\n onSelect: ev => this.zone.run(() => this.select.emit(ev)),\n onTransformEnd: (id, before, after) => this.zone.run(() => this.transformEnd.emit({ id, before, after })),\n onThumbnailGenerated: (assetId, dataUrl) => this.zone.run(() => this.thumbnailGenerated.emit({ assetId, dataUrl })),\n onPathPointMoved: (nodeId, effectIndex, pointIndex, position) => this.zone.run(() => this.pathPointMoved.emit({ nodeId, effectIndex, pointIndex, position })),\n onAddPathPoint: (nodeId, effectIndex, insertAfter, position) => this.zone.run(() => this.addPathPoint.emit({ nodeId, effectIndex, insertAfter, position })),\n onDeletePathPoint: (nodeId, effectIndex, pointIndex) => this.zone.run(() => this.deletePathPoint.emit({ nodeId, effectIndex, pointIndex })),\n onPathEditingChanged: (isEditing) => this.zone.run(() => this.pathEditingChanged.emit(isEditing)),\n onPathPointRightClick: (nodeId, effectIndex, pointIndex, position, event) => this.zone.run(() => this.pathPointRightClick.emit({ nodeId, effectIndex, pointIndex, position, event })),\n onSegmentRightClick: (nodeId, effectIndex, segmentIndex, position, event) => this.zone.run(() => this.segmentRightClick.emit({ nodeId, effectIndex, segmentIndex, position, event })),\n onModelSurfaceClick: (nodeId, effectIndex, position, event) => this.zone.run(() => this.modelSurfaceClick.emit({ nodeId, effectIndex, position, event })),\n onMovePathPointToEnd: (nodeId, effectIndex, pointIndex, toStart) => this.zone.run(() => this.movePathPointToEnd.emit({ nodeId, effectIndex, pointIndex, toStart })),\n },\n this.dashboardOverlay.nativeElement,\n this.isEditorMode,\n );\n this.viewer.setMode(this.mode);\n });\n }\n\n ngOnChanges(changes: { [key: string]: any }): void {\n if (changes['mode'] && this.viewer) {\n this.viewer.setMode(this.mode);\n }\n }\n\n ngOnDestroy(): void {\n this.viewer?.dispose();\n this.viewer = null;\n }\n\n /** 导出场景为 GLB */\n exportScene(): void {\n this.viewer?.exportScene();\n }\n\n /** 屏幕坐标 → 地面世界坐标 */\n screenToGround(screenX: number, screenY: number): [number, number, number] | null {\n if (!this.viewer) return null;\n return this.viewer.screenToGround(screenX, screenY);\n }\n\n /** 获取资产节点的 mesh 名称列表 */\n getMeshNames(nodeId: string): string[] {\n return this.viewer?.getMeshNames(nodeId) ?? [];\n }\n\n /** 获取节点的包围盒信息(世界坐标) */\n getNodeBounds(nodeId: string): { center: [number, number, number]; size: [number, number, number] } | null {\n return this.viewer?.getNodeBounds(nodeId) ?? null;\n }\n\n /** 重新应用材质覆盖(材质参数变化后调用) */\n applyMaterialOverrides(nodeId: string): void {\n this.viewer?.applyMaterialOverrides(nodeId);\n }\n\n /** 获取 mesh 的原始材质(未覆盖前的值) */\n getOriginalMaterial(nodeId: string, meshName: string): { color: string; opacity: number; roughness: number; metalness: number; emissive: string; visible: boolean } | undefined {\n return this.viewer?.getOriginalMaterial(nodeId, meshName);\n }\n\n /** 隔离显示子部件:其他部件变为半透明 */\n isolateSubMesh(nodeId: string, meshName: string): void {\n this.viewer?.isolateSubMesh(nodeId, meshName);\n }\n\n /** 退出隔离显示:恢复所有部件到原始状态 */\n exitIsolation(nodeId: string): void {\n this.viewer?.exitIsolation(nodeId);\n }\n\n /** 保存当前相机状态到 SceneDoc */\n saveCamera(): void {\n this.viewer?.saveCamera();\n }\n\n /** 强制恢复相机(草稿恢复后调用) */\n forceRestoreCamera(): void {\n this.viewer?.forceRestoreCamera();\n }\n\n /** 设置模拟数据信号(用于数据驱动动画测试) */\n setDataSignal(value: number): void {\n this.viewer?.setDataSignal(value);\n }\n\n /** 设置节点实时数据(用于 per-node 数据驱动动画) */\n setData(nodeId: string, data: Record<string, number>): void {\n this.viewer?.setData(nodeId, data);\n }\n\n /** 按 bindingId 设置实时数据(用于点位绑定) */\n setBindingData(bindingId: string, value: number): void {\n this.viewer?.setBindingData(bindingId, value);\n }\n\n /** 标记正在 undo/redo */\n setUndoRedoing(value: boolean): void {\n this.viewer?.setUndoRedoing(value);\n }\n\n /** 播放飞行路线 */\n playFlyPath(path: FlyPath, callbacks?: { onComplete?: () => void }): void {\n this.viewer?.playFlyPath(path, callbacks);\n }\n\n /** 停止飞行路线 */\n stopFlyPath(): void {\n this.viewer?.stopFlyPath();\n }\n\n /** 暂停飞行路线 */\n pauseFlyPath(): void {\n this.viewer?.pauseFlyPath();\n }\n\n /** 恢复播放 */\n resumeFlyPath(): void {\n this.viewer?.resumeFlyPath();\n }\n\n /** 是否正在播放飞行路线 */\n isFlyPathPlaying(): boolean {\n return this.viewer?.isFlyPathPlaying() ?? false;\n }\n\n /** 获取当前相机位置(用于添加关键帧) */\n getCameraState(): { position: [number, number, number]; target: [number, number, number] } | null {\n if (!this.viewer) return null;\n const cam = (this.viewer as any).camera;\n const orbit = (this.viewer as any).orbit;\n if (!cam || !orbit) return null;\n return {\n position: [cam.position.x, cam.position.y, cam.position.z],\n target: [orbit.target.x, orbit.target.y, orbit.target.z],\n };\n }\n\n /** 设置相机位置(跳转到指定视角) */\n setCameraState(state: { position: [number, number, number]; target: [number, number, number] }): void {\n if (!this.viewer) return;\n const cam = (this.viewer as any).camera;\n const orbit = (this.viewer as any).orbit;\n if (!cam || !orbit) return;\n // 停止播放中的飞行路线\n this.viewer.stopFlyPath();\n cam.position.set(...state.position);\n orbit.target.set(...state.target);\n orbit.update();\n cam.lookAt(orbit.target);\n }\n\n /** 平滑聚焦到指定节点 */\n focusOnNode(nodeId: string): void {\n this.viewer?.focusOnNode(nodeId);\n }\n\n /** 设置路径编辑的活动效果 */\n setPathEditingEffect(effectKey: string | null): void {\n this.viewer?.setPathEditingEffect(effectKey);\n }\n\n /** 是否正在编辑路径 */\n isPathEditing(): boolean {\n return this.viewer?.isPathEditing() ?? false;\n }\n\n /** 设置路径编辑控制点大小 */\n setPathHandleSize(size: number): void {\n this.viewer?.setPathHandleSize(size);\n }\n\n /** 显示告警弹框 */\n showAlarm(nodeId: string, data: any): void {\n this.viewer?.showAlarm(nodeId, data);\n }\n\n /** 隐藏告警弹框 */\n hideAlarm(nodeId: string): void {\n this.viewer?.hideAlarm(nodeId);\n }\n\n /** 拖拽悬停:允许放置 */\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n }\n\n /** 拖拽放置:解析资产信息并发射事件 */\n onDrop(e: DragEvent): void {\n e.preventDefault();\n const assetId = e.dataTransfer?.getData('application/x-asset-id');\n if (!assetId) return;\n\n // 传 viewport 坐标,由 screenToGround 统一用 canvas rect 转换\n this.dropAsset.emit({\n x: e.clientX,\n y: e.clientY,\n assetId,\n assetName: e.dataTransfer?.getData('application/x-asset-name') ?? '',\n assetFormat: e.dataTransfer?.getData('application/x-asset-format') ?? '',\n assetLibraryId: e.dataTransfer?.getData('application/x-asset-library') ?? '',\n });\n }\n\n /** 获取 viewer 实例(供外部调用高级功能如告警弹窗) */\n getViewer(): SceneViewer | null {\n return this.viewer;\n }\n}\n","/** Draco 解码器路径(打包进 npm 包) */\nexport const DRACO_DECODER_PATH = 'assets/draco/gltf/';\n\n/** Draco 编码器路径(打包进 npm 包) */\nexport const DRACO_ENCODER_PATH = 'assets/draco/encoder/';\n","// Core\nexport * from './lib/types';\nexport * from './lib/store';\nexport * from './lib/history';\nexport * from './lib/commands';\n\n// Runtime\nexport * from './lib/viewer';\nexport * from './lib/scene-view.component';\nexport * from './lib/path-editor';\nexport * from './lib/particle-system';\nexport * from './lib/path-particle-system';\nexport * from './lib/segmented-path';\nexport * from './lib/draco-path';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["VERTEX_SHADER","FRAGMENT_SHADER"],"mappings":"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"}
|